test_scenario.py 63 KB

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