aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-12-25 11:39:53 +0000
committerMichael Williamson <mike@zwobble.org>2023-12-25 12:07:37 +0000
commitd4c714a248602ec48b4ad4cb531d2e335f7e51d0 (patch)
tree21e8c847c4eb7fa12b76be319dac20d583165da2 /src/test/java
parenteb90e991d9c28cdced85d3fb0bfe2e24ca8b091a (diff)
Add basic type substitution
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/org/shedlang/compiler/types/TypeSubstitutionTests.java122
1 files changed, 122 insertions, 0 deletions
diff --git a/src/test/java/org/shedlang/compiler/types/TypeSubstitutionTests.java b/src/test/java/org/shedlang/compiler/types/TypeSubstitutionTests.java
new file mode 100644
index 00000000..662eebcc
--- /dev/null
+++ b/src/test/java/org/shedlang/compiler/types/TypeSubstitutionTests.java
@@ -0,0 +1,122 @@
+package org.shedlang.compiler.types;
+
+import org.junit.jupiter.api.Test;
+
+import java.util.Map;
+
+import static org.zwobble.precisely.AssertThat.assertThat;
+import static org.zwobble.precisely.Matchers.equalTo;
+
+public class TypeSubstitutionTests {
+ private static final NamespaceName NAMESPACE_NAME = NamespaceName.of("Example", "Project");
+ private static final StructType STRUCT_TYPE = Types.struct(NAMESPACE_NAME, "Struct");
+ private static final StructType STRUCT_TYPE_2 = Types.struct(NAMESPACE_NAME, "Struct2");
+
+ @Test
+ public void substitutingBoolDoesNothing() {
+ var typeSubstitutionMap = TypeSubstitutionMap.of(
+ Map.entry(TypeParam.forStructType(STRUCT_TYPE, "T"), Types.INT)
+ );
+
+ var result = TypeSubstitution.substitute(Types.BOOL, typeSubstitutionMap);
+
+ assertThat(result, equalTo(Types.BOOL));
+ }
+
+ @Test
+ public void substitutingBottomDoesNothing() {
+ var typeSubstitutionMap = TypeSubstitutionMap.of(
+ Map.entry(TypeParam.forStructType(STRUCT_TYPE, "T"), Types.INT)
+ );
+
+ var result = TypeSubstitution.substitute(Types.BOTTOM, typeSubstitutionMap);
+
+ assertThat(result, equalTo(Types.BOTTOM));
+ }
+
+ @Test
+ public void substitutingIntDoesNothing() {
+ var typeSubstitutionMap = TypeSubstitutionMap.of(
+ Map.entry(TypeParam.forStructType(STRUCT_TYPE, "T"), Types.BOOL)
+ );
+
+ var result = TypeSubstitution.substitute(Types.INT, typeSubstitutionMap);
+
+ assertThat(result, equalTo(Types.INT));
+ }
+
+ @Test
+ public void substitutingNamespaceDoesNothing() {
+ var typeSubstitutionMap = TypeSubstitutionMap.of(
+ Map.entry(TypeParam.forStructType(STRUCT_TYPE, "T"), Types.INT)
+ );
+
+ var result = TypeSubstitution.substitute(
+ Types.namespace(NamespaceName.of("A")),
+ typeSubstitutionMap
+ );
+
+ assertThat(result, equalTo(Types.namespace(NamespaceName.of("A"))));
+ }
+
+ @Test
+ public void substitutingStringDoesNothing() {
+ var typeSubstitutionMap = TypeSubstitutionMap.of(
+ Map.entry(TypeParam.forStructType(STRUCT_TYPE, "T"), Types.INT)
+ );
+
+ var result = TypeSubstitution.substitute(Types.STRING, typeSubstitutionMap);
+
+ assertThat(result, equalTo(Types.STRING));
+ }
+
+ @Test
+ public void substitutingTopDoesNothing() {
+ var typeSubstitutionMap = TypeSubstitutionMap.of(
+ Map.entry(TypeParam.forStructType(STRUCT_TYPE, "T"), Types.INT)
+ );
+
+ var result = TypeSubstitution.substitute(Types.TOP, typeSubstitutionMap);
+
+ assertThat(result, equalTo(Types.TOP));
+ }
+
+ @Test
+ public void substitutingTypeParamDoesNothingIfTypeParamIsNotInSubstitutionMap() {
+ var typeSubstitutionMap = TypeSubstitutionMap.of(
+ Map.entry(TypeParam.forStructType(STRUCT_TYPE, "T"), Types.INT)
+ );
+
+ var result = TypeSubstitution.substitute(
+ TypeParam.forStructType(STRUCT_TYPE_2, "T"),
+ typeSubstitutionMap
+ );
+
+ assertThat(result, equalTo(TypeParam.forStructType(STRUCT_TYPE_2, "T")));
+ }
+
+ @Test
+ public void substitutingTypeParamChangesTypeParamToCorrespondingType() {
+ var typeSubstitutionMap = TypeSubstitutionMap.of(
+ Map.entry(TypeParam.forStructType(STRUCT_TYPE, "T"), Types.INT)
+ );
+
+ var result = TypeSubstitution.substitute(
+ TypeParam.forStructType(STRUCT_TYPE, "T"),
+ typeSubstitutionMap
+ );
+
+ assertThat(result, equalTo(Types.INT));
+ }
+
+ @Test
+ public void substitutingUnitDoesNothing() {
+ var typeSubstitutionMap = TypeSubstitutionMap.of(
+ Map.entry(TypeParam.forStructType(STRUCT_TYPE, "T"), Types.INT)
+ );
+
+ var result = TypeSubstitution.substitute(Types.UNIT, typeSubstitutionMap);
+
+ assertThat(result, equalTo(Types.UNIT));
+ }
+}