namespace LivingVillage.Desktop.Tests open Microsoft.VisualStudio.TestTools.UnitTesting open LivingVillage.Kernel open LivingVillage.Desktop [] type M6bMenuTests () = [] member _.MainMenuHasRequiredOrderAndStartsAtNewGame () = let state = MenuState.create SimulationControl.initial false Assert.AreEqual(MainMenu, state.Page) Assert.AreEqual( [ NewGameItem; LoadItem; SettingsItem; ControlsItem; ExitItem ], MenuState.items state) Assert.AreEqual(0, state.Selected) [] member _.SelectionWrapsAndConfirmProducesNewGameCommand () = let state = MenuState.create SimulationControl.initial false let wrapped = MenuState.move Up state let confirmed = MenuState.update Confirm wrapped |> snd Assert.AreEqual(ExitItem, MenuState.selectedItem wrapped) Assert.AreEqual(ExitGame, confirmed) let newGameState, newGameCommand = MenuState.update Confirm state Assert.AreEqual(MainMenu, newGameState.Page) Assert.AreEqual(StartNewGame, newGameCommand) [] member _.SettingsCanSelectEveryExistingSimulationMode () = let initial = MenuState.create SimulationControl.initial false let settings, _ = MenuState.update Confirm (MenuState.move Down (MenuState.move Down initial)) let oneX, oneXCommand = MenuState.update Confirm settings let twoX, twoXCommand = MenuState.update Confirm (MenuState.move Down settings) let fiveX, fiveXCommand = MenuState.update Confirm (MenuState.move Down (MenuState.move Down settings)) let paused, pausedCommand = MenuState.update Confirm (MenuState.move Down (MenuState.move Down (MenuState.move Down settings))) Assert.AreEqual(Settings, settings.Page) Assert.AreEqual(ApplySettings { Paused = false; Speed = OneX }, oneXCommand) Assert.AreEqual(ApplySettings { Paused = false; Speed = TwoX }, twoXCommand) Assert.AreEqual(ApplySettings { Paused = false; Speed = FiveX }, fiveXCommand) Assert.AreEqual(ApplySettings { Paused = true; Speed = OneX }, pausedCommand) Assert.AreEqual(Settings, oneX.Page) [] member _.EscapeReturnsToPreviousPageAndKeepsCurrentWorld () = let playing = MenuState.create SimulationControl.initial true |> MenuState.enterGame let settings = MenuState.openSettings playing let returned, command = MenuState.update Back settings let main = MenuState.openMain playing let continued, continueCommand = MenuState.update Confirm main Assert.AreEqual(Playing, returned.Page) Assert.AreEqual(NoCommand, command) Assert.IsTrue(returned.HasCurrentWorld) Assert.AreEqual(MainMenu, main.Page) Assert.AreEqual(ContinueItem, MenuState.selectedItem main) Assert.AreEqual(Playing, continued.Page) Assert.AreEqual(ContinueGame, continueCommand) [] member _.ControlsPageExposesCompleteKeyboardBindings () = let state = MenuState.openControls (MenuState.create SimulationControl.initial false) let keys = MenuState.controlRows |> List.map (fun row -> row.Keys) Assert.AreEqual(Controls, state.Page) Assert.AreEqual( [ "WASD"; "E"; "1-6"; "Q"; "TAB"; "C"; "L"; "P"; "F1/F2/F3"; "F6"; "F7"; "ESC"; "UP/DOWN"; "ENTER" ], keys) [] member _.LoadFailureIsAnExplicitPageAndBackReturnsToMenu () = let failed = MenuState.showLoadError "missing save" (MenuState.create SimulationControl.initial false) let returned, command = MenuState.update Back failed Assert.AreEqual(LoadError, failed.Page) Assert.AreEqual(Some "missing save", failed.Error) Assert.AreEqual(MainMenu, returned.Page) Assert.AreEqual(NoCommand, command)