private void DoTest()

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");
      }
    }