4
4
* License, v. 2.0. If a copy of the MPL was not distributed with this
5
5
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
6
6
*/
7
-
8
7
use crate :: framework:: itest;
9
- use crate :: object_tests:: deferred_call_test:: TestState :: { Accepted , Initial } ;
8
+ use crate :: object_tests:: deferred_call_test:: TestState :: {
9
+ Accepted , FailedEngineClass , Initial , VerifyEngineClass ,
10
+ } ;
11
+ use godot:: obj:: deferred:: { CallEngineClassDeferred , DeferredCallableGd } ;
10
12
use godot:: prelude:: * ;
11
13
use godot:: task:: { SignalFuture , TaskHandle } ;
14
+ use std:: ops:: DerefMut ;
12
15
13
16
#[ derive( GodotConvert , Var , Export , Clone , PartialEq , Debug ) ]
14
17
#[ godot( via = GString ) ]
15
18
enum TestState {
16
19
Initial ,
17
20
Accepted ,
21
+ VerifyEngineClass ,
22
+ FailedEngineClass ,
18
23
}
19
24
20
25
#[ derive( GodotClass ) ]
21
- #[ class( base=Node ) ]
26
+ #[ class( base=Node2D ) ]
22
27
struct DeferredTestNode {
23
- base : Base < Node > ,
28
+ base : Base < Node2D > ,
24
29
state : TestState ,
25
30
}
26
31
@@ -35,10 +40,11 @@ impl DeferredTestNode {
35
40
}
36
41
37
42
fn as_expectation_task ( & self ) -> TaskHandle {
38
- assert_eq ! ( Initial , self . state, "accept evaluated synchronously" ) ;
43
+ assert_ne ! ( Accepted , self . state, "accept evaluated synchronously" ) ;
39
44
40
45
let test_will_succeed: SignalFuture < ( Variant , ) > =
41
46
Signal :: from_object_signal ( & self . to_gd ( ) , "test_completed" ) . to_future ( ) ;
47
+
42
48
godot:: task:: spawn ( async move {
43
49
let ( final_state, ) = test_will_succeed. await ;
44
50
let final_state: TestState = final_state. to ( ) ;
@@ -49,7 +55,7 @@ impl DeferredTestNode {
49
55
}
50
56
51
57
#[ godot_api]
52
- impl INode for DeferredTestNode {
58
+ impl INode2D for DeferredTestNode {
53
59
fn init ( base : Base < Self :: Base > ) -> Self {
54
60
Self {
55
61
base,
@@ -58,6 +64,14 @@ impl INode for DeferredTestNode {
58
64
}
59
65
60
66
fn process ( & mut self , _delta : f64 ) {
67
+ if self . state == VerifyEngineClass {
68
+ if self . base ( ) . get_name ( ) == "changed" . into ( ) {
69
+ self . state = Accepted ;
70
+ } else {
71
+ self . state = FailedEngineClass ;
72
+ }
73
+ }
74
+
61
75
let args = vslice ! [ self . state] ;
62
76
self . base_mut ( ) . emit_signal ( "test_completed" , args) ;
63
77
}
@@ -67,9 +81,47 @@ impl INode for DeferredTestNode {
67
81
fn calls_method_names_deferred ( ctx : & crate :: framework:: TestContext ) -> TaskHandle {
68
82
let mut test_node = DeferredTestNode :: new_alloc ( ) ;
69
83
ctx. scene_tree . clone ( ) . add_child ( & test_node) ;
70
-
84
+
71
85
test_node. call_deferred ( "accept" , & [ ] ) ;
72
86
73
87
let handle = test_node. bind ( ) . as_expectation_task ( ) ;
74
88
handle
75
89
}
90
+
91
+ #[ itest( async ) ]
92
+ fn calls_user_class_deferred_from_self ( ctx : & crate :: framework:: TestContext ) -> TaskHandle {
93
+ let mut test_node = DeferredTestNode :: new_alloc ( ) ;
94
+ ctx. scene_tree . clone ( ) . add_child ( & test_node) ;
95
+
96
+ test_node
97
+ . bind_mut ( )
98
+ . deref_mut ( )
99
+ . apply_deferred ( DeferredTestNode :: accept) ;
100
+
101
+ let handle = test_node. bind ( ) . as_expectation_task ( ) ;
102
+ handle
103
+ }
104
+
105
+ #[ itest( async ) ]
106
+ fn calls_user_class_deferred ( ctx : & crate :: framework:: TestContext ) -> TaskHandle {
107
+ let mut test_node = DeferredTestNode :: new_alloc ( ) ;
108
+ ctx. scene_tree . clone ( ) . add_child ( & test_node) ;
109
+
110
+ test_node. apply_deferred ( DeferredTestNode :: accept) ;
111
+
112
+ let handle = test_node. bind ( ) . as_expectation_task ( ) ;
113
+ handle
114
+ }
115
+
116
+ #[ itest( async ) ]
117
+ fn calls_engine_class_deferred ( ctx : & crate :: framework:: TestContext ) -> TaskHandle {
118
+ let mut test_node = DeferredTestNode :: new_alloc ( ) ;
119
+ ctx. scene_tree . clone ( ) . add_child ( & test_node) ;
120
+
121
+ let mut node = test_node. clone ( ) . upcast :: < Node > ( ) ;
122
+ node. apply_deferred ( |mut that_node| that_node. set_name ( "changed" ) ) ;
123
+
124
+ test_node. bind_mut ( ) . state = VerifyEngineClass ;
125
+ let handle = test_node. bind ( ) . as_expectation_task ( ) ;
126
+ handle
127
+ }
0 commit comments