You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

109 lines
3.0 KiB

extends Node
const COMPLETED: String = "completed"
var JunitXML = preload("res://addons/WAT/resources/JUnitXML.gd").new()
var test_loader: Reference = preload("test_loader.gd").new()
var test_results: Resource = WAT.Results
var _tests: Array = []
var _cases: Array = []
var _strategy: Dictionary = {}
signal ended
func strategy() -> Dictionary:
# We consume this so we can avoid worrying about mutatiosn
var m_strategy = {}
var strat = ProjectSettings.get_setting("WAT/TestStrategy")
for key in strat:
m_strategy[key] = strat[key]
ProjectSettings.set_setting("WAT/TestStrategy", {})
ProjectSettings.save()
m_strategy["repeat"] = m_strategy["repeat"] as int
return m_strategy
var _time: float
func _ready() -> void:
_time = OS.get_ticks_msec()
_strategy = strategy()
if get_tree().root.get_child(0) == self:
print("Starting WAT Test Runner")
OS.window_minimized = ProjectSettings.get_setting(
"WAT/Minimize_Window_When_Running_Tests")
_create_test_double_registry()
_begin()
func _begin():
_tests = get_tests()
if _tests.empty():
push_warning("No Scripts To Test")
_run_tests()
func get_tests() -> Array:
match _strategy["strategy"]:
"RunAll":
return test_loader.all()
"RunDirectory":
return test_loader.directory(_strategy["directory"])
"RunScript":
return test_loader.script(_strategy["script"])
"RunTag":
return test_loader.tag(_strategy["tag"])
"RunMethod":
return test_loader.script(_strategy["script"])
"RerunFailures":
return test_loader.last_failed()
_:
return _tests
var time_taken: float
func _run_tests() -> void:
while not _tests.empty():
yield(run(), COMPLETED)
_strategy["repeat"] -= 1
if _strategy["repeat"] > 0:
call_deferred("_begin")
else:
time_taken = _time / 1000.0
end()
func run(test: WAT.Test = _tests.pop_front().new()) -> void:
var testcase = WAT.TestCase.new(test.title(), test.path())
test.setup(WAT.Asserts.new(), WAT.Yielder.new(), testcase, \
WAT.TestDoubleFactory.new(), WAT.SignalWatcher.new(), WAT.Parameters.new(),
WAT.Recorder)
var start_time = OS.get_ticks_msec()
add_child(test)
# Add Strategy Here?
if _strategy.has("method"):
test._methods = [_strategy.method]
else:
test._methods = test.methods()
test._start()
var time = OS.get_ticks_msec() - start_time
testcase.time_taken = time / 1000.0
yield(test, COMPLETED)
testcase.calculate()
_cases.append(testcase.to_dictionary())
remove_child(test)
func end() -> void:
print("Ending WAT Test Runner")
OS.window_minimized = false
JunitXML.save(_cases, time_taken)
test_results.deposit(_cases)
emit_signal("ended")
clear()
get_tree().quit()
func _create_test_double_registry() -> void:
if not ProjectSettings.has_setting("WAT/TestDouble"):
var registry = load("res://addons/WAT/core/double/registry.gd")
ProjectSettings.set_setting("WAT/TestDouble", registry.new())
func clear() -> void:
if ProjectSettings.has_setting("WAT/TestDouble"):
ProjectSettings.get_setting("WAT/TestDouble").clear()
ProjectSettings.get_setting("WAT/TestDouble").free()