using System.Linq; using NUnit.Framework; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; using Vanguard.Api; using Vanguard.Api.Contracts; using Vanguard.App; using Vanguard.Auth; using Vanguard.Meta; using Vanguard.State; using Vanguard.UI; namespace Vanguard.Tests { public sealed class ClientSmokeTests { [Test] public void Client_Views_Build() { var config = new AppConfig(); config.Load(); var tokens = new TokenStore(); var api = new ApiClient(config, tokens); var player = new PlayerState(); var auth = new AuthService(api, tokens, player); var meta = new MetaService(api, player); var canvas = UiKit.CreateCanvas("Test Canvas"); var login = new LoginView(canvas.transform, config, auth, () => { }); login.Show("smoke"); var lobby = new MetaView( canvas.transform, auth, player, () => { }, () => { }, () => { }, () => { }, () => { }, () => { }); var onboarding = new OnboardingView( canvas.transform, auth, meta, () => { }, () => { }); var decks = new DeckBuilderView( canvas.transform, meta, auth, () => { }, _ => { }, _ => { }); var queue = new QueueView( canvas.transform, meta, auth, () => { }, _ => { }); var store = new StoreView( canvas.transform, meta, auth, player, () => { }); var history = new HistoryView( canvas.transform, meta, auth, () => { }); var battle = new BattleView( canvas.transform, meta, () => { }); Assert.IsNotNull(GameObject.Find("LoginScreen")); Assert.IsTrue(Exists("MetaScreen")); Assert.IsTrue(Exists("OnboardingScreen")); Assert.IsTrue(Exists("DeckBuilderScreen")); Assert.IsTrue(Exists("StoreScreen")); Assert.IsTrue(Exists("HistoryScreen")); Assert.IsTrue(Exists("ReplayScreen")); Assert.IsTrue(Exists("QueueScreen")); Assert.IsTrue(Exists("BattleScreen")); Assert.IsNotNull( Resources.Load("CardArt/td01_005"), "TD01 card art is not imported"); // После смены сцены старые views не должны реагировать на PlayerState. lobby.Dispose(); store.Dispose(); player.Apply(new MeResponse { UserName = "after-dispose", Gold = 10, Dust = 2, Tokens = 1, }); Cleanup(); } [Test] public void Localization_Translates_Static_And_Dynamic_Strings() { Loc.SetLanguage(UiLanguage.Ru); Assert.AreEqual("Коллекция", Loc.Translate("Коллекция")); Loc.SetLanguage(UiLanguage.En); Assert.AreEqual("Collection", Loc.Translate("Коллекция")); Assert.AreEqual("Grade: all", Loc.Translate("Ранг: все")); Assert.AreEqual("Cards in collection: 12", Loc.Translate("Карт в коллекции: 12")); Assert.AreEqual("Victory!", Loc.Translate("Победа!")); Assert.AreEqual("Sentinel: yes · Boost: no", Loc.Translate("Sentinel: да · Boost: нет")); Loc.SetLanguage(UiLanguage.Ru); var go = new GameObject("LocalizedLabel", typeof(RectTransform), typeof(Text)); var label = go.GetComponent(); var localized = go.AddComponent(); localized.Initialize("Коллекция"); Assert.AreEqual("Коллекция", label.text); Loc.SetLanguage(UiLanguage.En); Assert.AreEqual("Collection", label.text); label.text = "Магазин"; localized.ApplyNow(); Assert.AreEqual("Store", label.text); Loc.SetLanguage(UiLanguage.Ru); Assert.AreEqual("Магазин", label.text); Object.DestroyImmediate(go); } private static bool Exists(string name) => Resources.FindObjectsOfTypeAll().Any(go => go.name == name); private static void Cleanup() { var canvas = GameObject.Find("Test Canvas"); if (canvas != null) Object.DestroyImmediate(canvas); var eventSystem = Object.FindAnyObjectByType(); if (eventSystem != null) Object.DestroyImmediate(eventSystem.gameObject); } } }