#nullable enable using Cysharp.Threading.Tasks; using System; using System.Threading; using UnityEngine; namespace UVC.Sample.Data { /// /// Data 모듈 샘플 실행기입니다. /// Inspector의 각 토글을 체크하고 [샘플 실행] 버튼을 클릭하거나 Play 시 자동 실행합니다. /// Console 창에서 [OK] / [FAIL] 로그로 결과를 확인하세요. /// public class DataSampleRunner : MonoBehaviour { [Header("실행할 샘플 선택")] [SerializeField] private bool _runDataArray = true; [SerializeField] private bool _runDataObject = true; [SerializeField] private bool _runDataMapper = true; [SerializeField] private bool _runHttpDataFetcher = true; [SerializeField] private bool _runMqttDataReceiver = false; [Header("Play 시 자동 실행")] [SerializeField] private bool _autoRunOnPlay = false; private CancellationTokenSource? _cts; private void Start() { if (_autoRunOnPlay) RunSamplesAsync().Forget(ex => Debug.LogError(ex)); } private void OnDestroy() { _cts?.Cancel(); _cts?.Dispose(); } /// /// 선택된 샘플을 순서대로 실행합니다. /// Inspector Context Menu 또는 코드에서 호출하세요. /// [ContextMenu("샘플 실행")] public void RunSamples() { RunSamplesAsync().Forget(ex => Debug.LogError(ex)); } private async UniTask RunSamplesAsync() { _cts?.Cancel(); _cts?.Dispose(); _cts = new CancellationTokenSource(); var ct = _cts.Token; Debug.Log("========== Data 샘플 실행 시작 =========="); try { if (_runDataArray) { await UniTask.SwitchToMainThread(ct); new DataArrayTests().RunAll(); } if (_runDataObject) { await UniTask.SwitchToMainThread(ct); new DataObjectTests().RunAll(); } if (_runDataMapper) { await UniTask.SwitchToMainThread(ct); new DataMapperTests().RunAll(); } if (_runHttpDataFetcher) { await UniTask.SwitchToMainThread(ct); var httpTests = new HttpDataFetcherTests(); await httpTests.RunAll(); } if (_runMqttDataReceiver) { await UniTask.SwitchToMainThread(ct); var mqttTests = new MqttDataReceiverTests(); await mqttTests.RunAll(); mqttTests.TearDown(); } } catch (OperationCanceledException) { Debug.Log("샘플 실행이 취소되었습니다."); } catch (Exception ex) { Debug.LogError($"샘플 실행 중 오류 발생: {ex.Message}"); } Debug.Log("========== Data 샘플 실행 완료 =========="); } } }