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; ExitItem ], MenuState.items state) Assert.AreEqual([ "开始"; "读档"; "退出" ], MenuState.items state |> List.map MenuState.itemLabel) 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.openSettings 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) // ---- P15 开局职业选择页 ---- [] member _.OccupationSelectOffersFourKindsThenNoneAndDefaultsToNone () = let page = MenuState.openOccupationSelect (MenuState.create SimulationControl.initial false) Assert.AreEqual(OccupationSelect, page.Page) Assert.AreEqual( [ Some Occupation.Farmer; Some Occupation.Fisher; Some Occupation.Peddler; Some Occupation.Scholar; None ], MenuState.occupationOptions) Assert.AreEqual(None, MenuState.selectedOccupation page) Assert.AreEqual("暂不选择", MenuState.occupationLabel None) Assert.AreEqual("农夫", MenuState.occupationLabel (Some Occupation.Farmer)) Assert.AreEqual("书生", MenuState.occupationLabel (Some Occupation.Scholar)) [] member _.OccupationSelectConfirmEmitsChosenKindAndBackReturnsToMenu () = let page = MenuState.openOccupationSelect (MenuState.create SimulationControl.initial false) let _, defaultCommand = MenuState.update Confirm page Assert.AreEqual(StartNewGameWith None, defaultCommand) let picked = MenuState.move Up (MenuState.move Up page) Assert.AreEqual(Some Occupation.Peddler, MenuState.selectedOccupation picked) let _, command = MenuState.update Confirm picked Assert.AreEqual(StartNewGameWith (Some Occupation.Peddler), command) let back, backCommand = MenuState.update Back page Assert.AreEqual(MainMenu, back.Page) Assert.AreEqual(NoCommand, backCommand)