Skip to content
This repository was archived by the owner on Dec 24, 2022. It is now read-only.

Commit 995e2f8

Browse files
committed
More convertTo tests
1 parent 53a1fda commit 995e2f8

File tree

2 files changed

+85
-2
lines changed

2 files changed

+85
-2
lines changed

src/ServiceStack.Text/PlatformExtensions.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -554,8 +554,9 @@ public static Delegate CreateDelegate(this MethodInfo methodInfo, Type delegateT
554554

555555
public static Type GetCollectionType(this Type type)
556556
{
557-
return type.GetElementType()
558-
?? type.GetGenericArguments().LastOrDefault(); //new[] { str }.Select(x => new Type()) => WhereSelectArrayIterator<string,Type>
557+
return type.GetElementType()
558+
?? type.GetGenericArguments().LastOrDefault() //new[] { str }.Select(x => new Type()) => WhereSelectArrayIterator<string,Type>
559+
?? (type.BaseType != null && type.BaseType != typeof(object) ? type.BaseType.GetCollectionType() : null); //e.g. ArrayOfString : List<string>
559560
}
560561

561562
static Dictionary<string, Type> GenericTypeCache = new Dictionary<string, Type>();

tests/ServiceStack.Text.Tests/AutoMappingTests.cs

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1340,5 +1340,87 @@ public void Can_convert_between_KVP_ints_and_IEnumerable()
13401340
object[] arrayObjs = kvps.Cast<object>().ToArray();
13411341
Assert.That(arrayObjs.ConvertTo<List<KeyValuePair<string, object>>>(), Is.EquivalentTo(arrayObjs));
13421342
}
1343+
1344+
public enum TestEnum { A, B, C }
1345+
1346+
[Test]
1347+
public void Can_convert_between_list_of_value_types()
1348+
{
1349+
var enumArrays = new[]{ TestEnum.A, TestEnum.B, TestEnum.C };
1350+
var strArrays = new List<string> {"A","B","C"};
1351+
Assert.That(enumArrays.ConvertTo<List<TestEnum>>(), Is.EquivalentTo(enumArrays.ToList()));
1352+
Assert.That(enumArrays.ConvertTo<List<string>>(), Is.EquivalentTo(strArrays));
1353+
1354+
var strNums = new List<string> {"1","2","3"};
1355+
var intNums = new List<int> {1,2,3};
1356+
Assert.That(strNums.ConvertTo<List<int>>(), Is.EquivalentTo(intNums));
1357+
Assert.That(intNums.ConvertTo<List<string>>(), Is.EquivalentTo(strNums));
1358+
}
1359+
1360+
public class TestClassA
1361+
{
1362+
public IList<string> IListStrings { get; set; }
1363+
public ArrayOfString ListStrings { get; set; }
1364+
public IList<TestEnum> ListEnums { get; set; }
1365+
}
1366+
public class TestClassB
1367+
{
1368+
public ArrayOfString IListStrings { get; set; }
1369+
public IList<string> ListStrings { get; set; }
1370+
public ArrayOfString ListEnums { get; set; }
1371+
}
1372+
public class TestClassC
1373+
{
1374+
public IList<string> ListStrings { get; protected set; }
1375+
}
1376+
1377+
[Test]
1378+
public void Can_translate_generic_lists()
1379+
{
1380+
1381+
var values = new[] { "A", "B", "C" };
1382+
var testA = new TestClassA
1383+
{
1384+
IListStrings = new List<string>(values),
1385+
ListStrings = new ArrayOfString(values),
1386+
ListEnums = new List<TestEnum> { TestEnum.A, TestEnum.B, TestEnum.C },
1387+
};
1388+
1389+
var fromTestA = testA.ConvertTo<TestClassB>();
1390+
1391+
AssertAreEqual(testA, fromTestA);
1392+
1393+
var userFileTypeValues = testA.ListEnums.Map(x => x.ToString());
1394+
var testB = new TestClassB
1395+
{
1396+
IListStrings = new ArrayOfString(values),
1397+
ListStrings = new List<string>(values),
1398+
ListEnums = new ArrayOfString(userFileTypeValues),
1399+
};
1400+
1401+
var fromTestB = testB.ConvertTo<TestClassA>();
1402+
AssertAreEqual(fromTestB, testB);
1403+
}
1404+
1405+
private static void AssertAreEqual(TestClassA testA, TestClassB testB)
1406+
{
1407+
Assert.That(testA, Is.Not.Null);
1408+
Assert.That(testB, Is.Not.Null);
1409+
1410+
Assert.That(testA.IListStrings, Is.Not.Null);
1411+
Assert.That(testB.IListStrings, Is.Not.Null);
1412+
Assert.That(testA.IListStrings,
1413+
Is.EquivalentTo(new List<string>(testB.IListStrings)));
1414+
1415+
Assert.That(testA.ListStrings, Is.Not.Null);
1416+
Assert.That(testB.ListStrings, Is.Not.Null);
1417+
Assert.That(testA.ListStrings, Is.EquivalentTo(testB.ListStrings));
1418+
1419+
Assert.That(testA.ListEnums, Is.Not.Null);
1420+
Assert.That(testB.ListEnums, Is.Not.Null);
1421+
Assert.That(testA.ListEnums,
1422+
Is.EquivalentTo(testB.ListEnums.ConvertAll(x => x.ToEnum<TestEnum>())));
1423+
}
1424+
13431425
}
13441426
}

0 commit comments

Comments
 (0)