#42 Fix undo action and add new tests

Merged
simon merged 17 commits from bentley/master into simon/master 5 years ago

+ 35 - 10
__worker.js

@@ -106,10 +106,16 @@
 
 /**************************** LIBRARIES and GLOBALS ****************************/
 var  _util 	= require('util'),
+
+	 _path 	= require('path'),
 	 _http 	= require('http'),
 	 _do  	= require('./___do'),
 	 _fs 	 	= _do.convert(require('fs'), ['readFile', 'writeFile', 'readdir']),
+	 _fspp	= _do.convert(require('./___fs++'), ['mkdirs']),	 
+	 _siocl	= require('socket.io-client'),
 	 _utils	= require('./utils'),
+	 _styleinfo = require('./styleinfo'),
+	 _svg		= require('./libsvg').SVG,
 	 _wlib,
 	 _mmmk,
 	 _mt,
@@ -497,13 +503,13 @@ process.on('message',
 			__wtype = msg['workerType'];
 			__wid   = msg['workerId'];
 
-            if (__wtype == "/asworker") {
-                _wlib = require("./asworker");
-            } else if (__wtype == "/csworker") {
-                _wlib = require("./csworker");
-            } else {
-                throw "Error! Unknown worker type: " + __wtype;
-            }
+			if (__wtype == "/asworker") {
+				_wlib = require("./asworker");
+			}else if (__wtype == "/csworker") {
+				_wlib = require("./csworker");
+			}else {
+				 throw "Error! Unknown worker type: " + __wtype;
+			}
 			_mmmk   = require('./mmmk');
 
             _mt  	  = require('./libmt');
@@ -834,6 +840,23 @@ function POST_batchedit(resp,reqData)
 	);
 }
 
+//required so that csworker has access to these variables
+function get__ids2uris(){
+	return __ids2uris;
+}
+function set__ids2uris(new__ids2uris){
+	__ids2uris = new__ids2uris;
+}
+function get__nextSequenceNumber(){
+	return get__nextSequenceNumber;
+}
+function set__nextSequenceNumber(new__nextSequenceNumber){
+	__nextSequenceNumber = new__nextSequenceNumber;
+}
+function get__wtype(){
+	return __wtype;
+}
+
 module.exports = {
 	__errorContinuable,
 	__successContinuable,
@@ -853,8 +876,10 @@ module.exports = {
 	GET__current_state,
 
 	//GLOBAL VARS
-	__ids2uris,
-	__nextSequenceNumber,
-	__wtype,
+	get__ids2uris,
+	set__ids2uris,
+	get__nextSequenceNumber,
+	set__nextSequenceNumber,
+	get__wtype,
 
 };

+ 0 - 1
asworker.js

@@ -5,7 +5,6 @@
 const {
     __errorContinuable,
     __httpReq,
-	__wHttpReq,
     __postInternalErrorMsg, __postMessage,
     __sequenceNumber,
     __successContinuable,

+ 1 - 1
client/constants.js

@@ -7,7 +7,7 @@
 var __WEBPAGE__ = 'https://atompm.github.io/',
 	__RELEASE_LOC__ = "https://api.github.com/repos/AToMPM/atompm/releases/latest",
 	__DOC_WEBPAGE__ = "https://msdl.uantwerpen.be/documentation/AToMPM/index.html",
-    __VERSION__ = '0.8.2',
+    __VERSION__ = '0.8.3',
     __DEFAULT_SAVEAS		 	= '.autosave.model',
 	 __TITLE						= 'AToMPM',
 	 __EXITWARNING				= 'There are unsaved changes. Proceeding will cause'+

+ 24 - 22
csworker.js

@@ -177,21 +177,21 @@
 			SYSOUT message announcing the launching of the rule... a sensible and 
 		  	nice solution would be not to remember such changelogs in
 			__handledSeqNums */
-let {
-    __id_to_uri,
-    __ids2uris, __nextSequenceNumber,
-    __postBadReqErrorMsg,
-    __postForbiddenErrorMsg,
-    __wtype,
-    GET__current_state
-} = require("./__worker");
 
 const {
 	__batchCheckpoint,
     __errorContinuable,
-    __httpReq,
+	GET__current_state,
+	get__ids2uris,
+	set__ids2uris,
+	get__nextSequenceNumber,
+	set__nextSequenceNumber,
+	get__wtype,
+     __httpReq,
+	__id_to_uri,
 	__wHttpReq,
     __postInternalErrorMsg, __postMessage,
+	__postBadReqErrorMsg, __postForbiddenErrorMsg,
     __sequenceNumber,
     __successContinuable,
 	__uri_to_id
@@ -208,7 +208,7 @@ const _mt = require('./libmt');
 
 const _siocl = require('socket.io-client');
 
-module.exports = {
+ module.exports = {
 	'__REGEN_ICON_RETRY_DELAY_MS':200,
 	'__asmm2csmm':{},
 	'__asid2csid':{},
@@ -243,8 +243,8 @@ module.exports = {
 	'__applyASWChanges' :
 		function(changelog,aswSequenceNumber,hitchhiker)
 		{
-			//console.error('w#'+__wid+' ++ ('+aswSequenceNumber+') '+
-			//				_utils.jsons(changelog));
+			console.error('w#'+__wid+' ++ ('+aswSequenceNumber+') '+
+							_utils.jsons(changelog));
 
 
 			if( _utils.sn2int(aswSequenceNumber) > 
@@ -566,8 +566,8 @@ module.exports = {
 				{
 					var cschangelog = _utils.flatten(cschangelogs);
 
-					//console.error('w#'+__wid+' -- ('+aswSequenceNumber+') '+
-					//	_utils.jsons(cschangelog));
+					console.error('w#'+__wid+' -- ('+aswSequenceNumber+') '+
+						_utils.jsons(cschangelog));
 
 					__postMessage(
 							{'statusCode':200,
@@ -665,9 +665,11 @@ module.exports = {
 										var state = respData['data'];
 										_mmmk.clone(state['_mmmk']);
 										self.__clone(state['_wlib']);										
-										__ids2uris = state['__ids2uris'];
-										__nextSequenceNumber = 
+										var __ids2uris = state['__ids2uris'];
+										set__ids2uris(__ids2uris);
+										var __nextSequenceNumber =
 												state['__nextSequenceNumber'];
+										set__nextSequenceNumber(__nextSequenceNumber);
 				
 										self.__pendingChangelogs = 
 											self.__pendingChangelogs.filter(
@@ -675,7 +677,7 @@ module.exports = {
 												{
 													return self.__sn2int(pc['sequence#']) > 
 																self.__sn2int(
-																	self.__nextASWSequenceNumber);
+																	self.__nextASWSequenceNumber)
 												});
 										callback();
 										self.__applyPendingASWChanges();
@@ -1060,8 +1062,8 @@ module.exports = {
 					{'statusCode':200,
 					 'data':{'_mmmk':_mmmk.clone(),
 	 						   '_wlib':this.__clone(),
-								'__ids2uris':_utils.clone(__ids2uris),
-								'__nextSequenceNumber':__nextSequenceNumber},
+								'__ids2uris':_utils.clone(get__ids2uris()),
+								'__nextSequenceNumber':get__nextSequenceNumber()},
 					 'sequence#':__sequenceNumber(0),
 					 'respIndex':resp});
 		},
@@ -1884,8 +1886,8 @@ module.exports = {
                             function(result) {
                                 return __wHttpReq('PUT',
                                            uri+'?wid='+aswid,
-                                           ({'csm':_mmmk.read(), 'asmm': asmm}));
-                            }];
+                                           ({'csm':_mmmk.read(), 'asmm': asmm}))
+                            }]
                  } else {
                      actions = [__wHttpReq('PUT',
                                            uri+'?wid='+aswid,
@@ -2051,7 +2053,7 @@ module.exports = {
 	'__undoredo' :
 		function(resp,uri,sn,func)
 		{
-			if( ! sn.match(__wtype) )
+			if( ! sn.match(get__wtype()) )
 			{
 				var hitchhiker = {},
 					 reqData		= {'hitchhiker':hitchhiker},

+ 1 - 1
doc/conf.py

@@ -26,7 +26,7 @@ author = 'The AToMPM Team'
 # The short X.Y version
 version = ''
 # The full version, including alpha/beta/rc tags
-release = '0.8.2'
+release = '0.8.3'
 
 
 # -- General configuration ---------------------------------------------------

+ 6 - 2
nightwatch.conf.js

@@ -16,7 +16,7 @@ module.exports = {
   "globals_path" : "",
 
   "selenium" : {
-    "start_process" : false,
+    "start_process" : true,
     "server_path" : selenium_server.path,
     "log_path" : "",
     "port" : 4444,
@@ -43,7 +43,11 @@ module.exports = {
       "desiredCapabilities": {
         "browserName": "chrome",
         "javascriptEnabled": true,
-        "marionette": true
+        "marionette": true,
+        "chromeOptions": {
+            "args" : ["--no-sandbox"],
+            "w3c": false
+          },
       }
     },
 

+ 83 - 59
package-lock.json

@@ -1,9 +1,32 @@
 {
   "name": "atompm",
-  "version": "0.8.1",
+  "version": "0.8.3",
   "lockfileVersion": 1,
   "requires": true,
   "dependencies": {
+    "@types/events": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz",
+      "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==",
+      "dev": true
+    },
+    "@types/glob": {
+      "version": "7.1.1",
+      "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz",
+      "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==",
+      "dev": true,
+      "requires": {
+        "@types/events": "3.0.0",
+        "@types/minimatch": "3.0.3",
+        "@types/node": "8.10.50"
+      }
+    },
+    "@types/minimatch": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+      "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+      "dev": true
+    },
     "@types/node": {
       "version": "8.10.50",
       "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.50.tgz",
@@ -173,12 +196,12 @@
       }
     },
     "chromedriver": {
-      "version": "2.46.0",
-      "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-2.46.0.tgz",
-      "integrity": "sha512-dLtKIJW3y/PuFrPmcw6Mb8Nh+HwSqgVrK1rWgTARXhHfWvV822X2VRkx2meU/tg2+YQL6/nNgT6n5qWwIDHbwg==",
+      "version": "77.0.0",
+      "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-77.0.0.tgz",
+      "integrity": "sha512-mZa1IVx4HD8rDaItWbnS470mmypgiWsDiu98r0NkiT4uLm3qrANl4vOU6no6vtWtLQiW5kt1POcIbjeNpsLbXA==",
       "dev": true,
       "requires": {
-        "del": "3.0.0",
+        "del": "4.1.1",
         "extract-zip": "1.6.7",
         "mkdirp": "0.5.1",
         "request": "2.88.0",
@@ -278,22 +301,23 @@
       "dev": true,
       "requires": {
         "ast-types": "0.13.2",
-        "escodegen": "1.11.1",
+        "escodegen": "1.12.0",
         "esprima": "3.1.3"
       }
     },
     "del": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz",
-      "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=",
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz",
+      "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==",
       "dev": true,
       "requires": {
+        "@types/glob": "7.1.1",
         "globby": "6.1.0",
-        "is-path-cwd": "1.0.0",
-        "is-path-in-cwd": "1.0.1",
-        "p-map": "1.2.0",
-        "pify": "3.0.0",
-        "rimraf": "2.6.3"
+        "is-path-cwd": "2.2.0",
+        "is-path-in-cwd": "2.1.0",
+        "p-map": "2.1.0",
+        "pify": "4.0.1",
+        "rimraf": "2.7.1"
       }
     },
     "delayed-stream": {
@@ -332,9 +356,9 @@
       }
     },
     "ejs": {
-      "version": "2.6.2",
-      "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.2.tgz",
-      "integrity": "sha512-PcW2a0tyTuPHz3tWyYqtK6r1fZ3gp+3Sop8Ph+ZYN81Ob5rwmbHEzaqs10N3BEsaGTkh/ooniXK+WwszGlc2+Q==",
+      "version": "2.7.1",
+      "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.1.tgz",
+      "integrity": "sha512-kS/gEPzZs3Y1rRsbGX4UOSjtP/CeJP0CxSNZHYxGfVM/VgLcv0ZqM7C45YyTj2DI2g7+P9Dd24C+IMIg6D0nYQ==",
       "dev": true
     },
     "es6-promise": {
@@ -360,14 +384,14 @@
       "optional": true
     },
     "escodegen": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.1.tgz",
-      "integrity": "sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw==",
+      "version": "1.12.0",
+      "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.12.0.tgz",
+      "integrity": "sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg==",
       "dev": true,
       "requires": {
         "esprima": "3.1.3",
-        "estraverse": "4.2.0",
-        "esutils": "2.0.2",
+        "estraverse": "4.3.0",
+        "esutils": "2.0.3",
         "optionator": "0.8.2",
         "source-map": "0.6.1"
       }
@@ -379,15 +403,15 @@
       "dev": true
     },
     "estraverse": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
-      "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+      "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
       "dev": true
     },
     "esutils": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
-      "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
       "dev": true
     },
     "extend": {
@@ -747,24 +771,24 @@
       "dev": true
     },
     "is-path-cwd": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz",
-      "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=",
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz",
+      "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==",
       "dev": true
     },
     "is-path-in-cwd": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz",
-      "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==",
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz",
+      "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==",
       "dev": true,
       "requires": {
-        "is-path-inside": "1.0.1"
+        "is-path-inside": "2.1.0"
       }
     },
     "is-path-inside": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
-      "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz",
+      "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==",
       "dev": true,
       "requires": {
         "path-is-inside": "1.0.2"
@@ -1090,15 +1114,15 @@
       "dev": true
     },
     "nightwatch": {
-      "version": "1.1.13",
-      "resolved": "https://registry.npmjs.org/nightwatch/-/nightwatch-1.1.13.tgz",
-      "integrity": "sha512-p/EqaCnVqAvGB5uaKgBhPaXCT/gxspVjgDyFRp2NmQiNnmlpTpw2wun+O5eYjF/iYDtXra7FD7uUFFLBAESvNw==",
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/nightwatch/-/nightwatch-1.2.4.tgz",
+      "integrity": "sha512-RoO2/leXXTWG/iAcdW1+sN3RV+bL2P4F9B/ty/wJQmsJw2PLduqvbi7cmkwdNGhh/yaIwIcBxyGHqdB0G754hg==",
       "dev": true,
       "requires": {
         "assertion-error": "1.1.0",
         "chai-nightwatch": "0.3.0",
         "dotenv": "7.0.0",
-        "ejs": "2.6.2",
+        "ejs": "2.7.1",
         "lodash.clone": "3.0.3",
         "lodash.defaultsdeep": "4.6.1",
         "lodash.merge": "4.6.2",
@@ -1168,9 +1192,9 @@
       "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8="
     },
     "p-map": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz",
-      "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==",
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz",
+      "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==",
       "dev": true
     },
     "pac-proxy-agent": {
@@ -1244,9 +1268,9 @@
       "dev": true
     },
     "pify": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
-      "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+      "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
       "dev": true
     },
     "pinkie": {
@@ -1327,9 +1351,9 @@
       "dev": true
     },
     "psl": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/psl/-/psl-1.2.0.tgz",
-      "integrity": "sha512-GEn74ZffufCmkDDLNcl3uuyF/aSD6exEyh1v/ZSdAomB82t6G9hzJVRx0jBmLDW+VfZqks3aScmMw9DszwUalA==",
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/psl/-/psl-1.4.0.tgz",
+      "integrity": "sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw==",
       "dev": true
     },
     "punycode": {
@@ -1402,13 +1426,13 @@
         "safe-buffer": "5.1.2",
         "tough-cookie": "2.4.3",
         "tunnel-agent": "0.6.0",
-        "uuid": "3.3.2"
+        "uuid": "3.3.3"
       }
     },
     "rimraf": {
-      "version": "2.6.3",
-      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
-      "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
+      "version": "2.7.1",
+      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+      "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
       "dev": true,
       "requires": {
         "glob": "7.1.4"
@@ -1609,7 +1633,7 @@
       "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
       "dev": true,
       "requires": {
-        "psl": "1.2.0",
+        "psl": "1.4.0",
         "punycode": "1.4.1"
       },
       "dependencies": {
@@ -1684,9 +1708,9 @@
       "dev": true
     },
     "uuid": {
-      "version": "3.3.2",
-      "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
-      "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
+      "version": "3.3.3",
+      "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz",
+      "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==",
       "dev": true
     },
     "verror": {

+ 5 - 5
package.json

@@ -1,8 +1,8 @@
 {
   "name": "atompm",
-  "version": "0.8.2",
+  "version": "0.8.3",
   "description": "A Tool for Multi-Paradigm Modelling",
-  "license": "LGPL-3.0-only",
+  "license": "LGPL-3.0",
   "homepage": "https://atompm.github.io/",
   "bugs": {
     "url": "https://msdl.uantwerpen.be/git/simon/AToMPM/issues"
@@ -16,10 +16,10 @@
     "socket.io-client": "^0.9.16"
   },
   "devDependencies": {
-    "chromedriver": "^2.46.0",
+    "chromedriver": "^77.0",
     "glob": "^7.1.4",
-    "nightwatch": "^1.1.13",
-    "selenium-server": "3.141.59"
+    "nightwatch": "^1.2.4",
+    "selenium-server": "^3.141.59"
   },
   "scripts": {
     "test": "./run_tests.sh"

+ 13 - 12
run_tests.sh

@@ -29,17 +29,17 @@ if ! kill -0 "$mtpid"; then
     exit $mt_status
 fi
 
-echo "Starting Selenium server."
-java -jar "./node_modules/selenium-server/lib/runner/selenium-server-standalone-3.141.59.jar" &
-seleniumpid=$!
-sleep 3
+#echo "Starting Selenium server."
+#java -jar "./node_modules/selenium-server/lib/runner/selenium-server-standalone-3.141.59.jar" &
+#seleniumpid=$!
+#sleep 3
 
-#check if model transformer is dead
-if ! kill -0 "$seleniumpid"; then
-    wait seleniumpid
-    se_status=$?
-    exit $se_status
-fi
+#check if selenium server is dead
+#if ! kill -0 "$seleniumpid"; then
+#    wait seleniumpid
+#    se_status=$?
+ #   exit $se_status
+#fi
 
 
 echo "Starting tests..."
@@ -48,8 +48,9 @@ nightwatch
 echo "Stopping server and mt script..."
 kill "$serverpid"
 kill "$mtpid"
-kill "$seleniumpid"
+#kill "$seleniumpid"
+
 
 
+echo "Finished!"
 
-echo "Finished!"

+ 9 - 0
tests/03_model_test.js

@@ -1,4 +1,5 @@
 let test_utils = require('./test_utils');
+let model_building_utils = require('./model_building_utils');
 let user = "./users/testuser/";
 
 module.exports = {
@@ -17,6 +18,14 @@ module.exports = {
         test_utils.load_model(client, [filename]);
     },
 
+    'Load and save model' : function (client) {
+
+        let filename = 'Formalisms/ClassicDEVS/ClassicDEVS.model';
+        let new_filename = 'ClassicDEVS2.model';
+        test_utils.load_model(client, [filename]);
+        model_building_utils.save_model(client, "Models", new_filename)
+    },
+
     'Load two models' : function (client) {
 
         let filenames = [

+ 33 - 0
tests/04_compile_test.js

@@ -0,0 +1,33 @@
+let test_utils = require('./test_utils');
+let model_building_utils = require('./model_building_utils');
+let user = "./users/testuser/";
+
+let folder_name = "Formalisms/__LanguageSyntax__/SimpleClassDiagram";
+
+module.exports = {
+
+    beforeEach : function (client) {
+        client.url('http://localhost:8124/atompm').pause(300);
+    },
+
+    'Login' : function (client) {
+        test_utils.login(client);
+    },
+
+    'Compile AS' : function (client) {
+        let filename = 'Formalisms/__LanguageSyntax__/SimpleClassDiagram/SimpleClassDiagramMM.model';
+        test_utils.load_model(client, [filename]);
+        model_building_utils.compile_model(client, "AS", folder_name, "classDiagram.metamodel");
+    },
+
+    'Compile CS' : function (client) {
+        let filename = 'Formalisms/__LanguageSyntax__/SimpleClassDiagram/SimpleClassDiagram.umlIcons.model';
+        test_utils.load_model(client, [filename]);
+        model_building_utils.compile_model(client, "CS", folder_name, "classDiagram.umlIcons.metamodel");
+    },
+
+    after : function (client) {
+        client.end();
+    },
+
+};

tests/04_toolbar_test.js → tests/05_toolbar_test.js


+ 24 - 24
tests/05_creating_dsl.js

@@ -173,7 +173,7 @@ module.exports = {
             .waitForElementNotPresent("#dialog_btn", 1000, "Editing menu closes")
             .moveToElement(canvas, 0, 100)
             .mouseButtonClick('left')
-            .pause(500)
+            .pause(100)
         ;
 
         let class_div3 = model_building_utils.get_class_div(0);
@@ -186,7 +186,7 @@ module.exports = {
             .waitForElementNotPresent("#dialog_btn", 1000, "Editing menu closes")
             .moveToElement(canvas, 0, 100)
             .mouseButtonClick('left')
-            .pause(500)
+            .pause(100)
         ;
 
 
@@ -204,7 +204,7 @@ module.exports = {
             .waitForElementNotPresent("#dialog_btn", 1000, "Editing menu closes")
             .moveToElement(canvas, 0, 100)
             .mouseButtonClick('left')
-            .pause(500)
+            .pause(100)
         ;
 
         //CREATE INHERITANCE
@@ -224,22 +224,22 @@ module.exports = {
                 .mouseButtonDown('right')
                 .moveToElement(sup, 50 + offset, 50 + offset)
                 .mouseButtonUp('right')
-                .pause(500)
+                .pause(100)
                 .click(inheri_relation)
                 .waitForElementPresent("#dialog_btn", 1000, "Inheri menu opens")
                 .click("#dialog_btn")
-                .pause(500)
+                .pause(100)
                 .waitForElementNotPresent("#dialog_btn", 1000, "Inheri menu closes")
                 .moveToElement(canvas, 0, 100)
                 .mouseButtonClick('left')
-                .pause(500)
+                .pause(100)
             ;
 
             num_elements++;
         }
 
         //SET ASSOCS
-        client.pause(300);
+        client.pause(100);
 
         let assoc_num = 0;
         for (let assoc of assocs) {
@@ -268,15 +268,15 @@ module.exports = {
                 .mouseButtonDown('right')
                 .moveToElement(to_ele, 20 + offset, 20 + offset)
                 .mouseButtonUp('right')
-                .pause(500)
+                .pause(100)
                 .click(assoc_relation)
                 .waitForElementPresent("#dialog_btn", 1000, "Assoc menu opens")
                 .click("#dialog_btn")
-                .pause(500)
+                .pause(100)
                 .waitForElementNotPresent("#dialog_btn", 1000, "Assoc menu closes")
                 .moveToElement(canvas, 0, 100)
                 .mouseButtonClick('left')
-                .pause(500)
+                .pause(100)
                 .waitForElementPresent(assoc_div, 1000, "Assoc name present: " + assoc_div);
 
             if (out_card) {
@@ -290,7 +290,7 @@ module.exports = {
                     .waitForElementNotPresent("#dialog_btn", 1000, "Out card menu closes")
                     .moveToElement(canvas, 0, 100)
                     .mouseButtonClick('left')
-                    .pause(500);
+                    .pause(100);
             }
 
             if (in_card) {
@@ -303,7 +303,7 @@ module.exports = {
                     .waitForElementNotPresent("#dialog_btn", 1000, "Out card menu closes")
                     .moveToElement(canvas, 0, 100)
                     .mouseButtonClick('left')
-                    .pause(500);
+                    .pause(100);
             }
             client.getElementSize(assoc_div, function (result) {
 
@@ -326,7 +326,7 @@ module.exports = {
                     .waitForElementNotPresent("#dialog_btn", 1000, "Editing assoc name closes")
                     .moveToElement(canvas, 0, 100)
                     .mouseButtonClick('left')
-                    .pause(500);
+                    .pause(100);
             });
         }
 
@@ -340,7 +340,7 @@ module.exports = {
         client
             .moveToElement(canvas, start_x + 3 * x_diff, start_y)
             .mouseButtonClick('right')
-            .pause(500)
+            .pause(100)
             .waitForElementPresent(constraint_div, 500, "Created class: " + constraint_div);
 
         let pre_create_opt = "#tr_event > td:nth-child(2) > select > option:nth-child(2)";
@@ -364,7 +364,7 @@ module.exports = {
             .waitForElementNotPresent("#dialog_btn", 1000, "Constraint menu closes")
             .moveToElement(canvas, 0, 100)
             .mouseButtonClick('left')
-            .pause(1000);
+            .pause(100);
 
 
         //SAVE MODEL
@@ -440,10 +440,10 @@ module.exports = {
             attrs[textContent_field] = text;
 
             client
-                .pause(300)
+                .pause(100)
                 .moveToElement(canvas, 20, 200)
                 .mouseButtonClick('right')
-                .pause(500)
+                .pause(100)
                 .waitForElementPresent(textDiv, 500, "Created text: " + textDiv);
 
             model_building_utils.set_attribs(client, num_elements, attrs, textType);
@@ -452,9 +452,9 @@ module.exports = {
 
             client.moveToElement(textDiv, 10, 10)
                 .mouseButtonClick('left')
-                .pause(300)
+                .pause(100)
                 .mouseButtonDown('left')
-                .pause(300);
+                .pause(100);
 
             model_building_utils.move_to_element_ratio(client, iconDiv, 35, 15);
             client.mouseButtonUp('left');
@@ -487,10 +487,10 @@ module.exports = {
 
 
             client
-                .pause(300)
+                .pause(100)
                 .moveToElement(canvas, 50, 200)
                 .mouseButtonClick('right')
-                .pause(1000)
+                .pause(100)
                 .waitForElementPresent(symbolDiv, 500, "Created symbol: " + symbolDiv);
 
             model_building_utils.click_off(client);
@@ -500,12 +500,12 @@ module.exports = {
             model_building_utils.move_to_element_ratio(client, symbolDiv, 50, 50);
             client
                 .mouseButtonClick('left')
-                .pause(300)
+                .pause(100)
                 .mouseButtonDown('left')
-                .pause(300);
+                .pause(100);
 
             model_building_utils.move_to_element_ratio(client, iconDiv, 50, 55);
-            client.pause(300).mouseButtonUp('left');
+            client.pause(100).mouseButtonUp('left');
 
             model_building_utils.click_off(client);
 

tests/06_transformation_test.js → tests/07_transformation_test.js


tests/07_pacman_transformation_test.js → tests/08_pacman_transformation_test.js


tests/08_missing_files.js → tests/09_missing_files.js


+ 55 - 0
tests/10_undo_test.js

@@ -0,0 +1,55 @@
+let test_utils = require('./test_utils');
+let model_building_utils = require('./model_building_utils');
+let user = "./users/testuser/";
+
+module.exports = {
+
+    beforeEach : function (client) {
+        client.url('http://localhost:8124/atompm').pause(300);
+    },
+
+    'Login' : function (client) {
+        test_utils.login(client);
+    },
+
+    'Check undo of deletion' : function (client) {
+        let filename = '/Formalisms/__LanguageSyntax__/SimpleClassDiagram/SimpleClassDiagram.umlIcons.metamodel';
+        test_utils.load_toolbar(client, [filename]);
+
+
+        let classIcon = "#\\/Formalisms\\/__LanguageSyntax__\\/SimpleClassDiagram\\/SimpleClassDiagram\\.umlIcons\\.metamodel\\/ClassIcon";
+        client.waitForElementPresent(classIcon, 2000, "Check for class icon...");
+        client.click(classIcon);
+
+        let canvas = "#div_canvas";
+        client.waitForElementPresent(canvas, 1000, "Checking for canvas...");
+
+        let num_elements = 0;
+
+        //BUILD CLASS
+        let class_div = model_building_utils.create_class(client, 50, 200, 0);
+
+        //DELETE CLASS
+        model_building_utils.delete_element(client, class_div);
+
+        //CHECK FOR PRESENCE
+        client.waitForElementNotPresent(class_div, 1000, "Class deleted");
+
+        //UNDO
+        let undoBtn = "#\\/Toolbars\\/MainMenu\\/MainMenu\\.buttons\\.model\\/undo";
+        client.waitForElementPresent(undoBtn, 2000, "Check for undo button...");
+        client.click(undoBtn);
+        client.waitForElementPresent(class_div, 1000, "Class restored");
+
+        //SECOND DELETE
+        model_building_utils.delete_element(client, class_div);
+
+        //SECOND CHECK FOR PRESENCE
+        client.waitForElementNotPresent(class_div, 1000, "Class deleted for second time")
+    },
+
+    after : function (client) {
+        client.end();
+    },
+
+};

+ 8 - 1
tests/model_building_utils.js

@@ -201,7 +201,7 @@ function load_model(client, folder_name, model_name) {
 }
 
 function save_model(client, folder_name, model_name) {
-    let save_button = "#\\2f Toolbars\\2f MainMenu\\2f MainMenu\\2e buttons\\2e model\\2f saveModel";
+    let save_button = "#\\2f Toolbars\\2f MainMenu\\2f MainMenu\\2e buttons\\2e model\\2f saveModelAs";
     let new_file_text = "#new_file";
 
     client.waitForElementPresent(save_button, 1000, "Looking for save button")
@@ -216,6 +216,7 @@ function save_model(client, folder_name, model_name) {
             if (result.status == -1) {
                 client.click(new_file_text)
                     .clearValue(new_file_text)
+                    .setValue(new_file_text, '\u0008') // Send a backspace
                     .setValue(new_file_text, model_name);
 
                 client.assert.ok(true, "Saving model with name: '" + model_name + "'");
@@ -269,11 +270,17 @@ function compile_model(client, compile_type, folder_name, model_name) {
                 }
 
                 client.click(new_file_text)
+                    .pause(200)
                     .clearValue(new_file_text)
+                    .pause(200)
+                    .setValue(new_file_text, '\u0008') // Send a backspace
+                    .setValue(new_file_text, '\u0008') // Send a backspace
                     .setValue(new_file_text, model_name)
+                    .pause(200)
                     .click("#dialog_btn");
             } else {
                 client.click(model_div)
+                    .pause(200)
                     .click("#dialog_btn");
             }