package org.jmlspecs.openjmltest.testcases;
import static org.junit.Assert.fail;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import org.jmlspecs.openjmltest.RacBase;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
/** These tests check running RAC on files in the file system, comparing the
* output against expected files. These tests are a bit easier to create, since
* the file and output do not have to be converted into Strings; however, they
* are not as easily read, since the content is tucked away in files, rather
* than immediately there in the test class.
* <P>
* To add a new test:
* <UL>
* <LI> create a directory containing the test files as a subdirectory of
* 'test'
* <LI> add a test to this class - typically named similarly to the folder
* containing the source data
* </UL>
*/
public class racfiles extends RacBase {
@Override
@Before
public void setUp() throws Exception {
setUpForFiles();
super.setUp();
}
/** Testing without using system specs */
@Test
public void test1() {
expectedExit = 0;
expectedRACExit = 0;
helpTCF("test/rac1","test/rac1","Bug1","-noInternalSpecs");
}
/** Testing using system specs */
@Test // FIXME - problems with library specs - RAC cannot handle ghost variables when it does not compile the class file
public void test1a() {
expectedExit = 0;
expectedRACExit = 0;
helpTCF("test/rac1a","test/rac1a","Bug1");
}
@Test // Originally a Stack overflow because of recursive check of invariant
public void testBug1() {
expectedExit = 0;
expectedRACExit = 1;
helpTCF("test/racbug1","test/racbug1","Add");
}
@Test // Originally a Stack overflow because of recursive check of invariant
public void testBugStackTrace() {
expectedExit = 0;
helpTCF("test/racStackTrace","test/racStackTrace","CantCompileRAC");
}
@Test // Originally crashed because of a model method in a library class
public void testPoint() {
expectedExit = 0;
helpTCF("test/racPoint","test/racPoint","Point","-quiet");
}
@Test // Originally crashed because of a model method in a library class
public void testPoint2() {
expectedExit = 0;
helpTCF("test/racPoint2","test/racPoint2","Point");
}
@Test
public void testFirstTest() {
expectedExit = 0;
helpTCF("test/firstTest","test/firstTest","FirstTest","-racJavaChecks","-racCheckAssumptions");
}
@Test
public void testUniqueList() {
expectedExit = 0;
helpTCF("test/uniqueList","test/uniqueList","UniqueList","-racJavaChecks","-racCheckAssumptions");
}
@Test
public void testUniqueList1() {
expectedExit = 0;
helpTCF("test/uniqueListBug1","test/uniqueListBug1","UniqueListBug1","-racJavaChecks","-racCheckAssumptions");
}
@Test
public void testUniqueList2() {
expectedExit = 0;
helpTCF("test/uniqueListBug2","test/uniqueListBug2","UniqueListBug2");
}
@Test
public void testDecimal() {
expectedExit = 0;
helpTCF("test/sv_rac","test/sv_rac","sv_rac/Decimal");
}
@Test
public void testDecimal2() {
expectedExit = 0;
helpTCF("test/sv_rac_mod","test/sv_rac_mod","sv_rac/Decimal");
}
@Test
public void testbigint() {
expectedExit = 0;
helpTCF("test/racbigint","test/racbigint","bigint");
}
@Test
public void testreal() {
expectedExit = 0;
helpTCF("test/racreal","test/racreal","real");
}
@Test
public void demoStudent() {
expectedExit = 0;
helpTCF(OpenJMLDemoPath + "/src/openjml/student","test/demoStudent","ExecuteCStudent2","-racJavaChecks","-racCheckAssumptions");
}
@Test
public void testECU() {
expectedExit = 0;
helpTCF(OpenJMLDemoPath + "/src/openjml/ecudemo","test/ecurac","Test","-racJavaChecks","-racCheckAssumptions");
}
@Test
public void purseCardTest() {
expectedExit = 0;
helpTCF(OpenJMLDemoPath + "/src/openjml/purse","test/purse","CardTest");
}
@Test
public void purseModTest() {
expectedExit = 0;
helpTCF(OpenJMLDemoPath + "/src/openjml/purseMod","test/purseMod","CardTest");
}
@Test
public void racTime() {
expectedExit = 0;
helpTCF(OpenJMLDemoPath + "/src/openjml/demo/Time.java","test/racTime","Time");
}
@Test
public void racQueue() {
expectedExit = 0;
helpTCF(OpenJMLDemoPath + "/src/openjml/demo/Queue.java","test/racQueue","Queue");
}
@Test
public void racAddng() {
rac = new String[]{jdk, "-classpath","bin"+z+"../OpenJML/bin-runtime"+z+"testdata"+z+"test/racaddng/jmlunitng.jar",null};
expectedExit = 0;
helpTCF("test/racaddng/Add_InstanceStrategy.java","test/racaddng","Add_JML_Test","-cp","../OpenJML/bin-runtime"+z+"test/racaddng"+z+"test/racaddng/jmlunitng.jar","-jmltesting");
}
@Test
public void racAddngall() {
rac = new String[]{jdk, "-classpath","bin"+z+"../OpenJML/bin-runtime"+z+"testdata"+z+"test/racaddng/jmlunitng.jar",null};
expectedExit = 0;
helpTCF("test/racaddng","test/racaddngall","Add_JML_Test","-cp","../OpenJML/bin-runtime"+z+"test/racaddngall"+z+"test/racaddng"+z+"test/racaddng/jmlunitng.jar","-jmltesting");
}
@Test
public void racNoModel() {
rac = new String[]{jdk, "-classpath","bin"+z+"../OpenJML/bin-runtime"+z+"testdata"+z+"test/racaddng/jmlunitng.jar",null};
expectedExit = 0;
helpTCF("test/racNoModel","test/racNoModel","NoModelTest","-racMissingModelFieldRepSource=skip");
}
@Test
public void racMainActivity() {
runrac = false; // FIXME: Don't try running executable until we supply some input
//rac = new String[]{jdk, "-classpath","bin"+z+"bin-runtime"+z+"testdata"+z+"test/racaddng/jmlunitng.jar",null};
expectedExit = 0;
helpTCF("test/racMainActivity","test/racMainActivity","MainActivity");
}
@Test
public void racMainActivityMicro() {
expectedExit = 0;
helpTCF("test/racMainActivityMicro","test/racMainActivityMicro","CharAt");
}
@Test // FIXME - should we allow and compensate for \result in an \old environment
public void racOld() {
expectedExit = 1;
runrac = false;
helpTCF("test/racold","test/racold","ArrayExample");
}
@Test
public void racHans4() {
expectedRACExit = 1;
rac = new String[]{jdk, "-ea", "-classpath","../OpenJML/bin"+z+"../OpenJML/bin-runtime"+z+"testdata","-Dorg.jmlspecs.openjml.racexceptions=true","-Dorg.jmlspecs.openjml.racjavaassert=true","-Dorg.jmlspecs.openjml.racshowstack=false","StorageParameters"};
helpTCF("test/racHansStorage/StorageParameters.java","test/racHansStorage","StorageParameters","-racCheckAssumptions","-specspath=test/racHansStorage");
rac = null;
}
@Test
public void racHans4a() {
expectedRACExit = 0;
rac = new String[]{jdk, "-ea", "-classpath","../OpenJML/bin"+z+"../OpenJML/bin-runtime"+z+"testdata","-Dorg.jmlspecs.openjml.racexceptions=true","-Dorg.jmlspecs.openjml.racjavaassert=true","-Dorg.jmlspecs.openjml.racshowstack=false","StorageParameters"};
helpTCF("test/racHansStorage/StorageParameters.java","test/racHansStorageA","StorageParameters","-racCheckAssumptions","-specspath=test/racHansStorage","-nullableByDefault");
rac = null;
}
@Test
public void racHans4b() {
expectedRACExit = 1;
rac = new String[]{jdk, "-ea", "-classpath","../OpenJML/bin"+z+"../OpenJML/bin-runtime"+z+"testdata","-Dorg.jmlspecs.openjml.racexceptions=true","-Dorg.jmlspecs.openjml.racjavaassert=true","-Dorg.jmlspecs.openjml.racshowstack=false","StorageParameters"};
helpTCF("test/racHansStorageB/StorageParameters.java","test/racHansStorageB","StorageParameters","-racCheckAssumptions","-specspath=test/racHansStorageB");
rac = null;
}
@Test // Bug in that some annotations had to be in the .java file, not the .jml, fixed
public void racHans4c() {
expectedRACExit = 0;
rac = new String[]{jdk, "-ea", "-classpath","../OpenJML/bin"+z+"../OpenJML/bin-runtime"+z+"testdata","-Dorg.jmlspecs.openjml.racexceptions=true","-Dorg.jmlspecs.openjml.racjavaassert=true","-Dorg.jmlspecs.openjml.racshowstack=false","StorageParameters"};
helpTCF("test/racHansStorageC/StorageParameters.java","test/racHansStorageC","StorageParameters","-racCheckAssumptions","-specspath=test/racHansStorageC");
rac = null;
}
@Test // Bug in that import statements must be in .java files, not .jml // FIXME - partially fixed - .jml imports are merged into .java imports
public void racHans4d() {
expectedRACExit = 0;
rac = new String[]{jdk, "-ea", "-classpath","../OpenJML/bin"+z+"../OpenJML/bin-runtime"+z+"testdata","-Dorg.jmlspecs.openjml.racexceptions=true","-Dorg.jmlspecs.openjml.racjavaassert=true","-Dorg.jmlspecs.openjml.racshowstack=false","StorageParameters"};
helpTCF("test/racHansStorageD/StorageParameters.java","test/racHansStorageD","StorageParameters","-racCheckAssumptions","-specspath=test/racHansStorageD");
rac = null;
}
@Test
public void racHansE() {
runrac = false;
helpTCF("test/hans/OpenJMLTest/src/javax/safetycritical/test/safelet/TckTestSafelet2.java",
"test/hans",
null,
"-cp","test/hans/OpenJMLTest/src"+z+"test/hans/icecapSDK/bin",
"-rac",
"-specspath","test/hans/OpenJMLTest/specs",
"-racCheckAssumptions","-racJavaChecks","-showNotImplemented","-noInternalSpecs","-nullableByDefault"
);
}
@Test
public void racHans2() {
rac = new String[]{jdk, "-ea", "-classpath","../OpenJML/bin"+z+"../OpenJML/bin-runtime"+z+"testdata"+z+"test/hans/OpenJMLTest/bin;test/hans/icecapSDK/bin",null};
runrac = true;
helpTCF("test/racHans2/account",
"test/racHans2",
"account.AllTests",
"-cp","test/hans/OpenJMLTest/bin"+z+"test/hans/icecapSDK/bin"+z+"test/racHans2",
//"-rac",
"-specspath","test/racHans2/specs",
"-racCheckAssumptions","-racJavaChecks","-showNotImplemented","-noInternalSpecs","-nullableByDefault"
);
}
@Ignore // FIXME - no longer tests for absence of ghost field
@Test // FIXME - make platform independent and remove use of -jmltesting - but also has added a stack trace
public void racNoGhostField() {
expectedRACExit = 0;
helpTCF("test/racNoGhostField","test/racNoGhostField","Magic","-jmltesting");
}
@Test
public void sfbug413() {
expectedRACExit = 0;
helpTCF("test/sfbug413","test/sfbug413","Main");
}
@Test
public void sfbug402() {
expectedRACExit = 0;
runrac = false;
helpTCF("test/sfbug402","test/sfbug402","Main");
}
@Test
public void sfbug420() {
expectedRACExit = 0;
helpTCF("test/sfbug420","test/sfbug420","stack.StackImpl");
}
@Test
public void sfbug396() {
expectedRACExit = 0;
runrac = false;
helpTCF("test/sfbug396","test/sfbug396","Main");
}
}