Files
whale-town-front/addons/gut/summary.gd
WhaleTown Developer c8e73bec59 fix: 修复聊天系统编译错误
- 修复 WebSocketManager/SocketIOClient 函数缩进错误
- 重命名 is_connected() 避免与 Object 基类冲突
- 修复 tscn 文件多余前导空格
- 修复测试文件 GUT 断言函数调用
- 添加 GUT 测试框架
2026-01-08 00:11:12 +08:00

211 lines
5.9 KiB
GDScript

# ------------------------------------------------------------------------------
# Prints things, mostly. Knows too much about gut.gd, but it's only supposed to
# work with gut.gd, so I'm fine with that.
# ------------------------------------------------------------------------------
# a _test_collector to use when one is not provided.
var _gut = null
func _init(gut=null):
_gut = gut
# ---------------------
# Private
# ---------------------
func _log_end_run_header(gut):
var lgr = gut.get_logger()
lgr.log('==============================================', lgr.fmts.yellow)
lgr.log("= Run Summary", lgr.fmts.yellow)
lgr.log('==============================================', lgr.fmts.yellow)
func _log_what_was_run(gut):
if(!GutUtils.is_null_or_empty(gut._select_script)):
gut.p('Ran Scripts matching "' + gut._select_script + '"')
if(!GutUtils.is_null_or_empty(gut._unit_test_name)):
gut.p('Ran Tests matching "' + gut._unit_test_name + '"')
if(!GutUtils.is_null_or_empty(gut._inner_class_name)):
gut.p('Ran Inner Classes matching "' + gut._inner_class_name + '"')
func _total_fmt(text, value):
var space = 18
if(str(value) == '0'):
value = 'none'
return str(text.rpad(space), str(value).lpad(5))
func _log_non_zero_total(text, value, lgr):
if(str(value) != '0'):
lgr.log(_total_fmt(text, value))
return 1
else:
return 0
func _log_totals(gut, totals):
var lgr = gut.get_logger()
lgr.log()
# lgr.log("---- Totals ----")
lgr.log("Totals")
lgr.log("------")
var issue_count = 0
issue_count += _log_non_zero_total('Errors', totals.errors, lgr)
issue_count += _log_non_zero_total('Warnings', totals.warnings, lgr)
issue_count += _log_non_zero_total('Deprecated', totals.deprecated, lgr)
if(issue_count > 0):
lgr.log("")
lgr.log(_total_fmt( 'Scripts', totals.scripts))
lgr.log(_total_fmt( 'Tests', gut.get_test_collector().get_ran_test_count()))
lgr.log(_total_fmt( 'Passing Tests', totals.passing_tests))
_log_non_zero_total('Failing Tests', totals.failing_tests, lgr)
_log_non_zero_total('Risky/Pending', totals.risky + totals.pending, lgr)
if(totals.failing == 0):
lgr.log(_total_fmt( 'Asserts', totals.passing + totals.failing))
else:
lgr.log(_total_fmt( 'Asserts', str(totals.passing, '/', totals.passing + totals.failing)))
_log_non_zero_total( 'Orphans', totals.orphans, lgr)
lgr.log(_total_fmt( 'Time', str(gut.get_elapsed_time(), 's')))
return totals
func _log_nothing_run(gut):
var lgr = gut.get_logger()
lgr.error("Nothing was run.")
lgr.log('On the one hand nothing failed, on the other hand nothing did anything.')
_log_what_was_run(gut)
# ---------------------
# Public
# ---------------------
func log_all_non_passing_tests(gut=_gut):
var test_collector = gut.get_test_collector()
var lgr = gut.get_logger()
var to_return = {
passing = 0,
non_passing = 0
}
for test_script in test_collector.scripts:
lgr.set_indent_level(0)
if(test_script.was_skipped or test_script.get_fail_count() > 0 or test_script.get_pending_count() > 0):
lgr.log("\n" + test_script.get_full_name(), lgr.fmts.underline)
if(test_script.was_skipped):
lgr.inc_indent()
var skip_msg = str('[Risky] Script was skipped: ', test_script.skip_reason)
lgr.log(skip_msg, lgr.fmts.yellow)
lgr.dec_indent()
var test_fail_count = 0
for test in test_script.tests:
if(test.was_run):
if(test.is_passing()):
to_return.passing += 1
else:
to_return.non_passing += 1
lgr.log(str('- ', test.name))
lgr.inc_indent()
for i in range(test.fail_texts.size()):
lgr.failed(test.fail_texts[i])
test_fail_count += 1
for i in range(test.pending_texts.size()):
lgr.pending(test.pending_texts[i])
if(test.is_risky()):
lgr.risky('Did not assert')
lgr.dec_indent()
if(test_script.get_fail_count() > test_fail_count):
lgr.failed("before_all/after_all assert failed")
return to_return
func log_the_final_line(totals, gut):
var lgr = gut.get_logger()
var grand_total_text = ""
var grand_total_fmt = lgr.fmts.none
if(totals.failing_tests > 0):
grand_total_text = str(totals.failing_tests, " failing tests")
grand_total_fmt = lgr.fmts.red
elif(totals.failing > 0): # no failing tests, but some failing asserts
grand_total_text = str(totals.failing, " assert(s) in before_all/after_all methods failed")
grand_total_fmt = lgr.fmts.red
elif(totals.risky > 0 or totals.pending > 0):
grand_total_text = str(totals.risky + totals.pending, " pending/risky tests.")
grand_total_fmt = lgr.fmts.yellow
else:
grand_total_text = "All tests passed!"
grand_total_fmt = lgr.fmts.green
lgr.log(str("---- ", grand_total_text, " ----"), grand_total_fmt)
func log_totals(gut, totals):
var lgr = gut.get_logger()
var orig_indent = lgr.get_indent_level()
lgr.set_indent_level(0)
_log_totals(gut, totals)
lgr.set_indent_level(orig_indent)
func get_totals(gut=_gut):
var tc = gut.get_test_collector()
var lgr = gut.get_logger()
var totals = {
failing = 0,
failing_tests = 0,
passing = 0,
passing_tests = 0,
pending = 0,
risky = 0,
scripts = tc.get_ran_script_count(),
tests = 0,
deprecated = lgr.get_deprecated().size(),
errors = lgr.get_errors().size(),
warnings = lgr.get_warnings().size(),
}
for s in tc.scripts:
# assert totals
totals.passing += s.get_pass_count()
totals.pending += s.get_pending_count()
totals.failing += s.get_fail_count()
# test totals
totals.tests += s.get_ran_test_count()
totals.passing_tests += s.get_passing_test_count()
totals.failing_tests += s.get_failing_test_count()
totals.risky += s.get_risky_count()
totals.orphans = gut.get_orphan_counter().orphan_count()
return totals
func log_end_run(gut=_gut):
var totals = get_totals(gut)
if(totals.tests == 0):
_log_nothing_run(gut)
return
_log_end_run_header(gut)
var lgr = gut.get_logger()
log_all_non_passing_tests(gut)
log_totals(gut, totals)
lgr.log("\n")
_log_what_was_run(gut)
log_the_final_line(totals, gut)
lgr.log("")