Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 2 additions & 5 deletions Source/Experimental/DataBinding/RiveViewModelInstanceData.mm
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
55 changes: 55 additions & 0 deletions Tests/Experimental/DataBinding/ViewModelInstanceTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down