-
Notifications
You must be signed in to change notification settings - Fork 14
Open
Description
Consider this unit test based on the example in the root README.md. Note that on remoteDoc I never call remoteDoc.Text("name") to define the field.
[Fact]
public void ReadingUndeclaredPropertyReturnsNull()
{
Doc localDoc = new Doc();
Text localText = localDoc.Text("name");
Transaction localTransaction = localDoc.WriteTransaction();
localText.Insert(localTransaction, 0, "Y-CRDT");
localTransaction.Commit();
// Set up the remote document.
Doc remoteDoc = new Doc();
// remoteDoc.Text("name");
// ^^^^^^^^^^^^^^^^^^^^^^. NOTE: explicitly not declaring the name field
// Get the remote document state vector.
Transaction remoteTransaction = remoteDoc.WriteTransaction();
byte[] remoteState = remoteTransaction.StateVectorV1();
// Calculate the state diff between the local and the remote document.
localTransaction = localDoc.ReadTransaction();
byte[] stateDiff = localTransaction.StateDiffV1(remoteState);
localTransaction.Commit();
// Apply the state diff to synchronize the remote document with the local changes.
TransactionUpdateResult result = remoteTransaction.ApplyV1(stateDiff);
remoteTransaction.Commit();
// at this point, remoteDoc should have the "name" field since it synced with localDoc
using (remoteTransaction = remoteDoc.ReadTransaction())
{
Text? textProperty = remoteTransaction.GetText("name");
// as a new user, I expected this to return the Text since the sync should have created
// it.
// Instead, the docs state it should be null: "Returns the Text at the Doc root level, identified by name,
// or null if no entry was defined under name before." However, it throws instead.
Assert.Null(textProperty);
}
}I had expected the call to remoteTransaction.GetText("name") to return the Text object since
by virtue of syncing with localDocument the property does now exist. Barring that, I expected it to return null per the documentation of the GetText method: "Returns the Text at the Doc root level, identified by name, or null if no entry was defined under name before."
In reality, it threw an exception:
YDotNet.YDotNetException: Expected 'Text', got '0'.
YDotNet.YDotNetException
Expected 'Text', got '0'.
at YDotNet.Document.Transactions.Transaction.GetWithKind(String name, BranchKind expectedKind)
at YDotNet.Document.Transactions.Transaction.GetText(String name)
at Ballpark.Tests.DocTests.ReadingUndeclaredPropertyReturnsNull() in /Users/mattburke/projects/ballpark/server/Ballpark.Tests/DocTests.cs:line 57
at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor)
at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)
- Is this expected behavior? Is a documentation update in order?
- If throwing is correct, it might be useful to add to the exception message, something like "Did you forget to define the field?".
I would love to contribute an improvement if there's a direction you prefer to take!
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels