Java, typeres: split incorporation tests
This commit is contained in:
@ -30,8 +30,10 @@ public class TypeInferenceTest {
|
|||||||
private JavaTypeDefinition integer = JavaTypeDefinition.forClass(Integer.class);
|
private JavaTypeDefinition integer = JavaTypeDefinition.forClass(Integer.class);
|
||||||
private JavaTypeDefinition primitiveInt = JavaTypeDefinition.forClass(int.class);
|
private JavaTypeDefinition primitiveInt = JavaTypeDefinition.forClass(int.class);
|
||||||
private JavaTypeDefinition generic = JavaTypeDefinition.forClass(Map.class, number, integer);
|
private JavaTypeDefinition generic = JavaTypeDefinition.forClass(Map.class, number, integer);
|
||||||
private Variable a = new Variable();
|
private Variable alpha = new Variable();
|
||||||
private Variable b = new Variable();
|
private Variable beta = new Variable();
|
||||||
|
JavaTypeDefinition s = JavaTypeDefinition.forClass(int.class);
|
||||||
|
JavaTypeDefinition t = JavaTypeDefinition.forClass(double.class);
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testEqualityReduceProperVsProper() {
|
public void testEqualityReduceProperVsProper() {
|
||||||
@ -47,22 +49,22 @@ public class TypeInferenceTest {
|
|||||||
public void testEqualityReduceVariableVsNotPrimitive() {
|
public void testEqualityReduceVariableVsNotPrimitive() {
|
||||||
// Otherwise, if S is an inference variable, α, and T is not a primitive type, the constraint reduces to
|
// Otherwise, if S is an inference variable, α, and T is not a primitive type, the constraint reduces to
|
||||||
// the bound α = T.
|
// the bound α = T.
|
||||||
List<BoundOrConstraint> result = new Constraint(a, number, EQUALITY).reduce();
|
List<BoundOrConstraint> result = new Constraint(alpha, number, EQUALITY).reduce();
|
||||||
assertEquals(result.size(), 1);
|
assertEquals(result.size(), 1);
|
||||||
testBoundOrConstraint(result.get(0), a, number, EQUALITY, Bound.class);
|
testBoundOrConstraint(result.get(0), alpha, number, EQUALITY, Bound.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testEqualityReduceNotPrimitiveVsVariable() {
|
public void testEqualityReduceNotPrimitiveVsVariable() {
|
||||||
// Otherwise, if T is an inference variable, α, and S is not a primitive type, the constraint reduces
|
// Otherwise, if T is an inference variable, α, and S is not a primitive type, the constraint reduces
|
||||||
// to the bound S = α.
|
// to the bound S = α.
|
||||||
List<BoundOrConstraint> result = new Constraint(number, a, EQUALITY).reduce();
|
List<BoundOrConstraint> result = new Constraint(number, alpha, EQUALITY).reduce();
|
||||||
assertEquals(result.size(), 1);
|
assertEquals(result.size(), 1);
|
||||||
testBoundOrConstraint(result.get(0), number, a, EQUALITY, Bound.class);
|
testBoundOrConstraint(result.get(0), number, alpha, EQUALITY, Bound.class);
|
||||||
|
|
||||||
result = new Constraint(a, b, EQUALITY).reduce();
|
result = new Constraint(alpha, beta, EQUALITY).reduce();
|
||||||
assertEquals(result.size(), 1);
|
assertEquals(result.size(), 1);
|
||||||
testBoundOrConstraint(result.get(0), a, b, EQUALITY, Bound.class);
|
testBoundOrConstraint(result.get(0), alpha, beta, EQUALITY, Bound.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -80,7 +82,8 @@ public class TypeInferenceTest {
|
|||||||
public void testEqualityReduceArrayTypes() {
|
public void testEqualityReduceArrayTypes() {
|
||||||
// Otherwise, if S and T are array types, S'[] and T'[], the constraint reduces to ‹S' = T'›.
|
// Otherwise, if S and T are array types, S'[] and T'[], the constraint reduces to ‹S' = T'›.
|
||||||
List<BoundOrConstraint> result = new Constraint(JavaTypeDefinition.forClass(Number[].class),
|
List<BoundOrConstraint> result = new Constraint(JavaTypeDefinition.forClass(Number[].class),
|
||||||
JavaTypeDefinition.forClass(Integer[].class), EQUALITY).reduce();
|
JavaTypeDefinition.forClass(Integer[].class), EQUALITY)
|
||||||
|
.reduce();
|
||||||
assertEquals(result.size(), 1);
|
assertEquals(result.size(), 1);
|
||||||
testBoundOrConstraint(result.get(0), number, integer, EQUALITY, Constraint.class);
|
testBoundOrConstraint(result.get(0), number, integer, EQUALITY, Constraint.class);
|
||||||
}
|
}
|
||||||
@ -105,21 +108,21 @@ public class TypeInferenceTest {
|
|||||||
@Test
|
@Test
|
||||||
public void testSubtypeReduceVariableVsAny() {
|
public void testSubtypeReduceVariableVsAny() {
|
||||||
// Otherwise, if S is an inference variable, α, the constraint reduces to the bound α <: T.
|
// Otherwise, if S is an inference variable, α, the constraint reduces to the bound α <: T.
|
||||||
List<BoundOrConstraint> result = new Constraint(a, integer, SUBTYPE).reduce();
|
List<BoundOrConstraint> result = new Constraint(alpha, integer, SUBTYPE).reduce();
|
||||||
assertEquals(result.size(), 1);
|
assertEquals(result.size(), 1);
|
||||||
testBoundOrConstraint(result.get(0), a, integer, SUBTYPE, Bound.class);
|
testBoundOrConstraint(result.get(0), alpha, integer, SUBTYPE, Bound.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSubtypeReduceAnyVsVariable() {
|
public void testSubtypeReduceAnyVsVariable() {
|
||||||
// Otherwise, if T is an inference variable, α, the constraint reduces to the bound S <: α.
|
// Otherwise, if T is an inference variable, α, the constraint reduces to the bound S <: α.
|
||||||
List<BoundOrConstraint> result = new Constraint(integer, a, SUBTYPE).reduce();
|
List<BoundOrConstraint> result = new Constraint(integer, alpha, SUBTYPE).reduce();
|
||||||
assertEquals(result.size(), 1);
|
assertEquals(result.size(), 1);
|
||||||
testBoundOrConstraint(result.get(0), integer, a, SUBTYPE, Bound.class);
|
testBoundOrConstraint(result.get(0), integer, alpha, SUBTYPE, Bound.class);
|
||||||
|
|
||||||
result = new Constraint(a, b, SUBTYPE).reduce();
|
result = new Constraint(alpha, beta, SUBTYPE).reduce();
|
||||||
assertEquals(result.size(), 1);
|
assertEquals(result.size(), 1);
|
||||||
testBoundOrConstraint(result.get(0), a, b, SUBTYPE, Bound.class);
|
testBoundOrConstraint(result.get(0), alpha, beta, SUBTYPE, Bound.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -167,13 +170,13 @@ public class TypeInferenceTest {
|
|||||||
@Test
|
@Test
|
||||||
public void testLooseInvocationAnythingElse() {
|
public void testLooseInvocationAnythingElse() {
|
||||||
// Otherwise, the constraint reduces to ‹S<:T›.
|
// Otherwise, the constraint reduces to ‹S<:T›.
|
||||||
List<BoundOrConstraint> result = new Constraint(number, a, LOOSE_INVOCATION).reduce();
|
List<BoundOrConstraint> result = new Constraint(number, alpha, LOOSE_INVOCATION).reduce();
|
||||||
assertEquals(result.size(), 1);
|
assertEquals(result.size(), 1);
|
||||||
testBoundOrConstraint(result.get(0), number, a, SUBTYPE, Constraint.class);
|
testBoundOrConstraint(result.get(0), number, alpha, SUBTYPE, Constraint.class);
|
||||||
|
|
||||||
result = new Constraint(a, number, LOOSE_INVOCATION).reduce();
|
result = new Constraint(alpha, number, LOOSE_INVOCATION).reduce();
|
||||||
assertEquals(result.size(), 1);
|
assertEquals(result.size(), 1);
|
||||||
testBoundOrConstraint(result.get(0), a, number, SUBTYPE, Constraint.class);
|
testBoundOrConstraint(result.get(0), alpha, number, SUBTYPE, Constraint.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -198,14 +201,8 @@ public class TypeInferenceTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testIncorporation() {
|
public void testIncorporationEqualityAndEquality() {
|
||||||
List<Constraint> result;
|
List<Constraint> result;
|
||||||
List<Bound> current = new ArrayList<>();
|
|
||||||
List<Bound> newBounds = new ArrayList<>();
|
|
||||||
|
|
||||||
JavaTypeDefinition s = JavaTypeDefinition.forClass(int.class);
|
|
||||||
JavaTypeDefinition t = JavaTypeDefinition.forClass(double.class);
|
|
||||||
Variable alpha = a;
|
|
||||||
|
|
||||||
// ### Original rule 1. : α = S and α = T imply ‹S = T›
|
// ### Original rule 1. : α = S and α = T imply ‹S = T›
|
||||||
result = incorporationResult(new Bound(alpha, s, EQUALITY), new Bound(alpha, t, EQUALITY));
|
result = incorporationResult(new Bound(alpha, s, EQUALITY), new Bound(alpha, t, EQUALITY));
|
||||||
@ -226,7 +223,11 @@ public class TypeInferenceTest {
|
|||||||
result = incorporationResult(new Bound(s, alpha, EQUALITY), new Bound(t, alpha, EQUALITY));
|
result = incorporationResult(new Bound(s, alpha, EQUALITY), new Bound(t, alpha, EQUALITY));
|
||||||
assertEquals(result.size(), 1);
|
assertEquals(result.size(), 1);
|
||||||
testBoundOrConstraint(result.get(0), s, t, EQUALITY, Constraint.class);
|
testBoundOrConstraint(result.get(0), s, t, EQUALITY, Constraint.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testIncorporationEqualityAndSubtypeLeftVariable() {
|
||||||
|
List<Constraint> result;
|
||||||
|
|
||||||
// ### Original rule 2. : α = S and α <: T imply ‹S <: T›
|
// ### Original rule 2. : α = S and α <: T imply ‹S <: T›
|
||||||
result = incorporationResult(new Bound(alpha, s, EQUALITY), new Bound(alpha, t, SUBTYPE));
|
result = incorporationResult(new Bound(alpha, s, EQUALITY), new Bound(alpha, t, SUBTYPE));
|
||||||
@ -247,7 +248,11 @@ public class TypeInferenceTest {
|
|||||||
result = incorporationResult(new Bound(alpha, t, SUBTYPE), new Bound(s, alpha, EQUALITY));
|
result = incorporationResult(new Bound(alpha, t, SUBTYPE), new Bound(s, alpha, EQUALITY));
|
||||||
assertEquals(result.size(), 1);
|
assertEquals(result.size(), 1);
|
||||||
testBoundOrConstraint(result.get(0), s, t, SUBTYPE, Constraint.class);
|
testBoundOrConstraint(result.get(0), s, t, SUBTYPE, Constraint.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testIncorporationEqualityAndSubtypeRightVariable() {
|
||||||
|
List<Constraint> result;
|
||||||
|
|
||||||
// ### Original rule 3. : α = S and T <: α imply ‹T <: S›
|
// ### Original rule 3. : α = S and T <: α imply ‹T <: S›
|
||||||
result = incorporationResult(new Bound(alpha, s, EQUALITY), new Bound(t, alpha, SUBTYPE));
|
result = incorporationResult(new Bound(alpha, s, EQUALITY), new Bound(t, alpha, SUBTYPE));
|
||||||
@ -268,8 +273,12 @@ public class TypeInferenceTest {
|
|||||||
result = incorporationResult(new Bound(t, alpha, SUBTYPE), new Bound(s, alpha, EQUALITY));
|
result = incorporationResult(new Bound(t, alpha, SUBTYPE), new Bound(s, alpha, EQUALITY));
|
||||||
assertEquals(result.size(), 1);
|
assertEquals(result.size(), 1);
|
||||||
testBoundOrConstraint(result.get(0), t, s, SUBTYPE, Constraint.class);
|
testBoundOrConstraint(result.get(0), t, s, SUBTYPE, Constraint.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testIncorporationSubtypeAndSubtype() {
|
||||||
|
List<Constraint> result;
|
||||||
|
|
||||||
// ### Original rule 4. : S <: α and α <: T imply ‹S <: T›
|
// ### Original rule 4. : S <: α and α <: T imply ‹S <: T›
|
||||||
result = incorporationResult(new Bound(s, alpha, EQUALITY), new Bound(alpha, t, SUBTYPE));
|
result = incorporationResult(new Bound(s, alpha, EQUALITY), new Bound(alpha, t, SUBTYPE));
|
||||||
assertEquals(result.size(), 1);
|
assertEquals(result.size(), 1);
|
||||||
|
Reference in New Issue
Block a user