/*
* Quasar: lightweight threads and actors for the JVM.
* Copyright (c) 2013-2014, Parallel Universe Software Co. All rights reserved.
*
* This program and the accompanying materials are dual-licensed under
* either the terms of the Eclipse Public License v1.0 as published by
* the Eclipse Foundation
*
* or (per the licensee's choosing)
*
* under the terms of the GNU Lesser General Public License version 3.0
* as published by the Free Software Foundation.
*/
package co.paralleluniverse.data.record;
import co.paralleluniverse.common.test.TestUtil;
import org.hamcrest.Matcher;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;
import org.junit.Test;
import org.junit.runner.RunWith;
import co.paralleluniverse.data.record.Field.*;
import java.util.Random;
import org.junit.Rule;
import org.junit.rules.TestName;
import org.junit.rules.TestRule;
/**
*
* @author pron
*/
//@RunWith(org.mockito.runners.MockitoJUnitRunner.class) //VerboseMockitoJUnitRunner.class)
public class SimpleRecordTest {
@Rule
public TestName name = new TestName();
@Rule
public TestRule watchman = TestUtil.WATCHMAN;
private static final Random rand = new Random();
public SimpleRecordTest() {
}
@Before
public void setUp() {
}
private static class A {
private boolean a;
private byte b;
private short c;
private int d;
private long e;
private float f;
private double g;
private char h;
private String str;
private boolean[] aa;
private byte[] ba;
private short[] ca;
private int[] da;
private long[] ea;
private float[] fa;
private double[] ga;
private char[] ha;
private String[] stra;
public A() {
a = rand.nextBoolean();
b = (byte) rand.nextInt();
c = (short) rand.nextInt();
d = rand.nextInt();
e = rand.nextLong();
f = rand.nextFloat();
g = rand.nextDouble();
h = (char) rand.nextInt();
str = "foo";
aa = new boolean[1];
ba = new byte[2];
ca = new short[3];
da = new int[4];
ea = new long[5];
fa = new float[6];
ga = new double[7];
ha = new char[8];
stra = new String[]{"hello", "world"};
for (int i = 0; i < aa.length; i++)
aa[i] = rand.nextBoolean();
for (int i = 0; i < ba.length; i++)
ba[i] = (byte) rand.nextInt();
for (int i = 0; i < ca.length; i++)
ca[i] = (short) rand.nextInt();
for (int i = 0; i < da.length; i++)
da[i] = rand.nextInt();
for (int i = 0; i < ea.length; i++)
ea[i] = rand.nextLong();
for (int i = 0; i < fa.length; i++)
fa[i] = rand.nextFloat();
for (int i = 0; i < ga.length; i++)
ga[i] = rand.nextDouble();
for (int i = 0; i < ha.length; i++)
ha[i] = (char) rand.nextInt();
}
}
private static final RecordType<A> rt = RecordType.newType(A.class);
private static final BooleanField<A> $a = rt.booleanField("a");
private static final ByteField<A> $b = rt.byteField("b");
private static final ShortField<A> $c = rt.shortField("c");
private static final IntField<A> $d = rt.intField("d");
private static final LongField<A> $e = rt.longField("e");
private static final FloatField<A> $f = rt.floatField("f");
private static final DoubleField<A> $g = rt.doubleField("g");
private static final CharField<A> $h = rt.charField("h");
private static final ObjectField<A, String> $str = rt.objectField("str", String.class);
private static final BooleanArrayField<A> $aa = rt.booleanArrayField("aa", 1);
private static final ByteArrayField<A> $ba = rt.byteArrayField("ba", 2);
private static final ShortArrayField<A> $ca = rt.shortArrayField("ca", 3);
private static final IntArrayField<A> $da = rt.intArrayField("da", 4);
private static final LongArrayField<A> $ea = rt.longArrayField("ea", 5);
private static final FloatArrayField<A> $fa = rt.floatArrayField("fa", 6);
private static final DoubleArrayField<A> $ga = rt.doubleArrayField("ga", 7);
private static final CharArrayField<A> $ha = rt.charArrayField("ha", 8);
private static final ObjectArrayField<A, String> $stra = rt.objectArrayField("stra", String.class, 2);
@After
public void tearDown() {
}
//////////// General //////////////////
@Test
public void test1() {
A a = new A();
Record<A> r = rt.newInstance();
r.set($a, a.a);
r.set($b, a.b);
r.set($c, a.c);
r.set($d, a.d);
r.set($e, a.e);
r.set($f, a.f);
r.set($g, a.g);
r.set($h, a.h);
r.set($str, a.str);
for (int i = 0; i < $aa.length; i++)
r.set($aa, i, a.aa[i]);
for (int i = 0; i < $ba.length; i++)
r.set($ba, i, a.ba[i]);
for (int i = 0; i < $ca.length; i++)
r.set($ca, i, a.ca[i]);
for (int i = 0; i < $da.length; i++)
r.set($da, i, a.da[i]);
for (int i = 0; i < $ea.length; i++)
r.set($ea, i, a.ea[i]);
for (int i = 0; i < $fa.length; i++)
r.set($fa, i, a.fa[i]);
for (int i = 0; i < $ga.length; i++)
r.set($ga, i, a.ga[i]);
for (int i = 0; i < $ha.length; i++)
r.set($ha, i, a.ha[i]);
for (int i = 0; i < $stra.length; i++)
r.set($stra, i, a.stra[i]);
assertThat(r.get($a), equalTo(a.a));
assertThat(r.get($b), equalTo(a.b));
assertThat(r.get($c), equalTo(a.c));
assertThat(r.get($d), equalTo(a.d));
assertThat(r.get($e), equalTo(a.e));
assertThat(r.get($f), equalTo(a.f));
assertThat(r.get($g), equalTo(a.g));
assertThat(r.get($h), equalTo(a.h));
assertThat(r.get($str), equalTo(a.str));
for (int i = 0; i < $aa.length; i++)
assertThat(r.get($aa, i), equalTo(a.aa[i]));
for (int i = 0; i < $ba.length; i++)
assertThat(r.get($ba, i), equalTo(a.ba[i]));
for (int i = 0; i < $ca.length; i++)
assertThat(r.get($ca, i), equalTo(a.ca[i]));
for (int i = 0; i < $da.length; i++)
assertThat(r.get($da, i), equalTo(a.da[i]));
for (int i = 0; i < $ea.length; i++)
assertThat(r.get($ea, i), equalTo(a.ea[i]));
for (int i = 0; i < $fa.length; i++)
assertThat(r.get($fa, i), equalTo(a.fa[i]));
for (int i = 0; i < $aa.length; i++)
assertThat(r.get($ga, i), equalTo(a.ga[i]));
for (int i = 0; i < $ha.length; i++)
assertThat(r.get($ha, i), equalTo(a.ha[i]));
for (int i = 0; i < $stra.length; i++)
assertThat(r.get($stra, i), equalTo(a.stra[i]));
boolean[] aa = new boolean[1];
byte[] ba = new byte[2];
short[] ca = new short[3];
int[] da = new int[4];
long[] ea = new long[5];
float[] fa = new float[6];
double[] ga = new double[7];
char[] ha = new char[8];
String[] stra = new String[2];
r.get($aa, aa, 0);
r.get($ba, ba, 0);
r.get($ca, ca, 0);
r.get($da, da, 0);
r.get($ea, ea, 0);
r.get($fa, fa, 0);
r.get($ga, ga, 0);
r.get($ha, ha, 0);
r.get($stra, stra, 0);
assertThat(aa, equalTo(a.aa));
assertThat(ba, equalTo(a.ba));
assertThat(ca, equalTo(a.ca));
assertThat(da, equalTo(a.da));
assertThat(ea, equalTo(a.ea));
assertThat(fa, equalTo(a.fa));
assertThat(ga, equalTo(a.ga));
assertThat(ha, equalTo(a.ha));
assertThat(stra, equalTo(a.stra));
}
@Test
public void test2() {
A a = new A();
Record<A> r = rt.newInstance();
r.set($aa, a.aa, 0);
r.set($ba, a.ba, 0);
r.set($ca, a.ca, 0);
r.set($da, a.da, 0);
r.set($ea, a.ea, 0);
r.set($fa, a.fa, 0);
r.set($ga, a.ga, 0);
r.set($ha, a.ha, 0);
r.set($stra, a.stra, 0);
boolean[] aa = new boolean[1];
byte[] ba = new byte[2];
short[] ca = new short[3];
int[] da = new int[4];
long[] ea = new long[5];
float[] fa = new float[6];
double[] ga = new double[7];
char[] ha = new char[8];
String[] stra = new String[2];
r.get($aa, aa, 0);
r.get($ba, ba, 0);
r.get($ca, ca, 0);
r.get($da, da, 0);
r.get($ea, ea, 0);
r.get($fa, fa, 0);
r.get($ga, ga, 0);
r.get($ha, ha, 0);
r.get($stra, stra, 0);
assertThat(aa, equalTo(a.aa));
assertThat(ba, equalTo(a.ba));
assertThat(ca, equalTo(a.ca));
assertThat(da, equalTo(a.da));
assertThat(ea, equalTo(a.ea));
assertThat(fa, equalTo(a.fa));
assertThat(ga, equalTo(a.ga));
assertThat(ha, equalTo(a.ha));
assertThat(stra, equalTo(a.stra));
}
@Test
public void testArrayOutOfBounds() {
A a = new A();
Record<A> r = rt.newInstance();
try {
r.get($aa, -1);
fail();
} catch (ArrayIndexOutOfBoundsException e) {
}
try {
r.get($aa, 1);
fail();
} catch (ArrayIndexOutOfBoundsException e) {
}
try {
r.set($aa, -1, false);
fail();
} catch (ArrayIndexOutOfBoundsException e) {
}
try {
r.set($aa, 1, false);
fail();
} catch (ArrayIndexOutOfBoundsException e) {
}
try {
r.get($ba, -1);
fail();
} catch (ArrayIndexOutOfBoundsException e) {
}
try {
r.get($ba, 2);
fail();
} catch (ArrayIndexOutOfBoundsException e) {
}
try {
r.set($ba, -1, (byte) 0);
fail();
} catch (ArrayIndexOutOfBoundsException e) {
}
try {
r.set($ba, 2, (byte) 0);
fail();
} catch (ArrayIndexOutOfBoundsException e) {
}
try {
r.get($ca, -1);
fail();
} catch (ArrayIndexOutOfBoundsException e) {
}
try {
r.get($ca, 3);
fail();
} catch (ArrayIndexOutOfBoundsException e) {
}
try {
r.set($ca, -1, (short) 0);
fail();
} catch (ArrayIndexOutOfBoundsException e) {
}
try {
r.set($ca, 3, (short) 0);
fail();
} catch (ArrayIndexOutOfBoundsException e) {
}
try {
r.get($da, -1);
fail();
} catch (ArrayIndexOutOfBoundsException e) {
}
try {
r.get($da, 4);
fail();
} catch (ArrayIndexOutOfBoundsException e) {
}
try {
r.set($da, -1, 0);
fail();
} catch (ArrayIndexOutOfBoundsException e) {
}
try {
r.set($da, 4, 0);
fail();
} catch (ArrayIndexOutOfBoundsException e) {
}
try {
r.get($ea, -1);
fail();
} catch (ArrayIndexOutOfBoundsException e) {
}
try {
r.get($ea, 5);
fail();
} catch (ArrayIndexOutOfBoundsException e) {
}
try {
r.set($ea, -1, 0);
fail();
} catch (ArrayIndexOutOfBoundsException e) {
}
try {
r.set($ea, 5, 0);
fail();
} catch (ArrayIndexOutOfBoundsException e) {
}
try {
r.get($fa, -1);
fail();
} catch (ArrayIndexOutOfBoundsException e) {
}
try {
r.get($fa, 6);
fail();
} catch (ArrayIndexOutOfBoundsException e) {
}
try {
r.set($fa, -1, 0);
fail();
} catch (ArrayIndexOutOfBoundsException e) {
}
try {
r.set($fa, 6, 0);
fail();
} catch (ArrayIndexOutOfBoundsException e) {
}
try {
r.get($ga, -1);
fail();
} catch (ArrayIndexOutOfBoundsException e) {
}
try {
r.get($ga, 7);
fail();
} catch (ArrayIndexOutOfBoundsException e) {
}
try {
r.set($ga, -1, 0);
fail();
} catch (ArrayIndexOutOfBoundsException e) {
}
try {
r.set($ga, 7, 0);
fail();
} catch (ArrayIndexOutOfBoundsException e) {
}
try {
r.get($ha, -1);
fail();
} catch (ArrayIndexOutOfBoundsException e) {
}
try {
r.get($ha, 8);
fail();
} catch (ArrayIndexOutOfBoundsException e) {
}
try {
r.set($ha, -1, 'x');
fail();
} catch (ArrayIndexOutOfBoundsException e) {
}
try {
r.set($ha, 8, 'x');
fail();
} catch (ArrayIndexOutOfBoundsException e) {
}
try {
r.get($stra, -1);
fail();
} catch (ArrayIndexOutOfBoundsException e) {
}
try {
r.get($stra, 2);
fail();
} catch (ArrayIndexOutOfBoundsException e) {
}
try {
r.set($stra, -1, "x");
fail();
} catch (ArrayIndexOutOfBoundsException e) {
}
try {
r.set($stra, 2, "x");
fail();
} catch (ArrayIndexOutOfBoundsException e) {
}
}
}