Files
XRLib/Assets/Scripts/UVC/Tests/Data/DataMapperTests.cs
2025-06-04 23:10:11 +09:00

269 lines
7.9 KiB
C#

using NUnit.Framework;
using System;
using Newtonsoft.Json.Linq;
using UVC.Data;
using UnityEngine;
namespace UVC.Tests.Data
{
/// <summary>
/// DataMapper 클래스의 테스트를 위한 테스트 클래스입니다.
/// </summary>
[TestFixture]
public class DataMapperTests
{
/// <summary>
/// 문자열 타입 매핑 테스트
/// </summary>
[Test]
public void Map_StringProperty_MapsCorrectly()
{
// Arrange
var guide = new JObject();
guide["Name"] = "홍길동";
var source = JObject.Parse(@"{ ""Name"": ""김철수"" }");
var mapper = new DataMapper(source, guide);
// Act
var result = mapper.Map();
// Assert
Assert.IsTrue(result.ContainsKey("Name"));
Assert.AreEqual("김철수", result["Name"].ToString());
}
/// <summary>
/// 정수 타입 매핑 테스트
/// </summary>
[Test]
public void Map_IntProperty_MapsCorrectly()
{
// Arrange
var guide = new JObject();
guide["Age"] = 25;
var source = JObject.Parse(@"{ ""Age"": 30 }");
var mapper = new DataMapper(source, guide);
// Act
var result = mapper.Map();
// Assert
Assert.IsTrue(result.ContainsKey("Age"));
Assert.AreEqual(30, result["Age"].ToObject<int>());
}
/// <summary>
/// 부동소수점 타입 매핑 테스트
/// </summary>
[Test]
public void Map_DoubleProperty_MapsCorrectly()
{
// Arrange
var guide = new JObject();
guide["Height"] = 175.5;
var source = JObject.Parse(@"{ ""Height"": 180.5 }");
var mapper = new DataMapper(source, guide);
// Act
var result = mapper.Map();
// Assert
Assert.IsTrue(result.ContainsKey("Height"));
Assert.AreEqual(180.5, result["Height"].ToObject<double>());
}
/// <summary>
/// Boolean 타입 매핑 테스트
/// </summary>
[Test]
public void Map_BoolProperty_MapsCorrectly()
{
// Arrange
var guide = new JObject();
guide["IsActive"] = false;
var source = JObject.Parse(@"{ ""IsActive"": true }");
var mapper = new DataMapper(source, guide);
// Act
var result = mapper.Map();
// Assert
Assert.IsTrue(result.ContainsKey("IsActive"));
Assert.IsTrue(result["IsActive"].ToObject<bool>());
}
/// <summary>
/// DateTime 타입 매핑 테스트
/// </summary>
[Test]
public void Map_DateTimeProperty_MapsCorrectly()
{
// Arrange
var guide = new JObject();
guide["BirthDate"] = JToken.FromObject(DateTime.Now);
var expectedDate = new DateTime(1990, 1, 1);
var source = JObject.Parse(@"{ ""BirthDate"": ""1990-01-01T00:00:00.000"" }");
var mapper = new DataMapper(source, guide);
// Act
var result = mapper.Map();
// Assert
Assert.IsTrue(result.ContainsKey("BirthDate"));
Assert.AreEqual(expectedDate, result["BirthDate"].ToObject<DateTime>());
}
/// <summary>
/// DataValueMapper 타입 매핑 테스트
/// </summary>
[Test]
public void Map_DataValueMapperProperty_MapsCorrectly()
{
// Arrange
var guide = new JObject();
var valueMapper = new DataValueMapper();
valueMapper["ON"] = "활성화";
valueMapper["OFF"] = "비활성화";
guide["Status"] = JToken.FromObject(valueMapper);
var source = JObject.Parse(@"{ ""Status"": ""ON"" }");
var mapper = new DataMapper(source, guide);
// Act
var result = mapper.Map();
// Assert
Assert.IsTrue(result.ContainsKey("Status"));
Assert.AreEqual("활성화", result["Status"].ToString());
}
/// <summary>
/// 열거형 타입 매핑 테스트
/// </summary>
[Test]
public void Map_EnumProperty_MapsCorrectly()
{
// Arrange
var guide = new JObject();
guide["Status"] = JToken.FromObject(UserStatus.Inactive);
var source = JObject.Parse(@"{ ""Status"": ""Active"" }");
var mapper = new DataMapper(source, guide);
// Act
var result = mapper.Map();
// Assert
Assert.IsTrue(result.ContainsKey("Status"));
Assert.AreEqual(UserStatus.Active, result["Status"].ToObject<UserStatus>());
}
/// <summary>
/// 타겟에 없는 추가 속성 매핑 테스트
/// </summary>
[Test]
public void Map_AdditionalProperty_AddsToResult()
{
// Arrange
var guide = new JObject();
guide["Name"] = "홍길동";
var source = JObject.Parse(@"{ ""Name"": ""김철수"", ""Email"": ""kim@example.com"" }");
var mapper = new DataMapper(source, guide);
// Act
var result = mapper.Map();
// Assert
Assert.IsTrue(result.ContainsKey("Email"));
Assert.AreEqual("kim@example.com", result["Email"].ToString());
}
/// <summary>
/// 유효하지 않은 DateTime 문자열 매핑 테스트
/// </summary>
[Test]
public void Map_InvalidDateTimeString_ReturnsNull()
{
// Arrange
var guide = new JObject();
guide["BirthDate"] = JToken.FromObject(DateTime.Now);
var source = JObject.Parse(@"{ ""BirthDate"": ""InvalidDateTime"" }");
var mapper = new DataMapper(source, guide);
// Act
var result = mapper.Map();
// Assert
Assert.IsTrue(result.ContainsKey("BirthDate"));
Assert.AreEqual(JTokenType.Null, result["BirthDate"].Type);
}
/// <summary>
/// 복합 객체 매핑 테스트
/// </summary>
[Test]
public void Map_ComplexObject_MapsAllProperties()
{
// Arrange
var guide = new JObject();
guide["Id"] = 1;
guide["Name"] = "홍길동";
guide["IsActive"] = false;
guide["JoinDate"] = JToken.FromObject(DateTime.Now);
guide["Height"] = 175.5;
guide["Status"] = JToken.FromObject(UserStatus.Inactive);
string json = @"{
""Id"": 100,
""Name"": ""김철수"",
""IsActive"": true,
""JoinDate"": ""2023-01-01T00:00:00"",
""Height"": 180.0,
""Status"": ""Active"",
""Email"": ""kim@example.com""
}";
var source = JObject.Parse(json);
var mapper = new DataMapper(source, guide);
// Act
var result = mapper.Map();
// Assert
Assert.AreEqual(7, result.Count);
Assert.AreEqual(100, result["Id"].ToObject<int>());
Assert.AreEqual("김철수", result["Name"].ToString());
Assert.IsTrue(result["IsActive"].ToObject<bool>());
Assert.AreEqual(new DateTime(2023, 1, 1), result["JoinDate"].ToObject<DateTime>());
Assert.AreEqual(180.0, result["Height"].ToObject<double>());
Assert.AreEqual(UserStatus.Active, result["Status"].ToObject<UserStatus>());
Assert.AreEqual("kim@example.com", result["Email"].ToString());
}
}
/// <summary>
/// 테스트에 사용할 샘플 열거형
/// </summary>
public enum UserStatus
{
Active,
Inactive,
Suspended
}
}