public async Task TestMethod1()
        {
            DemoStatemachine demoStateMachine = new DemoStatemachine(DemoStatemachine.UnVerified);
            DemoContext      dc = new DemoContext {
                UserName = "******"
            };

            demoStateMachine.StateChanges += DemoStateMachine_StateChanges;

            // Normally you would be looking at the NextTimeEventAt field, and when it's after UtcNow you would call Tick()
            // For this test, simulate several days going by ...

            await demoStateMachine.Tick(DateTime.UtcNow.AddDays(1), dc);

            Trace.WriteLine("Next time to tick = " + demoStateMachine.NextTimedEventAt);

            await demoStateMachine.Tick(DateTime.UtcNow.AddDays(2), dc);

            Trace.WriteLine("Next time to tick = " + demoStateMachine.NextTimedEventAt);

            await demoStateMachine.Tick(DateTime.UtcNow.AddDays(3), dc);

            Trace.WriteLine("Next time to tick = " + demoStateMachine.NextTimedEventAt);

            await demoStateMachine.Tick(DateTime.UtcNow.AddDays(4), dc);

            // Finally the user verifies their email
            await demoStateMachine.VerifiesEmail(dc);

            await demoStateMachine.Tick(DateTime.UtcNow.AddDays(5), dc);

            await demoStateMachine.Tick(DateTime.UtcNow.AddDays(6), dc);
        }
        public async Task StateMachineDemoBehaves()
        {
            DemoStatemachine demoStateMachine = new DemoStatemachine(DemoStatemachine.UnVerified);
            DemoContext      dc = new DemoContext {
                UserName = "******"
            };

            demoStateMachine.StateChanges += DemoStateMachine_StateChanges;

            var time = new ManualTimeProvider(DateTime.UtcNow);

            await demoStateMachine.Tick(time.Now, dc);

            Trace.WriteLine("Next time to tick = " + demoStateMachine.NextTimedEventAt);

            time.AddTime(days: 1);
            await demoStateMachine.Tick(time.Now, dc);

            Trace.WriteLine("Next time to tick = " + demoStateMachine.NextTimedEventAt);

            time.AddTime(days: 1);
            await demoStateMachine.Tick(time.Now, dc);

            Trace.WriteLine("Next time to tick = " + demoStateMachine.NextTimedEventAt);

            time.AddTime(days: 1);
            // Finally the user verifies their email
            await demoStateMachine.VerifiesEmail(dc);

            time.AddTime(days: 1);
            await demoStateMachine.Tick(time.Now, dc);

            time.AddTime(days: 1);
            await demoStateMachine.Tick(time.Now, dc);
        }