using System.Collections; using System.IO; using System.Reflection; using BumpCombat.Core; using BumpCombat.Progression; using BumpCombat.UI; using NUnit.Framework; using UnityEngine; using UnityEngine.InputSystem; using UnityEngine.InputSystem.LowLevel; using UnityEngine.SceneManagement; using UnityEngine.TestTools; using UnityEngine.UI; using UnityEngine.EventSystems; namespace BumpCombat.PlayModeTests { public sealed class MissionAchievementPanelPlayModeTests { private Keyboard virtualKeyboard; private bool virtualKeyboardInputActive; private InputSettings.BackgroundBehavior previousBackgroundBehavior; private InputSettings.EditorInputBehaviorInPlayMode previousEditorInputBehavior; private bool previousRunInBackground; [SetUp] public void SetUp() { ArtifactRewardController.GrantCatalogForTests = true; RunManager.ForceProductionModeForTests = true; Time.timeScale = 1f; } [TearDown] public void TearDown() { EndVirtualKeyboardInput(); ArtifactRewardController.GrantCatalogForTests = false; RunManager.ForceProductionModeForTests = false; Time.timeScale = 1f; } [UnityTest] public IEnumerator TabPanel_ShowsAllMissionsAndAchievementsAndClosesWithTabOrEscape() { yield return LoadSceneAndWait(); RunManager runManager = Object.FindAnyObjectByType(); MissionAchievementPanel panel = Object.FindAnyObjectByType(); RunMissionTracker tracker = Object.FindAnyObjectByType(); Assert.That(runManager, Is.Not.Null); Assert.That(panel, Is.Not.Null); Assert.That(tracker, Is.Not.Null); Assert.That(panel.IsOpen, Is.False); Assert.That(panel.PageCount, Is.EqualTo(2)); SetPrivateField(runManager, "selectedRunMode", RunMode.Production); SetPrivateField(runManager, "hasSelectedRunMode", true); SetPrivateField(runManager, "guardUnlocked", false); SetPrivateField(runManager, "artifactChargeUnlocked", false); Assert.That(panel.transform.Find("Mission List Hint").gameObject.activeSelf, Is.True); Text missionHint = panel.transform.Find("Mission List Hint") .GetComponent(); RectTransform missionHintRect = missionHint.rectTransform; Assert.That(missionHint.supportRichText, Is.True); Assert.That(missionHint.resizeTextForBestFit, Is.False); Assert.That(missionHint.alignment, Is.EqualTo(TextAnchor.MiddleLeft)); Assert.That(missionHint.text, Does.Contain("")); Assert.That(missionHint.text, Does.Contain("(미션 / 업적)")); Assert.That(missionHintRect.anchorMin, Is.EqualTo(new Vector2(0f, 1f))); Assert.That(missionHintRect.anchorMax, Is.EqualTo(new Vector2(0f, 1f))); Assert.That(missionHintRect.pivot, Is.EqualTo(new Vector2(0f, 1f))); Assert.That(missionHintRect.anchoredPosition, Is.EqualTo(new Vector2(24f, -250f))); Assert.That(missionHintRect.sizeDelta, Is.EqualTo(new Vector2(220f, 110f))); Keyboard keyboard = BeginVirtualKeyboardInput(); yield return PressAndRelease(keyboard, Key.Tab); Assert.That(panel.IsOpen, Is.True); Assert.That(runManager.IsSelectionOpen, Is.True); Assert.That(Time.timeScale, Is.Zero); Assert.That(panel.VisibleMissionRowCount, Is.EqualTo(6)); Assert.That(panel.transform.Find("Mission List Dim") .GetComponent().raycastTarget, Is.True); Transform firstRow = panel.transform.Find( "Mission and Achievement List/Mission List Page/Mission Row 1"); Text firstMission = firstRow.Find("Mission Title") .GetComponent(); Assert.That(firstMission.text, Is.EqualTo("첫 소탕")); Assert.That(firstRow.Find("Mission Condition").GetComponent().text, Does.Contain("일반 적 100마리 처치")); Assert.That(firstRow.Find("Mission Condition").GetComponent().text, Does.Contain("소환수 제외")); Assert.That(firstRow.Find("Mission Progress").GetComponent().text, Is.EqualTo("0/100")); Assert.That(firstRow.Find("Mission Reward").GetComponent().text, Is.EqualTo("+10 XP")); Assert.That(firstRow.Find("Mission Status Badge").gameObject.activeSelf, Is.False, "Uncompleted missions do not repeat a '진행 중' badge."); yield return PressAndRelease(keyboard, Key.PageDown); Assert.That(panel.CurrentPageIndex, Is.EqualTo(1)); Assert.That(panel.VisibleMissionRowCount, Is.EqualTo(5)); Assert.That(panel.transform.Find( "Mission and Achievement List/Mission Page Number").GetComponent().text, Is.EqualTo("2/2")); Transform finalRow = panel.transform.Find( "Mission and Achievement List/Mission List Page/Mission Row 5"); Text finalMission = finalRow.Find("Mission Title") .GetComponent(); Assert.That(finalMission.text, Does.Contain("파죽지세")); Assert.That(finalRow.Find("Mission Condition").GetComponent().text, Does.Contain("소환수 제외")); Transform lockedRow = panel.transform.Find( "Mission and Achievement List/Mission List Page/Mission Row 2"); Text lockedMission = lockedRow.Find("Mission Title") .GetComponent(); Assert.That(lockedMission.text, Does.Contain("정확한 방어")); Assert.That(lockedRow.Find("Mission Status Badge/Label") .GetComponent().text, Is.EqualTo("해금 대기")); Assert.That(lockedRow.Find("Mission Progress").GetComponent().text, Is.EqualTo("0/3")); Assert.That(lockedRow.Find("Mission Reward").GetComponent().text, Is.EqualTo("+15 XP")); yield return PressAndRelease(keyboard, Key.PageUp); Assert.That(panel.CurrentPageIndex, Is.Zero); panel.transform.Find("Mission and Achievement List/Next Mission Page") .GetComponent