Files
EnglewoodLAB/Assets/Sample/Data/DataArrayTests.cs

179 lines
8.0 KiB
C#

#nullable enable
using System;
using System.Linq;
using UnityEngine;
using UVC.Data.Core;
namespace UVC.Sample.Data
{
/// <summary>
/// DataArray 기능 샘플 코드입니다.
/// DataSampleRunner Inspector에서 실행하거나 Play 버튼으로 확인합니다.
/// </summary>
public class DataArrayTests
{
private DataArray _dataArray = new DataArray();
private DataObject _item1 = new DataObject();
private DataObject _item2 = new DataObject();
private DataObject _item3 = new DataObject();
/// <summary>
/// 모든 샘플을 순차 실행합니다.
/// </summary>
public void RunAll()
{
Debug.Log("===== DataArray 샘플 시작 =====");
SetUp();
Run(nameof(Add_AddsItemToList), Add_AddsItemToList);
SetUp();
Run(nameof(Remove_RemovesItemFromList), Remove_RemovesItemFromList);
SetUp();
Run(nameof(Clear_RemovesAllItems), Clear_RemovesAllItems);
SetUp();
Run(nameof(UpdateDifferent_TracksAddsDeletesAndModifies), UpdateDifferent_TracksAddsDeletesAndModifies);
SetUp();
Run(nameof(UpdateDifferent_WithFullTracking_TracksRemovedItems), UpdateDifferent_WithFullTracking_TracksRemovedItems);
SetUp();
Run(nameof(ClearTrackedChanges_ResetsAllChangeLists), ClearTrackedChanges_ResetsAllChangeLists);
Debug.Log("===== DataArray 샘플 완료 =====");
}
private void SetUp()
{
_item1 = new DataObject { { "Id", "1" }, { "value", "A" } };
_item2 = new DataObject { { "Id", "2" }, { "value", "B" } };
_item3 = new DataObject { { "Id", "3" }, { "value", "C" } };
_dataArray = new DataArray(new[] { _item1, _item2 });
}
private void Run(string name, Action action)
{
try
{
action();
Debug.Log($"[OK] {name}");
}
catch (Exception ex)
{
Debug.LogError($"[FAIL] {name}\n{ex.Message}");
}
}
private static void Check(bool condition, string message)
{
if (!condition) throw new Exception($"검증 실패: {message}");
}
/// <summary>
/// Add: 아이템을 리스트에 추가합니다.
/// </summary>
public void Add_AddsItemToList()
{
_dataArray.Add(_item3);
Check(_dataArray.Count == 3, "DataArray의 전체 개수는 3이어야 합니다.");
Check(_dataArray.ToList().Contains(_item3), "_item3이 DataArray에 포함되어야 합니다.");
Check(_dataArray.AddedItems.Count == 0, "Add 메서드는 AddedItems를 직접 채우지 않아야 합니다.");
}
/// <summary>
/// Remove: 아이템을 리스트에서 제거합니다.
/// </summary>
public void Remove_RemovesItemFromList()
{
bool result = _dataArray.Remove(_item1);
Check(result, "항목 제거는 성공해야 합니다.");
Check(_dataArray.Count == 1, "DataArray의 전체 개수는 1이어야 합니다.");
Check(!_dataArray.Contains(_item1), "_item1이 DataArray에 없어야 합니다.");
Check(_dataArray.RemovedItems.Count == 0, "Remove 메서드는 RemovedItems를 직접 채우지 않아야 합니다.");
}
/// <summary>
/// Clear: 모든 아이템을 제거합니다.
/// </summary>
public void Clear_RemovesAllItems()
{
_dataArray.Clear();
Check(_dataArray.Count == 0, "DataArray는 비어있어야 합니다.");
Check(_dataArray.RemovedItems.Count == 0, "Clear 메서드는 RemovedItems를 직접 채우지 않아야 합니다.");
}
/// <summary>
/// UpdateDifferent(updatedDataOnly=true): 추가/수정만 추적하고 제거는 추적하지 않습니다.
/// updatedDataOnly=true 이면 RemovedItems가 채워지지 않으며, 컬렉션에서도 제거되지 않습니다.
/// </summary>
public void UpdateDifferent_TracksAddsDeletesAndModifies()
{
var item2Modified = new DataObject { { "Id", "2" }, { "value", "B_modified" } };
var item4New = new DataObject { { "Id", "4" }, { "value", "D" } };
var otherArray = new DataArray(new[] { item2Modified, item4New });
// updatedDataOnly=true → RemovedItems 미추적, 항목 제거 없음
_dataArray.UpdateDifferent(otherArray, true);
// updatedDataOnly=true 일 때 RemovedItems는 채워지지 않습니다.
Check(_dataArray.RemovedItems.Count == 0, "updatedDataOnly=true 이면 RemovedItems는 비어있어야 합니다.");
Check(_dataArray.AddedItems.Count == 1, "추가된 항목이 1개여야 합니다.");
Check(_dataArray.AddedItems[0].Id == "4", "추가된 항목 Id는 '4'이어야 합니다.");
Check(_dataArray.ModifiedList.Count == 1, "수정된 항목이 1개여야 합니다.");
Check(_dataArray.ModifiedList[0].Id == "2", "수정된 항목 Id는 '2'이어야 합니다.");
var updatedItem = _dataArray.First(i => i.Id == "2");
Check(updatedItem.GetString("value") == "B_modified", "수정된 항목의 값이 반영되어야 합니다.");
}
/// <summary>
/// UpdateDifferent(updatedDataOnly=false): 추가/수정/제거 모두 추적합니다.
/// </summary>
public void UpdateDifferent_WithFullTracking_TracksRemovedItems()
{
var item2Modified = new DataObject { { "Id", "2" }, { "value", "B_modified" } };
var item4New = new DataObject { { "Id", "4" }, { "value", "D" } };
var otherArray = new DataArray(new[] { item2Modified, item4New });
// updatedDataOnly=false → RemovedItems 추적, 컬렉션에서 제거됨
_dataArray.UpdateDifferent(otherArray, false);
Check(_dataArray.RemovedItems.Count == 1, "제거된 항목이 1개여야 합니다.");
Check(_dataArray.RemovedItems[0].Id == "1", "제거된 항목 Id는 '1'이어야 합니다.");
Check(_dataArray.AddedItems.Count == 1, "추가된 항목이 1개여야 합니다.");
Check(_dataArray.AddedItems[0].Id == "4", "추가된 항목 Id는 '4'이어야 합니다.");
Check(_dataArray.ModifiedList.Count == 1, "수정된 항목이 1개여야 합니다.");
Check(_dataArray.ModifiedList[0].Id == "2", "수정된 항목 Id는 '2'이어야 합니다.");
Check(_dataArray.Count == 2, "최종 컬렉션의 크기는 2여야 합니다.");
Check(!_dataArray.Any(i => i.Id == "1"), "제거된 항목이 컬렉션에 없어야 합니다.");
Check(_dataArray.Any(i => i.Id == "4"), "추가된 항목이 컬렉션에 있어야 합니다.");
var updatedItem = _dataArray.First(i => i.Id == "2");
Check(updatedItem.GetString("value") == "B_modified", "수정된 항목의 값이 반영되어야 합니다.");
}
/// <summary>
/// ClearTrackedChanges: 변경 내역을 초기화합니다.
/// </summary>
public void ClearTrackedChanges_ResetsAllChangeLists()
{
var otherArray = new DataArray(new[] { _item3 });
_dataArray.UpdateDifferent(otherArray, true);
Check(_dataArray.UpdatedCount > 0, "테스트 준비 단계에서 변경 내역이 있어야 합니다.");
_dataArray.ClearTrackedChanges();
Check(_dataArray.UpdatedCount == 0, "UpdatedCount는 0이어야 합니다.");
Check(_dataArray.AddedItems.Count == 0, "AddedItems 리스트는 비어있어야 합니다.");
Check(_dataArray.RemovedItems.Count == 0, "RemovedItems 리스트는 비어있어야 합니다.");
Check(_dataArray.ModifiedList.Count == 0, "ModifiedList 리스트는 비어있어야 합니다.");
}
}
}