Skip to content

Commit d4ce26a

Browse files
authored
Ability to export categories via property editor (#204)
1 parent 0cfcc8b commit d4ce26a

File tree

182 files changed

+4930
-2664
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

182 files changed

+4930
-2664
lines changed

.github/workflows/pandora-ci.yml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ concurrency:
2525

2626
jobs:
2727
unit-tests:
28+
timeout-minutes: 5
29+
2830
runs-on: ubuntu-latest
2931
permissions:
3032
actions: write
@@ -37,13 +39,17 @@ jobs:
3739
fail-fast: false
3840
max-parallel: 10
3941
matrix:
40-
godot-version: ["4.2.2"]
42+
godot-version: ["4.2.2", "4.3"]
4143

4244
name: "🤖 CI on Godot ${{ matrix.godot-version }}"
4345
steps:
4446
- name: Checkout repository
4547
uses: actions/checkout@v2
4648

49+
- name: Set Runner Tracking ID to prevent orphan processes
50+
run: |
51+
export RUNNER_TRACKING_ID=""
52+
4753
- name: Run GDUnit4 tests
4854
uses: MikeSchulze/gdUnit4-action@v1.1.1
4955
with:

addons/gdUnit4/bin/GdUnitBuildTool.gd

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ func _idle(_delta :float) -> void:
6868
exit(RETURN_ERROR, result.error_message())
6969
return
7070
_console.prints_color("Added testcase: %s" % result.value(), Color.CORNFLOWER_BLUE)
71-
print_json_result(result.value())
71+
print_json_result(result.value() as Dictionary)
7272
exit(RETURN_SUCCESS)
7373

7474

@@ -85,7 +85,7 @@ func exit(code :int, message :String = "") -> void:
8585

8686
func print_json_result(result :Dictionary) -> void:
8787
# convert back to system path
88-
var path := ProjectSettings.globalize_path(result["path"]);
88+
var path := ProjectSettings.globalize_path(result["path"] as String)
8989
var json := 'JSON_RESULT:{"TestCases" : [{"line":%d, "path": "%s"}]}' % [result["line"], path]
9090
prints(json)
9191

addons/gdUnit4/bin/GdUnitCmdTool.gd

Lines changed: 50 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ class CLIRunner:
3333
var _headless_mode_ignore := false
3434
var _runner_config := GdUnitRunnerConfig.new()
3535
var _runner_config_file := ""
36+
var _debug_cmd_args: = PackedStringArray()
3637
var _console := CmdConsole.new()
3738
var _cmd_options := CmdOptions.new([
3839
CmdOption.new(
@@ -105,9 +106,10 @@ class CLIRunner:
105106
func _ready() -> void:
106107
_state = INIT
107108
_report_dir = GdUnitFileAccess.current_dir() + "reports"
108-
_executor = load("res://addons/gdUnit4/src/core/execution/GdUnitTestSuiteExecutor.gd").new()
109+
_executor = GdUnitTestSuiteExecutor.new()
109110
# stop checked first test failure to fail fast
110-
_executor.fail_fast(true)
111+
@warning_ignore("unsafe_cast")
112+
(_executor as GdUnitTestSuiteExecutor).fail_fast(true)
111113
if GdUnit4CSharpApiLoader.is_mono_supported():
112114
prints("GdUnit4Net version '%s' loaded." % GdUnit4CSharpApiLoader.version())
113115
_cs_executor = GdUnit4CSharpApiLoader.create_executor(self)
@@ -123,6 +125,7 @@ class CLIRunner:
123125
prints("Finallize .. done")
124126

125127

128+
@warning_ignore("unsafe_method_access")
126129
func _process(_delta :float) -> void:
127130
match _state:
128131
INIT:
@@ -135,7 +138,8 @@ class CLIRunner:
135138
else:
136139
set_process(false)
137140
# process next test suite
138-
var test_suite := _test_suites_to_process.pop_front() as Node
141+
var test_suite: Node = _test_suites_to_process.pop_front()
142+
139143
if _cs_executor != null and _cs_executor.IsExecutable(test_suite):
140144
_cs_executor.Execute(test_suite)
141145
await _cs_executor.ExecutionCompleted
@@ -185,6 +189,7 @@ class CLIRunner:
185189
"Disabled fail fast!",
186190
Color.DEEP_SKY_BLUE
187191
)
192+
@warning_ignore("unsafe_method_access")
188193
_executor.fail_fast(false)
189194

190195

@@ -199,13 +204,13 @@ class CLIRunner:
199204

200205
func show_version() -> void:
201206
_console.prints_color(
202-
"Godot %s" % Engine.get_version_info().get("string"),
207+
"Godot %s" % Engine.get_version_info().get("string") as String,
203208
Color.DARK_SALMON
204209
)
205210
var config := ConfigFile.new()
206211
config.load("addons/gdUnit4/plugin.cfg")
207212
_console.prints_color(
208-
"GdUnit4 %s" % config.get_value("plugin", "version"),
213+
"GdUnit4 %s" % config.get_value("plugin", "version") as String,
209214
Color.DARK_SALMON
210215
)
211216
quit(RETURN_SUCCESS)
@@ -274,6 +279,12 @@ class CLIRunner:
274279
quit(RETURN_SUCCESS)
275280

276281

282+
func get_cmdline_args() -> PackedStringArray:
283+
if _debug_cmd_args.is_empty():
284+
return OS.get_cmdline_args()
285+
return _debug_cmd_args
286+
287+
277288
func init_gd_unit() -> void:
278289
_console.prints_color(
279290
"""
@@ -284,7 +295,7 @@ class CLIRunner:
284295
).new_line()
285296

286297
var cmd_parser := CmdArgumentParser.new(_cmd_options, "GdUnitCmdTool.gd")
287-
var result := cmd_parser.parse(OS.get_cmdline_args())
298+
var result := cmd_parser.parse(get_cmdline_args())
288299
if result.is_error():
289300
show_options()
290301
_console.prints_error(result.error_message())
@@ -297,7 +308,8 @@ class CLIRunner:
297308
return
298309
# build runner config by given commands
299310
var commands :Array[CmdCommand] = []
300-
commands.append_array(result.value())
311+
@warning_ignore("unsafe_cast")
312+
commands.append_array(result.value() as Array)
301313
result = (
302314
CmdCommandHandler.new(_cmd_options)
303315
.register_cb("-help", Callable(self, "show_help"))
@@ -412,7 +424,9 @@ class CLIRunner:
412424
# if no tests skipped test the complete suite is skipped
413425
if skipped_tests.is_empty():
414426
_console.prints_warning("Mark test suite '%s' as skipped!" % suite_to_skip)
427+
@warning_ignore("unsafe_property_access")
415428
test_suite.__is_skipped = true
429+
@warning_ignore("unsafe_property_access")
416430
test_suite.__skip_reason = skip_reason
417431
else:
418432
# skip tests
@@ -443,10 +457,8 @@ class CLIRunner:
443457
func _on_gdunit_event(event: GdUnitEvent) -> void:
444458
match event.type():
445459
GdUnitEvent.INIT:
446-
_report = GdUnitHtmlReport.new(_report_dir)
460+
_report = GdUnitHtmlReport.new(_report_dir, _report_max)
447461
GdUnitEvent.STOP:
448-
if _report == null:
449-
_report = GdUnitHtmlReport.new(_report_dir)
450462
var report_path := _report.write()
451463
_report.delete_history(_report_max)
452464
JUnitXmlReport.new(_report._report_path, _report.iteration()).write(_report)
@@ -464,45 +476,31 @@ class CLIRunner:
464476
Color.CORNFLOWER_BLUE
465477
)
466478
GdUnitEvent.TESTSUITE_BEFORE:
467-
_report.add_testsuite_report(
468-
GdUnitTestSuiteReport.new(event.resource_path(), event.suite_name(), event.total_count())
469-
)
479+
_report.add_testsuite_report(event.resource_path(), event.suite_name(), event.total_count())
470480
GdUnitEvent.TESTSUITE_AFTER:
471-
_report.update_test_suite_report(
481+
_report.add_testsuite_reports(
472482
event.resource_path(),
473-
event.elapsed_time(),
474-
event.is_error(),
475-
event.is_failed(),
476-
event.is_warning(),
477-
event.is_skipped(),
478-
event.skipped_count(),
483+
event.error_count(),
479484
event.failed_count(),
480485
event.orphan_nodes(),
486+
event.elapsed_time(),
481487
event.reports()
482488
)
483489
GdUnitEvent.TESTCASE_BEFORE:
484-
_report.add_testcase_report(
485-
event.resource_path(),
486-
GdUnitTestCaseReport.new(
487-
event.resource_path(),
488-
event.suite_name(),
489-
event.test_name()
490-
)
491-
)
490+
_report.add_testcase(event.resource_path(), event.suite_name(), event.test_name())
492491
GdUnitEvent.TESTCASE_AFTER:
493-
var test_report := GdUnitTestCaseReport.new(
494-
event.resource_path(),
495-
event.suite_name(),
492+
_report.set_testcase_counters(event.resource_path(),
496493
event.test_name(),
497494
event.is_error(),
498-
event.is_failed(),
499495
event.failed_count(),
500496
event.orphan_nodes(),
501497
event.is_skipped(),
502-
event.reports(),
503-
event.elapsed_time()
504-
)
505-
_report.update_testcase_report(event.resource_path(), test_report)
498+
event.is_flaky(),
499+
event.elapsed_time())
500+
_report.add_testcase_reports(event.resource_path(), event.test_name(), event.reports())
501+
GdUnitEvent.TESTCASE_STATISTICS:
502+
_report.update_testsuite_counters(event.resource_path(), event.is_error(), event.failed_count(), event.orphan_nodes(),\
503+
event.is_skipped(), event.is_flaky(), event.elapsed_time())
506504
print_status(event)
507505

508506

@@ -556,11 +554,12 @@ class CLIRunner:
556554
_print_failure_report(event.reports())
557555
_print_status(event)
558556
_console.prints_color(
559-
"Statistics: | %d tests cases | %d error | %d failed | %d skipped | %d orphans |\n"
557+
"Statistics: | %d tests cases | %d error | %d failed | %d flaky | %d skipped | %d orphans |\n"
560558
% [
561559
_report.test_count(),
562560
_report.error_count(),
563561
_report.failure_count(),
562+
_report.flaky_count(),
564563
_report.skipped_count(),
565564
_report.orphan_count()
566565
],
@@ -587,14 +586,22 @@ class CLIRunner:
587586

588587

589588
func _print_status(event: GdUnitEvent) -> void:
590-
if event.is_skipped():
589+
if event.is_flaky() and event.is_success():
590+
var retries :int = event.statistic(GdUnitEvent.RETRY_COUNT)
591+
_console.print_color("FLAKY (%d retries)" % retries, Color.GREEN_YELLOW, CmdConsole.BOLD | CmdConsole.ITALIC)
592+
elif event.is_success():
593+
_console.print_color("PASSED", Color.FOREST_GREEN, CmdConsole.BOLD)
594+
elif event.is_skipped():
591595
_console.print_color("SKIPPED", Color.GOLDENROD, CmdConsole.BOLD | CmdConsole.ITALIC)
592596
elif event.is_failed() or event.is_error():
593-
_console.print_color("FAILED", Color.FIREBRICK, CmdConsole.BOLD)
594-
elif event.orphan_nodes() > 0:
595-
_console.print_color("PASSED", Color.GOLDENROD, CmdConsole.BOLD | CmdConsole.UNDERLINE)
596-
else:
597-
_console.print_color("PASSED", Color.FOREST_GREEN, CmdConsole.BOLD)
597+
var retries :int = event.statistic(GdUnitEvent.RETRY_COUNT)
598+
if retries > 1:
599+
_console.print_color("FAILED (retry %d)" % retries, Color.FIREBRICK, CmdConsole.BOLD)
600+
else:
601+
_console.print_color("FAILED", Color.FIREBRICK, CmdConsole.BOLD)
602+
elif event.is_warning():
603+
_console.print_color("WARNING", Color.GOLDENROD, CmdConsole.BOLD | CmdConsole.UNDERLINE)
604+
598605
_console.prints_color(
599606
" %s" % LocalTime.elapsed(event.elapsed_time()), Color.CORNFLOWER_BLUE
600607
)

0 commit comments

Comments
 (0)