From e17253d592fcf6e58f39e478ed2e4e74a667804f Mon Sep 17 00:00:00 2001 From: Stephen Ierodiaconou Date: Wed, 30 Jan 2013 13:03:43 +0200 Subject: [PATCH] Fixes for #1720: CPDecimalCompare problems when comparing to zero. --- Foundation/CPDecimal.j | 9 ++++++--- Tests/Foundation/CPDecimalTest.j | 29 +++++++++++++++++++++++++++-- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/Foundation/CPDecimal.j b/Foundation/CPDecimal.j index 4b2f68697..18e727765 100644 --- a/Foundation/CPDecimal.j +++ b/Foundation/CPDecimal.j @@ -386,16 +386,19 @@ function CPDecimalCompare(leftOperand, rightOperand) s1 = leftOperand._exponent + leftOperand._mantissa.length, s2 = rightOperand._exponent + rightOperand._mantissa.length; - if (leftIsZero || s1 < s2) + if (leftIsZero && rightIsZero) + return CPOrderedSame; + + if (leftIsZero || (s1 < s2 && !rightIsZero)) { if (rightOperand._isNegative) return CPOrderedDescending; else return CPOrderedAscending; } - if (rightIsZero || s1 > s2) + if (rightIsZero || (s1 > s2 && !leftIsZero)) { - if (rightOperand._isNegative) + if (leftOperand._isNegative) return CPOrderedAscending; else return CPOrderedDescending; diff --git a/Tests/Foundation/CPDecimalTest.j b/Tests/Foundation/CPDecimalTest.j index 442aaa03d..67cd2159a 100644 --- a/Tests/Foundation/CPDecimalTest.j +++ b/Tests/Foundation/CPDecimalTest.j @@ -339,12 +339,37 @@ dcm1 = CPDecimalMakeWithString(@"0.0"); dcm = CPDecimalMakeWithString(@"0.5"); c = CPDecimalCompare(dcm1,dcm); - [self assert:CPOrderedAscending equals:c message:"CPDecimalCompare() Tc4: should be descending"]; + [self assert:CPOrderedAscending equals:c message:"CPDecimalCompare() (0.0, 0.5) should be ascending"]; dcm1 = CPDecimalMakeWithString(@"0.0"); dcm = CPDecimalMakeWithString(@"-0.5"); c = CPDecimalCompare(dcm1,dcm); - [self assert:CPOrderedDescending equals:c message:"CPDecimalCompare() Tc4: should be descending"]; + [self assert:CPOrderedDescending equals:c message:"CPDecimalCompare() (0, -0.5) should be descending"]; + + dcm1 = CPDecimalMakeZero(); + dcm = CPDecimalMakeZero(); + c = CPDecimalCompare(dcm1,dcm); + [self assert:CPOrderedSame equals:c message:"CPDecimalCompare(): zeros should be same"]; + + dcm1 = CPDecimalMakeWithString(@"0.0001"); + dcm = CPDecimalMakeZero(); + c = CPDecimalCompare(dcm1,dcm); + [self assert:CPOrderedDescending equals:c message:"CPDecimalCompare(): (0.0001, 0) should be descending"]; + + dcm1 = CPDecimalMakeZero(); + dcm = CPDecimalMakeWithString(@"0.0001"); + c = CPDecimalCompare(dcm1,dcm); + [self assert:CPOrderedAscending equals:c message:"CPDecimalCompare(): (0, 0.0001) should be ascending"]; + + dcm1 = CPDecimalMakeWithString(@"-0.0001"); + dcm = CPDecimalMakeZero(); + c = CPDecimalCompare(dcm1,dcm); + [self assert:CPOrderedAscending equals:c message:"CPDecimalCompare(): (-0.0001, 0) should be ascending"]; + + dcm1 = CPDecimalMakeZero(); + dcm = CPDecimalMakeWithString(@"-0.0001"); + c = CPDecimalCompare(dcm1,dcm); + [self assert:CPOrderedDescending equals:c message:"CPDecimalCompare(): (0, -0.0001) should be descending"]; } - (void)testCompact