05_creating_dsl.js 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071
  1. let test_utils = require('./test_utils');
  2. let model_building_utils = require('./model_building_utils');
  3. let user = "./users/testuser/";
  4. function get_all_attrs() {
  5. return "[\n" +
  6. " {\n" +
  7. " \"name\": \"int\",\n" +
  8. " \"type\": \"int\",\n" +
  9. " \"default\": 0\n" +
  10. " },\n" +
  11. " {\n" +
  12. " \"name\": \"string\",\n" +
  13. " \"type\": \"string\",\n" +
  14. " \"default\": \"hello\"\n" +
  15. " },\n" +
  16. " {\n" +
  17. " \"name\": \"float\",\n" +
  18. " \"type\": \"float\",\n" +
  19. " \"default\": 0\n" +
  20. " },\n" +
  21. " {\n" +
  22. " \"name\": \"boolean\",\n" +
  23. " \"type\": \"boolean\",\n" +
  24. " \"default\": true\n" +
  25. " },\n" +
  26. " {\n" +
  27. " \"name\": \"code\",\n" +
  28. " \"type\": \"code\",\n" +
  29. " \"default\": \"\"\n" +
  30. " },\n" +
  31. " {\n" +
  32. " \"name\": \"file_html\",\n" +
  33. " \"type\": \"file<*.html>\",\n" +
  34. " \"default\": \"\"\n" +
  35. " },\n" +
  36. " {\n" +
  37. " \"name\": \"map_int_string\",\n" +
  38. " \"type\": \"map<int,string>\"\n" +
  39. " },\n" +
  40. " {\n" +
  41. " \"name\": \"list_int\",\n" +
  42. " \"type\": \"list<int>\",\n" +
  43. " \"default\": [\n" +
  44. " 1,\n" +
  45. " 2\n" +
  46. " ]\n" +
  47. " },\n" +
  48. " {\n" +
  49. " \"name\": \"enum\",\n" +
  50. " \"type\": \"ENUM(Red,Green,Blue)\"\n" +
  51. " },\n" +
  52. " {\n" +
  53. " \"name\": \"enum2\",\n" +
  54. " \"type\": \"ENUM(Four,Five,Six,Seven)\"\n" +
  55. " }\n" +
  56. "]";
  57. }
  58. function get_all_attrs2() {
  59. return "[\n" +
  60. " {\n" +
  61. " \"name\": \"name\",\n" +
  62. " \"type\": \"string\",\n" +
  63. " \"default\": \"test\"\n" +
  64. " }" +
  65. "]";
  66. }
  67. function get_all_attrs3() {
  68. return "[\n" +
  69. " {\n" +
  70. " \"name\": \"test\",\n" +
  71. " \"type\": \"string\",\n" +
  72. " \"default\": \"hello\"\n" +
  73. " }" +
  74. "]";
  75. }
  76. let assocs = [
  77. //from, to, name, isContain, out_card, in_card
  78. [0, 1, "testAssoc", false, null, null],
  79. [1, 3, "oneToOne", false,
  80. [{
  81. "dir": "out",
  82. "type": "oneToOne",
  83. "min": "1",
  84. "max": "1"
  85. }],
  86. [{
  87. "dir": "in",
  88. "type": "oneToOne",
  89. "min": "1",
  90. "max": "1"
  91. }]
  92. ],
  93. [4, 5, "ManyToOne", false,
  94. null,
  95. [{
  96. "dir": "in",
  97. "type": "ManyToOne",
  98. "min": "0",
  99. "max": "1"
  100. }]
  101. ],
  102. [6, 7, "Containment", true,
  103. null, null
  104. ],
  105. [8, 8, "self", false,
  106. null, null
  107. ]
  108. ];
  109. module.exports = {
  110. beforeEach: function (client, done) {
  111. client.url('http://localhost:8124/atompm').pause(300).maximizeWindow(done);
  112. },
  113. 'Login': function (client) {
  114. test_utils.login(client);
  115. },
  116. 'Create AS model': function (client) {
  117. let filename = '/Formalisms/__LanguageSyntax__/SimpleClassDiagram/SimpleClassDiagram.umlIcons.metamodel';
  118. test_utils.load_toolbar(client, [filename]);
  119. let classIcon = "#\\/Formalisms\\/__LanguageSyntax__\\/SimpleClassDiagram\\/SimpleClassDiagram\\.umlIcons\\.metamodel\\/ClassIcon";
  120. client.waitForElementPresent(classIcon, 2000, "Check for class icon...");
  121. client.click(classIcon);
  122. let canvas = "#div_canvas";
  123. client.waitForElementPresent(canvas, 1000, "Checking for canvas...");
  124. let test_folder = "autotest";
  125. let name_field = "#tr_name > td:nth-child(2) > textarea";
  126. let num_elements = 0;
  127. //BUILD CLASSES
  128. let start_x = 50;
  129. let x_diff = 350;
  130. let x_coords = [start_x, start_x + x_diff, start_x + 2 * x_diff];
  131. let start_y = 200;
  132. let y_diff = 150;
  133. let y_coords = [start_y, start_y + y_diff, start_y + 2 * y_diff];
  134. let num_classes = x_coords.length * y_coords.length;
  135. num_elements = model_building_utils.create_classes(client, x_coords, y_coords, num_elements);
  136. // SET NAMES FOR CLASSES
  137. for (let i = 0; i < num_classes; i++) {
  138. let class_name = "Class" + String.fromCharCode(65 + i);
  139. let attrs = {};
  140. attrs[name_field] = class_name;
  141. model_building_utils.set_attribs(client, i, attrs);
  142. }
  143. // SET ATTRIBUTES
  144. //TODO: Use modelbuildingutils.set_attribs
  145. let class_div = model_building_utils.get_class_div(8);
  146. let attrib_field = "#tr_attributes > td:nth-child(2) > textarea";
  147. client.moveToElement(class_div, 10, 10)
  148. .mouseButtonClick('middle')
  149. .waitForElementPresent("#dialog_btn", 1000, "Editing menu opens")
  150. .clearValue(attrib_field)
  151. .setValue(attrib_field, get_all_attrs())
  152. .click("#dialog_btn")
  153. .waitForElementNotPresent("#dialog_btn", 1000, "Editing menu closes")
  154. .moveToElement(canvas, 0, 100)
  155. .mouseButtonClick('left')
  156. .pause(500)
  157. ;
  158. let class_div3 = model_building_utils.get_class_div(0);
  159. client.moveToElement(class_div3, 10, 10)
  160. .mouseButtonClick('middle')
  161. .waitForElementPresent("#dialog_btn", 1000, "Editing menu opens")
  162. .clearValue(attrib_field)
  163. .setValue(attrib_field, get_all_attrs3())
  164. .click("#dialog_btn")
  165. .waitForElementNotPresent("#dialog_btn", 1000, "Editing menu closes")
  166. .moveToElement(canvas, 0, 100)
  167. .mouseButtonClick('left')
  168. .pause(500)
  169. ;
  170. let abstract_class = 4;
  171. let class_div2 = model_building_utils.get_class_div(abstract_class);
  172. let checkbox = "#tr_abstract > td:nth-child(2) > input[type=\"checkbox\"]";
  173. model_building_utils.move_to_element_ratio(client, class_div2, 50, 50);
  174. client.mouseButtonClick('middle')
  175. .waitForElementPresent("#dialog_btn", 1000, "Editing menu opens")
  176. .clearValue(attrib_field)
  177. .setValue(attrib_field, get_all_attrs2())
  178. .moveToElement(checkbox, 0, 0)
  179. .mouseButtonClick('left')
  180. .click("#dialog_btn")
  181. .waitForElementNotPresent("#dialog_btn", 1000, "Editing menu closes")
  182. .moveToElement(canvas, 0, 100)
  183. .mouseButtonClick('left')
  184. .pause(500)
  185. ;
  186. //CREATE INHERITANCE
  187. let inheri_classes = [
  188. [abstract_class, abstract_class + 1],
  189. [abstract_class, abstract_class + 3]];
  190. for (let inheri_set of inheri_classes) {
  191. let sup = model_building_utils.get_class_div(inheri_set[0]);
  192. let sub = model_building_utils.get_class_div(inheri_set[1]);
  193. let inheri_relation = "#div_dialog_0 > select > option:nth-child(2)";
  194. //tiny offset to not hit other arrows
  195. let offset = 2 * inheri_set[1];
  196. client
  197. .moveToElement(sub, 50, 50)
  198. .mouseButtonDown('right')
  199. .moveToElement(sup, 50 + offset, 50 + offset)
  200. .mouseButtonUp('right')
  201. .pause(500)
  202. .click(inheri_relation)
  203. .waitForElementPresent("#dialog_btn", 1000, "Inheri menu opens")
  204. .click("#dialog_btn")
  205. .pause(500)
  206. .waitForElementNotPresent("#dialog_btn", 1000, "Inheri menu closes")
  207. .moveToElement(canvas, 0, 100)
  208. .mouseButtonClick('left')
  209. .pause(500)
  210. ;
  211. num_elements++;
  212. }
  213. //SET ASSOCS
  214. client.pause(500);
  215. let assoc_num = 0;
  216. for (let assoc of assocs) {
  217. let from_ele = model_building_utils.get_class_div(assoc[0]);
  218. let to_ele = model_building_utils.get_class_div(assoc[1]);
  219. let name = assoc[2];
  220. let isContain = assoc[3];
  221. let out_card = assoc[4];
  222. let in_card = assoc[5];
  223. let cardinality_field = "#tr_cardinalities > td:nth-child(2) > textarea";
  224. let assoc_div = model_building_utils.get_assoc_div(num_elements);
  225. assoc_num++;
  226. num_elements++;
  227. let assoc_relation = "#div_dialog_0 > select > option:nth-child(1)";
  228. //tiny offset to not hit other arrows
  229. let offset = 2 * assoc[0] + 2 * assoc[1];
  230. client
  231. .moveToElement(from_ele, 20, 20)
  232. .mouseButtonDown('right')
  233. .moveToElement(to_ele, 20 + offset, 20 + offset)
  234. .mouseButtonUp('right')
  235. .pause(500)
  236. .click(assoc_relation)
  237. .waitForElementPresent("#dialog_btn", 1000, "Assoc menu opens")
  238. .click("#dialog_btn")
  239. .pause(500)
  240. .waitForElementNotPresent("#dialog_btn", 1000, "Assoc menu closes")
  241. .moveToElement(canvas, 0, 100)
  242. .mouseButtonClick('left')
  243. .pause(500)
  244. .waitForElementPresent(assoc_div, 1000, "Assoc name present: " + assoc_div);
  245. if (out_card) {
  246. model_building_utils.move_to_element_ratio(client, from_ele, 50, 50);
  247. client.mouseButtonClick('middle')
  248. .waitForElementPresent("#dialog_btn", 1000, "Out card menu opens")
  249. .clearValue(cardinality_field)
  250. .setValue(cardinality_field, JSON.stringify(out_card))
  251. .click("#dialog_btn")
  252. .waitForElementNotPresent("#dialog_btn", 1000, "Out card menu closes")
  253. .moveToElement(canvas, 0, 100)
  254. .mouseButtonClick('left')
  255. .pause(500);
  256. }
  257. if (in_card) {
  258. model_building_utils.move_to_element_ratio(client, to_ele, 50, 50);
  259. client.mouseButtonClick('middle')
  260. .waitForElementPresent("#dialog_btn", 1000, "Out card menu opens")
  261. .clearValue(cardinality_field)
  262. .setValue(cardinality_field, JSON.stringify(in_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. client.getElementSize(assoc_div, function (result) {
  270. model_building_utils.move_to_element_ratio(client, assoc_div, 50, 50);
  271. client.mouseButtonClick('middle')
  272. .waitForElementPresent("#dialog_btn", 1000, "Editing assoc name opens")
  273. .clearValue(name_field)
  274. .setValue(name_field, name);
  275. if (isContain) {
  276. let contain_opt = "#tr_linktype > td:nth-child(2) > select > option:nth-child(2)";
  277. client
  278. .moveToElement(contain_opt, 0, 0)
  279. .mouseButtonClick('left');
  280. }
  281. if (out_card) {
  282. client
  283. .moveToElement(from_ele, 10, 10)
  284. .mouseButtonClick('middle')
  285. .waitForElementPresent("#dialog_btn", 1000, "Out card menu opens")
  286. .clearValue(cardinality_field)
  287. .setValue(cardinality_field, JSON.stringify(out_card))
  288. .click("#dialog_btn")
  289. .waitForElementNotPresent("#dialog_btn", 1000, "Out card menu closes")
  290. .moveToElement(canvas, 0, 100)
  291. .mouseButtonClick('left')
  292. .pause(500);
  293. }
  294. if (in_card) {
  295. client
  296. .moveToElement(to_ele, 10, 10)
  297. .mouseButtonClick('middle')
  298. .waitForElementPresent("#dialog_btn", 1000, "Out card menu opens")
  299. .clearValue(cardinality_field)
  300. .setValue(cardinality_field, JSON.stringify(in_card))
  301. .click("#dialog_btn")
  302. .waitForElementNotPresent("#dialog_btn", 1000, "Out card menu closes")
  303. .moveToElement(canvas, 0, 100)
  304. .mouseButtonClick('left')
  305. .pause(500);
  306. }
  307. client.getElementSize(assoc_div, function (result) {
  308. model_building_utils.move_to_element_ratio(client, assoc_div, 50, 50)
  309. client.mouseButtonClick('middle')
  310. .waitForElementPresent("#dialog_btn", 1000, "Editing assoc name opens")
  311. .clearValue(name_field)
  312. .setValue(name_field, name);
  313. if (isContain) {
  314. let contain_opt = "#tr_linktype > td:nth-child(2) > select > option:nth-child(2)";
  315. client
  316. .moveToElement(contain_opt, 0, 0)
  317. .mouseButtonClick('left');
  318. }
  319. client
  320. .click("#dialog_btn")
  321. .waitForElementNotPresent("#dialog_btn", 1000, "Editing assoc name closes")
  322. .moveToElement(canvas, 0, 100)
  323. .mouseButtonClick('left')
  324. .pause(500);
  325. })
  326. client
  327. .click("#dialog_btn")
  328. .waitForElementNotPresent("#dialog_btn", 1000, "Editing assoc name closes")
  329. .moveToElement(canvas, 0, 100)
  330. .mouseButtonClick('left')
  331. .pause(500);
  332. })
  333. ;
  334. }
  335. //CREATE CONSTRAINT
  336. let constraint_div = model_building_utils.get_element_div("GlobalConstraintIcon", num_elements);
  337. let constraintIcon = "#\\2f Formalisms\\2f __LanguageSyntax__\\2f SimpleClassDiagram\\2f SimpleClassDiagram\\2e umlIcons\\2e metamodel\\2f GlobalConstraintIcon";
  338. client.waitForElementPresent(constraintIcon, 2000, "Check for constraint icon...");
  339. client.click(constraintIcon);
  340. client
  341. .moveToElement(canvas, 100, 150)
  342. .mouseButtonClick('right')
  343. .pause(500)
  344. .waitForElementPresent(constraint_div, 500, "Created class: " + constraint_div);
  345. let pre_create_opt = "#tr_event > td:nth-child(2) > select > option:nth-child(2)";
  346. let code_field = "#tr_code > td:nth-child(2) > textarea";
  347. let validate_choice = "#choice_validate";
  348. let constraint_code = "let C_classes = getAllNodes(['/autotest/autotest/ClassC']);\n" +
  349. "C_classes.length <= 2;";
  350. client
  351. .moveToElement(constraint_div, 10, 10)
  352. .mouseButtonClick('middle')
  353. .waitForElementPresent("#dialog_btn", 1000, "Constraint menu opens")
  354. .clearValue(name_field)
  355. .setValue(name_field, "max-two-instances")
  356. .waitForElementPresent(validate_choice, 2000, "Find validate option")
  357. .click(validate_choice)
  358. .moveToElement(pre_create_opt, 0, 0)
  359. .mouseButtonClick('left')
  360. .clearValue(code_field)
  361. .setValue(code_field, constraint_code)
  362. .click("#dialog_btn")
  363. .waitForElementNotPresent("#dialog_btn", 1000, "Constraint menu closes")
  364. .moveToElement(canvas, 0, 100)
  365. .mouseButtonClick('left')
  366. .pause(1000);
  367. //SAVE MODEL
  368. let model_name = "autotest.model";
  369. let folder_name = "autotest";
  370. model_building_utils.save_model(client, folder_name, model_name);
  371. //COMPILE TO ASMM
  372. let metamodel_name = "autotest.metamodel";
  373. model_building_utils.compile_model(client, "AS", folder_name, metamodel_name);
  374. client.pause(500);
  375. },
  376. 'Create CS model': function (client) {
  377. let filename = '/Formalisms/__LanguageSyntax__/ConcreteSyntax/ConcreteSyntax.defaultIcons.metamodel';
  378. test_utils.load_toolbar(client, [filename]);
  379. let classIcon = "#\\/Formalisms\\/__LanguageSyntax__\\/ConcreteSyntax\\/ConcreteSyntax\\.defaultIcons\\.metamodel\\/IconIcon";
  380. client.waitForElementPresent(classIcon, 2000, "Check for class icon...");
  381. client.click(classIcon);
  382. let canvas = "#div_canvas";
  383. client.waitForElementPresent(canvas, 1000, "Checking for canvas...");
  384. let test_folder = "autotest";
  385. let name_field = "#tr_typename > td:nth-child(2) > textarea";
  386. let num_elements = 0;
  387. //BUILD CLASSES
  388. let icon_type = "#\\/Formalisms\\/__LanguageSyntax__\\/ConcreteSyntax\\/ConcreteSyntax\\.defaultIcons\\/IconIcon\\/";
  389. let start_x = 100;
  390. let x_diff = 225;
  391. let x_coords = [start_x, start_x + x_diff, start_x + 2 * x_diff];
  392. let start_y = 150;
  393. let y_diff = 180;
  394. let y_coords = [start_y, start_y + y_diff, start_y + 2 * y_diff];
  395. let num_classes = x_coords.length * y_coords.length;
  396. num_elements = model_building_utils.create_classes(client, x_coords, y_coords, num_elements, icon_type);
  397. //SET NAMES FOR CLASSES
  398. for (let i = 0; i < num_classes; i++) {
  399. let class_name = "Class" + String.fromCharCode(65 + i) + "Icon";
  400. let attrs = {};
  401. attrs[name_field] = class_name;
  402. model_building_utils.set_attribs(client, i, attrs, icon_type);
  403. }
  404. // BUILD TEXT FOR ICONS
  405. let textIcon = "#\\/Formalisms\\/__LanguageSyntax__\\/ConcreteSyntax\\/ConcreteSyntax\\.defaultIcons\\.metamodel\\/TextIcon";
  406. let textType = "#\\/Formalisms\\/__LanguageSyntax__\\/ConcreteSyntax\\/ConcreteSyntax\\.defaultIcons\\/TextIcon\\/";
  407. let textContent_field = "#tr_textContent > td:nth-child(2) > textarea";
  408. client.waitForElementPresent(textIcon, 2000, "Check for text icon...");
  409. client.click(textIcon);
  410. for (let i = 0; i < num_classes; i++) {
  411. let text = "Class" + String.fromCharCode(65 + i);
  412. let textDiv = model_building_utils.build_div(textType, num_elements);
  413. let iconDiv = model_building_utils.build_div(icon_type, i);
  414. let attrs = {};
  415. attrs[textContent_field] = text;
  416. client
  417. .pause(300)
  418. .moveToElement(canvas, 20, 200)
  419. .mouseButtonClick('right')
  420. .pause(500)
  421. .waitForElementPresent(textDiv, 500, "Created text: " + textDiv);
  422. model_building_utils.set_attribs(client, num_elements, attrs, textType);
  423. num_elements++;
  424. client.moveToElement(textDiv, 10, 10)
  425. .mouseButtonClick('left')
  426. .pause(300)
  427. .mouseButtonDown('left')
  428. .pause(300);
  429. model_building_utils.move_to_element_ratio(client, iconDiv, 35, 15);
  430. client.mouseButtonUp('left');
  431. model_building_utils.click_off(client);
  432. //inner link counts as an element
  433. num_elements++;
  434. }
  435. // BUILD SYMBOLS FOR ICONS
  436. let symbols = ["PathIcon", "CircleIcon", "StarIcon", "PolygonIcon", "EllipseIcon", "EllipseIcon", "RectangleIcon", "ImageIcon"];
  437. let getIcon = function (type) {
  438. return "#\\/Formalisms\\/__LanguageSyntax__\\/ConcreteSyntax\\/ConcreteSyntax\\.defaultIcons\\.metamodel\\/" + type;
  439. };
  440. let getType = function (type) {
  441. return "#\\/Formalisms\\/__LanguageSyntax__\\/ConcreteSyntax\\/ConcreteSyntax\\.defaultIcons\\/" + type + "\\/";
  442. };
  443. for (let i = 0; i < num_classes; i++) {
  444. let currSymbol = symbols[i % symbols.length];
  445. client.waitForElementPresent(getIcon(currSymbol), 2000, "Check for symbol icon...");
  446. client.click(getIcon(currSymbol));
  447. let symbolDiv = model_building_utils.build_div(getType(currSymbol), num_elements);
  448. let iconDiv = model_building_utils.build_div(icon_type, i);
  449. client
  450. .pause(300)
  451. .moveToElement(canvas, 50, 200)
  452. .mouseButtonClick('right')
  453. .pause(1000)
  454. .waitForElementPresent(symbolDiv, 500, "Created symbol: " + symbolDiv);
  455. model_building_utils.click_off(client);
  456. num_elements++;
  457. model_building_utils.move_to_element_ratio(client, symbolDiv, 50, 50);
  458. client
  459. .mouseButtonClick('left')
  460. .pause(300)
  461. .mouseButtonDown('left')
  462. .pause(300);
  463. model_building_utils.move_to_element_ratio(client, iconDiv, 50, 55);
  464. client.pause(300).mouseButtonUp('left');
  465. model_building_utils.click_off(client);
  466. //inner link counts as an element
  467. num_elements++;
  468. }
  469. // BUILD LINKS
  470. let linkIcon = "#\\/Formalisms\\/__LanguageSyntax__\\/ConcreteSyntax\\/ConcreteSyntax\\.defaultIcons\\.metamodel\\/LinkIcon";
  471. let linkType = "#\\/Formalisms\\/__LanguageSyntax__\\/ConcreteSyntax\\/ConcreteSyntax\\.defaultIcons\\/LinkIcon\\/";
  472. let link_typename_field = "#tr_typename > td:nth-child(2) > textarea";
  473. let link_y_coords = [];
  474. let link_x_coords = [start_x + 3 * x_diff, start_x + 4 * x_diff];
  475. for (let i = 0; i < assocs.length / 2; i++) {
  476. link_y_coords.push(start_y + i * y_diff);
  477. }
  478. client.waitForElementPresent(linkIcon, 2000, "Check for link icon...");
  479. client.click(linkIcon);
  480. let num_elements_before = num_elements;
  481. model_building_utils.create_classes(client, link_x_coords, link_y_coords, num_elements, linkType);
  482. //SET NAMES FOR LINKS
  483. for (let i = 0; i < assocs.length; i++) {
  484. let link_name = assocs[i][2] + "Link";
  485. let attrs = {};
  486. attrs[link_typename_field] = link_name;
  487. model_building_utils.set_attribs(client, num_elements_before + i, attrs, linkType);
  488. }
  489. //remove unneeded elements
  490. model_building_utils.delete_element(client, model_building_utils.build_div(icon_type, 4));
  491. model_building_utils.delete_element(client, model_building_utils.build_div(linkType, 50));
  492. let folder_name = "autotest";
  493. model_building_utils.save_model(client, folder_name, "autotestCS.model");
  494. model_building_utils.compile_model(client, "CS", folder_name, "autotest.defaultIcons.metamodel");
  495. client.pause(1000);
  496. },
  497. 'Create model': function (client) {
  498. let test_toolbar = '/autotest/autotest.defaultIcons.metamodel';
  499. test_utils.load_toolbar(client, [test_toolbar]);
  500. let class_names = [];
  501. for (let i = 0; i < 9; i++) {
  502. let class_name = "Class" + String.fromCharCode(65 + i) + "Icon";
  503. if (class_name == "ClassEIcon") {
  504. continue; //skip ClassEIcon
  505. }
  506. class_names.push(class_name);
  507. }
  508. //BUILD CLASSES
  509. let class_icon = "#\\2f autotest\\2f autotest\\2e defaultIcons\\2e metamodel\\2f ";
  510. let class_type = "#\\2f autotest\\2f autotest\\2e defaultIcons\\2f ";
  511. let start_x = 200;
  512. let x_diff = 300;
  513. let x_coords = [start_x, start_x + x_diff, start_x + 2 * x_diff];
  514. let start_y = 150;
  515. let y_diff = 180;
  516. let y_coords = [start_y, start_y + y_diff, start_y + 2 * y_diff];
  517. let coords = [];
  518. for (let x of x_coords) {
  519. for (let y of y_coords) {
  520. coords.push([x, y]);
  521. }
  522. }
  523. let num_elements = 0;
  524. let element_map = {};
  525. for (let i = 0; i < class_names.length; i++) {
  526. let class_name = class_names[i];
  527. let class_btn = class_icon + class_name;
  528. client.waitForElementPresent(class_btn, 2000, "Check for class icon: " + class_btn);
  529. client.click(class_btn);
  530. let class_div = class_type + class_name + "\\2f ";
  531. let built_class_div = model_building_utils.create_class(client, coords[i][0], coords[i][1], num_elements, class_div);
  532. element_map[class_name] = built_class_div;
  533. num_elements++;
  534. }
  535. model_building_utils.click_off(client);
  536. // BUILD ASSOCIATIONS
  537. for (let assoc of assocs) {
  538. let from_class_name = "Class" + String.fromCharCode(65 + assoc[0]) + "Icon";
  539. let to_class_name = "Class" + String.fromCharCode(65 + assoc[1]) + "Icon";
  540. if (from_class_name == "ClassEIcon") {
  541. from_class_name = "ClassHIcon";
  542. }
  543. if (to_class_name == "ClassEIcon") {
  544. from_class_name = "ClassFIcon";
  545. }
  546. //select the text of the class
  547. let text_div = " > text:nth-child(1)";
  548. let from_class_div = element_map[from_class_name] + text_div;
  549. let to_class_div = element_map[to_class_name] + text_div;
  550. // console.log(from_class_div);
  551. // console.log(to_class_div);
  552. let isContainAssoc = assoc[3];
  553. if (!isContainAssoc) {
  554. model_building_utils.move_to_element_ratio(client, from_class_div, 20, 50);
  555. client.mouseButtonDown('right');
  556. model_building_utils.move_to_element_ratio(client, to_class_div, 80, 50);
  557. client.mouseButtonUp('right').pause(300);
  558. } else {
  559. model_building_utils.move_to_element_ratio(client, to_class_div, 30, 50);
  560. client.mouseButtonClick('left').pause(300);
  561. client.mouseButtonDown('left');
  562. model_building_utils.move_to_element_ratio(client, from_class_div, 50, 120);
  563. client.mouseButtonUp('left').pause(300);
  564. }
  565. num_elements++;
  566. model_building_utils.click_off(client);
  567. }
  568. //SCALE AND ROTATE TESTS
  569. let scale_element_div = "#\\/autotest\\/autotest\\.defaultIcons\\/ClassDIcon\\/3\\.instance";
  570. model_building_utils.move_to_element_ratio(client, scale_element_div, 50, 50);
  571. client.mouseButtonClick('left').pause(300);
  572. //client.setValue(scale_element_div, client.Keys.CONTROL);
  573. //TODO: Can't send CONTROL key
  574. client.execute(function () {
  575. GeometryUtils.showGeometryControlsOverlay();
  576. }, [], null);
  577. let resize_btn_div = "#resize_btn";
  578. let resizeH_btn_div = "#resizeH_btn";
  579. let resizeW_btn_div = "#resizeW_btn";
  580. let rotate_btn_div = "#rotate_btn";
  581. let ok_btn_div = "#ok_btn";
  582. model_building_utils.scroll_geometry_element(client, resize_btn_div, 120, 8);
  583. model_building_utils.scroll_geometry_element(client, resizeH_btn_div, -120, 4);
  584. model_building_utils.scroll_geometry_element(client, resizeW_btn_div, -120, 4);
  585. model_building_utils.scroll_geometry_element(client, rotate_btn_div, 120, 8);
  586. client.click(ok_btn_div).pause(500);
  587. model_building_utils.click_off(client);
  588. //SET ATTRIBUTES
  589. let IClass = "#\\/autotest\\/autotest\\.defaultIcons\\/ClassIIcon\\/";
  590. let AAttribs = {};
  591. AAttribs['int'] = 123;
  592. AAttribs['string'] = "bonjour";
  593. AAttribs['float'] = "123.456";
  594. AAttribs['boolean'] = false;
  595. let attribs = {};
  596. for (let [key, value] of Object.entries(AAttribs)) {
  597. let new_key = "#tr_" + key + " > td:nth-child(2) > textarea:nth-child(1)";
  598. attribs[new_key] = value;
  599. }
  600. //TODO: Set other attribs
  601. let div_suffix = " > text";
  602. model_building_utils.set_attribs(client, 7, attribs, IClass, div_suffix, [1, 1]);
  603. // VERIFY MODEL
  604. let verify_btn = "#\\/Toolbars\\/MainMenu\\/MainMenu\\.buttons\\.model\\/validateM";
  605. let dialog_btn = "#dialog_btn";
  606. client.waitForElementPresent(verify_btn, 2000, "Find verify button")
  607. .click(verify_btn)
  608. .waitForElementNotPresent(dialog_btn, 2000, "No constraint violation");
  609. let new_x = start_x + 3 * x_diff;
  610. let class_btn = class_icon + "ClassCIcon";
  611. let CClass_type = "#\\/autotest\\/autotest\\.defaultIcons\\/ClassCIcon\\/";
  612. client.click(class_btn);
  613. model_building_utils.create_class(client, new_x, start_y, num_elements, CClass_type);
  614. model_building_utils.create_class(client, new_x, start_y + y_diff, num_elements, CClass_type);
  615. client.click(verify_btn)
  616. .waitForElementPresent(dialog_btn, 2000, "Constraint violation")
  617. .click(dialog_btn).pause(1000);
  618. model_building_utils.click_off(client);
  619. // SAVE INSTANCE MODEL
  620. let folder_name = "autotest";
  621. model_building_utils.save_model(client, folder_name, "autotest_instance.model");
  622. client.pause(1000);
  623. },
  624. 'Create CS model': function (client) {
  625. let filename = '/Formalisms/__LanguageSyntax__/ConcreteSyntax/ConcreteSyntax.defaultIcons.metamodel';
  626. test_utils.load_toolbar(client, [filename]);
  627. let classIcon = "#\\/Formalisms\\/__LanguageSyntax__\\/ConcreteSyntax\\/ConcreteSyntax\\.defaultIcons\\.metamodel\\/IconIcon";
  628. client.waitForElementPresent(classIcon, 2000, "Check for class icon...");
  629. client.click(classIcon);
  630. let canvas = "#div_canvas";
  631. client.waitForElementPresent(canvas, 1000, "Checking for canvas...");
  632. let test_folder = "autotest";
  633. let name_field = "#tr_typename > td:nth-child(2) > textarea";
  634. let num_elements = 0;
  635. //BUILD CLASSES
  636. let icon_type = "#\\/Formalisms\\/__LanguageSyntax__\\/ConcreteSyntax\\/ConcreteSyntax\\.defaultIcons\\/IconIcon\\/";
  637. let start_x = 200;
  638. let x_diff = 250;
  639. let x_coords = [start_x, start_x + x_diff, start_x + 2 * x_diff];
  640. let start_y = 150;
  641. let y_diff = 180;
  642. let y_coords = [start_y, start_y + y_diff, start_y + 2 * y_diff];
  643. let num_classes = x_coords.length * y_coords.length;
  644. num_elements = model_building_utils.create_classes(client, x_coords, y_coords, num_elements, icon_type);
  645. //SET NAMES FOR CLASSES
  646. for (let i = 0; i < num_classes; i++) {
  647. let class_name = "Class" + String.fromCharCode(65 + i) + "Icon";
  648. let attrs = {};
  649. attrs[name_field] = class_name;
  650. model_building_utils.set_attribs(client, i, attrs, icon_type);
  651. }
  652. // BUILD TEXT FOR ICONS
  653. let textIcon = "#\\/Formalisms\\/__LanguageSyntax__\\/ConcreteSyntax\\/ConcreteSyntax\\.defaultIcons\\.metamodel\\/TextIcon";
  654. let textType = "#\\/Formalisms\\/__LanguageSyntax__\\/ConcreteSyntax\\/ConcreteSyntax\\.defaultIcons\\/TextIcon\\/";
  655. let textContent_field = "#tr_textContent > td:nth-child(2) > textarea";
  656. client.waitForElementPresent(textIcon, 2000, "Check for text icon...");
  657. client.click(textIcon);
  658. for (let i = 0; i < num_classes; i++) {
  659. let text = "Class" + String.fromCharCode(65 + i);
  660. let textDiv = model_building_utils.build_div(textType, num_elements);
  661. let iconDiv = model_building_utils.build_div(icon_type, i);
  662. let attrs = {};
  663. attrs[textContent_field] = text;
  664. client
  665. .pause(300)
  666. .moveToElement(canvas, 20, 200)
  667. .mouseButtonClick('right')
  668. .pause(500)
  669. .waitForElementPresent(textDiv, 500, "Created text: " + textDiv);
  670. model_building_utils.set_attribs(client, num_elements, attrs, textType);
  671. num_elements++;
  672. client.moveToElement(textDiv, 10, 10)
  673. .mouseButtonClick('left')
  674. .pause(300)
  675. .mouseButtonDown('left')
  676. .pause(300);
  677. model_building_utils.move_to_element_ratio(client, iconDiv, 35, 15);
  678. client.mouseButtonUp('left');
  679. model_building_utils.click_off(client);
  680. //inner link counts as an element
  681. num_elements++;
  682. }
  683. // BUILD SYMBOLS FOR ICONS
  684. let symbols = ["PathIcon", "CircleIcon", "StarIcon", "PolygonIcon", "EllipseIcon", "EllipseIcon", "RectangleIcon", "ImageIcon"];
  685. let getIcon = function (type) {
  686. return "#\\/Formalisms\\/__LanguageSyntax__\\/ConcreteSyntax\\/ConcreteSyntax\\.defaultIcons\\.metamodel\\/" + type;
  687. };
  688. let getType = function (type) {
  689. return "#\\/Formalisms\\/__LanguageSyntax__\\/ConcreteSyntax\\/ConcreteSyntax\\.defaultIcons\\/" + type + "\\/";
  690. };
  691. for (let i = 0; i < num_classes; i++) {
  692. let currSymbol = symbols[i % symbols.length];
  693. client.waitForElementPresent(getIcon(currSymbol), 2000, "Check for symbol icon...");
  694. client.click(getIcon(currSymbol));
  695. let symbolDiv = model_building_utils.build_div(getType(currSymbol), num_elements);
  696. let iconDiv = model_building_utils.build_div(icon_type, i);
  697. client
  698. .pause(300)
  699. .moveToElement(canvas, 50, 200)
  700. .mouseButtonClick('right')
  701. .pause(1000)
  702. .waitForElementPresent(symbolDiv, 500, "Created symbol: " + symbolDiv);
  703. model_building_utils.click_off(client);
  704. num_elements++;
  705. model_building_utils.move_to_element_ratio(client, symbolDiv, 50, 50);
  706. client
  707. .mouseButtonClick('left')
  708. .pause(300)
  709. .mouseButtonDown('left')
  710. .pause(300);
  711. model_building_utils.move_to_element_ratio(client, iconDiv, 50, 55);
  712. client.pause(300).mouseButtonUp('left');
  713. model_building_utils.click_off(client);
  714. //inner link counts as an element
  715. num_elements++;
  716. }
  717. // BUILD LINKS
  718. let linkIcon = "#\\/Formalisms\\/__LanguageSyntax__\\/ConcreteSyntax\\/ConcreteSyntax\\.defaultIcons\\.metamodel\\/LinkIcon";
  719. let linkType = "#\\/Formalisms\\/__LanguageSyntax__\\/ConcreteSyntax\\/ConcreteSyntax\\.defaultIcons\\/LinkIcon\\/";
  720. let link_typename_field = "#tr_typename > td:nth-child(2) > textarea";
  721. let link_y_coords = [];
  722. let link_x_coords = [start_x + 3 * x_diff, start_x + 4 * x_diff];
  723. for (let i = 0; i < assocs.length / 2; i++) {
  724. link_y_coords.push(start_y + i * y_diff);
  725. }
  726. client.waitForElementPresent(linkIcon, 2000, "Check for link icon...");
  727. client.click(linkIcon);
  728. let num_elements_before = num_elements;
  729. model_building_utils.create_classes(client, link_x_coords, link_y_coords, num_elements, linkType);
  730. //SET NAMES FOR LINKS
  731. for (let i = 0; i < assocs.length; i++) {
  732. let link_name = assocs[i][2] + "Link";
  733. let attrs = {};
  734. attrs[link_typename_field] = link_name;
  735. model_building_utils.set_attribs(client, num_elements_before + i, attrs, linkType);
  736. }
  737. //remove unneeded elements
  738. model_building_utils.delete_element(client, model_building_utils.build_div(icon_type, 4));
  739. model_building_utils.delete_element(client, model_building_utils.build_div(linkType, 50));
  740. let folder_name = "autotest";
  741. model_building_utils.save_model(client, folder_name, "autotestCS.model");
  742. model_building_utils.compile_model(client, "CS", folder_name, "autotest.defaultIcons.metamodel");
  743. client.pause(1000);
  744. },
  745. 'Create model': function (client) {
  746. let test_toolbar = '/autotest/autotest.defaultIcons.metamodel';
  747. test_utils.load_toolbar(client, [test_toolbar]);
  748. let class_names = [];
  749. for (let i = 0; i < 9; i++) {
  750. let class_name = "Class" + String.fromCharCode(65 + i) + "Icon";
  751. if (class_name == "ClassEIcon") {
  752. continue; //skip ClassEIcon
  753. }
  754. class_names.push(class_name);
  755. }
  756. //BUILD CLASSES
  757. let class_icon = "#\\2f autotest\\2f autotest\\2e defaultIcons\\2e metamodel\\2f ";
  758. let class_type = "#\\2f autotest\\2f autotest\\2e defaultIcons\\2f ";
  759. let start_x = 200;
  760. let x_diff = 300;
  761. let x_coords = [start_x, start_x + x_diff, start_x + 2 * x_diff];
  762. let start_y = 150;
  763. let y_diff = 180;
  764. let y_coords = [start_y, start_y + y_diff, start_y + 2 * y_diff];
  765. let coords = [];
  766. for (let x of x_coords) {
  767. for (let y of y_coords) {
  768. coords.push([x, y]);
  769. }
  770. }
  771. let num_elements = 0;
  772. let element_map = {};
  773. for (let i = 0; i < class_names.length; i++) {
  774. let class_name = class_names[i];
  775. let class_btn = class_icon + class_name;
  776. client.waitForElementPresent(class_btn, 2000, "Check for class icon: " + class_btn);
  777. client.click(class_btn);
  778. let class_div = class_type + class_name + "\\2f ";
  779. let built_class_div = model_building_utils.create_class(client, coords[i][0], coords[i][1], num_elements, class_div);
  780. element_map[class_name] = built_class_div;
  781. num_elements++;
  782. }
  783. model_building_utils.click_off(client);
  784. // BUILD ASSOCIATIONS
  785. for (let assoc of assocs) {
  786. let from_class_name = "Class" + String.fromCharCode(65 + assoc[0]) + "Icon";
  787. let to_class_name = "Class" + String.fromCharCode(65 + assoc[1]) + "Icon";
  788. if (from_class_name == "ClassEIcon") {
  789. from_class_name = "ClassHIcon";
  790. }
  791. if (to_class_name == "ClassEIcon") {
  792. from_class_name = "ClassFIcon";
  793. }
  794. //select the text of the class
  795. let text_div = " > text:nth-child(1)";
  796. let from_class_div = element_map[from_class_name] + text_div;
  797. let to_class_div = element_map[to_class_name] + text_div;
  798. // console.log(from_class_div);
  799. // console.log(to_class_div);
  800. let isContainAssoc = assoc[3];
  801. if (!isContainAssoc) {
  802. model_building_utils.move_to_element_ratio(client, from_class_div, 30, 50);
  803. client.mouseButtonDown('right');
  804. model_building_utils.move_to_element_ratio(client, to_class_div, 70, 50);
  805. client.mouseButtonUp('right').pause(2000);
  806. } else {
  807. model_building_utils.move_to_element_ratio(client, to_class_div, 30, 50);
  808. client.mouseButtonClick('left').pause(500);
  809. client.mouseButtonDown('left');
  810. model_building_utils.move_to_element_ratio(client, from_class_div, 50, 120);
  811. client.mouseButtonUp('left').pause(2000);
  812. }
  813. model_building_utils.click_off(client);
  814. }
  815. // SAVE INSTANCE MODEL
  816. let folder_name = "autotest";
  817. model_building_utils.save_model(client, folder_name, "autotest_instance.model");
  818. client.pause(1000);
  819. },
  820. after: function (client) {
  821. client.end();
  822. },
  823. };