Added some more tests

This commit is contained in:
NeeEoo
2024-04-23 04:04:25 +02:00
parent f512ac4cde
commit 934848ff8d
8 changed files with 407 additions and 121 deletions
+6 -1
View File
@@ -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();
+36 -2
View File
@@ -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<Dynamic>, a2: Array<Dynamic>): 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;
}
}
+53 -53
View File
@@ -1,68 +1,68 @@
package benchmark;
class Benchmark {
public var times:Array<Float> = [];
public var times:Array<Float> = [];
public function new(name:String, iterations:Int) {
times = cast new haxe.ds.Vector<Float>(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<Float>(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<Int> = cast new haxe.ds.Vector<Int>(size.width);
var collumRange:Float = times[times.length-1]-times[0];
var counts:Array<Int> = cast new haxe.ds.Vector<Int>(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<Float> = [for (count in counts) count / times.length];
var gridFilling:Array<Int> = [for (count in normalizedCounts) Math.round(count*size.height)];
var normalizedCounts:Array<Float> = [for (count in counts) count / times.length];
var gridFilling:Array<Int> = [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<Float> = [];
public function benchmark() {
var array:Array<Float> = [];
for (i in 0...10000)
array.push(Math.random());
}
for (i in 0...10000)
array.push(Math.random());
}
}
+138 -37
View File
@@ -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<Int> = [];
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<Int> = [];
@@ -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() {
+74
View File
@@ -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();
}
}
+59
View File
@@ -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();
}
}
+9
View File
@@ -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() {
+32 -28
View File
@@ -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);
}
}