]> gerrit.simantics Code Review - simantics/platform.git/blob - tests/org.simantics.scl.compiler.tests/src/org/simantics/scl/compiler/tests/unit/TestSubSolver2.java
New solver for SCL effects inequalities
[simantics/platform.git] / tests / org.simantics.scl.compiler.tests / src / org / simantics / scl / compiler / tests / unit / TestSubSolver2.java
1 package org.simantics.scl.compiler.tests.unit;
2
3 import java.util.ArrayList;
4
5 import org.junit.Assert;
6 import org.junit.Test;
7 import org.simantics.scl.compiler.errors.ErrorLog;
8 import org.simantics.scl.compiler.errors.Locations;
9 import org.simantics.scl.compiler.internal.elaboration.subsumption.Subsumption;
10 import org.simantics.scl.compiler.internal.elaboration.subsumption2.SubSolver2;
11 import org.simantics.scl.compiler.types.TMetaVar;
12 import org.simantics.scl.compiler.types.Type;
13 import org.simantics.scl.compiler.types.Types;
14 import org.simantics.scl.compiler.types.kinds.Kinds;
15 import org.simantics.scl.compiler.types.util.Polarity;
16
17 public class TestSubSolver2 {
18     ErrorLog errorLog = new ErrorLog();
19     ArrayList<Subsumption> subsumptions = new ArrayList<Subsumption>(); 
20     
21     private void sub(Type a, Type b) {
22         subsumptions.add(new Subsumption(Locations.NO_LOCATION, a, b));
23     }
24     
25     private TMetaVar metaVar(Polarity p) {
26         TMetaVar var = Types.metaVar(Kinds.EFFECT);
27         var.addPolarity(p);
28         return var;
29     }
30     
31     @Test
32     public void subFF() {
33         TMetaVar a = metaVar(Polarity.NO_POLARITY);
34         TMetaVar b = metaVar(Polarity.NO_POLARITY);
35         sub(a, b);
36         SubSolver2.solve(errorLog, subsumptions);
37         Assert.assertEquals(0, errorLog.getErrorCount());
38         Assert.assertEquals(a, b);
39     }
40     
41     @Test
42     public void subPP() {
43         TMetaVar a = metaVar(Polarity.POSITIVE);
44         TMetaVar b = metaVar(Polarity.POSITIVE);
45         sub(a, b);
46         SubSolver2.solve(errorLog, subsumptions);
47         Assert.assertEquals(0, errorLog.getErrorCount());
48         Assert.assertEquals(a, b);
49     }
50     
51     @Test
52     public void subNN() {
53         TMetaVar a = metaVar(Polarity.NEGATIVE);
54         TMetaVar b = metaVar(Polarity.NEGATIVE);
55         sub(a, b);
56         SubSolver2.solve(errorLog, subsumptions);
57         Assert.assertEquals(0, errorLog.getErrorCount());
58         Assert.assertEquals(a, b);
59     }
60     
61     @Test
62     public void subPN() {
63         TMetaVar a = metaVar(Polarity.POSITIVE);
64         TMetaVar b = metaVar(Polarity.NEGATIVE);
65         sub(a, b);
66         SubSolver2.solve(errorLog, subsumptions);
67         Assert.assertEquals(0, errorLog.getErrorCount());
68         Assert.assertNotEquals(a, b);
69     }
70     
71     @Test
72     public void subNP() {
73         TMetaVar a = metaVar(Polarity.NEGATIVE);
74         TMetaVar b = metaVar(Polarity.POSITIVE);
75         sub(a, b);
76         SubSolver2.solve(errorLog, subsumptions);
77         Assert.assertEquals(0, errorLog.getErrorCount());
78         Assert.assertEquals(a, b);
79     }
80     
81     @Test
82     public void loop() {
83         TMetaVar a = metaVar(Polarity.BIPOLAR);
84         TMetaVar b = metaVar(Polarity.BIPOLAR);
85         TMetaVar c = metaVar(Polarity.BIPOLAR);
86         sub(a, b);
87         sub(b, c);
88         sub(c, a);
89         SubSolver2.solve(errorLog, subsumptions);
90         Assert.assertEquals(0, errorLog.getErrorCount());
91         Assert.assertEquals(a, b);
92         Assert.assertEquals(a, c);
93     }
94     
95     @Test
96     public void union() {
97         TMetaVar a = metaVar(Polarity.POSITIVE);
98         TMetaVar b = metaVar(Polarity.POSITIVE);
99         sub(a, Types.union(a, b));
100         sub(Types.PROC, b);
101         SubSolver2.solve(errorLog, subsumptions);
102         Assert.assertEquals(0, errorLog.getErrorCount());
103         Assert.assertEquals(Types.PROC, b);
104     }
105     
106     @Test
107     public void union2() {
108         TMetaVar a = metaVar(Polarity.POSITIVE);
109         TMetaVar b = metaVar(Polarity.POSITIVE);
110         sub(Types.union(a, Types.PROC), Types.union(a, b));
111         SubSolver2.solve(errorLog, subsumptions);
112         Assert.assertEquals(0, errorLog.getErrorCount());
113         Assert.assertNotEquals(Types.NO_EFFECTS, b);
114     }
115 }