private void BindableRdCallListTest()

in rd-net/Test.RdFramework/AsyncRdTaskTest.cs [41:99]


  private void BindableRdCallListTest(TaskKind taskKind)
  {  
    ClientWire.AutoTransmitMode = true;
    ServerWire.AutoTransmitMode = true;
    
    var lifetime = LifetimeDefinition.Lifetime; 
    {
      var entity_id = 1;

      var callsite = new RdCall<Unit, RdList<int>>(Serializers.ReadVoid, Serializers.WriteVoid, RdList<int>.Read, RdList<int>.Write);
      var endpoint = new RdCall<Unit, RdList<int>>(Serializers.ReadVoid, Serializers.WriteVoid, RdList<int>.Read, RdList<int>.Write);

      var n = 1;

      var bindServerTask = lifetime.Start(ServerProtocol.Scheduler.AsTaskScheduler(), () =>
      {
        BindToServer(lifetime, endpoint, entity_id);
        endpoint.SetSync(_ =>
        {
          var list = new RdList<int>(Polymorphic<int>.Read, Polymorphic<int>.Write);
          for (var i = 0; i < n; i++)
            list.Add(i);

          return list;
        });
      });
      Assert.IsTrue(bindServerTask.Wait(Timeout(TimeSpan.FromSeconds(10))));

      var bindClientTask = lifetime.StartAsync(ClientProtocol.Scheduler.AsTaskScheduler(), async () =>
      {
        BindToClient(lifetime, callsite, entity_id);

        var list = taskKind switch
        {
          TaskKind.System => await callsite.Start(lifetime, Unit.Instance).AsTask(),
          TaskKind.Rd     => await callsite.Start(lifetime, Unit.Instance),
          _ => throw new ArgumentOutOfRangeException(nameof(taskKind), taskKind, null)
        };
        var count = 0;

        list.View(lifetime, (lt, index, value) =>
        {
          Assert.AreEqual(count++, value);
          Assert.AreEqual(index, value);
        });

        var stopwatch = LocalStopwatch.StartNew();
        while (count != n)
        {
          if (stopwatch.Elapsed > Timeout(TimeSpan.FromSeconds(10)))
            throw new TimeoutException();
          
          await Task.Yield();
        }
      });
      
      Assert.IsTrue(bindClientTask.Wait(Timeout(TimeSpan.FromSeconds(10))));
    }
  }