summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFabian Guerra <fabian.guerra@mapbox.com>2018-12-13 16:43:39 -0800
committerFabian Guerra <fabian.guerra@mapbox.com>2018-12-13 16:45:54 -0800
commit5984fdec1451d485d2fc4d329944980f4c056891 (patch)
tree4245a2c70f34540d8159b6bcda6dfdb1dacb2e88
parente86d1b2ac99452819396e2e617a77b2918cd5a04 (diff)
downloadqtlocation-mapboxgl-upstream/fabian-conversion-13527.tar.gz
[ios, macos] Fix number conversions when expressions cast to large numbers.upstream/fabian-conversion-13527
-rw-r--r--platform/darwin/src/MGLConversion.h4
-rw-r--r--platform/darwin/test/MGLPredicateTests.mm9
2 files changed, 11 insertions, 2 deletions
diff --git a/platform/darwin/src/MGLConversion.h b/platform/darwin/src/MGLConversion.h
index 9057ed7824..7050b4febf 100644
--- a/platform/darwin/src/MGLConversion.h
+++ b/platform/darwin/src/MGLConversion.h
@@ -85,7 +85,7 @@ public:
static optional<float> toNumber(const Holder& holder) {
const id value = holder.value;
if (_isNumber(value)) {
- return ((NSNumber *)value).floatValue;
+ return ((NSNumber *)value).doubleValue;
} else {
return {};
}
@@ -119,7 +119,7 @@ public:
return { *toString(holder) };
} else if (_isNumber(value)) {
// Need to cast to a double here as the float is otherwise considered a bool...
- return { static_cast<double>(*toNumber(holder)) };
+ return { *toDouble(holder) };
} else {
return {};
}
diff --git a/platform/darwin/test/MGLPredicateTests.mm b/platform/darwin/test/MGLPredicateTests.mm
index ed92c920f6..2ed18d48fc 100644
--- a/platform/darwin/test/MGLPredicateTests.mm
+++ b/platform/darwin/test/MGLPredicateTests.mm
@@ -225,6 +225,15 @@
XCTAssertEqualObjects(predicateAfter, forwardPredicateAfter);
}
{
+ NSArray *expected = @[@"match", @[@"to-number", @[@"id"]], @[@3002970001, @3004140052, @3002950027, @3002970033], @YES, @NO];
+ NSPredicate *predicate = [NSPredicate predicateWithFormat:@"CAST($featureIdentifier, 'NSNumber') IN { 3002970001, 3004140052, 3002950027, 3002970033 }"];
+ XCTAssertEqualObjects(predicate.mgl_jsonExpressionObject, expected);
+ NSPredicate *predicateAfter = [NSPredicate predicateWithFormat:@"MGL_MATCH(CAST($featureIdentifier, 'NSNumber'), { 3002950027, 3002970001, 3002970033, 3004140052 }, YES, NO) == YES"];
+ auto forwardFilter = [NSPredicate predicateWithMGLJSONObject:expected].mgl_filter;
+ NSPredicate *forwardPredicateAfter = [NSPredicate mgl_predicateWithFilter:forwardFilter];
+ XCTAssertEqualObjects(predicateAfter, forwardPredicateAfter);
+ }
+ {
NSArray *expected = @[@"!", @[@"match", @[@"get", @"x"], @[@6, @5, @4, @3], @YES, @NO]];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NOT x IN { 6, 5, 4, 3}"];
XCTAssertEqualObjects(predicate.mgl_jsonExpressionObject, expected);