sayln("********************************************************************************"); sayln("* *"); sayln("* MokkaScript Unit Tests *"); sayln("* *"); sayln("********************************************************************************"); sayln(); /**** test of assertion functions themselves ****/ assert ("return true"); assertException(EvalError, "throw new EvalError()"); assertInstance (Object, "return {}"); assertType ("number", "return Math.PI"); assertValue ("correct", "return 'correct'"); /**** variable declarations and initializers ****/ assertValue(true, "var a:Boolean = true; return a"); assertValue(false, "var a:Boolean = false; return a"); assertValue(-1, "var a:Number = -1; return a"); assertValue(0, "var a:Number = 0; return a"); assertValue(+1, "var a:Number = +1; return a"); assertValue(-Infinity, "var a:Number = -Infinity; return a"); assertValue(+Infinity, "var a:Number = +Infinity; return a"); assert("var a:Number = NaN; return isNaN(a)"); assertValue("", "var a:String = ''; return a"); assertValue("a string", "var a:String = \"a string\"; return a"); assertInstance(RegExp, "var a:RegExp = /just a simple RegExp/; return a"); assertType("function", "var a:Function = function ():void {}; return a"); assertType("object", "var a:Object = {}; return a"); assertType("object", "var a:Array = []; return a"); assertValue(undefined, "var a:* = undefined; return a"); assertValue(null, "var a:* = null; return a"); /**** complex literals ****/ assert("var a:Object = {identifier:true, 'string':false}; return a.identifier"); assert("var a:Object = {identifier:true, 'string':false}; return !a['string']"); assert("var a:Array = [true, Math.PI, 'a string']; return a[0]"); assertValue(3, "var a:Array = [true, Math.PI, 'a string']; return a.length"); /**** delete statements ****/ assert("var i = 0; return delete i"); assertValue(undefined, "var i = 0; delete i; return i"); assert("return delete a"); assert("var a = {b:true}; return delete a.b"); assert("var a = {b:true}; return delete a['b']"); assertValue(undefined, "var a = {b:true}; delete a.b; return a.b"); assert("var a = {b:true}; return delete a.c"); assert("var a = [0,1,2]; return delete a[1]"); assertValue(undefined, "var a = [0,1,2]; delete a[1]; return a[1]"); assertValue(3, "var a = [0,1,2]; delete a[1]; return a.length"); // strange, but correct assert("var a = [0,1,2]; return delete a[3]"); /**** assignments ****/ assert("var a; a = true; return a"); assert("var a = {}; a.b = true; return a.b"); assert("var a = {}; a['b'] = true; return a['b']"); assert("var a = []; a[0] = true; return a[0]"); assertValue(2, "var a = 1; a += 1; return a"); assertValue(2, "var a = {b:1}; a.b += 1; return a.b"); assertValue(2, "var a = {b:1}; a['b'] += 1; return a['b']"); assertValue(2, "var a = [1]; a[0] += 1; return a[0]"); assertValue(0, "var a = 1; a -= 1; return a"); assertValue(0, "var a = {b:1}; a.b -= 1; return a.b"); assertValue(0, "var a = {b:1}; a['b'] -= 1; return a['b']"); assertValue(0, "var a = [1]; a[0] -= 1; return a[0]"); assertValue(2, "var a = 1; a *= 2; return a"); assertValue(2, "var a = {b:1}; a.b *= 2; return a.b"); assertValue(2, "var a = {b:1}; a['b'] *= 2; return a['b']"); assertValue(2, "var a = [1]; a[0] *= 2; return a[0]"); assertValue(1, "var a = 2; a /= 2; return a"); assertValue(1, "var a = {b:2}; a.b /= 2; return a.b"); assertValue(1, "var a = {b:2}; a['b'] /= 2; return a['b']"); assertValue(1, "var a = [2]; a[0] /= 2; return a[0]"); assertValue(1, "var a = 3; a %= 2; return a"); assertValue(1, "var a = {b:3}; a.b %= 2; return a.b"); assertValue(1, "var a = {b:3}; a['b'] %= 2; return a['b']"); assertValue(1, "var a = [3]; a[0] %= 2; return a[0]"); assert("var a,b,c; a = b = c = true; return a"); // cascaded assignment // cascaded assignment with in-situ operators assertValue(1, "var i, j = 0, k = 3, l = 1, m = 4, n = 5, o = 3; i = j += k -= l *= m /= n %= o; return i"); /**** function declarations ****/ assert("var a = function () {return true}; return a()"); assert("function a () {return true}; return a()"); assert("function a (b) {return b}; return a(true)"); assertValue(3,"function a () {return arguments.length}; return a(1,2,3)"); assertValue(6,"function a (i,j,k) {return i+j+k}; return a(1,2,3)"); assertValue(6,"function a (i,j,k) {return arguments[0]+arguments[1]+arguments[2]}; return a(1,2,3)"); assertValue(6,"function a (x) {return x > 0 ? x+a(x-1) : 0}; return a(3)"); /**** "if" statement ****/ assert("if (true) {return true}; return false"); assert("if (true) {return true} else {return false}"); assert("if (false) {return false} else {return true}"); assert("if (null) {return false} else {return true}"); assert("if (undefined) {return false} else {return true}"); assert("if ('') {return false} else {return true}"); assert("if (0) {return false} else {return true}"); assert("if (NaN) {return false} else {return true}"); assertValue("unknown","var a = 3; if (a === 0) {return 'zero'} else if (a === 1) {return 'one'} else {return 'unknown'}"); /**** "switch" statement ****/ assertValue("unknown","var a = 3; switch (a) {case 0: return 'zero' case 1: return 'one' default: return 'unknown'}"); assertValue("known", "var a = 0; switch (a) {case 0: case 1: case 2: return 'known' default: return 'unknown'}"); assertValue("unknown","var a = 0, r = ''; switch (a) {case 0: case 1: case 2: r = 'known' default: r = 'unknown'}; return r"); assertValue("known", "var a = 0, r = ''; switch (a) {case 0: case 1: case 2: r = 'known'; break default: r = 'unknown'}; return r"); assertValue("known", "var a = 0, r = ''; Label: switch (a) {case 0: case 1: case 2: r = 'known'; break Label default: r = 'unknown'}; return r"); /**** "for" statement ****/ assertValue("123","var a = ''; for (var i = 1; i <= 3; i += 1) {a += i}; return a"); assertValue("321","var a = ''; for (var i = 3; i >= 1; i -= 1) {a += i}; return a"); assertValue("123","var a = '', i; for (i = 1; i <= 3; i += 1) {a += i}; return a"); assertValue("321","var a = '', i; for (i = 3; i >= 1; i -= 1) {a += i}; return a"); assertValue("123","var a = '', i = 1; for (; i <= 3; i += 1) {a += i}; return a"); assertValue("321","var a = '', i = 3; for (; i >= 1; i -= 1) {a += i}; return a"); assertValue("123","for (var a = '', var i = 1; i <= 3; i += 1) {a += i}; return a"); assertValue("123","for (var a = '', var i = 1; i <= 3; a += i, i += 1) {}; return a"); assertValue("123","for (var a = '', var i = 0; i <= 3; i += 1) {if (i === 0) {continue}; a += i}; return a"); assertValue("123","for (var a = '', var i = 1; i <= 9; i += 1) {if (i === 4) {break}; a += i}; return a"); assertValue("123","Label: for (var a = '', var i = 0; i <= 3; i += 1) {if (i === 0) {continue Label}; a += i}; return a"); assertValue("123","Label: for (var a = '', var i = 1; i <= 9; i += 1) {if (i === 4) {break Label}; a += i}; return a"); /**** "for-in" statement ****/ assertValue("abc", "var a = {a:1,b:2,c:3}, r = ''; for (var x in a) {r += x}; return r"); assertValue("abc", "var a = {a:1,b:2,c:3}, r = '', x; for (x in a) {r += x}; return r"); assertValue("a", "var a = {a:1,b:2,c:3}, r = '', x; for (x in a) {if (x === 'b') {break}; r += x}; return r"); assertValue("ac", "var a = {a:1,b:2,c:3}, r = '', x; for (x in a) {if (x === 'b') {continue}; r += x}; return r"); assertValue("a", "var a = {a:1,b:2,c:3}, r = '', x; Label: for (x in a) {if (x === 'b') {break Label}; r += x}; return r"); assertValue("ac", "var a = {a:1,b:2,c:3}, r = '', x; Label: for (x in a) {if (x === 'b') {continue Label}; r += x}; return r"); /**** "do" statement ****/ assertValue("123", "var r = '', i = 1; do {r += i; i += 1} while (i <= 3); return r"); assertValue("123", "var r = '', i = 1; do {r += i; if (i >= 3) {break} else {i += 1}} while (true); return r"); assertValue("123", "var r = '', i = -1; do {i += 1; if (i < 1) {continue}; r += i} while (i < 3); return r"); assertValue("123", "var r = '', i = 1; Label: do {r += i; if (i >= 3) {break Label} else {i += 1}} while (true); return r"); assertValue("123", "var r = '', i = -1; Label: do {i += 1; if (i < 1) {continue Label}; r += i} while (i < 3); return r"); /**** "while" statement ****/ assertValue("123", "var r = '', i = 1; while (i <= 3) {r += i; i += 1}; return r"); assertValue("123", "var r = '', i = 1; while (true) {r += i; if (i >= 3) {break} else {i += 1}}; return r"); assertValue("123", "var r = '', i = -1; while (i < 3) {i += 1; if (i < 1) {continue}; r += i}; return r"); assertValue("123", "var r = '', i = 1; Label: while (true) {r += i; if (i >= 3) {break Label} else {i += 1}}; return r"); assertValue("123", "var r = '', i = -1; Label: while (i < 3) {i += 1; if (i < 1) {continue Label}; r += i}; return r"); /**** "try" statement ****/ assert("try {throw new Error('hidden error')}; return true"); assert("try {throw new Error('')} catch (Signal:*) {}; return true"); assert("try {throw new Error('')} catch (Signal:*) {return true}"); assertException(EvalError, "try {throw new Error('')} catch (Signal:*) {throw new EvalError('')}"); assert("try {throw new Error('')} finally {}; return true"); assert("try {throw new Error('')} finally {return true}"); assertException(EvalError, "try {throw new Error('')} finally {throw new EvalError('')}"); assert("try {throw new Error('')} catch (Signal:*) {} finally {}; return true"); assert("var r; try {throw new Error('')} catch (Signal:*) {r = true} finally {return r}"); assertException(EvalError, "var r; try {throw new Error('')} catch (Signal:*) {r = true} finally {throw new EvalError('')}"); /**** "return" statement ****/ assert("return true"); assertValue(undefined, "return"); /**** expressions ****/ assertValue(6,"return 1 + 2*3 - 4%3"); assert("return ('a' < 'b') && ('c' >= 'a') && ('a' !== 'A')"); assert("var a = {a:1, b:2}; return (typeof(a) === 'object') && ('b' in a)"); assert("var a = {a:1, b:2}; return (a.a !== a.b) && isFinite(a.a)"); assert("function a () {return {a:true,b:false}}; return a().a"); assert("function a () {return {a:true,b:false}}; return !a()['b']"); assert("function a () {b = true; return function () {return b}}; return a()()"); /**** built-in (global) objects ****/ assert("return isNaN(NaN)"); assertValue(Infinity, "return Infinity"); assertValue(undefined, "return undefined"); assertValue(parseInt, "return parseInt"); assertValue(parseFloat, "return parseFloat"); assertValue(isNaN, "return isNaN"); assertValue(isFinite, "return isFinite"); assertValue(decodeURI, "return decodeURI"); assertValue(decodeURIComponent, "return decodeURIComponent"); assertValue(encodeURI, "return encodeURI"); assertValue(encodeURIComponent, "return encodeURIComponent"); assertValue(Object, "return Object"); assertValue(Function, "return Function"); assertValue(Array, "return Array"); assertValue(String, "return String"); assertValue(Boolean, "return Boolean"); assertValue(Number, "return Number"); assertValue(Date, "return Date"); assertValue(RegExp, "return RegExp"); assertValue(Error, "return Error"); assertValue(EvalError, "return EvalError"); assertValue(RangeError, "return RangeError"); assertValue(ReferenceError, "return ReferenceError"); assertValue(SyntaxError, "return SyntaxError"); assertValue(TypeError, "return TypeError"); assertValue(URIError, "return URIError"); assertValue(Math, "return Math"); sayln(); sayln("***** *****"); sayln(" ***** *****"); sayln(" ***** all unit tests have been successfully passed! *****"); sayln(" ***** *****"); sayln("***** *****");