model_building_utils.js 9.6 KB

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