chore: add GUT test framework

This commit is contained in:
xiaji
2026-05-29 09:16:10 +08:00
parent 5741ba1dc0
commit 07fc763413
808 changed files with 76903 additions and 0 deletions

View File

@@ -0,0 +1,75 @@
extends Node2D
@onready var _gut_control = $GutControl
var _current_script_object = null
var _current_test_name = null
func _ready():
_gut_control.load_config_file('res://test/resources/GutControlDirs/gut_control_config.json')
# Returns a gut_config.gd instance.
var config = _gut_control.get_config()
# Override soecific values for the purposes of this
# scene. You can see all the options available in
# the default_options dictionary in gut_config.gd
config.options.should_exit = false
config.options.compact_mode = false
call_deferred('_post_ready_setup')
func _post_ready_setup():
var gut = _gut_control.get_gut()
gut.start_run.connect(_on_gut_run_start)
gut.start_script.connect(_on_gut_start_script)
gut.end_script.connect(_on_gut_end_script)
gut.start_test.connect(_on_gut_start_test)
gut.end_test.connect(_on_gut_end_test)
gut.end_run.connect(_on_gut_run_end)
func _on_gut_run_start():
print('Starting tests')
# This signal passes a TestCollector.gd/TestScript instance
func _on_gut_start_script(script_obj):
print(script_obj.get_full_name(), ' has ', script_obj.tests.size(), ' tests')
_current_script_object = script_obj
func _on_gut_end_script():
var pass_count = 0
for test in _current_script_object.tests:
if(test.did_pass()):
pass_count += 1
print(pass_count, '/', _current_script_object.tests.size(), " passed\n")
_current_script_object = null
func _on_gut_start_test(test_name):
_current_test_name = test_name
print(' ', test_name)
func _on_gut_end_test():
# get_test_named returns a TestCollector.gd/Test instance for the name
# passed in.
var test_object = _current_script_object.get_test_named(_current_test_name)
var status = "failed"
if(test_object.did_pass()):
status = "passed"
elif(test_object.pending):
status = "pending"
print(' ', status)
_current_test_name = null
func _on_gut_run_end():
print('Tests Done')
#

View File

@@ -0,0 +1 @@
uid://cmkliinaud5n3

View File

@@ -0,0 +1,14 @@
[gd_scene load_steps=3 format=3 uid="uid://cvpbqdkdvsloh"]
[ext_resource type="Script" uid="uid://cmkliinaud5n3" path="res://scenes/TestGutControl.gd" id="1_1k2gg"]
[ext_resource type="PackedScene" uid="uid://4jb53yqktyfg" path="res://addons/gut/gui/GutControl.tscn" id="1_iog3j"]
[node name="TestGutControl" type="Node2D"]
script = ExtResource("1_1k2gg")
[node name="GutControl" parent="." instance=ExtResource("1_iog3j")]
offset_left = 10.0
offset_top = 12.0
offset_right = 397.0
offset_bottom = 631.0
bg_color = Color(0.152941, 0.572549, 0.788235, 1)

View File

@@ -0,0 +1,15 @@
extends Node2D
var GutRunner = load('res://addons/gut/gui/GutRunner.tscn')
var _runner = GutRunner.instantiate()
func _ready():
# wait a bit for _utils to be happy.
await get_tree().create_timer(.2).timeout
add_child(_runner)
func _on_start_run_pressed():
_runner.run_tests()

View File

@@ -0,0 +1 @@
uid://c67l2on1prsb6

View File

@@ -0,0 +1,63 @@
[gd_scene load_steps=2 format=3 uid="uid://1gpt1yhn1rlg"]
[ext_resource type="Script" uid="uid://c67l2on1prsb6" path="res://scenes/TestGutGui.gd" id="1"]
[node name="TestGutGui" type="Node2D"]
script = ExtResource("1")
[node name="Controls" type="Panel" parent="."]
offset_left = 790.0
offset_top = 10.0
offset_right = 1010.0
offset_bottom = 400.0
[node name="StartRun" type="Button" parent="Controls"]
layout_mode = 0
offset_left = 30.0
offset_top = 10.0
offset_right = 190.0
offset_bottom = 60.0
text = "Start Run"
clip_text = true
[node name="PauseBeforeTeardown" type="Button" parent="Controls"]
visible = false
layout_mode = 0
offset_left = 30.0
offset_top = 70.0
offset_right = 191.0
offset_bottom = 120.0
text = "Pause Before Teardown"
[node name="Clear Summary" type="Button" parent="Controls"]
visible = false
layout_mode = 0
offset_left = 30.0
offset_top = 190.0
offset_right = 191.0
offset_bottom = 240.0
text = "Clear Summary"
[node name="Pass" type="Button" parent="Controls"]
visible = false
layout_mode = 0
offset_left = 110.0
offset_top = 130.0
offset_right = 191.0
offset_bottom = 180.0
text = "Pass"
[node name="Fail" type="Button" parent="Controls"]
visible = false
layout_mode = 0
offset_left = 30.0
offset_top = 130.0
offset_right = 99.0
offset_bottom = 163.0
text = "Fail"
[connection signal="pressed" from="Controls/StartRun" to="." method="_on_start_run_pressed"]
[connection signal="pressed" from="Controls/PauseBeforeTeardown" to="." method="_on_PauseBeforeTeardown_pressed"]
[connection signal="pressed" from="Controls/Clear Summary" to="." method="_on_Clear_Summary_pressed"]
[connection signal="pressed" from="Controls/Pass" to="." method="_on_Pass_pressed"]
[connection signal="pressed" from="Controls/Fail" to="." method="_on_Fail_pressed"]

View File

@@ -0,0 +1,62 @@
extends Node2D
const RUNNER_JSON_PATH = 'user://test_gut_editor_config.json'
var GutConfigGui = load('res://addons/gut/gui/gut_config_gui.gd')
@onready var _ctrls = {
settings = $ColorRect/ScrollContainer/Settings,
issues = $Controls/VBox/Issues
}
var _gut_config = load('res://addons/gut/gut_config.gd').new()
var _gut_config_gui = null
var _settings_vbox = null
# Called when the node enters the scene tree for the first time.
func _ready():
_settings_vbox = _ctrls.settings.duplicate()
_gut_config.load_options(RUNNER_JSON_PATH)
_create_options()
func _clear_options():
if(_gut_config_gui != null):
_gut_config_gui.clear()
func _display_issues():
var issues : Array = _gut_config_gui.get_config_issues()
if(issues.size() > 0):
_ctrls.issues.text = "\n".join(issues)
else:
_ctrls.issues.text = "-- No Issues --"
func _create_options():
_gut_config_gui = GutConfigGui.new(_ctrls.settings)
_gut_config_gui.set_options(_gut_config.options)
func save_options():
_gut_config.options = _gut_config_gui.get_options(_gut_config.options)
var w_result = _gut_config.write_options(RUNNER_JSON_PATH)
if(w_result != OK):
push_error(str('Could not write options to ', RUNNER_JSON_PATH, ': ', w_result))
else:
_gut_config_gui.mark_saved()
func _on_save_pressed():
save_options()
_display_issues()
print('saved')
func _on_load_pressed():
_clear_options()
await get_tree().create_timer(.5).timeout
_create_options()
_display_issues()
print('loaded')
func _on_get_issues_pressed():
_display_issues()

View File

@@ -0,0 +1 @@
uid://nuh4mbmnf3p3

View File

@@ -0,0 +1,63 @@
[gd_scene load_steps=2 format=3 uid="uid://cgndmr3wi311q"]
[ext_resource type="Script" uid="uid://nuh4mbmnf3p3" path="res://scenes/TestGutGuiSettings.gd" id="1_5452u"]
[node name="TestGutGuiSettings" type="Node2D"]
script = ExtResource("1_5452u")
[node name="ColorRect" type="ColorRect" parent="."]
anchors_preset = -1
offset_left = 71.0
offset_top = 22.0
offset_right = 585.0
offset_bottom = 523.0
color = Color(0.137255, 0.164706, 0.270588, 1)
[node name="ScrollContainer" type="ScrollContainer" parent="ColorRect"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="Settings" type="VBoxContainer" parent="ColorRect/ScrollContainer"]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3
[node name="Controls" type="ColorRect" parent="."]
anchors_preset = -1
offset_left = 634.0
offset_top = 4.0
offset_right = 1001.0
offset_bottom = 405.0
color = Color(0.176471, 0.176471, 0.176471, 1)
[node name="VBox" type="VBoxContainer" parent="Controls"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="Save" type="Button" parent="Controls/VBox"]
layout_mode = 2
text = "Save"
[node name="Load" type="Button" parent="Controls/VBox"]
layout_mode = 2
text = "Load"
[node name="GetIssues" type="Button" parent="Controls/VBox"]
layout_mode = 2
text = "Get Issues"
[node name="Issues" type="TextEdit" parent="Controls/VBox"]
layout_mode = 2
size_flags_vertical = 3
[connection signal="pressed" from="Controls/VBox/Save" to="." method="_on_save_pressed"]
[connection signal="pressed" from="Controls/VBox/Load" to="." method="_on_load_pressed"]
[connection signal="pressed" from="Controls/VBox/GetIssues" to="." method="_on_get_issues_pressed"]

View File

@@ -0,0 +1,25 @@
extends Node2D
var PanelControls = load('res://addons/gut/gui/panel_controls.gd')
@onready var _ctrls = {
pc_vbox = $PanelControls/VBox
}
var _save_load = PanelControls.SaveLoadControl.new('whatever', 1, 'hint')
var _res_dir = PanelControls.DirectoryControl.new('some dir', 'res://', 'hint')
var _res_dir_enabled = PanelControls.DirectoryControl.new('other dir', 'res://', 'hint')
func _ready():
#_save_load.dlg_load.show_diretory_types = false
#_save_load.dlg_load.show_user = false
#_save_load.dlg_save.show_os = false
_res_dir_enabled.enabled_button.visible = true
_ctrls.pc_vbox.add_child(_save_load)
_ctrls.pc_vbox.add_child(_res_dir)
_ctrls.pc_vbox.add_child(_res_dir_enabled)

View File

@@ -0,0 +1 @@
uid://dg8cn53rwfxsy

View File

@@ -0,0 +1,39 @@
[gd_scene load_steps=2 format=3 uid="uid://c5lpntmguguv"]
[ext_resource type="Script" uid="uid://dg8cn53rwfxsy" path="res://scenes/TestPanelControls.gd" id="1_1ruap"]
[node name="TestPanelControls" type="Node2D"]
script = ExtResource("1_1ruap")
[node name="Controls" type="ColorRect" parent="."]
offset_left = 44.0
offset_top = 64.0
offset_right = 260.0
offset_bottom = 326.0
color = Color(0.0745098, 0.0745098, 0.0745098, 1)
[node name="VBox" type="VBoxContainer" parent="Controls"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="Button" type="Button" parent="Controls/VBox"]
layout_mode = 2
[node name="PanelControls" type="ColorRect" parent="."]
offset_left = 510.0
offset_top = 62.0
offset_right = 1026.0
offset_bottom = 568.0
color = Color(0.164706, 0.164706, 0.164706, 1)
[node name="VBox" type="VBoxContainer" parent="PanelControls"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2

View File

@@ -0,0 +1,74 @@
extends Node2D
var _lgr = null
var _gut = null
var yield_timer = null
func before_all():
yield_timer = Timer.new()
func after_all():
yield_timer.free()
func _on_Gut_gut_ready():
yield_timer.wait_time = .5
yield_timer.connect('timeout',Callable(self,'on_yield_timer_timeout'))
yield_timer.one_shot = false
add_child(yield_timer)
_lgr = load('res://addons/gut/logger.gd').new()
#$Gut.get_gut().get_gui().set_font_size(30)
_gut = $Gut.get_gut()
_gut.add_directory('res://test/samples')
_gut.logger = _lgr
_gut.maximize()
_lgr.disable_printer('console', false)
yield_timer.start()
func _run_print_routines():
_print_some_things()
_print_all_formats()
_lgr.log()
_lgr.log()
_lgr.set_indent_level(3)
_lgr.set_indent_string('|...')
_print_some_things()
_print_all_formats()
_lgr.set_indent_level(0)
_lgr.set_indent_string(' ')
func _print_some_things():
_lgr.log('Hello World3D')
_lgr.passed('This passed')
_lgr.failed('This failed')
_lgr.info('infoing')
_lgr.warn('warning')
_lgr.error('erroring')
_lgr.pending('pending')
_lgr.pending('')
_lgr.deprecated('you do not need this anymore')
_lgr.deprecated('deprecated', 'use me')
_lgr.log()
_lgr.log()
func _print_all_formats():
for key in _lgr.fmts:
_lgr.lograw(key, _lgr.fmts[key])
_lgr.lograw(' ')
_lgr.log()
_lgr.lograw(_lgr.get_indent())
for key in _lgr.fmts:
_lgr.lograw(key, _lgr.fmts[key])
_lgr.lograw(' ')
_lgr.log()
for key in _lgr.fmts:
_lgr.log(key, _lgr.fmts[key])

View File

@@ -0,0 +1 @@
uid://b482k25b7slsb

View File

@@ -0,0 +1,6 @@
[gd_scene load_steps=2 format=3 uid="uid://cn5k7ildpase3"]
[ext_resource type="Script" uid="uid://b482k25b7slsb" path="res://scenes/TestPrint.gd" id="2"]
[node name="TestPrint" type="Node2D"]
script = ExtResource("2")

View File

@@ -0,0 +1,25 @@
[gd_scene format=3 uid="uid://cme7ha7tcw3y8"]
[ext_resource type="Script" uid="uid://c6wm4h7xfrlor" path="res://scripts/main.gd" id="1"]
[ext_resource type="PackedScene" uid="uid://4jb53yqktyfg" path="res://addons/gut/gui/GutControl.tscn" id="2_f2w0u"]
[node name="main" type="Node2D" unique_id=702701755]
script = ExtResource("1")
[node name="RunTestsButton" type="Button" parent="." unique_id=1193447907]
offset_left = 11.0
offset_top = 19.0
offset_right = 194.0
offset_bottom = 94.0
text = "Run Tests
"
[node name="GutControl" parent="." unique_id=1396051957 instance=ExtResource("2_f2w0u")]
anchors_preset = -1
offset_left = 11.0
offset_top = 104.0
offset_right = 349.0
offset_bottom = 628.0
bg_color = Color(0.227451, 0.270588, 0.376471, 1)
[connection signal="pressed" from="RunTestsButton" to="." method="_on_run_gut_tests_button_pressed"]