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