1c3adcfb1339de546aed6e7ff00a7edb020b8a85bElliott Hughes/*
2c3adcfb1339de546aed6e7ff00a7edb020b8a85bElliott Hughes * Copyright (C) 2011 The Android Open Source Project
3c3adcfb1339de546aed6e7ff00a7edb020b8a85bElliott Hughes *
4c3adcfb1339de546aed6e7ff00a7edb020b8a85bElliott Hughes * Licensed under the Apache License, Version 2.0 (the "License");
5c3adcfb1339de546aed6e7ff00a7edb020b8a85bElliott Hughes * you may not use this file except in compliance with the License.
6c3adcfb1339de546aed6e7ff00a7edb020b8a85bElliott Hughes * You may obtain a copy of the License at
7c3adcfb1339de546aed6e7ff00a7edb020b8a85bElliott Hughes *
8c3adcfb1339de546aed6e7ff00a7edb020b8a85bElliott Hughes *      http://www.apache.org/licenses/LICENSE-2.0
9c3adcfb1339de546aed6e7ff00a7edb020b8a85bElliott Hughes *
10c3adcfb1339de546aed6e7ff00a7edb020b8a85bElliott Hughes * Unless required by applicable law or agreed to in writing, software
11c3adcfb1339de546aed6e7ff00a7edb020b8a85bElliott Hughes * distributed under the License is distributed on an "AS IS" BASIS,
12c3adcfb1339de546aed6e7ff00a7edb020b8a85bElliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c3adcfb1339de546aed6e7ff00a7edb020b8a85bElliott Hughes * See the License for the specific language governing permissions and
14c3adcfb1339de546aed6e7ff00a7edb020b8a85bElliott Hughes * limitations under the License.
15c3adcfb1339de546aed6e7ff00a7edb020b8a85bElliott Hughes */
16c3adcfb1339de546aed6e7ff00a7edb020b8a85bElliott Hughes
17c3adcfb1339de546aed6e7ff00a7edb020b8a85bElliott Hughespackage libcore.java.lang;
18c3adcfb1339de546aed6e7ff00a7edb020b8a85bElliott Hughes
19e2f147b9b14c7645f29e92758f811a18258feef4Yi Kongimport java.math.BigInteger;
20adb70766cf4d670bd9837c944de801061493038bCalin Juravleimport java.util.Properties;
21adb70766cf4d670bd9837c944de801061493038bCalin Juravle
22c3adcfb1339de546aed6e7ff00a7edb020b8a85bElliott Hughespublic class LongTest extends junit.framework.TestCase {
23adb70766cf4d670bd9837c944de801061493038bCalin Juravle
246b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle    public void testSystemProperties() {
25adb70766cf4d670bd9837c944de801061493038bCalin Juravle        Properties originalProperties = System.getProperties();
26adb70766cf4d670bd9837c944de801061493038bCalin Juravle        try {
27adb70766cf4d670bd9837c944de801061493038bCalin Juravle            Properties testProperties = new Properties();
28adb70766cf4d670bd9837c944de801061493038bCalin Juravle            testProperties.put("testIncLong", "string");
29adb70766cf4d670bd9837c944de801061493038bCalin Juravle            System.setProperties(testProperties);
30adb70766cf4d670bd9837c944de801061493038bCalin Juravle            assertNull(Long.getLong("testIncLong"));
31adb70766cf4d670bd9837c944de801061493038bCalin Juravle            assertEquals(new Long(4), Long.getLong("testIncLong", 4L));
32adb70766cf4d670bd9837c944de801061493038bCalin Juravle            assertEquals(new Long(4), Long.getLong("testIncLong", new Long(4)));
33adb70766cf4d670bd9837c944de801061493038bCalin Juravle        } finally {
34adb70766cf4d670bd9837c944de801061493038bCalin Juravle            System.setProperties(originalProperties);
35adb70766cf4d670bd9837c944de801061493038bCalin Juravle        }
36adb70766cf4d670bd9837c944de801061493038bCalin Juravle    }
37adb70766cf4d670bd9837c944de801061493038bCalin Juravle
386b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle    public void testCompare() throws Exception {
39c3adcfb1339de546aed6e7ff00a7edb020b8a85bElliott Hughes        final long min = Long.MIN_VALUE;
40c3adcfb1339de546aed6e7ff00a7edb020b8a85bElliott Hughes        final long zero = 0L;
41c3adcfb1339de546aed6e7ff00a7edb020b8a85bElliott Hughes        final long max = Long.MAX_VALUE;
42c3adcfb1339de546aed6e7ff00a7edb020b8a85bElliott Hughes        assertTrue(Long.compare(max,  max)  == 0);
43c3adcfb1339de546aed6e7ff00a7edb020b8a85bElliott Hughes        assertTrue(Long.compare(min,  min)  == 0);
44c3adcfb1339de546aed6e7ff00a7edb020b8a85bElliott Hughes        assertTrue(Long.compare(zero, zero) == 0);
45c3adcfb1339de546aed6e7ff00a7edb020b8a85bElliott Hughes        assertTrue(Long.compare(max,  zero) > 0);
46c3adcfb1339de546aed6e7ff00a7edb020b8a85bElliott Hughes        assertTrue(Long.compare(max,  min)  > 0);
47c3adcfb1339de546aed6e7ff00a7edb020b8a85bElliott Hughes        assertTrue(Long.compare(zero, max)  < 0);
48c3adcfb1339de546aed6e7ff00a7edb020b8a85bElliott Hughes        assertTrue(Long.compare(zero, min)  > 0);
49c3adcfb1339de546aed6e7ff00a7edb020b8a85bElliott Hughes        assertTrue(Long.compare(min,  zero) < 0);
50c3adcfb1339de546aed6e7ff00a7edb020b8a85bElliott Hughes        assertTrue(Long.compare(min,  max)  < 0);
51c3adcfb1339de546aed6e7ff00a7edb020b8a85bElliott Hughes    }
52769ff93bf19951ac9a345e783927132438aabf3cElliott Hughes
536b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle    public void testSignum() throws Exception {
54769ff93bf19951ac9a345e783927132438aabf3cElliott Hughes        assertEquals(0, Long.signum(0));
55769ff93bf19951ac9a345e783927132438aabf3cElliott Hughes        assertEquals(1, Long.signum(1));
56769ff93bf19951ac9a345e783927132438aabf3cElliott Hughes        assertEquals(-1, Long.signum(-1));
57769ff93bf19951ac9a345e783927132438aabf3cElliott Hughes        assertEquals(1, Long.signum(Long.MAX_VALUE));
58769ff93bf19951ac9a345e783927132438aabf3cElliott Hughes        assertEquals(-1, Long.signum(Long.MIN_VALUE));
59769ff93bf19951ac9a345e783927132438aabf3cElliott Hughes    }
60ae6e60bf18b455b1134b8b57a56b37cc588e179dCalin Juravle
6146e3649f898305d185fc40bae2542e933a16b619Piotr Jastrzebski    /*
626b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle    public void testParsePositiveLong() throws Exception {
63ae6e60bf18b455b1134b8b57a56b37cc588e179dCalin Juravle        assertEquals(0, Long.parsePositiveLong("0", 10));
64ae6e60bf18b455b1134b8b57a56b37cc588e179dCalin Juravle        assertEquals(473, Long.parsePositiveLong("473", 10));
65ae6e60bf18b455b1134b8b57a56b37cc588e179dCalin Juravle        assertEquals(255, Long.parsePositiveLong("FF", 16));
66ae6e60bf18b455b1134b8b57a56b37cc588e179dCalin Juravle
67ae6e60bf18b455b1134b8b57a56b37cc588e179dCalin Juravle        try {
68ae6e60bf18b455b1134b8b57a56b37cc588e179dCalin Juravle            Long.parsePositiveLong("-1", 10);
69ae6e60bf18b455b1134b8b57a56b37cc588e179dCalin Juravle            fail();
70ae6e60bf18b455b1134b8b57a56b37cc588e179dCalin Juravle        } catch (NumberFormatException e) {}
71ae6e60bf18b455b1134b8b57a56b37cc588e179dCalin Juravle
72ae6e60bf18b455b1134b8b57a56b37cc588e179dCalin Juravle        try {
73ae6e60bf18b455b1134b8b57a56b37cc588e179dCalin Juravle            Long.parsePositiveLong("+1", 10);
74ae6e60bf18b455b1134b8b57a56b37cc588e179dCalin Juravle            fail();
75ae6e60bf18b455b1134b8b57a56b37cc588e179dCalin Juravle        } catch (NumberFormatException e) {}
76ae6e60bf18b455b1134b8b57a56b37cc588e179dCalin Juravle
77ae6e60bf18b455b1134b8b57a56b37cc588e179dCalin Juravle        try {
78ae6e60bf18b455b1134b8b57a56b37cc588e179dCalin Juravle            Long.parsePositiveLong("+0", 16);
79ae6e60bf18b455b1134b8b57a56b37cc588e179dCalin Juravle            fail();
80ae6e60bf18b455b1134b8b57a56b37cc588e179dCalin Juravle        } catch (NumberFormatException e) {}
81ae6e60bf18b455b1134b8b57a56b37cc588e179dCalin Juravle    }
8246e3649f898305d185fc40bae2542e933a16b619Piotr Jastrzebski    */
83ae6e60bf18b455b1134b8b57a56b37cc588e179dCalin Juravle
846b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle    public void testParseLong() throws Exception {
856b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle        assertEquals(0, Long.parseLong("+0", 10));
866b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle        assertEquals(473, Long.parseLong("+473", 10));
876b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle        assertEquals(255, Long.parseLong("+FF", 16));
886b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle        assertEquals(102, Long.parseLong("+1100110", 2));
896b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle        assertEquals(Long.MAX_VALUE, Long.parseLong("+" + Long.MAX_VALUE, 10));
906b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle        assertEquals(411787, Long.parseLong("Kona", 27));
916b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle        assertEquals(411787, Long.parseLong("+Kona", 27));
926b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle        assertEquals(-145, Long.parseLong("-145", 10));
936b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle
946b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle        try {
956b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle            Long.parseLong("--1", 10); // multiple sign chars
966b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle            fail();
976b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle        } catch (NumberFormatException expected) {}
986b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle
996b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle        try {
1006b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle            Long.parseLong("++1", 10); // multiple sign chars
1016b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle            fail();
1026b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle        } catch (NumberFormatException expected) {}
1036b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle
1046b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle        try {
1056b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle            Long.parseLong("Kona", 10); // base to small
1066b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle            fail();
1076b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle        } catch (NumberFormatException expected) {}
1086b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle    }
1096b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle
1106b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle    public void testDecodeLong() throws Exception {
1116b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle        assertEquals(0, Long.decode("+0").longValue());
1126b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle        assertEquals(473, Long.decode("+473").longValue());
1136b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle        assertEquals(255, Long.decode("+0xFF").longValue());
1146b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle        assertEquals(16, Long.decode("+020").longValue());
1156b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle        assertEquals(Long.MAX_VALUE, Long.decode("+" + Long.MAX_VALUE).longValue());
1166b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle        assertEquals(-73, Long.decode("-73").longValue());
1176b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle        assertEquals(-255, Long.decode("-0xFF").longValue());
1186b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle        assertEquals(255, Long.decode("+#FF").longValue());
1196b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle        assertEquals(-255, Long.decode("-#FF").longValue());
1206b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle
1216b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle        try {
1226b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle            Long.decode("--1"); // multiple sign chars
1236b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle            fail();
1246b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle        } catch (NumberFormatException expected) {}
1256b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle
1266b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle        try {
1276b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle            Long.decode("++1"); // multiple sign chars
1286b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle            fail();
1296b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle        } catch (NumberFormatException expected) {}
1306b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle
1316b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle        try {
1326b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle            Long.decode("+-1"); // multiple sign chars
1336b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle            fail();
1346b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle        } catch (NumberFormatException expected) {}
1356b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle
1366b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle        try {
1376b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle            Long.decode("Kona"); // invalid number
1386b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle            fail();
1396b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle        } catch (NumberFormatException expected) {}
1406b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle    }
1416b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle
1422729b8c4d261706b2ed7b17930d91c2b25e9a315Narayan Kamath    public void testStaticHashCode() {
1432729b8c4d261706b2ed7b17930d91c2b25e9a315Narayan Kamath        assertEquals(Long.valueOf(567L).hashCode(), Long.hashCode(567L));
1442729b8c4d261706b2ed7b17930d91c2b25e9a315Narayan Kamath    }
1452729b8c4d261706b2ed7b17930d91c2b25e9a315Narayan Kamath
1462729b8c4d261706b2ed7b17930d91c2b25e9a315Narayan Kamath    public void testMax() {
1472729b8c4d261706b2ed7b17930d91c2b25e9a315Narayan Kamath        long a = 567L;
1482729b8c4d261706b2ed7b17930d91c2b25e9a315Narayan Kamath        long b = 578L;
1492729b8c4d261706b2ed7b17930d91c2b25e9a315Narayan Kamath        assertEquals(Math.max(a, b), Long.max(a, b));
1502729b8c4d261706b2ed7b17930d91c2b25e9a315Narayan Kamath    }
1512729b8c4d261706b2ed7b17930d91c2b25e9a315Narayan Kamath
1522729b8c4d261706b2ed7b17930d91c2b25e9a315Narayan Kamath    public void testMin() {
1532729b8c4d261706b2ed7b17930d91c2b25e9a315Narayan Kamath        long a = 567L;
1542729b8c4d261706b2ed7b17930d91c2b25e9a315Narayan Kamath        long b = 578L;
1552729b8c4d261706b2ed7b17930d91c2b25e9a315Narayan Kamath        assertEquals(Math.min(a, b), Long.min(a, b));
1562729b8c4d261706b2ed7b17930d91c2b25e9a315Narayan Kamath    }
1572729b8c4d261706b2ed7b17930d91c2b25e9a315Narayan Kamath
1582729b8c4d261706b2ed7b17930d91c2b25e9a315Narayan Kamath    public void testSum() {
1592729b8c4d261706b2ed7b17930d91c2b25e9a315Narayan Kamath        long a = 567L;
1602729b8c4d261706b2ed7b17930d91c2b25e9a315Narayan Kamath        long b = 578L;
1612729b8c4d261706b2ed7b17930d91c2b25e9a315Narayan Kamath        assertEquals(a + b, Long.sum(a, b));
1622729b8c4d261706b2ed7b17930d91c2b25e9a315Narayan Kamath    }
163cf86f3319e738c76c5e97ad95bb8a4e30654a787Yi Kong
164cf86f3319e738c76c5e97ad95bb8a4e30654a787Yi Kong    public void testBYTES() {
165cf86f3319e738c76c5e97ad95bb8a4e30654a787Yi Kong        assertEquals(8, Long.BYTES);
166cf86f3319e738c76c5e97ad95bb8a4e30654a787Yi Kong    }
167e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong
168e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong    public void testCompareUnsigned() {
169e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong        long[] ordVals = {0L, 1L, 23L, 456L, 0x7fff_ffff_ffff_ffffL, 0x8000_0000_0000_0000L,
170e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong                0xffff_ffff_ffff_ffffL};
171e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong        for(int i = 0; i < ordVals.length; ++i) {
172e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong            for(int j = 0; j < ordVals.length; ++j) {
173e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong                assertEquals(Integer.compare(i, j),
174e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong                        Long.compareUnsigned(ordVals[i], ordVals[j]));
175e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong            }
176e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong        }
177e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong    }
178e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong
179e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong    public void testDivideAndRemainderUnsigned() {
180e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong        BigInteger[] vals = {
181e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong                BigInteger.ONE,
182e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong                BigInteger.valueOf(23L),
183e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong                BigInteger.valueOf(456L),
184e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong                BigInteger.valueOf(0x7fff_ffff_ffff_ffffL),
185e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong                BigInteger.valueOf(0x7fff_ffff_ffff_ffffL).add(BigInteger.ONE),
186e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong                BigInteger.valueOf(2).shiftLeft(63).subtract(BigInteger.ONE)
187e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong        };
188e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong
189e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong        for(BigInteger dividend : vals) {
190e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong            for(BigInteger divisor : vals) {
191e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong                long uq = Long.divideUnsigned(dividend.longValue(), divisor.longValue());
192e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong                long ur = Long.remainderUnsigned(dividend.longValue(), divisor.longValue());
193e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong                assertEquals(dividend.divide(divisor).longValue(), uq);
194e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong                assertEquals(dividend.remainder(divisor).longValue(), ur);
195e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong                assertEquals(dividend.longValue(), uq * divisor.longValue() + ur);
196e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong            }
197e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong        }
198e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong
199e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong        for(BigInteger dividend : vals) {
200e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong            try {
201e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong                Long.divideUnsigned(dividend.longValue(), 0);
202e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong                fail();
203e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong            } catch (ArithmeticException expected) { }
204e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong            try {
205e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong                Long.remainderUnsigned(dividend.longValue(), 0);
206e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong                fail();
207e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong            } catch (ArithmeticException expected) { }
208e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong        }
209e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong    }
210e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong
211e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong    public void testParseUnsignedLong() {
212e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong        long[] vals = {0L, 1L, 23L, 456L, 0x7fff_ffff_ffff_ffffL, 0x8000_0000_0000_0000L,
213e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong                0xffff_ffff_ffff_ffffL};
214e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong
215e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong        for(long val : vals) {
216e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong            // Special radices
217e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong            assertEquals(val, Long.parseUnsignedLong(Long.toBinaryString(val), 2));
218e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong            assertEquals(val, Long.parseUnsignedLong(Long.toOctalString(val), 8));
219e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong            assertEquals(val, Long.parseUnsignedLong(Long.toUnsignedString(val)));
220e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong            assertEquals(val, Long.parseUnsignedLong(Long.toHexString(val), 16));
221e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong
222e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong            for(int radix = Character.MIN_RADIX; radix <= Character.MAX_RADIX; ++radix) {
223e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong                assertEquals(val,
224e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong                        Long.parseUnsignedLong(Long.toUnsignedString(val, radix), radix));
225e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong            }
226e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong        }
227e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong
228e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong        try {
229e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong            Long.parseUnsignedLong("-1");
230e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong            fail();
231e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong        } catch (NumberFormatException expected) { }
232e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong        try {
233e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong            Long.parseUnsignedLong("123", 2);
234e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong            fail();
235e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong        } catch (NumberFormatException expected) { }
236e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong        try {
237e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong            Long.parseUnsignedLong(null, 2);
238e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong            fail();
239e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong        } catch (NumberFormatException expected) { }
240e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong        try {
241e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong            Long.parseUnsignedLong("0", Character.MAX_RADIX + 1);
242e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong            fail();
243e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong        } catch (NumberFormatException expected) { }
244e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong        try {
245e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong            Long.parseUnsignedLong("0", Character.MIN_RADIX - 1);
246e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong            fail();
247e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong        } catch (NumberFormatException expected) { }
248e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong    }
249e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong
250e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong    public void testToUnsignedString() {
251e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong        long[] vals = {0L, 1L, 23L, 456L, 0x7fff_ffff_ffff_ffffL, 0x8000_0000_0000_0000L,
252e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong                0xffff_ffff_ffff_ffffL};
253e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong
254e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong        for(long val : vals) {
255e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong            // Special radices
256e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong            assertTrue(Long.toUnsignedString(val, 2).equals(Long.toBinaryString(val)));
257e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong            assertTrue(Long.toUnsignedString(val, 8).equals(Long.toOctalString(val)));
258e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong            assertTrue(Long.toUnsignedString(val, 10).equals(Long.toUnsignedString(val)));
259e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong            assertTrue(Long.toUnsignedString(val, 16).equals(Long.toHexString(val)));
260e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong
261e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong            for(int radix = Character.MIN_RADIX; radix <= Character.MAX_RADIX; ++radix) {
262e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong                int upper = (int) (val >>> 32), lower = (int) val;
263e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong                BigInteger b = (BigInteger.valueOf(Integer.toUnsignedLong(upper))).shiftLeft(32).
264e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong                        add(BigInteger.valueOf(Integer.toUnsignedLong(lower)));
265e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong
266e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong                assertTrue(Long.toUnsignedString(val, radix).equals(b.toString(radix)));
267e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong            }
268e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong
269e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong            // Behavior is not defined by Java API specification if the radix falls outside of valid
270e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong            // range, thus we don't test for such cases.
271e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong        }
272e2f147b9b14c7645f29e92758f811a18258feef4Yi Kong    }
273c3adcfb1339de546aed6e7ff00a7edb020b8a85bElliott Hughes}
274