From f4cbb5da10f3739d3d79348eaac78ea75004fcb1 Mon Sep 17 00:00:00 2001 From: pkurchatov Date: Mon, 2 Dec 2024 18:36:05 +0300 Subject: [PATCH] Fixed number to boolean conversion commit_hash:62352ebdc0bd9ffc75e44e6a16f8e444896e6315 --- .../ExpressionValueConverter.swift | 9 ++++ .../Expressions/ExpressionResolverTests.swift | 44 +++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/client/ios/DivKit/Expressions/ExpressionValueConverter.swift b/client/ios/DivKit/Expressions/ExpressionValueConverter.swift index fd58b7a26..e2fe49fee 100644 --- a/client/ios/DivKit/Expressions/ExpressionValueConverter.swift +++ b/client/ios/DivKit/Expressions/ExpressionValueConverter.swift @@ -11,6 +11,15 @@ enum ExpressionValueConverter { switch T.self { case is String.Type: return stringify(anyValue) as? T + case is Bool.Type: + if let numberValue = anyValue as? NSNumber { + if numberValue == 0 { + return false as? T + } else if numberValue == 1 { + return true as? T + } + } + return nil case let numericType as _Numeric.Type: if anyValue is Bool { return nil diff --git a/client/ios/DivKitTests/Expressions/ExpressionResolverTests.swift b/client/ios/DivKitTests/Expressions/ExpressionResolverTests.swift index 6b4961834..e6771c1b3 100644 --- a/client/ios/DivKitTests/Expressions/ExpressionResolverTests.swift +++ b/client/ios/DivKitTests/Expressions/ExpressionResolverTests.swift @@ -187,6 +187,50 @@ final class ExpressionResolverTests: XCTestCase { XCTAssertTrue(value) } + func test_ResolveNumeric_BooleanFromInteger_False() { + let value: Bool = expressionResolver.resolveNumeric(expression("@{0}"))! + XCTAssertFalse(value) + } + + func test_ResolveNumeric_BooleanFromInteger_True() { + let value: Bool = expressionResolver.resolveNumeric(expression("@{1}"))! + XCTAssertTrue(value) + } + + func test_ResolveNumeric_BooleanFromInteger_Invalid() { + isErrorExpected = true + + let value: Bool? = expressionResolver.resolveNumeric(expression("@{3}")) + XCTAssertNil(value) + + XCTAssertEqual( + error, + "Invalid result type: expected Boolean, got Integer. Expression: @{3}" + ) + } + + func test_ResolveNumeric_BooleanFromNumber_False() { + let value: Bool = expressionResolver.resolveNumeric(expression("@{0.0}"))! + XCTAssertFalse(value) + } + + func test_ResolveNumeric_BooleanFromNumber_True() { + let value: Bool = expressionResolver.resolveNumeric(expression("@{1.0}"))! + XCTAssertTrue(value) + } + + func test_ResolveNumeric_BooleanFromNumber_Invalid() { + isErrorExpected = true + + let value: Bool? = expressionResolver.resolveNumeric(expression("@{1.2}")) + XCTAssertNil(value) + + XCTAssertEqual( + error, + "Invalid result type: expected Boolean, got Number. Expression: @{1.2}" + ) + } + func test_ResolveNumeric_IntegerAsNumber() { let value: Double? = expressionResolver.resolveNumeric(expression("@{integer_var}")) XCTAssertEqual(value, 123.0)