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); } }