1f0051698d4275162504611cd7c33df0eee45cdfemaslovalex/**
2f0051698d4275162504611cd7c33df0eee45cdfemaslovalex * Copyright (c) 2008, http://www.snakeyaml.org
3f0051698d4275162504611cd7c33df0eee45cdfemaslovalex *
4f0051698d4275162504611cd7c33df0eee45cdfemaslovalex * Licensed under the Apache License, Version 2.0 (the "License");
5f0051698d4275162504611cd7c33df0eee45cdfemaslovalex * you may not use this file except in compliance with the License.
6f0051698d4275162504611cd7c33df0eee45cdfemaslovalex * You may obtain a copy of the License at
7f0051698d4275162504611cd7c33df0eee45cdfemaslovalex *
8f0051698d4275162504611cd7c33df0eee45cdfemaslovalex *     http://www.apache.org/licenses/LICENSE-2.0
9f0051698d4275162504611cd7c33df0eee45cdfemaslovalex *
10f0051698d4275162504611cd7c33df0eee45cdfemaslovalex * Unless required by applicable law or agreed to in writing, software
11f0051698d4275162504611cd7c33df0eee45cdfemaslovalex * distributed under the License is distributed on an "AS IS" BASIS,
12f0051698d4275162504611cd7c33df0eee45cdfemaslovalex * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f0051698d4275162504611cd7c33df0eee45cdfemaslovalex * See the License for the specific language governing permissions and
14f0051698d4275162504611cd7c33df0eee45cdfemaslovalex * limitations under the License.
15f0051698d4275162504611cd7c33df0eee45cdfemaslovalex */
16f0051698d4275162504611cd7c33df0eee45cdfemaslovalexpackage org.yaml.snakeyaml.array;
17f0051698d4275162504611cd7c33df0eee45cdfemaslovalex
18f0051698d4275162504611cd7c33df0eee45cdfemaslovaleximport java.util.Arrays;
19f0051698d4275162504611cd7c33df0eee45cdfemaslovaleximport java.util.List;
20f0051698d4275162504611cd7c33df0eee45cdfemaslovalex
21f0051698d4275162504611cd7c33df0eee45cdfemaslovaleximport junit.framework.TestCase;
22f0051698d4275162504611cd7c33df0eee45cdfemaslovalex
23f0051698d4275162504611cd7c33df0eee45cdfemaslovaleximport org.junit.Assert;
24f0051698d4275162504611cd7c33df0eee45cdfemaslovaleximport org.yaml.snakeyaml.Yaml;
25f0051698d4275162504611cd7c33df0eee45cdfemaslovaleximport org.yaml.snakeyaml.constructor.ConstructorException;
26f0051698d4275162504611cd7c33df0eee45cdfemaslovaleximport org.yaml.snakeyaml.error.YAMLException;
27f0051698d4275162504611cd7c33df0eee45cdfemaslovalex
28f0051698d4275162504611cd7c33df0eee45cdfemaslovalexpublic class PrimitiveArrayTest extends TestCase {
29f0051698d4275162504611cd7c33df0eee45cdfemaslovalex
30f0051698d4275162504611cd7c33df0eee45cdfemaslovalex    private final String pkg = "!!org.yaml.snakeyaml.array";
31f0051698d4275162504611cd7c33df0eee45cdfemaslovalex
32f0051698d4275162504611cd7c33df0eee45cdfemaslovalex    private final byte[] bytes = new byte[] { 1, 2, 3 };
33f0051698d4275162504611cd7c33df0eee45cdfemaslovalex    private final short[] shorts = new short[] { 300, 301, 302 };
34f0051698d4275162504611cd7c33df0eee45cdfemaslovalex    private final int[] ints = new int[] { 40000, 40001, 40002 };
35f0051698d4275162504611cd7c33df0eee45cdfemaslovalex    private final long[] longs = new long[] { 5000000000L, 5000000001L };
36f0051698d4275162504611cd7c33df0eee45cdfemaslovalex    private final float[] floats = new float[] { 0.1f, 3.1415f };
37f0051698d4275162504611cd7c33df0eee45cdfemaslovalex    private final double[] doubles = new double[] { 50.0001, 2150.0002 };
38f0051698d4275162504611cd7c33df0eee45cdfemaslovalex    private final char[] chars = new char[] { 'a', 'b', 'c', 'd', 'e' };
39f0051698d4275162504611cd7c33df0eee45cdfemaslovalex    private final boolean[] bools = new boolean[] { true, false };
40f0051698d4275162504611cd7c33df0eee45cdfemaslovalex
41f0051698d4275162504611cd7c33df0eee45cdfemaslovalex    public void testValidConstructor() {
42f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        String testInput = "- " + pkg + ".ByteArr [ " + Arrays.toString(bytes) + " ]\n" + "- "
43f0051698d4275162504611cd7c33df0eee45cdfemaslovalex                + pkg + ".ShortArr [ " + Arrays.toString(shorts) + " ]\n" + "- " + pkg
44f0051698d4275162504611cd7c33df0eee45cdfemaslovalex                + ".IntArr [ " + Arrays.toString(ints) + " ]\n" + "- " + pkg + ".LongArr [ "
45f0051698d4275162504611cd7c33df0eee45cdfemaslovalex                + Arrays.toString(longs) + " ]\n" + "- " + pkg + ".FloatArr [ "
46f0051698d4275162504611cd7c33df0eee45cdfemaslovalex                + Arrays.toString(floats) + " ]\n" + "- " + pkg + ".DoubleArr [ "
47f0051698d4275162504611cd7c33df0eee45cdfemaslovalex                + Arrays.toString(doubles) + " ]\n" + "- " + pkg + ".CharArr [ "
48f0051698d4275162504611cd7c33df0eee45cdfemaslovalex                + Arrays.toString(chars) + " ]\n" + "- " + pkg + ".BooleanArr [ "
49f0051698d4275162504611cd7c33df0eee45cdfemaslovalex                + Arrays.toString(bools) + " ]\n";
50f0051698d4275162504611cd7c33df0eee45cdfemaslovalex
51f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        Yaml yaml = new Yaml();
52f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        List<Object> wrappers = (List<Object>) yaml.load(testInput);
53f0051698d4275162504611cd7c33df0eee45cdfemaslovalex
54f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        Assert.assertArrayEquals(bytes, ((ByteArr) wrappers.get(0)).getBytes());
55f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        Assert.assertArrayEquals(shorts, ((ShortArr) wrappers.get(1)).getShorts());
56f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        Assert.assertArrayEquals(ints, ((IntArr) wrappers.get(2)).getInts());
57f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        Assert.assertArrayEquals(longs, ((LongArr) wrappers.get(3)).getLongs());
58f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        Assert.assertArrayEquals(floats, ((FloatArr) wrappers.get(4)).getFloats(), 0.001f);
59f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        Assert.assertArrayEquals(doubles, ((DoubleArr) wrappers.get(5)).getDoubles(), 0.001);
60f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        Assert.assertArrayEquals(chars, ((CharArr) wrappers.get(6)).getChars());
61f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        assertArrayEquals(bools, ((BooleanArr) wrappers.get(7)).getBools());
62f0051698d4275162504611cd7c33df0eee45cdfemaslovalex    }
63f0051698d4275162504611cd7c33df0eee45cdfemaslovalex
64f0051698d4275162504611cd7c33df0eee45cdfemaslovalex    /*
65f0051698d4275162504611cd7c33df0eee45cdfemaslovalex     * For some reason, every other assertArrayEquals specialization is provided
66f0051698d4275162504611cd7c33df0eee45cdfemaslovalex     * by org.junit.Assert, but not this one.
67f0051698d4275162504611cd7c33df0eee45cdfemaslovalex     */
68f0051698d4275162504611cd7c33df0eee45cdfemaslovalex    private void assertArrayEquals(boolean[] expected, boolean[] actuals) {
69f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        assertEquals("Arrays differ in length", expected.length, actuals.length);
70f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        for (int i = 0; i < expected.length; ++i) {
71f0051698d4275162504611cd7c33df0eee45cdfemaslovalex            if (expected[i] != actuals[i]) {
72f0051698d4275162504611cd7c33df0eee45cdfemaslovalex                fail("Arrays first differ at " + i + "; expected " + expected[i] + " but got "
73f0051698d4275162504611cd7c33df0eee45cdfemaslovalex                        + actuals[i]);
74f0051698d4275162504611cd7c33df0eee45cdfemaslovalex            }
75f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        }
76f0051698d4275162504611cd7c33df0eee45cdfemaslovalex    }
77f0051698d4275162504611cd7c33df0eee45cdfemaslovalex
78f0051698d4275162504611cd7c33df0eee45cdfemaslovalex    private void tryInvalid(String t, Class<?> expectedException) {
79f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        Yaml yaml = new Yaml();
80f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        try {
81f0051698d4275162504611cd7c33df0eee45cdfemaslovalex            Object loaded = yaml.load(t);
82f0051698d4275162504611cd7c33df0eee45cdfemaslovalex            fail("Expected " + expectedException.getCanonicalName() + " but loaded = \"" + loaded
83f0051698d4275162504611cd7c33df0eee45cdfemaslovalex                    + "\"");
84f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        } catch (YAMLException e) {
85f0051698d4275162504611cd7c33df0eee45cdfemaslovalex            assertEquals(expectedException, e.getCause().getClass());
86f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        }
87f0051698d4275162504611cd7c33df0eee45cdfemaslovalex    }
88f0051698d4275162504611cd7c33df0eee45cdfemaslovalex
89f0051698d4275162504611cd7c33df0eee45cdfemaslovalex    public void testInvalidConstructors() {
90f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        // Loading a character as any primitive other than 'char' is a
91f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        // NumberFormatException
92f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        tryInvalid(pkg + ".ByteArr [ [ 'a' ] ]", NumberFormatException.class);
93f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        tryInvalid(pkg + ".ShortArr [ [ 'a' ] ]", NumberFormatException.class);
94f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        tryInvalid(pkg + ".IntArr [ [ 'a' ] ]", NumberFormatException.class);
95f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        tryInvalid(pkg + ".LongArr [ [ 'a' ] ]", NumberFormatException.class);
96f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        tryInvalid(pkg + ".FloatArr [ [ 'a' ] ]", NumberFormatException.class);
97f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        tryInvalid(pkg + ".DoubleArr [ [ 'a' ] ]", NumberFormatException.class);
98f0051698d4275162504611cd7c33df0eee45cdfemaslovalex
99f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        // Exception: because of how boolean construction works, constructing a
100f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        // boolean from 'a'
101f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        // results in null.
102f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        tryInvalid(pkg + ".BooleanArr [ [ 'a' ] ]", NullPointerException.class);
103f0051698d4275162504611cd7c33df0eee45cdfemaslovalex
104f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        // Loading a floating-point number as a character is a YAMLException
105f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        tryInvalid(pkg + ".CharArr [ [ 1.2 ] ]", YAMLException.class);
106f0051698d4275162504611cd7c33df0eee45cdfemaslovalex
107f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        // Loading a String as a Character is a YAMLException
108f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        tryInvalid(pkg + ".CharArr [ [ 'abcd' ] ]", YAMLException.class);
109f0051698d4275162504611cd7c33df0eee45cdfemaslovalex
110f0051698d4275162504611cd7c33df0eee45cdfemaslovalex    }
111f0051698d4275162504611cd7c33df0eee45cdfemaslovalex
112f0051698d4275162504611cd7c33df0eee45cdfemaslovalex    public void testTruncation() {
113f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        // Loading floating-point numbers as integer types is disallowed,
114f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        // because that's a number-format problem.
115f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        tryInvalid(pkg + ".ByteArr [ [ 3.14 ] ]", NumberFormatException.class);
116f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        tryInvalid(pkg + ".ShortArr [ [ 3.14 ] ]", NumberFormatException.class);
117f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        tryInvalid(pkg + ".IntArr [ [ 3.14 ] ]", NumberFormatException.class);
118f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        tryInvalid(pkg + ".LongArr [ [ 3.14 ] ]", NumberFormatException.class);
119f0051698d4275162504611cd7c33df0eee45cdfemaslovalex    }
120f0051698d4275162504611cd7c33df0eee45cdfemaslovalex
121f0051698d4275162504611cd7c33df0eee45cdfemaslovalex    public void testPromotion() {
122f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        Yaml yaml = new Yaml();
123f0051698d4275162504611cd7c33df0eee45cdfemaslovalex
124f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        // Loading integer numbers as floating-point types is allowed...
125f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        Assert.assertArrayEquals(new float[] { 3, 5 },
126f0051698d4275162504611cd7c33df0eee45cdfemaslovalex                ((FloatArr) yaml.load(pkg + ".FloatArr [ [ 3, 5 ] ] ")).getFloats(), 0.001f);
127f0051698d4275162504611cd7c33df0eee45cdfemaslovalex
128f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        Assert.assertArrayEquals(new double[] { 3, 5 },
129f0051698d4275162504611cd7c33df0eee45cdfemaslovalex                ((DoubleArr) yaml.load(pkg + ".DoubleArr [ [ 3, 5 ] ] ")).getDoubles(), 0.001f);
130f0051698d4275162504611cd7c33df0eee45cdfemaslovalex    }
131f0051698d4275162504611cd7c33df0eee45cdfemaslovalex
132f0051698d4275162504611cd7c33df0eee45cdfemaslovalex    public void testStringCharArray() {
133f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        Yaml yaml = new Yaml();
134f0051698d4275162504611cd7c33df0eee45cdfemaslovalex
135f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        try {
136f0051698d4275162504611cd7c33df0eee45cdfemaslovalex            yaml.load(pkg + ".CharArr [ [ abcd ] ]");
137f0051698d4275162504611cd7c33df0eee45cdfemaslovalex            fail("Expected exception.");
138f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        } catch (Exception e) {
139f0051698d4275162504611cd7c33df0eee45cdfemaslovalex            assertEquals(ConstructorException.class, e.getClass());
140f0051698d4275162504611cd7c33df0eee45cdfemaslovalex            assertEquals("Invalid node Character: 'abcd'; length: 4", e.getCause().getMessage());
141f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        }
142f0051698d4275162504611cd7c33df0eee45cdfemaslovalex    }
143f0051698d4275162504611cd7c33df0eee45cdfemaslovalex
144f0051698d4275162504611cd7c33df0eee45cdfemaslovalex    private static Object cycle(Object in) {
145f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        Yaml yaml = new Yaml();
146f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        String dumped = yaml.dump(in);
147f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        // System.out.println ( dumped );
148f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        return yaml.load(dumped);
149f0051698d4275162504611cd7c33df0eee45cdfemaslovalex    }
150f0051698d4275162504611cd7c33df0eee45cdfemaslovalex
151f0051698d4275162504611cd7c33df0eee45cdfemaslovalex    /**
152f0051698d4275162504611cd7c33df0eee45cdfemaslovalex     * All kinds of primitive arrays should be able to cycle from (Java array)
153f0051698d4275162504611cd7c33df0eee45cdfemaslovalex     * to (YAML string) to (Java array) again, and they should be exactly the
154f0051698d4275162504611cd7c33df0eee45cdfemaslovalex     * same before and after.
155f0051698d4275162504611cd7c33df0eee45cdfemaslovalex     */
156f0051698d4275162504611cd7c33df0eee45cdfemaslovalex    public void testCycle() {
157f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        ByteArr byteArr = new ByteArr(bytes);
158f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        Assert.assertArrayEquals(byteArr.getBytes(), ((ByteArr) cycle(byteArr)).getBytes());
159f0051698d4275162504611cd7c33df0eee45cdfemaslovalex
160f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        ShortArr shortArr = new ShortArr(shorts);
161f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        Assert.assertArrayEquals(shortArr.getShorts(), ((ShortArr) cycle(shortArr)).getShorts());
162f0051698d4275162504611cd7c33df0eee45cdfemaslovalex
163f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        IntArr intArr = new IntArr(ints);
164f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        Assert.assertArrayEquals(intArr.getInts(), ((IntArr) cycle(intArr)).getInts());
165f0051698d4275162504611cd7c33df0eee45cdfemaslovalex
166f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        LongArr longArr = new LongArr(longs);
167f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        Assert.assertArrayEquals(longArr.getLongs(), ((LongArr) cycle(longArr)).getLongs());
168f0051698d4275162504611cd7c33df0eee45cdfemaslovalex
169f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        FloatArr floatArr = new FloatArr(floats);
170f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        Assert.assertArrayEquals(floatArr.getFloats(), ((FloatArr) cycle(floatArr)).getFloats(),
171f0051698d4275162504611cd7c33df0eee45cdfemaslovalex                0.001f);
172f0051698d4275162504611cd7c33df0eee45cdfemaslovalex
173f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        DoubleArr doubleArr = new DoubleArr(doubles);
174f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        Assert.assertArrayEquals(doubleArr.getDoubles(),
175f0051698d4275162504611cd7c33df0eee45cdfemaslovalex                ((DoubleArr) cycle(doubleArr)).getDoubles(), 0.001);
176f0051698d4275162504611cd7c33df0eee45cdfemaslovalex
177f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        CharArr charArr = new CharArr(chars);
178f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        Assert.assertArrayEquals(charArr.getChars(), ((CharArr) cycle(charArr)).getChars());
179f0051698d4275162504611cd7c33df0eee45cdfemaslovalex
180f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        BooleanArr boolArr = new BooleanArr(bools);
181f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        assertArrayEquals(boolArr.getBools(), ((BooleanArr) cycle(boolArr)).getBools());
182f0051698d4275162504611cd7c33df0eee45cdfemaslovalex    }
183f0051698d4275162504611cd7c33df0eee45cdfemaslovalex
184f0051698d4275162504611cd7c33df0eee45cdfemaslovalex    public void testMultiDimensional() {
185f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        Array2D two = new Array2D();
186f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        two.setLongs(new long[][] { { 1, 2, 3 }, { 4, 5, 6 } });
187f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        assertTrue(Arrays.deepEquals(two.getLongs(), ((Array2D) cycle(two)).getLongs()));
188f0051698d4275162504611cd7c33df0eee45cdfemaslovalex
189f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        Array3D three = new Array3D();
190f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        three.setLongs(new long[][][] { { { 1, 2, 3, 4 }, { 5, 6, 7, 8 } },
191f0051698d4275162504611cd7c33df0eee45cdfemaslovalex                { { 9, 10, 11, 12 }, { 13, 14, 15, 16 } } });
192f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        assertTrue(Arrays.deepEquals(three.getLongs(), ((Array3D) cycle(three)).getLongs()));
193f0051698d4275162504611cd7c33df0eee45cdfemaslovalex
194f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        // Object with an array of Objects which each have an array of
195f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        // primitives.
196f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        ArrayLongArr four = new ArrayLongArr();
197f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        four.setContents(new LongArr[] { new LongArr(new long[] { 1, 2, 3, 4 }),
198f0051698d4275162504611cd7c33df0eee45cdfemaslovalex                new LongArr(new long[] { 5, 6, 7, 8 }) });
199f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        Object result = cycle(four);
200f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        assertEquals(four, (ArrayLongArr) result);
201f0051698d4275162504611cd7c33df0eee45cdfemaslovalex    }
202f0051698d4275162504611cd7c33df0eee45cdfemaslovalex
203f0051698d4275162504611cd7c33df0eee45cdfemaslovalex    public static class Array2D {
204f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        private long[][] longs;
205f0051698d4275162504611cd7c33df0eee45cdfemaslovalex
206f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        public long[][] getLongs() {
207f0051698d4275162504611cd7c33df0eee45cdfemaslovalex            return longs;
208f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        }
209f0051698d4275162504611cd7c33df0eee45cdfemaslovalex
210f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        public void setLongs(long[][] longs) {
211f0051698d4275162504611cd7c33df0eee45cdfemaslovalex            this.longs = longs;
212f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        }
213f0051698d4275162504611cd7c33df0eee45cdfemaslovalex    }
214f0051698d4275162504611cd7c33df0eee45cdfemaslovalex
215f0051698d4275162504611cd7c33df0eee45cdfemaslovalex    public static class Array3D {
216f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        private long[][][] longs;
217f0051698d4275162504611cd7c33df0eee45cdfemaslovalex
218f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        public long[][][] getLongs() {
219f0051698d4275162504611cd7c33df0eee45cdfemaslovalex            return longs;
220f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        }
221f0051698d4275162504611cd7c33df0eee45cdfemaslovalex
222f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        public void setLongs(long[][][] longs) {
223f0051698d4275162504611cd7c33df0eee45cdfemaslovalex            this.longs = longs;
224f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        }
225f0051698d4275162504611cd7c33df0eee45cdfemaslovalex    }
226f0051698d4275162504611cd7c33df0eee45cdfemaslovalex
227f0051698d4275162504611cd7c33df0eee45cdfemaslovalex    public static class ArrayLongArr {
228f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        private LongArr[] contents;
229f0051698d4275162504611cd7c33df0eee45cdfemaslovalex
230f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        public LongArr[] getContents() {
231f0051698d4275162504611cd7c33df0eee45cdfemaslovalex            return contents;
232f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        }
233f0051698d4275162504611cd7c33df0eee45cdfemaslovalex
234f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        public void setContents(LongArr[] contents) {
235f0051698d4275162504611cd7c33df0eee45cdfemaslovalex            this.contents = contents;
236f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        }
237f0051698d4275162504611cd7c33df0eee45cdfemaslovalex
238f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        @Override
239f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        public boolean equals(Object obj) {
240f0051698d4275162504611cd7c33df0eee45cdfemaslovalex            if (!(obj instanceof ArrayLongArr))
241f0051698d4275162504611cd7c33df0eee45cdfemaslovalex                return false;
242f0051698d4275162504611cd7c33df0eee45cdfemaslovalex
243f0051698d4275162504611cd7c33df0eee45cdfemaslovalex            ArrayLongArr other = ((ArrayLongArr) obj);
244f0051698d4275162504611cd7c33df0eee45cdfemaslovalex            if (contents.length != other.getContents().length)
245f0051698d4275162504611cd7c33df0eee45cdfemaslovalex                return false;
246f0051698d4275162504611cd7c33df0eee45cdfemaslovalex            for (int i = 0; i < contents.length; ++i) {
247f0051698d4275162504611cd7c33df0eee45cdfemaslovalex                if (!Arrays.equals(contents[i].getLongs(), other.getContents()[i].getLongs())) {
248f0051698d4275162504611cd7c33df0eee45cdfemaslovalex                    return false;
249f0051698d4275162504611cd7c33df0eee45cdfemaslovalex                }
250f0051698d4275162504611cd7c33df0eee45cdfemaslovalex            }
251f0051698d4275162504611cd7c33df0eee45cdfemaslovalex
252f0051698d4275162504611cd7c33df0eee45cdfemaslovalex            return true;
253f0051698d4275162504611cd7c33df0eee45cdfemaslovalex        }
254f0051698d4275162504611cd7c33df0eee45cdfemaslovalex    }
255f0051698d4275162504611cd7c33df0eee45cdfemaslovalex}
256