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!
Consider this unit test based on the example in the root README.md. Note that on
remoteDocI never callremoteDoc.Text("name")to define the field.I had expected the call to
remoteTransaction.GetText("name")to return theTextobject sinceby virtue of syncing with
localDocumentthe property does now exist. Barring that, I expected it to returnnullper the documentation of theGetTextmethod: "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:
I would love to contribute an improvement if there's a direction you prefer to take!