using System.Collections.Generic;
using DanroJump.Gameplay;
using DanroJump.Vfx;
using NUnit.Framework;
using UnityEngine;
namespace DanroJump.Tests.EditMode
{
///
/// Тесты для службы визуальных эффектов IVfxService и GameVfxService.
///
public sealed class VfxServiceTests
{
private readonly List createdObjects = new();
[TearDown]
public void TearDown()
{
foreach (var obj in createdObjects)
{
if (obj != null)
{
Object.DestroyImmediate(obj);
}
}
createdObjects.Clear();
}
[Test]
public void VfxService_NullSafety_PlayerAndCollectibleDoNotThrowWhenVfxServiceIsNull()
{
// Тест Null-safety для игрока
var playerObj = new GameObject("TestPlayer");
createdObjects.Add(playerObj);
var body = playerObj.AddComponent();
body.gravityScale = 0f;
playerObj.AddComponent();
var playerVisual = new GameObject("Body");
playerVisual.transform.SetParent(playerObj.transform);
playerVisual.AddComponent();
var groundCheck = new GameObject("GroundCheck");
groundCheck.transform.SetParent(playerObj.transform);
groundCheck.transform.localPosition = new Vector3(0f, -0.5f, 0f);
var player = playerObj.AddComponent();
var camObj = new GameObject("TestCam");
createdObjects.Add(camObj);
var camera = camObj.AddComponent();
// Внедряем null в качестве IVfxService
player.Construct(camera, null, null);
// Проверяем, что вызовы Bounce и Die не выбрасывают NullReferenceException
Assert.DoesNotThrow(() => player.Bounce(10f));
Assert.DoesNotThrow(() => player.Kill());
// Тест Null-safety для CoinCollectible
var coinObj = new GameObject("TestCoin");
createdObjects.Add(coinObj);
coinObj.AddComponent();
var coin = coinObj.AddComponent();
coin.Construct(null, null, null);
// Имитируем сбор монеты
var method = typeof(CoinCollectible).GetMethod("OnCollected", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
Assert.That(method, Is.Not.Null);
Assert.DoesNotThrow(() => method.Invoke(coin, new object[] { player }));
}
[Test]
public void GameVfxService_SpawnMethods_CreateParticleSystemGameObjects()
{
var vfxService = new GameVfxService();
var spawnPosition = new Vector3(1f, 2f, 3f);
// 1. Тест SpawnJumpEffect
vfxService.SpawnJumpEffect(spawnPosition);
var jumpVfx = GameObject.Find("VFX_Jump");
Assert.That(jumpVfx, Is.Not.Null);
createdObjects.Add(jumpVfx);
Assert.That(jumpVfx.transform.position, Is.EqualTo(spawnPosition));
Assert.That(jumpVfx.GetComponent(), Is.Not.Null);
// 2. Тест SpawnCoinCollectedEffect
vfxService.SpawnCoinCollectedEffect(spawnPosition);
var coinVfx = GameObject.Find("VFX_CoinCollected");
Assert.That(coinVfx, Is.Not.Null);
createdObjects.Add(coinVfx);
Assert.That(coinVfx.transform.position, Is.EqualTo(spawnPosition));
Assert.That(coinVfx.GetComponent(), Is.Not.Null);
// 3. Тест SpawnPlayerDeathEffect
vfxService.SpawnPlayerDeathEffect(spawnPosition);
var deathVfx = GameObject.Find("VFX_PlayerDeath");
Assert.That(deathVfx, Is.Not.Null);
createdObjects.Add(deathVfx);
Assert.That(deathVfx.transform.position, Is.EqualTo(spawnPosition));
Assert.That(deathVfx.GetComponent(), Is.Not.Null);
// 4. Тест SpawnPrizeEffect
vfxService.SpawnPrizeEffect(spawnPosition);
var prizeVfx = GameObject.Find("VFX_PrizeWin");
Assert.That(prizeVfx, Is.Not.Null);
createdObjects.Add(prizeVfx);
Assert.That(prizeVfx.transform.position, Is.EqualTo(spawnPosition));
Assert.That(prizeVfx.GetComponent(), Is.Not.Null);
// 5. Тест SpawnComErrorEffect
vfxService.SpawnComErrorEffect(spawnPosition);
var comErrorVfx = GameObject.Find("VFX_ComError");
Assert.That(comErrorVfx, Is.Not.Null);
createdObjects.Add(comErrorVfx);
Assert.That(comErrorVfx.transform.position, Is.EqualTo(spawnPosition));
Assert.That(comErrorVfx.GetComponent(), Is.Not.Null);
}
}
}