From 934848ff8d342647ceab2dccebccc948fe6ae3db Mon Sep 17 00:00:00 2001 From: NeeEoo Date: Tue, 23 Apr 2024 04:04:16 +0200 Subject: [PATCH] Added some more tests --- tests/src/Main.hx | 7 +- tests/src/Util.hx | 38 ++++++- tests/src/benchmark/Benchmark.hx | 106 ++++++++--------- tests/src/tests/EvalOrderCase.hx | 175 +++++++++++++++++++++++------ tests/src/tests/FloatCase.hx | 74 ++++++++++++ tests/src/tests/IntIteratorCase.hx | 59 ++++++++++ tests/src/tests/MiscCase.hx | 9 ++ tests/src/tests/TestCase.hx | 60 +++++----- 8 files changed, 407 insertions(+), 121 deletions(-) create mode 100644 tests/src/tests/FloatCase.hx create mode 100644 tests/src/tests/IntIteratorCase.hx diff --git a/tests/src/Main.hx b/tests/src/Main.hx index 02bfc8b..d080699 100644 --- a/tests/src/Main.hx +++ b/tests/src/Main.hx @@ -14,10 +14,15 @@ class Main { new Benchmark("Test", 1000); #else Sys.println("Beginning tests"); + if(!Main.SHOW_KNOWN_BUGS) { + Sys.println("Hiding known bugs [TEMPORARY]"); + } runTest("Array", new ArrayCase()); runTest("BinOp", new BinOpCase()); runTest("EvalOrder", new EvalOrderCase()); runTest("Math", new MathCase()); + runTest("Float", new FloatCase()); + runTest("IntIterator", new IntIteratorCase()); runTest("Misc", new MiscCase()); Util.printTestResults(); #end @@ -25,7 +30,7 @@ class Main { #if !BENCHMARK static function runTest(name:String, test:TestCase) { - Util.startUnitTest("Math"); + Util.startUnitTest(name); test.setup(); test.run(); test.teardown(); diff --git a/tests/src/Util.hx b/tests/src/Util.hx index 64c0a63..642dd5c 100644 --- a/tests/src/Util.hx +++ b/tests/src/Util.hx @@ -13,7 +13,13 @@ class Util { } public static function assertEq(value:Dynamic, expected:Dynamic, message:String) { - if (value == expected) { + var passed = value == expected; + if (Std.isOfType(value, Array) && Std.isOfType(expected, Array)) { + if (deepCompareArrays(value, expected)) + passed = true; + } + + if (passed) { passedTestUnits++; } else { Sys.println("Assertion failed: " + message + " Expected: " + expected + " Got: " + value); @@ -22,7 +28,15 @@ class Util { } public static function assertNeq(value:Dynamic, expected:Dynamic, message:String) { - if (value != expected) { + var passed = value != expected; + if (Std.isOfType(value, Array) && Std.isOfType(expected, Array)) { + if (!deepCompareArrays(value, expected)) + passed = true; + } + + // WARNING THIS MIGHT NOT WORK + + if (passed) { passedTestUnits++; } else { Sys.println("Assertion failed: " + message + " Expected: " + expected + " Got: " + value); @@ -121,4 +135,24 @@ class Util { // Logs.logText(err, RED) //], ERROR); } + + public static function deepCompareArrays(a1: Array, a2: Array): Bool { + if (a1.length != a2.length) { + return false; + } + + for (i in 0...a1.length) { + var item1 = a1[i]; + var item2 = a2[i]; + + if (Std.isOfType(item1, Array) && Std.isOfType(item2, Array)) { + if (!deepCompareArrays(item1, item2)) + return false; + } else if (item1 != item2) { + return false; + } + } + + return true; + } } \ No newline at end of file diff --git a/tests/src/benchmark/Benchmark.hx b/tests/src/benchmark/Benchmark.hx index 283cfbd..1bc0f21 100644 --- a/tests/src/benchmark/Benchmark.hx +++ b/tests/src/benchmark/Benchmark.hx @@ -1,68 +1,68 @@ package benchmark; class Benchmark { - public var times:Array = []; + public var times:Array = []; - public function new(name:String, iterations:Int) { - times = cast new haxe.ds.Vector(iterations); - - for (i in 0...iterations) { - var startTime:Float = Util.getTime(); - benchmark(); - var endTime:Float = Util.getTime(); - times[i] = endTime-startTime; - } - times.sort(Reflect.compare); + public function new(name:String, iterations:Int) { + times = cast new haxe.ds.Vector(iterations); + + for (i in 0...iterations) { + var startTime:Float = Util.getTime(); + benchmark(); + var endTime:Float = Util.getTime(); + times[i] = endTime-startTime; + } + times.sort(Reflect.compare); - var total:Float = 0; - for (time in times) - total += time; + var total:Float = 0; + for (time in times) + total += time; - Sys.println('--------------------$name BENCHMARK--------------------'); - Sys.println('Running $iterations times...'); - // Sys.println('Lowest Time: ${Util.exScienceN(times[0])}'); - // Sys.println('Average Time: ${Util.exScienceN(total/iterations)}'); - // Sys.println('Highest Time: ${Util.exScienceN(times[times.length-1])}'); - Sys.println('Lowest Time: ${Util.convertToReadableTime(times[0])}'); - Sys.println('Average Time: ${Util.convertToReadableTime(total/iterations)}'); - Sys.println('Highest Time: ${Util.convertToReadableTime(times[times.length-1])}'); - graph(); - Sys.println('--------------------$name BENCHMARK--------------------'); - } + Sys.println('--------------------$name BENCHMARK--------------------'); + Sys.println('Running $iterations times...'); + // Sys.println('Lowest Time: ${Util.exScienceN(times[0])}'); + // Sys.println('Average Time: ${Util.exScienceN(total/iterations)}'); + // Sys.println('Highest Time: ${Util.exScienceN(times[times.length-1])}'); + Sys.println('Lowest Time: ${Util.convertToReadableTime(times[0])}'); + Sys.println('Average Time: ${Util.convertToReadableTime(total/iterations)}'); + Sys.println('Highest Time: ${Util.convertToReadableTime(times[times.length-1])}'); + graph(); + Sys.println('--------------------$name BENCHMARK--------------------'); + } - public function graph() { - var size:{width:Int, height:Int} = {width: 20, height: 14}; + public function graph() { + var size:{width:Int, height:Int} = {width: 20, height: 14}; - var collumRange:Float = times[times.length-1]-times[0]; - var counts:Array = cast new haxe.ds.Vector(size.width); + var collumRange:Float = times[times.length-1]-times[0]; + var counts:Array = cast new haxe.ds.Vector(size.width); - for (time in times) { - var index:Int = Std.int((time - times[0]) / (collumRange / size.width)); - counts[index]++; - } + for (time in times) { + var index:Int = Std.int((time - times[0]) / (collumRange / size.width)); + counts[index]++; + } - var normalizedCounts:Array = [for (count in counts) count / times.length]; - var gridFilling:Array = [for (count in normalizedCounts) Math.round(count*size.height)]; + var normalizedCounts:Array = [for (count in counts) count / times.length]; + var gridFilling:Array = [for (count in normalizedCounts) Math.round(count*size.height)]; - trace(normalizedCounts,gridFilling); - for (y in 0...size.height) { - for (x in 0...size.width) { - Sys.print("*"); - } - Sys.print("\n"); - - } - } + trace(normalizedCounts,gridFilling); + for (y in 0...size.height) { + for (x in 0...size.width) { + Sys.print("*"); + } + Sys.print("\n"); + + } + } - // public static function remapToRange(value:Float, start1:Float, stop1:Float, start2:Float, stop2:Float):Float - // { - // return start2 + (value - start1) * ((stop2 - start2) / (stop1 - start1)); - // } + // public static function remapToRange(value:Float, start1:Float, stop1:Float, start2:Float, stop2:Float):Float + // { + // return start2 + (value - start1) * ((stop2 - start2) / (stop1 - start1)); + // } - public function benchmark() { - var array:Array = []; + public function benchmark() { + var array:Array = []; - for (i in 0...10000) - array.push(Math.random()); - } + for (i in 0...10000) + array.push(Math.random()); + } } \ No newline at end of file diff --git a/tests/src/tests/EvalOrderCase.hx b/tests/src/tests/EvalOrderCase.hx index 6f2113b..a5fab40 100644 --- a/tests/src/tests/EvalOrderCase.hx +++ b/tests/src/tests/EvalOrderCase.hx @@ -5,10 +5,6 @@ class EvalOrderCase extends TestCase { super.setup(); headerCode = ' -var a = 1; -var b = 2; -var c = 3; - function func(i1:Dynamic, i2:Dynamic, i3:Dynamic) { return i1 + ";" + i2 + ";" + i3; } @@ -26,14 +22,12 @@ function func(i1:Dynamic, i2:Dynamic, i3:Dynamic) { return i1 + ";" + i2 + ";" + i3; } - assertEq("func(a, b, c)", func(a, b, c)); - clearPrevious = true; var i = 0; assertEq("var i = 0; func(i++, i++, i++)", func(i++, i++, i++)); var i = 0; - assertEq("var i = 0; var a = [i++, i++, i++]; a.join(';')", [i++, i++, i++].join(";")); + assertEq("var i = 0; [i++, i++, i++].join(';')", [i++, i++, i++].join(";")); var i = 0; var obj = { @@ -56,9 +50,6 @@ function func(i1:Dynamic, i2:Dynamic, i3:Dynamic) { var buf:Array = []; function a() { - trace("cock"); - trace(buf); - trace(buf.push); buf.push(1); return 1; } @@ -94,13 +85,6 @@ function begin() { return buf.join("_"); } } - -function begin2() { - buf = []; - return () -> { - return buf.join("_"); - } -} '; var buf:Array = []; @@ -142,34 +126,151 @@ function begin() { } } -function begin2() { - buf = []; - return () -> { - return buf.join("_"); + // && + + var end = begin(); + (a() + b()) >= 0 && (c() + d()) >= 0; + assertEq('var end = begin(); + (a() + b()) >= 0 && (c() + d()) >= 0; + end()', end()); + + var end = begin(); + (a() + b()) >= 99 && (c() + d()) >= 0; + assertEq('var end = begin(); + (a() + b()) >= 99 && (c() + d()) >= 0; + end()', end()); + + var end = begin(); + (a() + b()) >= 0 && (c() + d()) >= 0 && (e() + f()) >= 0; + assertEq('var end = begin(); + (a() + b()) >= 0 && (c() + d()) >= 0 && (e() + f()) >= 0; + end()', end()); + + var end = begin(); + (a() + b()) >= 99 && (c() + d()) >= 0 && (e() + f()) >= 0; + assertEq('var end = begin(); + (a() + b()) >= 99 && (c() + d()) >= 0 && (e() + f()) >= 0; + end()', end()); + + var end = begin(); + (a() + b()) >= 0 && (c() + d()) >= 99 && (e() + f()) >= 0; + assertEq('var end = begin(); + (a() + b()) >= 0 && (c() + d()) >= 99 && (e() + f()) >= 0; + end()', end()); + + // || + + var end = begin(); + (a() + b()) >= 0 || (c() + d()) >= 0; + assertEq('var end = begin(); + (a() + b()) >= 0 || (c() + d()) >= 0; + end()', end()); + + var end = begin(); + (a() + b()) >= 99 || (c() + d()) >= 0; + assertEq('var end = begin(); + (a() + b()) >= 99 || (c() + d()) >= 0; + end()', end()); + + var end = begin(); + (a() + b()) >= 0 || (c() + d()) >= 0 || (e() + f()) >= 0; + assertEq('var end = begin(); + (a() + b()) >= 0 || (c() + d()) >= 0 || (e() + f()) >= 0; + end()', end()); + + var end = begin(); + (a() + b()) >= 99 || (c() + d()) >= 0 || (e() + f()) >= 0; + assertEq('var end = begin(); + (a() + b()) >= 99 || (c() + d()) >= 0 || (e() + f()) >= 0; + end()', end()); + + var end = begin(); + (a() + b()) >= 99 || (c() + d()) >= 99 || (e() + f()) >= 0; + assertEq('var end = begin(); + (a() + b()) >= 99 || (c() + d()) >= 99 || (e() + f()) >= 0; + end()', end()); + +headerCode += ' +function arr(x, y) { + return []; +} + +function idx(x, y) { + return 0; +} + +function f1() { + buf.push(1); + return function(i) { }; +} + +function f2() { + buf.push(2); + return 2; +} +'; + // [] + +function arr(x, y) { + return []; +} + +function idx(x, y) { + return 0; +} + +function f1() { + buf.push(1); + return function(i) { }; +} + +function f2() { + buf.push(2); + return 2; +} + + var end = begin(); + var _ = (arr(a(), b()))[idx(c(), d())]; + assertEq('var end = begin(); + var _ = (arr(a(), b()))[idx(c(), d())]; + end()', end()); + +headerCode += ' +var d:Dynamic = { f1: f1 }; + +function f3() { + buf.push(3); + d.f1 = function f3df1(i) { + buf.push(4); + return 4; } + return 3; +} +'; + +var d:Dynamic = { f1: f1 }; + +function f3() { + buf.push(3); + d.f1 = function(i) { + buf.push(4); + return 4; + } + return 3; } if(Main.SHOW_KNOWN_BUGS) { var end = begin(); - (a() + b()) >= 0 && (c() + d()) >= 0; + d.f1()(f3()); + d.f1(f2()); assertEq('var end = begin(); - (a() + b()) >= 0 && (c() + d()) >= 0; + //var func = d.f1(); + //func(f3()); + + d.f1()(f3()); + d.f1(f2()); end()', end()); } - - var end = begin(); - var _ = (a() + b()) >= 0 && (c() + d()) >= 0; - assertEq('var end = begin(); - var test = (a() + b()) >= 0 && (c() + d()) >= 0; - trace(buf); - end()', end()); - - var end = begin2(); - var _ = (a() + b()) >= 0 && (c() + d()) >= 0; - assertEq('var end = begin2(); - var test = (a() + b()) >= 0 && (c() + d()) >= 0; - trace(buf, a()); - end()', end()); } override function teardown() { diff --git a/tests/src/tests/FloatCase.hx b/tests/src/tests/FloatCase.hx new file mode 100644 index 0000000..7721107 --- /dev/null +++ b/tests/src/tests/FloatCase.hx @@ -0,0 +1,74 @@ +package tests; + +class FloatCase extends TestCase { + override function setup() { + super.setup(); + + headerCode = " + var nan = Math.NaN; + var pinf = Math.POSITIVE_INFINITY; + var ninf = Math.NEGATIVE_INFINITY; + var fl:Float = 0.0; + "; + } + + override function run() { + var nan = Math.NaN; + var pinf = Math.POSITIVE_INFINITY; + var ninf = Math.NEGATIVE_INFINITY; + var fl:Float = 0.0; + + assertEq("fl > nan", fl > nan); + assertEq("fl < nan", fl < nan); + assertEq("fl >= nan", fl >= nan); + assertEq("fl <= nan", fl <= nan); + assertEq("fl == nan", fl == nan); + assertEq("fl != nan", fl != nan); + + assertEq("nan > nan", nan > nan); + assertEq("nan < nan", nan < nan); + assertEq("nan >= nan", nan >= nan); + assertEq("nan <= nan", nan <= nan); + assertEq("nan == nan", nan == nan); + assertEq("nan != nan", nan != nan); + + assertEq("pinf > nan", pinf > nan); + assertEq("pinf < nan", pinf < nan); + assertEq("pinf >= nan", pinf >= nan); + assertEq("pinf <= nan", pinf <= nan); + assertEq("pinf == nan", pinf == nan); + assertEq("pinf != nan", pinf != nan); + + assertEq("ninf > nan", ninf > nan); + assertEq("ninf < nan", ninf < nan); + assertEq("ninf >= nan", ninf >= nan); + assertEq("ninf <= nan", ninf <= nan); + assertEq("ninf == nan", ninf == nan); + assertEq("ninf != nan", ninf != nan); + + assertEq("nan > fl", nan > fl); + assertEq("nan < fl", nan < fl); + assertEq("nan >= fl", nan >= fl); + assertEq("nan <= fl", nan <= fl); + assertEq("nan == fl", nan == fl); + assertEq("nan != fl", nan != fl); + + assertEq("nan > pinf", nan > pinf); + assertEq("nan < pinf", nan < pinf); + assertEq("nan >= pinf", nan >= pinf); + assertEq("nan <= pinf", nan <= pinf); + assertEq("nan == pinf", nan == pinf); + assertEq("nan != pinf", nan != pinf); + + assertEq("nan > ninf", nan > ninf); + assertEq("nan < ninf", nan < ninf); + assertEq("nan >= ninf", nan >= ninf); + assertEq("nan <= ninf", nan <= ninf); + assertEq("nan == ninf", nan == ninf); + assertEq("nan != ninf", nan != ninf); + } + + override function teardown() { + super.teardown(); + } +} \ No newline at end of file diff --git a/tests/src/tests/IntIteratorCase.hx b/tests/src/tests/IntIteratorCase.hx new file mode 100644 index 0000000..81436ac --- /dev/null +++ b/tests/src/tests/IntIteratorCase.hx @@ -0,0 +1,59 @@ +package tests; + +class IntIteratorCase extends TestCase { + override function setup() { + super.setup(); + } + + override function getNewInterp() { + var interp = super.getNewInterp(); + interp.variables.set("assertEq", Util.assertEq); + interp.variables.set("IntIterator", IntIterator); + return interp; + } + + override function run() { + var ii = new IntIterator(0, 2); + var line = 19; + execute(' + var ii = new IntIterator(0, 2); + assertEq(ii.hasNext(), ${ii.hasNext()}, "l${line++}"); + assertEq(ii.next(), ${ii.next()}, "l${line++}"); + assertEq(ii.hasNext(), ${ii.hasNext()}, "l${line++}"); + assertEq(ii.next(), ${ii.next()}, "l${line++}"); + assertEq(ii.hasNext(), ${ii.hasNext()}, "l${line++}"); + '); + + var ii = new IntIterator(0, 2); + var r = []; + for (i in ii) + r.push(i); + assertEq(' + var ii = new IntIterator(0, 2); + var r = []; + for (i in ii) + r.push(i); + r + ', r); + + var ii = new IntIterator(0, 2); + var r = []; + for (i in ii) + r.push(i); + for (i in ii) + r.push(i); + assertEq(' + var ii = new IntIterator(0, 2); + var r = []; + for (i in ii) + r.push(i); + for (i in ii) + r.push(i); + r + ', r); + } + + override function teardown() { + super.teardown(); + } +} \ No newline at end of file diff --git a/tests/src/tests/MiscCase.hx b/tests/src/tests/MiscCase.hx index f3ee0c6..fbe1499 100644 --- a/tests/src/tests/MiscCase.hx +++ b/tests/src/tests/MiscCase.hx @@ -10,6 +10,15 @@ class MiscCase extends TestCase { assertEq("true", true); assertEq("false", false); assertEq("null", null); + + if(Main.SHOW_KNOWN_BUGS) { + // Redefining a function with the same name as a variable + var a = 1; function a() { return 4; } + assertEq("var a = 1; function a() { return 4; }; a", a); + } + + var a = 1; var a = 2; + assertEq("var a = 1; var a = 2; a", a); } override function teardown() { diff --git a/tests/src/tests/TestCase.hx b/tests/src/tests/TestCase.hx index ebf5458..aa8f29a 100644 --- a/tests/src/tests/TestCase.hx +++ b/tests/src/tests/TestCase.hx @@ -1,41 +1,45 @@ package tests; +@:access(hscript.Interp) +@:access(hscript.Parser) class TestCase { - public var interp:Interp; - public var headerCode:String = ""; - public var tailCode:String = ""; + public var interp:Interp; + public var headerCode:String = ""; + public var tailCode:String = ""; - public var clearPrevious:Bool = true; + public var clearPrevious:Bool = true; - public function new() {} + public function new() {} - public function getNewInterp() { - var interp = Util.getInterp(); - interp.errorHandler = Util.errorHandler; - return interp; - } + public function getNewInterp() { + var interp = Util.getInterp(); + interp.errorHandler = Util.errorHandler; + return interp; + } public function setup() { - interp = getNewInterp(); - } + interp = getNewInterp(); + } public function run() {} public function teardown() {} - public function assertEq(script:String, expected:Dynamic, ?message:String) { - if(message == null) - message = script; - Util.assertEq(execute(headerCode + script + tailCode), expected, message); - } - public function assertNeq(script:String, expected:Dynamic, ?message:String) { - if(message == null) - message = script; - Util.assertNeq(execute(headerCode + script + tailCode), expected, message); - } + public function assertEq(script:String, expected:Dynamic, ?message:String) { + if(message == null) + message = script; + Util.assertEq(execute(headerCode + script + tailCode), expected, message); + } + public function assertNeq(script:String, expected:Dynamic, ?message:String) { + if(message == null) + message = script; + Util.assertNeq(execute(headerCode + script + tailCode), expected, message); + } - public function execute(script:String) { - if (clearPrevious) - return getNewInterp().execute(Util.parse(headerCode + script + tailCode)); - else - @:privateAccess return interp.exprReturn(Util.parse(headerCode + script + tailCode)); - } + public function execute(script:String) { + var interp = clearPrevious ? getNewInterp() : this.interp; + var expr = Util.parse(headerCode + script + tailCode); + if (clearPrevious) + return interp.execute(expr); + else + return interp.exprReturn(expr); + } } \ No newline at end of file