05_creating_dsl.js 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463
  1. let test_utils = require('./test_utils');
  2. let user = "./users/testuser/";
  3. function get_all_attrs() {
  4. return "[\n" +
  5. " {\n" +
  6. " \"name\": \"int\",\n" +
  7. " \"type\": \"int\",\n" +
  8. " \"default\": 0\n" +
  9. " },\n" +
  10. " {\n" +
  11. " \"name\": \"string\",\n" +
  12. " \"type\": \"string\",\n" +
  13. " \"default\": \"hello\"\n" +
  14. " },\n" +
  15. " {\n" +
  16. " \"name\": \"float\",\n" +
  17. " \"type\": \"float\",\n" +
  18. " \"default\": 0\n" +
  19. " },\n" +
  20. " {\n" +
  21. " \"name\": \"boolean\",\n" +
  22. " \"type\": \"boolean\",\n" +
  23. " \"default\": true\n" +
  24. " },\n" +
  25. " {\n" +
  26. " \"name\": \"code\",\n" +
  27. " \"type\": \"code\",\n" +
  28. " \"default\": \"\"\n" +
  29. " },\n" +
  30. " {\n" +
  31. " \"name\": \"file_html\",\n" +
  32. " \"type\": \"file<*.html>\",\n" +
  33. " \"default\": \"\"\n" +
  34. " },\n" +
  35. " {\n" +
  36. " \"name\": \"map_int_string\",\n" +
  37. " \"type\": \"map<int,string>\"\n" +
  38. " },\n" +
  39. " {\n" +
  40. " \"name\": \"list_int\",\n" +
  41. " \"type\": \"lis<int>\",\n" +
  42. " \"default\": [\n" +
  43. " 1,\n" +
  44. " 2\n" +
  45. " ]\n" +
  46. " },\n" +
  47. " {\n" +
  48. " \"name\": \"enum\",\n" +
  49. " \"type\": \"ENUM(Red,Green,Blue)\"\n" +
  50. " },\n" +
  51. " {\n" +
  52. " \"name\": \"enum2\",\n" +
  53. " \"type\": \"ENUM(Four,Five,Six,Seven)\"\n" +
  54. " }\n" +
  55. "]";
  56. }
  57. function get_all_attrs2() {
  58. return "[\n" +
  59. " {\n" +
  60. " \"name\": \"name\",\n" +
  61. " \"type\": \"string\",\n" +
  62. " \"default\": \"test\"\n" +
  63. " },\n" +
  64. " {\n" +
  65. " \"name\": \"\",\n" +
  66. " \"type\": \"\",\n" +
  67. " \"default\": \"\"\n" +
  68. " }\n" +
  69. "]";
  70. }
  71. function get_class_div(num) {
  72. return "#\\2f Formalisms\\2f __LanguageSyntax__\\2f SimpleClassDiagram\\2f SimpleClassDiagram\\2e umlIcons\\2f ClassIcon\\2f " + (num) + "\\2e instance";
  73. }
  74. function get_assoc_div(num) {
  75. return "#\\2f Formalisms\\2f __LanguageSyntax__\\2f SimpleClassDiagram\\2f SimpleClassDiagram\\2e umlIcons\\2f AssociationLink\\2f " + (num) + "\\2e instance > text:nth-child(1)";
  76. }
  77. module.exports = {
  78. beforeEach: function (client, done) {
  79. client.url('http://localhost:8124/atompm').pause(300).maximizeWindow(done);
  80. },
  81. 'Login': function (client) {
  82. test_utils.login(client);
  83. },
  84. 'Create model': function (client) {
  85. let filename = '/Formalisms/__LanguageSyntax__/SimpleClassDiagram/SimpleClassDiagram.umlIcons.metamodel';
  86. test_utils.load_toolbar(client, [filename]);
  87. let classIcon = "#\\/Formalisms\\/__LanguageSyntax__\\/SimpleClassDiagram\\/SimpleClassDiagram\\.umlIcons\\.metamodel\\/ClassIcon";
  88. client.waitForElementPresent(classIcon, 2000, "Check for class icon...");
  89. client.click(classIcon);
  90. let canvas = "#div_canvas";
  91. client.waitForElementPresent(canvas, 1000, "Checking for canvas...");
  92. let test_folder = "autotest";
  93. let name_field = "#tr_name > td:nth-child(2) > textarea";
  94. let num_elements = 0;
  95. //BUILD CLASSES
  96. let start_x = 50;
  97. let x_diff = 350;
  98. let x_coords = [start_x, start_x + x_diff, start_x + 2 * x_diff];
  99. let start_y = 200;
  100. let y_diff = 150;
  101. let y_coords = [start_y, start_y + y_diff, start_y + 2 * y_diff];
  102. let num_classes = x_coords.length * y_coords.length;
  103. let i = 0;
  104. for (let x of x_coords) {
  105. for (let y of y_coords) {
  106. let class_div = get_class_div(i);
  107. i++;
  108. client
  109. .moveToElement(canvas, x, y)
  110. .mouseButtonClick('right')
  111. .pause(500)
  112. .waitForElementPresent(class_div, 500, "Created class: " + class_div);
  113. num_elements++;
  114. }
  115. }
  116. // SET NAMES FOR CLASSES
  117. for (let i = 0; i < num_classes; i++) {
  118. let class_name = "Class" + String.fromCharCode(65 + i);
  119. let class_div = get_class_div(i);
  120. client.waitForElementPresent(class_div, 1000, "Looking for class");
  121. client.moveToElement(class_div, 10, 10)
  122. .mouseButtonClick('middle')
  123. .waitForElementPresent("#dialog_btn", 1000, "Editing menu opens")
  124. .clearValue(name_field)
  125. .setValue(name_field, class_name)
  126. .click("#dialog_btn")
  127. .waitForElementNotPresent("#dialog_btn", 1000, "Editing menu closes")
  128. .moveToElement(canvas, 0, 100)
  129. .mouseButtonClick('left')
  130. .pause(1000)
  131. ;
  132. }
  133. // SET ATTRIBUTES
  134. let class_div = get_class_div(0);
  135. let attrib_field = "#tr_attributes > td:nth-child(2) > textarea";
  136. client.moveToElement(class_div, 10, 10)
  137. .mouseButtonClick('middle')
  138. .waitForElementPresent("#dialog_btn", 1000, "Editing menu opens")
  139. .clearValue(attrib_field)
  140. .setValue(attrib_field, get_all_attrs())
  141. .click("#dialog_btn")
  142. .waitForElementNotPresent("#dialog_btn", 1000, "Editing menu closes")
  143. .moveToElement(canvas, 0, 100)
  144. .mouseButtonClick('left')
  145. .pause(1000)
  146. ;
  147. let abstract_class = 4;
  148. let class_div2 = get_class_div(abstract_class);
  149. let attrib_field2 = "#tr_attributes > td:nth-child(2) > textarea";
  150. let checkbox = "#tr_abstract > td:nth-child(2) > input[type=\"checkbox\"]";
  151. client.moveToElement(class_div2, 10, 10)
  152. .mouseButtonClick('middle')
  153. .waitForElementPresent("#dialog_btn", 1000, "Editing menu opens")
  154. .clearValue(attrib_field2)
  155. .setValue(attrib_field2, get_all_attrs2())
  156. .moveToElement(checkbox, 0, 0)
  157. .mouseButtonClick('left')
  158. .click("#dialog_btn")
  159. .waitForElementNotPresent("#dialog_btn", 1000, "Editing menu closes")
  160. .moveToElement(canvas, 0, 100)
  161. .mouseButtonClick('left')
  162. .pause(1000)
  163. ;
  164. //CREATE INHERITANCE
  165. let inheri_classes = [
  166. [abstract_class, abstract_class + 1],
  167. [abstract_class, abstract_class + 3]];
  168. for (let inheri_set of inheri_classes) {
  169. let sup = get_class_div(inheri_set[0]);
  170. let sub = get_class_div(inheri_set[1]);
  171. let inheri_relation = "#div_dialog_0 > select > option:nth-child(2)";
  172. //tiny offset to not hit other arrows
  173. let offset = 2 * inheri_set[1];
  174. client
  175. .moveToElement(sub, 50, 50)
  176. .mouseButtonDown('right')
  177. .moveToElement(sup, 50 + offset, 50 + offset)
  178. .mouseButtonUp('right')
  179. .pause(500)
  180. .click(inheri_relation)
  181. .waitForElementPresent("#dialog_btn", 1000, "Inheri menu opens")
  182. .click("#dialog_btn")
  183. .pause(500)
  184. .waitForElementNotPresent("#dialog_btn", 1000, "Inheri menu closes")
  185. .moveToElement(canvas, 0, 100)
  186. .mouseButtonClick('left')
  187. .pause(500)
  188. ;
  189. num_elements++;
  190. }
  191. //SET ASSOCS
  192. let assocs = [
  193. //from, to, name, isContain, out_card, in_card
  194. [0, 1, "testAssoc", false, null, null],
  195. [2, 3, "oneToOne", false,
  196. [{
  197. "dir": "out",
  198. "type": "oneToOne",
  199. "min": "1",
  200. "max": "1"
  201. }],
  202. [{
  203. "dir": "in",
  204. "type": "oneToOne",
  205. "min": "1",
  206. "max": "1"
  207. }]
  208. ],
  209. [4, 5, "ManyToOne", false,
  210. null,
  211. [{
  212. "dir": "in",
  213. "type": "ManyToOne",
  214. "min": "0",
  215. "max": "1"
  216. }]
  217. ],
  218. [6, 7, "Containment", true,
  219. null, null
  220. ],
  221. [8, 8, "self", false,
  222. null, null
  223. ]
  224. ];
  225. client.pause(500);
  226. let assoc_num = 0;
  227. for (let assoc of assocs) {
  228. let from_ele = get_class_div(assoc[0]);
  229. let to_ele = get_class_div(assoc[1]);
  230. let name = assoc[2];
  231. let isContain = assoc[3];
  232. let out_card = assoc[4];
  233. let in_card = assoc[5];
  234. let cardinality_field = "#tr_cardinalities > td:nth-child(2) > textarea";
  235. let assoc_div = get_assoc_div(num_elements);
  236. assoc_num++;
  237. num_elements++;
  238. let assoc_relation = "#div_dialog_0 > select > option:nth-child(1)";
  239. //tiny offset to not hit other arrows
  240. let offset = 2 * assoc[0] + 2 * assoc[1];
  241. client
  242. .moveToElement(from_ele, 20, 20)
  243. .mouseButtonDown('right')
  244. .moveToElement(to_ele, 20 + offset, 20 + offset)
  245. .mouseButtonUp('right')
  246. .pause(500)
  247. .click(assoc_relation)
  248. .waitForElementPresent("#dialog_btn", 1000, "Assoc menu opens")
  249. .click("#dialog_btn")
  250. .pause(500)
  251. .waitForElementNotPresent("#dialog_btn", 1000, "Assoc menu closes")
  252. .moveToElement(canvas, 0, 100)
  253. .mouseButtonClick('left')
  254. .pause(500)
  255. .waitForElementPresent(assoc_div, 1000, "Assoc name present: " + assoc_div);
  256. if (out_card) {
  257. client
  258. .moveToElement(from_ele, 10, 10)
  259. .mouseButtonClick('middle')
  260. .waitForElementPresent("#dialog_btn", 1000, "Out card menu opens")
  261. .clearValue(cardinality_field)
  262. .setValue(cardinality_field, JSON.stringify(out_card))
  263. .click("#dialog_btn")
  264. .waitForElementNotPresent("#dialog_btn", 1000, "Out card menu closes")
  265. .moveToElement(canvas, 0, 100)
  266. .mouseButtonClick('left')
  267. .pause(500);
  268. }
  269. if (in_card) {
  270. client
  271. .moveToElement(to_ele, 10, 10)
  272. .mouseButtonClick('middle')
  273. .waitForElementPresent("#dialog_btn", 1000, "Out card menu opens")
  274. .clearValue(cardinality_field)
  275. .setValue(cardinality_field, JSON.stringify(in_card))
  276. .click("#dialog_btn")
  277. .waitForElementNotPresent("#dialog_btn", 1000, "Out card menu closes")
  278. .moveToElement(canvas, 0, 100)
  279. .mouseButtonClick('left')
  280. .pause(500);
  281. }
  282. client.getElementSize(assoc_div, function (result) {
  283. client
  284. .moveToElement(assoc_div, result.value.width / 2, result.value.height / 2)
  285. .mouseButtonClick('middle')
  286. .waitForElementPresent("#dialog_btn", 1000, "Editing assoc name opens")
  287. .clearValue(name_field)
  288. .setValue(name_field, name);
  289. if (isContain) {
  290. let contain_opt = "#tr_linktype > td:nth-child(2) > select > option:nth-child(2)";
  291. client
  292. .moveToElement(contain_opt, 0, 0)
  293. .mouseButtonClick('left');
  294. }
  295. client
  296. .click("#dialog_btn")
  297. .waitForElementNotPresent("#dialog_btn", 1000, "Editing assoc name closes")
  298. .moveToElement(canvas, 0, 100)
  299. .mouseButtonClick('left')
  300. .pause(500);
  301. })
  302. ;
  303. }
  304. //CREATE CONSTRAINT
  305. let constraint_div = get_class_div(num_elements).replace("ClassIcon", "GlobalConstraintIcon");
  306. let constraintIcon = "#\\2f Formalisms\\2f __LanguageSyntax__\\2f SimpleClassDiagram\\2f SimpleClassDiagram\\2e umlIcons\\2e metamodel\\2f GlobalConstraintIcon";
  307. client.waitForElementPresent(constraintIcon, 2000, "Check for constraint icon...");
  308. client.click(constraintIcon);
  309. client
  310. .moveToElement(canvas, 100, 150)
  311. .mouseButtonClick('right')
  312. .pause(500)
  313. .waitForElementPresent(constraint_div, 500, "Created class: " + constraint_div);
  314. let pre_create_opt = "#tr_event > td:nth-child(2) > select > option:nth-child(2)";
  315. let code_field = "#tr_code > td:nth-child(2) > textarea";
  316. let constraint_code = "let C_classes = getAllNodes(['Formalisms/__LanguageSyntax__/SimpleClassDiagram/SimpleClassDiagram/umlIcons/ClassIcon']);\n" +
  317. "C_classes.length <= 2;";
  318. client
  319. .moveToElement(constraint_div, 10, 10)
  320. .mouseButtonClick('middle')
  321. .waitForElementPresent("#dialog_btn", 1000, "Constraint menu opens")
  322. .clearValue(name_field)
  323. .setValue(name_field, "max-two-instances")
  324. .moveToElement(pre_create_opt, 0, 0)
  325. .mouseButtonClick('left')
  326. .clearValue(code_field)
  327. .setValue(code_field, constraint_code)
  328. .click("#dialog_btn")
  329. .waitForElementNotPresent("#dialog_btn", 1000, "Constraint menu closes")
  330. .moveToElement(canvas, 0, 100)
  331. .mouseButtonClick('left')
  332. .pause(1000);
  333. //SAVE MODEL
  334. let save_button = "#\\2f Toolbars\\2f MainMenu\\2f MainMenu\\2e buttons\\2e model\\2f saveModel";
  335. let new_file_text = "#new_file";
  336. let model_name = "autotest.model";
  337. client.waitForElementPresent(save_button, 1000, "Looking for save button")
  338. .click(save_button)
  339. .waitForElementPresent("#dialog_btn", 1000, "Save menu opens");
  340. let test_folder_div = "#" + test_folder;
  341. client.element('css selector', test_folder_div, function (result) {
  342. if (result.status == -1) {
  343. let new_folder_btn = "#new_folder";
  344. client.click(new_folder_btn)
  345. .setAlertText(test_folder)
  346. .acceptAlert();
  347. }
  348. client.click(test_folder_div);
  349. client.element('css selector', "#" + model_name, function (result) {
  350. if (result.status == -1) {
  351. client.click(new_file_text)
  352. .clearValue(new_file_text)
  353. .setValue(new_file_text, model_name)
  354. .click("#dialog_btn");
  355. } else {
  356. client.click("#" + model_name)
  357. .click("#dialog_btn");
  358. }
  359. client.waitForElementNotPresent("#dialog_btn", 1000, "Save menu closes");
  360. }
  361. );
  362. }
  363. );
  364. //COMPILE TO ASMM
  365. let ASMM_button = "#\\2f Toolbars\\2f CompileMenu\\2f CompileMenu\\2e buttons\\2e model\\2f compileToASMM";
  366. client.waitForElementPresent(ASMM_button, 1000, "Looking for ASMM button")
  367. .click(ASMM_button)
  368. .waitForElementPresent("#dialog_btn", 2000, "ASMM menu opens");
  369. client.element('css selector', test_folder_div, function (result) {
  370. if (result.status != -1) {
  371. client.click(test_folder_div);
  372. }
  373. });
  374. let metamodel_name = "autotest.metamodel";
  375. client.element('css selector', "#" + metamodel_name, function (result) {
  376. if (result.status == -1) {
  377. client.click(new_file_text)
  378. .clearValue(new_file_text)
  379. .setValue(new_file_text, metamodel_name)
  380. .click("#dialog_btn");
  381. } else {
  382. client.click("#" + metamodel_name)
  383. .click("#dialog_btn");
  384. }
  385. client.waitForElementNotPresent("#dialog_btn", 2000, "ASMM menu closes");
  386. }
  387. );
  388. client.pause(500);
  389. },
  390. after: function (client) {
  391. client.end();
  392. },
  393. };