diff --git a/client/ios/DivKit/Extensions/DivTypedValueExtensions.swift b/client/ios/DivKit/Extensions/DivTypedValueExtensions.swift index 7942c3e1d..19b9831e5 100644 --- a/client/ios/DivKit/Extensions/DivTypedValueExtensions.swift +++ b/client/ios/DivKit/Extensions/DivTypedValueExtensions.swift @@ -6,8 +6,9 @@ extension DivTypedValue { ) -> DivVariableValue? { switch self { case let .arrayValue(value): - if let arrayValue = value.resolveValue(expressionResolver) as? DivArray { - return .array(arrayValue) + if let array = value.resolveValue(expressionResolver), + let divArray = DivArray.fromAny(array) { + return .array(divArray) } return nil case let .booleanValue(value): @@ -53,8 +54,8 @@ extension DivTypedValue { ) -> AnyHashable? { switch self { case let .arrayValue(value): - if let arrayValue = value.resolveValue(expressionResolver) as? DivArray { - return arrayValue + if let arrayValue = value.resolveValue(expressionResolver) { + return DivArray.fromAny(arrayValue) } return nil case let .booleanValue(value): @@ -68,10 +69,7 @@ extension DivTypedValue { } return nil case let .dictValue(value): - if let dictValue = value.value as? DivDictionary { - return dictValue - } - return nil + return DivDictionary.fromAny(value.value) case let .integerValue(value): if let integerValue = value.resolveValue(expressionResolver) { return integerValue diff --git a/client/ios/DivKitTests/Actions/DivActionHandlerTests.swift b/client/ios/DivKitTests/Actions/DivActionHandlerTests.swift index 627c523e5..8d30bc08d 100644 --- a/client/ios/DivKitTests/Actions/DivActionHandlerTests.swift +++ b/client/ios/DivKitTests/Actions/DivActionHandlerTests.swift @@ -224,6 +224,40 @@ final class DivActionHandlerTests: XCTestCase { XCTAssertEqual(["one", "new value"], getVariableValue("array_var")) } + func test_ArraySetValueAction_SetsArrayValue() { + setVariableValue("array_var", .array(["one", "two"])) + + handle(.divActionArraySetValue( + DivActionArraySetValue( + index: .value(1), + value: arrayValue(["new value", ["key1": "value", "key2": 123.45]]), + variableName: .value("array_var") + ) + )) + + XCTAssertEqual( + DivArray.fromAny(["one", ["new value", ["key1": "value", "key2": 123.45]]])!, + getVariableValue("array_var") + ) + } + + func test_ArraySetValueAction_SetsDictValue() { + setVariableValue("array_var", .array(["one", "two"])) + + handle(.divActionArraySetValue( + DivActionArraySetValue( + index: .value(1), + value: .dictValue(DictValue(value: ["key1": "value", "key2": 123.45])), + variableName: .value("array_var") + ) + )) + + XCTAssertEqual( + DivArray.fromAny(["one", ["key1": "value", "key2": 123.45]])!, + getVariableValue("array_var") + ) + } + func test_ArraySetValueAction_DoesNothingForInvalidIndex() { setVariableValue("array_var", .array(["one", "two"])) @@ -456,32 +490,29 @@ final class DivActionHandlerTests: XCTestCase { func test_SetVariableAction_SetsArrayVariable() { setVariableValue("array_var", .array([])) + let value: [Any] = [["key1": "value", "key2": 123.45], ["key1": "value", "key2": true]] handle(.divActionSetVariable( DivActionSetVariable( - value: .arrayValue(ArrayValue(value: .value(["value 1", "value 2"]))), + value: arrayValue(value), variableName: .value("array_var") ) )) - XCTAssertEqual(["value 1", "value 2"], getVariableValue("array_var")) + XCTAssertEqual(DivArray.fromAny(value)!, getVariableValue("array_var")) } func test_SetVariableAction_SetsDictVariable() { setVariableValue("dict_var", .dict([:])) + let value: [String: Any] = ["key1": "value", "key2": 123.45, "nested": ["key": "value"]] handle(.divActionSetVariable( DivActionSetVariable( - value: .dictValue(DictValue( - value: ["key_1": "value_1", "nested": ["key_2": "value_2"]] - )), + value: .dictValue(DictValue(value: value)), variableName: .value("dict_var") ) )) - XCTAssertEqual( - ["key_1": "value_1", "nested": ["key_2": "value_2"]] as DivDictionary, - getVariableValue("dict_var") - ) + XCTAssertEqual(DivDictionary.fromAny(value)!, getVariableValue("dict_var")) } func test_SetVariableAction_SetsLocalVariable() { @@ -582,6 +613,10 @@ final class DivActionHandlerTests: XCTestCase { } } +private func arrayValue(_ value: [Any]) -> DivTypedValue { + .arrayValue(ArrayValue(value: .value(value))) +} + private func stringValue(_ value: String) -> DivTypedValue { .stringValue(StringValue(value: .value(value))) }