package org.apache.lucene.util;
/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import java.util.Random;
public class TestArrayUtil extends LuceneTestCase {
// Ensure ArrayUtil.getNextSize gives linear amortized cost of realloc/copy
public void testGrowth() {
int currentSize = 0;
long copyCost = 0;
// Make sure ArrayUtil hits Integer.MAX_VALUE, if we insist:
while(currentSize != Integer.MAX_VALUE) {
int nextSize = ArrayUtil.oversize(1+currentSize, RamUsageEstimator.NUM_BYTES_OBJECT_REF);
assertTrue(nextSize > currentSize);
if (currentSize > 0) {
copyCost += currentSize;
double copyCostPerElement = ((double) copyCost)/currentSize;
assertTrue("cost " + copyCostPerElement, copyCostPerElement < 10.0);
}
currentSize = nextSize;
}
}
public void testMaxSize() {
// intentionally pass invalid elemSizes:
for(int elemSize=0;elemSize<10;elemSize++) {
assertEquals(Integer.MAX_VALUE, ArrayUtil.oversize(Integer.MAX_VALUE, elemSize));
assertEquals(Integer.MAX_VALUE, ArrayUtil.oversize(Integer.MAX_VALUE-1, elemSize));
}
}
public void testInvalidElementSizes() {
final Random r = newRandom();
int num = 10000 * RANDOM_MULTIPLIER;
for (int iter = 0; iter < num; iter++) {
final int minTargetSize = r.nextInt(Integer.MAX_VALUE);
final int elemSize = r.nextInt(11);
final int v = ArrayUtil.oversize(minTargetSize, elemSize);
assertTrue(v >= minTargetSize);
}
}
public void testParseInt() throws Exception {
int test;
try {
test = ArrayUtil.parseInt("".toCharArray());
assertTrue(false);
} catch (NumberFormatException e) {
//expected
}
try {
test = ArrayUtil.parseInt("foo".toCharArray());
assertTrue(false);
} catch (NumberFormatException e) {
//expected
}
try {
test = ArrayUtil.parseInt(String.valueOf(Long.MAX_VALUE).toCharArray());
assertTrue(false);
} catch (NumberFormatException e) {
//expected
}
try {
test = ArrayUtil.parseInt("0.34".toCharArray());
assertTrue(false);
} catch (NumberFormatException e) {
//expected
}
try {
test = ArrayUtil.parseInt("1".toCharArray());
assertTrue(test + " does not equal: " + 1, test == 1);
test = ArrayUtil.parseInt("-10000".toCharArray());
assertTrue(test + " does not equal: " + -10000, test == -10000);
test = ArrayUtil.parseInt("1923".toCharArray());
assertTrue(test + " does not equal: " + 1923, test == 1923);
test = ArrayUtil.parseInt("-1".toCharArray());
assertTrue(test + " does not equal: " + -1, test == -1);
test = ArrayUtil.parseInt("foo 1923 bar".toCharArray(), 4, 4);
assertTrue(test + " does not equal: " + 1923, test == 1923);
} catch (NumberFormatException e) {
e.printStackTrace();
assertTrue(false);
}
}
public void testSliceEquals() {
String left = "this is equal";
String right = left;
char[] leftChars = left.toCharArray();
char[] rightChars = right.toCharArray();
assertTrue(left + " does not equal: " + right, ArrayUtil.equals(leftChars, 0, rightChars, 0, left.length()));
assertFalse(left + " does not equal: " + right, ArrayUtil.equals(leftChars, 1, rightChars, 0, left.length()));
assertFalse(left + " does not equal: " + right, ArrayUtil.equals(leftChars, 1, rightChars, 2, left.length()));
assertFalse(left + " does not equal: " + right, ArrayUtil.equals(leftChars, 25, rightChars, 0, left.length()));
assertFalse(left + " does not equal: " + right, ArrayUtil.equals(leftChars, 12, rightChars, 0, left.length()));
}
}