using System; using System.Collections; using System.Linq; using Luneraria.Core; using Luneraria.View; using NUnit.Framework; using UnityEngine; using UnityEngine.TestTools; namespace Luneraria.UI.Tests { /// /// S2 in the real scene: the team actions (glyph lane, Ancient level) in the team panel, the /// recipe in the hero window's item shop, the glyph ring on an invulnerable tower and a /// levelled Ancient in combat. S2Bilder (explicit) captures them at 1920×1080; /// LUNE_EVIDENCE names the folder below docs/port/screenshots (default s2/spiel). /// public sealed class S2RulesViewsTests { static void Send(HudSession s, Command command) { CommandResult result = s.Match.Submit(HudSession.Human, command); Assert.IsTrue(result.Ok, command.Type + ": " + result.Message); s.Game.RebuildPreview(); s.Sync(); } static IEnumerator Plan(HudSession s) { Assert.IsTrue(s.Match.Extended, "extended match"); yield return s.Starter(); s.Leave(); Send(s, Command.HeroBuy("held_ringborke")); Send(s, Command.ItemBuy("basaltschild")); Send(s, Command.ItemBuy("rankenmantel")); // Public fixture: Blau's outer mid tower is already damaged. s.Match.BuildingHp["blau_mid_outer"] = s.Match.Map.BuildingDef("blau_mid_outer").MaxHp * 0.55; s.Sync(); } static GameObject Ring(string id) { return UnityEngine.Object.FindObjectsByType(FindObjectsInactive.Include, FindObjectsSortMode.None) .Where(t => t.name == "GlyphRing_" + id).Select(t => t.gameObject).FirstOrDefault(); } [UnityTest, Timeout(600000)] public IEnumerator S2Hud() { var s = new HudSession(); yield return s.Open(1920, 1080, seed: 4, startRound: 6, extraGold: 3000, extended: true); yield return Plan(s); Assert.IsTrue(HudSession.Visible(s.Hud.Team.CoreButton), "team actions are visible under the extended rules"); s.Click(s.Hud.Team.GlyphButtons["mid"]); yield return HudSession.Frames(2); s.Sync(); Assert.AreEqual("mid", s.Me.Draft.GlyphLane, "the mid button holds the glyph"); Assert.IsTrue(s.Hud.Team.GlyphButtons["mid"].On, "the button shows it"); int gold = s.Me.Draft.Gold; s.Click(s.Hud.Team.CoreButton); yield return HudSession.Frames(2); s.Sync(); Assert.AreEqual(1, s.Me.Draft.CoreInvest, "the Ancient button buys a level"); Assert.AreEqual(gold - 150, s.Me.Draft.Gold, "for 150 gold"); s.Hud.OpenHero(LuneHeroDetail.TabItems); yield return HudSession.Frames(2); s.Sync(); Assert.IsTrue(s.Hud.HeroDetail.ItemCards.ContainsKey("bollwerk"), "recipes appear in the shop"); Assert.AreEqual(LuneItemSlot.State.Available, s.Hud.HeroDetail.ItemCards["bollwerk"].Current, "Bollwerk can be forged"); Assert.AreEqual(LuneItemSlot.State.MissingParts, s.Hud.HeroDetail.ItemCards["glutsturm"].Current, "Glutsturm lacks its parts"); s.Click(s.Hud.HeroDetail.ItemCards["bollwerk"]); yield return HudSession.Frames(2); s.Sync(); CollectionAssert.AreEqual(new[] { "bollwerk" }, s.Me.Draft.Hero.Items, "the shop card forges Bollwerk"); s.Hud.CloseModal(); s.Game.Key(KeyCode.Space); yield return HudSession.Frames(2); Assert.AreEqual("mid", s.Match.Combat.GlyphLane[0], "Blau holds the glyph on mid"); LuneUnit core = s.Match.Combat.Buildings["blau_ancient"]; Assert.AreEqual(45.0, core.Def.Damage, 1e-9, "the Ancient shoots at level 1"); LuneUnit tower = s.Match.Combat.Buildings["blau_mid_outer"]; tower.Hp = tower.MaxHp * .45; s.Runner.Advance(.05); yield return HudSession.Frames(3); Assert.IsTrue(s.Match.Combat.Glyphed(tower), "the glyph fires below half health"); GameObject ring = Ring("blau_mid_outer"); Assert.IsTrue(ring != null && ring.activeSelf, "the tower shows the glyph ring"); s.Close(); } [UnityTest, Timeout(600000), Explicit("Bildwerkzeug: nur gezielt per -testFilter")] public IEnumerator S2Bilder() { string evidence = Environment.GetEnvironmentVariable("LUNE_EVIDENCE"); string folder = "docs/port/screenshots/" + (string.IsNullOrEmpty(evidence) ? "s2/spiel" : evidence) + "/"; var s = new HudSession(); yield return s.Open(1920, 1080, seed: 4, startRound: 6, extraGold: 3000, extended: true); yield return Plan(s); Send(s, Command.Glyph("mid")); Send(s, Command.CoreUpgrade()); yield return new WaitForSecondsRealtime(.5f); yield return s.Shot(folder + "01-team-aktionen.png"); s.Hover(s.Hud.Team.CoreButton); yield return new WaitForSecondsRealtime(.3f); yield return s.Shot(folder + "02-ancient-tooltip.png"); s.Leave(); s.Hud.OpenHero(LuneHeroDetail.TabItems); yield return new WaitForSecondsRealtime(.6f); s.Hover(s.Hud.HeroDetail.ItemCards["bollwerk"]); yield return new WaitForSecondsRealtime(.3f); yield return s.Shot(folder + "03-rezept-im-shop.png"); Send(s, Command.ItemBuy("bollwerk")); s.Leave(); yield return new WaitForSecondsRealtime(.4f); yield return s.Shot(folder + "04-bollwerk-geschmiedet.png"); s.Hud.CloseModal(); s.Game.Key(KeyCode.Space); yield return HudSession.Frames(2); LuneUnit tower = s.Match.Combat.Buildings["blau_mid_outer"]; tower.Hp = tower.MaxHp * .45; s.Runner.Advance(.05); yield return s.Fight(1.0); s.Driver.Paused = true; s.Rig.LookAt(tower.Position, 14f, true); yield return new WaitForSecondsRealtime(.5f); yield return s.Shot(folder + "05-glyphe-am-turm.png"); s.Close(); } } }