コード例 #1
0
ファイル: Quota.cs プロジェクト: KFAFSP/Whetstone.Core
        public void WaitAsync_Exceeded_CanCedeTurn()
        {
            using (var cts = new CancellationTokenSource())
                using (var quota = new Quota(1L))
                {
                    var t1 = quota.WaitAsync();
                    var t2 = quota.WaitAsync(cts.Token);
                    var t3 = quota.WaitAsync();

                    Assert.That(quota.Balance, Is.EqualTo(-2L));

                    cts.Cancel();

                    Assert.That(quota.Balance, Is.EqualTo(-1L));

                    using (TaskAssert.Completed(t1))
                    {
                        TaskAssert.Cancelled(t2);
                        TaskAssert.DoesNotEnd(t3);
                    }

                    Assert.That(quota.Balance, Is.EqualTo(0L));

                    using (TaskAssert.Completed(t3)) { }

                    Assert.That(quota.Balance, Is.EqualTo(1L));
                }
        }
コード例 #2
0
ファイル: Quota.cs プロジェクト: KFAFSP/Whetstone.Core
        public void Dispose_FaultsAwaiters()
        {
            var quota = new Quota(1L);

            using (var cts = new CancellationTokenSource())
            {
                var awaiters = new[]
                {
                    quota.WaitAsync(),
                    quota.WaitAsync(cts.Token),
                    quota.WaitAsync(),
                    quota.WaitAsync()
                };

                cts.Cancel();
                quota.Dispose();

                using (TaskAssert.Completed(awaiters[0])) { }
                TaskAssert.Cancelled(awaiters[1]);

                foreach (var awaiter in awaiters.Skip(2))
                {
                    TaskAssert.Faulted <ObjectDisposedException>(awaiter);
                }
            }
        }
コード例 #3
0
ファイル: Quota.cs プロジェクト: KFAFSP/Whetstone.Core
        public void WaitAsync_Exceeded_WaitsForTurn()
        {
            using (var quota = new Quota(1L))
            {
                var t1 = quota.WaitAsync();
                var t2 = quota.WaitAsync();
                var t3 = quota.WaitAsync();

                Assert.That(quota.Balance, Is.EqualTo(-2L));

                using (TaskAssert.Completed(t1))
                {
                    TaskAssert.DoesNotEnd(t2);
                    TaskAssert.DoesNotEnd(t3);
                }

                Assert.That(quota.Balance, Is.EqualTo(-1L));

                using (TaskAssert.Completed(t2))
                {
                    TaskAssert.DoesNotEnd(t3);
                }

                Assert.That(quota.Balance, Is.EqualTo(0L));

                using (TaskAssert.Completed(t3)) { }

                Assert.That(quota.Balance, Is.EqualTo(1L));
            }
        }
コード例 #4
0
ファイル: Quota.cs プロジェクト: KFAFSP/Whetstone.Core
        public void WaitAsync_Disposed_ThrowsObjectDisposedException()
        {
            var quota = new Quota(1L);

            quota.Dispose();

            TaskAssert.Faulted <ObjectDisposedException>(quota.WaitAsync());
        }
コード例 #5
0
ファイル: Quota.cs プロジェクト: KFAFSP/Whetstone.Core
        public void WaitAsync_Available_ReturnsCompletedTask()
        {
            using (var quota = new Quota(3L))
            {
                var release = new IDisposable[3];

                for (var I = 0; I <= 2; ++I)
                {
                    Assert.That(quota.Active, Is.EqualTo(I));
                    release[I] = TaskAssert.Completed(quota.WaitAsync());
                }

                for (var I = 2; I >= 0; --I)
                {
                    release[I].Dispose();
                    Assert.That(quota.Active, Is.EqualTo(I));
                }
            }
        }