18f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle/* 28f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Written by Doug Lea with assistance from members of JCP JSR-166 38f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Expert Group and released to the public domain, as explained at 48f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * http://creativecommons.org/publicdomain/zero/1.0/ 58f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Other contributors include Andrew Wright, Jeffrey Hayes, 68f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Pat Fisher, Mike Judd. 78f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 88f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 98f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlepackage jsr166; 108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.Arrays; 128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.atomic.AtomicReferenceArray; 138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 148e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport junit.framework.Test; 158e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport junit.framework.TestSuite; 168e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath 178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlepublic class AtomicReferenceArrayTest extends JSR166TestCase { 188e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // android-note: Removed because the CTS runner does a bad job of 198e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // retrying tests that have suite() declarations. 208e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // 218e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // public static void main(String[] args) { 228e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // main(suite(), args); 238e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // } 248e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // public static Test suite() { 258e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // return new TestSuite(...); 268e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // } 278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * constructor creates array of given size with all elements null 308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testConstructor() { 328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AtomicReferenceArray<Integer> aa = new AtomicReferenceArray<Integer>(SIZE); 338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; i++) { 348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertNull(aa.get(i)); 358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * constructor with null array throws NPE 408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testConstructor2NPE() { 428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Integer[] a = null; 448e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath new AtomicReferenceArray<Integer>(a); 458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (NullPointerException success) {} 478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * constructor with array is of same size and has all elements 518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testConstructor2() { 538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Integer[] a = { two, one, three, four, seven }; 548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AtomicReferenceArray<Integer> aa = new AtomicReferenceArray<Integer>(a); 558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(a.length, aa.length()); 568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < a.length; i++) 578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(a[i], aa.get(i)); 588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Initialize AtomicReferenceArray<Class> with SubClass[] 628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testConstructorSubClassArray() { 648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Integer[] a = { two, one, three, four, seven }; 658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AtomicReferenceArray<Number> aa = new AtomicReferenceArray<Number>(a); 668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(a.length, aa.length()); 678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < a.length; i++) { 688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(a[i], aa.get(i)); 698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Long x = Long.valueOf(i); 708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle aa.set(i, x); 718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(x, aa.get(i)); 728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * get and set for out of bound indices throw IndexOutOfBoundsException 778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testIndexing() { 798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AtomicReferenceArray<Integer> aa = new AtomicReferenceArray<Integer>(SIZE); 808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int index : new int[] { -1, SIZE }) { 818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle aa.get(index); 838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (IndexOutOfBoundsException success) {} 858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle aa.set(index, null); 878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (IndexOutOfBoundsException success) {} 898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle aa.lazySet(index, null); 918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (IndexOutOfBoundsException success) {} 938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle aa.compareAndSet(index, null, null); 958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (IndexOutOfBoundsException success) {} 978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle aa.weakCompareAndSet(index, null, null); 998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 1008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (IndexOutOfBoundsException success) {} 1018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 1058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * get returns the last value set at index 1068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 1078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testGetSet() { 1088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AtomicReferenceArray aa = new AtomicReferenceArray(SIZE); 1098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; i++) { 1108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle aa.set(i, one); 1118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(one, aa.get(i)); 1128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle aa.set(i, two); 1138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(two, aa.get(i)); 1148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle aa.set(i, m3); 1158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(m3, aa.get(i)); 1168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 1208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * get returns the last value lazySet at index by same thread 1218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 1228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testGetLazySet() { 1238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AtomicReferenceArray aa = new AtomicReferenceArray(SIZE); 1248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; i++) { 1258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle aa.lazySet(i, one); 1268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(one, aa.get(i)); 1278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle aa.lazySet(i, two); 1288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(two, aa.get(i)); 1298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle aa.lazySet(i, m3); 1308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(m3, aa.get(i)); 1318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 1358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * compareAndSet succeeds in changing value if equal to expected else fails 1368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 1378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testCompareAndSet() { 1388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AtomicReferenceArray aa = new AtomicReferenceArray(SIZE); 1398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; i++) { 1408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle aa.set(i, one); 1418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(aa.compareAndSet(i, one, two)); 1428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(aa.compareAndSet(i, two, m4)); 1438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(m4, aa.get(i)); 1448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(aa.compareAndSet(i, m5, seven)); 1458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(m4, aa.get(i)); 1468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(aa.compareAndSet(i, m4, seven)); 1478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(seven, aa.get(i)); 1488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 1528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * compareAndSet in one thread enables another waiting for value 1538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * to succeed 1548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 1558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testCompareAndSetInMultipleThreads() throws InterruptedException { 1568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final AtomicReferenceArray a = new AtomicReferenceArray(1); 1578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle a.set(0, one); 1588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t = new Thread(new CheckedRunnable() { 1598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() { 1608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle while (!a.compareAndSet(0, two, three)) 1618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread.yield(); 1628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 1638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle t.start(); 1658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(a.compareAndSet(0, one, two)); 1668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle t.join(LONG_DELAY_MS); 1678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(t.isAlive()); 1688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(three, a.get(0)); 1698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 1728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * repeated weakCompareAndSet succeeds in changing value when equal 1738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * to expected 1748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 1758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testWeakCompareAndSet() { 1768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AtomicReferenceArray aa = new AtomicReferenceArray(SIZE); 1778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; i++) { 1788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle aa.set(i, one); 1798e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath do {} while (!aa.weakCompareAndSet(i, one, two)); 1808e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath do {} while (!aa.weakCompareAndSet(i, two, m4)); 1818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(m4, aa.get(i)); 1828e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath do {} while (!aa.weakCompareAndSet(i, m4, seven)); 1838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(seven, aa.get(i)); 1848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 1888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * getAndSet returns previous value and sets to given value at given index 1898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 1908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testGetAndSet() { 1918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AtomicReferenceArray aa = new AtomicReferenceArray(SIZE); 1928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; i++) { 1938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle aa.set(i, one); 1948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(one, aa.getAndSet(i, zero)); 1958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(zero, aa.getAndSet(i, m10)); 1968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(m10, aa.getAndSet(i, one)); 1978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 2018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * a deserialized serialized array holds same values 2028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 2038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testSerialization() throws Exception { 2048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AtomicReferenceArray x = new AtomicReferenceArray(SIZE); 2058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; i++) { 2068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle x.set(i, new Integer(-i)); 2078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AtomicReferenceArray y = serialClone(x); 2098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertNotSame(x, y); 2108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(x.length(), y.length()); 2118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < SIZE; i++) { 2128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(x.get(i), y.get(i)); 2138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 2178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * toString returns current value. 2188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 2198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testToString() { 2208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Integer[] a = { two, one, three, four, seven }; 2218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AtomicReferenceArray<Integer> aa = new AtomicReferenceArray<Integer>(a); 2228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(Arrays.toString(a), aa.toString()); 2238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle} 225