Author: bayard
Date: Mon Jan 17 04:30:05 2011
New Revision: 1059749

URL: http://svn.apache.org/viewvc?rev=1059749&view=rev
Log:
Adding first method check from Math's MathUtils.gcd method; and unit tests 
showing that this was needed. Bug reported and solved by Christian Semrau 
[LANG-662]

Modified:
    
commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/math/Fraction.java
    
commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/math/FractionTest.java

Modified: 
commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/math/Fraction.java
URL: 
http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/math/Fraction.java?rev=1059749&r1=1059748&r2=1059749&view=diff
==============================================================================
--- 
commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/math/Fraction.java
 (original)
+++ 
commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/math/Fraction.java
 Mon Jan 17 04:30:05 2011
@@ -579,8 +579,15 @@ public final class Fraction extends Numb
      * @return the greatest common divisor, never zero
      */
     private static int greatestCommonDivisor(int u, int v) {
-        //if either op. is abs 0 or 1, return 1:
-        if (Math.abs(u) <= 1 || Math.abs(v) <= 1) {
+        // From Commons Math:
+        if ((u == 0) || (v == 0)) {
+            if ((u == Integer.MIN_VALUE) || (v == Integer.MIN_VALUE)) {
+                throw new ArithmeticException("overflow: gcd is 2^31");
+            }
+            return Math.abs(u) + Math.abs(v);
+        }
+        //if either operand is abs 1, return 1:
+        if (Math.abs(u) == 1 || Math.abs(v) == 1) {
             return 1;
         }
         // keep u and v negative, as negative integers range down to

Modified: 
commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/math/FractionTest.java
URL: 
http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/math/FractionTest.java?rev=1059749&r1=1059748&r2=1059749&view=diff
==============================================================================
--- 
commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/math/FractionTest.java
 (original)
+++ 
commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/math/FractionTest.java
 Mon Jan 17 04:30:05 2011
@@ -330,6 +330,11 @@ public class FractionTest extends TestCa
             f = Fraction.getReducedFraction(-7, Integer.MIN_VALUE);  
             fail("Expecting ArithmeticException");
         } catch (ArithmeticException ex) {}      
+
+        // LANG-662
+        f = Fraction.getReducedFraction(Integer.MIN_VALUE, 2);
+        assertEquals(Integer.MIN_VALUE / 2, f.getNumerator());
+        assertEquals(1, f.getDenominator());
     }
 
     public void testFactory_double() {
@@ -643,6 +648,11 @@ public class FractionTest extends TestCa
         assertEquals(0, result.getNumerator());
         assertEquals(1, result.getDenominator());
         assertSame(result, Fraction.ZERO);
+
+        f = Fraction.getFraction(Integer.MIN_VALUE, 2);
+        result = f.reduce();
+        assertEquals(Integer.MIN_VALUE / 2, result.getNumerator());
+        assertEquals(1, result.getDenominator());
     }
     
     public void testInvert() {


Reply via email to