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