public async Task CanOperateFridge()
        {
            using (TimeProvider.StartUsing(timeProvider))
            {
                fridge.StateString.Should().Be("Closed Idle Light off");
                await fridge.TemperatureChanges(40);

                fridge.StateString.Should().Be("Closed Cooling Light off");

                await fridge.TemperatureChanges(33);

                fridge.StateString.Should().Be("Closed Idle Light off");

                await fridge.DoorOpens();

                fridge.StateString.Should().Be("Open Idle Light on");

                await fridge.TemperatureChanges(40);

                fridge.StateString.Should().Be("Open Idle Light on");

                await fridge.DoorCloses();

                fridge.StateString.Should().Be("Closed Idle Light off");

                timeProvider.Add(minutes: 5);
                await fridge.Tick();

                fridge.StateString.Should().Be("Closed Cooling Light off");

                await fridge.DoorOpens();

                timeProvider.Add(minutes: 5);
                await fridge.Tick();

                await fridge.DoorCloses();

                fridge.StateString.Should().Be("Closed Idle Light off");

                await fridge.TemperatureChanges(40);

                fridge.StateString.Should().Be("Closed Cooling Light off");

                await fridge.DoorOpens();

                fridge.StateString.Should().Be("Open Idle Light on");

                timeProvider.Add(minutes: 60);
                await fridge.Tick();

                fridge.StateString.Should().Be("Open Defrosting Light on");

                timeProvider.Add(minutes: 5);
                await fridge.Tick();

                fridge.StateString.Should().Be("Open Cooling Light on");

                await fridge.DoorCloses();

                fridge.StateString.Should().Be("Closed Cooling Light off");

                timeProvider.Add(minutes: 60);
                await fridge.Tick();

                fridge.StateString.Should().Be("Closed Defrosting Light off");

                await fridge.DoorOpens();

                fridge.StateString.Should().Be("Open Defrosting Light on");

                await fridge.TemperatureChanges(40);

                fridge.StateString.Should().Be("Open Defrosting Light on");

                await fridge.DoorCloses();

                fridge.StateString.Should().Be("Closed Defrosting Light off");

                await fridge.TemperatureChanges(33);

                fridge.StateString.Should().Be("Closed Defrosting Light off");
            }
        }
Пример #2
0
        public async Task SerializationTest()
        {
            var d = new ManualTimeProvider();

            TimeProvider.Current = d; // better to inject it

            User u = new User("User");

            async Task After(int minutes)
            {
                d.Add(minutes: minutes);
                await u.Tick(d.Now);
            }

            d.Add(minutes: 5);

            await u.Created();

            await u.VerifiesEmail();

            await After(minutes : 10);

            await After(minutes : 10);

            await After(minutes : 5);

            await After(minutes : 10);

            await u.LogsIn();

            await After(minutes : 10);

            var nextTimedEventTime = u.VerifyingStateMachine.NextTimedEventAt;

            var xs = new XmlSerializer(typeof(User));

            string serialized = "";

            using (var ms = new MemoryStream())
            {
                xs.Serialize(ms, u);

                ms.Position = 0;

                var reader = new StreamReader(ms);
                serialized = reader.ReadToEnd();

                Trace.WriteLine(serialized);
            }

            // Now read it back in

            User u2 = (User)xs.Deserialize(new StringReader(serialized));

            Trace.WriteLine("Checking that the retrieved state is the same");
            Assert.AreEqual(VerifyingStatemachine.VerifiedEmail, u2.VState);
            Assert.AreEqual(VerifyingStatemachine.Verified, u2.VState.ParentState);
            Assert.AreEqual(nextTimedEventTime, u2.VerifyingStateMachine.NextTimedEventAt);

            // Check that the auto repeating event is still working
            int tc = u2.MessageCounterForTesting;

            await After(minutes : 5);

            tc += 5;
            Assert.AreEqual(tc, u2.MessageCounterForTesting, "No more emails should have been sent yet");

            await After(minutes : 5);

            tc += 5;
            Assert.AreEqual(tc, u2.MessageCounterForTesting, "No more emails should have been sent yet");

            await After(minutes : 20);

            tc += 20;
            Assert.AreEqual(tc, u2.MessageCounterForTesting, "Another email should have been sent");

            Trace.WriteLine("Checking that the retrieved state is the same");
            Assert.AreEqual(VerifyingStatemachine.VerifiedEmail, u2.VState);
            Assert.AreEqual(VerifyingStatemachine.Verified, u2.VState.ParentState);

            Trace.WriteLine("Checking that no more emails get sent");
            d.Add(minutes: 5);
            await u2.VerifiesSMS();

            await u2.Tick(d.Now);

            Assert.AreEqual(tc, u2.MessageCounterForTesting, "No more emails should have been sent");

            Trace.WriteLine("Checking that no more emails get sent");

            await After(minutes : 5);

            Assert.AreEqual(tc, u2.MessageCounterForTesting, "No more emails should have been sent");

            Assert.AreEqual(VerifyingStatemachine.Completed, u2.VState);
            Trace.WriteLine("Complete");
        }