GuildTycoon/Assets/_/Features/Tests/Editor/QuestManagerTests.cs

99 lines
4.6 KiB
C#

using System;
using System.Collections.Generic;
using NUnit.Framework;
using UnityEngine;
using Quests.Runtime;
using Core.Runtime;
namespace GuildTycoon.Tests.Editor
{
public class QuestManagerTests
{
private GameObject _gmGO;
private GameObject _qmGO;
private GameManager _gameManager;
private QuestManager _questManager;
[SetUp]
public void SetUp()
{
// Create and initialize GameManager (Awake will set up facts dictionary)
_gmGO = new GameObject("GameManager_Test");
_gameManager = _gmGO.AddComponent<GameManager>();
// Ensure profile and base facts are set
_gameManager.Profile = "UnitTestProfile";
_gameManager.Fact = new FactDictionnary();
GameManager.m_gameFacts = _gameManager.Fact; // ensure BaseMonobehaviour access works
// Pre-seed facts used by QuestManager
_gameManager.Fact.SetFact("accepted_quests", new List<QuestClass>(), BaseMonobehaviour.FactPersistence.Normal);
_gameManager.Fact.SetFact("events_quests_history", new Dictionary<Guid, List<QuestEventLog>>(), BaseMonobehaviour.FactPersistence.Normal);
// Create QuestManager
_qmGO = new GameObject("QuestManager_Test");
_questManager = _qmGO.AddComponent<QuestManager>();
// Initialize lists to avoid nulls and isolate from Start() DB usage
_questManager.ActiveQuests = new List<QuestClass>();
_questManager.CompletedQuests = new List<QuestClass>();
_questManager.DisponibleQuests = new List<QuestClass>();
}
[TearDown]
public void TearDown()
{
if (_qmGO != null) UnityEngine.Object.DestroyImmediate(_qmGO);
if (_gmGO != null) UnityEngine.Object.DestroyImmediate(_gmGO);
}
[Test]
public void CompletingQuest_MovesItFromActiveToCompleted_AndUpdatesFacts()
{
// Arrange: create a simple quest in progress
var questId = Guid.NewGuid();
var quest = new QuestClass(questId, "Test Quest", "Desc", "Obj", duration: 1, difficulty: QuestDifficultyEnum.Easy, reward: new List<Item.Runtime.ItemReward>(), minLevel: 1)
{
State = QuestStateEnum.InProgress,
StartSeconds = 0,
EndSeconds = 10,
AssignedAdventurersID = new List<Guid>()
};
_questManager.ActiveQuests.Add(quest);
// Seed facts with the same quest so QuestManager can update saved state
var accepted = new List<QuestClass> { new QuestClass(questId, quest.Name, quest.Description, quest.Objective, quest.Duration, quest.Difficulty, quest.Rewards, quest.MinLevel) { State = QuestStateEnum.InProgress } };
_gameManager.Fact.SetFact("accepted_quests", accepted, BaseMonobehaviour.FactPersistence.Normal);
QuestClass completedRaised = null;
Action<QuestClass> handler = q => completedRaised = q;
QuestManager.OnQuestCompleted += handler;
try
{
// Act: Directly complete the quest
_questManager.CompleteQuest(quest, quest.AssignedAdventurersID);
}
finally
{
QuestManager.OnQuestCompleted -= handler; // ensure unsubscribe even if assertion fails
}
// Assert: quest state and lists updated
Assert.AreEqual(QuestStateEnum.Completed, quest.State, "La quête devrait être marquée comme complétée.");
CollectionAssert.DoesNotContain(_questManager.ActiveQuests, quest, "La quête ne doit plus être dans la liste des quêtes actives.");
CollectionAssert.Contains(_questManager.CompletedQuests, quest, "La quête devrait apparaître dans la liste des quêtes complétées.");
// Facts: accepted_quests should reflect Completed state for the same ID
var saved = _gameManager.Fact.GetFact<List<QuestClass>>("accepted_quests");
var savedQuest = saved.Find(q => q.ID == questId);
Assert.IsNotNull(savedQuest, "La quête devrait être présente dans les faits 'accepted_quests'.");
Assert.AreEqual(QuestStateEnum.Completed, savedQuest.State, "L'état sauvegardé de la quête devrait être 'Completed'.");
// Event notification raised
Assert.IsNotNull(completedRaised, "Un événement OnQuestCompleted devrait être déclenché.");
Assert.AreEqual(questId, completedRaised.ID, "L'événement devrait concerner la même quête.");
}
}
}