[jlox] conformance tests (wip)
This commit is contained in:
@@ -5,6 +5,7 @@ import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.nio.charset.Charset;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.List;
|
||||
|
||||
@@ -66,12 +67,17 @@ public class Lox {
|
||||
}
|
||||
}
|
||||
|
||||
protected static void runFile(String path) throws IOException {
|
||||
byte[] bytes = Files.readAllBytes(Paths.get(path));
|
||||
protected static int runFile(Path path) throws IOException {
|
||||
byte[] bytes = Files.readAllBytes(path);
|
||||
run(new String(bytes, Charset.defaultCharset()));
|
||||
|
||||
if (hadError) System.exit(65);
|
||||
if (hadRuntimeError) System.exit(70);
|
||||
if (hadError) return 65;
|
||||
if (hadRuntimeError) return 70;
|
||||
return 0;
|
||||
}
|
||||
|
||||
protected static int runFile(String path) throws IOException {
|
||||
return runFile(Paths.get(path));
|
||||
}
|
||||
|
||||
private static void printUsage() {
|
||||
@@ -82,7 +88,7 @@ public class Lox {
|
||||
if (args.length == 0) {
|
||||
runPrompt();
|
||||
} else if (args.length == 1) {
|
||||
runFile(args[0]);
|
||||
System.exit(runFile(args[0]));
|
||||
} else {
|
||||
printUsage();
|
||||
}
|
||||
|
||||
35
jlox/lox/src/test/java/xyz/ctsk/lox/ConformanceTest.java
Normal file
35
jlox/lox/src/test/java/xyz/ctsk/lox/ConformanceTest.java
Normal file
@@ -0,0 +1,35 @@
|
||||
package xyz.ctsk.lox;
|
||||
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.params.ParameterizedTest;
|
||||
import org.junit.jupiter.params.provider.MethodSource;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.PrintStream;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.stream.Stream;
|
||||
import java.util.stream.StreamSupport;
|
||||
|
||||
|
||||
public class ConformanceTest {
|
||||
private static final Path LOX_ROOT = Path.of("src/test/resources");
|
||||
|
||||
static Stream<String> loxPaths() throws IOException {
|
||||
return Files.walk(LOX_ROOT)
|
||||
.filter(Files::isRegularFile)
|
||||
.map(Path::toString);
|
||||
}
|
||||
|
||||
@ParameterizedTest(name = "{index}")
|
||||
@MethodSource("loxPaths")
|
||||
public void run(String path) throws IOException {
|
||||
System.out.println(path);
|
||||
Lox.runFile(path);
|
||||
}
|
||||
|
||||
@BeforeEach
|
||||
public void setUpStreams() {
|
||||
System.setOut(new PrintStream(System.out, true));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
var a = "a";
|
||||
var b = "b";
|
||||
var c = "c";
|
||||
|
||||
// Assignment is right-associative.
|
||||
a = b = c;
|
||||
print a; // expect: c
|
||||
print b; // expect: c
|
||||
print c; // expect: c
|
||||
@@ -0,0 +1,8 @@
|
||||
var a = "before";
|
||||
print a; // expect: before
|
||||
|
||||
a = "after";
|
||||
print a; // expect: after
|
||||
|
||||
print a = "arg"; // expect: arg
|
||||
print a; // expect: arg
|
||||
@@ -0,0 +1,2 @@
|
||||
var a = "a";
|
||||
(a) = "value"; // Error at '=': Invalid assignment target.
|
||||
@@ -0,0 +1,3 @@
|
||||
var a = "a";
|
||||
var b = "b";
|
||||
a + b = "value"; // Error at '=': Invalid assignment target.
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
var a = "before";
|
||||
print a; // expect: before
|
||||
|
||||
a = "after";
|
||||
print a; // expect: after
|
||||
|
||||
print a = "arg"; // expect: arg
|
||||
print a; // expect: arg
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
var a = "a";
|
||||
!a = "value"; // Error at '=': Invalid assignment target.
|
||||
@@ -0,0 +1,5 @@
|
||||
// Assignment on RHS of variable.
|
||||
var a = "before";
|
||||
var c = a = "var";
|
||||
print a; // expect: var
|
||||
print c; // expect: var
|
||||
@@ -0,0 +1,7 @@
|
||||
class Foo {
|
||||
Foo() {
|
||||
this = "value"; // Error at '=': Invalid assignment target.
|
||||
}
|
||||
}
|
||||
|
||||
Foo();
|
||||
@@ -0,0 +1 @@
|
||||
unknown = "what"; // expect runtime error: Undefined variable 'unknown'.
|
||||
@@ -0,0 +1,71 @@
|
||||
class Tree {
|
||||
init(item, depth) {
|
||||
this.item = item;
|
||||
this.depth = depth;
|
||||
if (depth > 0) {
|
||||
var item2 = item + item;
|
||||
depth = depth - 1;
|
||||
this.left = Tree(item2 - 1, depth);
|
||||
this.right = Tree(item2, depth);
|
||||
} else {
|
||||
this.left = nil;
|
||||
this.right = nil;
|
||||
}
|
||||
}
|
||||
|
||||
check() {
|
||||
if (this.left == nil) {
|
||||
return this.item;
|
||||
}
|
||||
|
||||
return this.item + this.left.check() - this.right.check();
|
||||
}
|
||||
}
|
||||
|
||||
var minDepth = 4;
|
||||
var maxDepth = 14;
|
||||
var stretchDepth = maxDepth + 1;
|
||||
|
||||
var start = clock();
|
||||
|
||||
print "stretch tree of depth:";
|
||||
print stretchDepth;
|
||||
print "check:";
|
||||
print Tree(0, stretchDepth).check();
|
||||
|
||||
var longLivedTree = Tree(0, maxDepth);
|
||||
|
||||
// iterations = 2 ** maxDepth
|
||||
var iterations = 1;
|
||||
var d = 0;
|
||||
while (d < maxDepth) {
|
||||
iterations = iterations * 2;
|
||||
d = d + 1;
|
||||
}
|
||||
|
||||
var depth = minDepth;
|
||||
while (depth < stretchDepth) {
|
||||
var check = 0;
|
||||
var i = 1;
|
||||
while (i <= iterations) {
|
||||
check = check + Tree(i, depth).check() + Tree(-i, depth).check();
|
||||
i = i + 1;
|
||||
}
|
||||
|
||||
print "num trees:";
|
||||
print iterations * 2;
|
||||
print "depth:";
|
||||
print depth;
|
||||
print "check:";
|
||||
print check;
|
||||
|
||||
iterations = iterations / 4;
|
||||
depth = depth + 2;
|
||||
}
|
||||
|
||||
print "long lived tree of depth:";
|
||||
print maxDepth;
|
||||
print "check:";
|
||||
print longLivedTree.check();
|
||||
print "elapsed:";
|
||||
print clock() - start;
|
||||
@@ -0,0 +1,34 @@
|
||||
var i = 0;
|
||||
|
||||
var loopStart = clock();
|
||||
|
||||
while (i < 10000000) {
|
||||
i = i + 1;
|
||||
|
||||
1; 1; 1; 2; 1; nil; 1; "str"; 1; true;
|
||||
nil; nil; nil; 1; nil; "str"; nil; true;
|
||||
true; true; true; 1; true; false; true; "str"; true; nil;
|
||||
"str"; "str"; "str"; "stru"; "str"; 1; "str"; nil; "str"; true;
|
||||
}
|
||||
|
||||
var loopTime = clock() - loopStart;
|
||||
|
||||
var start = clock();
|
||||
|
||||
i = 0;
|
||||
while (i < 10000000) {
|
||||
i = i + 1;
|
||||
|
||||
1 == 1; 1 == 2; 1 == nil; 1 == "str"; 1 == true;
|
||||
nil == nil; nil == 1; nil == "str"; nil == true;
|
||||
true == true; true == 1; true == false; true == "str"; true == nil;
|
||||
"str" == "str"; "str" == "stru"; "str" == 1; "str" == nil; "str" == true;
|
||||
}
|
||||
|
||||
var elapsed = clock() - start;
|
||||
print "loop";
|
||||
print loopTime;
|
||||
print "elapsed";
|
||||
print elapsed;
|
||||
print "equals";
|
||||
print elapsed - loopTime;
|
||||
@@ -0,0 +1,8 @@
|
||||
fun fib(n) {
|
||||
if (n < 2) return n;
|
||||
return fib(n - 2) + fib(n - 1);
|
||||
}
|
||||
|
||||
var start = clock();
|
||||
print fib(35) == 9227465;
|
||||
print clock() - start;
|
||||
@@ -0,0 +1,43 @@
|
||||
// This benchmark stresses instance creation and initializer calling.
|
||||
|
||||
class Foo {
|
||||
init() {}
|
||||
}
|
||||
|
||||
var start = clock();
|
||||
var i = 0;
|
||||
while (i < 500000) {
|
||||
Foo();
|
||||
Foo();
|
||||
Foo();
|
||||
Foo();
|
||||
Foo();
|
||||
Foo();
|
||||
Foo();
|
||||
Foo();
|
||||
Foo();
|
||||
Foo();
|
||||
Foo();
|
||||
Foo();
|
||||
Foo();
|
||||
Foo();
|
||||
Foo();
|
||||
Foo();
|
||||
Foo();
|
||||
Foo();
|
||||
Foo();
|
||||
Foo();
|
||||
Foo();
|
||||
Foo();
|
||||
Foo();
|
||||
Foo();
|
||||
Foo();
|
||||
Foo();
|
||||
Foo();
|
||||
Foo();
|
||||
Foo();
|
||||
Foo();
|
||||
i = i + 1;
|
||||
}
|
||||
|
||||
print clock() - start;
|
||||
@@ -0,0 +1,73 @@
|
||||
// This benchmark stresses just method invocation.
|
||||
|
||||
class Foo {
|
||||
method0() {}
|
||||
method1() {}
|
||||
method2() {}
|
||||
method3() {}
|
||||
method4() {}
|
||||
method5() {}
|
||||
method6() {}
|
||||
method7() {}
|
||||
method8() {}
|
||||
method9() {}
|
||||
method10() {}
|
||||
method11() {}
|
||||
method12() {}
|
||||
method13() {}
|
||||
method14() {}
|
||||
method15() {}
|
||||
method16() {}
|
||||
method17() {}
|
||||
method18() {}
|
||||
method19() {}
|
||||
method20() {}
|
||||
method21() {}
|
||||
method22() {}
|
||||
method23() {}
|
||||
method24() {}
|
||||
method25() {}
|
||||
method26() {}
|
||||
method27() {}
|
||||
method28() {}
|
||||
method29() {}
|
||||
}
|
||||
|
||||
var foo = Foo();
|
||||
var start = clock();
|
||||
var i = 0;
|
||||
while (i < 500000) {
|
||||
foo.method0();
|
||||
foo.method1();
|
||||
foo.method2();
|
||||
foo.method3();
|
||||
foo.method4();
|
||||
foo.method5();
|
||||
foo.method6();
|
||||
foo.method7();
|
||||
foo.method8();
|
||||
foo.method9();
|
||||
foo.method10();
|
||||
foo.method11();
|
||||
foo.method12();
|
||||
foo.method13();
|
||||
foo.method14();
|
||||
foo.method15();
|
||||
foo.method16();
|
||||
foo.method17();
|
||||
foo.method18();
|
||||
foo.method19();
|
||||
foo.method20();
|
||||
foo.method21();
|
||||
foo.method22();
|
||||
foo.method23();
|
||||
foo.method24();
|
||||
foo.method25();
|
||||
foo.method26();
|
||||
foo.method27();
|
||||
foo.method28();
|
||||
foo.method29();
|
||||
i = i + 1;
|
||||
}
|
||||
|
||||
print clock() - start;
|
||||
@@ -0,0 +1,69 @@
|
||||
class Toggle {
|
||||
init(startState) {
|
||||
this.state = startState;
|
||||
}
|
||||
|
||||
value() { return this.state; }
|
||||
|
||||
activate() {
|
||||
this.state = !this.state;
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
||||
class NthToggle < Toggle {
|
||||
init(startState, maxCounter) {
|
||||
super.init(startState);
|
||||
this.countMax = maxCounter;
|
||||
this.count = 0;
|
||||
}
|
||||
|
||||
activate() {
|
||||
this.count = this.count + 1;
|
||||
if (this.count >= this.countMax) {
|
||||
super.activate();
|
||||
this.count = 0;
|
||||
}
|
||||
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
||||
var start = clock();
|
||||
var n = 100000;
|
||||
var val = true;
|
||||
var toggle = Toggle(val);
|
||||
|
||||
for (var i = 0; i < n; i = i + 1) {
|
||||
val = toggle.activate().value();
|
||||
val = toggle.activate().value();
|
||||
val = toggle.activate().value();
|
||||
val = toggle.activate().value();
|
||||
val = toggle.activate().value();
|
||||
val = toggle.activate().value();
|
||||
val = toggle.activate().value();
|
||||
val = toggle.activate().value();
|
||||
val = toggle.activate().value();
|
||||
val = toggle.activate().value();
|
||||
}
|
||||
|
||||
print toggle.value();
|
||||
|
||||
val = true;
|
||||
var ntoggle = NthToggle(val, 3);
|
||||
|
||||
for (var i = 0; i < n; i = i + 1) {
|
||||
val = ntoggle.activate().value();
|
||||
val = ntoggle.activate().value();
|
||||
val = ntoggle.activate().value();
|
||||
val = ntoggle.activate().value();
|
||||
val = ntoggle.activate().value();
|
||||
val = ntoggle.activate().value();
|
||||
val = ntoggle.activate().value();
|
||||
val = ntoggle.activate().value();
|
||||
val = ntoggle.activate().value();
|
||||
val = ntoggle.activate().value();
|
||||
}
|
||||
|
||||
print ntoggle.value();
|
||||
print clock() - start;
|
||||
@@ -0,0 +1,106 @@
|
||||
// This benchmark stresses both field and method lookup.
|
||||
|
||||
class Foo {
|
||||
init() {
|
||||
this.field0 = 1;
|
||||
this.field1 = 1;
|
||||
this.field2 = 1;
|
||||
this.field3 = 1;
|
||||
this.field4 = 1;
|
||||
this.field5 = 1;
|
||||
this.field6 = 1;
|
||||
this.field7 = 1;
|
||||
this.field8 = 1;
|
||||
this.field9 = 1;
|
||||
this.field10 = 1;
|
||||
this.field11 = 1;
|
||||
this.field12 = 1;
|
||||
this.field13 = 1;
|
||||
this.field14 = 1;
|
||||
this.field15 = 1;
|
||||
this.field16 = 1;
|
||||
this.field17 = 1;
|
||||
this.field18 = 1;
|
||||
this.field19 = 1;
|
||||
this.field20 = 1;
|
||||
this.field21 = 1;
|
||||
this.field22 = 1;
|
||||
this.field23 = 1;
|
||||
this.field24 = 1;
|
||||
this.field25 = 1;
|
||||
this.field26 = 1;
|
||||
this.field27 = 1;
|
||||
this.field28 = 1;
|
||||
this.field29 = 1;
|
||||
}
|
||||
|
||||
method0() { return this.field0; }
|
||||
method1() { return this.field1; }
|
||||
method2() { return this.field2; }
|
||||
method3() { return this.field3; }
|
||||
method4() { return this.field4; }
|
||||
method5() { return this.field5; }
|
||||
method6() { return this.field6; }
|
||||
method7() { return this.field7; }
|
||||
method8() { return this.field8; }
|
||||
method9() { return this.field9; }
|
||||
method10() { return this.field10; }
|
||||
method11() { return this.field11; }
|
||||
method12() { return this.field12; }
|
||||
method13() { return this.field13; }
|
||||
method14() { return this.field14; }
|
||||
method15() { return this.field15; }
|
||||
method16() { return this.field16; }
|
||||
method17() { return this.field17; }
|
||||
method18() { return this.field18; }
|
||||
method19() { return this.field19; }
|
||||
method20() { return this.field20; }
|
||||
method21() { return this.field21; }
|
||||
method22() { return this.field22; }
|
||||
method23() { return this.field23; }
|
||||
method24() { return this.field24; }
|
||||
method25() { return this.field25; }
|
||||
method26() { return this.field26; }
|
||||
method27() { return this.field27; }
|
||||
method28() { return this.field28; }
|
||||
method29() { return this.field29; }
|
||||
}
|
||||
|
||||
var foo = Foo();
|
||||
var start = clock();
|
||||
var i = 0;
|
||||
while (i < 500000) {
|
||||
foo.method0();
|
||||
foo.method1();
|
||||
foo.method2();
|
||||
foo.method3();
|
||||
foo.method4();
|
||||
foo.method5();
|
||||
foo.method6();
|
||||
foo.method7();
|
||||
foo.method8();
|
||||
foo.method9();
|
||||
foo.method10();
|
||||
foo.method11();
|
||||
foo.method12();
|
||||
foo.method13();
|
||||
foo.method14();
|
||||
foo.method15();
|
||||
foo.method16();
|
||||
foo.method17();
|
||||
foo.method18();
|
||||
foo.method19();
|
||||
foo.method20();
|
||||
foo.method21();
|
||||
foo.method22();
|
||||
foo.method23();
|
||||
foo.method24();
|
||||
foo.method25();
|
||||
foo.method26();
|
||||
foo.method27();
|
||||
foo.method28();
|
||||
foo.method29();
|
||||
i = i + 1;
|
||||
}
|
||||
|
||||
print clock() - start;
|
||||
@@ -0,0 +1,219 @@
|
||||
var a1 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1";
|
||||
var a2 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2";
|
||||
var a3 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3";
|
||||
var a4 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4";
|
||||
var a5 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa5";
|
||||
var a6 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa6";
|
||||
var a7 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa7";
|
||||
var a8 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8";
|
||||
|
||||
var i = 0;
|
||||
|
||||
var loopStart = clock();
|
||||
|
||||
while (i < 100000) {
|
||||
i = i + 1;
|
||||
|
||||
a1; a1; a1; a2; a1; a3; a1; a4; a1; a5; a1; a6; a1; a7; a1; a8;
|
||||
a2; a1; a2; a2; a2; a3; a2; a4; a2; a5; a2; a6; a2; a7; a2; a8;
|
||||
a3; a1; a3; a2; a3; a3; a3; a4; a3; a5; a3; a6; a3; a7; a3; a8;
|
||||
a4; a1; a4; a2; a4; a3; a4; a4; a4; a5; a4; a6; a4; a7; a4; a8;
|
||||
a5; a1; a5; a2; a5; a3; a5; a4; a5; a5; a5; a6; a5; a7; a5; a8;
|
||||
a6; a1; a6; a2; a6; a3; a6; a4; a6; a5; a6; a6; a6; a7; a6; a8;
|
||||
a7; a1; a7; a2; a7; a3; a7; a4; a7; a5; a7; a6; a7; a7; a7; a8;
|
||||
a8; a1; a8; a2; a8; a3; a8; a4; a8; a5; a8; a6; a8; a7; a8; a8;
|
||||
|
||||
a1; a1; a1; a2; a1; a3; a1; a4; a1; a5; a1; a6; a1; a7; a1; a8;
|
||||
a2; a1; a2; a2; a2; a3; a2; a4; a2; a5; a2; a6; a2; a7; a2; a8;
|
||||
a3; a1; a3; a2; a3; a3; a3; a4; a3; a5; a3; a6; a3; a7; a3; a8;
|
||||
a4; a1; a4; a2; a4; a3; a4; a4; a4; a5; a4; a6; a4; a7; a4; a8;
|
||||
a5; a1; a5; a2; a5; a3; a5; a4; a5; a5; a5; a6; a5; a7; a5; a8;
|
||||
a6; a1; a6; a2; a6; a3; a6; a4; a6; a5; a6; a6; a6; a7; a6; a8;
|
||||
a7; a1; a7; a2; a7; a3; a7; a4; a7; a5; a7; a6; a7; a7; a7; a8;
|
||||
a8; a1; a8; a2; a8; a3; a8; a4; a8; a5; a8; a6; a8; a7; a8; a8;
|
||||
|
||||
a1; a1; a1; a2; a1; a3; a1; a4; a1; a5; a1; a6; a1; a7; a1; a8;
|
||||
a2; a1; a2; a2; a2; a3; a2; a4; a2; a5; a2; a6; a2; a7; a2; a8;
|
||||
a3; a1; a3; a2; a3; a3; a3; a4; a3; a5; a3; a6; a3; a7; a3; a8;
|
||||
a4; a1; a4; a2; a4; a3; a4; a4; a4; a5; a4; a6; a4; a7; a4; a8;
|
||||
a5; a1; a5; a2; a5; a3; a5; a4; a5; a5; a5; a6; a5; a7; a5; a8;
|
||||
a6; a1; a6; a2; a6; a3; a6; a4; a6; a5; a6; a6; a6; a7; a6; a8;
|
||||
a7; a1; a7; a2; a7; a3; a7; a4; a7; a5; a7; a6; a7; a7; a7; a8;
|
||||
a8; a1; a8; a2; a8; a3; a8; a4; a8; a5; a8; a6; a8; a7; a8; a8;
|
||||
|
||||
a1; a1; a1; a2; a1; a3; a1; a4; a1; a5; a1; a6; a1; a7; a1; a8;
|
||||
a2; a1; a2; a2; a2; a3; a2; a4; a2; a5; a2; a6; a2; a7; a2; a8;
|
||||
a3; a1; a3; a2; a3; a3; a3; a4; a3; a5; a3; a6; a3; a7; a3; a8;
|
||||
a4; a1; a4; a2; a4; a3; a4; a4; a4; a5; a4; a6; a4; a7; a4; a8;
|
||||
a5; a1; a5; a2; a5; a3; a5; a4; a5; a5; a5; a6; a5; a7; a5; a8;
|
||||
a6; a1; a6; a2; a6; a3; a6; a4; a6; a5; a6; a6; a6; a7; a6; a8;
|
||||
a7; a1; a7; a2; a7; a3; a7; a4; a7; a5; a7; a6; a7; a7; a7; a8;
|
||||
a8; a1; a8; a2; a8; a3; a8; a4; a8; a5; a8; a6; a8; a7; a8; a8;
|
||||
|
||||
a1; a1; a1; a2; a1; a3; a1; a4; a1; a5; a1; a6; a1; a7; a1; a8;
|
||||
a2; a1; a2; a2; a2; a3; a2; a4; a2; a5; a2; a6; a2; a7; a2; a8;
|
||||
a3; a1; a3; a2; a3; a3; a3; a4; a3; a5; a3; a6; a3; a7; a3; a8;
|
||||
a4; a1; a4; a2; a4; a3; a4; a4; a4; a5; a4; a6; a4; a7; a4; a8;
|
||||
a5; a1; a5; a2; a5; a3; a5; a4; a5; a5; a5; a6; a5; a7; a5; a8;
|
||||
a6; a1; a6; a2; a6; a3; a6; a4; a6; a5; a6; a6; a6; a7; a6; a8;
|
||||
a7; a1; a7; a2; a7; a3; a7; a4; a7; a5; a7; a6; a7; a7; a7; a8;
|
||||
a8; a1; a8; a2; a8; a3; a8; a4; a8; a5; a8; a6; a8; a7; a8; a8;
|
||||
|
||||
a1; a1; a1; a2; a1; a3; a1; a4; a1; a5; a1; a6; a1; a7; a1; a8;
|
||||
a2; a1; a2; a2; a2; a3; a2; a4; a2; a5; a2; a6; a2; a7; a2; a8;
|
||||
a3; a1; a3; a2; a3; a3; a3; a4; a3; a5; a3; a6; a3; a7; a3; a8;
|
||||
a4; a1; a4; a2; a4; a3; a4; a4; a4; a5; a4; a6; a4; a7; a4; a8;
|
||||
a5; a1; a5; a2; a5; a3; a5; a4; a5; a5; a5; a6; a5; a7; a5; a8;
|
||||
a6; a1; a6; a2; a6; a3; a6; a4; a6; a5; a6; a6; a6; a7; a6; a8;
|
||||
a7; a1; a7; a2; a7; a3; a7; a4; a7; a5; a7; a6; a7; a7; a7; a8;
|
||||
a8; a1; a8; a2; a8; a3; a8; a4; a8; a5; a8; a6; a8; a7; a8; a8;
|
||||
|
||||
a1; a1; a1; a2; a1; a3; a1; a4; a1; a5; a1; a6; a1; a7; a1; a8;
|
||||
a2; a1; a2; a2; a2; a3; a2; a4; a2; a5; a2; a6; a2; a7; a2; a8;
|
||||
a3; a1; a3; a2; a3; a3; a3; a4; a3; a5; a3; a6; a3; a7; a3; a8;
|
||||
a4; a1; a4; a2; a4; a3; a4; a4; a4; a5; a4; a6; a4; a7; a4; a8;
|
||||
a5; a1; a5; a2; a5; a3; a5; a4; a5; a5; a5; a6; a5; a7; a5; a8;
|
||||
a6; a1; a6; a2; a6; a3; a6; a4; a6; a5; a6; a6; a6; a7; a6; a8;
|
||||
a7; a1; a7; a2; a7; a3; a7; a4; a7; a5; a7; a6; a7; a7; a7; a8;
|
||||
a8; a1; a8; a2; a8; a3; a8; a4; a8; a5; a8; a6; a8; a7; a8; a8;
|
||||
|
||||
a1; a1; a1; a2; a1; a3; a1; a4; a1; a5; a1; a6; a1; a7; a1; a8;
|
||||
a2; a1; a2; a2; a2; a3; a2; a4; a2; a5; a2; a6; a2; a7; a2; a8;
|
||||
a3; a1; a3; a2; a3; a3; a3; a4; a3; a5; a3; a6; a3; a7; a3; a8;
|
||||
a4; a1; a4; a2; a4; a3; a4; a4; a4; a5; a4; a6; a4; a7; a4; a8;
|
||||
a5; a1; a5; a2; a5; a3; a5; a4; a5; a5; a5; a6; a5; a7; a5; a8;
|
||||
a6; a1; a6; a2; a6; a3; a6; a4; a6; a5; a6; a6; a6; a7; a6; a8;
|
||||
a7; a1; a7; a2; a7; a3; a7; a4; a7; a5; a7; a6; a7; a7; a7; a8;
|
||||
a8; a1; a8; a2; a8; a3; a8; a4; a8; a5; a8; a6; a8; a7; a8; a8;
|
||||
|
||||
a1; a1; a1; a2; a1; a3; a1; a4; a1; a5; a1; a6; a1; a7; a1; a8;
|
||||
a2; a1; a2; a2; a2; a3; a2; a4; a2; a5; a2; a6; a2; a7; a2; a8;
|
||||
a3; a1; a3; a2; a3; a3; a3; a4; a3; a5; a3; a6; a3; a7; a3; a8;
|
||||
a4; a1; a4; a2; a4; a3; a4; a4; a4; a5; a4; a6; a4; a7; a4; a8;
|
||||
a5; a1; a5; a2; a5; a3; a5; a4; a5; a5; a5; a6; a5; a7; a5; a8;
|
||||
a6; a1; a6; a2; a6; a3; a6; a4; a6; a5; a6; a6; a6; a7; a6; a8;
|
||||
a7; a1; a7; a2; a7; a3; a7; a4; a7; a5; a7; a6; a7; a7; a7; a8;
|
||||
a8; a1; a8; a2; a8; a3; a8; a4; a8; a5; a8; a6; a8; a7; a8; a8;
|
||||
|
||||
a1; a1; a1; a2; a1; a3; a1; a4; a1; a5; a1; a6; a1; a7; a1; a8;
|
||||
a2; a1; a2; a2; a2; a3; a2; a4; a2; a5; a2; a6; a2; a7; a2; a8;
|
||||
a3; a1; a3; a2; a3; a3; a3; a4; a3; a5; a3; a6; a3; a7; a3; a8;
|
||||
a4; a1; a4; a2; a4; a3; a4; a4; a4; a5; a4; a6; a4; a7; a4; a8;
|
||||
a5; a1; a5; a2; a5; a3; a5; a4; a5; a5; a5; a6; a5; a7; a5; a8;
|
||||
a6; a1; a6; a2; a6; a3; a6; a4; a6; a5; a6; a6; a6; a7; a6; a8;
|
||||
a7; a1; a7; a2; a7; a3; a7; a4; a7; a5; a7; a6; a7; a7; a7; a8;
|
||||
a8; a1; a8; a2; a8; a3; a8; a4; a8; a5; a8; a6; a8; a7; a8; a8;
|
||||
}
|
||||
|
||||
var loopTime = clock() - loopStart;
|
||||
|
||||
var start = clock();
|
||||
|
||||
i = 0;
|
||||
while (i < 100000) {
|
||||
i = i + 1;
|
||||
|
||||
// 1 == 1; 1 == 2; 1 == nil; 1 == "str"; 1 == true;
|
||||
// nil == nil; nil == 1; nil == "str"; nil == true;
|
||||
// true == true; true == 1; true == false; true == "str"; true == nil;
|
||||
// "str" == "str"; "str" == "stru"; "str" == 1; "str" == nil; "str" == true;
|
||||
|
||||
a1 == a1; a1 == a2; a1 == a3; a1 == a4; a1 == a5; a1 == a6; a1 == a7; a1 == a8;
|
||||
a2 == a1; a2 == a2; a2 == a3; a2 == a4; a2 == a5; a2 == a6; a2 == a7; a2 == a8;
|
||||
a3 == a1; a3 == a2; a3 == a3; a3 == a4; a3 == a5; a3 == a6; a3 == a7; a3 == a8;
|
||||
a4 == a1; a4 == a2; a4 == a3; a4 == a4; a4 == a5; a4 == a6; a4 == a7; a4 == a8;
|
||||
a5 == a1; a5 == a2; a5 == a3; a5 == a4; a5 == a5; a5 == a6; a5 == a7; a5 == a8;
|
||||
a6 == a1; a6 == a2; a6 == a3; a6 == a4; a6 == a5; a6 == a6; a6 == a7; a6 == a8;
|
||||
a7 == a1; a7 == a2; a7 == a3; a7 == a4; a7 == a5; a7 == a6; a7 == a7; a7 == a8;
|
||||
a8 == a1; a8 == a2; a8 == a3; a8 == a4; a8 == a5; a8 == a6; a8 == a7; a8 == a8;
|
||||
|
||||
a1 == a1; a1 == a2; a1 == a3; a1 == a4; a1 == a5; a1 == a6; a1 == a7; a1 == a8;
|
||||
a2 == a1; a2 == a2; a2 == a3; a2 == a4; a2 == a5; a2 == a6; a2 == a7; a2 == a8;
|
||||
a3 == a1; a3 == a2; a3 == a3; a3 == a4; a3 == a5; a3 == a6; a3 == a7; a3 == a8;
|
||||
a4 == a1; a4 == a2; a4 == a3; a4 == a4; a4 == a5; a4 == a6; a4 == a7; a4 == a8;
|
||||
a5 == a1; a5 == a2; a5 == a3; a5 == a4; a5 == a5; a5 == a6; a5 == a7; a5 == a8;
|
||||
a6 == a1; a6 == a2; a6 == a3; a6 == a4; a6 == a5; a6 == a6; a6 == a7; a6 == a8;
|
||||
a7 == a1; a7 == a2; a7 == a3; a7 == a4; a7 == a5; a7 == a6; a7 == a7; a7 == a8;
|
||||
a8 == a1; a8 == a2; a8 == a3; a8 == a4; a8 == a5; a8 == a6; a8 == a7; a8 == a8;
|
||||
|
||||
a1 == a1; a1 == a2; a1 == a3; a1 == a4; a1 == a5; a1 == a6; a1 == a7; a1 == a8;
|
||||
a2 == a1; a2 == a2; a2 == a3; a2 == a4; a2 == a5; a2 == a6; a2 == a7; a2 == a8;
|
||||
a3 == a1; a3 == a2; a3 == a3; a3 == a4; a3 == a5; a3 == a6; a3 == a7; a3 == a8;
|
||||
a4 == a1; a4 == a2; a4 == a3; a4 == a4; a4 == a5; a4 == a6; a4 == a7; a4 == a8;
|
||||
a5 == a1; a5 == a2; a5 == a3; a5 == a4; a5 == a5; a5 == a6; a5 == a7; a5 == a8;
|
||||
a6 == a1; a6 == a2; a6 == a3; a6 == a4; a6 == a5; a6 == a6; a6 == a7; a6 == a8;
|
||||
a7 == a1; a7 == a2; a7 == a3; a7 == a4; a7 == a5; a7 == a6; a7 == a7; a7 == a8;
|
||||
a8 == a1; a8 == a2; a8 == a3; a8 == a4; a8 == a5; a8 == a6; a8 == a7; a8 == a8;
|
||||
|
||||
a1 == a1; a1 == a2; a1 == a3; a1 == a4; a1 == a5; a1 == a6; a1 == a7; a1 == a8;
|
||||
a2 == a1; a2 == a2; a2 == a3; a2 == a4; a2 == a5; a2 == a6; a2 == a7; a2 == a8;
|
||||
a3 == a1; a3 == a2; a3 == a3; a3 == a4; a3 == a5; a3 == a6; a3 == a7; a3 == a8;
|
||||
a4 == a1; a4 == a2; a4 == a3; a4 == a4; a4 == a5; a4 == a6; a4 == a7; a4 == a8;
|
||||
a5 == a1; a5 == a2; a5 == a3; a5 == a4; a5 == a5; a5 == a6; a5 == a7; a5 == a8;
|
||||
a6 == a1; a6 == a2; a6 == a3; a6 == a4; a6 == a5; a6 == a6; a6 == a7; a6 == a8;
|
||||
a7 == a1; a7 == a2; a7 == a3; a7 == a4; a7 == a5; a7 == a6; a7 == a7; a7 == a8;
|
||||
a8 == a1; a8 == a2; a8 == a3; a8 == a4; a8 == a5; a8 == a6; a8 == a7; a8 == a8;
|
||||
|
||||
a1 == a1; a1 == a2; a1 == a3; a1 == a4; a1 == a5; a1 == a6; a1 == a7; a1 == a8;
|
||||
a2 == a1; a2 == a2; a2 == a3; a2 == a4; a2 == a5; a2 == a6; a2 == a7; a2 == a8;
|
||||
a3 == a1; a3 == a2; a3 == a3; a3 == a4; a3 == a5; a3 == a6; a3 == a7; a3 == a8;
|
||||
a4 == a1; a4 == a2; a4 == a3; a4 == a4; a4 == a5; a4 == a6; a4 == a7; a4 == a8;
|
||||
a5 == a1; a5 == a2; a5 == a3; a5 == a4; a5 == a5; a5 == a6; a5 == a7; a5 == a8;
|
||||
a6 == a1; a6 == a2; a6 == a3; a6 == a4; a6 == a5; a6 == a6; a6 == a7; a6 == a8;
|
||||
a7 == a1; a7 == a2; a7 == a3; a7 == a4; a7 == a5; a7 == a6; a7 == a7; a7 == a8;
|
||||
a8 == a1; a8 == a2; a8 == a3; a8 == a4; a8 == a5; a8 == a6; a8 == a7; a8 == a8;
|
||||
|
||||
a1 == a1; a1 == a2; a1 == a3; a1 == a4; a1 == a5; a1 == a6; a1 == a7; a1 == a8;
|
||||
a2 == a1; a2 == a2; a2 == a3; a2 == a4; a2 == a5; a2 == a6; a2 == a7; a2 == a8;
|
||||
a3 == a1; a3 == a2; a3 == a3; a3 == a4; a3 == a5; a3 == a6; a3 == a7; a3 == a8;
|
||||
a4 == a1; a4 == a2; a4 == a3; a4 == a4; a4 == a5; a4 == a6; a4 == a7; a4 == a8;
|
||||
a5 == a1; a5 == a2; a5 == a3; a5 == a4; a5 == a5; a5 == a6; a5 == a7; a5 == a8;
|
||||
a6 == a1; a6 == a2; a6 == a3; a6 == a4; a6 == a5; a6 == a6; a6 == a7; a6 == a8;
|
||||
a7 == a1; a7 == a2; a7 == a3; a7 == a4; a7 == a5; a7 == a6; a7 == a7; a7 == a8;
|
||||
a8 == a1; a8 == a2; a8 == a3; a8 == a4; a8 == a5; a8 == a6; a8 == a7; a8 == a8;
|
||||
|
||||
a1 == a1; a1 == a2; a1 == a3; a1 == a4; a1 == a5; a1 == a6; a1 == a7; a1 == a8;
|
||||
a2 == a1; a2 == a2; a2 == a3; a2 == a4; a2 == a5; a2 == a6; a2 == a7; a2 == a8;
|
||||
a3 == a1; a3 == a2; a3 == a3; a3 == a4; a3 == a5; a3 == a6; a3 == a7; a3 == a8;
|
||||
a4 == a1; a4 == a2; a4 == a3; a4 == a4; a4 == a5; a4 == a6; a4 == a7; a4 == a8;
|
||||
a5 == a1; a5 == a2; a5 == a3; a5 == a4; a5 == a5; a5 == a6; a5 == a7; a5 == a8;
|
||||
a6 == a1; a6 == a2; a6 == a3; a6 == a4; a6 == a5; a6 == a6; a6 == a7; a6 == a8;
|
||||
a7 == a1; a7 == a2; a7 == a3; a7 == a4; a7 == a5; a7 == a6; a7 == a7; a7 == a8;
|
||||
a8 == a1; a8 == a2; a8 == a3; a8 == a4; a8 == a5; a8 == a6; a8 == a7; a8 == a8;
|
||||
|
||||
a1 == a1; a1 == a2; a1 == a3; a1 == a4; a1 == a5; a1 == a6; a1 == a7; a1 == a8;
|
||||
a2 == a1; a2 == a2; a2 == a3; a2 == a4; a2 == a5; a2 == a6; a2 == a7; a2 == a8;
|
||||
a3 == a1; a3 == a2; a3 == a3; a3 == a4; a3 == a5; a3 == a6; a3 == a7; a3 == a8;
|
||||
a4 == a1; a4 == a2; a4 == a3; a4 == a4; a4 == a5; a4 == a6; a4 == a7; a4 == a8;
|
||||
a5 == a1; a5 == a2; a5 == a3; a5 == a4; a5 == a5; a5 == a6; a5 == a7; a5 == a8;
|
||||
a6 == a1; a6 == a2; a6 == a3; a6 == a4; a6 == a5; a6 == a6; a6 == a7; a6 == a8;
|
||||
a7 == a1; a7 == a2; a7 == a3; a7 == a4; a7 == a5; a7 == a6; a7 == a7; a7 == a8;
|
||||
a8 == a1; a8 == a2; a8 == a3; a8 == a4; a8 == a5; a8 == a6; a8 == a7; a8 == a8;
|
||||
|
||||
a1 == a1; a1 == a2; a1 == a3; a1 == a4; a1 == a5; a1 == a6; a1 == a7; a1 == a8;
|
||||
a2 == a1; a2 == a2; a2 == a3; a2 == a4; a2 == a5; a2 == a6; a2 == a7; a2 == a8;
|
||||
a3 == a1; a3 == a2; a3 == a3; a3 == a4; a3 == a5; a3 == a6; a3 == a7; a3 == a8;
|
||||
a4 == a1; a4 == a2; a4 == a3; a4 == a4; a4 == a5; a4 == a6; a4 == a7; a4 == a8;
|
||||
a5 == a1; a5 == a2; a5 == a3; a5 == a4; a5 == a5; a5 == a6; a5 == a7; a5 == a8;
|
||||
a6 == a1; a6 == a2; a6 == a3; a6 == a4; a6 == a5; a6 == a6; a6 == a7; a6 == a8;
|
||||
a7 == a1; a7 == a2; a7 == a3; a7 == a4; a7 == a5; a7 == a6; a7 == a7; a7 == a8;
|
||||
a8 == a1; a8 == a2; a8 == a3; a8 == a4; a8 == a5; a8 == a6; a8 == a7; a8 == a8;
|
||||
|
||||
a1 == a1; a1 == a2; a1 == a3; a1 == a4; a1 == a5; a1 == a6; a1 == a7; a1 == a8;
|
||||
a2 == a1; a2 == a2; a2 == a3; a2 == a4; a2 == a5; a2 == a6; a2 == a7; a2 == a8;
|
||||
a3 == a1; a3 == a2; a3 == a3; a3 == a4; a3 == a5; a3 == a6; a3 == a7; a3 == a8;
|
||||
a4 == a1; a4 == a2; a4 == a3; a4 == a4; a4 == a5; a4 == a6; a4 == a7; a4 == a8;
|
||||
a5 == a1; a5 == a2; a5 == a3; a5 == a4; a5 == a5; a5 == a6; a5 == a7; a5 == a8;
|
||||
a6 == a1; a6 == a2; a6 == a3; a6 == a4; a6 == a5; a6 == a6; a6 == a7; a6 == a8;
|
||||
a7 == a1; a7 == a2; a7 == a3; a7 == a4; a7 == a5; a7 == a6; a7 == a7; a7 == a8;
|
||||
a8 == a1; a8 == a2; a8 == a3; a8 == a4; a8 == a5; a8 == a6; a8 == a7; a8 == a8;
|
||||
|
||||
}
|
||||
|
||||
var elapsed = clock() - start;
|
||||
print "loop";
|
||||
print loopTime;
|
||||
print "elapsed";
|
||||
print elapsed;
|
||||
print "equals";
|
||||
print elapsed - loopTime;
|
||||
29
jlox/lox/src/test/resources/xyz/ctsk/lox/benchmark/trees.lox
Normal file
29
jlox/lox/src/test/resources/xyz/ctsk/lox/benchmark/trees.lox
Normal file
@@ -0,0 +1,29 @@
|
||||
class Tree {
|
||||
init(depth) {
|
||||
this.depth = depth;
|
||||
if (depth > 0) {
|
||||
this.a = Tree(depth - 1);
|
||||
this.b = Tree(depth - 1);
|
||||
this.c = Tree(depth - 1);
|
||||
this.d = Tree(depth - 1);
|
||||
this.e = Tree(depth - 1);
|
||||
}
|
||||
}
|
||||
|
||||
walk() {
|
||||
if (this.depth == 0) return 0;
|
||||
return this.depth
|
||||
+ this.a.walk()
|
||||
+ this.b.walk()
|
||||
+ this.c.walk()
|
||||
+ this.d.walk()
|
||||
+ this.e.walk();
|
||||
}
|
||||
}
|
||||
|
||||
var tree = Tree(8);
|
||||
var start = clock();
|
||||
for (var i = 0; i < 100; i = i + 1) {
|
||||
if (tree.walk() != 122068) print "Error";
|
||||
}
|
||||
print clock() - start;
|
||||
31
jlox/lox/src/test/resources/xyz/ctsk/lox/benchmark/zoo.lox
Normal file
31
jlox/lox/src/test/resources/xyz/ctsk/lox/benchmark/zoo.lox
Normal file
@@ -0,0 +1,31 @@
|
||||
class Zoo {
|
||||
init() {
|
||||
this.aarvark = 1;
|
||||
this.baboon = 1;
|
||||
this.cat = 1;
|
||||
this.donkey = 1;
|
||||
this.elephant = 1;
|
||||
this.fox = 1;
|
||||
}
|
||||
ant() { return this.aarvark; }
|
||||
banana() { return this.baboon; }
|
||||
tuna() { return this.cat; }
|
||||
hay() { return this.donkey; }
|
||||
grass() { return this.elephant; }
|
||||
mouse() { return this.fox; }
|
||||
}
|
||||
|
||||
var zoo = Zoo();
|
||||
var sum = 0;
|
||||
var start = clock();
|
||||
while (sum < 10000000) {
|
||||
sum = sum + zoo.ant()
|
||||
+ zoo.banana()
|
||||
+ zoo.tuna()
|
||||
+ zoo.hay()
|
||||
+ zoo.grass()
|
||||
+ zoo.mouse();
|
||||
}
|
||||
|
||||
print sum;
|
||||
print clock() - start;
|
||||
@@ -0,0 +1,36 @@
|
||||
class Zoo {
|
||||
init() {
|
||||
this.aarvark = 1;
|
||||
this.baboon = 1;
|
||||
this.cat = 1;
|
||||
this.donkey = 1;
|
||||
this.elephant = 1;
|
||||
this.fox = 1;
|
||||
}
|
||||
ant() { return this.aarvark; }
|
||||
banana() { return this.baboon; }
|
||||
tuna() { return this.cat; }
|
||||
hay() { return this.donkey; }
|
||||
grass() { return this.elephant; }
|
||||
mouse() { return this.fox; }
|
||||
}
|
||||
|
||||
var zoo = Zoo();
|
||||
var sum = 0;
|
||||
var start = clock();
|
||||
var batch = 0;
|
||||
while (clock() - start < 10) {
|
||||
for (var i = 0; i < 10000; i = i + 1) {
|
||||
sum = sum + zoo.ant()
|
||||
+ zoo.banana()
|
||||
+ zoo.tuna()
|
||||
+ zoo.hay()
|
||||
+ zoo.grass()
|
||||
+ zoo.mouse();
|
||||
}
|
||||
batch = batch + 1;
|
||||
}
|
||||
|
||||
print sum;
|
||||
print batch;
|
||||
print clock() - start;
|
||||
7
jlox/lox/src/test/resources/xyz/ctsk/lox/block/empty.lox
Normal file
7
jlox/lox/src/test/resources/xyz/ctsk/lox/block/empty.lox
Normal file
@@ -0,0 +1,7 @@
|
||||
{} // By itself.
|
||||
|
||||
// In a statement.
|
||||
if (true) {}
|
||||
if (false) {} else {}
|
||||
|
||||
print "ok"; // expect: ok
|
||||
8
jlox/lox/src/test/resources/xyz/ctsk/lox/block/scope.lox
Normal file
8
jlox/lox/src/test/resources/xyz/ctsk/lox/block/scope.lox
Normal file
@@ -0,0 +1,8 @@
|
||||
var a = "outer";
|
||||
|
||||
{
|
||||
var a = "inner";
|
||||
print a; // expect: inner
|
||||
}
|
||||
|
||||
print a; // expect: outer
|
||||
23
jlox/lox/src/test/resources/xyz/ctsk/lox/bool/equality.lox
Normal file
23
jlox/lox/src/test/resources/xyz/ctsk/lox/bool/equality.lox
Normal file
@@ -0,0 +1,23 @@
|
||||
print true == true; // expect: true
|
||||
print true == false; // expect: false
|
||||
print false == true; // expect: false
|
||||
print false == false; // expect: true
|
||||
|
||||
// Not equal to other types.
|
||||
print true == 1; // expect: false
|
||||
print false == 0; // expect: false
|
||||
print true == "true"; // expect: false
|
||||
print false == "false"; // expect: false
|
||||
print false == ""; // expect: false
|
||||
|
||||
print true != true; // expect: false
|
||||
print true != false; // expect: true
|
||||
print false != true; // expect: true
|
||||
print false != false; // expect: false
|
||||
|
||||
// Not equal to other types.
|
||||
print true != 1; // expect: true
|
||||
print false != 0; // expect: true
|
||||
print true != "true"; // expect: true
|
||||
print false != "false"; // expect: true
|
||||
print false != ""; // expect: true
|
||||
3
jlox/lox/src/test/resources/xyz/ctsk/lox/bool/not.lox
Normal file
3
jlox/lox/src/test/resources/xyz/ctsk/lox/bool/not.lox
Normal file
@@ -0,0 +1,3 @@
|
||||
print !true; // expect: false
|
||||
print !false; // expect: true
|
||||
print !!true; // expect: true
|
||||
1
jlox/lox/src/test/resources/xyz/ctsk/lox/call/bool.lox
Normal file
1
jlox/lox/src/test/resources/xyz/ctsk/lox/call/bool.lox
Normal file
@@ -0,0 +1 @@
|
||||
true(); // expect runtime error: Can only call functions and classes.
|
||||
1
jlox/lox/src/test/resources/xyz/ctsk/lox/call/nil.lox
Normal file
1
jlox/lox/src/test/resources/xyz/ctsk/lox/call/nil.lox
Normal file
@@ -0,0 +1 @@
|
||||
nil(); // expect runtime error: Can only call functions and classes.
|
||||
1
jlox/lox/src/test/resources/xyz/ctsk/lox/call/num.lox
Normal file
1
jlox/lox/src/test/resources/xyz/ctsk/lox/call/num.lox
Normal file
@@ -0,0 +1 @@
|
||||
123(); // expect runtime error: Can only call functions and classes.
|
||||
4
jlox/lox/src/test/resources/xyz/ctsk/lox/call/object.lox
Normal file
4
jlox/lox/src/test/resources/xyz/ctsk/lox/call/object.lox
Normal file
@@ -0,0 +1,4 @@
|
||||
class Foo {}
|
||||
|
||||
var foo = Foo();
|
||||
foo(); // expect runtime error: Can only call functions and classes.
|
||||
1
jlox/lox/src/test/resources/xyz/ctsk/lox/call/string.lox
Normal file
1
jlox/lox/src/test/resources/xyz/ctsk/lox/call/string.lox
Normal file
@@ -0,0 +1 @@
|
||||
"str"(); // expect runtime error: Can only call functions and classes.
|
||||
3
jlox/lox/src/test/resources/xyz/ctsk/lox/class/empty.lox
Normal file
3
jlox/lox/src/test/resources/xyz/ctsk/lox/class/empty.lox
Normal file
@@ -0,0 +1,3 @@
|
||||
class Foo {}
|
||||
|
||||
print Foo; // expect: Foo
|
||||
@@ -0,0 +1 @@
|
||||
class Foo < Foo {} // Error at 'Foo': A class can't inherit from itself.
|
||||
@@ -0,0 +1,22 @@
|
||||
class Foo {
|
||||
inFoo() {
|
||||
print "in foo";
|
||||
}
|
||||
}
|
||||
|
||||
class Bar < Foo {
|
||||
inBar() {
|
||||
print "in bar";
|
||||
}
|
||||
}
|
||||
|
||||
class Baz < Bar {
|
||||
inBaz() {
|
||||
print "in baz";
|
||||
}
|
||||
}
|
||||
|
||||
var baz = Baz();
|
||||
baz.inFoo(); // expect: in foo
|
||||
baz.inBar(); // expect: in bar
|
||||
baz.inBaz(); // expect: in baz
|
||||
@@ -0,0 +1,8 @@
|
||||
class A {}
|
||||
|
||||
fun f() {
|
||||
class B < A {}
|
||||
return B;
|
||||
}
|
||||
|
||||
print f(); // expect: B
|
||||
@@ -0,0 +1,4 @@
|
||||
{
|
||||
class Foo < Foo {} // Error at 'Foo': A class can't inherit from itself.
|
||||
}
|
||||
// [c line 5] Error at end: Expect '}' after block.
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
class Foo {
|
||||
returnSelf() {
|
||||
return Foo;
|
||||
}
|
||||
}
|
||||
|
||||
print Foo().returnSelf(); // expect: Foo
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
class Foo {
|
||||
returnSelf() {
|
||||
return Foo;
|
||||
}
|
||||
}
|
||||
|
||||
print Foo().returnSelf(); // expect: Foo
|
||||
@@ -0,0 +1,27 @@
|
||||
var f;
|
||||
var g;
|
||||
|
||||
{
|
||||
var local = "local";
|
||||
fun f_() {
|
||||
print local;
|
||||
local = "after f";
|
||||
print local;
|
||||
}
|
||||
f = f_;
|
||||
|
||||
fun g_() {
|
||||
print local;
|
||||
local = "after g";
|
||||
print local;
|
||||
}
|
||||
g = g_;
|
||||
}
|
||||
|
||||
f();
|
||||
// expect: local
|
||||
// expect: after f
|
||||
|
||||
g();
|
||||
// expect: after f
|
||||
// expect: after g
|
||||
@@ -0,0 +1,13 @@
|
||||
var a = "global";
|
||||
|
||||
{
|
||||
fun assign() {
|
||||
a = "assigned";
|
||||
}
|
||||
|
||||
var a = "inner";
|
||||
assign();
|
||||
print a; // expect: inner
|
||||
}
|
||||
|
||||
print a; // expect: assigned
|
||||
@@ -0,0 +1,11 @@
|
||||
var f;
|
||||
|
||||
fun foo(param) {
|
||||
fun f_() {
|
||||
print param;
|
||||
}
|
||||
f = f_;
|
||||
}
|
||||
foo("param");
|
||||
|
||||
f(); // expect: param
|
||||
@@ -0,0 +1,15 @@
|
||||
// This is a regression test. There was a bug where if an upvalue for an
|
||||
// earlier local (here "a") was captured *after* a later one ("b"), then it
|
||||
// would crash because it walked to the end of the upvalue list (correct), but
|
||||
// then didn't handle not finding the variable.
|
||||
|
||||
fun f() {
|
||||
var a = "a";
|
||||
var b = "b";
|
||||
fun g() {
|
||||
print b; // expect: b
|
||||
print a; // expect: a
|
||||
}
|
||||
g();
|
||||
}
|
||||
f();
|
||||
@@ -0,0 +1,13 @@
|
||||
var f;
|
||||
|
||||
class Foo {
|
||||
method(param) {
|
||||
fun f_() {
|
||||
print param;
|
||||
}
|
||||
f = f_;
|
||||
}
|
||||
}
|
||||
|
||||
Foo().method("param");
|
||||
f(); // expect: param
|
||||
@@ -0,0 +1,11 @@
|
||||
var f;
|
||||
|
||||
{
|
||||
var local = "local";
|
||||
fun f_() {
|
||||
print local;
|
||||
}
|
||||
f = f_;
|
||||
}
|
||||
|
||||
f(); // expect: local
|
||||
@@ -0,0 +1,25 @@
|
||||
var f;
|
||||
|
||||
fun f1() {
|
||||
var a = "a";
|
||||
fun f2() {
|
||||
var b = "b";
|
||||
fun f3() {
|
||||
var c = "c";
|
||||
fun f4() {
|
||||
print a;
|
||||
print b;
|
||||
print c;
|
||||
}
|
||||
f = f4;
|
||||
}
|
||||
f3();
|
||||
}
|
||||
f2();
|
||||
}
|
||||
f1();
|
||||
|
||||
f();
|
||||
// expect: a
|
||||
// expect: b
|
||||
// expect: c
|
||||
@@ -0,0 +1,7 @@
|
||||
{
|
||||
var local = "local";
|
||||
fun f() {
|
||||
print local; // expect: local
|
||||
}
|
||||
f();
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
var f;
|
||||
|
||||
{
|
||||
var a = "a";
|
||||
fun f_() {
|
||||
print a;
|
||||
print a;
|
||||
}
|
||||
f = f_;
|
||||
}
|
||||
|
||||
f();
|
||||
// expect: a
|
||||
// expect: a
|
||||
@@ -0,0 +1,16 @@
|
||||
{
|
||||
var f;
|
||||
|
||||
{
|
||||
var a = "a";
|
||||
fun f_() { print a; }
|
||||
f = f_;
|
||||
}
|
||||
|
||||
{
|
||||
// Since a is out of scope, the local slot will be reused by b. Make sure
|
||||
// that f still closes over a.
|
||||
var b = "b";
|
||||
f(); // expect: a
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
{
|
||||
var foo = "closure";
|
||||
fun f() {
|
||||
{
|
||||
print foo; // expect: closure
|
||||
var foo = "shadow";
|
||||
print foo; // expect: shadow
|
||||
}
|
||||
print foo; // expect: closure
|
||||
}
|
||||
f();
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
// This is a regression test. There was a bug where the VM would try to close
|
||||
// an upvalue even if the upvalue was never created because the codepath for
|
||||
// the closure was not executed.
|
||||
|
||||
{
|
||||
var a = "a";
|
||||
if (false) {
|
||||
fun foo() { a; }
|
||||
}
|
||||
}
|
||||
|
||||
// If we get here, we didn't segfault when a went out of scope.
|
||||
print "ok"; // expect: ok
|
||||
@@ -0,0 +1,28 @@
|
||||
// This is a regression test. When closing upvalues for discarded locals, it
|
||||
// wouldn't make sure it discarded the upvalue for the correct stack slot.
|
||||
//
|
||||
// Here we create two locals that can be closed over, but only the first one
|
||||
// actually is. When "b" goes out of scope, we need to make sure we don't
|
||||
// prematurely close "a".
|
||||
var closure;
|
||||
|
||||
{
|
||||
var a = "a";
|
||||
|
||||
{
|
||||
var b = "b";
|
||||
fun returnA() {
|
||||
return a;
|
||||
}
|
||||
|
||||
closure = returnA;
|
||||
|
||||
if (false) {
|
||||
fun returnB() {
|
||||
return b;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
print closure(); // expect: a
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
print "ok"; // expect: ok
|
||||
// comment
|
||||
@@ -0,0 +1 @@
|
||||
// comment
|
||||
@@ -0,0 +1 @@
|
||||
// comment
|
||||
@@ -0,0 +1,9 @@
|
||||
// Unicode characters are allowed in comments.
|
||||
//
|
||||
// Latin 1 Supplement: £§¶ÜÞ
|
||||
// Latin Extended-A: ĐĦŋœ
|
||||
// Latin Extended-B: ƂƢƩǁ
|
||||
// Other stuff: ឃᢆ᯽₪ℜ↩⊗┺░
|
||||
// Emoji: ☃☺♣
|
||||
|
||||
print "ok"; // expect: ok
|
||||
@@ -0,0 +1,11 @@
|
||||
class Foo {
|
||||
init(a, b) {
|
||||
print "init"; // expect: init
|
||||
this.a = a;
|
||||
this.b = b;
|
||||
}
|
||||
}
|
||||
|
||||
var foo = Foo(1, 2);
|
||||
print foo.a; // expect: 1
|
||||
print foo.b; // expect: 2
|
||||
@@ -0,0 +1,11 @@
|
||||
class Foo {
|
||||
init() {
|
||||
print "init";
|
||||
return;
|
||||
print "nope";
|
||||
}
|
||||
}
|
||||
|
||||
var foo = Foo(); // expect: init
|
||||
print foo.init(); // expect: init
|
||||
// expect: Foo instance
|
||||
@@ -0,0 +1,15 @@
|
||||
class Foo {
|
||||
init(arg) {
|
||||
print "Foo.init(" + arg + ")";
|
||||
this.field = "init";
|
||||
}
|
||||
}
|
||||
|
||||
var foo = Foo("one"); // expect: Foo.init(one)
|
||||
foo.field = "field";
|
||||
|
||||
var foo2 = foo.init("two"); // expect: Foo.init(two)
|
||||
print foo2; // expect: Foo instance
|
||||
|
||||
// Make sure init() doesn't create a fresh instance.
|
||||
print foo.field; // expect: init
|
||||
@@ -0,0 +1,4 @@
|
||||
class Foo {}
|
||||
|
||||
var foo = Foo();
|
||||
print foo; // expect: Foo instance
|
||||
@@ -0,0 +1,3 @@
|
||||
class Foo {}
|
||||
|
||||
var foo = Foo(1, 2, 3); // expect runtime error: Expected 0 arguments but got 3.
|
||||
@@ -0,0 +1,10 @@
|
||||
class Foo {
|
||||
init() {
|
||||
print "init";
|
||||
return;
|
||||
print "nope";
|
||||
}
|
||||
}
|
||||
|
||||
var foo = Foo(); // expect: init
|
||||
print foo; // expect: Foo instance
|
||||
@@ -0,0 +1,8 @@
|
||||
class Foo {
|
||||
init(a, b) {
|
||||
this.a = a;
|
||||
this.b = b;
|
||||
}
|
||||
}
|
||||
|
||||
var foo = Foo(1, 2, 3, 4); // expect runtime error: Expected 2 arguments but got 4.
|
||||
@@ -0,0 +1,12 @@
|
||||
class Foo {
|
||||
init(arg) {
|
||||
print "Foo.init(" + arg + ")";
|
||||
this.field = "init";
|
||||
}
|
||||
}
|
||||
|
||||
fun init() {
|
||||
print "not initializer";
|
||||
}
|
||||
|
||||
init(); // expect: not initializer
|
||||
@@ -0,0 +1,5 @@
|
||||
class Foo {
|
||||
init(a, b) {}
|
||||
}
|
||||
|
||||
var foo = Foo(1); // expect runtime error: Expected 2 arguments but got 1.
|
||||
@@ -0,0 +1,10 @@
|
||||
class Foo {
|
||||
init() {
|
||||
fun init() {
|
||||
return "bar";
|
||||
}
|
||||
print init(); // expect: bar
|
||||
}
|
||||
}
|
||||
|
||||
print Foo(); // expect: Foo instance
|
||||
@@ -0,0 +1,5 @@
|
||||
class Foo {
|
||||
init() {
|
||||
return "result"; // Error at 'return': Can't return a value from an initializer.
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
// Note: This is just for the expression evaluating chapter which evaluates an
|
||||
// expression directly.
|
||||
(5 - (3 - 1)) + -1
|
||||
// expect: 2
|
||||
@@ -0,0 +1,3 @@
|
||||
// Note: This is just for the expression parsing chapter which prints the AST.
|
||||
(5 - (3 - 1)) + -1
|
||||
// expect: (+ (group (- 5.0 (group (- 3.0 1.0)))) (- 1.0))
|
||||
@@ -0,0 +1,15 @@
|
||||
class Foo {}
|
||||
|
||||
fun bar(a, b) {
|
||||
print "bar";
|
||||
print a;
|
||||
print b;
|
||||
}
|
||||
|
||||
var foo = Foo();
|
||||
foo.bar = bar;
|
||||
|
||||
foo.bar(1, 2);
|
||||
// expect: bar
|
||||
// expect: 1
|
||||
// expect: 2
|
||||
@@ -0,0 +1,6 @@
|
||||
class Foo {}
|
||||
|
||||
var foo = Foo();
|
||||
foo.bar = "not fn";
|
||||
|
||||
foo.bar(); // expect runtime error: Can only call functions and classes.
|
||||
@@ -0,0 +1,25 @@
|
||||
// Bound methods have identity equality.
|
||||
class Foo {
|
||||
method(a) {
|
||||
print "method";
|
||||
print a;
|
||||
}
|
||||
other(a) {
|
||||
print "other";
|
||||
print a;
|
||||
}
|
||||
}
|
||||
|
||||
var foo = Foo();
|
||||
var method = foo.method;
|
||||
|
||||
// Setting a property shadows the instance method.
|
||||
foo.method = foo.other;
|
||||
foo.method(1);
|
||||
// expect: other
|
||||
// expect: 1
|
||||
|
||||
// The old method handle still points to the original method.
|
||||
method(2);
|
||||
// expect: method
|
||||
// expect: 2
|
||||
@@ -0,0 +1 @@
|
||||
true.foo; // expect runtime error: Only instances have properties.
|
||||
@@ -0,0 +1,2 @@
|
||||
class Foo {}
|
||||
Foo.bar; // expect runtime error: Only instances have properties.
|
||||
@@ -0,0 +1,3 @@
|
||||
fun foo() {}
|
||||
|
||||
foo.bar; // expect runtime error: Only instances have properties.
|
||||
@@ -0,0 +1 @@
|
||||
nil.foo; // expect runtime error: Only instances have properties.
|
||||
@@ -0,0 +1 @@
|
||||
123.foo; // expect runtime error: Only instances have properties.
|
||||
@@ -0,0 +1 @@
|
||||
"str".foo; // expect runtime error: Only instances have properties.
|
||||
170
jlox/lox/src/test/resources/xyz/ctsk/lox/field/many.lox
Normal file
170
jlox/lox/src/test/resources/xyz/ctsk/lox/field/many.lox
Normal file
@@ -0,0 +1,170 @@
|
||||
class Foo {}
|
||||
|
||||
var foo = Foo();
|
||||
fun setFields() {
|
||||
foo.bilberry = "bilberry";
|
||||
foo.lime = "lime";
|
||||
foo.elderberry = "elderberry";
|
||||
foo.raspberry = "raspberry";
|
||||
foo.gooseberry = "gooseberry";
|
||||
foo.longan = "longan";
|
||||
foo.mandarine = "mandarine";
|
||||
foo.kiwifruit = "kiwifruit";
|
||||
foo.orange = "orange";
|
||||
foo.pomegranate = "pomegranate";
|
||||
foo.tomato = "tomato";
|
||||
foo.banana = "banana";
|
||||
foo.juniper = "juniper";
|
||||
foo.damson = "damson";
|
||||
foo.blackcurrant = "blackcurrant";
|
||||
foo.peach = "peach";
|
||||
foo.grape = "grape";
|
||||
foo.mango = "mango";
|
||||
foo.redcurrant = "redcurrant";
|
||||
foo.watermelon = "watermelon";
|
||||
foo.plumcot = "plumcot";
|
||||
foo.papaya = "papaya";
|
||||
foo.cloudberry = "cloudberry";
|
||||
foo.rambutan = "rambutan";
|
||||
foo.salak = "salak";
|
||||
foo.physalis = "physalis";
|
||||
foo.huckleberry = "huckleberry";
|
||||
foo.coconut = "coconut";
|
||||
foo.date = "date";
|
||||
foo.tamarind = "tamarind";
|
||||
foo.lychee = "lychee";
|
||||
foo.raisin = "raisin";
|
||||
foo.apple = "apple";
|
||||
foo.avocado = "avocado";
|
||||
foo.nectarine = "nectarine";
|
||||
foo.pomelo = "pomelo";
|
||||
foo.melon = "melon";
|
||||
foo.currant = "currant";
|
||||
foo.plum = "plum";
|
||||
foo.persimmon = "persimmon";
|
||||
foo.olive = "olive";
|
||||
foo.cranberry = "cranberry";
|
||||
foo.boysenberry = "boysenberry";
|
||||
foo.blackberry = "blackberry";
|
||||
foo.passionfruit = "passionfruit";
|
||||
foo.mulberry = "mulberry";
|
||||
foo.marionberry = "marionberry";
|
||||
foo.plantain = "plantain";
|
||||
foo.lemon = "lemon";
|
||||
foo.yuzu = "yuzu";
|
||||
foo.loquat = "loquat";
|
||||
foo.kumquat = "kumquat";
|
||||
foo.salmonberry = "salmonberry";
|
||||
foo.tangerine = "tangerine";
|
||||
foo.durian = "durian";
|
||||
foo.pear = "pear";
|
||||
foo.cantaloupe = "cantaloupe";
|
||||
foo.quince = "quince";
|
||||
foo.guava = "guava";
|
||||
foo.strawberry = "strawberry";
|
||||
foo.nance = "nance";
|
||||
foo.apricot = "apricot";
|
||||
foo.jambul = "jambul";
|
||||
foo.grapefruit = "grapefruit";
|
||||
foo.clementine = "clementine";
|
||||
foo.jujube = "jujube";
|
||||
foo.cherry = "cherry";
|
||||
foo.feijoa = "feijoa";
|
||||
foo.jackfruit = "jackfruit";
|
||||
foo.fig = "fig";
|
||||
foo.cherimoya = "cherimoya";
|
||||
foo.pineapple = "pineapple";
|
||||
foo.blueberry = "blueberry";
|
||||
foo.jabuticaba = "jabuticaba";
|
||||
foo.miracle = "miracle";
|
||||
foo.dragonfruit = "dragonfruit";
|
||||
foo.satsuma = "satsuma";
|
||||
foo.tamarillo = "tamarillo";
|
||||
foo.honeydew = "honeydew";
|
||||
}
|
||||
|
||||
setFields();
|
||||
|
||||
fun printFields() {
|
||||
print foo.apple; // expect: apple
|
||||
print foo.apricot; // expect: apricot
|
||||
print foo.avocado; // expect: avocado
|
||||
print foo.banana; // expect: banana
|
||||
print foo.bilberry; // expect: bilberry
|
||||
print foo.blackberry; // expect: blackberry
|
||||
print foo.blackcurrant; // expect: blackcurrant
|
||||
print foo.blueberry; // expect: blueberry
|
||||
print foo.boysenberry; // expect: boysenberry
|
||||
print foo.cantaloupe; // expect: cantaloupe
|
||||
print foo.cherimoya; // expect: cherimoya
|
||||
print foo.cherry; // expect: cherry
|
||||
print foo.clementine; // expect: clementine
|
||||
print foo.cloudberry; // expect: cloudberry
|
||||
print foo.coconut; // expect: coconut
|
||||
print foo.cranberry; // expect: cranberry
|
||||
print foo.currant; // expect: currant
|
||||
print foo.damson; // expect: damson
|
||||
print foo.date; // expect: date
|
||||
print foo.dragonfruit; // expect: dragonfruit
|
||||
print foo.durian; // expect: durian
|
||||
print foo.elderberry; // expect: elderberry
|
||||
print foo.feijoa; // expect: feijoa
|
||||
print foo.fig; // expect: fig
|
||||
print foo.gooseberry; // expect: gooseberry
|
||||
print foo.grape; // expect: grape
|
||||
print foo.grapefruit; // expect: grapefruit
|
||||
print foo.guava; // expect: guava
|
||||
print foo.honeydew; // expect: honeydew
|
||||
print foo.huckleberry; // expect: huckleberry
|
||||
print foo.jabuticaba; // expect: jabuticaba
|
||||
print foo.jackfruit; // expect: jackfruit
|
||||
print foo.jambul; // expect: jambul
|
||||
print foo.jujube; // expect: jujube
|
||||
print foo.juniper; // expect: juniper
|
||||
print foo.kiwifruit; // expect: kiwifruit
|
||||
print foo.kumquat; // expect: kumquat
|
||||
print foo.lemon; // expect: lemon
|
||||
print foo.lime; // expect: lime
|
||||
print foo.longan; // expect: longan
|
||||
print foo.loquat; // expect: loquat
|
||||
print foo.lychee; // expect: lychee
|
||||
print foo.mandarine; // expect: mandarine
|
||||
print foo.mango; // expect: mango
|
||||
print foo.marionberry; // expect: marionberry
|
||||
print foo.melon; // expect: melon
|
||||
print foo.miracle; // expect: miracle
|
||||
print foo.mulberry; // expect: mulberry
|
||||
print foo.nance; // expect: nance
|
||||
print foo.nectarine; // expect: nectarine
|
||||
print foo.olive; // expect: olive
|
||||
print foo.orange; // expect: orange
|
||||
print foo.papaya; // expect: papaya
|
||||
print foo.passionfruit; // expect: passionfruit
|
||||
print foo.peach; // expect: peach
|
||||
print foo.pear; // expect: pear
|
||||
print foo.persimmon; // expect: persimmon
|
||||
print foo.physalis; // expect: physalis
|
||||
print foo.pineapple; // expect: pineapple
|
||||
print foo.plantain; // expect: plantain
|
||||
print foo.plum; // expect: plum
|
||||
print foo.plumcot; // expect: plumcot
|
||||
print foo.pomegranate; // expect: pomegranate
|
||||
print foo.pomelo; // expect: pomelo
|
||||
print foo.quince; // expect: quince
|
||||
print foo.raisin; // expect: raisin
|
||||
print foo.rambutan; // expect: rambutan
|
||||
print foo.raspberry; // expect: raspberry
|
||||
print foo.redcurrant; // expect: redcurrant
|
||||
print foo.salak; // expect: salak
|
||||
print foo.salmonberry; // expect: salmonberry
|
||||
print foo.satsuma; // expect: satsuma
|
||||
print foo.strawberry; // expect: strawberry
|
||||
print foo.tamarillo; // expect: tamarillo
|
||||
print foo.tamarind; // expect: tamarind
|
||||
print foo.tangerine; // expect: tangerine
|
||||
print foo.tomato; // expect: tomato
|
||||
print foo.watermelon; // expect: watermelon
|
||||
print foo.yuzu; // expect: yuzu
|
||||
}
|
||||
|
||||
printFields();
|
||||
@@ -0,0 +1,9 @@
|
||||
class Foo {
|
||||
bar(arg) {
|
||||
print arg;
|
||||
}
|
||||
}
|
||||
|
||||
var bar = Foo().bar;
|
||||
print "got method"; // expect: got method
|
||||
bar("arg"); // expect: arg
|
||||
@@ -0,0 +1,19 @@
|
||||
class Foo {
|
||||
sayName(a) {
|
||||
print this.name;
|
||||
print a;
|
||||
}
|
||||
}
|
||||
|
||||
var foo1 = Foo();
|
||||
foo1.name = "foo1";
|
||||
|
||||
var foo2 = Foo();
|
||||
foo2.name = "foo2";
|
||||
|
||||
// Store the method reference on another object.
|
||||
foo2.fn = foo1.sayName;
|
||||
// Still retains original receiver.
|
||||
foo2.fn(1);
|
||||
// expect: foo1
|
||||
// expect: 1
|
||||
@@ -0,0 +1,9 @@
|
||||
class Foo {}
|
||||
|
||||
var foo = Foo();
|
||||
|
||||
print foo.bar = "bar value"; // expect: bar value
|
||||
print foo.baz = "baz value"; // expect: baz value
|
||||
|
||||
print foo.bar; // expect: bar value
|
||||
print foo.baz; // expect: baz value
|
||||
@@ -0,0 +1,2 @@
|
||||
undefined1.bar // expect runtime error: Undefined variable 'undefined1'.
|
||||
= undefined2;
|
||||
@@ -0,0 +1 @@
|
||||
true.foo = "value"; // expect runtime error: Only instances have fields.
|
||||
@@ -0,0 +1,2 @@
|
||||
class Foo {}
|
||||
Foo.bar = "value"; // expect runtime error: Only instances have fields.
|
||||
@@ -0,0 +1,3 @@
|
||||
fun foo() {}
|
||||
|
||||
foo.bar = "value"; // expect runtime error: Only instances have fields.
|
||||
@@ -0,0 +1 @@
|
||||
nil.foo = "value"; // expect runtime error: Only instances have fields.
|
||||
@@ -0,0 +1 @@
|
||||
123.foo = "value"; // expect runtime error: Only instances have fields.
|
||||
@@ -0,0 +1 @@
|
||||
"str".foo = "value"; // expect runtime error: Only instances have fields.
|
||||
@@ -0,0 +1,4 @@
|
||||
class Foo {}
|
||||
var foo = Foo();
|
||||
|
||||
foo.bar; // expect runtime error: Undefined property 'bar'.
|
||||
@@ -0,0 +1,2 @@
|
||||
// [line 2] Error at 'class': Expect expression.
|
||||
for (;;) class Foo {}
|
||||
@@ -0,0 +1,22 @@
|
||||
var f1;
|
||||
var f2;
|
||||
var f3;
|
||||
|
||||
for (var i = 1; i < 4; i = i + 1) {
|
||||
var j = i;
|
||||
fun f() {
|
||||
print i;
|
||||
print j;
|
||||
}
|
||||
|
||||
if (j == 1) f1 = f;
|
||||
else if (j == 2) f2 = f;
|
||||
else f3 = f;
|
||||
}
|
||||
|
||||
f1(); // expect: 4
|
||||
// expect: 1
|
||||
f2(); // expect: 4
|
||||
// expect: 2
|
||||
f3(); // expect: 4
|
||||
// expect: 3
|
||||
@@ -0,0 +1,2 @@
|
||||
// [line 2] Error at 'fun': Expect expression.
|
||||
for (;;) fun foo() {}
|
||||
@@ -0,0 +1,10 @@
|
||||
fun f() {
|
||||
for (;;) {
|
||||
var i = "i";
|
||||
fun g() { print i; }
|
||||
return g;
|
||||
}
|
||||
}
|
||||
|
||||
var h = f();
|
||||
h(); // expect: i
|
||||
@@ -0,0 +1,9 @@
|
||||
fun f() {
|
||||
for (;;) {
|
||||
var i = "i";
|
||||
return i;
|
||||
}
|
||||
}
|
||||
|
||||
print f();
|
||||
// expect: i
|
||||
26
jlox/lox/src/test/resources/xyz/ctsk/lox/for/scope.lox
Normal file
26
jlox/lox/src/test/resources/xyz/ctsk/lox/for/scope.lox
Normal file
@@ -0,0 +1,26 @@
|
||||
{
|
||||
var i = "before";
|
||||
|
||||
// New variable is in inner scope.
|
||||
for (var i = 0; i < 1; i = i + 1) {
|
||||
print i; // expect: 0
|
||||
|
||||
// Loop body is in second inner scope.
|
||||
var i = -1;
|
||||
print i; // expect: -1
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
// New variable shadows outer variable.
|
||||
for (var i = 0; i > 0; i = i + 1) {}
|
||||
|
||||
// Goes out of scope after loop.
|
||||
var i = "after";
|
||||
print i; // expect: after
|
||||
|
||||
// Can reuse an existing variable.
|
||||
for (i = 0; i < 1; i = i + 1) {
|
||||
print i; // expect: 0
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
// [line 3] Error at '{': Expect expression.
|
||||
// [line 3] Error at ')': Expect ';' after expression.
|
||||
for (var a = 1; {}; a = a + 1) {}
|
||||
@@ -0,0 +1,2 @@
|
||||
// [line 2] Error at '{': Expect expression.
|
||||
for (var a = 1; a < 2; {}) {}
|
||||
@@ -0,0 +1,3 @@
|
||||
// [line 3] Error at '{': Expect expression.
|
||||
// [line 3] Error at ')': Expect ';' after expression.
|
||||
for ({}; a < 2; a = a + 1) {}
|
||||
50
jlox/lox/src/test/resources/xyz/ctsk/lox/for/syntax.lox
Normal file
50
jlox/lox/src/test/resources/xyz/ctsk/lox/for/syntax.lox
Normal file
@@ -0,0 +1,50 @@
|
||||
// Single-expression body.
|
||||
for (var c = 0; c < 3;) print c = c + 1;
|
||||
// expect: 1
|
||||
// expect: 2
|
||||
// expect: 3
|
||||
|
||||
// Block body.
|
||||
for (var a = 0; a < 3; a = a + 1) {
|
||||
print a;
|
||||
}
|
||||
// expect: 0
|
||||
// expect: 1
|
||||
// expect: 2
|
||||
|
||||
// No clauses.
|
||||
fun foo() {
|
||||
for (;;) return "done";
|
||||
}
|
||||
print foo(); // expect: done
|
||||
|
||||
// No variable.
|
||||
var i = 0;
|
||||
for (; i < 2; i = i + 1) print i;
|
||||
// expect: 0
|
||||
// expect: 1
|
||||
|
||||
// No condition.
|
||||
fun bar() {
|
||||
for (var i = 0;; i = i + 1) {
|
||||
print i;
|
||||
if (i >= 2) return;
|
||||
}
|
||||
}
|
||||
bar();
|
||||
// expect: 0
|
||||
// expect: 1
|
||||
// expect: 2
|
||||
|
||||
// No increment.
|
||||
for (var i = 0; i < 2;) {
|
||||
print i;
|
||||
i = i + 1;
|
||||
}
|
||||
// expect: 0
|
||||
// expect: 1
|
||||
|
||||
// Statement bodies.
|
||||
for (; false;) if (true) 1; else 2;
|
||||
for (; false;) while (true) 1;
|
||||
for (; false;) for (;;) 1;
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user