Files
settled-reach/client/addons/gdUnit4/src/reporters/html/GdUnitHtmlReportWriter.gd
T
jpmschweitzerandClaude Opus 4.6 61e0762a84 chore(client): add gdUnit4 test framework addon
Vendor gdUnit4 for Godot 4 client testing (D-030).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 16:52:00 +01:00

73 lines
3.5 KiB
GDScript

class_name GdUnitHtmlReportWriter
extends GdUnitReportWriter
func output_format() -> String:
return "HTML"
func write(report_path: String, report: GdUnitReportSummary) -> String:
var template := GdUnitHtmlPatterns.load_template("res://addons/gdUnit4/src/reporters/html/template/index.html")
var to_write := GdUnitHtmlPatterns.build(template, report, "")
to_write = _apply_path_reports(report_path, to_write, report.get_reports())
to_write = _apply_testsuite_reports(report_path, to_write, report.get_reports())
# write report
DirAccess.make_dir_recursive_absolute(report_path)
var html_report_file := "%s/index.html" % report_path
FileAccess.open(html_report_file, FileAccess.WRITE).store_string(to_write)
@warning_ignore("return_value_discarded")
GdUnitFileAccess.copy_directory("res://addons/gdUnit4/src/reporters/html/template/css/", report_path + "/css")
return html_report_file
func _apply_path_reports(report_dir: String, template: String, report_summaries: Array) -> String:
#Dictionary[String, Array[GdUnitReportSummary]]
var path_report_mapping := GdUnitByPathReport.sort_reports_by_path(report_summaries)
var table_records := PackedStringArray()
var paths: Array[String] = []
paths.append_array(path_report_mapping.keys())
paths.sort()
for report_at_path in paths:
var reports: Array[GdUnitReportSummary] = path_report_mapping.get(report_at_path)
var report := GdUnitByPathReport.new(report_at_path, reports)
var report_link: String = report.write(report_dir).replace(report_dir, ".")
@warning_ignore("return_value_discarded")
table_records.append(report.create_record(report_link))
return template.replace(GdUnitHtmlPatterns.TABLE_BY_PATHS, "\n".join(table_records))
func _apply_testsuite_reports(report_dir: String, template: String, test_suite_reports: Array[GdUnitReportSummary]) -> String:
var table_records := PackedStringArray()
for report: GdUnitTestSuiteReport in test_suite_reports:
var report_link: String = _write(report_dir, report).replace(report_dir, ".")
@warning_ignore("return_value_discarded")
table_records.append(GdUnitHtmlPatterns.create_suite_record(report_link, report))
return template.replace(GdUnitHtmlPatterns.TABLE_BY_TESTSUITES, "\n".join(table_records))
func _write(report_dir :String, report: GdUnitTestSuiteReport) -> String:
var template := GdUnitHtmlPatterns.load_template("res://addons/gdUnit4/src/reporters/html/template/suite_report.html")
template = GdUnitHtmlPatterns.build(template, report, "")
var report_output_path := create_output_path(report_dir, report.path(), report.name())
var test_report_table := PackedStringArray()
if not report._failure_reports.is_empty():
@warning_ignore("return_value_discarded")
test_report_table.append(GdUnitHtmlPatterns.create_suite_failure_report(report))
for test_report: GdUnitTestCaseReport in report._reports:
@warning_ignore("return_value_discarded")
test_report_table.append(GdUnitHtmlPatterns.create_test_failure_report(report_output_path, test_report))
template = template.replace(GdUnitHtmlPatterns.TABLE_BY_TESTCASES, "\n".join(test_report_table))
var dir := report_output_path.get_base_dir()
if not DirAccess.dir_exists_absolute(dir):
@warning_ignore("return_value_discarded")
DirAccess.make_dir_recursive_absolute(dir)
FileAccess.open(report_output_path, FileAccess.WRITE).store_string(template)
return report_output_path
static func create_output_path(report_dir :String, path: String, name: String) -> String:
return "%s/test_suites/%s.%s.html" % [report_dir, path.replace("/", "."), name]