run_tests.py 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. import sys
  2. import os
  3. import io
  4. import pprint
  5. import unittest
  6. from drawio2py import abstract_syntax as dio_as
  7. from drawio2py import parser as dio_parser
  8. from drawio2py import generator as dio_generator
  9. from drawio2py import util
  10. from drawio2oml.drawio import oml_generator as dio_oml_generator
  11. from drawio2oml.pm import parser as pm_parser
  12. from drawio2oml.pm import oml_generator as pm_oml_generator
  13. from drawio2oml.pt import renderer as pt_renderer
  14. from drawio2oml.pt import abstract_syntax as pt_as
  15. DATADIR = os.path.join(os.path.dirname(__file__), "data")
  16. class DummyOutput:
  17. def write(self, str):
  18. pass
  19. def run_drawio_test(filename):
  20. # Parse (1st time):
  21. inputfile = os.path.join(DATADIR,filename)
  22. asyntax = dio_parser.Parser.parse(inputfile)
  23. # Print abstract syntax:
  24. # pprint.pprint(asyntax, indent=2, compact=True)
  25. # Generate .drawio (1st time):
  26. csyntax = io.BytesIO()
  27. dio_generator.generate(asyntax, csyntax)
  28. csyntax.seek(0)
  29. # Print generated .drawio
  30. # print(csyntax.getvalue())
  31. # Parse (2nd time):
  32. asyntax2 = dio_parser.Parser.parse(csyntax)
  33. # Generate .drawio (2nd time):
  34. csyntax2 = io.BytesIO()
  35. dio_generator.generate(asyntax2, csyntax2)
  36. csyntax2.seek(0)
  37. if (csyntax.getvalue() != csyntax2.getvalue()):
  38. # print(csyntax.getvalue())
  39. # print(csyntax2.getvalue())
  40. raise Exception("Files differ after round-trip!")
  41. for page in asyntax.pages:
  42. dio_oml_generator.write_oml(
  43. input_uri="file://"+filename,
  44. drawio_page=page,
  45. model_name="MODEL",
  46. names=dio_oml_generator.assign_names(page),
  47. ostream=DummyOutput())
  48. def run_pm_test(filename):
  49. inputfile = os.path.join(DATADIR,filename)
  50. dio_asyntax = dio_parser.Parser.parse(os.path.join(DATADIR, inputfile))
  51. # pprint.pprint(dio_asyntax, indent=2, compact=True)
  52. for page_index, page in enumerate(dio_asyntax.pages):
  53. for layer_index, layer in enumerate(page.root.children):
  54. try:
  55. pm_asyntax, traceability_links = pm_parser.parse(layer)
  56. # pprint.pprint(pm_asyntax, indent=2, compact=True)
  57. except pm_parser.ParseError as e:
  58. print("Could not parse page", page_index)
  59. continue
  60. dio_names = dio_oml_generator.assign_names(page)
  61. pm_names = pm_oml_generator.assign_names(pm_asyntax)
  62. # OML-description of drawio-diagram
  63. dio_oml_generator.write_oml(
  64. input_uri="file://"+inputfile,
  65. drawio_page=page,
  66. model_name="MODEL",
  67. names=dio_names,
  68. ostream=DummyOutput())
  69. # OML-description of process model
  70. pm_oml_generator.write_oml(
  71. input_uri=inputfile,
  72. model_name="MODEL",
  73. asyntax=pm_asyntax,
  74. names=pm_names,
  75. ostream=DummyOutput())
  76. # OML-description of traceability links between drawio-diagram and process model
  77. pm_oml_generator.write_corr_oml(
  78. input_uri=inputfile,
  79. model_name="MODEL",
  80. traceability_links=traceability_links,
  81. model_names=pm_names,
  82. drawio_names=dio_names,
  83. ostream=DummyOutput())
  84. print(inputfile, "OK")
  85. class Tests(unittest.TestCase):
  86. def test_drawio1(self):
  87. run_drawio_test("drawio/test.drawio")
  88. def test_drawio2(self):
  89. run_drawio_test("drawio/overview.drawio")
  90. def test_pm1(self):
  91. run_pm_test("pm/TrivialPM.drawio")
  92. def test_pm2(self):
  93. run_pm_test("pm/SlightlyLessTrivialPM.drawio")
  94. def test_pm3(self):
  95. run_pm_test("pm/MyFancyPM.drawio")
  96. # In order to test rendering of Process Traces, we need the path of the shape_libs dir (from drawio repo). Tests don't have command line arguments, so let's get it from an environment variable:
  97. @unittest.skipIf("DRAWIOSHAPELIBS" not in os.environ, "DRAWIOSHAPELIBS environment variable not set")
  98. def test_render_pt(self):
  99. a0 = pt_as.Artifact(
  100. tag="v0",
  101. guid="XXX",
  102. location="XXX",
  103. type="xopp",
  104. parentVersion=None)
  105. e0 = pt_as.StartTraceEvent(
  106. pm="MyPM",
  107. timestamp="2011-06-01T19:16:58.869Z",
  108. after=None)
  109. e1 = pt_as.StartActivityEvent(
  110. timestamp="2011-06-01T19:16:58.869Z",
  111. after=e0,
  112. activity="activity",
  113. port="cin",
  114. consumes=[])
  115. e2 = pt_as.EndActivityEvent(
  116. timestamp="2011-06-01T19:16:58.869Z",
  117. after=e1,
  118. activity="activity",
  119. port="cout",
  120. produces=[a0])
  121. e3 = pt_as.EndTraceEvent(
  122. timestamp="2011-06-01T19:16:58.869Z",
  123. after=e2)
  124. id_gen = util.DrawioIDGenerator()
  125. page = util.generate_empty_page(id_gen, "Generated PT")
  126. default_layer = page.root.children[0]
  127. shapelib_dir = os.environ["DRAWIOSHAPELIBS"]
  128. pt_renderer.render(shapelib_dir=shapelib_dir, last_event=e3, parent=default_layer, id_gen=id_gen)
  129. file = dio_as.DrawIOFile(filename="XXX", compressed=False, version="20", pages=[page])
  130. # import pprint
  131. # pprint.pprint(file)
  132. import drawio2py.generator
  133. drawio2py.generator.generate(file, DummyOutput())