From f5937a6fadbb5e6a863b072405a381808856ddb8 Mon Sep 17 00:00:00 2001 From: Martin Carlberg Date: Fri, 31 Jan 2020 14:24:29 +0100 Subject: [PATCH] Fixed: CPComparisonPredicate does never evaluate to true for a predicate like 'something != nil' An example: var array = @[ @{@"Name": @"1"}, @{@"Name": @"2", @"approveTime": @"Now"} ]; var predicate = [CPPredicate predicateWithFormat:@"approveTime != nil"]; CPLog(@"result: %@", [array filteredArrayUsingPredicate:predicate]); // result: If I run this in Cappuccino I get an empty array If I run it in Cocoa on a Mac I get: result: ( { Name = 2; approveTime = Now; } --- Foundation/CPPredicate/CPComparisonPredicate.j | 11 +++++++---- Tests/Foundation/CPPredicateTest.j | 16 ++++++++++++++++ 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/Foundation/CPPredicate/CPComparisonPredicate.j b/Foundation/CPPredicate/CPComparisonPredicate.j index 15a44be33..cac3d5fe0 100644 --- a/Foundation/CPPredicate/CPComparisonPredicate.j +++ b/Foundation/CPPredicate/CPComparisonPredicate.j @@ -287,10 +287,13 @@ rightIsNil = (rhs == nil || [rhs isEqual:[CPNull null]]); if ((leftIsNil || rightIsNil) && _type != CPCustomSelectorPredicateOperatorType) - return (leftIsNil == rightIsNil && - (_type == CPEqualToPredicateOperatorType || - _type == CPLessThanOrEqualToPredicateOperatorType || - _type == CPGreaterThanOrEqualToPredicateOperatorType)); + return (leftIsNil === rightIsNil && + (_type === CPEqualToPredicateOperatorType || + _type === CPLessThanOrEqualToPredicateOperatorType || + _type === CPGreaterThanOrEqualToPredicateOperatorType)) + || + (leftIsNil !== rightIsNil && + (_type === CPNotEqualToPredicateOperatorType)); var string_compare_options = 0; diff --git a/Tests/Foundation/CPPredicateTest.j b/Tests/Foundation/CPPredicateTest.j index 3a9840e96..f57868a9d 100644 --- a/Tests/Foundation/CPPredicateTest.j +++ b/Tests/Foundation/CPPredicateTest.j @@ -271,6 +271,22 @@ pred = [[CPComparisonPredicate alloc] initWithLeftExpression:[CPExpression expressionForConstantValue:nil] rightExpression:[CPExpression expressionForConstantValue:nil] modifier:CPDirectPredicateModifier type:CPBeginsWithPredicateOperatorType options:0]; [self assertFalse:[pred evaluateWithObject:dict] message:"'" + [pred description] + "' should be false"]; + + pred = [[CPComparisonPredicate alloc] initWithLeftExpression:[CPExpression expressionForConstantValue:nil] rightExpression:[CPExpression expressionForConstantValue:nil] modifier:CPDirectPredicateModifier type:CPEqualToPredicateOperatorType options:0]; + + [self assertTrue:[pred evaluateWithObject:dict] message:"'" + [pred description] + "' should be true"]; + + pred = [[CPComparisonPredicate alloc] initWithLeftExpression:[CPExpression expressionForConstantValue:nil] rightExpression:[CPExpression expressionForConstantValue:nil] modifier:CPDirectPredicateModifier type:CPNotEqualToPredicateOperatorType options:0]; + + [self assertFalse:[pred evaluateWithObject:dict] message:"'" + [pred description] + "' should be false"]; + + pred = [[CPComparisonPredicate alloc] initWithLeftExpression:[CPExpression expressionForConstantValue:@"Something"] rightExpression:[CPExpression expressionForConstantValue:nil] modifier:CPDirectPredicateModifier type:CPEqualToPredicateOperatorType options:0]; + + [self assertFalse:[pred evaluateWithObject:dict] message:"'" + [pred description] + "' should be false"]; + + pred = [[CPComparisonPredicate alloc] initWithLeftExpression:[CPExpression expressionForConstantValue:@"Something"] rightExpression:[CPExpression expressionForConstantValue:nil] modifier:CPDirectPredicateModifier type:CPNotEqualToPredicateOperatorType options:0]; + + [self assertTrue:[pred evaluateWithObject:dict] message:"'" + [pred description] + "' should be true"]; } - (void)testPredicateParsing