diff --git a/Source/Experimental/DataBinding/RiveViewModelInstanceData.mm b/Source/Experimental/DataBinding/RiveViewModelInstanceData.mm index f28b6920..75ff546f 100644 --- a/Source/Experimental/DataBinding/RiveViewModelInstanceData.mm +++ b/Source/Experimental/DataBinding/RiveViewModelInstanceData.mm @@ -87,11 +87,8 @@ - (instancetype)initWithData:(rive::CommandQueue::ViewModelInstanceData)data break; case rive::DataType::string: case rive::DataType::enumType: - if (!data.stringValue.empty()) - { - _stringValue = [NSString - stringWithUTF8String:data.stringValue.c_str()]; - } + _stringValue = [NSString + stringWithUTF8String:data.stringValue.c_str()]; break; default: // For other types, try stringValue if it's not empty diff --git a/Tests/Experimental/DataBinding/ViewModelInstanceTests.swift b/Tests/Experimental/DataBinding/ViewModelInstanceTests.swift index b69bb588..87431bf7 100644 --- a/Tests/Experimental/DataBinding/ViewModelInstanceTests.swift +++ b/Tests/Experimental/DataBinding/ViewModelInstanceTests.swift @@ -188,6 +188,61 @@ class ViewModelInstanceTests: XCTestCase { XCTAssertEqual(unsubscribeCall.requestID, requestID) } + @MainActor + func test_value_withEmptyStringProperty_returnsEmptyString() async throws { + let mockCommandQueue = MockCommandQueue() + var capturedObserver: ViewModelInstanceListener? + + let viewModelInstance = makeViewModelInstance(mockCommandQueue: mockCommandQueue) { observer in + capturedObserver = observer + } + + mockCommandQueue.stubRequestViewModelInstanceString { instanceHandle, path, requestID in + let mockData = MockRiveViewModelInstanceData(stringValue: "") + capturedObserver?.onViewModelDataReceived(instanceHandle, requestID: requestID, data: mockData) + } + + let property = StringProperty(path: "test.path") + let value = try await viewModelInstance.value(of: property) + + XCTAssertEqual(value, "") + } + + @MainActor + func test_valueStream_withEmptyStringProperty_yieldsEmptyString() async throws { + let mockCommandQueue = MockCommandQueue() + + let viewModelInstance = makeViewModelInstance(mockCommandQueue: mockCommandQueue) + + let property = StringProperty(path: "test.path") + let stream = viewModelInstance.valueStream(of: property) + + let subscribeCall = mockCommandQueue.subscribeToViewModelPropertyCalls[0] + let observer = mockCommandQueue.getObserver(for: 99) + let requestID = subscribeCall.requestID + + let task = Task { + var values: [String] = [] + for try await value in stream { + values.append(value) + if values.count >= 2 { break } + } + return values + } + + let nonEmpty = MockRiveViewModelInstanceData(stringValue: "hello") + observer?.onViewModelDataReceived(99, requestID: requestID, data: nonEmpty) + + let empty = MockRiveViewModelInstanceData(stringValue: "") + observer?.onViewModelDataReceived(99, requestID: requestID, data: empty) + + let values = try await task.value + + XCTAssertEqual(values.count, 2) + XCTAssertEqual(values[0], "hello") + XCTAssertEqual(values[1], "") + } + // MARK: - Number @MainActor