public void ItWillNotStartImmediately()
        {
            var run = false;

            using (var sch = new CompactorScheduler())
            {
                sch.AddCompactAction(token =>
                {
                    run = true;
                    return(false);
                });
            }
            Assert.False(run, "Should not Start imidietly");
        }
        public void ItWillRunFirstTimeAfterWaitTime()
        {
            var e = new AutoResetEvent(false);

            using (var s = new CompactorScheduler())
            {
                s.AddCompactAction(token =>
                {
                    e.Set();
                    return(false);
                });
                s.WaitTime = TimeSpan.FromMilliseconds(1);
                s.AdviceRunning(true);
                Assert.True(e.WaitOne(1000));
            }
        }
        public void MissingOpeningAdviceDoesNotBlockScheduling()
        {
            var e = new AutoResetEvent(false);

            using (var s = new CompactorScheduler())
            {
                s.AddCompactAction(token =>
                {
                    e.Set();
                    return(false);
                });
                s.WaitTime = TimeSpan.FromMilliseconds(50);
                s.AdviceRunning(false);
                Assert.True(e.WaitOne(100));
            }
        }
        public void DbOpenedAfterFirstCompactingIsCorrectlyPlanned()
        {
            var e = new AutoResetEvent(false);

            using (var s = new CompactorScheduler())
            {
                s.AddCompactAction(token =>
                {
                    e.Set();
                    return(false);
                });
                s.WaitTime = TimeSpan.FromMilliseconds(50);
                s.AdviceRunning(true);
                Assert.True(e.WaitOne(100));
                s.AdviceRunning(true);
                Assert.True(e.WaitOne(100));
            }
        }
        public void AdvideRunningWorksWellForSharedInstance()
        {
            var e = new AutoResetEvent(false);

            using (var s = new CompactorScheduler())
            {
                s.AddCompactAction(token =>
                {
                    e.Set();
                    return(false);
                });
                s.WaitTime = TimeSpan.FromMilliseconds(150);
                s.AdviceRunning(true);
                s.AdviceRunning(true);
                s.AdviceRunning(false);
                Assert.False(e.WaitOne(100));
                Assert.True(e.WaitOne(100));
                s.AdviceRunning(true);
                Assert.False(e.WaitOne(50));
                s.AdviceRunning(false);
                Assert.True(e.WaitOne(50));
            }
        }
        public void ItShouldRunAgainSoonIfCompactionSuccessfull()
        {
            var e     = new AutoResetEvent(false);
            var first = true;

            using (var s = new CompactorScheduler())
            {
                s.AddCompactAction(token =>
                {
                    if (first)
                    {
                        first = false;
                        return(true);
                    }
                    e.Set();
                    return(false);
                });
                s.WaitTime = TimeSpan.FromMilliseconds(1);
                s.AdviceRunning(true);
                Assert.True(e.WaitOne(1000));
                Assert.False(first);
            }
        }
        public void ItShouldCancelRunningCompaction()
        {
            var e = new AutoResetEvent(false);

            using (var s = new CompactorScheduler())
            {
                s.AddCompactAction(token =>
                {
                    e.Set();
                    while (true)
                    {
                        if (token.IsCancellationRequested)
                        {
                            e.Set();
                            token.ThrowIfCancellationRequested();
                        }
                    }
                });
                s.WaitTime = TimeSpan.FromMilliseconds(1);
                s.AdviceRunning(true);
                Assert.True(e.WaitOne(1000));
            }
            Assert.True(e.WaitOne(1000));
        }