Skip to content

Commit d29775a

Browse files
authored
Add GaeaRenderer tests (#408)
* Add TileMapGaeaRenderer tests * Add workflow * Update renderers_testing.yml * Update concurrency groups to allow tests to run at the same time * Add null check to `TileMapGaeaRenderer` clearing * Add `GridMapGaeaRenderer` tests * Update renderers_testing.yml * Update gridmap_renderer_test.gd
1 parent 25737aa commit d29775a

12 files changed

+582
-2
lines changed

.github/workflows/generation_testing.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ on:
99

1010

1111
concurrency:
12-
group: ${{ github.workflow }}|${{ github.ref_name }}
12+
group: ${{ github.workflow }}|${{ github.ref_name }}-generation
1313
cancel-in-progress: true
1414

1515

.github/workflows/nodes_testing.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ on:
99

1010

1111
concurrency:
12-
group: ${{ github.workflow }}|${{ github.ref_name }}
12+
group: ${{ github.workflow }}|${{ github.ref_name }}-nodes
1313
cancel-in-progress: true
1414

1515

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
name: GHA
2+
3+
on:
4+
pull_request:
5+
paths-ignore:
6+
- '**.yml'
7+
- '**.md'
8+
workflow_dispatch:
9+
10+
11+
concurrency:
12+
group: ${{ github.workflow }}|${{ github.ref_name }}-renderer
13+
cancel-in-progress: true
14+
15+
16+
jobs:
17+
warning_check:
18+
name: "Rendering Testing"
19+
runs-on: 'ubuntu-22.04'
20+
timeout-minutes: 10 # The overall timeout
21+
permissions:
22+
actions: write
23+
checks: write
24+
contents: write
25+
pull-requests: write
26+
statuses: write
27+
28+
steps:
29+
# checkout your repository
30+
- uses: actions/checkout@v4
31+
with:
32+
lfs: true
33+
# run tests by using the gdUnit4-action with Godot version 4.2.1 and the latest GdUnit4 release
34+
- uses: MikeSchulze/gdUnit4-action@v1.1.6
35+
with:
36+
godot-version: '4.4.1'
37+
paths: |
38+
res://testing/rendering
39+
timeout: 5
40+
publish-report: false

addons/gaea/nodes/renderers/tilemap_renderer.gd

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,4 +41,6 @@ func _on_area_erased(area: AABB) -> void:
4141

4242
func _reset() -> void:
4343
for tile_map_layer in tile_map_layers:
44+
if not is_instance_valid(tile_map_layer):
45+
continue
4446
tile_map_layer.clear()
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
extends GdUnitTestSuite
2+
3+
4+
const ITEM_1_TILES_HASH := 836889996
5+
const ITEM_2_TILES_HASH := 286036777
6+
const ITEM_1_TILES_HASH_SMALL := 1666742523
7+
const ITEM_2_TILES_HASH_SMALL := 3765593323
8+
9+
10+
var scene: Node3D
11+
var runner: GdUnitSceneRunner
12+
13+
14+
func before() -> void:
15+
scene = load("uid://bamaii0ujxbp2").instantiate()
16+
runner = scene_runner(scene)
17+
18+
19+
func test_full_area() -> void:
20+
scene.generator.generate()
21+
await scene.generator.generation_finished
22+
23+
var item_1_cells_used: Array[Vector3i] = scene.renderer.grid_maps[0].get_used_cells_by_item(0)
24+
assert_array(item_1_cells_used).is_not_empty()
25+
var item_1_hash: int = item_1_cells_used.hash()
26+
assert_int(item_1_hash)\
27+
.override_failure_message("Layer 0 rendering of [b]GridMapGaeaRenderer[/b] not working as expected.")\
28+
.append_failure_message("Produced hash:%s\n Expected hash:%s" % [item_1_hash, ITEM_1_TILES_HASH])\
29+
.is_equal(ITEM_1_TILES_HASH)
30+
31+
var item_2_cells_used: Array[Vector3i] = scene.renderer.grid_maps[1].get_used_cells_by_item(1)
32+
assert_array(item_2_cells_used).is_not_empty()
33+
var item_2_hash: int = item_2_cells_used.hash()
34+
assert_int(item_2_hash)\
35+
.override_failure_message("Layer 1 rendering of [b]GridMapGaeaRenderer[/b] not working as expected.")\
36+
.append_failure_message("Produced hash:%s\n Expected hash:%s" % [item_2_hash, ITEM_2_TILES_HASH])\
37+
.is_equal(ITEM_2_TILES_HASH)
38+
39+
40+
func test_reset() -> void:
41+
scene.generator.request_reset()
42+
assert_array(scene.renderer.grid_maps[0].get_used_cells())\
43+
.override_failure_message("[b]GridMapGaeaRenderer[/b] wasn't cleared properly.")\
44+
.is_empty()
45+
assert_array(scene.renderer.grid_maps[1].get_used_cells())\
46+
.override_failure_message("[b]GridMapGaeaRenderer[/b] wasn't cleared properly.")\
47+
.is_empty()
48+
49+
50+
func test_small_area() -> void:
51+
var area: AABB = AABB(Vector3.ZERO, Vector3.ONE * 16)
52+
scene.generator.generate_area(area)
53+
await scene.generator.generation_finished
54+
55+
var item_1_cells_used: Array[Vector3i] = scene.renderer.grid_maps[0].get_used_cells_by_item(0)
56+
assert_array(item_1_cells_used).is_not_empty()
57+
var item_1_hash: int = item_1_cells_used.hash()
58+
assert_int(item_1_hash)\
59+
.override_failure_message("Layer 0 rendering of [b]TileMapGaeaRenderer[/b] area not working as expected.")\
60+
.append_failure_message("Produced hash:%s\n Expected hash:%s" % [item_1_hash, ITEM_1_TILES_HASH])\
61+
.is_equal(ITEM_1_TILES_HASH_SMALL)
62+
63+
var item_2_cells_used: Array[Vector3i] = scene.renderer.grid_maps[1].get_used_cells_by_item(1)
64+
assert_array(item_2_cells_used).is_not_empty()
65+
var item_2_hash: int = item_2_cells_used.hash()
66+
assert_int(item_2_hash)\
67+
.override_failure_message("Layer 1 rendering of [b]TileMapGaeaRenderer[/b] area not working as expected.")\
68+
.append_failure_message("Produced hash:%s\n Expected hash:%s" % [item_2_hash, ITEM_2_TILES_HASH])\
69+
.is_equal(ITEM_2_TILES_HASH_SMALL)
70+
71+
func test_null_layer() -> void:
72+
scene.renderer.grid_maps[1] = null
73+
assert_error(scene.generator.generate)\
74+
.is_success()
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
uid://degq61scyh6nr

testing/rendering/gridmap_test_scene.tscn

Lines changed: 198 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
extends Node
2+
3+
4+
@onready var generator: GaeaGenerator = $GaeaGenerator
5+
@onready var renderer: GaeaRenderer = $Renderer
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
uid://cpvk61ewx6ejo
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
extends GdUnitTestSuite
2+
3+
4+
const GRASS_TILES_HASH := 1593514366
5+
const SAND_TILES_HASH := 1550241141
6+
const GRASS_TILES_HASH_SMALL := 2384678874
7+
const SAND_TILES_HASH_SMALL := 1850823263
8+
9+
10+
var scene: Node2D
11+
var runner: GdUnitSceneRunner
12+
13+
14+
func before() -> void:
15+
scene = load("uid://xfcy8wwh3sd7").instantiate()
16+
runner = scene_runner(scene)
17+
18+
19+
func test_full_area() -> void:
20+
scene.generator.generate()
21+
await scene.generator.generation_finished
22+
23+
var grass_hash: int = scene.renderer.tile_map_layers[0].get_used_cells_by_id(0, Vector2i(0, 0)).hash()
24+
assert_int(grass_hash)\
25+
.override_failure_message("Layer 0 rendering of [b]TileMapGaeaRenderer[/b] not working as expected.")\
26+
.append_failure_message("Produced hash:%s\n Expected hash:%s" % [grass_hash, GRASS_TILES_HASH])\
27+
.is_equal(GRASS_TILES_HASH)
28+
29+
var sand_hash: int = scene.renderer.tile_map_layers[1].get_used_cells_by_id(0, Vector2i(1, 0)).hash()
30+
assert_int(sand_hash)\
31+
.override_failure_message("Layer 1 rendering of [b]TileMapGaeaRenderer[/b] not working as expected.")\
32+
.append_failure_message("Produced hash:%s\n Expected hash:%s" % [sand_hash, SAND_TILES_HASH])\
33+
.is_equal(SAND_TILES_HASH)
34+
35+
36+
func test_reset() -> void:
37+
scene.generator.request_reset()
38+
assert_array(scene.renderer.tile_map_layers[0].get_used_cells())\
39+
.override_failure_message("[b]TileMapGaeaRenderer[/b] wasn't cleared properly.")\
40+
.is_empty()
41+
assert_array(scene.renderer.tile_map_layers[1].get_used_cells())\
42+
.override_failure_message("[b]TileMapGaeaRenderer[/b] wasn't cleared properly.")\
43+
.is_empty()
44+
45+
46+
func test_small_area() -> void:
47+
var area: AABB = AABB(Vector3.ZERO, Vector3.ONE * 16)
48+
scene.generator.generate_area(area)
49+
await scene.generator.generation_finished
50+
51+
var grass_hash: int = scene.renderer.tile_map_layers[0].get_used_cells_by_id(0, Vector2i(0, 0)).hash()
52+
assert_int(grass_hash)\
53+
.override_failure_message("Layer 0 rendering of [b]TileMapGaeaRenderer[/b] area not working as expected.")\
54+
.append_failure_message("Produced hash:%s\n Expected hash:%s" % [grass_hash, GRASS_TILES_HASH_SMALL])\
55+
.is_equal(GRASS_TILES_HASH_SMALL)
56+
57+
var sand_hash: int = scene.renderer.tile_map_layers[1].get_used_cells_by_id(0, Vector2i(1, 0)).hash()
58+
assert_int(sand_hash)\
59+
.override_failure_message("Layer 1 rendering of [b]TileMapGaeaRenderer[/b] area not working as expected.")\
60+
.append_failure_message("Produced hash:%s\n Expected hash:%s" % [sand_hash, SAND_TILES_HASH_SMALL])\
61+
.is_equal(SAND_TILES_HASH_SMALL)
62+
63+
assert_vector(scene.renderer.tile_map_layers[0].get_used_rect().size)\
64+
.override_failure_message("Rendered [b]TileMapGaeaRenderer[/b] area was bigger than expected.")\
65+
.is_less_equal(Vector2i(area.size.x, area.size.y))
66+
assert_vector(scene.renderer.tile_map_layers[1].get_used_rect().size)\
67+
.override_failure_message("Rendered [b]TileMapGaeaRenderer[/b] area was bigger than expected.")\
68+
.is_less_equal(Vector2i(area.size.x, area.size.y))
69+
70+
71+
func test_null_layer() -> void:
72+
scene.renderer.tile_map_layers[1] = null
73+
assert_error(scene.generator.generate)\
74+
.is_success()

0 commit comments

Comments
 (0)