Skip to content

Commit f986009

Browse files
authored
chore: Setup tests with vest (#371)
1 parent 961a21d commit f986009

File tree

18 files changed

+755
-1
lines changed

18 files changed

+755
-1
lines changed

.github/workflows/ci.yml

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
name: CI
2+
3+
on:
4+
push:
5+
branches: [ "main" ]
6+
pull_request:
7+
branches: [ "main" ]
8+
workflow_dispatch:
9+
10+
jobs:
11+
test:
12+
name: Run tests
13+
runs-on: ubuntu-latest
14+
steps:
15+
- name: Checkout
16+
uses: actions/checkout@v2
17+
- name: Setup Godot
18+
uses: chickensoft-games/setup-godot@v1
19+
with:
20+
version: 4.2.2
21+
use-dotnet: false
22+
include-templates: false
23+
- name: Verify setup
24+
run: godot --version
25+
- name: Run tests
26+
run: sh/test.sh

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,4 @@ mono_crash.*.json
2222

2323
build
2424
buildtmp
25+
vest.log

addons/netfox.extras/window-tiler.gd

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ func _ready() -> void:
1313
if OS.has_feature("template"):
1414
return
1515

16+
# Running in headless mode
17+
if DisplayServer.get_name() == "headless":
18+
return
19+
1620
# Cleanup in case some files were left
1721
_cleanup()
1822

addons/vest/plugin.cfg

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
[plugin]
2+
3+
name="vest"
4+
description="Test runner for Godot"
5+
author="Tamas Galffy"
6+
version="0.0.0"
7+
script="vest-plugin.gd"

addons/vest/ui/fail-row.tscn

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
[gd_scene load_steps=2 format=3 uid="uid://dwbl6h2m1m8x0"]
2+
3+
[ext_resource type="Script" path="res://addons/vest/ui/vest-fail-result-row.gd" id="1_abm5b"]
4+
5+
[node name="Fail Row" type="VBoxContainer"]
6+
anchors_preset = 15
7+
anchor_right = 1.0
8+
anchor_bottom = 1.0
9+
grow_horizontal = 2
10+
grow_vertical = 2
11+
script = ExtResource("1_abm5b")
12+
13+
[node name="VBoxContainer" type="VBoxContainer" parent="."]
14+
layout_mode = 2
15+
16+
[node name="VBoxContainer" type="HBoxContainer" parent="VBoxContainer"]
17+
layout_mode = 2
18+
19+
[node name="Details Toggle" type="Button" parent="VBoxContainer/VBoxContainer"]
20+
unique_name_in_owner = true
21+
layout_mode = 2
22+
text = "▾"
23+
24+
[node name="Type Label" type="Label" parent="VBoxContainer/VBoxContainer"]
25+
unique_name_in_owner = true
26+
layout_mode = 2
27+
text = "❓"
28+
29+
[node name="Name Label" type="Label" parent="VBoxContainer/VBoxContainer"]
30+
unique_name_in_owner = true
31+
layout_mode = 2
32+
text = "Failed Test"
33+
34+
[node name="Details Container" type="PanelContainer" parent="VBoxContainer"]
35+
unique_name_in_owner = true
36+
visible = false
37+
layout_mode = 2
38+
39+
[node name="Details Label" type="Label" parent="VBoxContainer/Details Container"]
40+
unique_name_in_owner = true
41+
layout_mode = 2

addons/vest/ui/success-row.tscn

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
[gd_scene load_steps=2 format=3 uid="uid://bvnfqeq7fci5l"]
2+
3+
[ext_resource type="Script" path="res://addons/vest/ui/vest-success-result-row.gd" id="1_217am"]
4+
5+
[node name="Success Row" type="HBoxContainer"]
6+
anchors_preset = 15
7+
anchor_right = 1.0
8+
anchor_bottom = 1.0
9+
grow_horizontal = 2
10+
grow_vertical = 2
11+
script = ExtResource("1_217am")
12+
13+
[node name="HBoxContainer" type="HBoxContainer" parent="."]
14+
layout_mode = 2
15+
16+
[node name="Type Label" type="Label" parent="HBoxContainer"]
17+
layout_mode = 2
18+
text = "✅"
19+
20+
[node name="Name Label" type="Label" parent="HBoxContainer"]
21+
unique_name_in_owner = true
22+
layout_mode = 2
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
@tool
2+
extends VestResultRow
3+
class_name VestFailResultRow
4+
5+
@onready var type_label := %"Type Label" as Label
6+
@onready var name_label := %"Name Label" as Label
7+
@onready var details_toggle := %"Details Toggle" as Button
8+
@onready var details_container := %"Details Container" as PanelContainer
9+
@onready var details_label := %"Details Label" as Label
10+
11+
func _ready():
12+
details_toggle.pressed.connect(func():
13+
details_container.visible = not details_container.visible
14+
details_toggle.text = "▴" if details_container.visible else "▾"
15+
)
16+
17+
func update():
18+
type_label.text = _result.get_status_emoji()
19+
name_label.text = _result.case.get_display_name()
20+
details_label.text = "\n".join(_result.messages)

addons/vest/ui/vest-result-row.gd

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
@tool
2+
extends Control
3+
class_name VestResultRow
4+
5+
var _result: VestTest.Result
6+
7+
func set_result(result: VestTest.Result):
8+
_result = result
9+
update()
10+
11+
func update():
12+
pass
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
@tool
2+
extends VestResultRow
3+
class_name VestSuccessResultRow
4+
5+
@onready var name_label := %"Name Label" as Label
6+
7+
func update():
8+
name_label.text = "%s - %s" % [_result.case.module, _result.case.name]

addons/vest/ui/vest-ui.gd

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
@tool
2+
extends Control
3+
class_name VestUI
4+
5+
@onready var run_all_button := %"Run All Button" as Button
6+
@onready var run_on_save_checkbox := %"Run On Save CheckBox" as CheckBox
7+
@onready var clear_button := %"Clear Button" as Button
8+
@onready var results_container := %Results as VBoxContainer
9+
@onready var summary_label := %"Tests Summary Label" as Label
10+
@onready var results_label := %"Tests Result Label" as Label
11+
12+
var _run_on_save: bool = false
13+
14+
func handle_resource_saved(resource: Resource):
15+
if not resource is Script or not visible:
16+
return
17+
18+
if _run_on_save:
19+
run_all()
20+
21+
func run_all():
22+
var runner := VestRunner.new()
23+
get_tree().root.add_child(runner)
24+
25+
clear_results()
26+
27+
var test_start := _time()
28+
var results := runner.run_tests()
29+
var test_duration := _time() - test_start
30+
var aggregate_result := runner.aggregate_results(results)
31+
32+
var success_row = load("res://addons/vest/ui/success-row.tscn") as PackedScene
33+
var fail_row = load("res://addons/vest/ui/fail-row.tscn") as PackedScene
34+
35+
# Render individual results
36+
for test_result in results:
37+
var result_row: VestResultRow
38+
if test_result.is_success():
39+
result_row = success_row.instantiate()
40+
else:
41+
result_row = fail_row.instantiate()
42+
43+
results_container.add_child(result_row)
44+
result_row.set_result(test_result)
45+
46+
# Render summaries
47+
summary_label.text = "Ran %d tests in %.2fms" % [results.size(), test_duration * 1000.]
48+
results_label.text = ("%s %s" % [VestTest.status_emoji(aggregate_result), VestTest.status_string(aggregate_result)]).capitalize()
49+
50+
func clear_results():
51+
var result_rows := results_container.get_children()
52+
for row in result_rows:
53+
results_container.remove_child(row)
54+
row.queue_free()
55+
56+
func _ready():
57+
run_all_button.pressed.connect(run_all)
58+
run_on_save_checkbox.toggled.connect(func(toggled):
59+
_run_on_save = toggled
60+
)
61+
clear_button.pressed.connect(clear_results)
62+
63+
func _time() -> float:
64+
return Time.get_unix_time_from_system() / 1000.

0 commit comments

Comments
 (0)