[ios, macos] Distinguish between conditionals and expressions in case expression

This commit is contained in:
Minh Nguyễn
2018-04-05 21:13:58 -07:00
committed by Minh Nguyễn
parent e32a0586f2
commit f9e32d59ad
2 changed files with 19 additions and 5 deletions

View File

@@ -662,9 +662,9 @@ NSArray *MGLSubexpressionsWithJSONObjects(NSArray *objects) {
NSMutableArray *arguments = [NSMutableArray array];
for (NSUInteger index = 0; index < argumentObjects.count; index++) {
if ([argumentObjects[index] isKindOfClass:[NSArray class]]) {
NSPredicate *conditional = [NSPredicate mgl_predicateWithJSONObject:argumentObjects[index]];
NSExpression *argument = [NSExpression expressionWithFormat:@"%@", conditional];
if (index % 2 == 0 && index != argumentObjects.count - 1) {
NSPredicate *predicate = [NSPredicate mgl_predicateWithJSONObject:argumentObjects[index]];
NSExpression *argument = [NSExpression expressionForConstantValue:predicate];
[arguments addObject:argument];
} else {
[arguments addObject:[NSExpression mgl_expressionWithJSONObject:argumentObjects[index]]];
@@ -673,7 +673,7 @@ NSArray *MGLSubexpressionsWithJSONObjects(NSArray *objects) {
if (@available(iOS 9.0, *)) {
if (arguments.count == 3) {
NSPredicate *conditional = [NSPredicate mgl_predicateWithJSONObject:argumentObjects.firstObject];
NSPredicate *conditional = [arguments.firstObject constantValue];
return [NSExpression expressionForConditional:conditional trueExpression:arguments[1] falseExpression:arguments[2]];
}
}

View File

@@ -743,7 +743,21 @@ using namespace std::string_literals;
XCTAssertEqualObjects([NSExpression mgl_expressionWithJSONObject:jsonExpression], expression);
XCTAssertEqualObjects([expression expressionValueWithObject:nil context:nil], @YES);
}
{
NSArray *jsonExpression = @[
@"case",
@[
@"<",
@[@"get", @"area"],
@80000
],
@[@"get", @"abbr"],
@[@"get", @"name_en"]
];
NSExpression *expression = [NSExpression expressionWithFormat:@"TERNARY(area < 80000, abbr, name_en)"];
XCTAssertEqualObjects([NSExpression mgl_expressionWithJSONObject:jsonExpression], expression);
XCTAssertEqualObjects(expression.mgl_jsonExpressionObject, jsonExpression);
}
}
- (void)testLookupExpressionObject {