extends TestCase ## The pixel art of the ground, the rock and the figures, which every pixel ## style draws. ## How many pixels of `image` are not transparent. static func _opaque(image: Image) -> int: var count := 0 for y in image.get_height(): for x in image.get_width(): if image.get_pixel(x, y).a > 0.0: count += 1 return count func test_the_field_is_drawn_in_sharp_pixels() -> void: check_eq(ProjectSettings.get_setting("rendering/textures/canvas_textures/default_texture_filter"), 0, "each pixel a square, not blurred") check(ProjectSettings.get_setting("rendering/2d/snap/snap_2d_transforms_to_pixel"), "on whole pixels of the screen") func test_ground_fills_its_tile_and_lies_in_the_shadow_of_rock() -> void: var style := WarmStyle.new() var open := style._earth(3, 0).image check_eq(open.get_size(), Vector2i(PixelStyle.TILE, PixelStyle.TILE), "a tile") check_eq(_opaque(open), PixelStyle.TILE * PixelStyle.TILE, "no gaps") var shaded := style._earth(3, TileShape.N).image check(shaded.get_pixel(5, 0).get_luminance() < open.get_pixel(5, 0).get_luminance(), "darker below rock") check_eq(shaded.get_pixel(5, 8), open.get_pixel(5, 8), "but only along the rock") func test_a_lone_rock_is_round_and_shows_its_face() -> void: var style := WarmStyle.new() var lone := style._rock_image("soft", 0, 0).image check_eq(lone.get_pixel(0, 0).a, 0.0, "a round corner, the ground shows there") check_eq(lone.get_pixel(PixelStyle.TILE - 1, PixelStyle.TILE - 1).a, 0.0, "round at the bottom too") check_eq(lone.get_pixel(8, 0), style.palette["outline"], "outlined at the top") check_eq(lone.get_pixel(8, PixelStyle.TILE - 1), style.palette["outline"], "and where it meets the ground") check_eq(lone.get_pixel(5, PixelStyle.TILE - 3), style.palette["soft_face"], "its face toward the open ground") func test_rock_inside_a_mass_has_neither_edge_nor_face() -> void: var style := WarmStyle.new() var inside := style._rock_image("soft", 255, 0).image check_eq(_opaque(inside), PixelStyle.TILE * PixelStyle.TILE, "no gaps") for y in PixelStyle.TILE: for x in PixelStyle.TILE: var colour := inside.get_pixel(x, y) check(colour != style.palette["outline"] and colour != style.palette["soft_face"], "inside at %d, %d" % [x, y]) func test_only_the_corners_that_matter_tell_tiles_apart() -> void: check_eq(PixelStyle._shape(TileShape.NE), 0, "a corner alone does not count") check_eq(PixelStyle._shape(TileShape.N | TileShape.E | TileShape.NE), TileShape.N | TileShape.E | TileShape.NE, "between two sides it does") check_eq(PixelStyle._shape(255), 255, "all of them inside a mass") func test_each_picture_is_made_only_once() -> void: var style := WarmStyle.new() var made := [0] var make := func() -> PixelStyle.Pixels: made[0] += 1 return PixelStyle.Pixels.new(1, 1) var first := style._image("test/once", make) var again := style._image("test/once", make) check_eq(again, first, "the same picture") check_eq(made[0], 1, "made once") func test_a_figure_walks_in_four_steps_and_faces_both_ways() -> void: var style := WarmStyle.new() var frames: Array[PackedByteArray] = [] for frame in 5: var image := style._figure_image(0, frame, false).image check_eq(image.get_size(), PixelStyle.FIGURE_SIZE, "a tile wide, one and a half tall") check(not frames.has(image.get_data()), "frame %d differs from the others" % frame) frames.append(image.get_data()) var left := style._figure_image(0, 1, true).image left.flip_x() check_eq(left.get_data(), frames[1], "facing left mirrors facing right") var other := style._figure_image(1, 0, false).image check(other.get_data() != frames[0], "another player has another colour")