blob: b729df9507bb7dd7fa2de9e37fffcd1862dd215c [file] [log] [blame]
/*
* 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.commons.math4.legacy.util;
import java.text.FieldPosition;
import java.text.NumberFormat;
import java.text.ParsePosition;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Locale;
import org.junit.Test;
import org.junit.Assert;
import org.apache.commons.numbers.complex.Complex;
import org.apache.commons.math4.legacy.exception.MathIllegalArgumentException;
import org.apache.commons.math4.legacy.exception.NoDataException;
import org.apache.commons.math4.legacy.exception.NullArgumentException;
import org.apache.commons.math4.core.jdkmath.JdkMath;
public abstract class ComplexFormatAbstractTest {
private ComplexFormat complexFormat = null;
private ComplexFormat complexFormatJ = null;
protected abstract Locale getLocale();
protected abstract char getDecimalCharacter();
protected ComplexFormatAbstractTest() {
complexFormat = ComplexFormat.getInstance(getLocale());
complexFormatJ = ComplexFormat.getInstance("j", getLocale());
}
@Test
public void testSimpleNoDecimals() {
Complex c = Complex.ofCartesian(1, 2);
String expected = "1 + 2i";
String actual = complexFormat.format(c);
Assert.assertEquals(expected, actual);
}
@Test
public void testTrimOneImaginary() {
final ComplexFormat fmt = ComplexFormat.getInstance(getLocale());
fmt.getImaginaryFormat().setMaximumFractionDigits(1);
Complex c = Complex.ofCartesian(1, 1.04);
String expected = "1 + i";
String actual = fmt.format(c);
Assert.assertEquals(expected, actual);
c = Complex.ofCartesian(1, 1.09);
expected = "1 + 1" + getDecimalCharacter() + "1i";
actual = fmt.format(c);
Assert.assertEquals(expected, actual);
c = Complex.ofCartesian(1, -1.09);
expected = "1 - 1" + getDecimalCharacter() + "1i";
actual = fmt.format(c);
Assert.assertEquals(expected, actual);
c = Complex.ofCartesian(1, -1.04);
expected = "1 - i";
actual = fmt.format(c);
Assert.assertEquals(expected, actual);
}
@Test
public void testSimpleWithDecimals() {
Complex c = Complex.ofCartesian(1.23, 1.43);
String expected = "1" + getDecimalCharacter() + "23 + 1" + getDecimalCharacter() + "43i";
String actual = complexFormat.format(c);
Assert.assertEquals(expected, actual);
}
@Test
public void testSimpleWithDecimalsTrunc() {
Complex c = Complex.ofCartesian(1.232323232323, 1.434343434343);
String expected = "1" + getDecimalCharacter() + "2323232323 + 1" + getDecimalCharacter() + "4343434343i";
String actual = complexFormat.format(c);
Assert.assertEquals(expected, actual);
}
@Test
public void testNegativeReal() {
Complex c = Complex.ofCartesian(-1.232323232323, 1.43);
String expected = "-1" + getDecimalCharacter() + "2323232323 + 1" + getDecimalCharacter() + "43i";
String actual = complexFormat.format(c);
Assert.assertEquals(expected, actual);
}
@Test
public void testNegativeImaginary() {
Complex c = Complex.ofCartesian(1.23, -1.434343434343);
String expected = "1" + getDecimalCharacter() + "23 - 1" + getDecimalCharacter() + "4343434343i";
String actual = complexFormat.format(c);
Assert.assertEquals(expected, actual);
}
@Test
public void testNegativeBoth() {
Complex c = Complex.ofCartesian(-1.232323232323, -1.434343434343);
String expected = "-1" + getDecimalCharacter() + "2323232323 - 1" + getDecimalCharacter() + "4343434343i";
String actual = complexFormat.format(c);
Assert.assertEquals(expected, actual);
}
@Test
public void testZeroReal() {
Complex c = Complex.ofCartesian(0.0, -1.434343434343);
String expected = "0 - 1" + getDecimalCharacter() + "4343434343i";
String actual = complexFormat.format(c);
Assert.assertEquals(expected, actual);
}
@Test
public void testZeroImaginary() {
Complex c = Complex.ofCartesian(30.23333333333, 0);
String expected = "30" + getDecimalCharacter() + "2333333333";
String actual = complexFormat.format(c);
Assert.assertEquals(expected, actual);
}
@Test
public void testDifferentImaginaryChar() {
Complex c = Complex.ofCartesian(1, 1);
String expected = "1 + j";
String actual = complexFormatJ.format(c);
Assert.assertEquals(expected, actual);
}
@Test
public void testDefaultFormatComplex() {
Locale defaultLocal = Locale.getDefault();
Locale.setDefault(getLocale());
Complex c = Complex.ofCartesian(232.22222222222, -342.3333333333);
String expected = "232" + getDecimalCharacter() + "2222222222 - 342" + getDecimalCharacter() + "3333333333i";
String actual = (new ComplexFormat()).format(c);
Assert.assertEquals(expected, actual);
Locale.setDefault(defaultLocal);
}
@Test
public void testNan() {
Complex c = Complex.ofCartesian(Double.NaN, Double.NaN);
String expected = "(NaN) + (NaN)i";
String actual = complexFormat.format(c);
Assert.assertEquals(expected, actual);
}
@Test
public void testPositiveInfinity() {
Complex c = Complex.ofCartesian(Double.POSITIVE_INFINITY, Double.POSITIVE_INFINITY);
String expected = "(Infinity) + (Infinity)i";
String actual = complexFormat.format(c);
Assert.assertEquals(expected, actual);
}
@Test
public void testNegativeInfinity() {
Complex c = Complex.ofCartesian(Double.NEGATIVE_INFINITY, Double.NEGATIVE_INFINITY);
String expected = "(-Infinity) - (Infinity)i";
String actual = complexFormat.format(c);
Assert.assertEquals(expected, actual);
}
@Test
public void testParseSimpleNoDecimals() {
String source = "1 + 1i";
Complex expected = Complex.ofCartesian(1, 1);
Complex actual = complexFormat.parse(source);
Assert.assertEquals(expected, actual);
}
@Test
public void testParseSimpleWithDecimals() {
String source = "1" + getDecimalCharacter() + "23 + 1" + getDecimalCharacter() + "43i";
Complex expected = Complex.ofCartesian(1.23, 1.43);
Complex actual = complexFormat.parse(source);
Assert.assertEquals(expected, actual);
}
@Test
public void testParseSimpleWithDecimalsTrunc() {
String source = "1" + getDecimalCharacter() + "232323232323 + 1" + getDecimalCharacter() + "434343434343i";
Complex expected = Complex.ofCartesian(1.232323232323, 1.434343434343);
Complex actual = complexFormat.parse(source);
Assert.assertEquals(expected, actual);
}
@Test
public void testParseNegativeReal() {
String source = "-1" + getDecimalCharacter() + "232323232323 + 1" + getDecimalCharacter() + "4343i";
Complex expected = Complex.ofCartesian(-1.232323232323, 1.4343);
Complex actual = complexFormat.parse(source);
Assert.assertEquals(expected, actual);
}
@Test
public void testParseNegativeImaginary() {
String source = "1" + getDecimalCharacter() + "2323 - 1" + getDecimalCharacter() + "434343434343i";
Complex expected = Complex.ofCartesian(1.2323, -1.434343434343);
Complex actual = complexFormat.parse(source);
Assert.assertEquals(expected, actual);
}
@Test
public void testParseNegativeBoth() {
String source = "-1" + getDecimalCharacter() + "232323232323 - 1" + getDecimalCharacter() + "434343434343i";
Complex expected = Complex.ofCartesian(-1.232323232323, -1.434343434343);
Complex actual = complexFormat.parse(source);
Assert.assertEquals(expected, actual);
}
@Test
public void testParseZeroReal() {
String source = "0" + getDecimalCharacter() + "0 - 1" + getDecimalCharacter() + "4343i";
Complex expected = Complex.ofCartesian(0.0, -1.4343);
Complex actual = complexFormat.parse(source);
Assert.assertEquals(expected, actual);
}
@Test
public void testParseZeroImaginary() {
String source = "-1" + getDecimalCharacter() + "2323";
Complex expected = Complex.ofCartesian(-1.2323, 0);
Complex actual = complexFormat.parse(source);
Assert.assertEquals(expected, actual);
}
@Test
public void testParseDifferentImaginaryChar() {
String source = "-1" + getDecimalCharacter() + "2323 - 1" + getDecimalCharacter() + "4343j";
Complex expected = Complex.ofCartesian(-1.2323, -1.4343);
Complex actual = complexFormatJ.parse(source);
Assert.assertEquals(expected, actual);
}
@Test
public void testParseNan() {
String source = "(NaN) + (NaN)i";
Complex expected = Complex.ofCartesian(Double.NaN, Double.NaN);
Complex actual = complexFormat.parse(source);
Assert.assertEquals(expected, actual);
}
@Test
public void testParsePositiveInfinity() {
String source = "(Infinity) + (Infinity)i";
Complex expected = Complex.ofCartesian(Double.POSITIVE_INFINITY, Double.POSITIVE_INFINITY);
Complex actual = complexFormat.parse(source);
Assert.assertEquals(expected, actual);
}
@Test
public void testPaseNegativeInfinity() {
String source = "(-Infinity) - (Infinity)i";
Complex expected = Complex.ofCartesian(Double.NEGATIVE_INFINITY, Double.NEGATIVE_INFINITY);
Complex actual = complexFormat.parse(source);
Assert.assertEquals(expected, actual);
}
@Test
public void testConstructorSingleFormat() {
NumberFormat nf = NumberFormat.getInstance();
ComplexFormat cf = new ComplexFormat(nf);
Assert.assertNotNull(cf);
Assert.assertEquals(nf, cf.getRealFormat());
}
@Test
public void testConstructorExceptions() {
NumberFormat nullFormat = null;
NumberFormat format = NumberFormat.getInstance();
try {
ComplexFormat cf = new ComplexFormat(nullFormat);
} catch (Exception e) {
Assert.assertTrue(e instanceof NullArgumentException);
}
try {
ComplexFormat cf = new ComplexFormat(nullFormat, format);
} catch (Exception e) {
Assert.assertTrue(e instanceof NullArgumentException);
}
try {
ComplexFormat cf = new ComplexFormat(format, nullFormat);
} catch (Exception e) {
Assert.assertTrue(e instanceof NullArgumentException);
}
}
@Test
public void testConstructorDoubleFormat() {
NumberFormat defaultFormat = NumberFormat.getInstance();
NumberFormat numberFormat = NumberFormat.getNumberInstance();
ComplexFormat cf = new ComplexFormat(defaultFormat, numberFormat);
Assert.assertEquals(defaultFormat, cf.getRealFormat());
Assert.assertEquals(numberFormat, cf.getImaginaryFormat());
}
@Test
public void testStringConstructor() {
String nullString = null;
String emptyString = "";
String oddImaginaryCharacter = "q";
try {
ComplexFormat cf = new ComplexFormat(nullString);
} catch (Exception e) {
Assert.assertTrue(e instanceof NullArgumentException);
}
try {
ComplexFormat cf = new ComplexFormat(emptyString);
} catch (Exception e) {
Assert.assertTrue(e instanceof NoDataException);
}
ComplexFormat cf = new ComplexFormat(oddImaginaryCharacter);
Assert.assertEquals(oddImaginaryCharacter, cf.getImaginaryCharacter());
}
@Test
public void testGetAvailableLocales() {
Assert.assertEquals(new HashSet<>(Arrays.asList(NumberFormat.getAvailableLocales())),
new HashSet<>(Arrays.asList(ComplexFormat.getAvailableLocales())));
}
@Test
public void testGetInstance() {
ComplexFormat cf = ComplexFormat.getInstance();
Assert.assertNotNull(cf);
Assert.assertNotNull(cf.getRealFormat());
Assert.assertNotNull(cf.getImaginaryFormat());
Assert.assertTrue(cf.getRealFormat() instanceof NumberFormat);
Assert.assertTrue(cf.getImaginaryFormat() instanceof NumberFormat);
}
@Test
public void testFormatObjectStringBufferFieldPositionWithComplex() {
ComplexFormat cf = ComplexFormat.getInstance(getLocale());
String source = "1" + getDecimalCharacter() + "23 + 1" + getDecimalCharacter() + "43i";
Object expected = Complex.ofCartesian(1.23, 1.43);
String formatted = cf.format(expected, new StringBuffer(), new FieldPosition(0)).toString();
Assert.assertEquals(source, formatted);
}
@Test
public void testFormatObjectStringBufferFieldPositionWitNumber() {
ComplexFormat cf = ComplexFormat.getInstance(getLocale());
String source = "1" + getDecimalCharacter() + "23";
Number expected = new Double(1.23);
String formatted = cf.format(expected, new StringBuffer(), new FieldPosition(0)).toString();
Assert.assertEquals(source, formatted);
}
@Test
public void testFormatObjectStringBufferFieldPositionException() {
ComplexFormat cf = ComplexFormat.getInstance();
Object expected = "Something that's not a number or Complex";
try {
String formatted = cf.format(expected, new StringBuffer(), new FieldPosition(0)).toString();
} catch (Exception e) {
Assert.assertTrue(e instanceof MathIllegalArgumentException);
}
}
@Test
public void testGetImaginaryFormat() {
NumberFormat nf = NumberFormat.getInstance();
ComplexFormat cf = new ComplexFormat(nf);
Assert.assertSame(nf, cf.getImaginaryFormat());
}
@Test
public void testGetRealFormat() {
NumberFormat nf = NumberFormat.getInstance();
ComplexFormat cf = new ComplexFormat(nf);
Assert.assertSame(nf, cf.getRealFormat());
}
@Test
public void testFormatNumber() {
ComplexFormat cf = ComplexFormat.getInstance(getLocale());
Double pi = Double.valueOf(JdkMath.PI);
String text = cf.format(pi);
Assert.assertEquals("3" + getDecimalCharacter() + "1415926536", text);
}
@Test
public void testForgottenImaginaryCharacter() {
ParsePosition pos = new ParsePosition(0);
Assert.assertNull(new ComplexFormat().parse("1 + 1", pos));
Assert.assertEquals(5, pos.getErrorIndex());
}
}