From 64e4f455b697e696c8580604bdf3da27d45f6b72 Mon Sep 17 00:00:00 2001 From: Butch Wesley Date: Wed, 23 Nov 2022 13:42:40 -0500 Subject: [PATCH 1/4] couple scripts fixed --- addons/gut/doubler.gd | 8 ++-- addons/gut/script_parser.gd | 8 ++-- addons/gut/test.gd | 9 ++-- test/integration/test_test_stubber_doubler.gd | 43 ++++--------------- test/unit/test_doubler.gd | 23 +++++----- test/unit/test_strutils.gd | 4 +- 6 files changed, 34 insertions(+), 61 deletions(-) diff --git a/addons/gut/doubler.gd b/addons/gut/doubler.gd index 9caec464..a20231e8 100644 --- a/addons/gut/doubler.gd +++ b/addons/gut/doubler.gd @@ -322,11 +322,11 @@ func partial_double_gdnative(which): func double_inner(parent, inner, strategy=_strategy): var parsed = _script_collector.parse(parent, inner) return _create_double(parsed, strategy, null, false) - return null -func partial_double_inner(path, subpath, strategy=_strategy): - _lgr.error('Cannot double inner classes due to Godot bug.') - return null + +func partial_double_inner(parent, inner, strategy=_strategy): + var parsed = _script_collector.parse(parent, inner) + return _create_double(parsed, strategy, null, true) func add_ignored_method(obj, method_name): diff --git a/addons/gut/script_parser.gd b/addons/gut/script_parser.gd index 4bad1074..462d9869 100644 --- a/addons/gut/script_parser.gd +++ b/addons/gut/script_parser.gd @@ -129,14 +129,16 @@ class ParsedScript: if(!script_or_inst is Resource): to_load = load(script_or_inst.get_script().get_path()) + _script_path = to_load.resource_path + if(inner_class != null): + _subpath = _find_subpath(to_load, inner_class) + if(inner_class == null): _resource = to_load else: _resource = inner_class - _script_path = to_load.resource_path + to_load = inner_class - if(inner_class != null): - _subpath = _find_subpath(to_load, inner_class) _parse_methods(to_load) diff --git a/addons/gut/test.gd b/addons/gut/test.gd index 6cec7911..96525504 100644 --- a/addons/gut/test.gd +++ b/addons/gut/test.gd @@ -51,6 +51,7 @@ class DoubleInfo: var _is_native = false var is_valid = false var resource = null + var inner_resource = null # Flexible init method. p2 can be subpath or stategy unless p3 is # specified, then p2 must be subpath and p3 is strategy. @@ -80,9 +81,9 @@ class DoubleInfo: if(subpath != null and typeof(subpath) == TYPE_STRING): var parts = subpath.split('/') for i in range(parts.size()): - resource = resource.get(parts[i]) + inner_resource = resource.get(parts[i]) elif(subpath != null): - resource = subpath + inner_resource = subpath is_valid = true @@ -1305,9 +1306,9 @@ func _smart_double(double_info): to_return = gut.get_doubler().double(double_info.resource, override_strat) else: if(double_info.make_partial): - to_return = gut.get_doubler().partial_double_inner(double_info.resource, double_info.subpath, override_strat) + to_return = gut.get_doubler().partial_double_inner(double_info.resource, double_info.inner_resource, override_strat) else: - to_return = gut.get_doubler().double_inner(double_info.resource, double_info.subpath, override_strat) + to_return = gut.get_doubler().double_inner(double_info.resource, double_info.inner_resource, override_strat) return to_return # ------------------------------------------------------------------------------ diff --git a/test/integration/test_test_stubber_doubler.gd b/test/integration/test_test_stubber_doubler.gd index 32cc479a..12b1f5b5 100644 --- a/test/integration/test_test_stubber_doubler.gd +++ b/test/integration/test_test_stubber_doubler.gd @@ -63,18 +63,12 @@ class TestBasics: assert_eq(gr.test.get_pass_count(), 1) func test_can_stub_inner_class_methods(): - pending('Inner Class 4.0') - return - - var d = gr.gut.get_doubler().double_inner(InnerClasses, 'InnerA').new() + var d = gr.gut.get_doubler().double_inner(InnerClasses, InnerClasses.InnerA).new() gr.test.stub(INNER_CLASSES_PATH, 'InnerA', 'get_a').to_return(10) assert_eq(d.get_a(), 10) func test_can_stub_multiple_inner_classes(): - pending('Inner Class 4.0') - return - - var a = gr.gut.get_doubler().double_inner(InnerClasses, 'InnerA').new() + var a = gr.gut.get_doubler().double_inner(InnerClasses, InnerClasses.InnerA).new() var anotherA = gr.gut.get_doubler().double_inner(INNER_CLASSES_PATH, 'AnotherInnerA').new() gr.test.stub(a, 'get_a').to_return(10) gr.test.stub(anotherA, 'get_a').to_return(20) @@ -82,14 +76,11 @@ class TestBasics: assert_eq(anotherA.get_a(), 20) func test_can_stub_multiple_inners_using_class_path_and_inner_names(): - pending('Inner Class 4.0') - return - - var a = gr.gut.get_doubler().double_inner(InnerClasses, 'InnerA').new() - var anotherA = gr.gut.get_doubler().double_inner(INNER_CLASSES_PATH, 'AnotherInnerA').new() - gr.test.stub(INNER_CLASSES_PATH, 'InnerA', 'get_a').to_return(10) - assert_eq(a.get_a(), 10) - assert_eq(anotherA.get_a(), null) + var inner_a = gr.gut.get_doubler().double_inner(InnerClasses, InnerClasses.InnerA).new() + var another_a = gr.gut.get_doubler().double_inner(InnerClasses, InnerClasses.AnotherInnerA).new() + gr.test.stub(InnerClasses, 'InnerA', 'get_a').to_return(10) + assert_eq(inner_a.get_a(), 10, 'InnerA should be stubbed') + assert_eq(another_a.get_a(), null, 'AnotherA should NOT be stubbed') func test_when_stub_passed_a_non_doubled_instance_it_generates_an_error(): var n = autofree(Node.new()) @@ -167,17 +158,11 @@ class TestTestsSmartDoubleMethod: assert_eq(inst.__gutdbl.thepath, DOUBLE_ME_SCENE_PATH) func test_when_passed_script_and_inner_it_doubles_it(): - pending('Inner class doubles broke 4.0') - return - var inst = _test.double(INNER_CLASSES_PATH, 'InnerA').new() assert_eq(inst.__gutdbl.thepath, INNER_CLASSES_PATH, 'check path') assert_eq(inst.__gutdbl.subpath, 'InnerA', 'check subpath') func test_full_strategy_used_for_scripts(): - pending('Inner class doubles broke 4.0') - return - var inst = _test.double(DOUBLE_ME_PATH, DOUBLE_STRATEGY.INCLUDE_SUPER).new() inst.get_instance_id() assert_called(inst, 'get_instance_id') @@ -188,9 +173,6 @@ class TestTestsSmartDoubleMethod: assert_called(inst, 'get_instance_id') func test_full_strategy_used_with_inners(): - pending('Inner class doubles broke 4.0') - return - var inst = _test.double(INNER_CLASSES_PATH, 'InnerA', DOUBLE_STRATEGY.INCLUDE_SUPER).new() inst.get_instance_id() assert_called(inst, 'get_instance_id') @@ -204,9 +186,6 @@ class TestTestsSmartDoubleMethod: assert_eq(inst.__gutdbl.thepath, DOUBLE_ME_SCENE_PATH) func test_when_passing_a_class_of_an_inner_it_doubles_it(): - pending('Inner class doubles broke 4.0') - return - var inst = _test.double(InnerClasses, 'InnerA').new() assert_eq(inst.__gutdbl.thepath, INNER_CLASSES_PATH, 'check path') assert_eq(inst.__gutdbl.subpath, 'InnerA', 'check subpath') @@ -256,9 +235,7 @@ class TestPartialDoubleMethod: assert_eq(inst.return_hello(), 'hello', 'sometimes fails, should be fixed.') - func test_partial_double_inner_skip__(): - pending('Inner class doubles broke 4.0') - + func test_partial_double_inner(): var inst = _test.partial_double(INNER_CLASSES_PATH, 'InnerA').new() assert_eq(inst.get_a(), 'a') @@ -272,9 +249,7 @@ class TestPartialDoubleMethod: autofree(inst) assert_eq(inst.return_hello(), null) - func test_double_inner_not_a_partial_skip__(): - pending('Inner class doubles broke 4.0') - + func test_double_inner_not_a_partial(): var inst = _test.double(INNER_CLASSES_PATH, 'InnerA').new() assert_eq(inst.get_a(), null) diff --git a/test/unit/test_doubler.gd b/test/unit/test_doubler.gd index 38797ce5..70466038 100644 --- a/test/unit/test_doubler.gd +++ b/test/unit/test_doubler.gd @@ -333,10 +333,7 @@ class TestPartialDoubles: assert_eq(inst.get_value(), null) func test_can_make_partial_of_inner_script(): - pending('Broke in 4.0 see TestDoubleInnerClasses'); - return - - var inst = doubler.partial_double_inner(InnerClasses, 'InnerA').new() + var inst = doubler.partial_double_inner(InnerClasses, InnerClasses.InnerA).new() assert_eq(inst.get_a(), 'a') func test_can_make_partial_of_scene(): @@ -391,7 +388,7 @@ class TestDoubleGDNaviteClasses: class TestDoubleInnerClasses: extends BaseTest - var skip_script = 'Cannot extend inner classes godotengine #65666' + # var skip_script = 'Cannot extend inner classes godotengine #65666' var doubler = null @@ -403,40 +400,40 @@ class TestDoubleInnerClasses: var Doubled = doubler.double_inner(InnerClasses, InnerClasses.InnerB.InnerB1) assert_has_method(Doubled.new(), 'get_b1') - func test_doubled_instance_returns_null_for_get_b1__skip_(): + func test_doubled_instance_returns_null_for_get_b1(): var dbld = doubler.double_inner(InnerClasses, InnerClasses.InnerB.InnerB1).new() assert_null(dbld.get_b1()) - func test_doubled_instances_extend_the_inner_class__skip_(): + func test_doubled_instances_extend_the_inner_class(): var inst = doubler.double_inner(InnerClasses, InnerClasses.InnerA).new() assert_true(inst is InnerClasses.InnerA, 'instance should be an InnerA') if(is_failing()): print_source(inst) - func test_doubled_inners_that_extend_inners_get_full_inheritance__skip_(): + func test_doubled_inners_that_extend_inners_get_full_inheritance(): var inst = doubler.double_inner(InnerClasses, InnerClasses.InnerCA).new() assert_has_method(inst, 'get_a') assert_has_method(inst, 'get_ca') - func test_doubled_inners_have_subpath_set_in_metadata__skip_(): + func test_doubled_inners_have_subpath_set_in_metadata(): var inst = doubler.double_inner(InnerClasses, InnerClasses.InnerCA).new() assert_eq(inst.__gutdbl.subpath, 'InnerCA') - func test_non_inners_have_empty_subpath__skip_(): + func test_non_inners_have_empty_subpath(): var inst = doubler.double(InnerClasses).new() assert_eq(inst.__gutdbl.subpath, '') - func test_can_override_strategy_when_doubling__skip_(): + func test_can_override_strategy_when_doubling(): var d = doubler.double_inner(InnerClasses, InnerClasses.InnerA, DOUBLE_STRATEGY.INCLUDE_SUPER) # make sure it has something from Object that isn't implemented assert_source_contains(d.new() , 'func disconnect(p_signal') assert_eq(doubler.get_strategy(), DOUBLE_STRATEGY.SCRIPT_ONLY, 'strategy should have been reset') - func test_doubled_inners_retain_signals__skip_(): + func test_doubled_inners_retain_signals(): var inst = doubler.double_inner(InnerClasses, InnerClasses.InnerWithSignals).new() assert_has_signal(inst, 'signal_signal') - func test_double_inner_does_not_call_supers__skip_(): + func test_double_inner_does_not_call_supers(): var inst = doubler.double_inner(InnerClasses, InnerClasses.InnerA).new() assert_eq(inst.get_a(), null) diff --git a/test/unit/test_strutils.gd b/test/unit/test_strutils.gd index 3e2e7f9b..2a9cfbbd 100644 --- a/test/unit/test_strutils.gd +++ b/test/unit/test_strutils.gd @@ -68,9 +68,7 @@ class TestType2Str: assert_eq(strutils.type2str(d), str(d) + '(double of double_extends_node2d.gd)') func test_double_inner(): - pending('pending 4.0, inner classes') - return - + gut.get_doubler().print_source = true var d = double(InnerClasses, 'InnerA').new() assert_eq(strutils.type2str(d), str(d) + '(double of inner_classes.gd/InnerA)') From 43f24ad37101a891c99382030153fff1e6062ff3 Mon Sep 17 00:00:00 2001 From: Butch Wesley Date: Wed, 23 Nov 2022 13:59:46 -0500 Subject: [PATCH 2/4] fixed inner class test in test_gut.gd --- test/unit/test_gut.gd | 60 ++++++++++++++++++++++--------------------- 1 file changed, 31 insertions(+), 29 deletions(-) diff --git a/test/unit/test_gut.gd b/test/unit/test_gut.gd index 373f9163..b509a829 100644 --- a/test/unit/test_gut.gd +++ b/test/unit/test_gut.gd @@ -435,35 +435,37 @@ class TestEverythingElse: assert_eq(instance.counts.after_each, 3, 'after_each') func test_when_inner_class_skipped_none_of_the_before_after_are_called(): - pending('pending in 4.0, inner classes') - # gut.p('these tests sometimes fail. Will have to add inner class names to test objects to make sure it passes. GUT no longer guarantees the order in which the inner test classes are run so sometimes it works and sometimes it doesnt.') - # gr.test_gut.add_script('res://test/resources/parsing_and_loading_samples/inner_classes_check_before_after.gd') - # gr.test_gut.inner_class_name = 'Inner1' - # gr.test_gut.test_scripts() - # var instances = gr.test_gut._test_script_objects - - # var inner1_inst = null - # var inner2_inst = null - - # # order in which the inner classes will be run is unknown so we - # # have to go looking for them. - # for i in range(instances.size()): - # var dict = inst2dict(instances[i]) - # print('subpath = ', dict['@subpath']) - # if(dict['@subpath'] == 'TestInner1'): - # inner1_inst = instances[i] - # elif(dict['@subpath'] == 'TestInner2'): - # inner2_inst = instances[i] - - # assert_eq(inner1_inst.before_all_calls, 1, 'TestInner1 before_all calls') - # assert_eq(inner1_inst.after_all_calls, 1, 'TestInner1 after_all calls') - # assert_eq(inner1_inst.before_each_calls, 1, 'TestInner1 before_each_calls') - # assert_eq(inner1_inst.after_each_calls, 1, 'TestInner1 after_each calls') - - # assert_eq(inner2_inst.before_all_calls, 0, 'TestInner2 before_all calls') - # assert_eq(inner2_inst.after_all_calls, 0, 'TestInner2 after_all calls') - # assert_eq(inner2_inst.before_each_calls, 0, 'TestInner2 before_each_calls') - # assert_eq(inner2_inst.after_each_calls, 0, 'TestInner2 after_each calls') + gr.test_gut.add_script('res://test/resources/parsing_and_loading_samples/inner_classes_check_before_after.gd') + gr.test_gut.inner_class_name = 'Inner1' + gr.test_gut.test_scripts() + var instances = gr.test_gut._test_script_objects + + var inner1_inst = null + var inner2_inst = null + + # order in which the inner classes will be run is unknown so we + # have to go looking for them. + for i in range(instances.size()): + var dict = inst_to_dict(instances[i]) + var subpath = str(dict['@subpath']) + + if(subpath == 'TestInner1'): + inner1_inst = instances[i] + elif(subpath == 'TestInner2'): + inner2_inst = instances[i] + + assert_eq(inner1_inst.before_all_calls, 1, 'TestInner1 before_all calls') + assert_eq(inner1_inst.after_all_calls, 1, 'TestInner1 after_all calls') + assert_eq(inner1_inst.before_each_calls, 1, 'TestInner1 before_each_calls') + assert_eq(inner1_inst.after_each_calls, 1, 'TestInner1 after_each calls') + + assert_eq(inner2_inst.before_all_calls, 0, 'TestInner2 before_all calls') + assert_eq(inner2_inst.after_all_calls, 0, 'TestInner2 after_all calls') + assert_eq(inner2_inst.before_each_calls, 0, 'TestInner2 before_each_calls') + assert_eq(inner2_inst.after_each_calls, 0, 'TestInner2 after_each calls') + + if(is_passing()): + gut.p('These sometimes fail due to the order tests are run.') # ------------------------------ # Pre and post hook tests From 00c432bc0a442e15f117990c498e475c35426308 Mon Sep 17 00:00:00 2001 From: Butch Wesley Date: Wed, 23 Nov 2022 16:05:04 -0500 Subject: [PATCH 3/4] all skipped/pending inner tests restored --- addons/gut/test.gd | 15 +++-- addons/gut/utils.gd | 2 + scratch/find_inner_classes.gd | 66 ++++++++++++++++--- scratch/get_info.gd | 18 +++-- test/integration/test_gut_integration.gd | 9 +-- test/integration/test_test_stubber_doubler.gd | 12 +++- test/unit/test_result_exporter.gd | 4 +- 7 files changed, 96 insertions(+), 30 deletions(-) diff --git a/addons/gut/test.gd b/addons/gut/test.gd index 96525504..d2849225 100644 --- a/addons/gut/test.gd +++ b/addons/gut/test.gd @@ -68,7 +68,7 @@ class DoubleInfo: if(_utils.is_instance(thing)): return - if(typeof(p2) == TYPE_STRING): + if(typeof(p2) != TYPE_INT): strategy = p3 subpath = p2 @@ -78,12 +78,13 @@ class DoubleInfo: resource = thing elif(typeof(thing) == TYPE_STRING): resource = load(thing) - if(subpath != null and typeof(subpath) == TYPE_STRING): - var parts = subpath.split('/') - for i in range(parts.size()): - inner_resource = resource.get(parts[i]) - elif(subpath != null): - inner_resource = subpath + + if(subpath != null and typeof(subpath) == TYPE_STRING): + var parts = subpath.split('/') + for i in range(parts.size()): + inner_resource = resource.get(parts[i]) + elif(subpath != null): + inner_resource = subpath is_valid = true diff --git a/addons/gut/utils.gd b/addons/gut/utils.gd index f909921c..ed88817d 100644 --- a/addons/gut/utils.gd +++ b/addons/gut/utils.gd @@ -155,6 +155,8 @@ func _on_http_request_latest_version_completed(result, response_code, headers, b const GUT_METADATA = '__gutdbl' +# Note, these cannot change since places are checking for TYPE_INT to determine +# how to process parameters. enum DOUBLE_STRATEGY{ SCRIPT_ONLY, INCLUDE_SUPER diff --git a/scratch/find_inner_classes.gd b/scratch/find_inner_classes.gd index 69c6d2fa..9b525225 100644 --- a/scratch/find_inner_classes.gd +++ b/scratch/find_inner_classes.gd @@ -67,19 +67,67 @@ func get_inner_class_string(inner, parent_script): return to_return +func print_other_info(loaded, msg = '', indent=''): + print(indent, loaded) + + var base_script_path = 'NO base script' + if(loaded.has_method('get_base_script')): + if(loaded.get_base_script() != null): + base_script_path = str('"', loaded.get_base_script().get_path(), '"') + else: + base_script_path = 'Null base script' + + print(indent, 'base_script path ', base_script_path) + print(indent, 'class ', loaded.get_class()) + print(indent, 'instance base type ', loaded.get_instance_base_type()) + print(indent, 'instance_id ', loaded.get_instance_id()) + print(indent, 'meta_list ', loaded.get_meta_list()) + print(indent, 'name ', loaded.get_name()) + print(indent, 'path ', loaded.get_path()) + print(indent, 'resource local to scene ', loaded.resource_local_to_scene) + print(indent, 'resource name ', loaded.resource_name) + print(indent, 'resource path ', loaded.resource_path) + print(indent, 'RID ', loaded.get_rid()) + print(indent, 'script ', loaded.get_script()) + print() + + + + + +func find_parent_script(InnerClass): + var max_search = 20 + var start_id = InnerClass.get_instance_id() + var search_id = start_id + 1 + var found = false + + while(search_id < start_id + max_search and !found): + print(search_id) + var search_obj = instance_from_id(search_id) + print(search_obj) + if(search_obj != null): + print(search_obj) + search_id += 1 + func _init(): - var result = get_inner_class_string(HasSomeInners.Inner2.Inner2_b, self.get_script()) - print(result) + print(GutDoubleTestInnerClasses) + print(GutDoubleTestInnerClasses.InnerA) + print(ThatInnerClassScript.get_instance_id() + ThatInnerClassScript.InnerA.get_instance_id()) + find_parent_script(GutDoubleTestInnerClasses.InnerA) + quit() - print() - result = get_inner_class_string(ThatInnerClassScript.InnerWithSignals, ThatInnerClassScript) - print(result) + # var result = get_inner_class_string(HasSomeInners.Inner2.Inner2_b, self.get_script()) + # print(result) + + # print() + # result = get_inner_class_string(ThatInnerClassScript.InnerWithSignals, ThatInnerClassScript) + # print(result) - print(get_extends_text(HasSomeInners.Inner2.Inner2_b, self.get_script())) + # print(get_extends_text(HasSomeInners.Inner2.Inner2_b, self.get_script())) - print(get_extends_text(HasSomeInners.Inner2.Inner2_b, HasSomeInners)) + # print(get_extends_text(HasSomeInners.Inner2.Inner2_b, HasSomeInners)) - print(get_extends_text(ThatInnerClassScript.InnerWithSignals, ThatInnerClassScript)) + # print(get_extends_text(ThatInnerClassScript.InnerWithSignals, ThatInnerClassScript)) - quit() \ No newline at end of file + # quit() \ No newline at end of file diff --git a/scratch/get_info.gd b/scratch/get_info.gd index 866961cd..eb79d900 100644 --- a/scratch/get_info.gd +++ b/scratch/get_info.gd @@ -11,6 +11,9 @@ const DOUBLE_ME_PATH = 'res://test/resources/doubler_test_objects/double_me.gd' var DoubleMe = load(DOUBLE_ME_PATH) var DoubleMeScene = load('res://test/resources/doubler_test_objects/double_me_scene.tscn') var SetGetTestNode = load('res://test/resources/test_assert_setget_test_objects/test_node.gd') +# const INNER_CLASSES_PATH = 'res://test/resources/doubler_test_objects/inner_classes.gd' +# var InnerClasses = load(INNER_CLASSES_PATH) + var json = JSON.new() var _strutils = load('res://addons/gut/strutils.gd').new() @@ -138,10 +141,10 @@ func get_defaults_and_types(method_meta): func class_db_stuff(): print(ClassDB.class_exists('Node2D')) - #print('category = ', ClassDB.('Node2D')) - #print(str(JSON.print(ClassDB.class_get_method_list('Node2D'), ' '))) + # print('category = ', ClassDB.('Node2D')) + # print(str(JSON.print(ClassDB.class_get_method_list('Node2D'), ' '))) # print(ClassDB.class_get_integer_constant_list('Node2D')) - # print(ClassDB.get_class_list()) + print(ClassDB.get_class_list()) func does_inherit_from_test(thing): @@ -186,6 +189,7 @@ func print_other_info(loaded, msg = '', indent=''): var const_map = loaded.new().get_script().get_script_constant_map() if(const_map.size() > 0): print(indent, '--- Constants ---') + for key in const_map: var thing = const_map[key] print(indent, key, ' = ', thing) @@ -385,8 +389,14 @@ func get_scene_script_object(scene): return to_return + + func _init(): - pp(Button.new().get_method_list()) + # pp(Button.new().get_method_list()) + print_other_info(GutDoubleTestInnerClasses) + # print("---------------\n\n\n\n-------------------") + # print_other_info(GutDoubleTestInnerClasses.InnerA) + # class_db_stuff() # print_all_info(DoubleMeScene) # var TestScene = load('res://test/resources/doubler_test_objects/double_me_scene.tscn') # print_scene_info(TestScene) diff --git a/test/integration/test_gut_integration.gd b/test/integration/test_gut_integration.gd index 71f7e8c0..7c8d24ac 100644 --- a/test/integration/test_gut_integration.gd +++ b/test/integration/test_gut_integration.gd @@ -1,7 +1,7 @@ -extends 'res://addons/gut/test.gd' +extends GutTest class CoupledScriptTest: - extends 'res://addons/gut/test.gd' + extends GutTest var _gut = null @@ -54,9 +54,6 @@ class TestYieldInBeforeAfterMethods: _assert_pass_fail_count(1, 0) func test_gut_waits_for_yield_in_after_all(): - pending('local method _get_inner_class_script_instance is broke in 4.0') - return - _run_tests(SCRIPT_PATH, 'TestYieldInAfterAll', null) await yield_to(_gut, 'end_run', 10) var test_script = _get_inner_class_script_instance('TestYieldInAfterAll') @@ -80,7 +77,7 @@ class TestYieldInBeforeAfterMethods: # assert_eq(test_script.before_each_value, 'set', 'before_each_value') class TestOutputWhenRunDirectly: - extends 'res://addons/gut/test.gd' + extends GutTest var before_all_value = 'NOT_SET' var before_each_value = 'NOT_SET' diff --git a/test/integration/test_test_stubber_doubler.gd b/test/integration/test_test_stubber_doubler.gd index 12b1f5b5..94e1c349 100644 --- a/test/integration/test_test_stubber_doubler.gd +++ b/test/integration/test_test_stubber_doubler.gd @@ -157,11 +157,21 @@ class TestTestsSmartDoubleMethod: var inst = _test.double(DOUBLE_ME_SCENE_PATH).instantiate() assert_eq(inst.__gutdbl.thepath, DOUBLE_ME_SCENE_PATH) - func test_when_passed_script_and_inner_it_doubles_it(): + func test_when_doubling_inners_with_strings(): var inst = _test.double(INNER_CLASSES_PATH, 'InnerA').new() assert_eq(inst.__gutdbl.thepath, INNER_CLASSES_PATH, 'check path') assert_eq(inst.__gutdbl.subpath, 'InnerA', 'check subpath') + func test_doulbing_inners_with_objects(): + var inst = _test.double(InnerClasses, InnerClasses.InnerA).new() + assert_eq(inst.__gutdbl.thepath, INNER_CLASSES_PATH, 'check path') + assert_eq(inst.__gutdbl.subpath, 'InnerA', 'check subpath') + + func test_partial_doubling_inners_with_mixed(): + var inst = _test.partial_double(InnerClasses, 'InnerA').new() + assert_eq(inst.__gutdbl.thepath, INNER_CLASSES_PATH, 'check path') + assert_eq(inst.__gutdbl.subpath, 'InnerA', 'check subpath') + func test_full_strategy_used_for_scripts(): var inst = _test.double(DOUBLE_ME_PATH, DOUBLE_STRATEGY.INCLUDE_SUPER).new() inst.get_instance_id() diff --git a/test/unit/test_result_exporter.gd b/test/unit/test_result_exporter.gd index 74a0ed71..dd2193ef 100644 --- a/test/unit/test_result_exporter.gd +++ b/test/unit/test_result_exporter.gd @@ -144,9 +144,6 @@ func test_totals_with_inner_classes(): func test_script_totals_with_inner_classes(): - pending('Broke in godot 4 a16') - return - run_scripts(_test_gut, 'test_with_inner_classes.gd') var re = ResultExporter.new() var result = re.get_results_dictionary(_test_gut).test_scripts.scripts @@ -214,3 +211,4 @@ func test_spot_check(): var re = ResultExporter.new() var result = re.get_results_dictionary(_test_gut) _utils.pretty_print(result) + pass_test("Check output") From 622235a0ed9463aa92bc10a75a7e68e56c4d06da Mon Sep 17 00:00:00 2001 From: Butch Wesley Date: Wed, 23 Nov 2022 18:07:38 -0500 Subject: [PATCH 4/4] readme --- GODOT_4_README.md | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/GODOT_4_README.md b/GODOT_4_README.md index 5310349f..54bb5d63 100644 --- a/GODOT_4_README.md +++ b/GODOT_4_README.md @@ -3,7 +3,7 @@ ## Overview -Ported to Godot 4 Beta 4 +Ported to Godot 4 Beta 5 GUT is currently somewhat usable in 4.0. Some features work, but many do not. The CLI works, but the in-editor panel does not. @@ -13,18 +13,17 @@ This file tracks the changes that have occurred in porting GUT to Godot 4.0. Al ``` Totals Scripts: 172 -Passing tests 1057 -Failing tests 37 -Risky tests 14 -Pending: 28 -Asserts: 1618 of 1661 passed +Passing tests 1042 +Failing tests 14 +Risky tests 16 +Pending: 27 +Asserts: 1608 of 1630 passed Warnings/Errors: * 15 Errors. -* 6 Warnings. +* 36 Warnings. - -1057 passed 37 failed. Tests finished in 132.005s +1042 passed 14 failed. Tests finished in 132.377s ``` @@ -66,12 +65,12 @@ These are changes to Godot that affect how GUT is used/implemented. * Doubling, Spying, Stubbing (mostly). Cannot double inner classes. * Using `await` (the new `yield`) in tests, and all the GUT supplied `yield_` methods. See notes in Changes section. * Input mocking. +* Doubling Inner Classes has been fixed and all the tests have been restored. ## Broken Features -* Gut Panel. The in-editor panel is not working, you must use the CLI for now. -* Cannot double inner classes due to Godot bug #65666. -* Dictionary/array asserts are broke in some cases. -* Probably much much more. +* Gut Panel. The in-editor panel is not working, you must use the CLI or the VSCode plugin (which uses the cli) for now. +* Dictionary/array asserts are broke in some cases. Godot 4 passes all arrays and dictionaries by reference now (arrays were by value, dictionaries were by reference). This has broken a lot of the logic for comparing dictionaris, arrays, arrays in dictionaries, dictionaries in arrays. +* Probably somewhat more.