123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 |
- var assert = require("assert");
- var parser = require("../src/openscad-parser").parser;
- function parse(s) {
- return parser.parse(s);
- }
- 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);
|