Skip to content

Commit 0ae960b

Browse files
committed
Unify editor and normal integration tests
1 parent 62aa391 commit 0ae960b

File tree

4 files changed

+207
-225
lines changed

4 files changed

+207
-225
lines changed

test/project/addons/editor_test_runner/plugin.gd

Lines changed: 3 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -10,33 +10,8 @@ func _enter_tree():
1010
run_tests = true
1111
break
1212
if run_tests:
13-
_run_tests()
13+
var tests = Tests.new()
14+
add_child(tests)
15+
tests.run()
1416
else:
1517
print("Opening editor normally for the test project. To run tests, pass `--run-editor-tests` to the executable.")
16-
17-
func _run_tests():
18-
var version = Engine.get_version_info()
19-
print(" -- Running on Godot ", version["string"])
20-
print(" -- Rust GDNative test suite (called from editor):")
21-
gdn = GDNative.new()
22-
var status = false;
23-
24-
gdn.library = load("res://gdnative.gdnlib")
25-
26-
if gdn.initialize():
27-
status = gdn.call_native("standard_varcall", "run_tests", [])
28-
29-
gdn.terminate()
30-
else:
31-
print(" -- Could not load the GDNative library.")
32-
33-
print()
34-
if status:
35-
print(" All tests PASSED.")
36-
else:
37-
print(" Tests FAILED.")
38-
OS.exit_code = 1
39-
40-
print(" -- exiting.")
41-
get_tree().quit()
42-

test/project/main.gd

Lines changed: 3 additions & 196 deletions
Original file line numberDiff line numberDiff line change
@@ -1,199 +1,6 @@
11
extends Node
22

3-
var gdn
4-
53
func _ready():
6-
var version = Engine.get_version_info()
7-
print(" -- Running on Godot ", version["string"])
8-
print(" -- Rust GDNative test suite:")
9-
_timeout()
10-
11-
gdn = GDNative.new()
12-
var status = false;
13-
14-
gdn.library = load("res://gdnative.gdnlib")
15-
16-
if gdn.initialize():
17-
status = gdn.call_native("standard_varcall", "run_tests", [])
18-
19-
status = status && _test_argument_passing_sanity()
20-
status = status && _test_generic_class()
21-
status = status && _test_optional_args()
22-
status = status && yield(_test_async_resume(), "completed")
23-
24-
# Godot needs another frame to dispose the executor driver node. Otherwise the process
25-
# aborts due to `_process` being called after `terminate` (`get_api` fail, not UB).
26-
yield(get_tree().create_timer(0.1), "timeout")
27-
28-
gdn.terminate()
29-
else:
30-
print(" -- Could not load the GDNative library.")
31-
32-
print()
33-
if status:
34-
print(" All tests PASSED.")
35-
else:
36-
print(" Tests FAILED.")
37-
OS.exit_code = 1
38-
39-
print(" -- exiting.")
40-
get_tree().quit()
41-
42-
func _timeout():
43-
yield(get_tree().create_timer(10.0), "timeout")
44-
print(" -- Test run is taking too long.")
45-
OS.exit_code = 1
46-
47-
print(" -- exiting.")
48-
get_tree().quit()
49-
50-
func _test_argument_passing_sanity():
51-
print(" -- test_argument_passing_sanity")
52-
53-
var script = NativeScript.new()
54-
script.set_library(gdn.library)
55-
script.set_class_name("Foo")
56-
var foo = Reference.new()
57-
foo.set_script(script)
58-
59-
var status = true
60-
61-
status = status && _assert_choose("foo", foo, "choose", "foo", true, "bar")
62-
status = status && _assert_choose("night", foo, "choose", "day", false, "night")
63-
status = status && _assert_choose(42, foo, "choose_variant", 42, "int", 54.0)
64-
status = status && _assert_choose(9.0, foo, "choose_variant", 6, "float", 9.0)
65-
66-
if status:
67-
assert("foo" == foo.choose("foo", true, "bar"))
68-
assert("night" == foo.choose("day", false, "night"))
69-
assert(42 == foo.choose_variant(42, "int", 54.0))
70-
assert(9.0 == foo.choose_variant(6, "float", 9.0))
71-
72-
if !status:
73-
printerr(" !! test_argument_passing_sanity failed")
74-
75-
return status
76-
77-
func _assert_choose(expected, foo, fun, a, which, b):
78-
var got_value = foo.call(fun, a, which, b)
79-
if got_value == expected:
80-
return true
81-
printerr(" !! expected ", expected, ", got ", got_value)
82-
return false
83-
84-
func _test_optional_args():
85-
print(" -- _test_optional_args")
86-
print(" -- expected error messages for edge cases:")
87-
print(" -- missing non-optional parameter `b` (#1)")
88-
print(" -- 1 excessive argument is given: [I64(6)]")
89-
print(" -- the test is successful when and only when these errors are shown")
90-
91-
var script = NativeScript.new()
92-
script.set_library(gdn.library)
93-
script.set_class_name("OptionalArgs")
94-
var opt_args = Reference.new()
95-
opt_args.set_script(script)
96-
97-
var status = true
98-
99-
status = status && _assert_opt_args(null, opt_args, [1])
100-
status = status && _assert_opt_args(2, opt_args, [1, 1])
101-
status = status && _assert_opt_args(6, opt_args, [1, 3, 2])
102-
status = status && _assert_opt_args(13, opt_args, [5, 1, 3, 4])
103-
status = status && _assert_opt_args(42, opt_args, [4, 1, 20, 4, 13])
104-
status = status && _assert_opt_args(null, opt_args, [1, 2, 3, 4, 5, 6])
105-
106-
if !status:
107-
printerr(" !! _test_optional_args failed")
108-
109-
return status
110-
111-
func _assert_opt_args(expected, opt_args, args):
112-
var got_value = opt_args.callv("opt_sum", args);
113-
if got_value == expected:
114-
return true
115-
printerr(" !! expected ", expected, ", got ", got_value)
116-
return false
117-
118-
119-
func _test_async_resume():
120-
print(" -- _test_async_resume")
121-
122-
var driver_script = NativeScript.new()
123-
driver_script.set_library(gdn.library)
124-
driver_script.set_class_name("AsyncExecutorDriver")
125-
var driver = Node.new()
126-
driver.set_script(driver_script)
127-
add_child(driver)
128-
129-
var script = NativeScript.new()
130-
script.set_library(gdn.library)
131-
script.set_class_name("AsyncMethods")
132-
var resume = Reference.new()
133-
resume.set_script(script)
134-
135-
var status = true
136-
137-
# Force this to return a FunctionState for convenience
138-
yield(get_tree().create_timer(0.1), "timeout")
139-
140-
var fn_state = resume.resume_add(1, self, "_get_async_number")
141-
if !fn_state:
142-
printerr(" !! _test_async_resume failed")
143-
remove_child(driver)
144-
driver.queue_free()
145-
return false
146-
147-
yield(fn_state, "resumable")
148-
status = status && fn_state.is_valid()
149-
150-
fn_state = fn_state.resume(2)
151-
if !fn_state:
152-
printerr(" !! _test_async_resume failed")
153-
remove_child(driver)
154-
driver.queue_free()
155-
return false
156-
157-
var result = yield(fn_state, "completed")
158-
159-
status = status && (result == 42)
160-
161-
if !status:
162-
printerr(" !! _test_async_resume failed")
163-
164-
remove_child(driver)
165-
driver.queue_free()
166-
167-
return status
168-
169-
func _get_async_number():
170-
yield(get_tree().create_timer(0.1), "timeout")
171-
return 39
172-
173-
func _test_generic_class():
174-
print(" -- _test_generic_class")
175-
176-
var int_script = NativeScript.new()
177-
int_script.set_library(gdn.library)
178-
int_script.set_class_name("IntOps")
179-
180-
var str_script = NativeScript.new()
181-
str_script.set_library(gdn.library)
182-
str_script.set_class_name("StrOps")
183-
184-
var int_ops = Reference.new()
185-
int_ops.set_script(int_script)
186-
187-
var str_ops = Reference.new()
188-
str_ops.set_script(str_script)
189-
190-
var status = true
191-
192-
status = status && int_ops.add(1, 2) == 3
193-
status = status && int_ops.sub(3, 2) == 1
194-
status = status && str_ops.add("foo", "bar") == "foobar"
195-
196-
if !status:
197-
printerr(" !! _test_generic_class failed")
198-
199-
return status
4+
var tests = Tests.new()
5+
add_child(tests)
6+
tests.run()

test/project/project.godot

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,14 @@
88

99
config_version=4
1010

11-
_global_script_classes=[ ]
11+
_global_script_classes=[ {
12+
"base": "Node",
13+
"class": "Tests",
14+
"language": "GDScript",
15+
"path": "res://tests.gd"
16+
} ]
1217
_global_script_class_icons={
18+
"Tests": ""
1319
}
1420

1521
[application]

0 commit comments

Comments
 (0)