package org.ObjectLayoutApiTests; import org.ObjectLayout.*; import org.junit.Test; import java.lang.invoke.MethodHandles; import java.util.Arrays; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; public class PrimitiveLongArrayTest { static final MethodHandles.Lookup lookup = MethodHandles.lookup(); public static class ColoredLongArrayPublic extends PrimitiveLongArray { private final String color; private static CtorAndArgs<ColoredLongArrayPublic> ctorAndArgs = new CtorAndArgs<ColoredLongArrayPublic>(lookup, ColoredLongArrayPublic.class, new Class[]{String.class}, "DefaultColor"); public static ColoredLongArrayPublic newInstance(String color, final int length) { ctorAndArgs.getArgs()[0] = color; return newInstance(ctorAndArgs, length); } public ColoredLongArrayPublic(String color) { this.color = color; } public ColoredLongArrayPublic(ColoredLongArrayPublic sourceArray) { super(sourceArray); color = sourceArray.color; } public String getColor() { return color; } } private static class ColoredLongArray extends PrimitiveLongArray { private final String color; private static CtorAndArgs<ColoredLongArray> ctorAndArgs = new CtorAndArgs<ColoredLongArray>(lookup, ColoredLongArray.class, new Class[]{String.class}, "DefaultColor"); public static ColoredLongArray newInstance(String color, final int length) { ctorAndArgs.getArgs()[0] = color; return newInstance(ctorAndArgs, length); } public ColoredLongArray(String color) { this.color = color; } public ColoredLongArray(ColoredLongArray sourceArray) { super(sourceArray); color = sourceArray.color; } public String getColor() { return color; } } @Test public void testColoredLongArray() throws Exception { ColoredLongArray blueArray = ColoredLongArray.newInstance("Blue", 10); ColoredLongArray redArray = ColoredLongArray.newInstance("Red", 20); for (int i = 0; i < redArray.getLength(); i++) { redArray.set(i, i); } for (int i = 0; i < blueArray.getLength(); i++) { blueArray.set(i, redArray.get(i)); } assertTrue(redArray.getColor().equals("Red")); assertTrue(blueArray.getColor().equals("Blue")); } @Test public void testColoredLongArrayPublic() throws Exception { ColoredLongArrayPublic blueArray = ColoredLongArrayPublic.newInstance("Blue", 10); ColoredLongArrayPublic redArray = ColoredLongArrayPublic.newInstance("Red", 20); for (int i = 0; i < redArray.getLength(); i++) { redArray.set(i, i); } for (int i = 0; i < blueArray.getLength(); i++) { blueArray.set(i, redArray.get(i)); } assertTrue(redArray.getColor().equals("Red")); assertTrue(blueArray.getColor().equals("Blue")); } @Test public void testCopyOfColoredLongArray() throws Exception { ColoredLongArray blueArray = ColoredLongArray.newInstance("Blue", 10); ColoredLongArray redArray = ColoredLongArray.newInstance("Red", 20); for (int i = 0; i < redArray.getLength(); i++) { redArray.set(i, i); } for (int i = 0; i < blueArray.getLength(); i++) { blueArray.set(i, redArray.get(i)); } ColoredLongArray blueArrayCopy = ColoredLongArray.copyInstance(lookup, blueArray); assertTrue(redArray.getColor().equals("Red")); assertTrue(blueArray.getColor().equals("Blue")); assertTrue(blueArrayCopy.getColor().equals("Blue")); assertTrue(Arrays.equals(blueArray.asArray(), blueArrayCopy.asArray())); } @Test public void testCopyOfColoredLongArrayPublic() throws Exception { ColoredLongArrayPublic blueArray = ColoredLongArrayPublic.newInstance("Blue", 10); ColoredLongArrayPublic redArray = ColoredLongArrayPublic.newInstance("Red", 20); for (int i = 0; i < redArray.getLength(); i++) { redArray.set(i, i); } for (int i = 0; i < blueArray.getLength(); i++) { blueArray.set(i, redArray.get(i)); } ColoredLongArrayPublic blueArrayCopy = ColoredLongArrayPublic.copyInstance(blueArray); assertTrue(redArray.getColor().equals("Red")); assertTrue(blueArray.getColor().equals("Blue")); assertTrue(blueArrayCopy.getColor().equals("Blue")); assertTrue(Arrays.equals(blueArray.asArray(), blueArrayCopy.asArray())); } @Test public void testColoredLongArrayBuilder() throws Exception { PrimitiveArrayBuilder<ColoredLongArray> builder = new PrimitiveArrayBuilder<ColoredLongArray>( ColoredLongArray.class, 50); ColoredLongArray blueArray = builder.arrayCtorAndArgs(ColoredLongArray.ctorAndArgs.setArgs("Blue")).build(); ColoredLongArray redArray = builder.arrayCtorAndArgs(ColoredLongArray.ctorAndArgs.setArgs("Red")).build(); for (int i = 0; i < redArray.getLength(); i++) { redArray.set(i, i); } for (int i = 0; i < blueArray.getLength(); i++) { blueArray.set(i, redArray.get(i)); } assertTrue(redArray.getColor().equals("Red")); assertTrue(blueArray.getColor().equals("Blue")); assertTrue(redArray.getLength() == 50); assertTrue(Arrays.equals(redArray.asArray(), blueArray.asArray())); } @Test public void testColoredLongArrayBuilderPublic() throws Exception { PrimitiveArrayBuilder<ColoredLongArrayPublic> builder = new PrimitiveArrayBuilder<ColoredLongArrayPublic>( ColoredLongArrayPublic.class, 50); ColoredLongArrayPublic blueArray = builder.arrayCtorAndArgs(ColoredLongArrayPublic.ctorAndArgs.setArgs("Blue")).build(); ColoredLongArrayPublic redArray = builder.arrayCtorAndArgs(ColoredLongArrayPublic.ctorAndArgs.setArgs("Red")).build(); for (int i = 0; i < redArray.getLength(); i++) { redArray.set(i, i); } for (int i = 0; i < blueArray.getLength(); i++) { blueArray.set(i, redArray.get(i)); } assertTrue(redArray.getColor().equals("Red")); assertTrue(blueArray.getColor().equals("Blue")); assertTrue(redArray.getLength() == 50); assertTrue(Arrays.equals(redArray.asArray(), blueArray.asArray())); } @Test public void testStructuredArrayOfColoredLongArrays() throws NoSuchMethodException { @SuppressWarnings("unchecked") StructuredArray<ColoredLongArray> a = new StructuredArrayBuilder(StructuredArray.class, new PrimitiveArrayBuilder(ColoredLongArray.class, 20). arrayCtorAndArgs(ColoredLongArray.ctorAndArgs.setArgs("Yellow")), 50). build(); assertThat(a.getLength(), is(50L)); assertThat(a.get(0).getLength(), is(20L)); assertThat(a.get(1).getColor(), is("Yellow")); } @Test public void testStructuredArrayOfColoredLongArraysPublic() throws NoSuchMethodException { @SuppressWarnings("unchecked") StructuredArray<ColoredLongArrayPublic> a = new StructuredArrayBuilder(StructuredArray.class, new PrimitiveArrayBuilder(ColoredLongArrayPublic.class, 20). arrayCtorAndArgs(ColoredLongArrayPublic.ctorAndArgs.setArgs("Yellow")), 50). build(); assertThat(a.getLength(), is(50L)); assertThat(a.get(0).getLength(), is(20L)); assertThat(a.get(1).getColor(), is("Yellow")); } @Test(expected = RuntimeException.class) public void testStructuredArrayOfColoredLongArrays_shouldFail() { // Should fail to find default constructor: @SuppressWarnings("unchecked") StructuredArray<ColoredLongArray> a = new StructuredArrayBuilder(StructuredArray.class, new PrimitiveArrayBuilder(ColoredLongArray.class, 20), 50). build(); } @Test public void testStructuredArrayOfColoredLongArraysWithVariableNames() { @SuppressWarnings("unchecked") StructuredArray<ColoredLongArray> a = new StructuredArrayBuilder(StructuredArray.class, new PrimitiveArrayBuilder(ColoredLongArray.class, 20), 50). elementCtorAndArgsProvider( new CtorAndArgsProvider() { @Override public CtorAndArgs getForContext(ConstructionContext context) throws NoSuchMethodException { return ColoredLongArray.ctorAndArgs.setArgs("Color-" + context.getIndex()); } }). build(); assertThat(a.getLength(), is(50L)); assertThat(a.get(0).getLength(), is(20L)); assertThat(a.get(0).getColor(), is("Color-0")); assertThat(a.get(1).getColor(), is("Color-1")); assertThat(a.get(2).getColor(), is("Color-2")); assertThat(a.get(48).getColor(), is("Color-48")); assertThat(a.get(49).getColor(), is("Color-49")); } @Test public void testStructuredArrayOfColoredLongArraysWithVariableNamesPublic() { @SuppressWarnings("unchecked") StructuredArray<ColoredLongArrayPublic> a = new StructuredArrayBuilder(StructuredArray.class, new PrimitiveArrayBuilder(ColoredLongArrayPublic.class, 20), 50). elementCtorAndArgsProvider( new CtorAndArgsProvider() { @Override public CtorAndArgs getForContext(ConstructionContext context) throws NoSuchMethodException { return ColoredLongArrayPublic.ctorAndArgs.setArgs("Color-" + context.getIndex()); } }). build(); assertThat(a.getLength(), is(50L)); assertThat(a.get(0).getLength(), is(20L)); assertThat(a.get(0).getColor(), is("Color-0")); assertThat(a.get(1).getColor(), is("Color-1")); assertThat(a.get(2).getColor(), is("Color-2")); assertThat(a.get(48).getColor(), is("Color-48")); assertThat(a.get(49).getColor(), is("Color-49")); } @Test public void testCopyStructuredArrayOfColoredLongArrays() throws NoSuchMethodException { @SuppressWarnings("unchecked") StructuredArray<ColoredLongArray> a = new StructuredArrayBuilder(StructuredArray.class, new PrimitiveArrayBuilder(ColoredLongArray.class, 20). arrayCtorAndArgs(ColoredLongArray.ctorAndArgs.setArgs("Yellow")), 50). build(); for (int i = 0; i < a.getLength(); i++) { ColoredLongArray ca = a.get(i); for (int j = 0; j < ca.getLength(); j++) { ca.set(j, j); } } StructuredArray<ColoredLongArray> a2 = StructuredArray.copyInstance(lookup, a); for (int i = 0; i < a.getLength(); i++) { assertTrue(Arrays.equals(a.get(i).asArray(), a2.get(i).asArray())); } } @Test public void testCopyStructuredArrayOfColoredLongArraysPublic() throws NoSuchMethodException { @SuppressWarnings("unchecked") StructuredArray<ColoredLongArrayPublic> a = new StructuredArrayBuilder(StructuredArray.class, new PrimitiveArrayBuilder(ColoredLongArrayPublic.class, 20). arrayCtorAndArgs(ColoredLongArrayPublic.ctorAndArgs.setArgs("Yellow")), 50). build(); for (int i = 0; i < a.getLength(); i++) { ColoredLongArrayPublic ca = a.get(i); for (int j = 0; j < ca.getLength(); j++) { ca.set(j, j); } } StructuredArray<ColoredLongArrayPublic> a2 = StructuredArray.copyInstance(a); for (int i = 0; i < a.getLength(); i++) { assertTrue(Arrays.equals(a.get(i).asArray(), a2.get(i).asArray())); } } }