#nullable enable using System; using System.Linq; using UnityEngine; using UVC.Data.Core; namespace UVC.Sample.Data { /// /// DataArray 기능 샘플 코드입니다. /// DataSampleRunner Inspector에서 실행하거나 Play 버튼으로 확인합니다. /// public class DataArrayTests { private DataArray _dataArray = new DataArray(); private DataObject _item1 = new DataObject(); private DataObject _item2 = new DataObject(); private DataObject _item3 = new DataObject(); /// /// 모든 샘플을 순차 실행합니다. /// 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}"); } /// /// Add: 아이템을 리스트에 추가합니다. /// 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를 직접 채우지 않아야 합니다."); } /// /// Remove: 아이템을 리스트에서 제거합니다. /// 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를 직접 채우지 않아야 합니다."); } /// /// Clear: 모든 아이템을 제거합니다. /// public void Clear_RemovesAllItems() { _dataArray.Clear(); Check(_dataArray.Count == 0, "DataArray는 비어있어야 합니다."); Check(_dataArray.RemovedItems.Count == 0, "Clear 메서드는 RemovedItems를 직접 채우지 않아야 합니다."); } /// /// UpdateDifferent(updatedDataOnly=true): 추가/수정만 추적하고 제거는 추적하지 않습니다. /// updatedDataOnly=true 이면 RemovedItems가 채워지지 않으며, 컬렉션에서도 제거되지 않습니다. /// 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", "수정된 항목의 값이 반영되어야 합니다."); } /// /// UpdateDifferent(updatedDataOnly=false): 추가/수정/제거 모두 추적합니다. /// 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", "수정된 항목의 값이 반영되어야 합니다."); } /// /// ClearTrackedChanges: 변경 내역을 초기화합니다. /// 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 리스트는 비어있어야 합니다."); } } }