Skip to content

Commit ff08cd9

Browse files
committed
GD-291: Spy fails for class with custom formatted function signature (#292)
* GD-291: Spy fails for class with custom formatted function signature - spy was failing to parse the function signature for custom formatted functions - scans now until end of function to collect the complete function signature - fixed error line detection for verify_no_interactions and verify_no_more_interactions
1 parent 5f63533 commit ff08cd9

File tree

5 files changed

+70
-2
lines changed

5 files changed

+70
-2
lines changed

addons/gdUnit3/src/asserts/GdUnitAssertImpl.gd

+1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ static func _get_line_number() -> int:
2323
or source.ends_with("AssertImpl.gd") \
2424
or source.ends_with("GdUnitTestSuite.gd") \
2525
or source.ends_with("GdUnitSceneRunnerImpl.gd") \
26+
or source.ends_with("GdUnitObjectInteractions.gd") \
2627
or source.ends_with("GdUnitAwaiter.gd"):
2728
continue
2829
return stack_info.get("line")

addons/gdUnit3/src/core/parse/GdScriptParser.gd

+14-2
Original file line numberDiff line numberDiff line change
@@ -502,6 +502,16 @@ func extract_source_code(script_path :PoolStringArray) -> PoolStringArray:
502502
source_code += load_source_code(base_script, script_path)
503503
return source_code
504504

505+
func extract_func_signature(rows :PoolStringArray, index :int) -> String:
506+
var signature = ""
507+
for rowIndex in range(index, rows.size()):
508+
var row :String = rows[rowIndex]
509+
signature += row.trim_prefix("\t").trim_suffix("\t")
510+
if is_func_end(row):
511+
return clean_up_row(signature)
512+
push_error("Can't fully extract function signature of '%s'" % rows[index])
513+
return ""
514+
505515
func load_source_code(script :GDScript, script_path :PoolStringArray) -> PoolStringArray:
506516
var map := script.get_script_constant_map()
507517
for key in map.keys():
@@ -543,14 +553,16 @@ func parse_func_name(row :String) -> String:
543553

544554
func parse_functions(rows :PoolStringArray, clazz_name :String, clazz_path :PoolStringArray) -> Array:
545555
var func_descriptors := Array()
546-
for row in rows:
556+
for rowIndex in rows.size():
557+
var row = rows[rowIndex]
547558
# step over inner class functions
548559
if row.begins_with("\t"):
549560
continue
550561
var input = clean_up_row(row)
551562
var token := next_token(input, 0)
552563
if token == TOKEN_FUNCTION_STATIC_DECLARATION or token == TOKEN_FUNCTION_DECLARATION:
553-
func_descriptors.append(parse_func_description(row, clazz_name, clazz_path))
564+
var func_signature = extract_func_signature(rows, rowIndex)
565+
func_descriptors.append(parse_func_description(func_signature, clazz_name, clazz_path))
554566
return func_descriptors
555567

556568
func parse_func_description(func_signature :String, clazz_name :String, clazz_path :PoolStringArray) -> GdFunctionDescriptor:

addons/gdUnit3/test/core/parse/GdScriptParserTest.gd

+14
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,20 @@ func test_extract_source_code_inner_class_Area4D():
319319
var file_content := resource_as_array("res://addons/gdUnit3/test/core/resources/Area4D.txt")
320320
assert_array(rows).contains_exactly(file_content)
321321

322+
func test_extract_function_signature() -> void:
323+
var path := GdObjects.extract_class_path("res://addons/gdUnit3/test/mocker/resources/ClassWithCustomFormattings.gd")
324+
var rows = _parser.extract_source_code(path)
325+
326+
assert_that(_parser.extract_func_signature(rows, 9))\
327+
.is_equal("funca1(set_name:String,path:String=\"\",load_on_init:bool=false,set_auto_save:bool=false,set_network_sync:bool=false)->void:")
328+
assert_that(_parser.extract_func_signature(rows, 14))\
329+
.is_equal("funca2(set_name:String,path:String=\"\",load_on_init:bool=false,set_auto_save:bool=false,set_network_sync:bool=false)->void:")
330+
assert_that(_parser.extract_func_signature(rows, 19))\
331+
.is_equal("funca3(set_name:String,path:String=\"\",load_on_init:bool=false,set_auto_save:bool=false,set_network_sync:bool=false):")
332+
assert_that(_parser.extract_func_signature(rows, 24))\
333+
.is_equal("funca4(set_name:String,path:String=\"\",load_on_init:bool=false,set_auto_save:bool=false,set_network_sync:bool=false):")
334+
335+
322336
func test_strip_leading_spaces():
323337
assert_str(GdScriptParser.TokenInnerClass._strip_leading_spaces("")).is_empty()
324338
assert_str(GdScriptParser.TokenInnerClass._strip_leading_spaces(" ")).is_empty()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
extends Object
2+
3+
var _message
4+
5+
func _init(message:String, path:String="", load_on_init:bool=false,
6+
set_auto_save:bool=false, set_network_sync:bool=false
7+
) -> void:
8+
_message = message
9+
10+
func a1(set_name:String, path:String="", load_on_init:bool=false,
11+
set_auto_save:bool=false, set_network_sync:bool=false
12+
) -> void:
13+
pass
14+
15+
func a2(set_name:String, path:String="", load_on_init:bool=false,
16+
set_auto_save:bool=false, set_network_sync:bool=false
17+
) -> void:
18+
pass
19+
20+
func a3(set_name:String, path:String="", load_on_init:bool=false,
21+
set_auto_save:bool=false, set_network_sync:bool=false
22+
) :
23+
pass
24+
25+
func a4(set_name:String,
26+
path:String="",
27+
load_on_init:bool=false,
28+
set_auto_save:bool=false,
29+
set_network_sync:bool=false
30+
):
31+
pass

addons/gdUnit3/test/spy/GdUnitSpyTest.gd

+10
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,16 @@ func test_spy_on_custom_class():
9494
# verify if a not used argument not counted
9595
verify(spy_instance, 0).get_area("test_no")
9696

97+
# GD-291 https://github.com/MikeSchulze/gdUnit3/issues/291
98+
func test_spy_class_with_custom_formattings() -> void:
99+
var resource = load("res://addons/gdUnit3/test/mocker/resources/ClassWithCustomFormattings.gd")
100+
var spy = spy(resource.new("test"))
101+
spy.a1("set_name", "", true)
102+
verify(spy, 1).a1("set_name", "", true)
103+
verify_no_more_interactions(spy)
104+
verify_no_interactions(spy, GdUnitAssert.EXPECT_FAIL)
105+
assert_int(GdAssertReports.get_last_error_line_number()).is_equal(104)
106+
97107
func test_spy_copied_class_members():
98108
var instance = auto_free(load("res://addons/gdUnit3/test/mocker/resources/TestPersion.gd").new("user-x", "street", 56616))
99109
assert_that(instance._name).is_equal("user-x")

0 commit comments

Comments
 (0)