212 lines
7.5 KiB
C#
212 lines
7.5 KiB
C#
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using NUnit.Framework;
|
|
using UnityEngine;
|
|
using Vanguard.Board3D;
|
|
using Vanguard.Shared.Protocol;
|
|
|
|
namespace Vanguard.Tests
|
|
{
|
|
public sealed class GameBoard3DTests
|
|
{
|
|
[Test]
|
|
public void Board_Renders_Field_Hand_Guardian_Damage_And_Soul()
|
|
{
|
|
var config = PlaymatLayoutConfig.CreateDefault();
|
|
var board = GameBoard3D.Create(null, config);
|
|
try
|
|
{
|
|
board.SetVisible(true);
|
|
board.Render(BuildView(you: 0), new BoardRenderState());
|
|
|
|
var cards = ActiveCards();
|
|
Assert.GreaterOrEqual(cards.Count, 9);
|
|
|
|
Assert.IsTrue(cards.Any(card =>
|
|
card.Ref.Zone == BoardZone.RearGuard
|
|
&& card.Ref.Player == 0
|
|
&& card.Ref.Slot == 3));
|
|
Assert.IsTrue(cards.Any(card =>
|
|
card.Ref.Zone == BoardZone.Guardian
|
|
&& card.Ref.InstanceId == 7));
|
|
Assert.IsTrue(cards.Any(card =>
|
|
card.Ref.Zone == BoardZone.Hand
|
|
&& card.Ref.Player == 0));
|
|
Assert.IsTrue(cards.Any(card =>
|
|
card.Ref.Zone == BoardZone.Damage
|
|
&& card.Ref.Player == 0));
|
|
|
|
var rested = cards.Single(card =>
|
|
card.Ref.Zone == BoardZone.RearGuard
|
|
&& card.Ref.Player == 0
|
|
&& card.Ref.Slot == 3);
|
|
Assert.IsTrue(rested.IsRested);
|
|
Assert.AreEqual(90f, Mathf.Abs(Mathf.DeltaAngle(rested.TargetYaw, 0f)), 0.1f);
|
|
|
|
var hiddenDamage = cards.Single(card =>
|
|
card.Ref.Zone == BoardZone.Damage
|
|
&& card.Ref.Player == 0
|
|
&& card.Ref.Index == 1);
|
|
Assert.IsFalse(hiddenDamage.IsFaceUp);
|
|
Assert.IsTrue(hiddenDamage.IsRested);
|
|
|
|
var visibleDamage = cards.Single(card =>
|
|
card.Ref.Zone == BoardZone.Damage
|
|
&& card.Ref.Player == 0
|
|
&& card.Ref.Index == 0);
|
|
Assert.IsTrue(visibleDamage.IsFaceUp);
|
|
Assert.AreEqual(
|
|
-90f,
|
|
Mathf.DeltaAngle(0f, visibleDamage.TargetYaw),
|
|
0.1f,
|
|
"Damage cards must rest counter-clockwise");
|
|
}
|
|
finally
|
|
{
|
|
Object.DestroyImmediate(board.gameObject);
|
|
}
|
|
}
|
|
|
|
[Test]
|
|
public void Pool_Reuses_Cards_Between_Snapshots()
|
|
{
|
|
var config = PlaymatLayoutConfig.CreateDefault();
|
|
var board = GameBoard3D.Create(null, config);
|
|
try
|
|
{
|
|
board.SetVisible(true);
|
|
var view = BuildView(you: 0);
|
|
board.Render(view, new BoardRenderState());
|
|
var count = ActiveCards().Count;
|
|
|
|
board.Render(view, new BoardRenderState());
|
|
Assert.AreEqual(count, ActiveCards().Count);
|
|
}
|
|
finally
|
|
{
|
|
Object.DestroyImmediate(board.gameObject);
|
|
}
|
|
}
|
|
|
|
[Test]
|
|
public void Local_Seat_Is_Always_Bottom_Of_The_Board()
|
|
{
|
|
var config = PlaymatLayoutConfig.CreateDefault();
|
|
var board = GameBoard3D.Create(null, config);
|
|
try
|
|
{
|
|
board.SetVisible(true);
|
|
board.Render(BuildView(you: 1), new BoardRenderState());
|
|
|
|
var vanguard = ActiveCards().Single(card =>
|
|
card.Ref.Zone == BoardZone.Vanguard
|
|
&& card.Ref.Player == 1);
|
|
Assert.Less(vanguard.TargetPosition.z, 0f);
|
|
|
|
var opponent = ActiveCards().Single(card =>
|
|
card.Ref.Zone == BoardZone.Vanguard
|
|
&& card.Ref.Player == 0);
|
|
Assert.Greater(opponent.TargetPosition.z, 0f);
|
|
}
|
|
finally
|
|
{
|
|
Object.DestroyImmediate(board.gameObject);
|
|
}
|
|
}
|
|
|
|
[Test]
|
|
public void Highlight_And_Selection_State_Is_Applied_To_Cards()
|
|
{
|
|
var config = PlaymatLayoutConfig.CreateDefault();
|
|
var board = GameBoard3D.Create(null, config);
|
|
try
|
|
{
|
|
board.SetVisible(true);
|
|
var state = new BoardRenderState();
|
|
state.Highlights.Add(new BoardSlotKey(0, 3));
|
|
state.SelectedHandInstanceIds.Add(12);
|
|
board.Render(BuildView(you: 0), state);
|
|
|
|
var rested = ActiveCards().Single(card =>
|
|
card.Ref.Zone == BoardZone.RearGuard
|
|
&& card.Ref.Player == 0
|
|
&& card.Ref.Slot == 3);
|
|
Assert.IsTrue(rested.transform.Find("Highlight").gameObject.activeSelf);
|
|
}
|
|
finally
|
|
{
|
|
Object.DestroyImmediate(board.gameObject);
|
|
}
|
|
}
|
|
|
|
private static List<Card3D> ActiveCards() =>
|
|
Resources.FindObjectsOfTypeAll<Card3D>()
|
|
.Where(card => card.gameObject.activeInHierarchy)
|
|
.ToList();
|
|
|
|
private static MatchView BuildView(int you)
|
|
{
|
|
CardView Card(string id, int instance, bool rested = false, bool faceUp = true) =>
|
|
new CardView
|
|
{
|
|
PrintingId = id,
|
|
InstanceId = instance,
|
|
Rested = rested,
|
|
FaceUp = faceUp,
|
|
Power = 8000,
|
|
BasePower = 8000,
|
|
Critical = 1,
|
|
BaseCritical = 1,
|
|
};
|
|
|
|
var self = new PlayerView
|
|
{
|
|
Index = you,
|
|
Name = "Self",
|
|
Vanguard = Card("BT01/001EN", 1),
|
|
RearGuards = new CardView[5],
|
|
Hand = new List<CardView>
|
|
{
|
|
Card("BT01/002EN", 11),
|
|
Card("BT01/003EN", 12),
|
|
},
|
|
Guardian = new List<CardView> { Card("BT01/004EN", 7) },
|
|
Soul = new List<CardView> { Card("BT01/005EN", 8) },
|
|
FaceUpDamage = new List<CardView> { Card("BT01/006EN", 9) },
|
|
FaceDownDamage = 2,
|
|
DeckCount = 40,
|
|
Drop = new List<CardView>(),
|
|
};
|
|
self.RearGuards[3] = Card("BT01/007EN", 5, rested: true);
|
|
|
|
var otherIndex = 1 - you;
|
|
var opponent = new PlayerView
|
|
{
|
|
Index = otherIndex,
|
|
Name = "Opponent",
|
|
Vanguard = Card("BT01/010EN", 21),
|
|
RearGuards = new CardView[5],
|
|
Hand = new List<CardView>(),
|
|
Guardian = new List<CardView>(),
|
|
Soul = new List<CardView>(),
|
|
FaceUpDamage = new List<CardView>(),
|
|
FaceDownDamage = 0,
|
|
DeckCount = 40,
|
|
Drop = new List<CardView>(),
|
|
};
|
|
opponent.RearGuards[4] = Card("BT01/011EN", 22, rested: true);
|
|
|
|
return new MatchView
|
|
{
|
|
MatchId = "board-test",
|
|
You = you,
|
|
ActivePlayer = you,
|
|
Phase = GamePhase.Main,
|
|
Players = new List<PlayerView> { self, opponent },
|
|
Clock = new ClockView(),
|
|
LegalIntents = new List<IntentPayload>(),
|
|
};
|
|
}
|
|
}
|
|
}
|