test_scenario.py 66 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462
  1. # Copyright 2021-2024 Avaiga Private Limited
  2. #
  3. # Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
  4. # the License. You may obtain a copy of the License at
  5. #
  6. # http://www.apache.org/licenses/LICENSE-2.0
  7. #
  8. # Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
  9. # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
  10. # specific language governing permissions and limitations under the License.
  11. import typing
  12. from datetime import datetime, timedelta
  13. from typing import Set
  14. from unittest import mock
  15. import pytest
  16. from taipy.config import Frequency
  17. from taipy.config.common.scope import Scope
  18. from taipy.config.exceptions.exceptions import InvalidConfigurationId
  19. from taipy.core.common._utils import _Subscriber
  20. from taipy.core.cycle._cycle_manager_factory import _CycleManagerFactory
  21. from taipy.core.cycle.cycle import Cycle, CycleId
  22. from taipy.core.data._data_manager_factory import _DataManagerFactory
  23. from taipy.core.data.in_memory import DataNode, InMemoryDataNode
  24. from taipy.core.data.pickle import PickleDataNode
  25. from taipy.core.exceptions.exceptions import SequenceTaskDoesNotExistInScenario, SequenceAlreadyExists
  26. from taipy.core.scenario._scenario_manager_factory import _ScenarioManagerFactory
  27. from taipy.core.scenario.scenario import Scenario
  28. from taipy.core.scenario.scenario_id import ScenarioId
  29. from taipy.core.sequence.sequence import Sequence
  30. from taipy.core.sequence.sequence_id import SequenceId
  31. from taipy.core.task._task_manager_factory import _TaskManagerFactory
  32. from taipy.core.task.task import Task, TaskId
  33. def test_create_primary_scenario(cycle):
  34. scenario = Scenario("foo", set(), {"key": "value"}, is_primary=True, cycle=cycle)
  35. assert scenario.id is not None
  36. assert scenario.config_id == "foo"
  37. assert scenario.tasks == {}
  38. assert scenario.additional_data_nodes == {}
  39. assert scenario.data_nodes == {}
  40. assert scenario.sequences == {}
  41. assert scenario.properties == {"key": "value"}
  42. assert scenario.key == "value"
  43. assert scenario.creation_date is not None
  44. assert scenario.is_primary
  45. assert scenario.cycle == cycle
  46. assert scenario.tags == set()
  47. assert scenario.get_simple_label() == scenario.config_id
  48. with mock.patch("taipy.core.get") as get_mck:
  49. class MockOwner:
  50. label = "owner_label"
  51. def get_label(self):
  52. return self.label
  53. get_mck.return_value = MockOwner()
  54. assert scenario.get_label() == "owner_label > " + scenario.config_id
  55. def test_create_scenario_at_time(current_datetime):
  56. scenario = Scenario("bar", set(), {}, set(), ScenarioId("baz"), creation_date=current_datetime)
  57. assert scenario.id == "baz"
  58. assert scenario.config_id == "bar"
  59. assert scenario.tasks == {}
  60. assert scenario.additional_data_nodes == {}
  61. assert scenario.data_nodes == {}
  62. assert scenario.sequences == {}
  63. assert scenario.properties == {}
  64. assert scenario.creation_date == current_datetime
  65. assert not scenario.is_primary
  66. assert scenario.cycle is None
  67. assert scenario.tags == set()
  68. assert scenario.get_simple_label() == scenario.config_id
  69. assert scenario.get_label() == scenario.config_id
  70. def test_create_scenario_with_task_and_additional_dn_and_sequence():
  71. dn_1 = PickleDataNode("xyz", Scope.SCENARIO)
  72. dn_2 = PickleDataNode("abc", Scope.SCENARIO)
  73. task = Task("qux", {}, print, [dn_1])
  74. scenario = Scenario("quux", {task}, {}, {dn_2}, sequences={"acb": {"tasks": [task]}})
  75. sequence = scenario.sequences["acb"]
  76. assert scenario.id is not None
  77. assert scenario.config_id == "quux"
  78. assert len(scenario.tasks) == 1
  79. assert len(scenario.additional_data_nodes) == 1
  80. assert len(scenario.data_nodes) == 2
  81. assert len(scenario.sequences) == 1
  82. assert scenario.qux == task
  83. assert scenario.xyz == dn_1
  84. assert scenario.abc == dn_2
  85. assert scenario.acb == sequence
  86. assert scenario.properties == {}
  87. assert scenario.tags == set()
  88. def test_create_scenario_invalid_config_id():
  89. with pytest.raises(InvalidConfigurationId):
  90. Scenario("foo bar", set(), {})
  91. def test_create_scenario_and_add_sequences():
  92. input_1 = PickleDataNode("input_1", Scope.SCENARIO)
  93. output_1 = PickleDataNode("output_1", Scope.SCENARIO)
  94. output_2 = PickleDataNode("output_2", Scope.SCENARIO)
  95. additional_dn_1 = PickleDataNode("additional_1", Scope.SCENARIO)
  96. additional_dn_2 = PickleDataNode("additional_2", Scope.SCENARIO)
  97. task_1 = Task("task_1", {}, print, [input_1], [output_1], TaskId("task_id_1"))
  98. task_2 = Task("task_2", {}, print, [output_1], [output_2], TaskId("task_id_2"))
  99. data_manager = _DataManagerFactory._build_manager()
  100. task_manager = _TaskManagerFactory._build_manager()
  101. data_manager._set(input_1)
  102. data_manager._set(output_1)
  103. data_manager._set(output_2)
  104. data_manager._set(additional_dn_1)
  105. data_manager._set(additional_dn_2)
  106. task_manager._set(task_1)
  107. task_manager._set(task_2)
  108. scenario = Scenario("scenario", {task_1}, {})
  109. scenario.sequences = {"sequence_1": {"tasks": [task_1]}, "sequence_2": {"tasks": []}}
  110. assert scenario.id is not None
  111. assert scenario.config_id == "scenario"
  112. assert len(scenario.tasks) == 1
  113. assert scenario.tasks.keys() == {task_1.config_id}
  114. assert len(scenario.additional_data_nodes) == 0
  115. assert scenario.additional_data_nodes == {}
  116. assert len(scenario.data_nodes) == 2
  117. assert scenario.data_nodes == {
  118. input_1.config_id: input_1,
  119. output_1.config_id: output_1,
  120. }
  121. assert len(scenario.sequences) == 2
  122. assert scenario.sequence_1 == scenario.sequences["sequence_1"]
  123. assert scenario.sequence_2 == scenario.sequences["sequence_2"]
  124. assert scenario.sequences == {"sequence_1": scenario.sequence_1, "sequence_2": scenario.sequence_2}
  125. def test_create_scenario_overlapping_sequences():
  126. input_1 = PickleDataNode("input_1", Scope.SCENARIO)
  127. output_1 = PickleDataNode("output_1", Scope.SCENARIO)
  128. output_2 = PickleDataNode("output_2", Scope.SCENARIO)
  129. additional_dn_1 = PickleDataNode("additional_1", Scope.SCENARIO)
  130. additional_dn_2 = PickleDataNode("additional_2", Scope.SCENARIO)
  131. task_1 = Task("task_1", {}, print, [input_1], [output_1], TaskId("task_id_1"))
  132. task_2 = Task("task_2", {}, print, [output_1], [output_2], TaskId("task_id_2"))
  133. data_manager = _DataManagerFactory._build_manager()
  134. task_manager = _TaskManagerFactory._build_manager()
  135. data_manager._set(input_1)
  136. data_manager._set(output_1)
  137. data_manager._set(output_2)
  138. data_manager._set(additional_dn_1)
  139. data_manager._set(additional_dn_2)
  140. task_manager._set(task_1)
  141. task_manager._set(task_2)
  142. scenario = Scenario("scenario", {task_1, task_2}, {})
  143. scenario.add_sequence("sequence_1", [task_1])
  144. scenario.add_sequence("sequence_2", [task_1, task_2])
  145. assert scenario.id is not None
  146. assert scenario.config_id == "scenario"
  147. assert len(scenario.tasks) == 2
  148. assert scenario.tasks.keys() == {task_1.config_id, task_2.config_id}
  149. assert len(scenario.additional_data_nodes) == 0
  150. assert scenario.additional_data_nodes == {}
  151. assert len(scenario.data_nodes) == 3
  152. assert scenario.data_nodes == {
  153. input_1.config_id: input_1,
  154. output_1.config_id: output_1,
  155. output_2.config_id: output_2,
  156. }
  157. sequence_1 = scenario.sequences["sequence_1"]
  158. sequence_2 = scenario.sequences["sequence_2"]
  159. assert scenario.sequences == {"sequence_1": sequence_1, "sequence_2": sequence_2}
  160. scenario.remove_sequences(["sequence_2"])
  161. assert scenario.sequences == {"sequence_1": sequence_1}
  162. scenario.remove_sequences(["sequence_1"])
  163. assert scenario.sequences == {}
  164. def test_create_scenario_one_additional_dn():
  165. input_1 = PickleDataNode("input_1", Scope.SCENARIO)
  166. input_2 = PickleDataNode("input_2", Scope.SCENARIO)
  167. output_1 = PickleDataNode("output_1", Scope.SCENARIO)
  168. output_2 = PickleDataNode("output_2", Scope.SCENARIO)
  169. additional_dn_1 = PickleDataNode("additional_1", Scope.SCENARIO)
  170. additional_dn_2 = PickleDataNode("additional_2", Scope.SCENARIO)
  171. task_1 = Task("task_1", {}, print, [input_1], [output_1], TaskId("task_id_1"))
  172. task_2 = Task("task_2", {}, print, [input_2], [output_2], TaskId("task_id_2"))
  173. data_manager = _DataManagerFactory._build_manager()
  174. task_manager = _TaskManagerFactory._build_manager()
  175. data_manager._set(input_1)
  176. data_manager._set(output_1)
  177. data_manager._set(input_2)
  178. data_manager._set(output_2)
  179. data_manager._set(additional_dn_1)
  180. data_manager._set(additional_dn_2)
  181. task_manager._set(task_1)
  182. task_manager._set(task_2)
  183. scenario = Scenario("scenario", set(), {}, {additional_dn_1})
  184. assert scenario.id is not None
  185. assert scenario.config_id == "scenario"
  186. assert len(scenario.tasks) == 0
  187. assert len(scenario.additional_data_nodes) == 1
  188. assert len(scenario.data_nodes) == 1
  189. assert scenario.tasks == {}
  190. assert scenario.additional_data_nodes == {additional_dn_1.config_id: additional_dn_1}
  191. assert scenario.data_nodes == {additional_dn_1.config_id: additional_dn_1}
  192. def test_create_scenario_wth_additional_dns():
  193. input_1 = PickleDataNode("input_1", Scope.SCENARIO)
  194. input_2 = PickleDataNode("input_2", Scope.SCENARIO)
  195. output_1 = PickleDataNode("output_1", Scope.SCENARIO)
  196. output_2 = PickleDataNode("output_2", Scope.SCENARIO)
  197. additional_dn_1 = PickleDataNode("additional_1", Scope.SCENARIO)
  198. additional_dn_2 = PickleDataNode("additional_2", Scope.SCENARIO)
  199. task_1 = Task("task_1", {}, print, [input_1], [output_1], TaskId("task_id_1"))
  200. task_2 = Task("task_2", {}, print, [input_2], [output_2], TaskId("task_id_2"))
  201. data_manager = _DataManagerFactory._build_manager()
  202. task_manager = _TaskManagerFactory._build_manager()
  203. data_manager._set(input_1)
  204. data_manager._set(output_1)
  205. data_manager._set(input_2)
  206. data_manager._set(output_2)
  207. data_manager._set(additional_dn_1)
  208. data_manager._set(additional_dn_2)
  209. task_manager._set(task_1)
  210. task_manager._set(task_2)
  211. scenario = Scenario("scenario", set(), {}, {additional_dn_1, additional_dn_2})
  212. assert scenario.id is not None
  213. assert scenario.config_id == "scenario"
  214. assert len(scenario.tasks) == 0
  215. assert len(scenario.additional_data_nodes) == 2
  216. assert len(scenario.data_nodes) == 2
  217. assert scenario.tasks == {}
  218. assert scenario.additional_data_nodes == {
  219. additional_dn_1.config_id: additional_dn_1,
  220. additional_dn_2.config_id: additional_dn_2,
  221. }
  222. assert scenario.data_nodes == {
  223. additional_dn_1.config_id: additional_dn_1,
  224. additional_dn_2.config_id: additional_dn_2,
  225. }
  226. scenario_1 = Scenario("scenario_1", {task_1}, {}, {additional_dn_1})
  227. assert scenario_1.id is not None
  228. assert scenario_1.config_id == "scenario_1"
  229. assert len(scenario_1.tasks) == 1
  230. assert len(scenario_1.additional_data_nodes) == 1
  231. assert len(scenario_1.data_nodes) == 3
  232. assert scenario_1.tasks.keys() == {task_1.config_id}
  233. assert scenario_1.additional_data_nodes == {
  234. additional_dn_1.config_id: additional_dn_1,
  235. }
  236. assert scenario_1.data_nodes == {
  237. input_1.config_id: input_1,
  238. output_1.config_id: output_1,
  239. additional_dn_1.config_id: additional_dn_1,
  240. }
  241. scenario_2 = Scenario("scenario_2", {task_1, task_2}, {}, {additional_dn_1, additional_dn_2})
  242. assert scenario_2.id is not None
  243. assert scenario_2.config_id == "scenario_2"
  244. assert len(scenario_2.tasks) == 2
  245. assert len(scenario_2.additional_data_nodes) == 2
  246. assert len(scenario_2.data_nodes) == 6
  247. assert scenario_2.tasks.keys() == {task_1.config_id, task_2.config_id}
  248. assert scenario_2.additional_data_nodes == {
  249. additional_dn_1.config_id: additional_dn_1,
  250. additional_dn_2.config_id: additional_dn_2,
  251. }
  252. assert {dn_config_id: dn.id for dn_config_id, dn in scenario_2.data_nodes.items()} == {
  253. input_1.config_id: input_1.id,
  254. output_1.config_id: output_1.id,
  255. input_2.config_id: input_2.id,
  256. output_2.config_id: output_2.id,
  257. additional_dn_1.config_id: additional_dn_1.id,
  258. additional_dn_2.config_id: additional_dn_2.id,
  259. }
  260. def test_raise_sequence_tasks_not_in_scenario(data_node):
  261. task_1 = Task("task_1", {}, print, output=[data_node])
  262. task_2 = Task("task_2", {}, print, input=[data_node])
  263. with pytest.raises(SequenceTaskDoesNotExistInScenario) as err:
  264. Scenario("scenario", set(), {}, sequences={"sequence": {"tasks": [task_1]}}, scenario_id="SCENARIO_scenario")
  265. assert err.value.args == ([task_1.id], "sequence", "SCENARIO_scenario")
  266. with pytest.raises(SequenceTaskDoesNotExistInScenario) as err:
  267. Scenario(
  268. "scenario",
  269. [task_1],
  270. {},
  271. sequences={"sequence": {"tasks": [task_1, task_2]}},
  272. scenario_id="SCENARIO_scenario",
  273. )
  274. assert err.value.args == ([task_2.id], "sequence", "SCENARIO_scenario")
  275. Scenario("scenario", {task_1}, {}, sequences={"sequence": {"tasks": [task_1]}})
  276. Scenario(
  277. "scenario",
  278. [task_1, task_2],
  279. {},
  280. sequences={"sequence_1": {"tasks": [task_1]}, "sequence_2": {"tasks": [task_1, task_2]}},
  281. )
  282. def test_adding_sequence_raises_tasks_not_in_scenario(data_node):
  283. task_1 = Task("task_1", {}, print, output=[data_node])
  284. task_2 = Task("task_2", {}, print, input=[data_node])
  285. scenario = Scenario("scenario", [task_1], {})
  286. scenario_manager = _ScenarioManagerFactory._build_manager()
  287. task_manager = _TaskManagerFactory._build_manager()
  288. scenario_manager._set(scenario)
  289. task_manager._set(task_1)
  290. task_manager._set(task_2)
  291. scenario.add_sequences({"sequence_1": {}})
  292. with pytest.raises(SequenceTaskDoesNotExistInScenario) as err:
  293. scenario.add_sequence("sequence_2", [task_2])
  294. assert err.value.args == ([task_2.id], "sequence_2", scenario.id)
  295. scenario.add_sequence("sequence_3", [task_1])
  296. with pytest.raises(SequenceTaskDoesNotExistInScenario) as err:
  297. scenario.add_sequences({"sequence_4": [task_2]})
  298. assert err.value.args == ([task_2.id], "sequence_4", scenario.id)
  299. with pytest.raises(SequenceTaskDoesNotExistInScenario) as err:
  300. scenario.add_sequences({"sequence_5": [task_1, task_2]})
  301. assert err.value.args == ([task_2.id], "sequence_5", scenario.id)
  302. scenario.tasks = [task_1, task_2]
  303. scenario.add_sequence("sequence_6", [task_1, task_2])
  304. def test_adding_existing_sequence_raises_exception(data_node):
  305. task_1 = Task("task_1", {}, print, output=[data_node])
  306. _TaskManagerFactory._build_manager()._set(task_1)
  307. task_2 = Task("task_2", {}, print, input=[data_node])
  308. _TaskManagerFactory._build_manager()._set(task_2)
  309. scenario = Scenario("scenario", tasks={task_1, task_2}, properties={})
  310. _ScenarioManagerFactory._build_manager()._set(scenario)
  311. scenario.add_sequence("sequence_1", [task_1])
  312. with pytest.raises(SequenceAlreadyExists):
  313. scenario.add_sequence("sequence_1", [task_2])
  314. def test_renaming_existing_sequence_raises_exception(data_node):
  315. task_1 = Task("task_1", {}, print, output=[data_node])
  316. _TaskManagerFactory._build_manager()._set(task_1)
  317. task_2 = Task("task_2", {}, print, input=[data_node])
  318. _TaskManagerFactory._build_manager()._set(task_2)
  319. scenario = Scenario("scenario", {task_1, task_2}, {})
  320. _ScenarioManagerFactory._build_manager()._set(scenario)
  321. scenario.add_sequence("sequence_1", [task_1])
  322. scenario.add_sequence("sequence_2", [task_2])
  323. with pytest.raises(SequenceAlreadyExists) as err:
  324. scenario.rename_sequence("sequence_1", "sequence_2")
  325. def test_add_rename_and_remove_sequences():
  326. data_node_1 = InMemoryDataNode("foo", Scope.SCENARIO, "s1")
  327. data_node_2 = InMemoryDataNode("bar", Scope.SCENARIO, "s2")
  328. data_node_3 = InMemoryDataNode("qux", Scope.SCENARIO, "s3")
  329. data_node_4 = InMemoryDataNode("quux", Scope.SCENARIO, "s4")
  330. data_node_5 = InMemoryDataNode("quuz", Scope.SCENARIO, "s5")
  331. task_1 = Task("grault",{}, print,[data_node_1, data_node_2],[data_node_3], TaskId("t1"))
  332. task_2 = Task("garply", {}, print, [data_node_3], id=TaskId("t2"))
  333. task_3 = Task("waldo", {}, print, [data_node_3], None, id=TaskId("t3"))
  334. task_4 = Task("fred", {}, print, [data_node_3], [data_node_4], TaskId("t4"))
  335. task_5 = Task("bob", {}, print, [data_node_5], [data_node_3], TaskId("t5"))
  336. scenario = Scenario("quest", {task_1, task_2, task_3, task_4, task_5}, {}, [], scenario_id=ScenarioId("s1"))
  337. sequence_1 = Sequence({"name": "seq_1"}, [task_1], SequenceId(f"SEQUENCE_seq_1_{scenario.id}"))
  338. sequence_2 = Sequence({"name": "seq_2"}, [task_1, task_2], SequenceId(f"SEQUENCE_seq_2_{scenario.id}"))
  339. new_seq_2 = Sequence({"name": "seq_2"}, [task_1, task_2], SequenceId(f"SEQUENCE_new_seq_2_{scenario.id}"))
  340. sequence_3 = Sequence({"name": "seq_3"}, [task_1, task_5, task_3], SequenceId(f"SEQUENCE_seq_3_{scenario.id}"))
  341. task_manager = _TaskManagerFactory._build_manager()
  342. data_manager = _DataManagerFactory._build_manager()
  343. scenario_manager = _ScenarioManagerFactory._build_manager()
  344. for dn in [data_node_1, data_node_2, data_node_3, data_node_4, data_node_5]:
  345. data_manager._set(dn)
  346. for t in [task_1, task_2, task_3, task_4, task_5]:
  347. task_manager._set(t)
  348. scenario_manager._set(scenario)
  349. assert scenario.get_inputs() == {data_node_1, data_node_2, data_node_5}
  350. assert scenario._get_set_of_tasks() == {task_1, task_2, task_3, task_4, task_5}
  351. assert len(scenario.sequences) == 0
  352. scenario.sequences = {"seq_1": {"tasks": [task_1]}}
  353. assert scenario.sequences == {"seq_1": sequence_1}
  354. scenario.add_sequences({"seq_2": [task_1, task_2]})
  355. assert scenario.sequences == {"seq_1": sequence_1, "seq_2": sequence_2}
  356. scenario.remove_sequences(["seq_1"])
  357. assert scenario.sequences == {"seq_2": sequence_2}
  358. scenario.add_sequences({"seq_1": [task_1], "seq 3": [task_1, task_5, task_3]})
  359. assert scenario.sequences == {"seq_2": sequence_2, "seq_1": sequence_1, "seq 3": sequence_3}
  360. scenario.remove_sequences(["seq_2", "seq 3"])
  361. assert scenario.sequences == {"seq_1": sequence_1}
  362. scenario.add_sequence("seq_2", [task_1, task_2])
  363. assert scenario.sequences == {"seq_1": sequence_1, "seq_2": sequence_2}
  364. scenario.add_sequence("seq 3", [task_1.id, task_5.id, task_3.id])
  365. assert scenario.sequences == {"seq_1": sequence_1, "seq_2": sequence_2, "seq 3": sequence_3}
  366. scenario.remove_sequence("seq_1")
  367. assert scenario.sequences == {"seq_2": sequence_2, "seq 3": sequence_3}
  368. scenario.rename_sequence("seq_2", "new_seq_2")
  369. assert scenario.sequences == {"new_seq_2": new_seq_2, "seq 3": sequence_3}
  370. def test_update_sequence(data_node):
  371. task_1 = Task("foo",{}, print,[data_node],[], TaskId("t1"))
  372. task_2 = Task("bar", {}, print, [], [data_node], id=TaskId("t2"))
  373. scenario = Scenario("baz", {task_1, task_2}, {})
  374. scenario.add_sequence("seq_1", [task_1])
  375. assert len(scenario.sequences) == 1
  376. assert scenario.sequences["seq_1"].tasks == {"foo": task_1}
  377. assert scenario.sequences["seq_1"].name == "seq_1"
  378. scenario.update_sequence("seq_1", [task_2], {"new_key": "new_value"}, [])
  379. assert len(scenario.sequences) == 1
  380. assert scenario.sequences["seq_1"].tasks == {"bar": task_2}
  381. assert scenario.sequences["seq_1"].name == "seq_1"
  382. assert scenario.sequences["seq_1"].properties["new_key"] == "new_value"
  383. def test_add_property_to_scenario():
  384. scenario = Scenario("foo", set(), {"key": "value"})
  385. assert scenario.properties == {"key": "value"}
  386. assert scenario.key == "value"
  387. scenario.properties["new_key"] = "new_value"
  388. assert scenario.properties == {"key": "value", "new_key": "new_value"}
  389. assert scenario.key == "value"
  390. assert scenario.new_key == "new_value"
  391. def test_add_cycle_to_scenario(cycle):
  392. scenario = Scenario("foo", set(), {})
  393. assert scenario.cycle is None
  394. _CycleManagerFactory._build_manager()._set(cycle)
  395. scenario.cycle = cycle
  396. assert scenario.cycle == cycle
  397. def test_add_and_remove_subscriber():
  398. scenario = Scenario("foo", set(), {})
  399. scenario._add_subscriber(print)
  400. assert len(scenario.subscribers) == 1
  401. scenario._remove_subscriber(print)
  402. assert len(scenario.subscribers) == 0
  403. def test_add_and_remove_tag():
  404. scenario = Scenario("foo", set(), {})
  405. assert len(scenario.tags) == 0
  406. scenario._add_tag("tag")
  407. assert len(scenario.tags) == 1
  408. scenario._remove_tag("tag")
  409. assert len(scenario.tags) == 0
  410. def test_auto_set_and_reload(cycle, current_datetime, task, data_node):
  411. scenario_1 = Scenario(
  412. "foo",
  413. set(),
  414. {"name": "bar"},
  415. set(),
  416. creation_date=current_datetime,
  417. is_primary=True,
  418. cycle=None,
  419. )
  420. additional_dn = InMemoryDataNode("additional_dn", Scope.SCENARIO)
  421. example_date = datetime.fromisoformat("2021-11-11T11:11:01.000001")
  422. tmp_cycle = Cycle(
  423. Frequency.WEEKLY,
  424. {},
  425. creation_date=example_date,
  426. start_date=example_date,
  427. end_date=example_date,
  428. name="cc",
  429. id=CycleId("tmp_cc_id"),
  430. )
  431. sequence_1_name = "sequence_1"
  432. sequence_1 = Sequence({}, [], SequenceId(f"SEQUENCE_{sequence_1_name}_{scenario_1.id}"))
  433. tmp_sequence_name = "tmp_sequence"
  434. tmp_sequence = Sequence(
  435. {},
  436. [],
  437. SequenceId(f"SEQUENCE_{tmp_sequence_name}_{scenario_1.id}"),
  438. )
  439. _TaskManagerFactory._build_manager()._set(task)
  440. _DataManagerFactory._build_manager()._set(data_node)
  441. _DataManagerFactory._build_manager()._set(additional_dn)
  442. _CycleManagerFactory._build_manager()._set(cycle)
  443. scenario_manager = _ScenarioManagerFactory._build_manager()
  444. cycle_manager = _CycleManagerFactory._build_manager()
  445. cycle_manager._set(cycle)
  446. cycle_manager._set(tmp_cycle)
  447. scenario_manager._set(scenario_1)
  448. scenario_2 = scenario_manager._get(scenario_1)
  449. assert scenario_1.config_id == "foo"
  450. assert scenario_2.config_id == "foo"
  451. # auto set & reload on name attribute
  452. assert scenario_1.name == "bar"
  453. assert scenario_2.name == "bar"
  454. scenario_1.name = "zab"
  455. assert scenario_1.name == "zab"
  456. assert scenario_2.name == "zab"
  457. scenario_2.name = "baz"
  458. assert scenario_1.name == "baz"
  459. assert scenario_2.name == "baz"
  460. # auto set & reload on sequences attribute
  461. assert len(scenario_1.sequences) == 0
  462. assert len(scenario_2.sequences) == 0
  463. scenario_1.sequences = {tmp_sequence_name: {}}
  464. assert len(scenario_1.sequences) == 1
  465. assert scenario_1.sequences[tmp_sequence_name] == tmp_sequence
  466. assert len(scenario_2.sequences) == 1
  467. assert scenario_2.sequences[tmp_sequence_name] == tmp_sequence
  468. scenario_2.add_sequences({sequence_1_name: []})
  469. assert len(scenario_1.sequences) == 2
  470. assert scenario_1.sequences == {sequence_1_name: sequence_1, tmp_sequence_name: tmp_sequence}
  471. assert len(scenario_2.sequences) == 2
  472. assert scenario_2.sequences == {sequence_1_name: sequence_1, tmp_sequence_name: tmp_sequence}
  473. scenario_2.remove_sequences([tmp_sequence_name])
  474. assert len(scenario_1.sequences) == 1
  475. assert scenario_1.sequences == {sequence_1_name: sequence_1}
  476. assert len(scenario_2.sequences) == 1
  477. assert scenario_2.sequences == {sequence_1_name: sequence_1}
  478. assert len(scenario_1.tasks) == 0
  479. assert len(scenario_1.data_nodes) == 0
  480. scenario_1.tasks = {task}
  481. assert len(scenario_1.tasks) == 1
  482. assert scenario_1.tasks[task.config_id] == task
  483. assert len(scenario_1.data_nodes) == 2
  484. assert len(scenario_2.tasks) == 1
  485. assert scenario_2.tasks[task.config_id] == task
  486. assert len(scenario_2.data_nodes) == 2
  487. assert len(scenario_1.additional_data_nodes) == 0
  488. scenario_1.additional_data_nodes = {additional_dn}
  489. assert len(scenario_1.additional_data_nodes) == 1
  490. assert scenario_1.additional_data_nodes[additional_dn.config_id] == additional_dn
  491. assert len(scenario_1.data_nodes) == 3
  492. assert len(scenario_2.additional_data_nodes) == 1
  493. assert scenario_2.additional_data_nodes[additional_dn.config_id] == additional_dn
  494. assert len(scenario_2.data_nodes) == 3
  495. new_datetime = current_datetime + timedelta(1)
  496. new_datetime_1 = current_datetime + timedelta(2)
  497. # auto set & reload on name attribute
  498. assert scenario_1.creation_date == current_datetime
  499. assert scenario_2.creation_date == current_datetime
  500. scenario_1.creation_date = new_datetime_1
  501. assert scenario_1.creation_date == new_datetime_1
  502. assert scenario_2.creation_date == new_datetime_1
  503. scenario_2.creation_date = new_datetime
  504. assert scenario_1.creation_date == new_datetime
  505. assert scenario_2.creation_date == new_datetime
  506. # auto set & reload on cycle attribute
  507. assert scenario_1.cycle is None
  508. assert scenario_2.cycle is None
  509. scenario_1.cycle = tmp_cycle
  510. assert scenario_1.cycle == tmp_cycle
  511. assert scenario_2.cycle == tmp_cycle
  512. scenario_2.cycle = cycle
  513. assert scenario_1.cycle == cycle
  514. assert scenario_2.cycle == cycle
  515. # auto set & reload on is_primary attribute
  516. assert scenario_1.is_primary
  517. assert scenario_2.is_primary
  518. scenario_1.is_primary = False
  519. assert not scenario_1.is_primary
  520. assert not scenario_2.is_primary
  521. scenario_2.is_primary = True
  522. assert scenario_1.is_primary
  523. assert scenario_2.is_primary
  524. # auto set & reload on subscribers attribute
  525. assert len(scenario_1.subscribers) == 0
  526. assert len(scenario_2.subscribers) == 0
  527. scenario_1.subscribers.append(_Subscriber(print, []))
  528. assert len(scenario_1.subscribers) == 1
  529. assert len(scenario_2.subscribers) == 1
  530. scenario_2.subscribers.append(_Subscriber(print, []))
  531. assert len(scenario_1.subscribers) == 2
  532. assert len(scenario_2.subscribers) == 2
  533. scenario_1.subscribers.clear()
  534. assert len(scenario_1.subscribers) == 0
  535. assert len(scenario_2.subscribers) == 0
  536. scenario_1.subscribers.extend([_Subscriber(print, []), _Subscriber(map, [])])
  537. assert len(scenario_1.subscribers) == 2
  538. assert len(scenario_2.subscribers) == 2
  539. scenario_1.subscribers.remove(_Subscriber(print, []))
  540. assert len(scenario_1.subscribers) == 1
  541. assert len(scenario_2.subscribers) == 1
  542. scenario_1.subscribers + print + len
  543. assert len(scenario_1.subscribers) == 3
  544. assert len(scenario_2.subscribers) == 3
  545. scenario_1.subscribers = []
  546. assert len(scenario_1.subscribers) == 0
  547. assert len(scenario_2.subscribers) == 0
  548. assert len(scenario_1.tags) == 0
  549. scenario_1.tags = {"hi"}
  550. assert len(scenario_1.tags) == 1
  551. assert len(scenario_2.tags) == 1
  552. with scenario_1 as scenario:
  553. assert scenario.config_id == "foo"
  554. assert len(scenario.tasks) == 1
  555. assert len(scenario.sequences) == 1
  556. assert scenario.sequences["sequence_1"] == sequence_1
  557. assert scenario.tasks[task.config_id] == task
  558. assert len(scenario.additional_data_nodes) == 1
  559. assert scenario.additional_data_nodes[additional_dn.config_id] == additional_dn
  560. assert scenario.creation_date == new_datetime
  561. assert scenario.cycle == cycle
  562. assert scenario.is_primary
  563. assert len(scenario.subscribers) == 0
  564. assert len(scenario.tags) == 1
  565. assert scenario._is_in_context
  566. assert scenario.name == "baz"
  567. new_datetime_2 = new_datetime + timedelta(5)
  568. scenario._config_id = "foo"
  569. scenario.tasks = set()
  570. scenario.additional_data_nodes = set()
  571. scenario.remove_sequences([sequence_1_name])
  572. scenario.creation_date = new_datetime_2
  573. scenario.cycle = None
  574. scenario.is_primary = False
  575. scenario.subscribers = [print]
  576. scenario.tags = None
  577. scenario.name = "qux"
  578. assert scenario.config_id == "foo"
  579. assert len(scenario.sequences) == 1
  580. assert scenario.sequences[sequence_1_name] == sequence_1
  581. assert len(scenario.tasks) == 1
  582. assert scenario.tasks[task.config_id] == task
  583. assert len(scenario.additional_data_nodes) == 1
  584. assert scenario.additional_data_nodes[additional_dn.config_id] == additional_dn
  585. assert scenario.creation_date == new_datetime
  586. assert scenario.cycle == cycle
  587. assert scenario.is_primary
  588. assert len(scenario.subscribers) == 0
  589. assert len(scenario.tags) == 1
  590. assert scenario._is_in_context
  591. assert scenario.name == "baz"
  592. assert scenario_1.config_id == "foo"
  593. assert len(scenario_1.sequences) == 0
  594. assert len(scenario_1.tasks) == 0
  595. assert len(scenario_1.additional_data_nodes) == 0
  596. assert scenario_1.tasks == {}
  597. assert scenario_1.additional_data_nodes == {}
  598. assert scenario_1.creation_date == new_datetime_2
  599. assert scenario_1.cycle is None
  600. assert not scenario_1.is_primary
  601. assert len(scenario_1.subscribers) == 1
  602. assert len(scenario_1.tags) == 0
  603. assert not scenario_1._is_in_context
  604. def test_auto_set_and_reload_properties():
  605. scenario_1 = Scenario(
  606. "foo",
  607. set(),
  608. {"name": "baz"},
  609. )
  610. scenario_manager = _ScenarioManagerFactory._build_manager()
  611. scenario_manager._set(scenario_1)
  612. scenario_2 = scenario_manager._get(scenario_1)
  613. # auto set & reload on properties attribute
  614. assert scenario_1.properties == {"name": "baz"}
  615. assert scenario_2.properties == {"name": "baz"}
  616. scenario_1._properties["qux"] = 4
  617. assert scenario_1.properties["qux"] == 4
  618. assert scenario_2.properties["qux"] == 4
  619. assert scenario_1.properties == {"name": "baz", "qux": 4}
  620. assert scenario_2.properties == {"name": "baz", "qux": 4}
  621. scenario_2._properties["qux"] = 5
  622. assert scenario_1.properties["qux"] == 5
  623. assert scenario_2.properties["qux"] == 5
  624. scenario_1.properties["temp_key_1"] = "temp_value_1"
  625. scenario_1.properties["temp_key_2"] = "temp_value_2"
  626. assert scenario_1.properties == {
  627. "name": "baz",
  628. "qux": 5,
  629. "temp_key_1": "temp_value_1",
  630. "temp_key_2": "temp_value_2",
  631. }
  632. assert scenario_2.properties == {
  633. "name": "baz",
  634. "qux": 5,
  635. "temp_key_1": "temp_value_1",
  636. "temp_key_2": "temp_value_2",
  637. }
  638. scenario_1.properties.pop("temp_key_1")
  639. assert "temp_key_1" not in scenario_1.properties.keys()
  640. assert "temp_key_1" not in scenario_1.properties.keys()
  641. assert scenario_1.properties == {
  642. "name": "baz",
  643. "qux": 5,
  644. "temp_key_2": "temp_value_2",
  645. }
  646. assert scenario_2.properties == {
  647. "name": "baz",
  648. "qux": 5,
  649. "temp_key_2": "temp_value_2",
  650. }
  651. scenario_2.properties.pop("temp_key_2")
  652. assert scenario_1.properties == {"name": "baz", "qux": 5}
  653. assert scenario_2.properties == {"name": "baz", "qux": 5}
  654. assert "temp_key_2" not in scenario_1.properties.keys()
  655. assert "temp_key_2" not in scenario_2.properties.keys()
  656. scenario_1.properties["temp_key_3"] = 0
  657. assert scenario_1.properties == {"name": "baz", "qux": 5, "temp_key_3": 0}
  658. assert scenario_2.properties == {"name": "baz", "qux": 5, "temp_key_3": 0}
  659. scenario_1.properties.update({"temp_key_3": 1})
  660. assert scenario_1.properties == {"name": "baz", "qux": 5, "temp_key_3": 1}
  661. assert scenario_2.properties == {"name": "baz", "qux": 5, "temp_key_3": 1}
  662. scenario_1.properties.update(dict())
  663. assert scenario_1.properties == {"name": "baz", "qux": 5, "temp_key_3": 1}
  664. assert scenario_2.properties == {"name": "baz", "qux": 5, "temp_key_3": 1}
  665. scenario_1.properties["temp_key_4"] = 0
  666. scenario_1.properties["temp_key_5"] = 0
  667. with scenario_1 as scenario:
  668. assert scenario.properties["qux"] == 5
  669. assert scenario.properties["temp_key_3"] == 1
  670. assert scenario.properties["temp_key_4"] == 0
  671. assert scenario.properties["temp_key_5"] == 0
  672. scenario.properties["qux"] = 9
  673. scenario.properties.pop("temp_key_3")
  674. scenario.properties.pop("temp_key_4")
  675. scenario.properties.update({"temp_key_4": 1})
  676. scenario.properties.update({"temp_key_5": 2})
  677. scenario.properties.pop("temp_key_5")
  678. scenario.properties.update(dict())
  679. assert scenario._is_in_context
  680. assert scenario.properties["qux"] == 5
  681. assert scenario.properties["temp_key_3"] == 1
  682. assert scenario.properties["temp_key_4"] == 0
  683. assert scenario.properties["temp_key_5"] == 0
  684. assert not scenario_1._is_in_context
  685. assert scenario_1.properties["qux"] == 9
  686. assert "temp_key_3" not in scenario_1.properties.keys()
  687. assert scenario_1.properties["temp_key_4"] == 1
  688. assert "temp_key_5" not in scenario_1.properties.keys()
  689. def test_is_deletable():
  690. with mock.patch("taipy.core.scenario._scenario_manager._ScenarioManager._is_deletable") as mock_submit:
  691. scenario = Scenario("foo", set(), {})
  692. scenario.is_deletable()
  693. mock_submit.assert_called_once_with(scenario)
  694. def test_submit_scenario():
  695. with mock.patch("taipy.core.scenario._scenario_manager._ScenarioManager._submit") as mock_submit:
  696. scenario = Scenario("foo", set(), {})
  697. scenario.submit(force=False)
  698. mock_submit.assert_called_once_with(scenario, None, False, False, None)
  699. def test_subscribe_scenario():
  700. with mock.patch("taipy.core.subscribe_scenario") as mock_subscribe:
  701. scenario = Scenario("foo", set(), {})
  702. scenario.subscribe(None)
  703. mock_subscribe.assert_called_once_with(None, None, scenario)
  704. def test_unsubscribe_scenario():
  705. with mock.patch("taipy.core.unsubscribe_scenario") as mock_unsubscribe:
  706. scenario = Scenario("foo", set(), {})
  707. scenario.unsubscribe(None)
  708. mock_unsubscribe.assert_called_once_with(None, None, scenario)
  709. def test_add_tag_scenario():
  710. with mock.patch("taipy.core.tag") as mock_add_tag:
  711. scenario = Scenario("foo", set(), {})
  712. scenario.add_tag("tag")
  713. mock_add_tag.assert_called_once_with(scenario, "tag")
  714. def test_remove_tag_scenario():
  715. with mock.patch("taipy.core.untag") as mock_remove_tag:
  716. scenario = Scenario("foo", set(), {})
  717. scenario.remove_tag("tag")
  718. mock_remove_tag.assert_called_once_with(scenario, "tag")
  719. def test_get_inputs_outputs_intermediate_data_nodes():
  720. data_node_1 = DataNode("foo", Scope.SCENARIO, "s1")
  721. data_node_2 = DataNode("bar", Scope.SCENARIO, "s2")
  722. data_node_3 = DataNode("baz", Scope.SCENARIO, "s3")
  723. data_node_4 = DataNode("qux", Scope.SCENARIO, "s4")
  724. data_node_5 = DataNode("quux", Scope.SCENARIO, "s5")
  725. data_node_6 = DataNode("quuz", Scope.SCENARIO, "s6")
  726. data_node_7 = DataNode("corge", Scope.SCENARIO, "s7")
  727. task_1 = Task("grault", {}, print, [data_node_1, data_node_2], [data_node_3, data_node_4], TaskId("t1"))
  728. task_2 = Task("garply", {}, print, [data_node_3], [data_node_5], TaskId("t2"))
  729. task_3 = Task("waldo", {}, print, [data_node_5, data_node_4], [data_node_6], TaskId("t3"))
  730. task_4 = Task("fred", {}, print, [data_node_4], [data_node_7], TaskId("t4"))
  731. scenario = Scenario("scenario", {task_1, task_2, task_3, task_4}, {}, set(), ScenarioId("s1"))
  732. # s1 --- ---> s3 ---> t2 ---> s5 ----
  733. # | | |
  734. # |---> t1 ---| -------------------------> t3 ---> s6
  735. # | | |
  736. # s2 --- ---> s4 ---> t4 ---> s7
  737. assert scenario.get_inputs() == {data_node_1, data_node_2}
  738. assert scenario.get_outputs() == {data_node_6, data_node_7}
  739. assert scenario.get_intermediate() == {data_node_3, data_node_4, data_node_5}
  740. data_node_1 = DataNode("foo", Scope.SCENARIO, "s1")
  741. data_node_2 = DataNode("bar", Scope.SCENARIO, "s2")
  742. data_node_4 = DataNode("qux", Scope.SCENARIO, "s4")
  743. data_node_5 = DataNode("quux", Scope.SCENARIO, "s5")
  744. data_node_6 = DataNode("quuz", Scope.SCENARIO, "s6")
  745. data_node_7 = DataNode("corge", Scope.SCENARIO, "s7")
  746. task_1 = Task("grault", {}, print, [data_node_1, data_node_2], [data_node_4], TaskId("t1"))
  747. task_2 = Task("garply", {}, print, None, [data_node_5], TaskId("t2"))
  748. task_3 = Task("waldo", {}, print, [data_node_5, data_node_4], [data_node_6], TaskId("t3"))
  749. task_4 = Task("fred", {}, print, [data_node_4], [data_node_7], TaskId("t4"))
  750. scenario = Scenario("scenario", {task_1, task_2, task_3, task_4}, {}, set(), ScenarioId("s1"))
  751. # s1 --- t2 ---> s5 ------
  752. # | |
  753. # |---> t1 ---| -----> t3 ---> s6
  754. # | | |
  755. # s2 --- ---> s4 ---> t4 ---> s7
  756. assert scenario.get_inputs() == {data_node_1, data_node_2}
  757. assert scenario.get_outputs() == {data_node_6, data_node_7}
  758. assert scenario.get_intermediate() == {data_node_4, data_node_5}
  759. data_node_1 = DataNode("foo", Scope.SCENARIO, "s1")
  760. data_node_2 = DataNode("bar", Scope.SCENARIO, "s2")
  761. data_node_4 = DataNode("qux", Scope.SCENARIO, "s4")
  762. data_node_5 = DataNode("quux", Scope.SCENARIO, "s5")
  763. data_node_6 = DataNode("quuz", Scope.SCENARIO, "s6")
  764. data_node_7 = DataNode("corge", Scope.SCENARIO, "s7")
  765. data_node_8 = DataNode("d8", Scope.SCENARIO, "s8")
  766. data_node_9 = DataNode("d9", Scope.SCENARIO, "s9")
  767. task_1 = Task("grault", {}, print, [data_node_1, data_node_2], [data_node_4], TaskId("t1"))
  768. task_2 = Task("garply", {}, print, [data_node_6], [data_node_5], TaskId("t2"))
  769. task_3 = Task("waldo", {}, print, [data_node_5, data_node_4], id=TaskId("t3"))
  770. task_4 = Task("fred", {}, print, [data_node_4], [data_node_7], TaskId("t4"))
  771. task_5 = Task("t5", {}, print, [data_node_8], [data_node_9], TaskId("t5"))
  772. task_6 = Task("t6", {}, print, [data_node_7, data_node_9], id=TaskId("t6"))
  773. scenario = Scenario("scenario", {task_1, task_2, task_3, task_4, task_5, task_6}, {}, set(), ScenarioId("s1"))
  774. # s1 --- s6 ---> t2 ---> s5
  775. # | |
  776. # |---> t1 ---| -----> t3
  777. # | | |
  778. # s2 --- ---> s4 ---> t4 ---> s7 ---> t6
  779. # |
  780. # s8 -------> t5 -------> s9 ------------------
  781. assert scenario.get_inputs() == {data_node_1, data_node_2, data_node_6, data_node_8}
  782. assert scenario.get_outputs() == set()
  783. assert scenario.get_intermediate() == {data_node_5, data_node_4, data_node_7, data_node_9}
  784. data_node_1 = DataNode("foo", Scope.SCENARIO, "s1")
  785. data_node_2 = DataNode("bar", Scope.SCENARIO, "s2")
  786. data_node_4 = DataNode("qux", Scope.SCENARIO, "s4")
  787. data_node_5 = DataNode("quux", Scope.SCENARIO, "s5")
  788. data_node_6 = DataNode("quuz", Scope.SCENARIO, "s6")
  789. data_node_7 = DataNode("corge", Scope.SCENARIO, "s7")
  790. data_node_8 = DataNode("hugh", Scope.SCENARIO, "s8")
  791. task_1 = Task("grault", {}, print, [data_node_1, data_node_2], [data_node_4], TaskId("t1"))
  792. task_2 = Task("garply", {}, print, output=[data_node_5], id=TaskId("t2"))
  793. task_3 = Task("waldo", {}, print, [data_node_4], None, id=TaskId("t3"))
  794. task_4 = Task("fred", {}, print, [data_node_4, data_node_6], [data_node_7], TaskId("t4"))
  795. task_5 = Task("bob", {}, print, [data_node_8], None, TaskId("t5"))
  796. scenario = Scenario("scenario", {task_1, task_2, task_3, task_4, task_5}, {}, set(), ScenarioId("sc1"))
  797. # s1 ---
  798. # |
  799. # |---> t1 ---| -----> t3
  800. # | | |
  801. # s2 --- ---> s4 ---> t4 ---> s7
  802. # t2 ---> s5 |
  803. # s8 ---> t5 s6 --|
  804. assert scenario.get_inputs() == {data_node_1, data_node_2, data_node_8, data_node_6}
  805. assert scenario.get_outputs() == {data_node_5, data_node_7}
  806. assert scenario.get_intermediate() == {data_node_4}
  807. def test_is_ready_to_run():
  808. data_node_1 = PickleDataNode("foo", Scope.SCENARIO, "s1", properties={"default_data": 1})
  809. data_node_2 = PickleDataNode("bar", Scope.SCENARIO, "s2", properties={"default_data": 2})
  810. data_node_4 = PickleDataNode("qux", Scope.SCENARIO, "s4", properties={"default_data": 4})
  811. data_node_5 = PickleDataNode("quux", Scope.SCENARIO, "s5", properties={"default_data": 5})
  812. data_node_6 = PickleDataNode("quuz", Scope.SCENARIO, "s6", properties={"default_data": 6})
  813. data_node_7 = PickleDataNode("corge", Scope.SCENARIO, "s7", properties={"default_data": 7})
  814. data_node_8 = PickleDataNode("d8", Scope.SCENARIO, "s8", properties={"default_data": 8})
  815. data_node_9 = PickleDataNode("d9", Scope.SCENARIO, "s9", properties={"default_data": 9})
  816. task_1 = Task("grault", {}, print, [data_node_1, data_node_2], [data_node_4], TaskId("t1"))
  817. task_2 = Task("garply", {}, print, [data_node_6], [data_node_5], TaskId("t2"))
  818. task_3 = Task("waldo", {}, print, [data_node_5, data_node_4], id=TaskId("t3"))
  819. task_4 = Task("fred", {}, print, [data_node_4], [data_node_7], TaskId("t4"))
  820. task_5 = Task("t5", {}, print, [data_node_8], [data_node_9], TaskId("t5"))
  821. task_6 = Task("t6", {}, print, [data_node_7, data_node_9], id=TaskId("t6"))
  822. scenario = Scenario("scenario", {task_1, task_2, task_3, task_4, task_5, task_6}, {}, set(), ScenarioId("s1"))
  823. # s1 --- s6 ---> t2 ---> s5
  824. # | |
  825. # |---> t1 ---| -----> t3
  826. # | | |
  827. # s2 --- ---> s4 ---> t4 ---> s7 ---> t6
  828. # |
  829. # s8 -------> t5 -------> s9 ------------------
  830. assert scenario.get_inputs() == {data_node_1, data_node_2, data_node_6, data_node_8}
  831. data_manager = _DataManagerFactory._build_manager()
  832. data_manager._delete_all()
  833. for dn in [data_node_1, data_node_2, data_node_4, data_node_5, data_node_6, data_node_7, data_node_8, data_node_9]:
  834. data_manager._set(dn)
  835. assert scenario.is_ready_to_run()
  836. data_node_1.edit_in_progress = True
  837. assert not scenario.is_ready_to_run()
  838. data_node_2.edit_in_progress = True
  839. assert not scenario.is_ready_to_run()
  840. data_node_6.edit_in_progress = True
  841. data_node_8.edit_in_progress = True
  842. assert not scenario.is_ready_to_run()
  843. data_node_1.edit_in_progress = False
  844. data_node_2.edit_in_progress = False
  845. data_node_6.edit_in_progress = False
  846. data_node_8.edit_in_progress = False
  847. assert scenario.is_ready_to_run()
  848. def test_data_nodes_being_edited():
  849. data_node_1 = PickleDataNode("foo", Scope.SCENARIO, "s1", properties={"default_data": 1})
  850. data_node_2 = PickleDataNode("bar", Scope.SCENARIO, "s2", properties={"default_data": 2})
  851. data_node_4 = PickleDataNode("qux", Scope.SCENARIO, "s4", properties={"default_data": 4})
  852. data_node_5 = PickleDataNode("quux", Scope.SCENARIO, "s5", properties={"default_data": 5})
  853. data_node_6 = PickleDataNode("quuz", Scope.SCENARIO, "s6", properties={"default_data": 6})
  854. data_node_7 = PickleDataNode("corge", Scope.SCENARIO, "s7", properties={"default_data": 7})
  855. data_node_8 = PickleDataNode("d8", Scope.SCENARIO, "s8", properties={"default_data": 8})
  856. data_node_9 = PickleDataNode("d9", Scope.SCENARIO, "s9", properties={"default_data": 9})
  857. task_1 = Task("grault", {}, print, [data_node_1, data_node_2], [data_node_4], TaskId("t1"))
  858. task_2 = Task("garply", {}, print, [data_node_6], [data_node_5], TaskId("t2"))
  859. task_3 = Task("waldo", {}, print, [data_node_5, data_node_4], id=TaskId("t3"))
  860. task_4 = Task("fred", {}, print, [data_node_4], [data_node_7], TaskId("t4"))
  861. task_5 = Task("t5", {}, print, [data_node_8], [data_node_9], TaskId("t5"))
  862. task_6 = Task("t6", {}, print, [data_node_7, data_node_9], id=TaskId("t6"))
  863. scenario = Scenario("scenario", {task_1, task_2, task_3, task_4, task_5, task_6}, {}, set(), ScenarioId("s1"))
  864. # s1 --- s6 ---> t2 ---> s5
  865. # | |
  866. # |---> t1 ---| -----> t3
  867. # | | |
  868. # s2 --- ---> s4 ---> t4 ---> s7 ---> t6
  869. # |
  870. # s8 -------> t5 -------> s9 ------------------
  871. data_manager = _DataManagerFactory._build_manager()
  872. for dn in [data_node_1, data_node_2, data_node_4, data_node_5, data_node_6, data_node_7, data_node_8, data_node_9]:
  873. data_manager._set(dn)
  874. assert len(scenario.data_nodes_being_edited()) == 0
  875. assert scenario.data_nodes_being_edited() == set()
  876. data_node_1.edit_in_progress = True
  877. assert len(scenario.data_nodes_being_edited()) == 1
  878. assert scenario.data_nodes_being_edited() == {data_node_1}
  879. data_node_2.edit_in_progress = True
  880. data_node_6.edit_in_progress = True
  881. data_node_8.edit_in_progress = True
  882. assert len(scenario.data_nodes_being_edited()) == 4
  883. assert scenario.data_nodes_being_edited() == {data_node_1, data_node_2, data_node_6, data_node_8}
  884. data_node_4.edit_in_progress = True
  885. data_node_5.edit_in_progress = True
  886. data_node_9.edit_in_progress = True
  887. assert len(scenario.data_nodes_being_edited()) == 7
  888. assert scenario.data_nodes_being_edited() == {
  889. data_node_1,
  890. data_node_2,
  891. data_node_4,
  892. data_node_5,
  893. data_node_6,
  894. data_node_8,
  895. data_node_9,
  896. }
  897. data_node_1.edit_in_progress = False
  898. data_node_2.edit_in_progress = False
  899. data_node_6.edit_in_progress = False
  900. data_node_8.edit_in_progress = False
  901. assert len(scenario.data_nodes_being_edited()) == 3
  902. assert scenario.data_nodes_being_edited() == {data_node_4, data_node_5, data_node_9}
  903. data_node_4.edit_in_progress = False
  904. data_node_5.edit_in_progress = False
  905. data_node_7.edit_in_progress = True
  906. assert len(scenario.data_nodes_being_edited()) == 2
  907. assert scenario.data_nodes_being_edited() == {data_node_7, data_node_9}
  908. data_node_7.edit_in_progress = False
  909. data_node_9.edit_in_progress = False
  910. assert len(scenario.data_nodes_being_edited()) == 0
  911. assert scenario.data_nodes_being_edited() == set()
  912. def test_get_tasks():
  913. task_1 = Task("grault", {}, print, id=TaskId("t1"))
  914. task_2 = Task("garply", {}, print, id=TaskId("t2"))
  915. task_3 = Task("waldo", {}, print, id=TaskId("t3"))
  916. task_4 = Task("fred", {}, print, id=TaskId("t4"))
  917. scenario_1 = Scenario("scenario_1", {task_1, task_2, task_3, task_4}, {}, set(), ScenarioId("s1"))
  918. assert scenario_1.tasks == {"grault": task_1, "garply": task_2, "waldo": task_3, "fred": task_4}
  919. task_5 = Task("wallo", {}, print, id=TaskId("t5"))
  920. scenario_2 = Scenario("scenario_2", {task_1, task_2, task_3, task_4, task_5}, {}, set(), ScenarioId("s2"))
  921. assert scenario_2.tasks == {"grault": task_1, "garply": task_2, "waldo": task_3, "fred": task_4, "wallo": task_5}
  922. def test_get_set_of_tasks():
  923. task_1 = Task("grault", {}, print, id=TaskId("t1"))
  924. task_2 = Task("garply", {}, print, id=TaskId("t2"))
  925. task_3 = Task("waldo", {}, print, id=TaskId("t3"))
  926. task_4 = Task("fred", {}, print, id=TaskId("t4"))
  927. scenario_1 = Scenario("scenario_1", {task_1, task_2, task_3, task_4}, {}, set(), ScenarioId("s1"))
  928. assert scenario_1._get_set_of_tasks() == {task_1, task_2, task_3, task_4}
  929. task_5 = Task("wallo", {}, print, id=TaskId("t5"))
  930. scenario_2 = Scenario("scenario_2", {task_1, task_2, task_3, task_4, task_5}, {}, set(), ScenarioId("s2"))
  931. assert scenario_2._get_set_of_tasks() == {task_1, task_2, task_3, task_4, task_5}
  932. def test_get_sorted_tasks():
  933. def _assert_equal(tasks_a, tasks_b) -> bool:
  934. if len(tasks_a) != len(tasks_b):
  935. return False
  936. for i in range(len(tasks_a)):
  937. task_a, task_b = tasks_a[i], tasks_b[i]
  938. if isinstance(task_a, list) and isinstance(task_b, list):
  939. if not _assert_equal(task_a, task_b):
  940. return False
  941. elif isinstance(task_a, list) or isinstance(task_b, list):
  942. return False
  943. else:
  944. index_task_b = tasks_b.index(task_a)
  945. if any(isinstance(task_b, list) for task_b in tasks_b[i : index_task_b + 1]):
  946. return False
  947. return True
  948. # s1 --- ---> s3 ---> t2 ---> s5 ----
  949. # | | |
  950. # |---> t1 ---| -------------------------> t3 ---> s6
  951. # | | |
  952. # s2 --- ---> s4 ---> t4 ---> s7
  953. data_node_1 = InMemoryDataNode("foo", Scope.SCENARIO, "s1")
  954. data_node_2 = InMemoryDataNode("bar", Scope.SCENARIO, "s2")
  955. data_node_3 = InMemoryDataNode("baz", Scope.SCENARIO, "s3")
  956. data_node_4 = InMemoryDataNode("qux", Scope.SCENARIO, "s4")
  957. data_node_5 = InMemoryDataNode("quux", Scope.SCENARIO, "s5")
  958. data_node_6 = InMemoryDataNode("quuz", Scope.SCENARIO, "s6")
  959. data_node_7 = InMemoryDataNode("corge", Scope.SCENARIO, "s7")
  960. task_1 = Task("grault", {}, print, [data_node_1, data_node_2], [data_node_3, data_node_4], TaskId("t1"))
  961. task_2 = Task("garply", {}, print, [data_node_3], [data_node_5], TaskId("t2"))
  962. task_3 = Task("waldo", {}, print, [data_node_5, data_node_4], [data_node_6], TaskId("t3"))
  963. task_4 = Task("fred", {}, print, [data_node_4], [data_node_7], TaskId("t4"))
  964. scenario_1 = Scenario("scenario_1", {task_1, task_2, task_3, task_4}, {}, [], ScenarioId("s1"))
  965. assert scenario_1.get_inputs() == {data_node_1, data_node_2}
  966. assert scenario_1._get_set_of_tasks() == {task_1, task_2, task_3, task_4}
  967. _assert_equal(scenario_1._get_sorted_tasks(), [[task_1], [task_2, task_4], [task_3]])
  968. # s1 --- t2 ---> s5
  969. # | |
  970. # |---> t1 ---| -----> t3 ---> s6
  971. # | | |
  972. # s2 --- ---> s4 ---> t4 ---> s7
  973. data_node_1 = InMemoryDataNode("foo", Scope.SCENARIO, "s1")
  974. data_node_2 = InMemoryDataNode("bar", Scope.SCENARIO, "s2")
  975. data_node_4 = InMemoryDataNode("qux", Scope.SCENARIO, "s4")
  976. data_node_5 = InMemoryDataNode("quux", Scope.SCENARIO, "s5")
  977. data_node_6 = InMemoryDataNode("quuz", Scope.SCENARIO, "s6")
  978. data_node_7 = InMemoryDataNode("corge", Scope.SCENARIO, "s7")
  979. task_1 = Task("grault", {}, print, [data_node_1, data_node_2], [data_node_4], TaskId("t1"))
  980. task_2 = Task("garply", {}, print, None, [data_node_5], TaskId("t2"))
  981. task_3 = Task("waldo", {}, print, [data_node_5, data_node_4], [data_node_6], TaskId("t3"))
  982. task_4 = Task("fred", {}, print, [data_node_4], [data_node_7], TaskId("t4"))
  983. scenario_2 = Scenario("scenario_2", {task_1, task_2, task_3, task_4}, {}, [], ScenarioId("s2"))
  984. assert scenario_2.get_inputs() == {data_node_1, data_node_2}
  985. assert scenario_2._get_set_of_tasks() == {task_1, task_2, task_3, task_4}
  986. _assert_equal(scenario_2._get_sorted_tasks(), [[task_1, task_2], [task_3, task_4]])
  987. # s1 --- s6 ---> t2 ---> s5
  988. # | |
  989. # |---> t1 ---| -----> t3
  990. # | | |
  991. # s2 --- ---> s4 ---> t4 ---> s7
  992. data_node_1 = DataNode("foo", Scope.SCENARIO, "s1")
  993. data_node_2 = DataNode("bar", Scope.SCENARIO, "s2")
  994. data_node_4 = DataNode("qux", Scope.SCENARIO, "s4")
  995. data_node_5 = DataNode("quux", Scope.SCENARIO, "s5")
  996. data_node_6 = DataNode("quuz", Scope.SCENARIO, "s6")
  997. data_node_7 = DataNode("corge", Scope.SCENARIO, "s7")
  998. task_1 = Task(
  999. "grault",
  1000. {},
  1001. print,
  1002. [data_node_1, data_node_2],
  1003. [data_node_4],
  1004. TaskId("t1"),
  1005. )
  1006. task_2 = Task("garply", {}, print, [data_node_6], [data_node_5], TaskId("t2"))
  1007. task_3 = Task("waldo", {}, print, [data_node_5, data_node_4], id=TaskId("t3"))
  1008. task_4 = Task("fred", {}, print, [data_node_4], [data_node_7], TaskId("t4"))
  1009. scenario_3 = Scenario("quest", [task_4, task_2, task_1, task_3], {}, [], scenario_id=ScenarioId("s3"))
  1010. assert scenario_3.get_inputs() == {data_node_1, data_node_2, data_node_6}
  1011. assert scenario_3._get_set_of_tasks() == {task_1, task_2, task_3, task_4}
  1012. assert _assert_equal(scenario_3._get_sorted_tasks(), [[task_2, task_1], [task_4, task_3]])
  1013. # s1 --- s6 ---> t2 ---> s5
  1014. # | |
  1015. # |---> t1 ---| -----> t3
  1016. # | | |
  1017. # s2 --- ---> s4 ---> t4 ---> s7 ---> t6
  1018. # |
  1019. # s8 -------> t5 -------> s9 ------------------
  1020. data_node_1 = InMemoryDataNode("foo", Scope.SCENARIO, "s1")
  1021. data_node_2 = InMemoryDataNode("bar", Scope.SCENARIO, "s2")
  1022. data_node_4 = InMemoryDataNode("qux", Scope.SCENARIO, "s4")
  1023. data_node_5 = InMemoryDataNode("quux", Scope.SCENARIO, "s5")
  1024. data_node_6 = InMemoryDataNode("quuz", Scope.SCENARIO, "s6")
  1025. data_node_7 = InMemoryDataNode("corge", Scope.SCENARIO, "s7")
  1026. data_node_8 = InMemoryDataNode("d8", Scope.SCENARIO, "s8")
  1027. data_node_9 = InMemoryDataNode("d9", Scope.SCENARIO, "s9")
  1028. task_1 = Task("grault", {}, print, [data_node_1, data_node_2], [data_node_4], TaskId("t1"))
  1029. task_2 = Task("garply", {}, print, [data_node_6], [data_node_5], TaskId("t2"))
  1030. task_3 = Task("waldo", {}, print, [data_node_5, data_node_4], id=TaskId("t3"))
  1031. task_4 = Task("fred", {}, print, [data_node_4], [data_node_7], TaskId("t4"))
  1032. task_5 = Task("t5", {}, print, [data_node_8], [data_node_9], TaskId("t5"))
  1033. task_6 = Task("t6", {}, print, [data_node_7, data_node_9], id=TaskId("t6"))
  1034. scenario_4 = Scenario("scenario_3", [task_1, task_2, task_3, task_4, task_5, task_6], {}, [], ScenarioId("s4"))
  1035. assert scenario_4.get_inputs() == {data_node_1, data_node_2, data_node_6, data_node_8}
  1036. assert scenario_4._get_set_of_tasks() == {task_1, task_2, task_3, task_4, task_5, task_6}
  1037. _assert_equal(scenario_4._get_sorted_tasks(), [[task_1, task_2, task_5], [task_3, task_4], [task_6]])
  1038. # s1 ---
  1039. # |
  1040. # |---> t1 ---| -----> t3
  1041. # | | |
  1042. # s2 --- ---> s4 ---> t4 ---> s7
  1043. # t2 ---> s5 |
  1044. # s8 ---> t5 s6 --|
  1045. data_node_1 = InMemoryDataNode("foo", Scope.SCENARIO, "s1")
  1046. data_node_2 = InMemoryDataNode("bar", Scope.SCENARIO, "s2")
  1047. data_node_4 = InMemoryDataNode("qux", Scope.SCENARIO, "s4")
  1048. data_node_5 = InMemoryDataNode("quux", Scope.SCENARIO, "s5")
  1049. data_node_6 = InMemoryDataNode("quuz", Scope.SCENARIO, "s6")
  1050. data_node_7 = InMemoryDataNode("corge", Scope.SCENARIO, "s7")
  1051. data_node_8 = InMemoryDataNode("hugh", Scope.SCENARIO, "s8")
  1052. task_1 = Task("grault", {}, print, [data_node_1, data_node_2], [data_node_4], TaskId("t1"))
  1053. task_2 = Task("garply", {}, print, output=[data_node_5], id=TaskId("t2"))
  1054. task_3 = Task("waldo", {}, print, [data_node_4], None, id=TaskId("t3"))
  1055. task_4 = Task("fred", {}, print, [data_node_4, data_node_6], [data_node_7], TaskId("t4"))
  1056. task_5 = Task("bob", {}, print, [data_node_8], None, TaskId("t5"))
  1057. scenario_5 = Scenario("scenario_4", [task_1, task_2, task_3, task_4, task_5], {}, [], ScenarioId("s5"))
  1058. assert scenario_5.get_inputs() == {data_node_1, data_node_2, data_node_8, data_node_6}
  1059. assert scenario_5._get_set_of_tasks() == {task_1, task_2, task_3, task_4, task_5}
  1060. _assert_equal(scenario_5._get_sorted_tasks(), [[task_1, task_2, task_5], [task_3, task_4]])
  1061. # p1 s1 ---
  1062. # |
  1063. # |---> t1 ---| -----> t3
  1064. # | | |
  1065. # s2 --- ---> s4 ---> t4 ---> s5
  1066. # p2 t2 ---> s4 ---> t3
  1067. # p3 s6 ---> t5
  1068. data_node_1 = DataNode("foo", Scope.SCENARIO, "s1")
  1069. data_node_2 = DataNode("bar", Scope.SCENARIO, "s2")
  1070. data_node_4 = DataNode("qux", Scope.SCENARIO, "s4")
  1071. data_node_5 = DataNode("quux", Scope.SCENARIO, "s5")
  1072. data_node_6 = DataNode("quuz", Scope.SCENARIO, "s6")
  1073. task_1 = Task(
  1074. "grault",
  1075. {},
  1076. print,
  1077. [data_node_1, data_node_2],
  1078. [data_node_4],
  1079. TaskId("t1"),
  1080. )
  1081. task_2 = Task("garply", {}, print, output=[data_node_4], id=TaskId("t2"))
  1082. task_3 = Task("waldo", {}, print, [data_node_4], None, id=TaskId("t3"))
  1083. task_4 = Task("fred", {}, print, [data_node_4], [data_node_5], TaskId("t4"))
  1084. task_5 = Task("bob", {}, print, [data_node_6], None, TaskId("t5"))
  1085. scenario_6 = Scenario("quest", [task_1, task_2, task_3, task_4, task_5], {}, [], ScenarioId("s6"))
  1086. assert scenario_6.get_inputs() == {data_node_1, data_node_2, data_node_6}
  1087. assert scenario_6._get_set_of_tasks() == {task_1, task_2, task_3, task_4, task_5}
  1088. _assert_equal(scenario_6._get_sorted_tasks(), [[task_5, task_2, task_1], [task_4, task_3]])
  1089. # p1 s1 ---
  1090. # |
  1091. # |---> t1 ---| -----> t3
  1092. # | | |
  1093. # s2 --- ---> s4 ---> t4 ---> s5
  1094. # p2 t2 ---> s4 ---> t3
  1095. # p3 s6 ---> t5 ---> s4 ---> t4 ---> s5
  1096. data_node_1 = DataNode("foo", Scope.SCENARIO, "s1")
  1097. data_node_2 = DataNode("bar", Scope.SCENARIO, "s2")
  1098. data_node_4 = DataNode("qux", Scope.SCENARIO, "s4")
  1099. data_node_5 = DataNode("quux", Scope.SCENARIO, "s5")
  1100. data_node_6 = DataNode("quuz", Scope.SCENARIO, "s6")
  1101. task_1 = Task(
  1102. "grault",
  1103. {},
  1104. print,
  1105. [data_node_1, data_node_2],
  1106. [data_node_4],
  1107. TaskId("t1"),
  1108. )
  1109. task_2 = Task("garply", {}, print, output=[data_node_4], id=TaskId("t2"))
  1110. task_3 = Task("waldo", {}, print, [data_node_4], None, id=TaskId("t3"))
  1111. task_4 = Task("fred", {}, print, [data_node_4], [data_node_5], TaskId("t4"))
  1112. task_5 = Task("bob", {}, print, [data_node_6], [data_node_4], None, TaskId("t5"))
  1113. scenario_7 = Scenario("quest", [task_4, task_1, task_2, task_3, task_5], {}, [], scenario_id=ScenarioId("s7"))
  1114. assert scenario_7.get_inputs() == {data_node_1, data_node_2, data_node_6}
  1115. assert scenario_7._get_set_of_tasks() == {task_1, task_2, task_3, task_4, task_5}
  1116. _assert_equal(scenario_7._get_sorted_tasks(), [[task_5, task_2, task_1], [task_4, task_3]])
  1117. # p1 s1 ---
  1118. # |
  1119. # |---> t1 ---| -----> t3
  1120. # | | |
  1121. # s2 --- ---> s3 ---> t4 ---> s4
  1122. # p2 t2 ---> s3 ---> t3
  1123. # p3 s5 ---> t5 ---> s3 ---> t4 ---> s4
  1124. # p4 s3 ---> t4 ---> s4
  1125. data_node_1 = DataNode("foo", Scope.SCENARIO, "s1")
  1126. data_node_2 = DataNode("bar", Scope.SCENARIO, "s2")
  1127. data_node_3 = DataNode("qux", Scope.SCENARIO, "s3")
  1128. data_node_4 = DataNode("quux", Scope.SCENARIO, "s4")
  1129. data_node_5 = DataNode("quuz", Scope.SCENARIO, "s5")
  1130. task_1 = Task(
  1131. "grault",
  1132. {},
  1133. print,
  1134. [data_node_1, data_node_2],
  1135. [data_node_3],
  1136. TaskId("t1"),
  1137. )
  1138. task_2 = Task("garply", {}, print, output=[data_node_3], id=TaskId("t2"))
  1139. task_3 = Task("waldo", {}, print, [data_node_3], None, id=TaskId("t3"))
  1140. task_4 = Task("fred", {}, print, [data_node_3], [data_node_4], TaskId("t4"))
  1141. task_5 = Task("bob", {}, print, [data_node_5], [data_node_3], TaskId("t5"))
  1142. scenario_8 = Scenario("quest", [task_1, task_2, task_3, task_4, task_5], {}, [], scenario_id=ScenarioId("s8"))
  1143. assert scenario_8.get_inputs() == {data_node_1, data_node_2, data_node_5}
  1144. assert scenario_8._get_set_of_tasks() == {task_1, task_2, task_3, task_4, task_5}
  1145. _assert_equal(scenario_8._get_sorted_tasks(), [[task_5, task_2, task_1], [task_3, task_4]])
  1146. def test_check_consistency():
  1147. data_node_1 = InMemoryDataNode("foo", Scope.SCENARIO, "s1")
  1148. data_node_2 = InMemoryDataNode("bar", Scope.SCENARIO, "s2")
  1149. data_node_3 = InMemoryDataNode("bar", Scope.SCENARIO, "s3")
  1150. data_node_4 = InMemoryDataNode("qux", Scope.SCENARIO, "s4")
  1151. data_node_5 = InMemoryDataNode("quux", Scope.SCENARIO, "s5")
  1152. data_node_6 = InMemoryDataNode("quuz", Scope.SCENARIO, "s6")
  1153. data_node_7 = InMemoryDataNode("corge", Scope.SCENARIO, "s7")
  1154. data_node_8 = InMemoryDataNode("d8", Scope.SCENARIO, "s8")
  1155. data_node_9 = InMemoryDataNode("d9", Scope.SCENARIO, "s9")
  1156. scenario_0 = Scenario("scenario_0", [], {})
  1157. assert scenario_0._is_consistent()
  1158. task_1 = Task("foo", {}, print, [data_node_1], [data_node_2], TaskId("t1"))
  1159. scenario_1 = Scenario("scenario_1", [task_1], {})
  1160. assert scenario_1._is_consistent()
  1161. # s1 --- ---> s3 ---> t2 ---> s5 ----
  1162. # | | |
  1163. # |---> t1 ---| -------------------------> t3 ---> s6
  1164. # | | |
  1165. # s2 --- ---> s4 ---> t4 ---> s7
  1166. task_1 = Task("grault", {}, print, [data_node_1, data_node_2], [data_node_3, data_node_4], TaskId("t1"))
  1167. task_2 = Task("garply", {}, print, [data_node_3], [data_node_5], TaskId("t2"))
  1168. task_3 = Task("waldo", {}, print, [data_node_5, data_node_4], [data_node_6], TaskId("t3"))
  1169. task_4 = Task("fred", {}, print, [data_node_4], [data_node_7], TaskId("t4"))
  1170. scenario_2 = Scenario("scenario_2", {task_1, task_2, task_3, task_4}, {}, [], ScenarioId("s1"))
  1171. assert scenario_2._is_consistent()
  1172. # s1 --- t2 ---> s5
  1173. # | |
  1174. # |---> t1 ---| -----> t3 ---> s6
  1175. # | | |
  1176. # s2 --- ---> s4 ---> t4 ---> s7
  1177. task_1 = Task("grault", {}, print, [data_node_1, data_node_2], [data_node_4], TaskId("t1"))
  1178. task_2 = Task("garply", {}, print, None, [data_node_5], TaskId("t2"))
  1179. task_3 = Task("waldo", {}, print, [data_node_5, data_node_4], [data_node_6], TaskId("t3"))
  1180. task_4 = Task("fred", {}, print, [data_node_4], [data_node_7], TaskId("t4"))
  1181. scenario_3 = Scenario("scenario_3", {task_1, task_2, task_3, task_4}, {}, [], ScenarioId("s2"))
  1182. assert scenario_3._is_consistent()
  1183. # s1 --- s6 ---> t2 ---> s5
  1184. # | |
  1185. # |---> t1 ---| -----> t3
  1186. # | | |
  1187. # s2 --- ---> s4 ---> t4 ---> s7
  1188. task_1 = Task("grault", {}, print, [data_node_1, data_node_2], [data_node_4], TaskId("t1"))
  1189. task_2 = Task("garply", {}, print, [data_node_6], [data_node_5], TaskId("t2"))
  1190. task_3 = Task("waldo", {}, print, [data_node_5, data_node_4], id=TaskId("t3"))
  1191. task_4 = Task("fred", {}, print, [data_node_4], [data_node_7], TaskId("t4"))
  1192. scenario_4 = Scenario("scenario_4", [task_4, task_2, task_1, task_3], {}, [], scenario_id=ScenarioId("s3"))
  1193. assert scenario_4._is_consistent()
  1194. # s1 --- s6 ---> t2 ---> s5
  1195. # | |
  1196. # |---> t1 ---| -----> t3
  1197. # | | |
  1198. # s2 --- ---> s4 ---> t4 ---> s7 ---> t6
  1199. # |
  1200. # s8 -------> t5 -------> s9 ------------------
  1201. task_1 = Task("grault", {}, print, [data_node_1, data_node_2], [data_node_4], TaskId("t1"))
  1202. task_2 = Task("garply", {}, print, [data_node_6], [data_node_5], TaskId("t2"))
  1203. task_3 = Task("waldo", {}, print, [data_node_5, data_node_4], id=TaskId("t3"))
  1204. task_4 = Task("fred", {}, print, [data_node_4], [data_node_7], TaskId("t4"))
  1205. task_5 = Task("t5", {}, print, [data_node_8], [data_node_9], TaskId("t5"))
  1206. task_6 = Task("t6", {}, print, [data_node_7, data_node_9], id=TaskId("t6"))
  1207. scenario_5 = Scenario("scenario_5", [task_1, task_2, task_3, task_4, task_5, task_6], {}, [], ScenarioId("s4"))
  1208. assert scenario_5._is_consistent()
  1209. # s1 ---
  1210. # |
  1211. # |---> t1 ---| -----> t3
  1212. # | | |
  1213. # s2 --- ---> s4 ---> t4 ---> s7
  1214. # t2 ---> s5 |
  1215. # s8 ---> t5 s6 --|
  1216. task_1 = Task("grault", {}, print, [data_node_1, data_node_2], [data_node_4], TaskId("t1"))
  1217. task_2 = Task("garply", {}, print, output=[data_node_5], id=TaskId("t2"))
  1218. task_3 = Task("waldo", {}, print, [data_node_4], None, id=TaskId("t3"))
  1219. task_4 = Task("fred", {}, print, [data_node_4, data_node_6], [data_node_7], TaskId("t4"))
  1220. task_5 = Task("bob", {}, print, [data_node_8], None, TaskId("t5"))
  1221. scenario_6 = Scenario("scenario_6", [task_1, task_2, task_3, task_4, task_5], {}, [], ScenarioId("s5"))
  1222. assert scenario_6._is_consistent()
  1223. # p1 s1 ---
  1224. # |
  1225. # |---> t1 ---| -----> t3
  1226. # | | |
  1227. # s2 --- ---> s4 ---> t4 ---> s5
  1228. # p2 t2 ---> s4 ---> t3
  1229. # p3 s6 ---> t5
  1230. task_1 = Task("grault", {}, print, [data_node_1, data_node_2], [data_node_4], TaskId("t1"))
  1231. task_2 = Task("garply", {}, print, output=[data_node_4], id=TaskId("t2"))
  1232. task_3 = Task("waldo", {}, print, [data_node_4], None, id=TaskId("t3"))
  1233. task_4 = Task("fred", {}, print, [data_node_4], [data_node_5], TaskId("t4"))
  1234. task_5 = Task("bob", {}, print, [data_node_6], None, TaskId("t5"))
  1235. scenario_7 = Scenario("scenario_7", [task_1, task_2, task_3, task_4, task_5], {}, [], ScenarioId("s6"))
  1236. assert scenario_7._is_consistent()
  1237. # p1 s1 ---
  1238. # |
  1239. # |---> t1 ---| -----> t3
  1240. # | | |
  1241. # s2 --- ---> s4 ---> t4 ---> s5
  1242. # p2 t2 ---> s4 ---> t3
  1243. # p3 s6 ---> t5 ---> s4 ---> t4 ---> s5
  1244. task_1 = Task("grault", {}, print, [data_node_1, data_node_2], [data_node_4], TaskId("t1"))
  1245. task_2 = Task("garply", {}, print, output=[data_node_4], id=TaskId("t2"))
  1246. task_3 = Task("waldo", {}, print, [data_node_4], None, id=TaskId("t3"))
  1247. task_4 = Task("fred", {}, print, [data_node_4], [data_node_5], TaskId("t4"))
  1248. task_5 = Task("bob", {}, print, [data_node_6], [data_node_4], None, TaskId("t5"))
  1249. scenario_8 = Scenario("scenario_8", [task_4, task_1, task_2, task_3, task_5], {}, [], scenario_id=ScenarioId("s7"))
  1250. assert scenario_8._is_consistent()
  1251. # p1 s1 ---
  1252. # |
  1253. # |---> t1 ---| -----> t3
  1254. # | | |
  1255. # s2 --- ---> s3 ---> t4 ---> s4
  1256. # p2 t2 ---> s3 ---> t3
  1257. # p3 s5 ---> t5 ---> s3 ---> t4 ---> s4
  1258. # p4 s3 ---> t4 ---> s4
  1259. task_1 = Task("grault", {}, print, [data_node_1, data_node_2], [data_node_3], TaskId("t1"))
  1260. task_2 = Task("garply", {}, print, output=[data_node_3], id=TaskId("t2"))
  1261. task_3 = Task("waldo", {}, print, [data_node_3], None, id=TaskId("t3"))
  1262. task_4 = Task("fred", {}, print, [data_node_3], [data_node_4], TaskId("t4"))
  1263. task_5 = Task("bob", {}, print, [data_node_5], [data_node_3], TaskId("t5"))
  1264. scenario_9 = Scenario("scenario_9", [task_1, task_2, task_3, task_4, task_5], {}, [], scenario_id=ScenarioId("s8"))
  1265. assert scenario_9._is_consistent()