151 lines
8.2 KiB
C#
151 lines
8.2 KiB
C#
using System.Collections;
|
|
using NUnit.Framework;
|
|
using TKS.OutGame;
|
|
using UnityEngine;
|
|
using UnityEngine.SceneManagement;
|
|
using UnityEngine.TestTools;
|
|
|
|
namespace TKS.Tests
|
|
{
|
|
/// <summary>
|
|
/// 보물 메뉴 디자인 개선(PD 2026-11-13) — ① 보유 중·세트 = 보물고 배경 + 콜렉션 진열대 칸(칸 틀 · 선반) ② 상자 = 금고 배경 + 받침대 위 상자(표 chest_spot 자리 · 크기)
|
|
/// ③ 상자 5종 = 새 납품 그림(Assets/UI/Samguk/chest · 같은 256² 규격) ④ 열기는 그대로 동작. 기대 값은 표 Resources/UI/treasure_scene.csv 에서 읽음(C45).
|
|
/// </summary>
|
|
public class TreasureSceneTests
|
|
{
|
|
OutGameRoot og;
|
|
|
|
IEnumerator Boot()
|
|
{
|
|
WorldProgress.Reset();
|
|
SaveStore.UseMemory(true);
|
|
SceneManager.LoadScene("Battle");
|
|
yield return null;
|
|
yield return null;
|
|
og = OutGameRoot.Instance;
|
|
Assert.IsNotNull(og);
|
|
og.ShowLobby();
|
|
TreasureScene.Reload();
|
|
}
|
|
|
|
[UnityTest]
|
|
public IEnumerator Vault_Shelves_Chest_OnPedestal()
|
|
{
|
|
yield return Boot();
|
|
var s = og.Session;
|
|
og.OnTab(1);
|
|
var tr = og.Treasures;
|
|
Assert.AreEqual(tr, og.Current);
|
|
|
|
tr.SetPage(0);
|
|
yield return null;
|
|
Assert.AreEqual("vault", tr.ShownScene, "보유 중 = 보물고 배경");
|
|
Assert.IsTrue(tr.ShelfCells, "보유 중 = 진열대 칸");
|
|
Assert.AreEqual(s.Db.Treasures.items.Count, tr.GridCount);
|
|
Assert.AreEqual(tr.GridCount, tr.NameTags, "유물마다 목패 이름표(3차 · 리본 폐기)");
|
|
|
|
// 등급 드롭다운(PD 2026-11-13 3차 「등급 칩 줄 → 드롭다운 · 전체 ~ 등급별」) — 펼침 · 등급 고름 = 그 등급만 · 전체 = 다시 전부
|
|
Assert.AreEqual("", tr.GradeFilter, "처음 = 전체");
|
|
tr.ToggleGradeFilter();
|
|
Assert.IsTrue(tr.FilterOpen, "버튼 = 목록 펼침");
|
|
var g0 = s.Db.Economy.TreasureGrades[0].Key;
|
|
int gradeN = 0;
|
|
foreach (var it in s.Db.Treasures.items)
|
|
if (it.grade == g0) gradeN++;
|
|
tr.SetGradeFilter(g0);
|
|
yield return null;
|
|
Assert.IsFalse(tr.FilterOpen, "고르면 접힘");
|
|
Assert.AreEqual(gradeN, tr.GridCount, g0 + " 등급만");
|
|
tr.SetGradeFilter("");
|
|
yield return null;
|
|
Assert.AreEqual(s.Db.Treasures.items.Count, tr.GridCount, "전체 = 다시 전부");
|
|
|
|
tr.SetPage(1);
|
|
yield return null;
|
|
Assert.AreEqual("vault", tr.ShownScene, "세트 = 같은 보물고 배경");
|
|
Assert.IsTrue(tr.ShelfCells, "세트 = 진열대 칸");
|
|
Assert.AreEqual(tr.SetCount, tr.Plaques, "세트 제목 = 명패(3차)");
|
|
// 명패 ↔ 「보유 n/m」 겹침 없음(PD 「충분한 공간」) — 같은 묶음 안 사각형 비교
|
|
var blk = GameObject.Find("Set_" + s.Db.TreasureSets.SetIds[0]).transform;
|
|
var pr = (RectTransform)blk.Find("Plaque");
|
|
var orr = (RectTransform)blk.Find("Owned");
|
|
Assert.IsNotNull(pr, "명패");
|
|
Assert.IsNotNull(orr, "보유 글자");
|
|
var pc = new Vector3[4];
|
|
var oc = new Vector3[4];
|
|
pr.GetWorldCorners(pc);
|
|
orr.GetWorldCorners(oc);
|
|
Assert.Less(pc[2].x, oc[0].x, "명패 오른쪽 끝 < 보유 칸 왼쪽 끝");
|
|
// 긴 이름 = 목패 폭(칸 폭) 안에서 글자 줄임(PD 「텍스트가 길어지면 UI 침범」 · QA r4 U3) — 세트 칸 폭(표 vault_setgrid)
|
|
var tagRow = DomesticScene.First(TreasureScene.Scene("vault"), "tag");
|
|
var setg = DomesticScene.First(TreasureScene.Scene("vault"), "setgrid");
|
|
var longT = TreasureScreen.NameTag(blk, "아주긴유물이름표", Color.white, Color.white, tagRow, UISkin.Icon(tagRow.sprite), setg.w, new Vector2(0.5f, 0f), new Vector2(0.5f, 0f), Vector2.zero);
|
|
var longR = (RectTransform)longT.transform.parent;
|
|
Assert.LessOrEqual(longR.sizeDelta.x, setg.w + 0.01f, "목패 폭 ≤ 칸 폭");
|
|
Assert.Less(longT.fontSize, Mathf.RoundToInt(tagRow.scale), "글자 줄임");
|
|
Assert.LessOrEqual(longT.preferredWidth, setg.w - tagRow.x * 2f + 1f, "줄인 글자가 목패 안");
|
|
Object.Destroy(longR.gameObject);
|
|
|
|
Counts.Set(s.Save.inv.chests, s.Db.Economy.StageChest, 2);
|
|
tr.SetPage(2);
|
|
tr.SelectChest(s.Db.Economy.StageChest);
|
|
yield return null;
|
|
Assert.AreEqual("chest", tr.ShownScene, "상자 = 금고 배경");
|
|
Assert.IsTrue(tr.ChestOnPedestal, "받침대 배치");
|
|
var ic = tr.PedestalChest;
|
|
Assert.IsNotNull(ic, "받침대 위 상자");
|
|
Assert.AreSame(UISkin.Icon("chest_" + s.Db.Economy.StageChest), ic.sprite, "고른 상자 그림");
|
|
var spot = DomesticScene.First(TreasureScene.Scene("chest"), "spot");
|
|
Assert.IsNotNull(spot, "표 chest_spot");
|
|
Assert.AreEqual(spot.w, ic.rectTransform.sizeDelta.x, 0.5f, "상자 크기 = 표");
|
|
// 화면에서 상자 가운데가 금고 그림의 방석 자리(표 좌표)에 있음 — 그림 기준 정규화 위치로 비교
|
|
var view = DomesticScene.First(TreasureScene.Scene("chest"), "view");
|
|
var art = GameObject.Find("Scene_chest").transform.Find("Art") as RectTransform;
|
|
Assert.IsNotNull(art, "금고 그림");
|
|
var c = new Vector3[4];
|
|
art.GetWorldCorners(c); // 0 = 왼아래 · 2 = 오른위
|
|
var want = new Vector3(Mathf.Lerp(c[0].x, c[2].x, spot.x / view.w), Mathf.Lerp(c[2].y, c[0].y, spot.y / view.h), 0f);
|
|
var got = ic.rectTransform.position;
|
|
float px = (c[2].x - c[0].x) / view.w; // 그림 1 px 의 월드 길이
|
|
Assert.Less(Mathf.Abs(got.x - want.x) / px, 2f, "상자 x = 방석 가운데(그림 px 오차)");
|
|
Assert.Less(Mathf.Abs(got.y - want.y) / px, 2f, "상자 y = 표 자리(그림 px 오차)");
|
|
|
|
// 상자 5종 = 새 납품 그림(같은 규격)
|
|
foreach (var ch in s.Db.Chests.chests)
|
|
{
|
|
Assert.IsTrue(UiKit.HasFinalIcon("chest_" + ch.id), ch.id + ": 납품 그림");
|
|
var sp = UISkin.Icon("chest_" + ch.id);
|
|
Assert.AreEqual(256f, sp.rect.width, 0.5f, ch.id + ": 256²");
|
|
Assert.AreEqual(256f, sp.rect.height, 0.5f, ch.id + ": 256²");
|
|
}
|
|
|
|
// 열기(받침대 위 상자가 흔들린 뒤 결과 · QA r1 U1) — 흔드는 동안은 아직 결과 없음 · 0.4 초 뒤 결과 · 상자 자세 복귀
|
|
int before = TreasureRules.ChestCount(s.Save, s.Db.Economy.StageChest);
|
|
tr.OpenAnimated(s.Db.Economy.StageChest);
|
|
yield return null;
|
|
yield return null;
|
|
var rt = tr.PedestalChest.rectTransform;
|
|
Assert.AreEqual(before, TreasureRules.ChestCount(s.Save, s.Db.Economy.StageChest), "흔드는 중 = 아직 안 엶");
|
|
Assert.Greater(Mathf.Abs(rt.localEulerAngles.z) + Mathf.Abs(rt.localScale.x - 1f), 0.0001f, "상자가 흔들림");
|
|
yield return new WaitForSecondsRealtime(0.6f);
|
|
Assert.AreEqual(before - 1, TreasureRules.ChestCount(s.Save, s.Db.Economy.StageChest), "흔든 뒤 열림");
|
|
Assert.IsNotNull(tr.LastOpen, "결과");
|
|
og.CloseModal();
|
|
|
|
// 유물 정보 = 선반 진열 무대(PD 2026-11-13 2차) — 얻은 유물을 열면 무대 위 방석에 그 유물 아이콘
|
|
if (tr.LastOpen.treasureId != null)
|
|
{
|
|
tr.SetPage(0);
|
|
yield return null;
|
|
tr.Detail(tr.LastOpen.treasureId);
|
|
yield return null;
|
|
Assert.IsTrue(og.ModalVisible, "정보 팝업");
|
|
Assert.IsNotNull(tr.DetailRelic, "무대 위 유물");
|
|
var stage = DomesticScene.First(TreasureScene.Scene("detail"), "stage");
|
|
Assert.AreEqual(stage.min, tr.DetailRelic.rectTransform.sizeDelta.x, 0.5f, "유물 크기 = 표");
|
|
og.CloseModal();
|
|
}
|
|
}
|
|
}
|
|
}
|