X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=tests%2Forg.simantics.scl.compiler.tests%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Ftests%2Funit%2FTestSubSolver2.java;fp=tests%2Forg.simantics.scl.compiler.tests%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Ftests%2Funit%2FTestSubSolver2.java;h=41913e2152b84805a72f956b8a9d2304b5b2c26f;hp=0000000000000000000000000000000000000000;hb=e3cd3cd49bc2585f57d030a8743f9012f6161a92;hpb=e65cd7676f6e843e34a8501afc57f56cbc8602d3 diff --git a/tests/org.simantics.scl.compiler.tests/src/org/simantics/scl/compiler/tests/unit/TestSubSolver2.java b/tests/org.simantics.scl.compiler.tests/src/org/simantics/scl/compiler/tests/unit/TestSubSolver2.java new file mode 100644 index 000000000..41913e215 --- /dev/null +++ b/tests/org.simantics.scl.compiler.tests/src/org/simantics/scl/compiler/tests/unit/TestSubSolver2.java @@ -0,0 +1,115 @@ +package org.simantics.scl.compiler.tests.unit; + +import java.util.ArrayList; + +import org.junit.Assert; +import org.junit.Test; +import org.simantics.scl.compiler.errors.ErrorLog; +import org.simantics.scl.compiler.errors.Locations; +import org.simantics.scl.compiler.internal.elaboration.subsumption.Subsumption; +import org.simantics.scl.compiler.internal.elaboration.subsumption2.SubSolver2; +import org.simantics.scl.compiler.types.TMetaVar; +import org.simantics.scl.compiler.types.Type; +import org.simantics.scl.compiler.types.Types; +import org.simantics.scl.compiler.types.kinds.Kinds; +import org.simantics.scl.compiler.types.util.Polarity; + +public class TestSubSolver2 { + ErrorLog errorLog = new ErrorLog(); + ArrayList subsumptions = new ArrayList(); + + private void sub(Type a, Type b) { + subsumptions.add(new Subsumption(Locations.NO_LOCATION, a, b)); + } + + private TMetaVar metaVar(Polarity p) { + TMetaVar var = Types.metaVar(Kinds.EFFECT); + var.addPolarity(p); + return var; + } + + @Test + public void subFF() { + TMetaVar a = metaVar(Polarity.NO_POLARITY); + TMetaVar b = metaVar(Polarity.NO_POLARITY); + sub(a, b); + SubSolver2.solve(errorLog, subsumptions); + Assert.assertEquals(0, errorLog.getErrorCount()); + Assert.assertEquals(a, b); + } + + @Test + public void subPP() { + TMetaVar a = metaVar(Polarity.POSITIVE); + TMetaVar b = metaVar(Polarity.POSITIVE); + sub(a, b); + SubSolver2.solve(errorLog, subsumptions); + Assert.assertEquals(0, errorLog.getErrorCount()); + Assert.assertEquals(a, b); + } + + @Test + public void subNN() { + TMetaVar a = metaVar(Polarity.NEGATIVE); + TMetaVar b = metaVar(Polarity.NEGATIVE); + sub(a, b); + SubSolver2.solve(errorLog, subsumptions); + Assert.assertEquals(0, errorLog.getErrorCount()); + Assert.assertEquals(a, b); + } + + @Test + public void subPN() { + TMetaVar a = metaVar(Polarity.POSITIVE); + TMetaVar b = metaVar(Polarity.NEGATIVE); + sub(a, b); + SubSolver2.solve(errorLog, subsumptions); + Assert.assertEquals(0, errorLog.getErrorCount()); + Assert.assertNotEquals(a, b); + } + + @Test + public void subNP() { + TMetaVar a = metaVar(Polarity.NEGATIVE); + TMetaVar b = metaVar(Polarity.POSITIVE); + sub(a, b); + SubSolver2.solve(errorLog, subsumptions); + Assert.assertEquals(0, errorLog.getErrorCount()); + Assert.assertEquals(a, b); + } + + @Test + public void loop() { + TMetaVar a = metaVar(Polarity.BIPOLAR); + TMetaVar b = metaVar(Polarity.BIPOLAR); + TMetaVar c = metaVar(Polarity.BIPOLAR); + sub(a, b); + sub(b, c); + sub(c, a); + SubSolver2.solve(errorLog, subsumptions); + Assert.assertEquals(0, errorLog.getErrorCount()); + Assert.assertEquals(a, b); + Assert.assertEquals(a, c); + } + + @Test + public void union() { + TMetaVar a = metaVar(Polarity.POSITIVE); + TMetaVar b = metaVar(Polarity.POSITIVE); + sub(a, Types.union(a, b)); + sub(Types.PROC, b); + SubSolver2.solve(errorLog, subsumptions); + Assert.assertEquals(0, errorLog.getErrorCount()); + Assert.assertEquals(Types.PROC, b); + } + + @Test + public void union2() { + TMetaVar a = metaVar(Polarity.POSITIVE); + TMetaVar b = metaVar(Polarity.POSITIVE); + sub(Types.union(a, Types.PROC), Types.union(a, b)); + SubSolver2.solve(errorLog, subsumptions); + Assert.assertEquals(0, errorLog.getErrorCount()); + Assert.assertNotEquals(Types.NO_EFFECTS, b); + } +}