Fixed arrays parsing in typed actions

commit_hash:b733843b84446f26a3b976873106919ed2570960
This commit is contained in:
pkurchatov
2025-03-01 23:43:24 +03:00
parent 6298661ecd
commit da27f83584
2 changed files with 50 additions and 17 deletions
@@ -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
@@ -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)))
}