This repository has been archived on 2023-03-25. You can view files and clone it, but cannot push or open issues or pull requests.
mightyscape-1.1-deprecated/extensions/fablabchemnitz/papercraft/openjscad/node_modules/@jscad/openscad-openjscad-translator/tests/general.js

148 lines
4.4 KiB
JavaScript

var assert = require("assert");
var parser = require("../src/openscad-parser").parser;
function check(test, expected) {
assert.equal(parse(test), expected);
}
function run(test){
var f = new Function(parse(test));
return f();
}
exports["test variable assigments"] = function() {
check("x = 123;", "var x;\nx = 123;");
check("x = 123.456;", "var x;\nx = 123.456;");
check("x = 2e-1;", "var x;\nx = 0.2;");
check("x = \"string\";", "var x;\nx = \"string\";");
check("x = true;", "var x;\nx = true;");
check("x = false;", "var x;\nx = false;");
}
exports["test echo"] = function() {
check("echo(\"string\");", "console.log(\"ECHO: \" + \"string\");");
check("echo(123);", "console.log(\"ECHO: \" + 123);");
check("echo(123.456);", "console.log(\"ECHO: \" + 123.456);");
check("echo(2e-1);", "console.log(\"ECHO: \" + 0.2);");
check("echo(true);", "console.log(\"ECHO: \" + true);");
check("echo(false);", "console.log(\"ECHO: \" + false);");
}
exports["test comments"] = function() {
parse("// single line comment");
parse("myvar = 10; // The rest of the line is a comment");
parse("/* Multi-line comments \n can span multiple lines.*/");
}
exports["test operations"] = function() {
check("x = 5 + 4;", "var x;\nx = 9;");
check("x = 5 - 4;", "var x;\nx = 1;");
check("x = 2 * 2;", "var x;\nx = 4;");
check("x = 6 / 2;", "var x;\nx = 3;");
check("x = 5 % 2;", "var x;\nx = 1;");
check("x = 5 < 6;", "var x;\nx = true;");
check("x = 5 <= 6;", "var x;\nx = true;");
check("x = 5 > 6;", "var x;\nx = false;");
check("x = 5 >= 6;", "var x;\nx = false;");
check("x = true && true;", "var x;\nx = true;");
check("x = true || false;", "var x;\nx = true;");
check("x = +5;","var x;\nx = 5;");
check("x = -5;","var x;\nx = -5;");
check("x = +5 + -5;","var x;\nx = 0;");
}
exports["test Variables are set at compile-time, not run-time"] = function() {
var openscad = "// The value of 'a' reflects only the last set value\na = 0;\necho(a);\na = 5;\necho(a);";
var stdout = process.stdout;
var stdoutLog = [];
install_hook_to(stdout);
stdout.hook('write', function(string, encoding, fd, write) {
stdoutLog.push(string);
});
try {
run(openscad);
assert.equal(stdoutLog.join(), "ECHO: 5\n,ECHO: 5\n");
} finally {
stdout.unhook('write');
}
}
/* Useful function to temporarily override a method - used to record stdout
via: http://stackoverflow.com/a/9624028/188624
*/
var install_hook_to = function(obj) {
if (obj.hook || obj.unhook) {
throw new Error('Object already has properties hook and/or unhook');
}
obj.hook = function(_meth_name, _fn, _is_async) {
var self = this,
meth_ref;
// Make sure method exists
if (! (Object.prototype.toString.call(self[_meth_name]) === '[object Function]')) {
throw new Error('Invalid method: ' + _meth_name);
}
// We should not hook a hook
if (self.unhook.methods[_meth_name]) {
throw new Error('Method already hooked: ' + _meth_name);
}
// Reference default method
meth_ref = (self.unhook.methods[_meth_name] = self[_meth_name]);
self[_meth_name] = function() {
var args = Array.prototype.slice.call(arguments);
// Our hook should take the same number of arguments
// as the original method so we must fill with undefined
// optional args not provided in the call
while (args.length < meth_ref.length) {
args.push(undefined);
}
// Last argument is always original method call
args.push(function() {
var args = arguments;
if (_is_async) {
process.nextTick(function() {
meth_ref.apply(self, args);
});
} else {
meth_ref.apply(self, args);
}
});
_fn.apply(self, args);
};
};
obj.unhook = function(_meth_name) {
var self = this,
ref = self.unhook.methods[_meth_name];
if (ref) {
self[_meth_name] = self.unhook.methods[_meth_name];
delete self.unhook.methods[_meth_name];
} else {
throw new Error('Method not hooked: ' + _meth_name);
}
};
obj.unhook.methods = {};
};
if(module === require.main) require("test").run(exports);