You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by lu...@apache.org on 2008/07/26 20:31:42 UTC

svn commit: r680029 - in /commons/proper/math/branches/MATH_2_0/src: java/org/apache/commons/math/geometry/ site/xdoc/ test/org/apache/commons/math/geometry/

Author: luc
Date: Sat Jul 26 11:31:41 2008
New Revision: 680029

URL: http://svn.apache.org/viewvc?rev=680029&view=rev
Log:
added a Vector3DFormat class

Added:
    commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/geometry/Vector3DFormat.java   (with props)
    commons/proper/math/branches/MATH_2_0/src/test/org/apache/commons/math/geometry/FrenchVector3DFormatTest.java   (with props)
    commons/proper/math/branches/MATH_2_0/src/test/org/apache/commons/math/geometry/Vector3DFormatAbstractTest.java   (with props)
    commons/proper/math/branches/MATH_2_0/src/test/org/apache/commons/math/geometry/Vector3DFormatTest.java   (with props)
Modified:
    commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/geometry/Vector3D.java
    commons/proper/math/branches/MATH_2_0/src/site/xdoc/changes.xml

Modified: commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/geometry/Vector3D.java
URL: http://svn.apache.org/viewvc/commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/geometry/Vector3D.java?rev=680029&r1=680028&r2=680029&view=diff
==============================================================================
--- commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/geometry/Vector3D.java (original)
+++ commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/geometry/Vector3D.java Sat Jul 26 11:31:41 2008
@@ -19,6 +19,8 @@
 
 import java.io.Serializable;
 
+import org.apache.commons.math.util.MathUtils;
+
 /** 
  * This class implements vectors in a three-dimensional space.
  * <p>Instance of this class are guaranteed to be immutable.</p>
@@ -50,8 +52,23 @@
   /** Opposite of the third canonical vector (coordinates: 0, 0, -1).  */
   public static final Vector3D MINUS_K = new Vector3D(0, 0, -1);
 
+  /** A vector with all coordinates set to NaN. */
+  public static final Vector3D NaN = new Vector3D(Double.NaN, Double.NaN, Double.NaN);
+
+  /** A vector with all coordinates set to positive infinity. */
+  public static final Vector3D POSITIVE_INFINITY =
+      new Vector3D(Double.POSITIVE_INFINITY, Double.POSITIVE_INFINITY, Double.POSITIVE_INFINITY);
+
+  /** A vector with all coordinates set to negative infinity. */
+  public static final Vector3D NEGATIVE_INFINITY =
+      new Vector3D(Double.NEGATIVE_INFINITY, Double.NEGATIVE_INFINITY, Double.NEGATIVE_INFINITY);
+
+  /** Default format. */
+  private static final Vector3DFormat DEFAULT_FORMAT =
+      Vector3DFormat.getInstance();
+
   /** Serializable version identifier. */
-  private static final long serialVersionUID = -6155041477622120793L;
+  private static final long serialVersionUID = 5133268763396045979L;
 
   /** Abscissa. */
   private final double x;
@@ -337,6 +354,84 @@
     return new Vector3D(a * x, a * y, a * z);
   }
 
+  /**
+   * Returns true if any coordinate of this vector is NaN; false otherwise
+   * @return  true if any coordinate of this vector is NaN; false otherwise
+   */
+  public boolean isNaN() {
+      return Double.isNaN(x) || Double.isNaN(y) || Double.isNaN(z);        
+  }
+  
+  /**
+   * Returns true if any coordinate of this vector is infinite and none are NaN;
+   * false otherwise
+   * @return  true if any coordinate of this vector is infinite and none are NaN;
+   * false otherwise
+   */
+  public boolean isInfinite() {
+      return !isNaN() && (Double.isInfinite(x) || Double.isInfinite(y) || Double.isInfinite(z));        
+  }
+  
+  /**
+   * Test for the equality of two 3D vectors.
+   * <p>
+   * If all coordinates of two 3D vectors are exactly the same, and none are
+   * <code>Double.NaN</code>, the two 3D vectors are considered to be equal.
+   * </p>
+   * <p>
+   * All <code>NaN</code> values are considered to be equal - i.e, if either
+   * (or all) coordinates of the 3D vector are equal to <code>Double.NaN</code>,
+   * the complex number is equal to 
+   * <code>Complex.NaN</code>.</p>
+   *
+   * @param other Object to test for equality to this
+   * @return true if two 3D vector objects are equal, false if
+   *         object is null, not an instance of Vector3D, or
+   *         not equal to this Vector3D instance
+   * 
+   */
+  public boolean equals(Object other) {
+
+    if (this == other) { 
+      return true;
+    }
+
+    if (other == null) {
+      return false;
+    }
+
+    try {
+
+        Vector3D rhs = (Vector3D)other;
+      if (rhs.isNaN()) {
+          return this.isNaN();
+      }
+
+      return (Double.doubleToRawLongBits(x) == Double.doubleToRawLongBits(rhs.x)) &&
+             (Double.doubleToRawLongBits(y) == Double.doubleToRawLongBits(rhs.y)) &&
+             (Double.doubleToRawLongBits(z) == Double.doubleToRawLongBits(rhs.z)); 
+
+    } catch (ClassCastException ex) {
+        // ignore exception
+        return false;
+    }
+
+  }
+  
+  /**
+   * Get a hashCode for the 3D vector.
+   * <p>
+   * All NaN values have the same hash code.</p>
+   * 
+   * @return a hash code value for this object
+   */
+  public int hashCode() {
+      if (isNaN()) {
+          return 8;
+      }
+      return 31 * (23 * MathUtils.hash(x) +  19 * MathUtils.hash(y) +  MathUtils.hash(z));
+  }
+
   /** Compute the dot-product of two vectors.
    * @param v1 first vector
    * @param v2 second vector
@@ -387,4 +482,11 @@
     return dx * dx + dy * dy + dz * dz;
   }
 
+  /** Get a string representation of this vector.
+   * @return a string representation of this vector
+   */
+  public String toString() {
+      return DEFAULT_FORMAT.format(this);
+  }
+
 }

Added: commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/geometry/Vector3DFormat.java
URL: http://svn.apache.org/viewvc/commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/geometry/Vector3DFormat.java?rev=680029&view=auto
==============================================================================
--- commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/geometry/Vector3DFormat.java (added)
+++ commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/geometry/Vector3DFormat.java Sat Jul 26 11:31:41 2008
@@ -0,0 +1,337 @@
+/*
+ * 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.math.geometry;
+
+import java.text.FieldPosition;
+import java.text.NumberFormat;
+import java.text.ParseException;
+import java.text.ParsePosition;
+import java.util.Locale;
+
+import org.apache.commons.math.util.CompositeFormat;
+
+/**
+ * Formats a 3D vector in components list format "{x; y; z}".
+ * <p>The prefix and suffix "{" and "}" and the separator ", " can be replaced by
+ * any user-defined strings. The number format for components can be configured.</p>
+ * <p>White space is ignored at parse time, even if it is in the prefix, suffix
+ * or separator specifications. So even if the default separator does include a space
+ * character that is used at format time, both input string "{1;1;1}" and
+ * " { 1 ; 1 ; 1 } " will be parsed without error and the same vector will be
+ * returned. In the second case, however, the parse position after parsing will be
+ * just after the closing curly brace, i.e. just before the trailing space.</p>
+ *
+ * @version $Revision$ $Date$
+ */
+public class Vector3DFormat extends CompositeFormat {
+
+    /** Serializable version identifier */
+    private static final long serialVersionUID = -5447606608652576301L;
+
+    /** The default prefix: "{". */
+    private static final String DEFAULT_PREFIX = "{";
+
+    /** The default suffix: "}". */
+    private static final String DEFAULT_SUFFIX = "}";
+
+    /** The default separator: ", ". */
+    private static final String DEFAULT_SEPARATOR = "; ";
+
+    /** Prefix. */
+    private final String prefix;
+
+    /** Suffix. */
+    private final String suffix;
+
+    /** Separator. */
+    private final String separator;
+
+    /** Trimmed prefix. */
+    private final String trimmedPrefix;
+
+    /** Trimmed suffix. */
+    private final String trimmedSuffix;
+
+    /** Trimmed separator. */
+    private final String trimmedSeparator;
+
+    /** The format used for components. */
+    private NumberFormat format;
+
+    /**
+     * Create an instance with default settings.
+     * <p>The instance uses the default prefix, suffix and separator:
+     * "{", "}", and "; " and the default number format for components.</p>
+     */
+    public Vector3DFormat() {
+        this(DEFAULT_PREFIX, DEFAULT_SUFFIX, DEFAULT_SEPARATOR, getDefaultNumberFormat());
+    }
+
+    /**
+     * Create an instance with a custom number format for components.
+     * @param format the custom format for components.
+     */
+    public Vector3DFormat(final NumberFormat format) {
+        this(DEFAULT_PREFIX, DEFAULT_SUFFIX, DEFAULT_SEPARATOR, format);
+    }
+
+    /**
+     * Create an instance with custom prefix, suffix and separator.
+     * @param prefix prefix to use instead of the default "{"
+     * @param suffix suffix to use instead of the default "}"
+     * @param separator separator to use instead of the default "; "
+     */
+    public Vector3DFormat(final String prefix, final String suffix,
+                          final String separator) {
+        this(prefix, suffix, separator, getDefaultNumberFormat());
+    }
+
+    /**
+     * Create an instance with custom prefix, suffix, separator and format
+     * for components.
+     * @param prefix prefix to use instead of the default "{"
+     * @param suffix suffix to use instead of the default "}"
+     * @param separator separator to use instead of the default "; "
+     * @param format the custom format for components.
+     */
+    public Vector3DFormat(final String prefix, final String suffix,
+                          final String separator, final NumberFormat format) {
+        this.prefix      = prefix;
+        this.suffix      = suffix;
+        this.separator   = separator;
+        trimmedPrefix    = prefix.trim();
+        trimmedSuffix    = suffix.trim();
+        trimmedSeparator = separator.trim();
+        this.format      = format;
+    }
+
+    /**
+     * Get the set of locales for which 3D vectors formats are available.
+     * <p>This is the same set as the {@link NumberFormat} set.</p>
+     * @return available complex format locales.
+     */
+    public static Locale[] getAvailableLocales() {
+        return NumberFormat.getAvailableLocales();
+    }
+
+    /**
+     * Get the format prefix.
+     * @return format prefix.
+     */
+    public String getPrefix() {
+        return prefix;
+    }
+
+    /**
+     * Get the format suffix.
+     * @return format suffix.
+     */
+    public String getSuffix() {
+        return suffix;
+    }
+
+    /**
+     * Get the format separator between components.
+     * @return format separator.
+     */
+    public String getSeparator() {
+        return separator;
+    }
+
+    /**
+     * Get the components format.
+     * @return components format.
+     */
+    public NumberFormat getFormat() {
+        return format;
+    }
+
+    /**
+     * Returns the default complex format for the current locale.
+     * @return the default complex format.
+     */
+    public static Vector3DFormat getInstance() {
+        return getInstance(Locale.getDefault());
+    }
+
+    /**
+     * Returns the default complex format for the given locale.
+     * @param locale the specific locale used by the format.
+     * @return the complex format specific to the given locale.
+     */
+    public static Vector3DFormat getInstance(final Locale locale) {
+        return new Vector3DFormat(getDefaultNumberFormat(locale));
+    }
+
+    /**
+     * This static method calls {@link #format(Object)} on a default instance of
+     * Vector3DFormat.
+     *
+     * @param v Vector3D object to format
+     * @return A formatted vector
+     */
+    public static String formatVector3D(Vector3D v) {
+        return getInstance().format(v);
+    }
+
+    /**
+     * Formats a {@link Vector3D} object to produce a string.
+     * @param vector the object to format.
+     * @param toAppendTo where the text is to be appended
+     * @param pos On input: an alignment field, if desired. On output: the
+     *            offsets of the alignment field
+     * @return the value passed in as toAppendTo.
+     */
+    public StringBuffer format(Vector3D vector, StringBuffer toAppendTo,
+                               FieldPosition pos) {
+
+        pos.setBeginIndex(0);
+        pos.setEndIndex(0);
+
+        // format prefix
+        toAppendTo.append(prefix);
+
+        // format components
+        formatDouble(vector.getX(), format, toAppendTo, pos);
+        toAppendTo.append(separator);
+        formatDouble(vector.getY(), format, toAppendTo, pos);
+        toAppendTo.append(separator);
+        formatDouble(vector.getZ(), format, toAppendTo, pos);
+
+        // format suffix
+        toAppendTo.append(suffix);
+
+        return toAppendTo;
+
+    }
+
+    /**
+     * Formats a object to produce a string.
+     * <p><code>obj</code> must be a  {@link Vector3D} object. Any other type of
+     * object will result in an {@link IllegalArgumentException} being thrown.</p>
+     * @param obj the object to format.
+     * @param toAppendTo where the text is to be appended
+     * @param pos On input: an alignment field, if desired. On output: the
+     *            offsets of the alignment field
+     * @return the value passed in as toAppendTo.
+     * @see java.text.Format#format(java.lang.Object, java.lang.StringBuffer, java.text.FieldPosition)
+     * @throws IllegalArgumentException is <code>obj</code> is not a valid type.
+     */
+    public StringBuffer format(Object obj, StringBuffer toAppendTo,
+                               FieldPosition pos) {
+
+        if (obj instanceof Vector3D) {
+            return format( (Vector3D)obj, toAppendTo, pos);
+        }
+
+        throw new IllegalArgumentException("Cannot format given Object as a Vector3D");
+
+    }
+
+    /**
+     * Parses a string to produce a {@link Vector3D} object.
+     * @param source the string to parse
+     * @return the parsed {@link Vector3D} object.
+     * @exception ParseException if the beginning of the specified string
+     *            cannot be parsed.
+     */
+    public Vector3D parse(String source) throws ParseException {
+        ParsePosition parsePosition = new ParsePosition(0);
+        Vector3D result = parse(source, parsePosition);
+        if (parsePosition.getIndex() == 0) {
+            throw new ParseException("Unparseable 3D vector: \"" + source +
+                                     "\"", parsePosition.getErrorIndex());
+        }
+        return result;
+    }
+
+    /**
+     * Parses a string to produce a {@link Vector3D} object.
+     * @param source the string to parse
+     * @param pos input/ouput parsing parameter.
+     * @return the parsed {@link Vector3D} object.
+     */
+    public Vector3D parse(String source, ParsePosition pos) {
+        int initialIndex = pos.getIndex();
+
+        // parse prefix
+        parseAndIgnoreWhitespace(source, pos);
+        if (!parseFixedstring(source, trimmedPrefix, pos)) {
+            return null;
+        }
+
+        // parse X component
+        parseAndIgnoreWhitespace(source, pos);
+        Number x = parseNumber(source, format, pos);
+        if (x == null) {
+            // invalid abscissa
+            // set index back to initial, error index should already be set
+            pos.setIndex(initialIndex);
+            return null;
+        }
+
+        // parse Y component
+        parseAndIgnoreWhitespace(source, pos);
+        if (!parseFixedstring(source, trimmedSeparator, pos)) {
+            return null;
+        }
+        parseAndIgnoreWhitespace(source, pos);
+        Number y = parseNumber(source, format, pos);
+        if (y == null) {
+            // invalid ordinate
+            // set index back to initial, error index should already be set
+            pos.setIndex(initialIndex);
+            return null;
+        }
+
+        // parse Z component
+        parseAndIgnoreWhitespace(source, pos);
+        if (!parseFixedstring(source, trimmedSeparator, pos)) {
+            return null;
+        }
+        parseAndIgnoreWhitespace(source, pos);
+        Number z = parseNumber(source, format, pos);
+        if (z == null) {
+            // invalid height
+            // set index back to initial, error index should already be set
+            pos.setIndex(initialIndex);
+            return null;
+        }
+
+        // parse suffix
+        parseAndIgnoreWhitespace(source, pos);
+        if (!parseFixedstring(source, trimmedSuffix, pos)) {
+            return null;
+        }
+
+        return new Vector3D(x.doubleValue(), y.doubleValue(), z.doubleValue());
+
+    }
+
+    /**
+     * Parses a string to produce a object.
+     * @param source the string to parse
+     * @param pos input/ouput parsing parameter.
+     * @return the parsed object.
+     * @see java.text.Format#parseObject(java.lang.String, java.text.ParsePosition)
+     */
+    public Object parseObject(String source, ParsePosition pos) {
+        return parse(source, pos);
+    }
+
+}

Propchange: commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/geometry/Vector3DFormat.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/geometry/Vector3DFormat.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Modified: commons/proper/math/branches/MATH_2_0/src/site/xdoc/changes.xml
URL: http://svn.apache.org/viewvc/commons/proper/math/branches/MATH_2_0/src/site/xdoc/changes.xml?rev=680029&r1=680028&r2=680029&view=diff
==============================================================================
--- commons/proper/math/branches/MATH_2_0/src/site/xdoc/changes.xml (original)
+++ commons/proper/math/branches/MATH_2_0/src/site/xdoc/changes.xml Sat Jul 26 11:31:41 2008
@@ -94,7 +94,7 @@
         handlers to be embedded into users Serializable classes.
       </action>
       <action dev="luc" type="add">
-        Added several convenience methods for Vector3D and Rotation.
+        Added several convenience methods and constants for Vector3D and Rotation.
       </action>
       <action dev="luc" type="update">
         Replaced public no argument constructors with IDENTITY or ZERO

Added: commons/proper/math/branches/MATH_2_0/src/test/org/apache/commons/math/geometry/FrenchVector3DFormatTest.java
URL: http://svn.apache.org/viewvc/commons/proper/math/branches/MATH_2_0/src/test/org/apache/commons/math/geometry/FrenchVector3DFormatTest.java?rev=680029&view=auto
==============================================================================
--- commons/proper/math/branches/MATH_2_0/src/test/org/apache/commons/math/geometry/FrenchVector3DFormatTest.java (added)
+++ commons/proper/math/branches/MATH_2_0/src/test/org/apache/commons/math/geometry/FrenchVector3DFormatTest.java Sat Jul 26 11:31:41 2008
@@ -0,0 +1,32 @@
+/*
+ * 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.math.geometry;
+
+import java.util.Locale;
+
+
+public class FrenchVector3DFormatTest extends Vector3DFormatAbstractTest {
+    
+    protected char getDecimalCharacter() {
+        return ',';
+    }
+    
+    protected Locale getLocale() {
+        return Locale.FRENCH;
+    }
+}

Propchange: commons/proper/math/branches/MATH_2_0/src/test/org/apache/commons/math/geometry/FrenchVector3DFormatTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: commons/proper/math/branches/MATH_2_0/src/test/org/apache/commons/math/geometry/FrenchVector3DFormatTest.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Added: commons/proper/math/branches/MATH_2_0/src/test/org/apache/commons/math/geometry/Vector3DFormatAbstractTest.java
URL: http://svn.apache.org/viewvc/commons/proper/math/branches/MATH_2_0/src/test/org/apache/commons/math/geometry/Vector3DFormatAbstractTest.java?rev=680029&view=auto
==============================================================================
--- commons/proper/math/branches/MATH_2_0/src/test/org/apache/commons/math/geometry/Vector3DFormatAbstractTest.java (added)
+++ commons/proper/math/branches/MATH_2_0/src/test/org/apache/commons/math/geometry/Vector3DFormatAbstractTest.java Sat Jul 26 11:31:41 2008
@@ -0,0 +1,360 @@
+/*
+ * 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.math.geometry;
+
+import java.text.NumberFormat;
+import java.text.ParseException;
+import java.text.ParsePosition;
+import java.util.Locale;
+
+import junit.framework.TestCase;
+
+import org.apache.commons.math.util.CompositeFormat;
+
+public abstract class Vector3DFormatAbstractTest extends TestCase {
+ 
+    Vector3DFormat vector3DFormat = null;
+    Vector3DFormat vector3DFormatSquare = null;
+
+    protected abstract Locale getLocale();
+
+    protected abstract char getDecimalCharacter();
+    
+    protected void setUp() throws Exception {
+        vector3DFormat = Vector3DFormat.getInstance(getLocale());
+        final NumberFormat nf = NumberFormat.getInstance(getLocale());
+        nf.setMaximumFractionDigits(2);
+        vector3DFormatSquare = new Vector3DFormat("[", "]", " : ", nf);
+    }
+   
+    public void testSimpleNoDecimals() {
+        Vector3D c = new Vector3D(1, 1, 1);
+        String expected = "{1; 1; 1}";
+        String actual = vector3DFormat.format(c); 
+        assertEquals(expected, actual);
+    }
+
+    public void testSimpleWithDecimals() {
+        Vector3D c = new Vector3D(1.23, 1.43, 1.63);
+        String expected =
+            "{1"    + getDecimalCharacter() +
+            "23; 1" + getDecimalCharacter() +
+            "43; 1" + getDecimalCharacter() +
+            "63}";
+        String actual = vector3DFormat.format(c); 
+        assertEquals(expected, actual);
+    }
+
+    public void testSimpleWithDecimalsTrunc() {
+        Vector3D c = new Vector3D(1.2323, 1.4343, 1.6333);
+        String expected =
+            "{1"    + getDecimalCharacter() +
+            "23; 1" + getDecimalCharacter() +
+            "43; 1" + getDecimalCharacter() +
+            "63}";
+        String actual = vector3DFormat.format(c); 
+        assertEquals(expected, actual);
+    }
+
+    public void testNegativeX() {
+        Vector3D c = new Vector3D(-1.2323, 1.4343, 1.6333);
+        String expected =
+            "{-1"    + getDecimalCharacter() +
+            "23; 1" + getDecimalCharacter() +
+            "43; 1" + getDecimalCharacter() +
+            "63}";
+        String actual = vector3DFormat.format(c); 
+        assertEquals(expected, actual);
+    }
+
+    public void testNegativeY() {
+        Vector3D c = new Vector3D(1.2323, -1.4343, 1.6333);
+        String expected =
+            "{1"    + getDecimalCharacter() +
+            "23; -1" + getDecimalCharacter() +
+            "43; 1" + getDecimalCharacter() +
+            "63}";
+        String actual = vector3DFormat.format(c); 
+        assertEquals(expected, actual);
+    }
+
+    public void testNegativeZ() {
+        Vector3D c = new Vector3D(1.2323, 1.4343, -1.6333);
+        String expected =
+            "{1"    + getDecimalCharacter() +
+            "23; 1" + getDecimalCharacter() +
+            "43; -1" + getDecimalCharacter() +
+            "63}";
+        String actual = vector3DFormat.format(c); 
+        assertEquals(expected, actual);
+    }
+
+    public void testNonDefaultSetting() {
+        Vector3D c = new Vector3D(1, 1, 1);
+        String expected = "[1 : 1 : 1]";
+        String actual = vector3DFormatSquare.format(c); 
+        assertEquals(expected, actual);
+    }
+    
+    public void testStaticFormatVector3D() {
+        Locale defaultLocal = Locale.getDefault();
+        Locale.setDefault(getLocale());
+        
+        Vector3D c = new Vector3D(232.222, -342.33, 432.444);
+        String expected =
+            "{232"    + getDecimalCharacter() +
+            "22; -342" + getDecimalCharacter() +
+            "33; 432" + getDecimalCharacter() +
+            "44}";
+        String actual = Vector3DFormat.formatVector3D(c); 
+        assertEquals(expected, actual);
+        
+        Locale.setDefault(defaultLocal);
+    }
+
+    public void testNan() {
+        Vector3D c = Vector3D.NaN;
+        String expected = "{(NaN); (NaN); (NaN)}";
+        String actual = vector3DFormat.format(c); 
+        assertEquals(expected, actual);
+    }
+
+    public void testPositiveInfinity() {
+        Vector3D c = Vector3D.POSITIVE_INFINITY;
+        String expected = "{(Infinity); (Infinity); (Infinity)}";
+        String actual = vector3DFormat.format(c); 
+        assertEquals(expected, actual);
+    }
+
+    public void tesNegativeInfinity() {
+        Vector3D c = Vector3D.NEGATIVE_INFINITY;
+        String expected = "{(-Infinity); (-Infinity); (-Infinity)}";
+        String actual = vector3DFormat.format(c); 
+        assertEquals(expected, actual);
+    }
+
+    public void testParseSimpleNoDecimals() {
+        String source = "{1; 1; 1}";
+        Vector3D expected = new Vector3D(1, 1, 1);
+        try {
+            Vector3D actual = (Vector3D) vector3DFormat.parseObject(source); 
+            assertEquals(expected, actual);
+        } catch (ParseException ex) {
+            fail(ex.getMessage());
+        }
+    }
+
+    public void testParseIgnoredWhitespace() {
+        Vector3D expected = new Vector3D(1, 1, 1);
+        ParsePosition pos1 = new ParsePosition(0);
+        String source1 = "{1;1;1}";
+        assertEquals(expected, vector3DFormat.parseObject(source1, pos1));
+        assertEquals(source1.length(), pos1.getIndex());
+        ParsePosition pos2 = new ParsePosition(0);
+        String source2 = " { 1 ; 1 ; 1 } ";
+        assertEquals(expected, vector3DFormat.parseObject(source2, pos2));
+        assertEquals(source2.length() - 1, pos2.getIndex());
+    }
+
+    public void testParseSimpleWithDecimals() {
+        String source =
+            "{1" + getDecimalCharacter() +
+            "23; 1" + getDecimalCharacter() +
+            "43; 1" + getDecimalCharacter() +
+            "63}";
+        Vector3D expected = new Vector3D(1.23, 1.43, 1.63);
+        try {
+            Vector3D actual = (Vector3D) vector3DFormat.parseObject(source); 
+            assertEquals(expected, actual);
+        } catch (ParseException ex) {
+            fail(ex.getMessage());
+        }
+    }
+
+    public void testParseSimpleWithDecimalsTrunc() {
+        String source =
+            "{1" + getDecimalCharacter() +
+            "2323; 1" + getDecimalCharacter() +
+            "4343; 1" + getDecimalCharacter() +
+            "6333}";
+        Vector3D expected = new Vector3D(1.2323, 1.4343, 1.6333);
+        try {
+            Vector3D actual = (Vector3D) vector3DFormat.parseObject(source); 
+            assertEquals(expected, actual);
+        } catch (ParseException ex) {
+            fail(ex.getMessage());
+        }
+    }
+
+    public void testParseNegativeX() {
+        String source =
+            "{-1" + getDecimalCharacter() +
+            "2323; 1" + getDecimalCharacter() +
+            "4343; 1" + getDecimalCharacter() +
+            "6333}";
+        Vector3D expected = new Vector3D(-1.2323, 1.4343, 1.6333);
+        try {
+            Vector3D actual = (Vector3D) vector3DFormat.parseObject(source); 
+            assertEquals(expected, actual);
+        } catch (ParseException ex) {
+            fail(ex.getMessage());
+        }
+    }
+
+    public void testParseNegativeY() {
+        String source =
+            "{1" + getDecimalCharacter() +
+            "2323; -1" + getDecimalCharacter() +
+            "4343; 1" + getDecimalCharacter() +
+            "6333}";
+        Vector3D expected = new Vector3D(1.2323, -1.4343, 1.6333);
+        try {
+            Vector3D actual = (Vector3D) vector3DFormat.parseObject(source); 
+            assertEquals(expected, actual);
+        } catch (ParseException ex) {
+            fail(ex.getMessage());
+        }
+    }
+
+    public void testParseNegativeZ() {
+        String source =
+            "{1" + getDecimalCharacter() +
+            "2323; 1" + getDecimalCharacter() +
+            "4343; -1" + getDecimalCharacter() +
+            "6333}";
+        Vector3D expected = new Vector3D(1.2323, 1.4343, -1.6333);
+        try {
+            Vector3D actual = (Vector3D) vector3DFormat.parseObject(source); 
+            assertEquals(expected, actual);
+        } catch (ParseException ex) {
+            fail(ex.getMessage());
+        }
+    }
+
+    public void testParseNegativeAll() {
+        String source =
+            "{-1" + getDecimalCharacter() +
+            "2323; -1" + getDecimalCharacter() +
+            "4343; -1" + getDecimalCharacter() +
+            "6333}";
+        Vector3D expected = new Vector3D(-1.2323, -1.4343, -1.6333);
+        try {
+            Vector3D actual = (Vector3D) vector3DFormat.parseObject(source); 
+            assertEquals(expected, actual);
+        } catch (ParseException ex) {
+            fail(ex.getMessage());
+        }
+    }
+
+    public void testParseZeroX() {
+        String source =
+            "{0" + getDecimalCharacter() +
+            "0; -1" + getDecimalCharacter() +
+            "4343; 1" + getDecimalCharacter() +
+            "6333}";
+        Vector3D expected = new Vector3D(0.0, -1.4343, 1.6333);
+        try {
+            Vector3D actual = (Vector3D) vector3DFormat.parseObject(source); 
+            assertEquals(expected, actual);
+        } catch (ParseException ex) {
+            fail(ex.getMessage());
+        }
+    }
+
+    public void testParseNonDefaultSetting() {
+        String source =
+            "[1" + getDecimalCharacter() +
+            "2323 : 1" + getDecimalCharacter() +
+            "4343 : 1" + getDecimalCharacter() +
+            "6333]";
+        Vector3D expected = new Vector3D(1.2323, 1.4343, 1.6333);
+        try {
+            Vector3D actual = (Vector3D) vector3DFormatSquare.parseObject(source); 
+            assertEquals(expected, actual);
+        } catch (ParseException ex) {
+            fail(ex.getMessage());
+        }
+    }
+    
+    public void testParseNan() {
+        String source = "{(NaN); (NaN); (NaN)}";
+        try {
+            Vector3D actual = (Vector3D) vector3DFormat.parseObject(source); 
+            assertEquals(Vector3D.NaN, actual);
+        } catch (ParseException ex) {
+            fail(ex.getMessage());
+        }
+    }
+
+    public void testParsePositiveInfinity() {
+        String source = "{(Infinity); (Infinity); (Infinity)}";
+        try {
+            Vector3D actual = (Vector3D)vector3DFormat.parseObject(source); 
+            assertEquals(Vector3D.POSITIVE_INFINITY, actual);
+        } catch (ParseException ex) {
+            fail(ex.getMessage());
+        }
+    }
+
+    public void testParseNegativeInfinity() {
+        String source = "{(-Infinity); (-Infinity); (-Infinity)}";
+        try {
+            Vector3D actual = (Vector3D)vector3DFormat.parseObject(source); 
+            assertEquals(Vector3D.NEGATIVE_INFINITY, actual);
+        } catch (ParseException ex) {
+            fail(ex.getMessage());
+        }
+    }
+
+    public void testConstructorSingleFormat() {
+        NumberFormat nf = NumberFormat.getInstance();
+        Vector3DFormat cf = new Vector3DFormat(nf);
+        assertNotNull(cf);
+        assertEquals(nf, cf.getFormat());
+    }
+    
+    public void testFormatObject() {
+        try {
+            CompositeFormat cf = new Vector3DFormat();
+            Object object = new Object();
+            cf.format(object);
+            fail();
+        } catch (IllegalArgumentException ex) {
+            // success
+        }
+    }
+
+    public void testForgottenPrefix() {
+        ParsePosition pos = new ParsePosition(0);
+        assertNull(new Vector3DFormat().parse("1; 1; 1}", pos));
+        assertEquals(0, pos.getErrorIndex());
+    }
+
+    public void testForgottenSeparator() {
+        ParsePosition pos = new ParsePosition(0);
+        assertNull(new Vector3DFormat().parse("{1; 1 1}", pos));
+        assertEquals(6, pos.getErrorIndex());
+    }
+
+    public void testForgottenSuffix() {
+        ParsePosition pos = new ParsePosition(0);
+        assertNull(new Vector3DFormat().parse("{1; 1; 1 ", pos));
+        assertEquals(8, pos.getErrorIndex());
+    }
+
+}

Propchange: commons/proper/math/branches/MATH_2_0/src/test/org/apache/commons/math/geometry/Vector3DFormatAbstractTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: commons/proper/math/branches/MATH_2_0/src/test/org/apache/commons/math/geometry/Vector3DFormatAbstractTest.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Added: commons/proper/math/branches/MATH_2_0/src/test/org/apache/commons/math/geometry/Vector3DFormatTest.java
URL: http://svn.apache.org/viewvc/commons/proper/math/branches/MATH_2_0/src/test/org/apache/commons/math/geometry/Vector3DFormatTest.java?rev=680029&view=auto
==============================================================================
--- commons/proper/math/branches/MATH_2_0/src/test/org/apache/commons/math/geometry/Vector3DFormatTest.java (added)
+++ commons/proper/math/branches/MATH_2_0/src/test/org/apache/commons/math/geometry/Vector3DFormatTest.java Sat Jul 26 11:31:41 2008
@@ -0,0 +1,31 @@
+/*
+ * 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.math.geometry;
+
+import java.util.Locale;
+
+
+public class Vector3DFormatTest extends Vector3DFormatAbstractTest {
+    protected char getDecimalCharacter() {
+        return '.';
+    }
+    
+    protected Locale getLocale() {
+        return Locale.US;
+    }
+}

Propchange: commons/proper/math/branches/MATH_2_0/src/test/org/apache/commons/math/geometry/Vector3DFormatTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: commons/proper/math/branches/MATH_2_0/src/test/org/apache/commons/math/geometry/Vector3DFormatTest.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision