static public bool CanTransition(CookPasta from, CookPasta to) { switch (from) { case CookPasta.BoilWater: return(to == CookPasta.AddPasta || to == CookPasta.AddSalt); case CookPasta.AddPasta: return(to == CookPasta.AddSalt || to == CookPasta.Stir); case CookPasta.AddSalt: return(to == CookPasta.AddPasta); case CookPasta.Stir: return(to == CookPasta.Strain); case CookPasta.Strain: return(to == CookPasta.Eat); case CookPasta.Eat: return(false); default: throw CodeContractsHelpers.ThrowIfReached <WrongWayOfDoingPasta>("missing case"); } }
static public void EatAfterStir(CookPasta unknownStep) { var init = CookPasta.Stir; var next = CanTransition(init, unknownStep); Contract.Assert(next); // note in this example we ask for "next" instead of "not next" as in the example above }
static public void StrainIsFinal(CookPasta someOtherState) { var next = CanTransition(CookPasta.Strain, someOtherState); Contract.Assert(!next, "We cannot prove it, as it is false"); }
static public void EatingIsFinal(CookPasta someOtherState) { var next = CanTransition(CookPasta.Eat, someOtherState); Contract.Assert(!next, "Once you eat your pasta, nothing more left to do"); }
static public void BoilWaterIsInitial(CookPasta someState) { var next = CanTransition(someState, CookPasta.BoilWater); Contract.Assert(!next, "there is no way to transition to boiling water"); }
static public bool IsTerminal(CookPasta state) { return(state == CookPasta.Eat); }
static public bool IsInitial(CookPasta state) { return(state == CookPasta.BoilWater); }