001    /*
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     * 
009     *      http://www.apache.org/licenses/LICENSE-2.0
010     * 
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    
018    package org.apache.commons.math.complex;
019    
020    import org.apache.commons.math.TestUtils;
021    
022    import junit.framework.TestCase;
023    
024    /**
025     * @version $Revision: 670469 $ $Date: 2008-06-23 04:01:38 -0400 (Mon, 23 Jun 2008) $
026     */
027    public class ComplexUtilsTest extends TestCase {
028        
029        private double inf = Double.POSITIVE_INFINITY;
030        private double negInf = Double.NEGATIVE_INFINITY;
031        private double nan = Double.NaN;
032        private double pi = Math.PI;
033        
034        private Complex negInfInf = new Complex(negInf, inf);
035        private Complex infNegInf = new Complex(inf, negInf);
036        private Complex infInf = new Complex(inf, inf);
037        private Complex negInfNegInf = new Complex(negInf, negInf);
038        private Complex infNaN = new Complex(inf, nan);
039    
040        public void testPolar2Complex() {
041            TestUtils.assertEquals(Complex.ONE, 
042                    ComplexUtils.polar2Complex(1, 0), 10e-12);
043            TestUtils.assertEquals(Complex.ZERO, 
044                    ComplexUtils.polar2Complex(0, 1), 10e-12);
045            TestUtils.assertEquals(Complex.ZERO, 
046                    ComplexUtils.polar2Complex(0, -1), 10e-12);
047            TestUtils.assertEquals(Complex.I, 
048                    ComplexUtils.polar2Complex(1, pi/2), 10e-12);
049            TestUtils.assertEquals(Complex.I.negate(), 
050                    ComplexUtils.polar2Complex(1, -pi/2), 10e-12);
051            double r = 0;
052            for (int i = 0; i < 5; i++) {
053              r += i;
054              double theta = 0;
055              for (int j =0; j < 20; j++) {
056                  theta += pi / 6;
057                  TestUtils.assertEquals(altPolar(r, theta), 
058                          ComplexUtils.polar2Complex(r, theta), 10e-12);
059              }
060              theta = -2 * pi;
061              for (int j =0; j < 20; j++) {
062                  theta -= pi / 6;
063                  TestUtils.assertEquals(altPolar(r, theta), 
064                          ComplexUtils.polar2Complex(r, theta), 10e-12);
065              }
066            }   
067        }
068    
069        protected Complex altPolar(double r, double theta) {
070            return Complex.I.multiply(new Complex(theta, 0)).exp().multiply(new Complex(r, 0));
071        }
072        
073        public void testPolar2ComplexIllegalModulus() {
074            try {
075                ComplexUtils.polar2Complex(-1, 0);
076                fail("Expecting IllegalArgumentException");
077            } catch (IllegalArgumentException ex) {
078                // expected
079            }       
080        }
081        
082        public void testPolar2ComplexNaN() {
083            TestUtils.assertSame(Complex.NaN, ComplexUtils.polar2Complex(nan, 1));
084            TestUtils.assertSame(Complex.NaN, ComplexUtils.polar2Complex(1, nan));
085            TestUtils.assertSame(Complex.NaN, 
086                    ComplexUtils.polar2Complex(nan, nan));     
087        }
088        
089        public void testPolar2ComplexInf() {
090            TestUtils.assertSame(Complex.NaN, ComplexUtils.polar2Complex(1, inf));
091            TestUtils.assertSame(Complex.NaN,
092                    ComplexUtils.polar2Complex(1, negInf));
093            TestUtils.assertSame(Complex.NaN, ComplexUtils.polar2Complex(inf, inf));
094            TestUtils.assertSame(Complex.NaN,
095                    ComplexUtils.polar2Complex(inf, negInf));
096            TestUtils.assertSame(infInf, ComplexUtils.polar2Complex(inf, pi/4));
097            TestUtils.assertSame(infNaN, ComplexUtils.polar2Complex(inf, 0));
098            TestUtils.assertSame(infNegInf, ComplexUtils.polar2Complex(inf, -pi/4));
099            TestUtils.assertSame(negInfInf, ComplexUtils.polar2Complex(inf, 3*pi/4));
100            TestUtils.assertSame(negInfNegInf, ComplexUtils.polar2Complex(inf, 5*pi/4));
101        }
102    
103    }