//
// Copyright (C) 2006 United States Government as represented by the
// Administrator of the National Aeronautics and Space Administration
// (NASA). All Rights Reserved.
//
// This software is distributed under the NASA Open Source Agreement
// (NOSA), version 1.3. The NOSA has been approved by the Open Source
// Initiative. See the file NOSA-1.3-JPF at the top of the distribution
// directory tree for the complete NOSA document.
//
// THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY OF ANY
// KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, BUT NOT
// LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM TO
// SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR
// A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT
// THE SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT
// DOCUMENTATION, IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE.
//
package gov.nasa.jpf.test.mc.data;
import java.io.File;
import java.io.Serializable;
import java.util.ArrayList;
import org.junit.After;
import org.junit.Test;
import gov.nasa.jpf.util.test.TestJPF;
import gov.nasa.jpf.vm.Verify;
/**
*
* @author Ivan Mushketik
*/
@SuppressWarnings("serial")
public class ObjectStreamTest extends TestJPF {
static String osFileName = "file";
@After
public void deleteFile(){
File osFile = new File(osFileName);
if (osFile.exists()) {
osFile.delete();
}
}
@Test
public void testWriteReadInteger() {
if (!isJPFRun()) {
Verify.writeObjectToFile(new Integer(123), osFileName);
}
if (verifyNoPropertyViolation()) {
Integer i = Verify.readObjectFromFile(Integer.class, osFileName);
assert i == 123;
}
}
@Test
public void testWriteReadString() {
if (!isJPFRun()) {
Verify.writeObjectToFile(new String("hello"), osFileName);
}
if (verifyNoPropertyViolation()) {
String s = Verify.readObjectFromFile(String.class, osFileName);
assert s.equals("hello");
}
}
static class Sup implements Serializable {
int s;
}
static class Inherited extends Sup{
int i;
}
@Test
public void testWriteReadInheritedClass() {
if (!isJPFRun()) {
Inherited inh = new Inherited();
inh.s = 1;
inh.i = 2;
Verify.writeObjectToFile(inh, osFileName);
}
if (verifyNoPropertyViolation("+jpf-core.native_classpath+=;${jpf-core}/build/tests")) {
Inherited inh = Verify.readObjectFromFile(Inherited.class, osFileName);
assert inh.s == 1;
assert inh.i == 2;
}
}
static class WithTransient implements Serializable {
int i;
transient int t;
}
@Test
public void testWriteReadTransientField() {
if (!isJPFRun()) {
WithTransient wt = new WithTransient();
wt.i = 10;
wt.t = 10;
Verify.writeObjectToFile(wt, osFileName);
}
if (verifyNoPropertyViolation("+jpf-core.native_classpath+=;${jpf-core}/build/tests")) {
WithTransient wt = Verify.readObjectFromFile(WithTransient.class, osFileName);
assert wt.i == 10;
// t is transient
assert wt.t == 0;
}
}
class SerializableArrayList<T> extends ArrayList<T> implements Serializable {}
@Test
public void testWriteReadArrayList() {
if (!isJPFRun()) {
ArrayList<Integer> al = new ArrayList<>();
al.add(1);
al.add(2);
al.add(3);
Verify.writeObjectToFile(al, osFileName);
}
if (verifyNoPropertyViolation()) {
ArrayList<?> al = Verify.readObjectFromFile(ArrayList.class, osFileName);
assert al.size() == 3;
assert al.get(0).equals(1);
assert al.get(1).equals(2);
assert al.get(2).equals(3);
}
}
static class MultiDimArr implements Serializable {
int arr [][];
}
@Test
public void tsetWriteReadObjectWithMultiDimArray() {
if (!isJPFRun()) {
MultiDimArr mda = new MultiDimArr();
mda.arr = new int[2][];
mda.arr[0] = new int[3];
mda.arr[1] = new int[3];
mda.arr[0][0] = 1;
mda.arr[0][1] = 2;
mda.arr[0][2] = 3;
mda.arr[1][0] = 4;
mda.arr[1][1] = 5;
mda.arr[1][2] = 6;
Verify.writeObjectToFile(mda, osFileName);
}
if (verifyNoPropertyViolation("+jpf-core.native_classpath+=;${jpf-core}/build/tests")) {
MultiDimArr mda = Verify.readObjectFromFile(MultiDimArr.class, osFileName);
System.out.println(mda.arr[0][0]);
assert mda.arr[0][0] == 1;
assert mda.arr[0][1] == 2;
assert mda.arr[0][2] == 3;
assert mda.arr[1][0] == 4;
assert mda.arr[1][1] == 5;
assert mda.arr[1][2] == 6;
}
}
static class Inner implements Serializable {
int i;
}
static class Outer implements Serializable {
Inner inner;
int o;
}
@Test
public void testReadWriteObjectWithReference() {
if (!isJPFRun()) {
Outer out = new Outer();
out.o = 1;
out.inner = new Inner();
out.inner.i = 2;
Verify.writeObjectToFile(out, osFileName);
}
if (verifyNoPropertyViolation("+jpf-core.native_classpath+=;${jpf-core}/build/tests")) {
Outer out = Verify.readObjectFromFile(Outer.class, osFileName);
assert out.o == 1;
assert out.inner.i == 2;
}
}
}