aboutsummaryrefslogtreecommitdiff
path: root/src/test/java/org/zwobble
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-03-31 12:08:02 +0100
committerMichael Williamson <mike@zwobble.org>2016-03-31 12:08:02 +0100
commit6bb8fe3f983cd0a2be76239df2124af633f0e05c (patch)
tree8ae88b29f16ccbc0a408fa33f625b607c9fc32cc /src/test/java/org/zwobble
parent2247cff5b5361a8124d4c261a1edb1852bd5f08f (diff)
Add evaluation of arrays to interpreter
Diffstat (limited to 'src/test/java/org/zwobble')
-rw-r--r--src/test/java/org/zwobble/couscous/tests/interpreter/EvaluatorTests.java35
-rw-r--r--src/test/java/org/zwobble/couscous/tests/util/ExtraMatchers.java21
2 files changed, 50 insertions, 6 deletions
diff --git a/src/test/java/org/zwobble/couscous/tests/interpreter/EvaluatorTests.java b/src/test/java/org/zwobble/couscous/tests/interpreter/EvaluatorTests.java
index 6112c8e..5f42065 100644
--- a/src/test/java/org/zwobble/couscous/tests/interpreter/EvaluatorTests.java
+++ b/src/test/java/org/zwobble/couscous/tests/interpreter/EvaluatorTests.java
@@ -1,25 +1,31 @@
package org.zwobble.couscous.tests.interpreter;
import com.google.common.collect.ImmutableMap;
+import org.hamcrest.Matcher;
import org.junit.Test;
import org.zwobble.couscous.ast.*;
-import org.zwobble.couscous.types.ScalarType;
import org.zwobble.couscous.interpreter.Environment;
import org.zwobble.couscous.interpreter.JavaProject;
import org.zwobble.couscous.interpreter.MapBackedProject;
import org.zwobble.couscous.interpreter.StackFrameBuilder;
import org.zwobble.couscous.interpreter.errors.*;
+import org.zwobble.couscous.interpreter.values.ArrayInterpreterValue;
import org.zwobble.couscous.interpreter.values.IntegerInterpreterValue;
import org.zwobble.couscous.interpreter.values.InterpreterValue;
import org.zwobble.couscous.interpreter.values.StringInterpreterValue;
import org.zwobble.couscous.tests.BackendEvalTests;
+import org.zwobble.couscous.types.ScalarType;
import org.zwobble.couscous.types.Types;
import org.zwobble.couscous.values.PrimitiveValue;
import java.util.List;
import java.util.Optional;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.allOf;
+import static org.hamcrest.Matchers.equalTo;
import static org.junit.Assert.assertEquals;
+import static org.zwobble.couscous.ast.ArrayNode.array;
import static org.zwobble.couscous.ast.AssignmentNode.assign;
import static org.zwobble.couscous.ast.AssignmentNode.assignStatement;
import static org.zwobble.couscous.ast.CastNode.cast;
@@ -34,6 +40,7 @@ import static org.zwobble.couscous.interpreter.Evaluator.eval;
import static org.zwobble.couscous.interpreter.values.InterpreterValues.value;
import static org.zwobble.couscous.tests.TestIds.ANY_ID;
import static org.zwobble.couscous.tests.util.ExtraAsserts.assertThrows;
+import static org.zwobble.couscous.tests.util.ExtraMatchers.*;
import static org.zwobble.couscous.util.ExtraLists.list;
public class EvaluatorTests extends BackendEvalTests {
@@ -225,7 +232,31 @@ public class EvaluatorTests extends BackendEvalTests {
assertEquals(Types.STRING, exception.getExpected());
assertEquals(Types.INT, exception.getActual());
}
-
+
+ @Test
+ public void canEvaluateEmptyArray() {
+ InterpreterValue array = eval(emptyEnvironment(), array(Types.STRING, list()));
+ assertThat(array, isArrayInterpreterValue(Types.STRING, list()));
+ }
+
+ @Test
+ public void canEvaluateArrayWithElements() {
+ InterpreterValue array = eval(emptyEnvironment(), array(Types.STRING, list(literal("one"), literal("two"))));
+ assertThat(
+ array,
+ isArrayInterpreterValue(Types.STRING, list(
+ StringInterpreterValue.of("one"),
+ StringInterpreterValue.of("two"))));
+ }
+
+ private Matcher<InterpreterValue> isArrayInterpreterValue(ScalarType elementType, List<InterpreterValue> elements) {
+ return isInstance(
+ ArrayInterpreterValue.class,
+ allOf(
+ hasFeature("elementType", value -> value.getElementType(), equalTo(elementType)),
+ hasFeature("elements", value -> value.getElements(), containsExactElements(elements))));
+ }
+
private static Environment emptyEnvironment() {
return new Environment(
JavaProject.builder().build(),
diff --git a/src/test/java/org/zwobble/couscous/tests/util/ExtraMatchers.java b/src/test/java/org/zwobble/couscous/tests/util/ExtraMatchers.java
index d79cb05..074e449 100644
--- a/src/test/java/org/zwobble/couscous/tests/util/ExtraMatchers.java
+++ b/src/test/java/org/zwobble/couscous/tests/util/ExtraMatchers.java
@@ -1,12 +1,13 @@
package org.zwobble.couscous.tests.util;
-import org.hamcrest.Description;
-import org.hamcrest.DiagnosingMatcher;
-import org.hamcrest.FeatureMatcher;
-import org.hamcrest.Matcher;
+import org.hamcrest.*;
+import java.util.List;
import java.util.function.Function;
+import static org.hamcrest.Matchers.equalTo;
+import static org.zwobble.couscous.util.ExtraLists.eagerMap;
+
public class ExtraMatchers {
public static <T, U> Matcher<T> isInstance(Class<U> type, Matcher<? super U> downcastMatcher) {
return new DiagnosingMatcher<T>() {
@@ -51,4 +52,16 @@ public class ExtraMatchers {
}
};
}
+
+ public static <T> Matcher<Iterable<? extends T>> containsExactly(List<Matcher<? super T>> matchers) {
+ if (matchers.isEmpty()) {
+ return Matchers.emptyIterable();
+ } else {
+ return Matchers.contains(matchers);
+ }
+ }
+
+ public static <T> Matcher<Iterable<? extends T>> containsExactElements(List<T> values) {
+ return containsExactly(eagerMap(values, value -> equalTo(value)));
+ }
}