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"); } }
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"); }