88from openeo .api .process import Parameter
99from openeo .internal .graph_building import (
1010 FlatGraphNodeIdGenerator ,
11+ GraphFlattener ,
1112 MultiResult ,
1213 PGNode ,
1314 PGNodeGraphUnflattener ,
@@ -146,6 +147,91 @@ def test_flat_graph_key_generate():
146147 assert g .generate ("foo" ) == "foo3"
147148
148149
150+ class TestGraphFlattener :
151+ def test_simple (self ):
152+ node = PGNode ("foo" , bar = "meh" )
153+ flattener = GraphFlattener ()
154+ assert flattener .flatten (node ) == {"foo1" : {"process_id" : "foo" , "arguments" : {"bar" : "meh" }, "result" : True }}
155+
156+ def test_chain (self ):
157+ a = PGNode ("a" , bar = "meh" )
158+ b = PGNode ("b" , a = a )
159+ c = PGNode ("c" , a = a , b = b )
160+ flattener = GraphFlattener ()
161+ assert flattener .flatten (c ) == {
162+ "a1" : {"process_id" : "a" , "arguments" : {"bar" : "meh" }},
163+ "b1" : {"process_id" : "b" , "arguments" : {"a" : {"from_node" : "a1" }}},
164+ "c1" : {
165+ "process_id" : "c" ,
166+ "arguments" : {"a" : {"from_node" : "a1" }, "b" : {"from_node" : "b1" }},
167+ "result" : True ,
168+ },
169+ }
170+
171+ def test_no_multi_input_mode (self ):
172+ a = PGNode ("a" )
173+ b = PGNode ("b" , a = a )
174+ flattener = GraphFlattener ()
175+ flat_graph = flattener .flatten (a )
176+ assert flat_graph == {"a1" : {"process_id" : "a" , "arguments" : {}, "result" : True }}
177+ with pytest .raises (RuntimeError , match = "not in multi-input mode" ):
178+ flattener .flatten (b )
179+ assert flat_graph == {"a1" : {"process_id" : "a" , "arguments" : {}, "result" : True }}
180+
181+ def test_multi_input_mode (self ):
182+ a = PGNode ("a" )
183+ b = PGNode ("b" , a = a )
184+ c = PGNode ("c" , a = a )
185+ flattener = GraphFlattener (multi_input_mode = True )
186+ # Flatten b
187+ assert flattener .flatten (b ) == {
188+ "a1" : {"process_id" : "a" , "arguments" : {}},
189+ "b1" : {"process_id" : "b" , "arguments" : {"a" : {"from_node" : "a1" }}},
190+ }
191+ assert flattener .flattened () == {
192+ "a1" : {"process_id" : "a" , "arguments" : {}},
193+ "b1" : {"process_id" : "b" , "arguments" : {"a" : {"from_node" : "a1" }}, "result" : True },
194+ }
195+ # Flatten c
196+ assert flattener .flatten (c ) == {
197+ "a1" : {"process_id" : "a" , "arguments" : {}},
198+ "b1" : {"process_id" : "b" , "arguments" : {"a" : {"from_node" : "a1" }}},
199+ "c1" : {"process_id" : "c" , "arguments" : {"a" : {"from_node" : "a1" }}},
200+ }
201+ assert flattener .flattened () == {
202+ "a1" : {"process_id" : "a" , "arguments" : {}},
203+ "b1" : {"process_id" : "b" , "arguments" : {"a" : {"from_node" : "a1" }}},
204+ "c1" : {"process_id" : "c" , "arguments" : {"a" : {"from_node" : "a1" }}, "result" : True },
205+ }
206+
207+ def test_multi_input_mode_mutation (self ):
208+ """Verify that previously produced flat graphs are not silently mutated"""
209+ a = PGNode ("a" )
210+ b = PGNode ("b" , a = a )
211+ flattener = GraphFlattener (multi_input_mode = True )
212+ a_flat = flattener .flatten (a )
213+ assert a_flat == {
214+ "a1" : {"process_id" : "a" , "arguments" : {}},
215+ }
216+ b_flat = flattener .flatten (b )
217+ assert b_flat == {
218+ "a1" : {"process_id" : "a" , "arguments" : {}},
219+ "b1" : {"process_id" : "b" , "arguments" : {"a" : {"from_node" : "a1" }}},
220+ }
221+ assert flattener .flattened () == {
222+ "a1" : {"process_id" : "a" , "arguments" : {}},
223+ "b1" : {"process_id" : "b" , "arguments" : {"a" : {"from_node" : "a1" }}, "result" : True },
224+ }
225+ # Original graphs are not mutated silently
226+ assert a_flat == {
227+ "a1" : {"process_id" : "a" , "arguments" : {}},
228+ }
229+ assert b_flat == {
230+ "a1" : {"process_id" : "a" , "arguments" : {}},
231+ "b1" : {"process_id" : "b" , "arguments" : {"a" : {"from_node" : "a1" }}},
232+ }
233+
234+
149235def test_build_and_flatten_simple ():
150236 node = PGNode ("foo" )
151237 assert node .flat_graph () == {"foo1" : {"process_id" : "foo" , "arguments" : {}, "result" : True }}
@@ -421,14 +507,14 @@ class TestMultiResult:
421507 def test_simple (self ):
422508 multi = MultiResult ([PGNode ("foo" ), PGNode ("bar" )])
423509 assert multi .flat_graph () == {
424- "foo1" : {"process_id" : "foo" , "arguments" : {}, "result" : True },
510+ "foo1" : {"process_id" : "foo" , "arguments" : {}},
425511 "bar1" : {"process_id" : "bar" , "arguments" : {}, "result" : True },
426512 }
427513
428514 def test_simple_duplicates (self ):
429515 multi = MultiResult ([PGNode ("foo" ), PGNode ("foo" )])
430516 assert multi .flat_graph () == {
431- "foo1" : {"process_id" : "foo" , "arguments" : {}, "result" : True },
517+ "foo1" : {"process_id" : "foo" , "arguments" : {}},
432518 "foo2" : {"process_id" : "foo" , "arguments" : {}, "result" : True },
433519 }
434520
@@ -442,7 +528,6 @@ def test_multi_save_result_same_root(self):
442528 "saveresult1" : {
443529 "process_id" : "save_result" ,
444530 "arguments" : {"data" : {"from_node" : "loadcollection1" }, "format" : "GTiff" , "options" : {}},
445- "result" : True ,
446531 },
447532 "saveresult2" : {
448533 "process_id" : "save_result" ,
0 commit comments