z80-tools/src-tests/nl/grauw/glass/expressions/ExpressionTest.java

278 wiersze
6.4 KiB
Java

package nl.grauw.glass.expressions;
import static org.junit.Assert.*;
import java.io.LineNumberReader;
import java.io.StringReader;
import nl.grauw.glass.Line;
import nl.grauw.glass.Parser;
import nl.grauw.glass.Scope;
import nl.grauw.glass.expressions.ExpressionBuilder.ExpressionError;
import org.junit.Test;
public class ExpressionTest {
@Test
public void testPositive() {
assertEquals(100, parse("+100").getInteger());
}
@Test
public void testPositiveTwice() {
assertEquals(100, parse("++100").getInteger());
}
@Test
public void testNegative() {
assertEquals(-100, parse("-100").getInteger());
}
@Test
public void testNegativeTwice() {
assertEquals(100, parse("--100").getInteger());
}
@Test
public void testComplement() {
assertEquals(-5, parse("~4").getInteger());
}
@Test
public void testComplementTwice() {
assertEquals(4, parse("~~4").getInteger());
}
@Test
public void testNot() {
assertEquals(0, parse("!100").getInteger());
}
@Test
public void testNotTwice() {
assertEquals(-1, parse("!!100").getInteger());
}
@Test
public void testMultiply() {
assertEquals(99, parse("9 * 11").getInteger());
}
@Test
public void testDivide() {
assertEquals(3, parse("11 / 3").getInteger());
}
@Test(expected=EvaluationException.class)
public void testDivideByZero() {
parse("1 / 0").getInteger();
}
@Test
public void testModulo() {
assertEquals(2, parse("11 % 3").getInteger());
}
@Test(expected=EvaluationException.class)
public void testModuloByZero() {
parse("1 % 0").getInteger();
}
@Test
public void testAdd() {
assertEquals(9, parse("4 + 5").getInteger());
}
@Test
public void testSubtract() {
assertEquals(-4, parse("5 - 9").getInteger());
}
@Test
public void testShiftLeft() {
assertEquals(192, parse("3 << 6").getInteger());
}
@Test
public void testShiftRight() {
assertEquals(3, parse("193 >> 6").getInteger());
}
@Test
public void testShiftRightSign() {
assertEquals(-1, parse("-1 >> 16").getInteger());
}
@Test
public void testLessThan() {
assertEquals(-1, parse("3 < 4").getInteger());
assertEquals(0, parse("4 < 4").getInteger());
assertEquals(0, parse("5 < 4").getInteger());
}
@Test
public void testLessOrEquals() {
assertEquals(-1, parse("3 <= 4").getInteger());
assertEquals(-1, parse("4 <= 4").getInteger());
assertEquals(0, parse("5 <= 4").getInteger());
}
@Test
public void testGreaterThan() {
assertEquals(0, parse("3 > 4").getInteger());
assertEquals(0, parse("4 > 4").getInteger());
assertEquals(-1, parse("5 > 4").getInteger());
}
@Test
public void testGreaterOrEquals() {
assertEquals(0, parse("3 >= 4").getInteger());
assertEquals(-1, parse("4 >= 4").getInteger());
assertEquals(-1, parse("5 >= 4").getInteger());
}
@Test
public void testEquals() {
assertEquals(0, parse("3 = 4").getInteger());
assertEquals(-1, parse("4 = 4").getInteger());
assertEquals(0, parse("5 = 4").getInteger());
}
@Test
public void testNotEquals() {
assertEquals(-1, parse("3 != 4").getInteger());
assertEquals(0, parse("4 != 4").getInteger());
assertEquals(-1, parse("5 != 4").getInteger());
}
@Test
public void testAnd() {
assertEquals(2, parse("6 & 3").getInteger());
}
@Test
public void testXor() {
assertEquals(5, parse("6 ^ 3").getInteger());
}
@Test
public void testOr() {
assertEquals(7, parse("6 | 3").getInteger());
}
@Test
public void testLogicalAnd() {
assertEquals(0, parse("0 && 0").getInteger());
assertEquals(0, parse("0 && 8").getInteger());
assertEquals(0, parse("-1 && 0").getInteger());
assertEquals(3, parse("1 && 3").getInteger());
}
@Test
public void testLogicalOr() {
assertEquals(0, parse("0 || 0").getInteger());
assertEquals(8, parse("0 || 8").getInteger());
assertEquals(-1, parse("-1 || 0").getInteger());
assertEquals(1, parse("1 || 3").getInteger());
}
@Test
public void testAnnotation() {
assertEquals("VIRTUAL", parse("VIRTUAL 15").getAnnotation().getName());
assertEquals(15, parse("VIRTUAL 15").getAnnotee().getInteger());
}
@Test
public void testSequence() {
assertEquals(3, parse("4, 5, 6").getList().size());
assertEquals(4, parse("4, 5, 6").getElement(0).getInteger());
assertEquals(5, parse("4, 5, 6").getElement(1).getInteger());
assertEquals(6, parse("4, 5, 6").getElement(2).getInteger());
assertEquals(null, parse("4, 5, 6").getElement(3));
}
@Test
public void testTernaryIfElse() {
assertEquals(2, parse("1 ? 2 : 3").getInteger());
assertEquals(3, parse("0 ? 2 : 3").getInteger());
}
@Test
public void testGroup() {
assertEquals(9, parse("(1 + 2) * 3").getInteger());
}
@Test
public void testIdentifier() {
Scope scope = new Scope();
scope.addSymbol("symbol", new IntegerLiteral(11));
assertEquals(11, parse("symbol", scope).getInteger());
}
@Test
public void testMember() {
Scope objectScope = new Scope();
objectScope.addSymbol("symbol", new IntegerLiteral(11));
Scope scope = new Scope();
scope.addSymbol("object", new ContextLiteral(objectScope));
assertEquals(11, parse("object.symbol", scope).getInteger());
}
@Test
public void testThisMember() {
Scope scope = new Scope();
scope.addSymbol("symbol", new IntegerLiteral(11));
assertEquals(11, parse("$.symbol", scope).getInteger());
}
@Test
public void testMemberOfExpression() {
Scope scope = new Scope();
scope.addSymbol("symbol", new IntegerLiteral(11));
assertEquals(11, parse("($).symbol", scope).getInteger());
}
@Test(expected=EvaluationException.class)
public void testMemberNoContext() {
parse("1.symbol").getInteger();
}
@Test(expected=ExpressionError.class)
public void testMemberNoIdentifier() {
parse("($).1").getInteger();
}
@Test
public void testIndex() {
assertEquals(4, parse("(4H, 5H)[0]").getInteger());
assertEquals(5, parse("(4H, 5H)[1]").getInteger());
}
@Test
public void testIndexNoSequence() {
assertEquals(4, parse("4H[0]").getInteger());
}
@Test(expected=EvaluationException.class)
public void testIndexOutOfBounds() {
parse("(4H, 5H)[2]").getInteger();
}
@Test(expected=EvaluationException.class)
public void testIndexNoSequenceOutOfBounds() {
parse("4H[1]").getInteger();
}
public Expression parse(String text) {
return parse(text, new Scope());
}
public Expression parse(String text, Scope scope) {
LineNumberReader reader = new LineNumberReader(new StringReader(" test " + text));
Line line = new Parser().parse(reader, scope, null);
return line.getArguments();
}
}