model_building_utils.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  1. let canvas = "#div_canvas";
  2. function build_div(element_type, num) {
  3. return element_type + (num) + "\\2e instance";
  4. }
  5. function get_element_div(type, num) {
  6. return "#\\2f Formalisms\\2f __LanguageSyntax__\\2f SimpleClassDiagram\\2f SimpleClassDiagram\\2e umlIcons\\2f " + (type) + "\\2f " + (num) + "\\2e instance";
  7. }
  8. function get_class_div(num) {
  9. return get_element_div("ClassIcon", num);
  10. }
  11. function get_assoc_div(num) {
  12. return get_element_div("AssociationLink", num) + " > text:nth-child(1)";
  13. }
  14. function fix_selector(name) {
  15. return name.replace(".", "\\.");
  16. }
  17. function create_class(client, x, y, i, element_type) {
  18. let class_div = "";
  19. if (element_type != undefined) {
  20. class_div = this.build_div(element_type, i);
  21. } else {
  22. class_div = this.get_class_div(i);
  23. }
  24. client
  25. .moveToElement(canvas, x, y)
  26. .mouseButtonClick('right')
  27. .pause(300)
  28. .waitForElementPresent(class_div, 500, "Created class: " + class_div);
  29. return class_div;
  30. }
  31. function create_classes(client, x_coords, y_coords, curr_num_elements, element_type) {
  32. for (let x of x_coords) {
  33. for (let y of y_coords) {
  34. this.create_class(client, x, y, curr_num_elements, element_type);
  35. curr_num_elements++;
  36. }
  37. }
  38. return curr_num_elements;
  39. }
  40. function create_assoc(client, start_div, end_div, relation_div, offset) {
  41. this.click_off(client);
  42. this.move_to_element_ratio(client, start_div, 50 + offset, 50 + offset);
  43. client.mouseButtonDown('right');
  44. this.move_to_element_ratio(client, end_div, 50 + offset, 50 + offset);
  45. client.mouseButtonUp('right').pause(300);
  46. if (relation_div.length > 0) {
  47. client.waitForElementPresent(relation_div, 1000, "Relation option present: " + relation_div);
  48. client.click(relation_div);
  49. client.waitForElementPresent("#dialog_btn", 1000, "Assoc menu opens")
  50. .click("#dialog_btn")
  51. .pause(300)
  52. .waitForElementNotPresent("#dialog_btn", 1000, "Assoc menu closes");
  53. }
  54. this.click_off(client);
  55. client.pause(300);
  56. }
  57. function move_element(client, from_div, to_div, from_offset, to_offset) {
  58. this.click_off(client);
  59. this.move_to_element_ratio(client, from_div, from_offset[0], from_offset[1]);
  60. client.mouseButtonClick('left').pause(300);
  61. client.mouseButtonDown('left');
  62. this.move_to_element_ratio(client, to_div, to_offset[0], to_offset[1]);
  63. client.mouseButtonUp('left').pause(300);
  64. }
  65. function set_attribs(client, num, attrs, element_type, div_suffix, offset) {
  66. let element_div = "";
  67. if (element_type != undefined) {
  68. element_div = this.build_div(element_type, num);
  69. } else {
  70. element_div = this.get_class_div(num);
  71. }
  72. if (div_suffix != undefined) {
  73. element_div += div_suffix;
  74. }
  75. this.click_off(client);
  76. if (offset == undefined) {
  77. offset = [50, 50];
  78. }
  79. client.waitForElementPresent(element_div, 1000, "Find element for attrib set: " + element_div);
  80. this.move_to_element_ratio(client, element_div, offset[0], offset[1]);
  81. client.mouseButtonClick('middle')
  82. .waitForElementPresent("#dialog_btn", 1000, "Editing menu opens");
  83. for (const [key, value] of Object.entries(attrs)) {
  84. client.element('css selector', key, function (result) {
  85. //if not found, assume checkbox
  86. if (result.status == -1) {
  87. let attrib_name = key.split(" ")[0];
  88. let checkbox_div = attrib_name + " > td:nth-child(2) > input:nth-child(1)";
  89. client.click(checkbox_div);
  90. } else {
  91. client
  92. .clearValue(key)
  93. .setValue(key, value);
  94. }
  95. });
  96. }
  97. client
  98. .click("#dialog_btn")
  99. .waitForElementNotPresent("#dialog_btn", 1000, "Editing menu closes")
  100. .moveToElement(canvas, 0, 100)
  101. .mouseButtonClick('left')
  102. .pause(300)
  103. ;
  104. }
  105. function move_to_element_ratio(client, element, x_ratio, y_ratio) {
  106. client.getElementSize(element, function (result) {
  107. let x_pos = Math.trunc(x_ratio / 100 * result.value.width);
  108. let y_pos = Math.trunc(y_ratio / 100 * result.value.height);
  109. //console.log("X: " + x_pos + " Y: " + y_pos);
  110. client.moveToElement(element, x_pos, y_pos);
  111. });
  112. }
  113. function click_off(client) {
  114. client
  115. .moveToElement(canvas, 0, 100)
  116. .mouseButtonClick('left');
  117. }
  118. function navigate_to_folder(client, folder_name) {
  119. let root_button = "#navbar_\\2f";
  120. client.waitForElementPresent(root_button, 2000, "Find root button")
  121. .click(root_button);
  122. let new_folder_selector = "#new_folder";
  123. let folder_path = folder_name.split("/");
  124. for (let f of folder_path) {
  125. let folder_name_div = "#" + f;
  126. client.element('css selector', folder_name_div, function (result) {
  127. // folder not created, so create it
  128. if (result.status == -1) {
  129. client.click(new_folder_selector)
  130. .pause(500)
  131. .setAlertText(f)
  132. .acceptAlert()
  133. .pause(500);
  134. }
  135. client.waitForElementPresent(folder_name_div, 2000, "Find folder: " + folder_name_div)
  136. .click(folder_name_div);
  137. });
  138. }
  139. }
  140. function load_model(client, folder_name, model_name) {
  141. let load_button = "#\\2f Toolbars\\2f MainMenu\\2f MainMenu\\2e buttons\\2e model\\2f loadModel";
  142. client.waitForElementPresent(load_button, 1000, "Looking for load button")
  143. .click(load_button)
  144. .waitForElementPresent("#dialog_btn", 1000, "Load menu opens");
  145. navigate_to_folder(client, folder_name);
  146. let model_name_div = "#" + fix_selector(model_name);
  147. client.waitForElementPresent(model_name_div, 2000, "Looking for model: " + model_name_div)
  148. .click(model_name_div);
  149. client.waitForElementPresent("#dialog_btn", 2000, "Looking for close")
  150. .click("#dialog_btn");
  151. client.waitForElementNotPresent("#dialog_btn", 2000, "Load menu closes");
  152. }
  153. function save_model(client, folder_name, model_name) {
  154. let save_button = "#\\2f Toolbars\\2f MainMenu\\2f MainMenu\\2e buttons\\2e model\\2f saveModelAs";
  155. let new_file_text = "#new_file";
  156. client.waitForElementPresent(save_button, 1000, "Looking for save button")
  157. .click(save_button)
  158. .waitForElementPresent("#dialog_btn", 1000, "Save menu opens");
  159. navigate_to_folder(client, folder_name);
  160. let model_selector = "#" + model_name;
  161. client.element('css selector', model_selector, function (result) {
  162. if (result.status == -1) {
  163. client.click(new_file_text)
  164. .clearValue(new_file_text)
  165. .setValue(new_file_text, model_name);
  166. client.assert.ok(true, "Saving model with name: '" + model_name + "'");
  167. } else {
  168. client.click(model_selector);
  169. }
  170. client.waitForElementPresent("#dialog_btn", 2000, "Looking for close")
  171. .pause(200)
  172. .click("#dialog_btn")
  173. .pause(200)
  174. .waitForElementNotPresent("#dialog_btn", 2000, "Save menu closes");
  175. }
  176. );
  177. }
  178. function load_transformation(client, folder_name, model_name) {
  179. compile_model(client, "transform", folder_name, model_name);
  180. }
  181. function compile_model(client, compile_type, folder_name, model_name) {
  182. let button = "";
  183. let button_name = compile_type;
  184. if (button_name == "AS") {
  185. button = "#\\2f Toolbars\\2f CompileMenu\\2f CompileMenu\\2e buttons\\2e model\\2f compileToASMM";
  186. } else if (button_name == "CS") {
  187. button = "#\\2f Toolbars\\2f CompileMenu\\2f CompileMenu\\2e buttons\\2e model\\2f compileToCSMM";
  188. } else if (button_name == "pattern") {
  189. button = "#\\2f Toolbars\\2f CompileMenu\\2f CompileMenu\\2e buttons\\2e model\\2f compileToPatternMM";
  190. } else if (button_name == "transform") {
  191. button = "#\\2f Toolbars\\2f TransformationController\\2f TransformationController\\2e buttons\\2e model\\2f load";
  192. }
  193. client.waitForElementPresent(button, 1000, "Looking for " + button_name + " button")
  194. .click(button)
  195. .waitForElementPresent("#dialog_btn", 2000, button_name + " menu opens");
  196. navigate_to_folder(client, folder_name);
  197. let new_file_text = "#new_file";
  198. let model_div = "#" + fix_selector(model_name);
  199. client.element('css selector', model_div, function (result) {
  200. if (result.status == -1) {
  201. //don't create new file with pattern compilation
  202. if (button_name == "pattern" || button_name == "transform") {
  203. client.assert.ok(false, "File found: " + model_name);
  204. }
  205. client.click(new_file_text)
  206. .clearValue(new_file_text)
  207. .setValue(new_file_text, model_name)
  208. .click("#dialog_btn");
  209. } else {
  210. client.click(model_div)
  211. .click("#dialog_btn");
  212. }
  213. client.waitForElementNotPresent("#dialog_btn", 2000, button_name + " menu closes");
  214. }
  215. );
  216. }
  217. function delete_element(client, element) {
  218. client.moveToElement(element, 10, 10);
  219. client.mouseButtonClick('left');
  220. client.keys(client.Keys.DELETE);
  221. this.click_off(client);
  222. }
  223. function scroll_geometry_element(client, element, scrollAmount, scrollTimes) {
  224. client.waitForElementPresent(element, 2000, element + " present");
  225. this.move_to_element_ratio(client, element, 50, 50);
  226. client.execute(function (btn_div, scrollAmount, scrollTimes) {
  227. let element = $(btn_div);
  228. for (let i = 0; i < scrollTimes; i++) {
  229. element.get(0).onwheel(scrollAmount);
  230. }
  231. }, [element, scrollAmount, scrollTimes], null);
  232. client.pause(300);
  233. }
  234. module.exports = {
  235. '@disabled': true,
  236. canvas,
  237. get_element_div,
  238. get_assoc_div,
  239. get_class_div,
  240. build_div,
  241. create_class,
  242. create_classes,
  243. create_assoc,
  244. delete_element,
  245. set_attribs,
  246. move_to_element_ratio,
  247. click_off,
  248. save_model,
  249. load_model,
  250. compile_model,
  251. load_transformation,
  252. scroll_geometry_element,
  253. move_element
  254. };