Skip to content

Commit 31bae6b

Browse files
committed
chore(test): Bump GDUnit version
1 parent e660c84 commit 31bae6b

27 files changed

+621
-529
lines changed

addons/gdUnit4/bin/GdUnitCmdTool.gd

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -312,12 +312,12 @@ class CLIRunner:
312312
commands.append_array(result.value() as Array)
313313
result = (
314314
CmdCommandHandler.new(_cmd_options)
315-
.register_cb("-help", Callable(self, "show_help"))
316-
.register_cb("--help-advanced", Callable(self, "show_advanced_help"))
317-
.register_cb("-a", Callable(_runner_config, "add_test_suite"))
318-
.register_cbv("-a", Callable(_runner_config, "add_test_suites"))
319-
.register_cb("-i", Callable(_runner_config, "skip_test_suite"))
320-
.register_cbv("-i", Callable(_runner_config, "skip_test_suites"))
315+
.register_cb("-help", show_help)
316+
.register_cb("--help-advanced", show_advanced_help)
317+
.register_cb("-a", _runner_config.add_test_suite)
318+
.register_cbv("-a", _runner_config.add_test_suites)
319+
.register_cb("-i", _runner_config.skip_test_suite)
320+
.register_cbv("-i", _runner_config.skip_test_suites)
321321
.register_cb("-rd", set_report_dir)
322322
.register_cb("-rc", set_report_count)
323323
.register_cb("--selftest", run_self_test)
@@ -376,9 +376,9 @@ class CLIRunner:
376376
var ts_scanner := GdUnitTestSuiteScanner.new()
377377
for as_resource_path in to_execute.keys() as Array[String]:
378378
var selected_tests: PackedStringArray = to_execute.get(as_resource_path)
379-
var scaned_suites := ts_scanner.scan(as_resource_path)
380-
skip_test_case(scaned_suites, selected_tests)
381-
test_suites_to_process.append_array(scaned_suites)
379+
var scanned_suites := ts_scanner.scan(as_resource_path)
380+
skip_test_case(scanned_suites, selected_tests)
381+
test_suites_to_process.append_array(scanned_suites)
382382
skip_suites(test_suites_to_process, config)
383383
return test_suites_to_process
384384

addons/gdUnit4/plugin.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@
33
name="gdUnit4"
44
description="Unit Testing Framework for Godot Scripts"
55
author="Mike Schulze"
6-
version="4.4.3"
6+
version="4.5.0"
77
script="plugin.gd"

addons/gdUnit4/plugin.gd

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
@tool
22
extends EditorPlugin
33

4-
const GdUnitTools := preload ("res://addons/gdUnit4/src/core/GdUnitTools.gd")
5-
const GdUnitTestDiscoverGuard := preload ("res://addons/gdUnit4/src/core/discovery/GdUnitTestDiscoverGuard.gd")
4+
const GdUnitTools := preload("res://addons/gdUnit4/src/core/GdUnitTools.gd")
5+
const GdUnitTestDiscoverGuard := preload("res://addons/gdUnit4/src/core/discovery/GdUnitTestDiscoverGuard.gd")
6+
const GdUnitConsole := preload("res://addons/gdUnit4/src/ui/GdUnitConsole.gd")
67

78

89
var _gd_inspector: Control
9-
var _gd_console: Control
10+
var _gd_console: GdUnitConsole
1011
var _guard: GdUnitTestDiscoverGuard
1112

1213

@@ -19,23 +20,20 @@ func _enter_tree() -> void:
1920
prints("GdUnit4 plugin requires a minimum of Godot 4.2.x Version!")
2021
return
2122
GdUnitSettings.setup()
22-
# install the GdUnit inspector
23-
_gd_inspector = load("res://addons/gdUnit4/src/ui/GdUnitInspector.tscn").instantiate()
23+
# Install the GdUnit Inspector
24+
_gd_inspector = (load("res://addons/gdUnit4/src/ui/GdUnitInspector.tscn") as PackedScene).instantiate()
2425
add_control_to_dock(EditorPlugin.DOCK_SLOT_LEFT_UR, _gd_inspector)
25-
# install the GdUnit Console
26-
_gd_console = load("res://addons/gdUnit4/src/ui/GdUnitConsole.tscn").instantiate()
27-
@warning_ignore("return_value_discarded")
28-
add_control_to_bottom_panel(_gd_console, "gdUnitConsole")
29-
prints("Loading GdUnit4 Plugin success")
30-
if GdUnitSettings.is_update_notification_enabled():
31-
var update_tool: Node = load("res://addons/gdUnit4/src/update/GdUnitUpdateNotify.tscn").instantiate()
32-
Engine.get_main_loop().root.add_child.call_deferred(update_tool)
26+
# Install the GdUnit Console
27+
_gd_console = (load("res://addons/gdUnit4/src/ui/GdUnitConsole.tscn") as PackedScene).instantiate()
28+
var control := add_control_to_bottom_panel(_gd_console, "gdUnitConsole")
29+
await _gd_console.setup_update_notification(control)
3330
if GdUnit4CSharpApiLoader.is_mono_supported():
3431
prints("GdUnit4Net version '%s' loaded." % GdUnit4CSharpApiLoader.version())
35-
# connect to be notified for script changes to be able to discover new tests
32+
# Connect to be notified for script changes to be able to discover new tests
3633
_guard = GdUnitTestDiscoverGuard.new()
3734
@warning_ignore("return_value_discarded")
3835
resource_saved.connect(_on_resource_saved)
36+
prints("Loading GdUnit4 Plugin success")
3937

4038

4139
func _exit_tree() -> void:

addons/gdUnit4/src/cmd/CmdCommandHandler.gd

Lines changed: 55 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -10,26 +10,28 @@ var _cmd_options :CmdOptions
1010
# Dictionary[String, Array[Callback]
1111
var _command_cbs :Dictionary
1212

13-
# we only able to check cb function name since Godot 3.3.x
14-
var _enhanced_fr_test := false
1513

1614

1715
func _init(cmd_options: CmdOptions) -> void:
1816
_cmd_options = cmd_options
19-
var major: int = Engine.get_version_info()["major"]
20-
var minor: int = Engine.get_version_info()["minor"]
21-
if major == 3 and minor == 3:
22-
_enhanced_fr_test = true
2317

2418

2519
# register a callback function for given command
2620
# cmd_name short name of the command
2721
# fr_arg a funcref to a function with a single argument
28-
func register_cb(cmd_name: String, cb: Callable = NO_CB) -> CmdCommandHandler:
22+
func register_cb(cmd_name: String, cb: Callable) -> CmdCommandHandler:
2923
var registered_cb: Array = _command_cbs.get(cmd_name, [NO_CB, NO_CB])
3024
if registered_cb[CB_SINGLE_ARG]:
3125
push_error("A function for command '%s' is already registered!" % cmd_name)
3226
return self
27+
28+
if not _validate_cb_signature(cb, TYPE_STRING):
29+
push_error(
30+
("The callback '%s:%s' for command '%s' has invalid function signature. "
31+
+"The callback signature must be 'func name(value: PackedStringArray)'")
32+
% [cb.get_object().get_class(), cb.get_method(), cmd_name])
33+
return null
34+
3335
registered_cb[CB_SINGLE_ARG] = cb
3436
_command_cbs[cmd_name] = registered_cb
3537
return self
@@ -42,15 +44,23 @@ func register_cbv(cmd_name: String, cb: Callable) -> CmdCommandHandler:
4244
if registered_cb[CB_MULTI_ARGS]:
4345
push_error("A function for command '%s' is already registered!" % cmd_name)
4446
return self
47+
48+
if not _validate_cb_signature(cb, TYPE_PACKED_STRING_ARRAY):
49+
push_error(
50+
("The callback '%s:%s' for command '%s' has invalid function signature. "
51+
+"The callback signature must be 'func name(value: PackedStringArray)'")
52+
% [cb.get_object().get_class(), cb.get_method(), cmd_name])
53+
return null
54+
4555
registered_cb[CB_MULTI_ARGS] = cb
4656
_command_cbs[cmd_name] = registered_cb
4757
return self
4858

4959

5060
func _validate() -> GdUnitResult:
51-
var errors: = PackedStringArray()
61+
var errors := PackedStringArray()
5262
# Dictionary[StringName, String]
53-
var registered_cbs: = Dictionary()
63+
var registered_cbs := Dictionary()
5464

5565
for cmd_name in _command_cbs.keys() as Array[String]:
5666
var cb: Callable = (_command_cbs[cmd_name][CB_SINGLE_ARG]
@@ -63,8 +73,8 @@ func _validate() -> GdUnitResult:
6373
@warning_ignore("return_value_discarded")
6474
errors.append("The command '%s' is unknown, verify your CmdOptions!" % cmd_name)
6575
# verify for multiple registered command callbacks
66-
if _enhanced_fr_test and cb != NO_CB:
67-
var cb_method: = cb.get_method()
76+
if cb != NO_CB:
77+
var cb_method := cb.get_method()
6878
if registered_cbs.has(cb_method):
6979
var already_registered_cmd :String = registered_cbs[cb_method]
7080
@warning_ignore("return_value_discarded")
@@ -76,33 +86,51 @@ func _validate() -> GdUnitResult:
7686
return GdUnitResult.error("\n".join(errors))
7787

7888

79-
func execute(commands :Array[CmdCommand]) -> GdUnitResult:
89+
func execute(commands: Array[CmdCommand]) -> GdUnitResult:
8090
var result := _validate()
8191
if result.is_error():
8292
return result
8393
for cmd in commands:
8494
var cmd_name := cmd.name()
8595
if _command_cbs.has(cmd_name):
86-
var cb_s :Callable = _command_cbs.get(cmd_name)[CB_SINGLE_ARG]
96+
var cb_s: Callable = _command_cbs.get(cmd_name)[CB_SINGLE_ARG]
8797
var arguments := cmd.arguments()
8898
var cmd_option := _cmd_options.get_option(cmd_name)
89-
if cb_s and arguments.size() == 0:
99+
100+
if arguments.is_empty():
90101
cb_s.call()
91-
elif cb_s:
102+
elif arguments.size() > 1:
103+
var cb_m: Callable = _command_cbs.get(cmd_name)[CB_MULTI_ARGS]
104+
cb_m.call(arguments)
105+
else:
92106
if cmd_option.type() == TYPE_BOOL:
93107
cb_s.call(true if arguments[0] == "true" else false)
94108
else:
95109
cb_s.call(arguments[0])
96-
else:
97-
var cb_m :Callable = _command_cbs.get(cmd_name)[CB_MULTI_ARGS]
98-
# we need to find the method and determin the arguments to call the right function
99-
for m in cb_m.get_object().get_method_list():
100-
if m["name"] == cb_m.get_method():
101-
@warning_ignore("unsafe_cast")
102-
if (m["args"] as Array).size() > 1:
103-
cb_m.callv(arguments)
104-
break
105-
else:
106-
cb_m.call(arguments)
107-
break
110+
108111
return GdUnitResult.success(true)
112+
113+
114+
func _validate_cb_signature(cb: Callable, arg_type: int) -> bool:
115+
for m in cb.get_object().get_method_list():
116+
if m["name"] == cb.get_method():
117+
@warning_ignore("unsafe_cast")
118+
return _validate_func_arguments(m["args"] as Array, arg_type)
119+
return true
120+
121+
122+
func _validate_func_arguments(arguments: Array, arg_type: int) -> bool:
123+
# validate we have a single argument
124+
if arguments.size() > 1:
125+
return false
126+
# a cb with no arguments is also valid
127+
if arguments.size() == 0:
128+
return true
129+
# validate argument type
130+
var arg: Dictionary = arguments[0]
131+
@warning_ignore("unsafe_cast")
132+
if arg["usage"] as int == PROPERTY_USAGE_NIL_IS_VARIANT:
133+
return true
134+
if arg["type"] != arg_type:
135+
return false
136+
return true

addons/gdUnit4/src/core/GdUnitRunner.gd

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ func _process(_delta :float) -> void:
6565
if _client.is_client_connected():
6666
var time := LocalTime.now()
6767
prints("Scan for test suites.")
68-
_test_suites_to_process = load_test_suits()
68+
_test_suites_to_process = load_test_suites()
6969
prints("Scanning of %d test suites took" % _test_suites_to_process.size(), time.elapsed_since())
7070
gdUnitInit()
7171
_state = RUN
@@ -95,7 +95,7 @@ func _process(_delta :float) -> void:
9595
get_tree().quit(0)
9696

9797

98-
func load_test_suits() -> Array[Node]:
98+
func load_test_suites() -> Array[Node]:
9999
var to_execute := _config.to_execute()
100100
if to_execute.is_empty():
101101
prints("No tests selected to execute!")
@@ -106,15 +106,15 @@ func load_test_suits() -> Array[Node]:
106106
var _scanner := GdUnitTestSuiteScanner.new()
107107
for resource_path :String in to_execute.keys():
108108
var selected_tests :PackedStringArray = to_execute.get(resource_path)
109-
var scaned_suites := _scanner.scan(resource_path)
110-
_filter_test_case(scaned_suites, selected_tests)
111-
test_suites += scaned_suites
109+
var scanned_suites := _scanner.scan(resource_path)
110+
_filter_test_case(scanned_suites, selected_tests)
111+
test_suites += scanned_suites
112112
return test_suites
113113

114114

115115
func gdUnitInit() -> void:
116116
#enable_manuall_polling()
117-
send_message("Scaned %d test suites" % _test_suites_to_process.size())
117+
send_message("Scanned %d test suites" % _test_suites_to_process.size())
118118
var total_count := _collect_test_case_count(_test_suites_to_process)
119119
_on_gdunit_event(GdUnitInit.new(_test_suites_to_process.size(), total_count))
120120
if not GdUnitSettings.is_test_discover_enabled():

addons/gdUnit4/src/core/GdUnitRunnerConfig.gd

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ const VERSION = "version"
88
const INCLUDED = "included"
99
const SKIPPED = "skipped"
1010
const SERVER_PORT = "server_port"
11-
const EXIT_FAIL_FAST ="exit_on_first_fail"
11+
const EXIT_FAIL_FAST = "exit_on_first_fail"
1212

1313
const CONFIG_FILE = "res://addons/gdUnit4/GdUnitRunner.cfg"
1414

@@ -29,7 +29,7 @@ func clear() -> GdUnitRunnerConfig:
2929
return self
3030

3131

32-
func set_server_port(port :int) -> GdUnitRunnerConfig:
32+
func set_server_port(port: int) -> GdUnitRunnerConfig:
3333
_config[SERVER_PORT] = port
3434
return self
3535

@@ -45,22 +45,22 @@ func self_test() -> GdUnitRunnerConfig:
4545
return self
4646

4747

48-
func add_test_suite(p_resource_path :String) -> GdUnitRunnerConfig:
48+
func add_test_suite(p_resource_path: String) -> GdUnitRunnerConfig:
4949
var to_execute_ := to_execute()
5050
to_execute_[p_resource_path] = to_execute_.get(p_resource_path, PackedStringArray())
5151
return self
5252

5353

54-
func add_test_suites(resource_paths :PackedStringArray) -> GdUnitRunnerConfig:
54+
func add_test_suites(resource_paths: PackedStringArray) -> GdUnitRunnerConfig:
5555
for resource_path_ in resource_paths:
5656
@warning_ignore("return_value_discarded")
5757
add_test_suite(resource_path_)
5858
return self
5959

6060

61-
func add_test_case(p_resource_path :String, test_name :StringName, test_param_index :int = -1) -> GdUnitRunnerConfig:
61+
func add_test_case(p_resource_path: String, test_name: String, test_param_index: int = -1) -> GdUnitRunnerConfig:
6262
var to_execute_ := to_execute()
63-
var test_cases :PackedStringArray = to_execute_.get(p_resource_path, PackedStringArray())
63+
var test_cases: PackedStringArray = to_execute_.get(p_resource_path, PackedStringArray())
6464
if test_param_index != -1:
6565
@warning_ignore("return_value_discarded")
6666
test_cases.append("%s:%d" % [test_name, test_param_index])
@@ -75,7 +75,7 @@ func add_test_case(p_resource_path :String, test_name :StringName, test_param_in
7575
# <test_suite_name|path>[:<test_case_name>]
7676
# '/path/path', res://path/path', 'res://path/path/testsuite.gd' or 'testsuite'
7777
# 'res://path/path/testsuite.gd:test_case' or 'testsuite:test_case'
78-
func skip_test_suite(value :StringName) -> GdUnitRunnerConfig:
78+
func skip_test_suite(value: String) -> GdUnitRunnerConfig:
7979
var parts: PackedStringArray = GdUnitFileAccess.make_qualified_path(value).rsplit(":")
8080
if parts[0] == "res":
8181
parts.remove_at(0)
@@ -85,20 +85,20 @@ func skip_test_suite(value :StringName) -> GdUnitRunnerConfig:
8585
skipped()[parts[0]] = PackedStringArray()
8686
2:
8787
@warning_ignore("return_value_discarded")
88-
skip_test_case(parts[0], parts[1])
88+
_skip_test_case(parts[0], parts[1])
8989
return self
9090

9191

92-
func skip_test_suites(resource_paths :PackedStringArray) -> GdUnitRunnerConfig:
92+
func skip_test_suites(resource_paths: PackedStringArray) -> GdUnitRunnerConfig:
9393
for resource_path_ in resource_paths:
9494
@warning_ignore("return_value_discarded")
9595
skip_test_suite(resource_path_)
9696
return self
9797

9898

99-
func skip_test_case(p_resource_path :String, test_name :StringName) -> GdUnitRunnerConfig:
99+
func _skip_test_case(p_resource_path: String, test_name: String) -> GdUnitRunnerConfig:
100100
var to_ignore := skipped()
101-
var test_cases :PackedStringArray = to_ignore.get(p_resource_path, PackedStringArray())
101+
var test_cases: PackedStringArray = to_ignore.get(p_resource_path, PackedStringArray())
102102
@warning_ignore("return_value_discarded")
103103
test_cases.append(test_name)
104104
to_ignore[p_resource_path] = test_cases
@@ -114,7 +114,7 @@ func skipped() -> Dictionary:
114114
return _config.get(SKIPPED, {})
115115

116116

117-
func save_config(path :String = CONFIG_FILE) -> GdUnitResult:
117+
func save_config(path: String = CONFIG_FILE) -> GdUnitResult:
118118
var file := FileAccess.open(path, FileAccess.WRITE)
119119
if file == null:
120120
var error := FileAccess.get_open_error()
@@ -124,7 +124,7 @@ func save_config(path :String = CONFIG_FILE) -> GdUnitResult:
124124
return GdUnitResult.success(path)
125125

126126

127-
func load_config(path :String = CONFIG_FILE) -> GdUnitResult:
127+
func load_config(path: String = CONFIG_FILE) -> GdUnitResult:
128128
if not FileAccess.file_exists(path):
129129
return GdUnitResult.error("Can't find test runner configuration '%s'! Please select a test to run." % path)
130130
var file := FileAccess.open(path, FileAccess.READ)
@@ -148,13 +148,13 @@ func load_config(path :String = CONFIG_FILE) -> GdUnitResult:
148148
@warning_ignore("unsafe_cast")
149149
func fix_value_types() -> void:
150150
# fix float value to int json stores all numbers as float
151-
var server_port_ :int = _config.get(SERVER_PORT, -1)
151+
var server_port_: int = _config.get(SERVER_PORT, -1)
152152
_config[SERVER_PORT] = server_port_
153153
convert_Array_to_PackedStringArray(_config[INCLUDED] as Dictionary)
154154
convert_Array_to_PackedStringArray(_config[SKIPPED] as Dictionary)
155155

156156

157-
func convert_Array_to_PackedStringArray(data :Dictionary) -> void:
157+
func convert_Array_to_PackedStringArray(data: Dictionary) -> void:
158158
for key in data.keys() as Array[String]:
159159
var values :Array = data[key]
160160
data[key] = PackedStringArray(values)

addons/gdUnit4/src/core/GdUnitSettings.gd

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -396,7 +396,7 @@ static func migrate_property(old_property :String, new_property :String, default
396396
ProjectSettings.set_initial_value(new_property, default_value)
397397
set_help(new_property, value, help)
398398
ProjectSettings.clear(old_property)
399-
prints("Succesfull migrated property '%s' -> '%s' value: %s" % [old_property, new_property, value])
399+
prints("Successfully migrated property '%s' -> '%s' value: %s" % [old_property, new_property, value])
400400

401401

402402
static func dump_to_tmp() -> void:

0 commit comments

Comments
 (0)