From 43c0eda2be403d24c83049356a1333efb0620ab2 Mon Sep 17 00:00:00 2001 From: Christian Passlack Date: Fri, 20 Mar 2015 11:21:07 +0100 Subject: [PATCH 1/3] Fixed: Encoding a [CPDecimalNumber zero] causes a corrupt CPDecimalNumber after decoding Previously, CPNumber and CPDecimalNumber shared the same method UID and CPNumberUIDs-Dictionary. This leads to some unexpected errors for example a [CPDecimalNumber zero] which refers to itself after decoding. CPDecimalNumber now overwrites the method UID and has its own UID-Dictionary. Fixes #2332 --- Foundation/CPDecimalNumber.j | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/Foundation/CPDecimalNumber.j b/Foundation/CPDecimalNumber.j index 7221cd2e5..39c221d53 100644 --- a/Foundation/CPDecimalNumber.j +++ b/Foundation/CPDecimalNumber.j @@ -28,6 +28,8 @@ // The default global behavior class, created lazily var CPDefaultDcmHandler = nil; +var CPDecimalNumberUIDs = new CFMutableDictionary(); + /*! @class CPDecimalNumberHandler @ingroup foundation @@ -531,6 +533,20 @@ var CPDecimalNumberHandlerRoundingModeKey = @"CPDecimalNumberHandlerRoundi } // instance methods + +- (CPString)UID +{ + var UID = CPDecimalNumberUIDs.valueForKey(self); + + if (!UID) + { + UID = objj_generateObjectUID(); + CPDecimalNumberUIDs.setValueForKey(self, UID); + } + + return UID + ""; +} + /*! Returns a new CPDecimalNumber object with the result of the summation of the receiver object and \c decimalNumber. If overflow occurs then the From 94f15aba402ebb5c0e1b382a5c83e6cb7c3ecc2a Mon Sep 17 00:00:00 2001 From: Christian Passlack Date: Mon, 23 Mar 2015 20:30:01 +0100 Subject: [PATCH 2/3] Updated Test-Cases of CPNumberFormater and CPTextfield because of the changes for fix #2332. The test-cased failed, because now a a CPDecimalNumber has a different UID compared to a CPNumber with the same value. That means isEqual: will return false. In the test-cases the formatter now generates CPNumbers to make the two Numbers compareable via isEqual. --- Tests/AppKit/CPTextFieldTest.j | 1 + Tests/Foundation/CPNumberFormatterTest.j | 1 + 2 files changed, 2 insertions(+) diff --git a/Tests/AppKit/CPTextFieldTest.j b/Tests/AppKit/CPTextFieldTest.j index bca749b45..5754fed59 100644 --- a/Tests/AppKit/CPTextFieldTest.j +++ b/Tests/AppKit/CPTextFieldTest.j @@ -29,6 +29,7 @@ [numberFormatter setNumberStyle:CPNumberFormatterDecimalStyle]; [numberFormatter setMaximumFractionDigits:3]; + [numberFormatter setGeneratesDecimalNumbers:NO]; [control setFormatter:numberFormatter]; [control setStringValue:@"12.3456"]; diff --git a/Tests/Foundation/CPNumberFormatterTest.j b/Tests/Foundation/CPNumberFormatterTest.j index 81d994824..14ca5e800 100644 --- a/Tests/Foundation/CPNumberFormatterTest.j +++ b/Tests/Foundation/CPNumberFormatterTest.j @@ -62,6 +62,7 @@ [numberFormatter setMinimum:10]; [numberFormatter setMaximum:20]; + [numberFormatter setGeneratesDecimalNumbers:NO]; [self assertTrue:[numberFormatter getObjectValue:objectValueRef forString:@"10" errorDescription:nil] message:@"MinMax T1: Expected True."]; From bb9049bef4dd9c94231446f040d0a32a62fc1f65 Mon Sep 17 00:00:00 2001 From: Christian Passlack Date: Mon, 23 Mar 2015 20:45:31 +0100 Subject: [PATCH 3/3] Code-styling to match official style-guide. --- Foundation/CPDecimalNumber.j | 2 +- Tests/AppKit/CPTextFieldTest.j | 2 +- Tests/Foundation/CPNumberFormatterTest.j | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Foundation/CPDecimalNumber.j b/Foundation/CPDecimalNumber.j index 39c221d53..cc97c2177 100644 --- a/Foundation/CPDecimalNumber.j +++ b/Foundation/CPDecimalNumber.j @@ -28,7 +28,7 @@ // The default global behavior class, created lazily var CPDefaultDcmHandler = nil; -var CPDecimalNumberUIDs = new CFMutableDictionary(); +var CPDecimalNumberUIDs = new CFMutableDictionary(); /*! @class CPDecimalNumberHandler diff --git a/Tests/AppKit/CPTextFieldTest.j b/Tests/AppKit/CPTextFieldTest.j index 5754fed59..f14bfb6a7 100644 --- a/Tests/AppKit/CPTextFieldTest.j +++ b/Tests/AppKit/CPTextFieldTest.j @@ -29,7 +29,7 @@ [numberFormatter setNumberStyle:CPNumberFormatterDecimalStyle]; [numberFormatter setMaximumFractionDigits:3]; - [numberFormatter setGeneratesDecimalNumbers:NO]; + [numberFormatter setGeneratesDecimalNumbers:NO]; [control setFormatter:numberFormatter]; [control setStringValue:@"12.3456"]; diff --git a/Tests/Foundation/CPNumberFormatterTest.j b/Tests/Foundation/CPNumberFormatterTest.j index 14ca5e800..29deac36a 100644 --- a/Tests/Foundation/CPNumberFormatterTest.j +++ b/Tests/Foundation/CPNumberFormatterTest.j @@ -62,7 +62,7 @@ [numberFormatter setMinimum:10]; [numberFormatter setMaximum:20]; - [numberFormatter setGeneratesDecimalNumbers:NO]; + [numberFormatter setGeneratesDecimalNumbers:NO]; [self assertTrue:[numberFormatter getObjectValue:objectValueRef forString:@"10" errorDescription:nil] message:@"MinMax T1: Expected True."];