public void TestCallOrder3()
        {
            var       subject   = new OrderedInterface();
            const int servantId = 20;

            _server.CreateServant(servantId, (IOrderInterface)subject);
            var proxy = _client.CreateProxy <IOrderInterface>(servantId);

            List <int> sequence = Enumerable.Range(0, 1000).ToList();
            Action     fn       = () =>
            {
                while (true)
                {
                    int next;
                    lock (sequence)
                    {
                        if (sequence.Count == 0)
                        {
                            break;
                        }

                        next = sequence[0];
                        sequence.RemoveAt(0);
                    }

                    proxy.TypeOrdered(next);
                }
            };
            var tasks = new[]
            {
                Task.Factory.StartNew(fn),
                Task.Factory.StartNew(fn),
                Task.Factory.StartNew(fn),
                Task.Factory.StartNew(fn),
                Task.Factory.StartNew(fn),
                Task.Factory.StartNew(fn)
            };

            Task.WaitAll(tasks);

            subject.TypeOrderedSequence.Should().BeEquivalentTo(
                Enumerable.Range(0, 1000).ToList(),
                "Because the proxy calls are not necessarily ordered, its invocations aren't either."
                );
        }
        public void TestCallOrder1()
        {
            var       subject   = new OrderedInterface();
            const int servantId = 18;

            _server.CreateServant(servantId, (IOrderInterface)subject);
            var proxy = _client.CreateProxy <IOrderInterface>(servantId);

            for (int i = 0; i < 1000; ++i)
            {
                proxy.Unordered(i);
            }

            subject.UnorderedSequence.Should().Equal(
                Enumerable.Range(0, 1000).ToList(),
                "Because synchronous calls made from the same thread are guarantueed to be executed in order"
                );
        }
        public void TestCallOrder2()
        {
            var       subject   = new OrderedInterface();
            const int servantId = 19;

            _server.CreateServant(servantId, (IOrderInterface)subject);
            var proxy = _client.CreateProxy <IOrderInterface>(servantId);

            List <int> sequence = Enumerable.Range(0, 1000).ToList();
            Action     fn       = () =>
            {
                while (true)
                {
                    lock (sequence)
                    {
                        if (sequence.Count == 0)
                        {
                            break;
                        }

                        int next = sequence[0];
                        sequence.RemoveAt(0);
                        proxy.Unordered(next);
                    }
                }
            };
            var tasks = new[]
            {
                Task.Factory.StartNew(fn),
                Task.Factory.StartNew(fn)
            };

            Task.WaitAll(tasks);

            subject.UnorderedSequence.Should().Equal(
                Enumerable.Range(0, 1000).ToList(),
                "Because synchronous calls are executed in the same sequence they are given, independent of the calling thread"
                );
        }