in rd-net/Test.RdFramework/Interning/InterningTest.cs [54:148]
private void DoTest(bool firstClient, bool secondClient, bool thenSwitchSides = false)
{
var serverProperty =
new RdProperty<InterningTestModel>(InterningTestModel.Read, InterningTestModel.Write) {IsMaster = true}
.Static(1);
var clientProperty =
new RdProperty<InterningTestModel>(InterningTestModel.Read, InterningTestModel.Write) {IsMaster = false}
.Static(1);
var serverPropertyWrapper = new InterningTestPropertyWrapper<InterningTestModel>(serverProperty, ServerProtocol.SerializationContext);
var clientPropertyWrapper = new InterningTestPropertyWrapper<InterningTestModel>(clientProperty, ClientProtocol.SerializationContext);
serverPropertyWrapper.mySerializationContext =
ServerProtocol.SerializationContext.WithInternRootsHere(serverPropertyWrapper, "Test");
clientPropertyWrapper.mySerializationContext =
ClientProtocol.SerializationContext.WithInternRootsHere(clientPropertyWrapper, "Test");
serverPropertyWrapper.BindTopLevel(LifetimeDefinition.Lifetime, ServerProtocol, "top");
clientPropertyWrapper.BindTopLevel(LifetimeDefinition.Lifetime, ClientProtocol, "top");
var serverModel = new InterningTestModel("");
serverProperty.Value = serverModel;
var clientModel = clientProperty.Value;
var simpleTestData = new List<(int, string)> {(0, ""), (1, "test"), (2, "why")};
var firstSenderProtocol = firstClient ? ClientProtocol : ServerProtocol;
var firstSenderModel = firstClient ? clientModel : serverModel;
var firstBytesWritten = MeasureBytes(firstSenderProtocol, () =>
{
foreach (var pair in simpleTestData)
{
firstSenderModel.Issues[pair.Item1] = new WrappedStringModel(pair.Item2);
}
});
var secondSenderProtocol = secondClient ? ClientProtocol : ServerProtocol;
var secondSenderModel = secondClient ? clientModel : serverModel;
var secondBytesWritten = MeasureBytes(secondSenderProtocol, () =>
{
foreach (var pair in simpleTestData)
{
secondSenderModel.Issues[pair.Item1 + simpleTestData.Count] = new WrappedStringModel(pair.Item2);
}
});
Assertion.Assert(firstBytesWritten - simpleTestData.Sum(it => it.Item2.Length) >= secondBytesWritten,
"Interning must save bytes");
var firstReceiver = firstClient ? serverModel : clientModel;
var secondReceiver = secondClient ? serverModel : clientModel;
foreach (var pair in simpleTestData)
{
Assertion.Assert(pair.Item2 == firstReceiver.Issues[pair.Item1].Text, "Data must match");
Assertion.Assert(pair.Item2 == secondReceiver.Issues[pair.Item1 + simpleTestData.Count].Text,
"Data must match");
}
if (!thenSwitchSides) return;
var extraString = "again";
var thirdBytesWritten = MeasureBytes(secondSenderProtocol, () =>
{
foreach (var pair in simpleTestData)
{
secondSenderModel.Issues[pair.Item1 + simpleTestData.Count * 2] =
new WrappedStringModel(pair.Item2 + extraString);
}
});
var fourthBytesWritten = MeasureBytes(firstSenderProtocol, () =>
{
foreach (var pair in simpleTestData)
{
firstSenderModel.Issues[pair.Item1 + simpleTestData.Count * 3] =
new WrappedStringModel(pair.Item2 + extraString);
}
});
Assertion.Assert(thirdBytesWritten - simpleTestData.Sum(it => it.Item2.Length + extraString.Length) >=
fourthBytesWritten, "Interning must save bytes");
foreach (var pair in simpleTestData)
{
Assertion.Assert(pair.Item2 + extraString == secondReceiver.Issues[pair.Item1 + simpleTestData.Count * 2].Text,
"Data must match");
Assertion.Assert(pair.Item2 + extraString == firstReceiver.Issues[pair.Item1 + simpleTestData.Count * 3].Text,
"Data must match");
}
}