1+ from meshroom .core import desc
2+ from meshroom .core .graph import Graph
3+
4+ from .utils import registerNodeDesc , unregisterNodeDesc
5+
6+
7+ class NodeWithKeyableAttributes (desc .Node ):
8+ inputs = [
9+ desc .BoolParam (
10+ name = "keyableBool" ,
11+ label = "Keyable Bool" ,
12+ description = "A keyable bool parameter." ,
13+ value = True ,
14+ keyable = True ,
15+ keyType = "viewId"
16+ ),
17+ desc .IntParam (
18+ name = "keyableInt" ,
19+ label = "Keyable Integer" ,
20+ description = "A keyable integer parameter." ,
21+ value = 5 ,
22+ range = (0 , 100 , 2 ),
23+ keyable = True ,
24+ keyType = "viewId"
25+ ),
26+ desc .FloatParam (
27+ name = "keyableFloat" ,
28+ label = "Keyable Float" ,
29+ description = "A keyable float parameter." ,
30+ value = 5.5 ,
31+ range = (0.0 , 100.0 , 2.2 ),
32+ keyable = True ,
33+ keyType = "viewId"
34+ ),
35+ ]
36+
37+ class TestKeyableAttribute :
38+
39+ @classmethod
40+ def setup_class (cls ):
41+ registerNodeDesc (NodeWithKeyableAttributes )
42+
43+ @classmethod
44+ def teardown_class (cls ):
45+ unregisterNodeDesc (NodeWithKeyableAttributes )
46+
47+ def test_initialization (self ):
48+ graph = Graph ("" )
49+
50+ nodeA = graph .addNewNode (NodeWithKeyableAttributes .__name__ )
51+
52+ # Check attribute is keyable
53+ assert nodeA .keyableBool .keyable
54+ assert nodeA .keyableInt .keyable
55+ assert nodeA .keyableFloat .keyable
56+
57+ # Check attribute key type
58+ assert nodeA .keyableBool .keyValues .keyType == "viewId"
59+ assert nodeA .keyableInt .keyValues .keyType == "viewId"
60+ assert nodeA .keyableFloat .keyValues .keyType == "viewId"
61+
62+ # Check attribute pairs empty
63+ assert nodeA .keyableBool .isDefault
64+ assert nodeA .keyableInt .isDefault
65+ assert nodeA .keyableFloat .isDefault
66+
67+ # Check attribute default value
68+ assert nodeA .keyableBool .getDefaultValue () == True
69+ assert nodeA .keyableInt .getDefaultValue () == 5
70+ assert nodeA .keyableFloat .getDefaultValue () == 5.5
71+
72+ # Check attribute serialized value
73+ assert nodeA .keyableBool .getSerializedValue () == {}
74+ assert nodeA .keyableInt .getSerializedValue () == {}
75+ assert nodeA .keyableFloat .getSerializedValue () == {}
76+
77+ # Check attribute string value
78+ assert nodeA .keyableBool .getValueStr () == "{}"
79+ assert nodeA .keyableInt .getValueStr () == "{}"
80+ assert nodeA .keyableFloat .getValueStr () == "{}"
81+
82+
83+ def test_createReadUpdateDelete (self ):
84+ graph = Graph ("" )
85+
86+ nodeA = graph .addNewNode (NodeWithKeyableAttributes .__name__ )
87+
88+ # Check attribute value at key "0", should be default value
89+ assert nodeA .keyableBool .keyValues .getValueAtKeyOrDefault ("0" ) == True
90+ assert nodeA .keyableInt .keyValues .getValueAtKeyOrDefault ("0" ) == 5
91+ assert nodeA .keyableFloat .keyValues .getValueAtKeyOrDefault ("0" ) == 5.5
92+
93+ # Check attribute has key "0", should be False (no key)
94+ assert nodeA .keyableBool .keyValues .hasKey ("0" ) == False
95+ assert nodeA .keyableInt .keyValues .hasKey ("0" ) == False
96+ assert nodeA .keyableFloat .keyValues .hasKey ("0" ) == False
97+
98+ # Add attribute (key, value) at key "0"
99+ nodeA .keyableBool .keyValues .add ("0" , False )
100+ nodeA .keyableInt .keyValues .add ("0" , 10 )
101+ nodeA .keyableFloat .keyValues .add ("0" , 10.1 )
102+
103+ # Check attribute value at key "0", should be the new value
104+ assert nodeA .keyableBool .keyValues .getValueAtKeyOrDefault ("0" ) == False
105+ assert nodeA .keyableInt .keyValues .getValueAtKeyOrDefault ("0" ) == 10
106+ assert nodeA .keyableFloat .keyValues .getValueAtKeyOrDefault ("0" ) == 10.1
107+
108+ # Check attribute has key "0", should be True (key exists)
109+ assert nodeA .keyableBool .keyValues .hasKey ("0" ) == True
110+ assert nodeA .keyableInt .keyValues .hasKey ("0" ) == True
111+ assert nodeA .keyableFloat .keyValues .hasKey ("0" ) == True
112+
113+ # Update attribute (key, value) at key "0"
114+ nodeA .keyableBool .keyValues .add ("0" , True )
115+ nodeA .keyableInt .keyValues .add ("0" , 20 )
116+ nodeA .keyableFloat .keyValues .add ("0" , 20.2 )
117+
118+ # Check attribute value at key "0", should be the new updated value
119+ assert nodeA .keyableBool .keyValues .getValueAtKeyOrDefault ("0" ) == True
120+ assert nodeA .keyableInt .keyValues .getValueAtKeyOrDefault ("0" ) == 20
121+ assert nodeA .keyableFloat .keyValues .getValueAtKeyOrDefault ("0" ) == 20.2
122+
123+ # Check attribute has key "0", should be True (key exists)
124+ assert nodeA .keyableBool .keyValues .hasKey ("0" ) == True
125+ assert nodeA .keyableInt .keyValues .hasKey ("0" ) == True
126+ assert nodeA .keyableFloat .keyValues .hasKey ("0" ) == True
127+
128+ # Remove (key, value) at key "0"
129+ nodeA .keyableBool .keyValues .remove ("0" )
130+ nodeA .keyableInt .keyValues .remove ("0" )
131+ nodeA .keyableFloat .keyValues .remove ("0" )
132+
133+ # Check attributes values at key "0", should be default value
134+ assert nodeA .keyableBool .keyValues .getValueAtKeyOrDefault ("0" ) == True
135+ assert nodeA .keyableInt .keyValues .getValueAtKeyOrDefault ("0" ) == 5
136+ assert nodeA .keyableFloat .keyValues .getValueAtKeyOrDefault ("0" ) == 5.5
137+
138+ # Check attribute has key "0", should be False (no key)
139+ assert nodeA .keyableBool .keyValues .hasKey ("0" ) == False
140+ assert nodeA .keyableInt .keyValues .hasKey ("0" ) == False
141+ assert nodeA .keyableFloat .keyValues .hasKey ("0" ) == False
142+
143+
144+ def test_multipleKeys (self ):
145+ graph = Graph ("" )
146+
147+ nodeA = graph .addNewNode (NodeWithKeyableAttributes .__name__ )
148+
149+ # Add attribute (key, value) at key "0"
150+ nodeA .keyableBool .keyValues .add ("0" , False )
151+ nodeA .keyableInt .keyValues .add ("0" , 1 )
152+ nodeA .keyableFloat .keyValues .add ("0" , 1.1 )
153+
154+ # Add attribute (key, value) at key "1"
155+ nodeA .keyableBool .keyValues .add ("1" , False )
156+ nodeA .keyableInt .keyValues .add ("1" , 2 )
157+ nodeA .keyableFloat .keyValues .add ("1" , 2.2 )
158+
159+ # Add attribute (key, value) at key "2"
160+ nodeA .keyableBool .keyValues .add ("2" , True )
161+ nodeA .keyableInt .keyValues .add ("2" , 3 )
162+ nodeA .keyableFloat .keyValues .add ("2" , 3.3 )
163+
164+ # Check attribute has key "0", should be True (key exists)
165+ assert nodeA .keyableBool .keyValues .hasKey ("0" ) == True
166+ assert nodeA .keyableInt .keyValues .hasKey ("0" ) == True
167+ assert nodeA .keyableFloat .keyValues .hasKey ("0" ) == True
168+
169+ # Check attribute has key "1", should be True (key exists)
170+ assert nodeA .keyableBool .keyValues .hasKey ("1" ) == True
171+ assert nodeA .keyableInt .keyValues .hasKey ("1" ) == True
172+ assert nodeA .keyableFloat .keyValues .hasKey ("1" ) == True
173+
174+ # Check attribute has key "2", should be True (key exists)
175+ assert nodeA .keyableBool .keyValues .hasKey ("2" ) == True
176+ assert nodeA .keyableInt .keyValues .hasKey ("2" ) == True
177+ assert nodeA .keyableFloat .keyValues .hasKey ("2" ) == True
178+
179+ # Check attributes values at key "0", should be default value
180+ assert nodeA .keyableBool .keyValues .getValueAtKeyOrDefault ("0" ) == False
181+ assert nodeA .keyableInt .keyValues .getValueAtKeyOrDefault ("0" ) == 1
182+ assert nodeA .keyableFloat .keyValues .getValueAtKeyOrDefault ("0" ) == 1.1
183+
184+ # Check attributes values at key "1", should be default value
185+ assert nodeA .keyableBool .keyValues .getValueAtKeyOrDefault ("1" ) == False
186+ assert nodeA .keyableInt .keyValues .getValueAtKeyOrDefault ("1" ) == 2
187+ assert nodeA .keyableFloat .keyValues .getValueAtKeyOrDefault ("1" ) == 2.2
188+
189+ # Check attributes values at key "2", should be default value
190+ assert nodeA .keyableBool .keyValues .getValueAtKeyOrDefault ("2" ) == True
191+ assert nodeA .keyableInt .keyValues .getValueAtKeyOrDefault ("2" ) == 3
192+ assert nodeA .keyableFloat .keyValues .getValueAtKeyOrDefault ("2" ) == 3.3
193+
194+ # Remove (key, value) at key "1"
195+ nodeA .keyableBool .keyValues .remove ("1" )
196+ nodeA .keyableInt .keyValues .remove ("1" )
197+ nodeA .keyableFloat .keyValues .remove ("1" )
198+
199+ # Check attribute has key "1", should be False (no key)
200+ assert nodeA .keyableBool .keyValues .hasKey ("1" ) == False
201+ assert nodeA .keyableInt .keyValues .hasKey ("1" ) == False
202+ assert nodeA .keyableFloat .keyValues .hasKey ("1" ) == False
203+
204+
205+ def test_linkAttribute (self ):
206+ graph = Graph ("" )
207+
208+ nodeA = graph .addNewNode (NodeWithKeyableAttributes .__name__ )
209+ nodeB = graph .addNewNode (NodeWithKeyableAttributes .__name__ )
210+
211+ # Add some keys for nodeA.keyableInt
212+ nodeA .keyableInt .keyValues .add ("0" , 0 )
213+ nodeA .keyableInt .keyValues .add ("1" , 1 )
214+ nodeA .keyableInt .keyValues .add ("2" , 2 )
215+
216+ # Add link:
217+ # nodeB.keyableInt is a link for nodeA.keyableInt
218+ graph .addEdge (nodeA .keyableInt , nodeB .keyableInt )
219+
220+ # Check link
221+ assert nodeB .keyableInt .isLink == True
222+ assert nodeB .keyableInt .keyValues == nodeA .keyableInt .keyValues
223+
224+ # Check existing (key, value) in nodeA.keyableInt and nodeB.keyableInt
225+ assert nodeA .keyableInt .keyValues .hasKey ("1" ) == True
226+ assert nodeB .keyableInt .keyValues .hasKey ("1" ) == True
227+ assert nodeA .keyableInt .keyValues .getValueAtKeyOrDefault ("1" ) == 1
228+ assert nodeB .keyableInt .keyValues .getValueAtKeyOrDefault ("1" ) == 1
229+
230+ # Add a key to nodeB.keyableInt
231+ nodeB .keyableInt .keyValues .add ("3" , 3 )
232+
233+ # Check new (key, value) in nodeA.keyableInt and nodeB.keyableInt
234+ assert nodeA .keyableInt .keyValues .hasKey ("3" ) == True
235+ assert nodeB .keyableInt .keyValues .hasKey ("3" ) == True
236+ assert nodeA .keyableInt .keyValues .getValueAtKeyOrDefault ("3" ) == 3
237+ assert nodeB .keyableInt .keyValues .getValueAtKeyOrDefault ("3" ) == 3
238+
239+ # Check nodeB.keyableInt serialized values
240+ assert nodeB .keyableInt .getSerializedValue () == nodeA .keyableInt .asLinkExpr ()
241+
242+
243+ def test_uid (self ):
244+ graph = Graph ("" )
245+
246+ nodeA = graph .addNewNode (NodeWithKeyableAttributes .__name__ )
247+ nodeB = graph .addNewNode (NodeWithKeyableAttributes .__name__ )
248+
249+ # Add some keys for nodeA.keyableInt
250+ nodeA .keyableInt .keyValues .add ("0" , 0 )
251+ nodeA .keyableInt .keyValues .add ("1" , 1 )
252+ nodeA .keyableInt .keyValues .add ("2" , 2 )
253+
254+ # Add the same keys for nodeB.keyableInt
255+ # But not in the same order
256+ nodeB .keyableInt .keyValues .add ("2" , 2 )
257+ nodeB .keyableInt .keyValues .add ("0" , 0 )
258+ nodeB .keyableInt .keyValues .add ("1" , 1 )
259+
260+ # Check UID, should be the same
261+ assert nodeA .keyableInt .uid () == nodeB .keyableInt .uid ()
262+
263+ # Remove (key, value) at key "1" from nodeA.keyableInt
264+ nodeA .keyableInt .keyValues .remove ("1" )
265+
266+ # Check UID, should not be the same
267+ assert nodeA .keyableInt .uid () != nodeB .keyableInt .uid ()
0 commit comments