chore: add GUT test framework
This commit is contained in:
183
addons/gut/test/unit/test_gut_runner.gd
Normal file
183
addons/gut/test/unit/test_gut_runner.gd
Normal file
@@ -0,0 +1,183 @@
|
||||
extends GutTest
|
||||
|
||||
|
||||
var GutRunner = load('res://addons/gut/gui/GutRunner.tscn')
|
||||
|
||||
|
||||
func before_all():
|
||||
register_inner_classes(get_script())
|
||||
|
||||
|
||||
func test_can_make_one():
|
||||
var gr = autofree(GutRunner.instantiate())
|
||||
assert_not_null(gr)
|
||||
|
||||
|
||||
class TestQuit:
|
||||
extends GutInternalTester
|
||||
|
||||
class PostRunHook:
|
||||
extends GutHookScript
|
||||
|
||||
var use_this_exit_code = 0
|
||||
|
||||
func run():
|
||||
set_exit_code(use_this_exit_code)
|
||||
|
||||
# func should_skip_script():
|
||||
# return "Skipping until all the stupid globals are worked out."
|
||||
|
||||
|
||||
var GutRunner = load('res://addons/gut/gui/GutRunner.tscn')
|
||||
var PDblRunner = null
|
||||
|
||||
# Added .5s to end of GUT run so this had to be introduced and bumped up.
|
||||
const MIN_FRAMES_TO_RUN_TESTS = 50
|
||||
var _created_runners = []
|
||||
|
||||
|
||||
func before_all():
|
||||
verbose = true
|
||||
PDblRunner = partial_double(GutRunner)
|
||||
|
||||
|
||||
func after_each():
|
||||
for r in _created_runners:
|
||||
if(r.error_tracker != GutUtils.get_error_tracker()):
|
||||
GutErrorTracker.deregister_logger(r.error_tracker)
|
||||
_created_runners.clear()
|
||||
|
||||
|
||||
func _create_runner():
|
||||
verbose = true
|
||||
var gr = PDblRunner.instantiate()
|
||||
gr.lgr = GutLogger.new()
|
||||
gr.error_tracker = GutErrorTracker.new()
|
||||
gr.gut_config = GutUtils.GutConfig.new()
|
||||
gr.gut_config.options.dirs = ['res://not_real']
|
||||
|
||||
stub(gr, 'quit').to_do_nothing()
|
||||
|
||||
gr.gut = new_partial_double_gut(verbose)
|
||||
# Use this script's error tracker so errors in tests actually
|
||||
# cause failures.
|
||||
gr.gut.error_tracker = gut.error_tracker
|
||||
stub(gr.gut.add_directory).to_do_nothing()
|
||||
_created_runners.append(gr)
|
||||
|
||||
return gr
|
||||
|
||||
|
||||
func test_does_not_quit_when_gut_config_does_not_say_to():
|
||||
if(GutUtils.is_headless()):
|
||||
pending("cannot be tested when run headless.")
|
||||
return
|
||||
|
||||
var gr = _create_runner()
|
||||
add_child_autofree(gr)
|
||||
|
||||
gr.run_tests()
|
||||
await wait_physics_frames(MIN_FRAMES_TO_RUN_TESTS)
|
||||
assert_not_called(gr, 'quit')
|
||||
|
||||
|
||||
func test_quits_with_exit_code_0_when_should_exit_and_everything_ok():
|
||||
var gr = _create_runner()
|
||||
gr.gut_config.options.should_exit = true
|
||||
add_child_autofree(gr)
|
||||
|
||||
gr.run_tests()
|
||||
await wait_physics_frames(MIN_FRAMES_TO_RUN_TESTS)
|
||||
assert_called(gr, 'quit', [0])
|
||||
|
||||
|
||||
func test_quits_with_exit_code_0_when_exit_on_success_and_everything_ok():
|
||||
var gr = _create_runner()
|
||||
gr.gut_config.options.should_exit_on_success = true
|
||||
add_child_autofree(gr)
|
||||
|
||||
gr.run_tests()
|
||||
await wait_physics_frames(MIN_FRAMES_TO_RUN_TESTS)
|
||||
assert_called(gr, 'quit', [0])
|
||||
|
||||
|
||||
func test_sets_exit_code_from_post_run_hook():
|
||||
var hook_inst = PostRunHook.new()
|
||||
hook_inst.use_this_exit_code = 456
|
||||
|
||||
var gr = _create_runner()
|
||||
gr.gut_config.options.should_exit = true
|
||||
stub(gr.gut, 'get_post_run_script_instance').to_return(hook_inst)
|
||||
add_child_autofree(gr)
|
||||
|
||||
gr.run_tests()
|
||||
await wait_physics_frames(MIN_FRAMES_TO_RUN_TESTS)
|
||||
assert_called(gr, 'quit', [456])
|
||||
|
||||
|
||||
func test_exit_code_is_1_when_any_test_fails():
|
||||
var gr = _create_runner()
|
||||
gr.gut_config.options.should_exit = true
|
||||
stub(gr.gut, 'get_fail_count').to_return(1)
|
||||
add_child_autofree(gr)
|
||||
|
||||
gr.run_tests()
|
||||
await wait_physics_frames(MIN_FRAMES_TO_RUN_TESTS)
|
||||
assert_called(gr, 'quit', [1])
|
||||
|
||||
|
||||
func test_hook_script_overrides_fail_count_exit_code():
|
||||
var hook_inst = PostRunHook.new()
|
||||
hook_inst.use_this_exit_code = 456
|
||||
|
||||
var gr = _create_runner()
|
||||
gr.gut_config.options.should_exit = true
|
||||
stub(gr.gut, 'get_post_run_script_instance').to_return(hook_inst)
|
||||
stub(gr.gut, 'get_fail_count').to_return(99)
|
||||
add_child_autofree(gr)
|
||||
|
||||
gr.run_tests()
|
||||
await wait_physics_frames(MIN_FRAMES_TO_RUN_TESTS)
|
||||
assert_called(gr, 'quit', [456])
|
||||
|
||||
|
||||
func test_does_not_quit_when_exit_on_success_but_has_failing_tests():
|
||||
if(GutUtils.is_headless()):
|
||||
pending("cannot be tested when run headless.")
|
||||
return
|
||||
|
||||
var gr = _create_runner()
|
||||
gr.gut_config.options.should_exit_on_success = true
|
||||
stub(gr.gut, 'get_fail_count').to_return(1)
|
||||
add_child_autofree(gr)
|
||||
|
||||
gr.run_tests()
|
||||
await wait_physics_frames(MIN_FRAMES_TO_RUN_TESTS)
|
||||
assert_not_called(gr, 'quit')
|
||||
|
||||
|
||||
func test_quits_when_exit_on_success_and_has_risky_tests():
|
||||
var gr = _create_runner()
|
||||
gr.gut_config.options.should_exit_on_success = true
|
||||
stub(gr.gut, 'get_pending_count').to_return(1)
|
||||
add_child_autofree(gr)
|
||||
|
||||
gr.run_tests()
|
||||
await wait_physics_frames(MIN_FRAMES_TO_RUN_TESTS)
|
||||
assert_called(gr, 'quit', [0])
|
||||
|
||||
|
||||
func test_quits_with_exit_code_1_when_no_directories_are_configured():
|
||||
var gr = _create_runner()
|
||||
gr.gut_config.options.should_exit = true
|
||||
gr.gut_config.options.dirs = []
|
||||
add_child_autofree(gr)
|
||||
|
||||
gr.run_tests()
|
||||
await wait_physics_frames(MIN_FRAMES_TO_RUN_TESTS)
|
||||
|
||||
assert_logger_errored(gr.lgr)
|
||||
assert_push_error("directories configured,")
|
||||
|
||||
assert_called(gr, 'quit', [1])
|
||||
|
||||
Reference in New Issue
Block a user