/****************************************************************************** * Copyright (c) 2009 - 2015 IBM Corporation. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *****************************************************************************/ package test.sequential; import static test.TestUtil.method; import java.io.File; import java.io.IOException; import java.util.Collections; import java.util.List; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import com.ibm.wala.memsat.Miniatur; import com.ibm.wala.memsat.Options; import com.ibm.wala.memsat.Results; import com.ibm.wala.memsat.translation.sequential.SequentialTranslation; import com.ibm.wala.util.CancelException; import data.little.Little; import kodkod.ast.Relation; import kodkod.engine.Evaluator; import kodkod.engine.Solution; import kodkod.engine.Solution.Outcome; import kodkod.instance.Instance; public class MiniaturTests { private static final File SRC_DATA_LITTLE = new File("source/data/little"); private Miniatur miniatur; protected Options getOptions() { return new Options(); } @Before public void setup() { miniatur = new Miniatur(getOptions()); } static Solution test(Miniatur miniatur, File srcpath, Class<?> klass, String methodname, boolean sat){ return test(miniatur, Collections.singletonList(srcpath), klass, methodname, sat); } static Solution test(Miniatur miniatur, List<File> srcpath, Class<?> klass, String methodname, boolean sat){ try { Results<SequentialTranslation> results = miniatur.analyze(method(klass, methodname), srcpath); Solution solution = results.solution(); System.out.println(results.toString()); if (sat) { assert solution.outcome().equals(Outcome.SATISFIABLE) || solution.outcome().equals(Outcome.TRIVIALLY_SATISFIABLE); } else { assert solution.outcome().equals(Outcome.UNSATISFIABLE) || solution.outcome().equals(Outcome.TRIVIALLY_UNSATISFIABLE); } return solution; } catch (SecurityException | CancelException | IOException | OutOfMemoryError | NoSuchMethodException e) { e.printStackTrace(); Assert.assertTrue(e.getMessage(), false); } return null; } @Test public void testFieldAccess(){ test(miniatur, SRC_DATA_LITTLE, Little.class, "testFieldAccess", true); } @Test public void testMyLinkedList1(){ test(miniatur, SRC_DATA_LITTLE, Little.class, "testMyLinkedList1", false); } @Test public void testMyLinkedList2(){ test(miniatur, SRC_DATA_LITTLE, Little.class, "testMyLinkedList2", true); } @Test public void testMyLinkedList3(){ test(miniatur, SRC_DATA_LITTLE, Little.class, "testMyLinkedList3", true); } @Test public void testEquals(){ test(miniatur, SRC_DATA_LITTLE, Little.class, "testEquals", false); } @Test public void testEquals1(){ test(miniatur, SRC_DATA_LITTLE, Little.class, "testEquals1", false); } @Test public void testEquals2(){ test(miniatur, SRC_DATA_LITTLE, Little.class, "testEquals2", false); } @Test public void testIrrelevant(){ test(miniatur, SRC_DATA_LITTLE, Little.class, "testIrrelevant", false); } @Test public void testObjectHashCodeCall(){ test(miniatur, SRC_DATA_LITTLE, Little.class, "testObjectHashCodeCall", true); } @Test public void testObjectHashCodeCall1(){ test(miniatur, SRC_DATA_LITTLE, Little.class, "testObjectHashCodeCall1", true); } @Test public void testObjectHashCodeCall2(){ test(miniatur, SRC_DATA_LITTLE, Little.class, "testObjectHashCodeCall2", true); } @Test public void testConstructorSubclass(){ test(miniatur, SRC_DATA_LITTLE, Little.class, "testConstructorSubclass", false); } @Test public void testCell1(){ test(miniatur, SRC_DATA_LITTLE, Little.class, "testCell1", false); } @Test public void testCell2(){ test(miniatur, SRC_DATA_LITTLE, Little.class, "testCell2", true); } @Test public void testIntFields0(){ test(miniatur, SRC_DATA_LITTLE, Little.class, "testIntFields0", false); } @Test public void testIntFields1(){ test(miniatur, SRC_DATA_LITTLE, Little.class, "testIntFields1", false); } @Test public void testIntFields2(){ test(miniatur, SRC_DATA_LITTLE, Little.class, "testIntFields2", true); } @Test public void testMyArrayList1(){ test(miniatur, SRC_DATA_LITTLE, Little.class, "testMyArrayList1", false); } @Test public void testMyArrayList2(){ test(miniatur, SRC_DATA_LITTLE, Little.class, "testMyArrayList2", true); } @Test public void testMyArrayList3(){ test(miniatur, SRC_DATA_LITTLE, Little.class, "testMyArrayList3", false); } @Test public void testMyArrayList4(){ test(miniatur, SRC_DATA_LITTLE, Little.class, "testMyArrayList4", false); } @Test public void testMyArrayList5(){ test(miniatur, SRC_DATA_LITTLE, Little.class, "testMyArrayList5", false); } @Test public void testMyArrayList6(){ test(miniatur, SRC_DATA_LITTLE, Little.class, "testMyArrayList6", false); } @Test public void testMyArrayList7(){ test(miniatur, SRC_DATA_LITTLE, Little.class, "testMyArrayList7", false); } @Test public void testFields(){ test(miniatur, SRC_DATA_LITTLE, Little.class, "testFields", false); } @Test public void testArrayWrite1(){ test(miniatur, SRC_DATA_LITTLE, Little.class, "testArrayWrite1", false); } @Test public void testArrayWrite2(){ test(miniatur, SRC_DATA_LITTLE, Little.class, "testArrayWrite2", true); } @Test public void testArrayWrite3(){ test(miniatur, SRC_DATA_LITTLE, Little.class, "testArrayWrite3", false); } @Test public void testArrayWrite4(){ test(miniatur, SRC_DATA_LITTLE, Little.class, "testArrayWrite4", true); } @Test public void testArrayWrite5(){ test(miniatur, SRC_DATA_LITTLE, Little.class, "testArrayWrite5", true); } @Test public void testArrayWrite6(){ test(miniatur, SRC_DATA_LITTLE, Little.class, "testArrayWrite6", false); } @Test public void testArrayWrite7(){ test(miniatur, SRC_DATA_LITTLE, Little.class, "testArrayWrite7", true); } @Test public void testArrayWrite8(){ test(miniatur, SRC_DATA_LITTLE, Little.class, "testArrayWrite8", false); } @Test public void testArrayWrite9(){ test(miniatur, SRC_DATA_LITTLE, Little.class, "testArrayWrite9", true); } @Test public void testArrayWrite10(){ test(miniatur, SRC_DATA_LITTLE, Little.class, "testArrayWrite10", true); } @Test public void testArrayWrite11(){ test(miniatur, SRC_DATA_LITTLE, Little.class, "testArrayWrite11", true); } @Test public void testArrayCopy1(){ test(miniatur, SRC_DATA_LITTLE, Little.class, "testArrayCopy1", false); } @Test public void testArrayAssign(){ test(miniatur, SRC_DATA_LITTLE, Little.class, "testArrayAssign", false); } @Test public void testArrayParam(){ test(miniatur, SRC_DATA_LITTLE, Little.class, "testArrayParam", false); } @Test public void testArrayParam1(){ test(miniatur, SRC_DATA_LITTLE, Little.class, "testArrayParam1", true); } @Test public void testArrayParam2(){ test(miniatur, SRC_DATA_LITTLE, Little.class, "testArrayParam2", false); } @Test public void testArrayParam3(){ test(miniatur, SRC_DATA_LITTLE, Little.class, "testArrayParam3", false); } @Test public void testArrayParam4(){ test(miniatur, SRC_DATA_LITTLE, Little.class, "testArrayParam4", true); } @Test public void testFieldParam(){ test(miniatur, SRC_DATA_LITTLE, Little.class, "testFieldParam", false); } @Test public void testArrayCopy2(){ test(miniatur, SRC_DATA_LITTLE, Little.class, "testArrayCopy2", false); } @Test public void testNestedIfs(){ test(miniatur, SRC_DATA_LITTLE, Little.class, "testNestedIfs", true); } @Test public void testStatic() { test(miniatur, SRC_DATA_LITTLE, Little.class, "testStatic", true); } @Test public void testStaticBoolean(){ test(miniatur, SRC_DATA_LITTLE, Little.class, "testStaticBoolean", false); } @Test public void testStaticInt(){ test(miniatur, SRC_DATA_LITTLE, Little.class, "testStaticInt", false); } @Test public void testStaticInt0(){ test(miniatur, SRC_DATA_LITTLE, Little.class, "testStaticInt0", false); } @Test public void testStaticObject(){ test(miniatur, SRC_DATA_LITTLE, Little.class, "testStaticObject", false); } @Test public void testArray() { test(miniatur, SRC_DATA_LITTLE, Little.class, "testArray", false); } @Test public void testArray1() { test(miniatur, SRC_DATA_LITTLE, Little.class, "testArray1", true); } @Test public void testInts() { Solution sol = test(miniatur, SRC_DATA_LITTLE, Little.class, "testInts", true); Instance instance = sol.instance(); Evaluator evaluator = new Evaluator(instance, miniatur.options().kodkodOptions()); int x = 0; int y = 0; int z = 0; for(Relation R: instance.relations()){ if (R.name().equals("testInts_arg1")) x = evaluator.evaluate(R.sum()); else if (R.name().equals("testInts_arg2")) y = evaluator.evaluate(R.sum()); else if (R.name().equals("testInts_arg3")) z = evaluator.evaluate(R.sum()); } System.out.println("x = " + x + " y = " + y + " z = " + z); assert x > y && y > z; } @Test public void testLoop() { test(miniatur, SRC_DATA_LITTLE, Little.class, "testLoop", false); } @Test public void testLoop1(){ test(miniatur, SRC_DATA_LITTLE, Little.class, "testLoop1", true); } @Test public void testList(){ test(miniatur, SRC_DATA_LITTLE, Little.class, "testList", false); } @Test public void testCell(){ test(miniatur, SRC_DATA_LITTLE, Little.class, "testCell", false); } @Test public void testListRemoveOther(){ test(miniatur, SRC_DATA_LITTLE, Little.class, "testListRemoveOther", false); } @Test public void testListRemoveFirst(){ test(miniatur, SRC_DATA_LITTLE, Little.class, "testListRemoveFirst", false); } @Test public void testListRemoveCounter(){ test(miniatur, SRC_DATA_LITTLE, Little.class, "testListRemoveCounter", true); } @Test public void testSimpleFields(){ test(miniatur, SRC_DATA_LITTLE, Little.class, "testSimpleFields", false); } }