private IEnumerator yield_returnでawait的なことができるIterator(int maxDelay, TaskSchedulerHelper s)
		{
			var random = new Random();
			int n = random.Next(19, maxDelay);

			var tasks = Enumerable.Range(0, 5).Select(_ => Task.Run(Coroutines.NFrame(n))).ToArray();

			foreach (var t in tasks)
			{
				if (t.IsCompleted)
				{
					// 完了済みのタスクを yield return すると、1フレーム後にすぐ戻ってくるはず
					var countBefore = s.FrameCount;
					yield return t;
					var countAfter = s.FrameCount;

					Assert.AreEqual(countBefore + 1, countAfter);
				}
				else
				{
					yield return t;
					// yield return するとタスク完了待てる
					Assert.IsTrue(t.IsCompleted);
				}
			}

			foreach (var t in tasks)
			{
				Assert.IsTrue(t.IsCompleted);
			}
		}
        private IEnumerator yield_returnでawait的なことができるIterator(int maxDelay, TaskSchedulerHelper s)
        {
            var random = new Random();
            int n      = random.Next(19, maxDelay);

            var tasks = Enumerable.Range(0, 5).Select(_ => Task.Run(Coroutines.NFrame(n))).ToArray();

            foreach (var t in tasks)
            {
                if (t.IsCompleted)
                {
                    // 完了済みのタスクを yield return すると、1フレーム後にすぐ戻ってくるはず
                    var countBefore = s.FrameCount;
                    yield return(t);

                    var countAfter = s.FrameCount;

                    Assert.AreEqual(countBefore + 1, countAfter);
                }
                else
                {
                    yield return(t);

                    // yield return するとタスク完了待てる
                    Assert.IsTrue(t.IsCompleted);
                }
            }

            foreach (var t in tasks)
            {
                Assert.IsTrue(t.IsCompleted);
            }
        }
        public void yield_returnでawait的なことができる()
        {
            const int MaxDelay  = 1000;
            var       scheduler = new TaskSchedulerHelper(Task.DefaultScheduler);

            int i = 0;

            Task.Run(yield_returnでawait的なことができるIterator(MaxDelay, scheduler));

            for (i = 0; i < MaxDelay; i++)
            {
                scheduler.Update();
            }
        }
		public void yield_returnでawait的なことができる()
		{
			const int MaxDelay = 1000;
			var scheduler = new TaskSchedulerHelper(Task.DefaultScheduler);

			int i = 0;

			Task.Run(yield_returnでawait的なことができるIterator(MaxDelay, scheduler));

			for (i = 0; i < MaxDelay; i++)
			{
				scheduler.Update();
			}

		}
        public void タスク完了と同フレームでContinueWithが呼ばれる()
        {
            var random    = new Random();
            int n         = random.Next(10, 300);
            var scheduler = new TaskSchedulerHelper(Task.DefaultScheduler);
            int count     = 0;

            var t1 = Task.Run(() => Coroutines.NFrame(n))
                     .ContinueWith((_) => count = scheduler.FrameCount);

            for (var i = 0; i < 10000; ++i)
            {
                scheduler.Update();

                if (t1.IsCompleted)
                {
                    Assert.AreEqual(n, i);
                    break;
                }
            }

            Assert.AreEqual(n, count);
        }
		public void タスク完了と同フレームでContinueWithが呼ばれる()
		{
			var random = new Random();
			int n = random.Next(10, 300);
			var scheduler = new TaskSchedulerHelper(Task.DefaultScheduler);
			int count = 0;

			var t1 = Task.Run(() => Coroutines.NFrame(n))
				.ContinueWith( (_) => count = scheduler.FrameCount );
			
			for(var i = 0; i < 10000; ++i)
			{
				scheduler.Update();

				if (t1.IsCompleted)
				{
					Assert.AreEqual(n, i);
					break;
				}
			}

			Assert.AreEqual(n, count);
		}