/* * 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 static org.junit.Assume.*; import org.junit.Test; import org.junit.runner.RunWith; import co.paralleluniverse.data.record.Field.*; import java.util.Arrays; import java.util.Collection; import java.util.Random; import org.junit.Rule; import org.junit.rules.TestName; import org.junit.rules.TestRule; import org.junit.runners.Parameterized; /** * * @author pron */ @RunWith(Parameterized.class) public class DynamicRecordTest { @Rule public TestName name = new TestName(); @Rule public TestRule watchman = TestUtil.WATCHMAN; private static final Random rand = new Random(); private final RecordType.Mode mode; public DynamicRecordTest(RecordType.Mode mode) { this.mode = mode; } @Parameterized.Parameters public static Collection<Object[]> data() { return Arrays.asList(new Object[][]{ {RecordType.Mode.METHOD_HANDLE}, {RecordType.Mode.REFLECTION}, {RecordType.Mode.UNSAFE}, {RecordType.Mode.GENERATION},}); } @Before public void setUp() { } public static class A { public boolean a; public byte b; public short c; public int d; public long e; public float f; public double g; public char h; public String str; public boolean[] aa; public byte[] ba; public final short[] ca; public int[] da; public long[] ea; public final float[] fa; public double[] ga; public char[] ha; public String[] stra; public final boolean af; public final byte bf; public final short cf; public final int df; public final long ef; public final float ff; public final double gf; public final char hf; public final String strf; public int x; 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 < aa.length; i++) ga[i] = rand.nextDouble(); for (int i = 0; i < ha.length; i++) ha[i] = (char) rand.nextInt(); af = rand.nextBoolean(); bf = (byte) rand.nextInt(); cf = (short) rand.nextInt(); df = rand.nextInt(); ef = rand.nextLong(); ff = rand.nextFloat(); gf = rand.nextDouble(); hf = (char) rand.nextInt(); strf = "foof"; x = rand.nextInt(); } } public static class B extends A { public boolean isA() { return a; } public void setA(boolean a) { this.a = a; } public byte getB() { return (byte) (b + 1); } public void setB(byte b) { this.b = (byte) (b + 1); } public short getC() { return (short) (c + 1); } public void setC(short c) { this.c = (short) (c + 1); } public int getD() { return d + 1; } public void setD(int d) { this.d = d + 1; } public long getE() { return e + 1; } public void setE(long e) { this.e = e + 1; } public float getF() { return f + 1; } public void setF(float f) { this.f = f + 1; } public double getG() { return g + 1; } public void setG(double g) { this.g = g + 1; } public char getH() { return (char) (h + 1); } public void setH(char h) { this.h = (char) (h + 1); } public String getStr() { return str + "!"; } public void setStr(String str) { this.str = str + "!"; } public boolean getAa(int index) { return aa[index]; } public void setAa(int index, boolean a) { this.a = a; } public byte getBa(int index) { return (byte) (ba[index] + 1); } public void setBa(int index, byte b) { this.b = (byte) (b + 1); } public short getCa(int index) { return (short) (ca[index] + 1); } public void setCa(int index, short c) { this.c = (short) (c + 1); } public int getDa(int index) { return da[index] + 1; } public void setDa(int index, int d) { this.d = d + 1; } public long getEa(int index) { return ea[index] + 1; } public void setEa(int index, long e) { this.e = e + 1; } public float getFa(int index) { return fa[index] + 1; } public void setFa(int index, float f) { this.f = f + 1; } public double getGa(int index) { return ga[index] + 1; } public void setGa(int index, double g) { this.g = g + 1; } public char getHa(int index) { return (char) (ha[index] + 1); } public void setHa(int index, char h) { this.h = (char) (h + 1); } public String getStra(int index) { return stra[index] + "!"; } public void setStra(int index, String str) { stra[index] = str + "!"; } public int getX() { return x + 1; } } private final RecordType<A> rt = RecordType.newType(A.class); private final BooleanField<A> $a = rt.booleanField("a"); private final ByteField<A> $b = rt.byteField("b"); private final ShortField<A> $c = rt.shortField("c"); private final IntField<A> $d = rt.intField("d"); private final LongField<A> $e = rt.longField("e"); private final FloatField<A> $f = rt.floatField("f"); private final DoubleField<A> $g = rt.doubleField("g"); private final CharField<A> $h = rt.charField("h"); private final ObjectField<A, String> $str = rt.objectField("str", String.class); private final BooleanArrayField<A> $aa = rt.booleanArrayField("aa", 1); private final ByteArrayField<A> $ba = rt.byteArrayField("ba", 2); private final ShortArrayField<A> $ca = rt.shortArrayField("ca", 3); private final IntArrayField<A> $da = rt.intArrayField("da", 4); private final LongArrayField<A> $ea = rt.longArrayField("ea", 5); private final FloatArrayField<A> $fa = rt.floatArrayField("fa", 6); private final DoubleArrayField<A> $ga = rt.doubleArrayField("ga", 7); private final CharArrayField<A> $ha = rt.charArrayField("ha", 8); private final ObjectArrayField<A, String> $stra = rt.objectArrayField("stra", String.class, 2); private final BooleanField<A> $af = rt.booleanField("af"); private final ByteField<A> $bf = rt.byteField("bf"); private final ShortField<A> $cf = rt.shortField("cf"); private final IntField<A> $df = rt.intField("df"); private final LongField<A> $ef = rt.longField("ef"); private final FloatField<A> $ff = rt.floatField("ff"); private final DoubleField<A> $gf = rt.doubleField("gf"); private final CharField<A> $hf = rt.charField("hf"); private final ObjectField<A, String> $strf = rt.objectField("strf", String.class); private final IntField<A> $x = rt.intField("x"); @After public void tearDown() { } //////////// General ////////////////// @Test public void testSetDirectGetRecord() { A a = new A(); Record<A> r = rt.wrap(a, mode); 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)); assertThat(r.get($af), equalTo(a.af)); assertThat(r.get($bf), equalTo(a.bf)); assertThat(r.get($cf), equalTo(a.cf)); assertThat(r.get($df), equalTo(a.df)); assertThat(r.get($ef), equalTo(a.ef)); assertThat(r.get($ff), equalTo(a.ff)); assertThat(r.get($gf), equalTo(a.gf)); assertThat(r.get($hf), equalTo(a.hf)); assertThat(r.get($strf), equalTo(a.strf)); assertThat(r.get($x), equalTo(a.x)); 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 < $ga.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 defaultModeForAIsUnsafe() { assumeThat(mode, is(RecordType.Mode.METHOD_HANDLE)); A a = new A(); Record<A> r = rt.wrap(a); assertThat(r, instanceOf(DynamicUnsafeRecord.class)); rt.wrap(a, RecordType.Mode.UNSAFE); } @Test public void defaultModeForBIsGeneration() { assumeThat(mode, is(RecordType.Mode.METHOD_HANDLE)); A a = new B(); Record<A> r = rt.wrap(a); assertThat(r, instanceOf(DynamicGeneratedRecord.class)); rt.wrap(a, RecordType.Mode.GENERATION); } @Test public void whenUnsafeAndBeanThenThrowException() { assumeThat(mode, is(RecordType.Mode.UNSAFE)); try { A a = new B(); Record<A> r = rt.wrap(a, mode); fail(); } catch (Exception e) { } } @Test public void testSetDirectGetRecordBean() { assumeThat(mode, not(RecordType.Mode.UNSAFE)); A a = new B(); Record<A> r = rt.wrap(a, mode); assertThat(r.get($a), equalTo(a.a)); assertThat(r.get($b), equalTo((byte) (a.b + 1))); assertThat(r.get($c), equalTo((short) (a.c + 1))); assertThat(r.get($d), equalTo(a.d + 1)); assertThat(r.get($e), equalTo(a.e + 1)); assertThat(r.get($f), equalTo(a.f + 1)); assertThat(r.get($g), equalTo(a.g + 1)); assertThat(r.get($h), equalTo((char) (a.h + 1))); 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((byte) (a.ba[i] + 1))); for (int i = 0; i < $ca.length; i++) assertThat(r.get($ca, i), equalTo((short) (a.ca[i] + 1))); for (int i = 0; i < $da.length; i++) assertThat(r.get($da, i), equalTo(a.da[i] + 1)); for (int i = 0; i < $ea.length; i++) assertThat(r.get($ea, i), equalTo(a.ea[i] + 1)); for (int i = 0; i < $fa.length; i++) assertThat(r.get($fa, i), equalTo(a.fa[i] + 1)); for (int i = 0; i < $ga.length; i++) assertThat(r.get($ga, i), equalTo(a.ga[i] + 1)); for (int i = 0; i < $ha.length; i++) assertThat(r.get($ha, i), equalTo((char) (a.ha[i] + 1))); 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); for (int i = 0; i < $aa.length; i++) assertThat(aa[i], equalTo(a.aa[i])); for (int i = 0; i < $ba.length; i++) assertThat(ba[i], equalTo((byte) (a.ba[i] + 1))); for (int i = 0; i < $ca.length; i++) assertThat(ca[i], equalTo((short) (a.ca[i] + 1))); for (int i = 0; i < $da.length; i++) assertThat(da[i], equalTo(a.da[i] + 1)); for (int i = 0; i < $ea.length; i++) assertThat(ea[i], equalTo(a.ea[i] + 1)); for (int i = 0; i < $fa.length; i++) assertThat(fa[i], equalTo(a.fa[i] + 1)); for (int i = 0; i < $ga.length; i++) assertThat(ga[i], equalTo(a.ga[i] + 1)); for (int i = 0; i < $ha.length; i++) assertThat(ha[i], equalTo((char) (a.ha[i] + 1))); for (int i = 0; i < $stra.length; i++) assertThat(stra[i], equalTo(a.stra[i] + "!")); assertThat(r.get($x), equalTo(a.x + 1)); } @Test public void testSetRecordGetDirect() { A a = new A(); Record<A> r = rt.wrap(a, mode); r.set($a, rand.nextBoolean()); r.set($b, (byte) rand.nextInt()); r.set($c, (short) rand.nextInt()); r.set($d, rand.nextInt()); r.set($e, rand.nextLong()); r.set($f, rand.nextFloat()); r.set($g, rand.nextDouble()); r.set($h, (char) rand.nextInt()); r.set($str, "bar"); try { r.set($af, rand.nextBoolean()); fail(); } catch (ReadOnlyFieldException e) { } try { r.set($bf, (byte) rand.nextInt()); fail(); } catch (ReadOnlyFieldException e) { } try { r.set($cf, (short) rand.nextInt()); fail(); } catch (ReadOnlyFieldException e) { } try { r.set($df, rand.nextInt()); fail(); } catch (ReadOnlyFieldException e) { } try { r.set($ef, rand.nextLong()); fail(); } catch (ReadOnlyFieldException e) { } try { r.set($ff, rand.nextFloat()); fail(); } catch (ReadOnlyFieldException e) { } try { r.set($gf, rand.nextDouble()); fail(); } catch (ReadOnlyFieldException e) { } try { r.set($hf, (char) rand.nextInt()); fail(); } catch (ReadOnlyFieldException e) { } try { r.set($strf, "bar"); fail(); } catch (ReadOnlyFieldException e) { } r.set($x, rand.nextInt()); for (int i = 0; i < $aa.length; i++) r.set($aa, i, rand.nextBoolean()); for (int i = 0; i < $ba.length; i++) r.set($ba, i, (byte) rand.nextInt()); for (int i = 0; i < $ca.length; i++) r.set($ca, i, (short) rand.nextInt()); for (int i = 0; i < $da.length; i++) r.set($da, i, rand.nextInt()); for (int i = 0; i < $ea.length; i++) r.set($ea, i, rand.nextLong()); for (int i = 0; i < $fa.length; i++) r.set($fa, i, rand.nextFloat()); for (int i = 0; i < $ga.length; i++) r.set($ga, i, rand.nextDouble()); for (int i = 0; i < $ha.length; i++) r.set($ha, i, (char) rand.nextInt()); r.set($stra, 0, "goodbye"); 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(a.str, equalTo("bar")); 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 < $ga.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])); assertThat(r.get($stra, 0), equalTo("goodbye")); assertThat(r.get($x), equalTo(a.x)); } @Test public void testSetRecordBeanGetDirect() { assumeThat(mode, not(RecordType.Mode.UNSAFE)); A a = new B(); Record<A> r = rt.wrap(a, mode); r.set($a, rand.nextBoolean()); r.set($b, (byte) rand.nextInt()); r.set($c, (short) rand.nextInt()); r.set($d, rand.nextInt()); r.set($e, rand.nextLong()); r.set($f, rand.nextFloat()); r.set($g, rand.nextDouble()); r.set($h, (char) rand.nextInt()); r.set($str, "bar"); for (int i = 0; i < $aa.length; i++) r.set($aa, i, rand.nextBoolean()); for (int i = 0; i < $ba.length; i++) r.set($ba, i, (byte) rand.nextInt()); for (int i = 0; i < $ca.length; i++) r.set($ca, i, (short) rand.nextInt()); for (int i = 0; i < $da.length; i++) r.set($da, i, rand.nextInt()); for (int i = 0; i < $ea.length; i++) r.set($ea, i, rand.nextLong()); for (int i = 0; i < $fa.length; i++) r.set($fa, i, rand.nextFloat()); for (int i = 0; i < $ga.length; i++) r.set($ga, i, rand.nextDouble()); for (int i = 0; i < $ha.length; i++) r.set($ha, i, (char) rand.nextInt()); r.set($stra, 0, "goodbye"); assertThat(r.get($a), equalTo(a.a)); assertThat(r.get($b), equalTo((byte) (a.b + 1))); assertThat(r.get($c), equalTo((short) (a.c + 1))); assertThat(r.get($d), equalTo(a.d + 1)); assertThat(r.get($e), equalTo(a.e + 1)); assertThat(r.get($f), equalTo(a.f + 1)); assertThat(r.get($g), equalTo(a.g + 1)); assertThat(r.get($h), equalTo((char) (a.h + 1))); assertThat(a.str, equalTo("bar!")); 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((byte) (a.ba[i] + 1))); for (int i = 0; i < $ca.length; i++) assertThat(r.get($ca, i), equalTo((short) (a.ca[i] + 1))); for (int i = 0; i < $da.length; i++) assertThat(r.get($da, i), equalTo(a.da[i] + 1)); for (int i = 0; i < $ea.length; i++) assertThat(r.get($ea, i), equalTo(a.ea[i] + 1)); for (int i = 0; i < $fa.length; i++) assertThat(r.get($fa, i), equalTo(a.fa[i] + 1)); for (int i = 0; i < $ga.length; i++) assertThat(r.get($ga, i), equalTo(a.ga[i] + 1)); for (int i = 0; i < $ha.length; i++) assertThat(r.get($ha, i), equalTo((char) (a.ha[i] + 1))); for (int i = 0; i < $stra.length; i++) assertThat(r.get($stra, i), equalTo(a.stra[i] + "!")); assertThat(r.get($stra, 0), equalTo("goodbye!!")); try { r.set($x, rand.nextInt()); fail(); } catch (ReadOnlyFieldException e) { } } @Test public void testSetRecordGetDirect2() { A a = new A(); Record<A> r = rt.wrap(a, mode); 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[]{"foo", "bar"}; 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 < aa.length; i++) ga[i] = rand.nextDouble(); for (int i = 0; i < ha.length; i++) ha[i] = (char) rand.nextInt(); r.set($aa, aa, 0); r.set($ba, ba, 0); r.set($ca, ca, 0); r.set($da, da, 0); r.set($ea, ea, 0); r.set($fa, fa, 0); r.set($ga, ga, 0); r.set($ha, ha, 0); r.set($stra, stra, 0); 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 < $ga.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])); assertThat(r.get($stra, 0), equalTo("foo")); assertThat(r.get($stra, 1), equalTo("bar")); } @Test public void testSetRecordBeanGetDirect2() { assumeThat(mode, not(RecordType.Mode.UNSAFE)); A a = new B(); Record<A> r = rt.wrap(a, mode); 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[]{"foo", "bar"}; 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 < aa.length; i++) ga[i] = rand.nextDouble(); for (int i = 0; i < ha.length; i++) ha[i] = (char) rand.nextInt(); r.set($aa, aa, 0); r.set($ba, ba, 0); r.set($ca, ca, 0); r.set($da, da, 0); r.set($ea, ea, 0); r.set($fa, fa, 0); r.set($ga, ga, 0); r.set($ha, ha, 0); r.set($stra, stra, 0); 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((byte) (a.ba[i] + 1))); for (int i = 0; i < $ca.length; i++) assertThat(r.get($ca, i), equalTo((short) (a.ca[i] + 1))); for (int i = 0; i < $da.length; i++) assertThat(r.get($da, i), equalTo(a.da[i] + 1)); for (int i = 0; i < $ea.length; i++) assertThat(r.get($ea, i), equalTo(a.ea[i] + 1)); for (int i = 0; i < $fa.length; i++) assertThat(r.get($fa, i), equalTo(a.fa[i] + 1)); for (int i = 0; i < $ga.length; i++) assertThat(r.get($ga, i), equalTo(a.ga[i] + 1)); for (int i = 0; i < $ha.length; i++) assertThat(r.get($ha, i), equalTo((char) (a.ha[i] + 1))); for (int i = 0; i < $stra.length; i++) assertThat(r.get($stra, i), equalTo(a.stra[i] + "!")); assertThat(r.get($stra, 0), equalTo("foo!!")); assertThat(r.get($stra, 1), equalTo("bar!!")); } @Test public void testArrayOutOfBounds() { A a = new A(); Record<A> r = rt.wrap(a, mode); 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) { } } }