19370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka/*
29370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka * Copyright (C) 2012 The Android Open Source Project
39370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka *
4ce6bcdd1a547c9874f05a08074cafdfea16196d6Tadashi G. Takaoka * Licensed under the Apache License, Version 2.0 (the "License");
5ce6bcdd1a547c9874f05a08074cafdfea16196d6Tadashi G. Takaoka * you may not use this file except in compliance with the License.
6ce6bcdd1a547c9874f05a08074cafdfea16196d6Tadashi G. Takaoka * You may obtain a copy of the License at
79370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka *
8ce6bcdd1a547c9874f05a08074cafdfea16196d6Tadashi G. Takaoka *      http://www.apache.org/licenses/LICENSE-2.0
99370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka *
109370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka * Unless required by applicable law or agreed to in writing, software
11ce6bcdd1a547c9874f05a08074cafdfea16196d6Tadashi G. Takaoka * distributed under the License is distributed on an "AS IS" BASIS,
12ce6bcdd1a547c9874f05a08074cafdfea16196d6Tadashi G. Takaoka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ce6bcdd1a547c9874f05a08074cafdfea16196d6Tadashi G. Takaoka * See the License for the specific language governing permissions and
14ce6bcdd1a547c9874f05a08074cafdfea16196d6Tadashi G. Takaoka * limitations under the License.
159370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka */
169370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka
17e28eba5074664d5716b8e58b8d0a235746b261ebKen Wakasapackage com.android.inputmethod.latin.utils;
189370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka
199370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaokaimport android.test.AndroidTestCase;
20b4598f7d05d6afd01ddc7ea0bed71dda837d1debTadashi G. Takaokaimport android.test.suitebuilder.annotation.SmallTest;
219370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka
2235091716e781c7ddb618bb4c251c5f43b6643f3eTadashi G. Takaokaimport java.util.Arrays;
2335091716e781c7ddb618bb4c251c5f43b6643f3eTadashi G. Takaoka
24b4598f7d05d6afd01ddc7ea0bed71dda837d1debTadashi G. Takaoka@SmallTest
259370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaokapublic class ResizableIntArrayTests extends AndroidTestCase {
269370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka    private static final int DEFAULT_CAPACITY = 48;
279370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka
289370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka    public void testNewInstance() {
299370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka        final ResizableIntArray src = new ResizableIntArray(DEFAULT_CAPACITY);
309370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka        final int[] array = src.getPrimitiveArray();
31c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        assertEquals("new instance length", 0, src.getLength());
32c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        assertNotNull("new instance array", array);
33c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        assertEquals("new instance array length", DEFAULT_CAPACITY, array.length);
349370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka    }
359370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka
369370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka    public void testAdd() {
379370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka        final ResizableIntArray src = new ResizableIntArray(DEFAULT_CAPACITY);
38c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        final int[] array = src.getPrimitiveArray();
39c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        int[] array2 = null, array3 = null;
40c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        final int limit = DEFAULT_CAPACITY * 2 + 10;
419370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka        for (int i = 0; i < limit; i++) {
429370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka            src.add(i);
439370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka            assertEquals("length after add " + i, i + 1, src.getLength());
447abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka            if (i == DEFAULT_CAPACITY) {
457abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka                array2 = src.getPrimitiveArray();
467abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka            }
477abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka            if (i == DEFAULT_CAPACITY * 2) {
487abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka                array3 = src.getPrimitiveArray();
497abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka            }
50c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka            if (i < DEFAULT_CAPACITY) {
51c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka                assertSame("array after add " + i, array, src.getPrimitiveArray());
52c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka            } else if (i < DEFAULT_CAPACITY * 2) {
53c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka                assertSame("array after add " + i, array2, src.getPrimitiveArray());
54c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka            } else if (i < DEFAULT_CAPACITY * 3) {
55c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka                assertSame("array after add " + i, array3, src.getPrimitiveArray());
56c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka            }
579370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka        }
589370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka        for (int i = 0; i < limit; i++) {
59c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka            assertEquals("value at " + i, i, src.get(i));
609370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka        }
619370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka    }
629370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka
639370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka    public void testAddAt() {
649370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka        final ResizableIntArray src = new ResizableIntArray(DEFAULT_CAPACITY);
65c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        final int limit = DEFAULT_CAPACITY * 10, step = DEFAULT_CAPACITY * 2;
669370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka        for (int i = 0; i < limit; i += step) {
679370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka            src.add(i, i);
689370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka            assertEquals("length after add at " + i, i + 1, src.getLength());
699370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka        }
709370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka        for (int i = 0; i < limit; i += step) {
71c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka            assertEquals("value at " + i, i, src.get(i));
72c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        }
73c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka    }
74c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka
75c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka    public void testGet() {
76c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        final ResizableIntArray src = new ResizableIntArray(DEFAULT_CAPACITY);
77c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        try {
78c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka            final int value = src.get(0);
79c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka            fail("get(0) shouldn't succeed");
80c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        } catch (ArrayIndexOutOfBoundsException e) {
81c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka            // success
82c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        }
83c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        try {
84c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka            final int value = src.get(DEFAULT_CAPACITY);
85c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka            fail("get(DEFAULT_CAPACITY) shouldn't succeed");
86c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        } catch (ArrayIndexOutOfBoundsException e) {
87c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka            // success
88c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        }
89c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka
90c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        final int index = DEFAULT_CAPACITY / 2;
91c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        src.add(index, 100);
92c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        assertEquals("legth after add at " + index, index + 1, src.getLength());
93c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        assertEquals("value after add at " + index, 100, src.get(index));
94c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        assertEquals("value after add at 0", 0, src.get(0));
95c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        try {
96c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka            final int value = src.get(src.getLength());
97c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka            fail("get(length) shouldn't succeed");
98c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        } catch (ArrayIndexOutOfBoundsException e) {
99c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka            // success
100c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        }
101c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka    }
102c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka
103c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka    public void testReset() {
104c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        final ResizableIntArray src = new ResizableIntArray(DEFAULT_CAPACITY);
105c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        final int[] array = src.getPrimitiveArray();
106c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        for (int i = 0; i < DEFAULT_CAPACITY; i++) {
107c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka            src.add(i);
108c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka            assertEquals("length after add " + i, i + 1, src.getLength());
109c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        }
110c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka
111c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        final int smallerLength = DEFAULT_CAPACITY / 2;
112c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        src.reset(smallerLength);
113c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        final int[] array2 = src.getPrimitiveArray();
114c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        assertEquals("length after reset", 0, src.getLength());
115c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        assertNotSame("array after reset", array, array2);
116c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka
117c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        int[] array3 = null;
118c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        for (int i = 0; i < DEFAULT_CAPACITY; i++) {
119c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka            src.add(i);
120c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka            assertEquals("length after add " + i, i + 1, src.getLength());
1217abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka            if (i == smallerLength) {
1227abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka                array3 = src.getPrimitiveArray();
1237abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka            }
124c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka            if (i < smallerLength) {
125c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka                assertSame("array after add " + i, array2, src.getPrimitiveArray());
126c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka            } else if (i < smallerLength * 2) {
127c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka                assertSame("array after add " + i, array3, src.getPrimitiveArray());
128c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka            }
129c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        }
130c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka    }
131c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka
132c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka    public void testSetLength() {
133c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        final ResizableIntArray src = new ResizableIntArray(DEFAULT_CAPACITY);
134c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        final int[] array = src.getPrimitiveArray();
135c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        for (int i = 0; i < DEFAULT_CAPACITY; i++) {
136c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka            src.add(i);
137c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka            assertEquals("length after add " + i, i + 1, src.getLength());
138c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        }
139c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka
140c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        final int largerLength = DEFAULT_CAPACITY * 2;
141c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        src.setLength(largerLength);
142c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        final int[] array2 = src.getPrimitiveArray();
143c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        assertEquals("length after larger setLength", largerLength, src.getLength());
144c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        assertNotSame("array after larger setLength", array, array2);
145c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        assertEquals("array length after larger setLength", largerLength, array2.length);
1467abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka        for (int i = 0; i < largerLength; i++) {
1477abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka            final int v = src.get(i);
1487abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka            if (i < DEFAULT_CAPACITY) {
1497abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka                assertEquals("value at " + i, i, v);
1507abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka            } else {
1517abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka                assertEquals("value at " + i, 0, v);
1527abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka            }
153c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        }
154c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka
155c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        final int smallerLength = DEFAULT_CAPACITY / 2;
156c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        src.setLength(smallerLength);
157c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        final int[] array3 = src.getPrimitiveArray();
158c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        assertEquals("length after smaller setLength", smallerLength, src.getLength());
159c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        assertSame("array after smaller setLength", array2, array3);
160c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        assertEquals("array length after smaller setLength", largerLength, array3.length);
161c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        for (int i = 0; i < smallerLength; i++) {
162c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka            assertEquals("value at " + i, i, src.get(i));
1639370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka        }
1649370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka    }
1659370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka
1669370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka    public void testSet() {
1679370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka        final ResizableIntArray src = new ResizableIntArray(DEFAULT_CAPACITY);
168c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        final int limit = DEFAULT_CAPACITY * 2 + 10;
1699370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka        for (int i = 0; i < limit; i++) {
1709370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka            src.add(i);
1719370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka        }
172c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka
1739370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka        final ResizableIntArray dst = new ResizableIntArray(DEFAULT_CAPACITY);
1749370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka        dst.set(src);
1759370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka        assertEquals("length after set", dst.getLength(), src.getLength());
1769370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka        assertSame("array after set", dst.getPrimitiveArray(), src.getPrimitiveArray());
1779370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka    }
1789370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka
1799370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka    public void testCopy() {
1809370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka        final ResizableIntArray src = new ResizableIntArray(DEFAULT_CAPACITY);
181c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        for (int i = 0; i < DEFAULT_CAPACITY; i++) {
1829370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka            src.add(i);
1839370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka        }
184c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka
1859370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka        final ResizableIntArray dst = new ResizableIntArray(DEFAULT_CAPACITY);
186c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        final int[] array = dst.getPrimitiveArray();
1879370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka        dst.copy(src);
1889370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka        assertEquals("length after copy", dst.getLength(), src.getLength());
189c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        assertSame("array after copy", array, dst.getPrimitiveArray());
1909370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka        assertNotSame("array after copy", dst.getPrimitiveArray(), src.getPrimitiveArray());
19135091716e781c7ddb618bb4c251c5f43b6643f3eTadashi G. Takaoka        assertIntArrayEquals("values after copy",
192c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka                dst.getPrimitiveArray(), 0, src.getPrimitiveArray(), 0, dst.getLength());
193c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka
194c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        final int smallerLength = DEFAULT_CAPACITY / 2;
195c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        dst.reset(smallerLength);
196c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        final int[] array2 = dst.getPrimitiveArray();
197c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        dst.copy(src);
198c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        final int[] array3 = dst.getPrimitiveArray();
199c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        assertEquals("length after copy to smaller", dst.getLength(), src.getLength());
200c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        assertNotSame("array after copy to smaller", array2, array3);
201c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        assertNotSame("array after copy to smaller", array3, src.getPrimitiveArray());
20235091716e781c7ddb618bb4c251c5f43b6643f3eTadashi G. Takaoka        assertIntArrayEquals("values after copy to smaller",
203c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka                dst.getPrimitiveArray(), 0, src.getPrimitiveArray(), 0, dst.getLength());
2049370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka    }
2059370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka
2069370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka    public void testAppend() {
207c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        final int srcLen = DEFAULT_CAPACITY;
208c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        final ResizableIntArray src = new ResizableIntArray(srcLen);
2099370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka        for (int i = 0; i < srcLen; i++) {
2109370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka            src.add(i);
2119370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka        }
212c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        final ResizableIntArray dst = new ResizableIntArray(DEFAULT_CAPACITY * 2);
213c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        final int[] array = dst.getPrimitiveArray();
214c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        final int dstLen = DEFAULT_CAPACITY / 2;
2159370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka        for (int i = 0; i < dstLen; i++) {
2169370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka            final int value = -i - 1;
2179370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka            dst.add(value);
2189370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka        }
2199370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka        final ResizableIntArray dstCopy = new ResizableIntArray(dst.getLength());
2209370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka        dstCopy.copy(dst);
2219370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka
2229370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka        dst.append(src, 0, 0);
2239370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka        assertEquals("length after append zero", dstLen, dst.getLength());
224c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        assertSame("array after append zero", array, dst.getPrimitiveArray());
22535091716e781c7ddb618bb4c251c5f43b6643f3eTadashi G. Takaoka        assertIntArrayEquals("values after append zero",
2269370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka                dstCopy.getPrimitiveArray(), 0, dst.getPrimitiveArray(), 0, dstLen);
2279370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka
2289370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka        dst.append(src, 0, srcLen);
2299370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka        assertEquals("length after append", dstLen + srcLen, dst.getLength());
230c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        assertSame("array after append", array, dst.getPrimitiveArray());
2319370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka        assertTrue("primitive length after append",
2329370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka                dst.getPrimitiveArray().length >= dstLen + srcLen);
23335091716e781c7ddb618bb4c251c5f43b6643f3eTadashi G. Takaoka        assertIntArrayEquals("original values after append",
2349370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka                dstCopy.getPrimitiveArray(), 0, dst.getPrimitiveArray(), 0, dstLen);
23535091716e781c7ddb618bb4c251c5f43b6643f3eTadashi G. Takaoka        assertIntArrayEquals("appended values after append",
2369370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka                src.getPrimitiveArray(), 0, dst.getPrimitiveArray(), dstLen, srcLen);
237c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka
238c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        dst.append(src, 0, srcLen);
239c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        assertEquals("length after 2nd append", dstLen + srcLen * 2, dst.getLength());
240c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        assertNotSame("array after 2nd append", array, dst.getPrimitiveArray());
241c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka        assertTrue("primitive length after 2nd append",
242c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka                dst.getPrimitiveArray().length >= dstLen + srcLen * 2);
24335091716e781c7ddb618bb4c251c5f43b6643f3eTadashi G. Takaoka        assertIntArrayEquals("original values after 2nd append",
244c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka                dstCopy.getPrimitiveArray(), 0, dst.getPrimitiveArray(), 0, dstLen);
24535091716e781c7ddb618bb4c251c5f43b6643f3eTadashi G. Takaoka        assertIntArrayEquals("appended values after 2nd append",
246c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka                src.getPrimitiveArray(), 0, dst.getPrimitiveArray(), dstLen, srcLen);
24735091716e781c7ddb618bb4c251c5f43b6643f3eTadashi G. Takaoka        assertIntArrayEquals("appended values after 2nd append",
248c49c85f835ecd14d09abb6d88c85a3303c566741Tadashi G. Takaoka                src.getPrimitiveArray(), 0, dst.getPrimitiveArray(), dstLen + srcLen, srcLen);
2499370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka    }
2509370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka
2517abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka    public void testFill() {
2527abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka        final int srcLen = DEFAULT_CAPACITY;
2537abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka        final ResizableIntArray src = new ResizableIntArray(srcLen);
2547abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka        for (int i = 0; i < srcLen; i++) {
2557abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka            src.add(i);
2567abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka        }
2577abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka        final int[] array = src.getPrimitiveArray();
2587abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka
2597abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka        final int startPos = srcLen / 3;
2607abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka        final int length = srcLen / 3;
2617abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka        final int endPos = startPos + length;
2627abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka        assertTrue(startPos >= 1);
2637abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka        final int value = 123;
2647abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka        try {
2657abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka            src.fill(value, -1, length);
2667abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka            fail("fill from -1 shouldn't succeed");
2677abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka        } catch (IllegalArgumentException e) {
2687abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka            // success
2697abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka        }
2707abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka        try {
2717abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka            src.fill(value, startPos, -1);
2727abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka            fail("fill negative length shouldn't succeed");
2737abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka        } catch (IllegalArgumentException e) {
2747abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka            // success
2757abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka        }
2767abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka
2777abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka        src.fill(value, startPos, length);
2787abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka        assertEquals("length after fill", srcLen, src.getLength());
2797abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka        assertSame("array after fill", array, src.getPrimitiveArray());
2807abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka        for (int i = 0; i < srcLen; i++) {
2817abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka            final int v = src.get(i);
2827abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka            if (i >= startPos && i < endPos) {
2837abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka                assertEquals("new values after fill at " + i, value, v);
2847abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka            } else {
2857abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka                assertEquals("unmodified values after fill at " + i, i, v);
2867abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka            }
2877abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka        }
2887abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka
2897abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka        final int length2 = srcLen * 2 - startPos;
2907abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka        final int largeEnd = startPos + length2;
2917abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka        assertTrue(largeEnd > srcLen);
2927abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka        final int value2 = 456;
2937abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka        src.fill(value2, startPos, length2);
2947abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka        assertEquals("length after large fill", largeEnd, src.getLength());
2957abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka        assertNotSame("array after large fill", array, src.getPrimitiveArray());
2967abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka        for (int i = 0; i < largeEnd; i++) {
2977abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka            final int v = src.get(i);
2987abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka            if (i >= startPos && i < largeEnd) {
2997abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka                assertEquals("new values after large fill at " + i, value2, v);
3007abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka            } else {
3017abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka                assertEquals("unmodified values after large fill at " + i, i, v);
3027abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka            }
3037abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka        }
3047abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka
3057abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka        final int startPos2 = largeEnd + length2;
3067abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka        final int endPos2 = startPos2 + length2;
3077abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka        final int value3 = 789;
3087abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka        src.fill(value3, startPos2, length2);
3097abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka        assertEquals("length after disjoint fill", endPos2, src.getLength());
3107abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka        for (int i = 0; i < endPos2; i++) {
3117abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka            final int v = src.get(i);
3127abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka            if (i >= startPos2 && i < endPos2) {
3137abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka                assertEquals("new values after disjoint fill at " + i, value3, v);
3147abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka            } else if (i >= startPos && i < largeEnd) {
3157abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka                assertEquals("unmodified values after disjoint fill at " + i, value2, v);
3167abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka            } else if (i < startPos) {
3177abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka                assertEquals("unmodified values after disjoint fill at " + i, i, v);
3187abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka            } else {
3197abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka                assertEquals("gap values after disjoint fill at " + i, 0, v);
3207abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka            }
3217abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka        }
3227abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka    }
3237abdcf1ed3113d3c121f6ff1b87a7464f079e141Tadashi G. Takaoka
32435091716e781c7ddb618bb4c251c5f43b6643f3eTadashi G. Takaoka    private static void assertIntArrayEquals(final String message, final int[] expecteds,
32535091716e781c7ddb618bb4c251c5f43b6643f3eTadashi G. Takaoka            final int expectedPos, final int[] actuals, final int actualPos, final int length) {
32635091716e781c7ddb618bb4c251c5f43b6643f3eTadashi G. Takaoka        if (expecteds == actuals) {
3279370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka            return;
3289370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka        }
3299370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka        if (expecteds == null || actuals == null) {
33035091716e781c7ddb618bb4c251c5f43b6643f3eTadashi G. Takaoka            assertEquals(message, Arrays.toString(expecteds), Arrays.toString(actuals));
33135091716e781c7ddb618bb4c251c5f43b6643f3eTadashi G. Takaoka            return;
33235091716e781c7ddb618bb4c251c5f43b6643f3eTadashi G. Takaoka        }
33335091716e781c7ddb618bb4c251c5f43b6643f3eTadashi G. Takaoka        if (expecteds.length < expectedPos + length || actuals.length < actualPos + length) {
33435091716e781c7ddb618bb4c251c5f43b6643f3eTadashi G. Takaoka            fail(message + ": insufficient length: expecteds=" + Arrays.toString(expecteds)
33535091716e781c7ddb618bb4c251c5f43b6643f3eTadashi G. Takaoka                    + " actuals=" + Arrays.toString(actuals));
33635091716e781c7ddb618bb4c251c5f43b6643f3eTadashi G. Takaoka            return;
3379370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka        }
3389370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka        for (int i = 0; i < length; i++) {
33935091716e781c7ddb618bb4c251c5f43b6643f3eTadashi G. Takaoka            assertEquals(message + " [" + i + "]",
3409370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka                    expecteds[i + expectedPos], actuals[i + actualPos]);
3419370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka        }
3429370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka    }
343e8754aba1c8f217e7ca828de25e0506ac58daa99Keisuke Kuroyanagi
344e8754aba1c8f217e7ca828de25e0506ac58daa99Keisuke Kuroyanagi    public void testShift() {
345e8754aba1c8f217e7ca828de25e0506ac58daa99Keisuke Kuroyanagi        final ResizableIntArray src = new ResizableIntArray(DEFAULT_CAPACITY);
346e8754aba1c8f217e7ca828de25e0506ac58daa99Keisuke Kuroyanagi        final int limit = DEFAULT_CAPACITY * 10;
347e8754aba1c8f217e7ca828de25e0506ac58daa99Keisuke Kuroyanagi        final int shiftAmount = 20;
348e8754aba1c8f217e7ca828de25e0506ac58daa99Keisuke Kuroyanagi        for (int i = 0; i < limit; ++i) {
349e8754aba1c8f217e7ca828de25e0506ac58daa99Keisuke Kuroyanagi            src.add(i, i);
350e8754aba1c8f217e7ca828de25e0506ac58daa99Keisuke Kuroyanagi            assertEquals("length after add at " + i, i + 1, src.getLength());
351e8754aba1c8f217e7ca828de25e0506ac58daa99Keisuke Kuroyanagi        }
352e8754aba1c8f217e7ca828de25e0506ac58daa99Keisuke Kuroyanagi        src.shift(shiftAmount);
353e8754aba1c8f217e7ca828de25e0506ac58daa99Keisuke Kuroyanagi        for (int i = 0; i < limit - shiftAmount; ++i) {
354e8754aba1c8f217e7ca828de25e0506ac58daa99Keisuke Kuroyanagi            assertEquals("value at " + i, i + shiftAmount, src.get(i));
355e8754aba1c8f217e7ca828de25e0506ac58daa99Keisuke Kuroyanagi        }
356e8754aba1c8f217e7ca828de25e0506ac58daa99Keisuke Kuroyanagi    }
3579370ab9adad3b4bc3af8bde52b6422b8d2b873e7Tadashi G. Takaoka}
358