mirror of
https://github.com/aNNiMON/Own-Programming-Language-Tutorial.git
synced 2024-09-20 00:34:20 +03:00
Юнит-тесты для программ
This commit is contained in:
parent
51c6439f2b
commit
66bf40bfbc
101
test/com/annimon/ownlang/parser/ProgramsTest.java
Normal file
101
test/com/annimon/ownlang/parser/ProgramsTest.java
Normal file
@ -0,0 +1,101 @@
|
||||
package com.annimon.ownlang.parser;
|
||||
|
||||
import com.annimon.ownlang.lib.Functions;
|
||||
import com.annimon.ownlang.lib.NumberValue;
|
||||
import com.annimon.ownlang.lib.Variables;
|
||||
import com.annimon.ownlang.parser.ast.FunctionDefineStatement;
|
||||
import com.annimon.ownlang.parser.ast.Statement;
|
||||
import com.annimon.ownlang.parser.ast.Visitor;
|
||||
import com.annimon.ownlang.parser.visitors.AbstractVisitor;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
import org.junit.Assert;
|
||||
import static org.junit.Assert.*;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.junit.runners.Parameterized;
|
||||
import org.junit.runners.Parameterized.Parameters;
|
||||
|
||||
@RunWith(value = Parameterized.class)
|
||||
public class ProgramsTest {
|
||||
|
||||
private static final String RES_DIR = "test/resources";
|
||||
|
||||
private final String programPath;
|
||||
|
||||
public ProgramsTest(String programPath) {
|
||||
this.programPath = programPath;
|
||||
}
|
||||
|
||||
@Parameters(name = "{index}: {0}")
|
||||
public static Collection<String> data() {
|
||||
final File resDir = new File(RES_DIR);
|
||||
return scanDirectory(resDir)
|
||||
.map(f -> f.getPath())
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
private static Stream<File> scanDirectory(File dir) {
|
||||
return Arrays.stream(dir.listFiles())
|
||||
.flatMap(file -> {
|
||||
if (file.isDirectory()) {
|
||||
return scanDirectory(file);
|
||||
}
|
||||
return Stream.of(file);
|
||||
})
|
||||
.filter(f -> f.getName().endsWith(".own"));
|
||||
}
|
||||
|
||||
@Before
|
||||
public void initialize() {
|
||||
Variables.clear();
|
||||
Functions.getFunctions().clear();
|
||||
// Let's mock junit methods as ounit functions
|
||||
Functions.set("assertEquals", (args) -> {
|
||||
assertEquals(args[0], args[1]);
|
||||
return NumberValue.ONE;
|
||||
});
|
||||
Functions.set("assertNotEquals", (args) -> {
|
||||
assertNotEquals(args[0], args[1]);
|
||||
return NumberValue.ONE;
|
||||
});
|
||||
Functions.set("assertSameType", (args) -> {
|
||||
assertEquals(args[0].type(), args[1].type());
|
||||
return NumberValue.ONE;
|
||||
});
|
||||
Functions.set("assertTrue", (args) -> {
|
||||
assertTrue(args[0].asInt() != 0);
|
||||
return NumberValue.ONE;
|
||||
});
|
||||
Functions.set("assertFalse", (args) -> {
|
||||
assertFalse(args[0].asInt() == 0);
|
||||
return NumberValue.ONE;
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testProgram() throws IOException {
|
||||
final String source = SourceLoader.readSource(programPath);
|
||||
final Statement s = Parser.parse(Lexer.tokenize(source));
|
||||
try {
|
||||
s.execute();
|
||||
s.accept(testFunctionsExecutor);
|
||||
} catch (Exception oae) {
|
||||
Assert.fail(oae.toString());
|
||||
}
|
||||
}
|
||||
|
||||
private static Visitor testFunctionsExecutor = new AbstractVisitor() {
|
||||
@Override
|
||||
public void visit(FunctionDefineStatement s) {
|
||||
if (s.name.startsWith("test")) {
|
||||
Functions.get(s.name).execute();
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
30
test/resources/expressions/assignmentExpression.own
Normal file
30
test/resources/expressions/assignmentExpression.own
Normal file
@ -0,0 +1,30 @@
|
||||
def testSimpleAssignment() {
|
||||
a = 8
|
||||
b = "str"
|
||||
assertEquals(8, a)
|
||||
assertEquals("str", b)
|
||||
}
|
||||
|
||||
def testPrefixIncrement() {
|
||||
a = 8
|
||||
assertEquals(9, ++a)
|
||||
assertEquals(9, a)
|
||||
}
|
||||
|
||||
def testPostfixIncrement() {
|
||||
a = 8
|
||||
assertEquals(8, a++)
|
||||
assertEquals(9, a)
|
||||
}
|
||||
|
||||
def testPrefixDecrement() {
|
||||
a = 8
|
||||
assertEquals(7, --a)
|
||||
assertEquals(7, a)
|
||||
}
|
||||
|
||||
def testPostfixDecrement() {
|
||||
a = 8
|
||||
assertEquals(8, a--)
|
||||
assertEquals(7, a)
|
||||
}
|
37
test/resources/expressions/binaryExpressionOnNumbers.own
Normal file
37
test/resources/expressions/binaryExpressionOnNumbers.own
Normal file
@ -0,0 +1,37 @@
|
||||
def testAdditionOnNumbers() {
|
||||
assertEquals(4, 2 + 2)
|
||||
assertEquals(6, 0 + 1 + 2 + 3)
|
||||
}
|
||||
|
||||
def testSubtractionOnNumbers() {
|
||||
assertEquals(0, 2 - 2)
|
||||
assertEquals(-6, 0 - 1 - 2 - 3)
|
||||
assertEquals(110, 100 - (20 - 30))
|
||||
}
|
||||
|
||||
def testMultiplicationOnNumbers() {
|
||||
assertEquals(4, 2 * 2)
|
||||
assertEquals(30, 5 * (-2 * -3))
|
||||
}
|
||||
|
||||
def testDivisionOnNumbers() {
|
||||
assertEquals(3, 6 / 2)
|
||||
assertEquals(30, -900 / (60 / -2))
|
||||
}
|
||||
|
||||
def testRemainder() {
|
||||
assertEquals(2, 10 % 4)
|
||||
assertEquals(5, 15 % (40 % 30))
|
||||
}
|
||||
|
||||
def testAND() {
|
||||
assertEquals(0x04, 0x04 & 0x0F)
|
||||
assertEquals(0x00, 0x04 & 0x08)
|
||||
assertEquals(8, 12 & 9)
|
||||
}
|
||||
|
||||
def testOR() {
|
||||
assertEquals(12, 4 | 8)
|
||||
assertEquals(0x0F, 3 | 12)
|
||||
assertEquals(0x0E, 10 | 4)
|
||||
}
|
8
test/resources/expressions/binaryExpressionOnStrings.own
Normal file
8
test/resources/expressions/binaryExpressionOnStrings.own
Normal file
@ -0,0 +1,8 @@
|
||||
def testStringConcatenation() {
|
||||
assertEquals("22", "2" + "2")
|
||||
assertEquals("22", "2" + 2)
|
||||
}
|
||||
|
||||
def testStringMultiplication() {
|
||||
assertEquals("******", "*" * 6)
|
||||
}
|
27
test/resources/expressions/binaryUnaryExpr.own
Normal file
27
test/resources/expressions/binaryUnaryExpr.own
Normal file
@ -0,0 +1,27 @@
|
||||
def testAdditionOnNumbers() {
|
||||
assertEquals(6, 0 + 1 + 2 + 3)
|
||||
}
|
||||
|
||||
def testSubtractionOnNumbers() {
|
||||
assertEquals(-6, 0 - 1 - 2 - 3)
|
||||
}
|
||||
|
||||
def testPrefixIncrement() {
|
||||
a = 8
|
||||
assertEquals(9, ++a)
|
||||
assertEquals(9, a)
|
||||
}
|
||||
|
||||
def testPostfixIncrement() {
|
||||
a = 8
|
||||
assertEquals(8, a++)
|
||||
assertEquals(9, a)
|
||||
}
|
||||
|
||||
def testStringReversing() {
|
||||
assertEquals("tset", -"test")
|
||||
}
|
||||
|
||||
def testStringMultiplication() {
|
||||
assertEquals("******", "*" * 6)
|
||||
}
|
6
test/resources/expressions/functionReference.own
Normal file
6
test/resources/expressions/functionReference.own
Normal file
@ -0,0 +1,6 @@
|
||||
def func() = "function"
|
||||
var = def() = "variable"
|
||||
def consumer(x) = x();
|
||||
|
||||
assertEquals("function", consumer(::func))
|
||||
assertEquals("variable", consumer(var))
|
3
test/resources/expressions/unaryExpressionOnStrings.own
Normal file
3
test/resources/expressions/unaryExpressionOnStrings.own
Normal file
@ -0,0 +1,3 @@
|
||||
def testStringReversing() {
|
||||
assertEquals("tset", -"test")
|
||||
}
|
5
test/resources/expressions/varFuncSameName.own
Normal file
5
test/resources/expressions/varFuncSameName.own
Normal file
@ -0,0 +1,5 @@
|
||||
def function() = "function"
|
||||
function = "variable"
|
||||
|
||||
assertEquals("variable", function)
|
||||
assertEquals("function", function())
|
7
test/resources/modules/date/compareDates.own
Normal file
7
test/resources/modules/date/compareDates.own
Normal file
@ -0,0 +1,7 @@
|
||||
use "date"
|
||||
|
||||
def testCompareDates() {
|
||||
assertTrue(newDate(2016, 04, 10) > newDate(2015, 03, 11))
|
||||
assertTrue(newDate(2012, 04, 10) < newDate(2015, 03, 11))
|
||||
assertTrue(newDate(2015, 03, 11, 0, 0, 0) == newDate(2015, 03, 11))
|
||||
}
|
6
test/resources/modules/date/dateFormat.own
Normal file
6
test/resources/modules/date/dateFormat.own
Normal file
@ -0,0 +1,6 @@
|
||||
use "date"
|
||||
|
||||
def testDateFormat() {
|
||||
d = formatDate(newDate(2016, 04, 10), newFormat("yyyy/MM/dd HH:mm:ss"))
|
||||
assertEquals("2016/05/10 00:00:00", d)
|
||||
}
|
9
test/resources/modules/date/dateParse.own
Normal file
9
test/resources/modules/date/dateParse.own
Normal file
@ -0,0 +1,9 @@
|
||||
use "date"
|
||||
|
||||
def testDateParse() {
|
||||
d = parseDate("2016/05/10", newFormat("yyyy/MM/dd"))
|
||||
assertEquals(2016, d.year)
|
||||
assertEquals(4, d.month)
|
||||
assertEquals(10, d.day)
|
||||
assertEquals(0, d.hour)
|
||||
}
|
12
test/resources/modules/date/newDate.own
Normal file
12
test/resources/modules/date/newDate.own
Normal file
@ -0,0 +1,12 @@
|
||||
use "date"
|
||||
|
||||
def testNewDate() {
|
||||
d = newDate(2016, 04, 10)
|
||||
assertEquals(2016, d.year)
|
||||
assertEquals(4, d.month)
|
||||
assertEquals(10, d.day)
|
||||
assertEquals(0, d.hour)
|
||||
assertEquals(0, d.minute)
|
||||
assertEquals(0, d.second)
|
||||
assertEquals(0, d.millisecond)
|
||||
}
|
28
test/resources/modules/files/files.own
Normal file
28
test/resources/modules/files/files.own
Normal file
@ -0,0 +1,28 @@
|
||||
use "files"
|
||||
use "types"
|
||||
|
||||
def testFiles() {
|
||||
// writeLong
|
||||
f = fopen("test.file", "wb")
|
||||
writeLong(f, 1002003004005006007)
|
||||
flush(f)
|
||||
fclose(f)
|
||||
|
||||
// append & writeFloat
|
||||
fpNumber = 100200.3004005006007
|
||||
f = fopen("test.file", "wb+")
|
||||
writeFloat(f, fpNumber)
|
||||
flush(f)
|
||||
fclose(f)
|
||||
|
||||
f = fopen("test.file", "rb")
|
||||
assertEquals(1002003004005006007, readLong(f))
|
||||
assertEquals(float(fpNumber), readFloat(f))
|
||||
assertEquals(-1, readInt(f)) // EOF
|
||||
assertEquals(0, FILES_COMPARATOR(f, f))
|
||||
fclose(f)
|
||||
|
||||
f = fopen("test.file", "i")
|
||||
delete(f)
|
||||
fclose(f)
|
||||
}
|
11
test/resources/modules/functional/chain.own
Normal file
11
test/resources/modules/functional/chain.own
Normal file
@ -0,0 +1,11 @@
|
||||
use "functional"
|
||||
|
||||
def testFunctionalChain() {
|
||||
data = [1,2,3,4,5,6,7]
|
||||
result = chain(data,
|
||||
::filter, def(x) = x <= 4,
|
||||
::sortby, def(x) = -x,
|
||||
::map, def(x) = x * 2,
|
||||
)
|
||||
assertEquals([8,6,4,2], result)
|
||||
}
|
8
test/resources/other/recursion.own
Normal file
8
test/resources/other/recursion.own
Normal file
@ -0,0 +1,8 @@
|
||||
def testFibonacci() {
|
||||
def fib(n) {
|
||||
if n < 2 return n
|
||||
return fib(n-2) + fib(n-1)
|
||||
}
|
||||
assertEquals(3, fib(4))
|
||||
assertEquals(21, fib(8))
|
||||
}
|
10
test/resources/other/scope.own
Normal file
10
test/resources/other/scope.own
Normal file
@ -0,0 +1,10 @@
|
||||
def testScope() {
|
||||
x = 5
|
||||
def func() {
|
||||
assertEquals(5, x)
|
||||
x += 10
|
||||
assertEquals(15, x)
|
||||
}
|
||||
func();
|
||||
assertEquals(15, x)
|
||||
}
|
3
test/resources/other/types.own
Normal file
3
test/resources/other/types.own
Normal file
@ -0,0 +1,3 @@
|
||||
def testTypes() {
|
||||
assertSameType(0, 0.0)
|
||||
}
|
Loading…
Reference in New Issue
Block a user