/*
* 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.
*/
package org.apache.jackrabbit.core.query.lucene;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;
import org.apache.jackrabbit.test.JUnitTest;
/**
* Tests converting BigDecimal to String and back.
*/
public class DecimalConvertTest extends JUnitTest {
public void testCommon() {
// System.out.println(DecimalField.decimalToString(new BigDecimal(0)));
// System.out.println(DecimalField.decimalToString(new BigDecimal(2)));
// System.out.println(DecimalField.decimalToString(new BigDecimal(120)));
// System.out.println(DecimalField.decimalToString(new BigDecimal(-1)));
ArrayList<BigDecimal> list = new ArrayList<BigDecimal>();
list.add(BigDecimal.ZERO);
list.add(BigDecimal.ONE);
list.add(BigDecimal.TEN);
list.add(BigDecimal.ONE.scaleByPowerOfTen(1));
list.add(new BigDecimal("100"));
list.add(new BigDecimal("1000"));
list.add(new BigDecimal("0.1"));
list.add(new BigDecimal("0.01"));
list.add(new BigDecimal("0.001"));
list.add(new BigDecimal("1.1"));
list.add(new BigDecimal("0.09"));
list.add(new BigDecimal("9.9"));
list.add(new BigDecimal("9.99"));
list.add(new BigDecimal("99"));
list.add(new BigDecimal("99.0"));
list.add(new BigDecimal("101"));
list.add(new BigDecimal("1000.0"));
list.add(new BigDecimal("-1.23E-10"));
testWithList(list);
}
public void testMinimumScale() {
if (true) { // JCR-3834
return;
}
final BigDecimal d1 = new BigDecimal(BigInteger.ONE, Integer.MIN_VALUE);
final BigDecimal d2 = new BigDecimal(BigInteger.ONE, Integer.MIN_VALUE+1);
final String s1 = DecimalField.decimalToString(d1);
final String s2 = DecimalField.decimalToString(d2);
assertEquals(Math.signum(d1.compareTo(d2)), Math.signum(s1.compareTo(s2)));
}
public void testRandomized() {
if (true) { // JCR-3834
return;
}
ArrayList<BigDecimal> list = new ArrayList<BigDecimal>();
list.add(BigDecimal.ZERO);
list.add(BigDecimal.ONE);
list.add(BigDecimal.TEN);
list.add(new BigDecimal(BigInteger.ONE, Integer.MAX_VALUE));
list.add(new BigDecimal(BigInteger.ONE, Integer.MIN_VALUE));
Random random = new Random(1);
// a few regular values
for (int i = 0; i < 10000; i++) {
list.add(new BigDecimal(i));
}
for (int i = 0; i < 100; i++) {
list.add(new BigDecimal(random.nextDouble()));
}
// scale -10 .. 10
for (int i = 0; i < 1000; i++) {
int scale = random.nextInt(20) - 10;
BigInteger value = BigInteger.valueOf(random.nextLong());
list.add(new BigDecimal(value, scale));
}
// extremely small and large values
for (int i = 0; i < 100; i++) {
int scale = random.nextInt(2000) - 1000;
BigInteger value = new BigInteger(1000, random);
list.add(new BigDecimal(value, scale));
}
testWithList(list);
}
private void testWithList(ArrayList<BigDecimal> list) {
// add negative values
for (BigDecimal d : new ArrayList<BigDecimal>(list)) {
list.add(d.negate());
}
Collections.sort(list);
BigDecimal lastDecimal = null;
String lastString = null;
for (BigDecimal d : list) {
String s = DecimalField.decimalToString(d);
if (lastDecimal != null) {
int compDecimal = (int) Math.signum(lastDecimal.compareTo(d));
int compString = (int) Math.signum(lastString.compareTo(s));
if (compDecimal != compString) {
assertEquals(compDecimal, compString);
}
}
BigDecimal test = DecimalField.stringToDecimal(s);
if (test.compareTo(d) != 0) {
assertEquals(d + "<>" + test.toPlainString(), 0, test.compareTo(d));
}
lastDecimal = d;
lastString = s;
}
}
}