Files
MovementTests/addons/gdUnit4/src/core/GdUnitRunnerConfig.gd
Minimata caeae26a09
Some checks failed
Create tag and build when new code gets to main / BumpTag (push) Successful in 22s
Create tag and build when new code gets to main / Test (push) Failing after 2m10s
Create tag and build when new code gets to main / Export (push) Has been skipped
fixed camera and sword animation issue and upgraded to Godot 4.6
2026-01-27 17:47:19 +01:00

140 lines
4.2 KiB
GDScript

class_name GdUnitRunnerConfig
extends Resource
const GdUnitTools := preload("res://addons/gdUnit4/src/core/GdUnitTools.gd")
const CONFIG_VERSION = "5.0"
const VERSION = "version"
const TESTS = "tests"
const SERVER_PORT = "server_port"
const EXIT_FAIL_FAST = "exit_on_first_fail"
const CONFIG_FILE = "res://addons/gdUnit4/GdUnitRunner.cfg"
var _config := {
VERSION : CONFIG_VERSION,
# a set of directories or testsuite paths as key and a optional set of testcases as values
TESTS : Array([], TYPE_OBJECT, "RefCounted", GdUnitTestCase),
# the port of running test server for this session
SERVER_PORT : -1,
# Exit on first failure
EXIT_FAIL_FAST : false
}
func version() -> String:
return _config[VERSION]
func clear() -> GdUnitRunnerConfig:
_config[TESTS] = Array([], TYPE_OBJECT, "RefCounted", GdUnitTestCase)
return self
func set_server_port(port: int) -> GdUnitRunnerConfig:
_config[SERVER_PORT] = port
return self
func server_port() -> int:
return _config.get(SERVER_PORT, -1)
func do_fail_fast(is_fail_fast: bool) -> GdUnitRunnerConfig:
_config[EXIT_FAIL_FAST] = is_fail_fast
return self
func is_fail_fast() -> bool:
return _config.get(EXIT_FAIL_FAST, false)
func add_test_cases(tests: Array[GdUnitTestCase]) -> GdUnitRunnerConfig:
test_cases().append_array(tests)
return self
func test_cases() -> Array[GdUnitTestCase]:
return _config.get(TESTS, [])
func save_config(path: String = CONFIG_FILE) -> GdUnitResult:
var file := FileAccess.open(path, FileAccess.WRITE)
if file == null:
var error := FileAccess.get_open_error()
return GdUnitResult.error("Can't write test runner configuration '%s'! %s" % [path, error_string(error)])
var to_save := {
VERSION : CONFIG_VERSION,
EXIT_FAIL_FAST : is_fail_fast(),
SERVER_PORT : server_port(),
TESTS : Array()
}
var tests: Array = to_save.get(TESTS)
for test in test_cases():
tests.append(inst_to_dict(test))
file.store_string(JSON.stringify(to_save, "\t"))
return GdUnitResult.success(path)
func load_config(path: String = CONFIG_FILE) -> GdUnitResult:
if not FileAccess.file_exists(path):
return GdUnitResult.warn("Can't find test runner configuration '%s'! Please select a test to run." % path)
var file := FileAccess.open(path, FileAccess.READ)
if file == null:
var error := FileAccess.get_open_error()
return GdUnitResult.error("Can't load test runner configuration '%s'! ERROR: %s." % [path, error_string(error)])
var content := file.get_as_text()
if not content.is_empty() and content[0] == '{':
# Parse as json
var test_json_conv := JSON.new()
var error := test_json_conv.parse(content)
if error != OK:
return GdUnitResult.error("The runner configuration '%s' is invalid! The format is changed please delete it manually and start a new test run." % path)
var config: Dictionary = test_json_conv.get_data()
if not config.has(VERSION):
return GdUnitResult.error("The runner configuration '%s' is invalid! The format is changed please delete it manually and start a new test run." % path)
var default: Array[Dictionary] = Array([], TYPE_DICTIONARY, "", null)
var tests_as_json: Array = config.get(TESTS, default)
_config = config
_config[TESTS] = convert_test_json_to_test_cases(tests_as_json)
fix_value_types()
return GdUnitResult.success(path)
func convert_test_json_to_test_cases(jsons: Array) -> Array[GdUnitTestCase]:
if jsons.is_empty():
return []
var tests := jsons.map(func(d: Dictionary) -> GdUnitTestCase:
var test: GdUnitTestCase = dict_to_inst(d)
# we need o covert manually to the corect type becaus JSON do not handle typed values
test.guid = GdUnitGUID.new(str(d["guid"]))
test.attribute_index = test.attribute_index as int
test.line_number = test.line_number as int
return test
)
return Array(tests, TYPE_OBJECT, "RefCounted", GdUnitTestCase)
func fix_value_types() -> void:
# fix float value to int json stores all numbers as float
var server_port_: int = _config.get(SERVER_PORT, -1)
_config[SERVER_PORT] = server_port_
func convert_Array_to_PackedStringArray(data: Dictionary) -> void:
for key in data.keys() as Array[String]:
var values :Array = data[key]
data[key] = PackedStringArray(values)
func _to_string() -> String:
return str(_config)