/** * Author: Georg Hofferek <georg.hofferek@iaik.tugraz.at> */ package at.iaik.suraq.test; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import org.junit.Assert; import org.junit.Test; import at.iaik.suraq.sexp.Token; import at.iaik.suraq.smtlib.formula.ArrayEq; import at.iaik.suraq.smtlib.formula.ArrayProperty; import at.iaik.suraq.smtlib.formula.ArrayRead; import at.iaik.suraq.smtlib.formula.ArrayTerm; import at.iaik.suraq.smtlib.formula.ArrayVariable; import at.iaik.suraq.smtlib.formula.ArrayWrite; import at.iaik.suraq.smtlib.formula.DomainEq; import at.iaik.suraq.smtlib.formula.DomainTerm; import at.iaik.suraq.smtlib.formula.DomainVariable; import at.iaik.suraq.smtlib.formula.Formula; /** * @author Georg Hofferek <georg.hofferek@iaik.tugraz.at> * */ public class ApplyWriteAxiomTest { @Test public void testApplyWriteAxiom() throws Throwable { ArrayVariable arrayVar = ArrayVariable.create("A"); DomainVariable index = DomainVariable.create("i"); DomainVariable value = DomainVariable.create("v"); ArrayWrite write = ArrayWrite.create(arrayVar, index, value); Set<Formula> constraints = new HashSet<Formula>(); Set<Token> noDependenceVars = new HashSet<Token>(); List<ArrayTerm> list = new ArrayList<ArrayTerm>(); list.add(arrayVar); list.add(arrayVar); Formula topLevelFormula = ArrayEq.create(list, true); ArrayVariable newVar = write.applyWriteAxiom(topLevelFormula, constraints, noDependenceVars); Assert.assertNotSame(arrayVar, newVar); Assert.assertEquals(2, constraints.size()); for (Formula constraint : constraints) { Assert.assertTrue(constraint instanceof DomainEq || constraint instanceof ArrayProperty); if (constraint instanceof DomainEq) { DomainEq eq = (DomainEq) constraint; Assert.assertTrue(eq.getDomainTerms().size() == 2); DomainTerm term1 = eq.getDomainTerms().get(0); DomainTerm term2 = eq.getDomainTerms().get(1); ArrayRead read; DomainVariable v; Assert.assertTrue(term1 instanceof ArrayRead || term2 instanceof ArrayRead); Assert.assertTrue(term1 instanceof DomainVariable || term2 instanceof DomainVariable); if (term1 instanceof ArrayRead) { read = (ArrayRead) term1; v = (DomainVariable) term2; } else { read = (ArrayRead) term2; v = (DomainVariable) term1; } Assert.assertEquals(value, v); ArrayRead expectedRead = ArrayRead.create(newVar, index); Assert.assertEquals(expectedRead, read); } else { // Array Property ArrayProperty property = (ArrayProperty) constraint; Assert.assertEquals(1, property.getuVars().size()); Assert.assertTrue(property.getIndexGuard() instanceof DomainEq); Assert.assertFalse(((DomainEq) (property.getIndexGuard())) .isEqual()); Assert.assertEquals(2, ((DomainEq) (property.getIndexGuard())).numTerms()); Assert.assertTrue(((DomainEq) (property.getIndexGuard())) .getTerms().get(0) instanceof DomainVariable); Assert.assertTrue(((DomainEq) (property.getIndexGuard())) .getTerms().get(1) instanceof DomainVariable); Assert.assertTrue(property.getValueConstraint() instanceof DomainEq); Assert.assertTrue(((DomainEq) (property.getValueConstraint())) .isEqual()); Assert.assertEquals(2, ((DomainEq) (property.getIndexGuard())).numTerms()); Assert.assertTrue(((DomainEq) (property.getValueConstraint())) .getTerms().get(0) instanceof ArrayRead); Assert.assertTrue(((DomainEq) (property.getValueConstraint())) .getTerms().get(1) instanceof ArrayRead); } } } }