using UnityEngine; using NUnit.Framework; using FlexFramework.Excel; using System.IO; using System.Text; using System; using System.Linq; using System.Runtime.Serialization; using System.Linq.Expressions; using System.Collections.Generic; namespace FlexFramework.Tests { public class CSVTests { [Test] public void ConverterTest() { Assert.AreEqual(1, ValueConverter.Convert("1")); Assert.IsInstanceOf(ValueConverter.Convert(typeof(Color), "(1,1,1)")); Assert.Throws(() => ValueConverter.Convert("1")); Assert.IsInstanceOf(ValueConverter.Convert("1#2#3")); ValueConverter.Register(i => Int32.Parse(i) * 2); Assert.AreEqual(4, ValueConverter.Convert("2")); ValueConverter.Reset(); } [Test] public void DocumentTest() { var doc = Document.Load("a,b,c\n1,2,3"); Assert.AreEqual(2, doc.Count); Assert.AreEqual(3, doc[0].Count); Assert.AreEqual("B2", doc[1][1].Address.ToString()); Assert.AreEqual("a", doc[0][0].Value); } [Test] public void LineEndingTest() { var doc = Document.Load("a,b,c\n1,2,3\r4,5,6\r\n7,8,9"); Assert.AreEqual(4, doc.Count); } [Test] public void SelectorTest() { var doc = Document.Load("a,b,c\n1,2,3\n4,5,6\n7,8,9"); Assert.AreEqual("a", doc.Select("A1").Value); Assert.AreSame(doc[1][1], doc["B2"]); Assert.True(doc.SelectRange("A1:A3").Contains(doc["A2"])); } [Test] public void EmptyCellTest() { var doc = Document.Load("a,,\n,,\n,5,6"); Assert.AreEqual(3, doc.Count); Assert.AreEqual(3, doc[0].Count); Assert.AreEqual(3, doc[1].Count); Assert.IsEmpty(doc[0][1].Text); } [Test] public void EmptyLineTest() { var doc = Document.Load("\n1,2,3\n\n"); Assert.AreEqual(4, doc.Count); Assert.AreEqual(1, doc[0].Count); Assert.AreEqual(3, doc[1].Count); Assert.AreEqual(1, doc[3].Count); } [Test] public void DelimiterTest() { Document.Delimiter = ';'; var doc = Document.Load("a;b;c\n1,2;3,4;5,6"); Assert.AreEqual(3, doc[0].Count); Assert.AreEqual(3, doc[1].Count); Assert.AreEqual("1,2", doc[1][0].Value); Document.Reset(); } [Test] public void EncloseTest() { var doc = Document.Load("a,b,c\n\"1,2,3\",4,5\n\"\"\"hello\"\"\""); Assert.AreEqual("1,2,3", doc[1][0].Value); Assert.AreEqual("\"hello\"", doc[2][0].Value); } [Test] public void BufferTest() { Document doc = null; var bin = "YSxiLGMNCjEsMiwzDQoiLCIsIiwiLCIsIg0KXG4sXG4sXG4NCiIiIiwiIiIsIiIiIiwiIiIiIiINCiIiIiIsLA0KImhlbGxvLHdvcmxkIiwsDQoiIiJoZWxsbyIiIiwsDQoiIiJoZWxsbyx3b3JsZCIiIiwsDQoiIiIsIiwsDQoiLCIiIiwsDQoiIiIiIiIiIiws"; var buffer = Convert.FromBase64String(bin); Assert.DoesNotThrow(() => doc = Document.Load(buffer)); Assert.Greater(doc.Count, 0); } [Test] public void MappingTest() { var doc = Document.Load("name,member,age,phone\nadam,true,22,933-311-5784"); var mapper = new Mapper().Map("name", 1).Map("member", "B").Map("age", 3).Map("phone", "D"); User user = null; Assert.DoesNotThrow(() => user = doc[1].Convert(mapper)); Assert.AreEqual("adam", user.name); Assert.True(user.member); Assert.AreEqual(22, user.age); Assert.AreEqual("933-311-5784", user.phone); Assert.DoesNotThrow(() => user = (User)doc[1].Convert(typeof(User), "name:1, member:B, age:C, phone:4")); Assert.AreEqual(22, user.age); Assert.DoesNotThrow(() => user = doc[1].Convert(doc[0])); Assert.AreEqual("933-311-5784", user.phone); mapper.Remove("age").Remove("member").Remove("phone"); Assert.DoesNotThrow(() => user = doc[1].Convert(mapper)); Assert.AreEqual("adam", user.name); Assert.False(user.member); Assert.AreEqual(0, user.age); Assert.Null(user.phone); } [Test] public void TableMappingTest() { var doc = Document.Load("name,member,age,phone\nadam,true,22,927-553-6129\nbrian,false,18,354-459-2227\ncan,false,30,023-291-5783"); var mapper = new TableMapper().Map("name:1, member:2, age:3, phone:4").Exclude(1); User[] users = null; Assert.DoesNotThrow(() => users = doc.Convert(mapper).ToArray()); Assert.AreEqual(3, users.Length); Assert.AreEqual(18, users[1].age); Assert.DoesNotThrow(() => users = doc.Convert(1).ToArray()); Assert.AreEqual("can", users[2].name); } [Test, Ignore("")] public void FormatterServicesTest() { for (int i = 0; i < 10000; i++) { FormatterServices.GetUninitializedObject(typeof(User)); } } [Test, Ignore("")] public void ActivatorTest() { for (int i = 0; i < 10000; i++) { Activator.CreateInstance(typeof(User)); } } [Test, Ignore("")] public void LambdaTest() { var func = Expression.Lambda>(Expression.New(typeof(User))).Compile(); for (int i = 0; i < 10000; i++) { func(); } } [Test] public void ExpandTest() { var table = Document.Load("1,2,3\n4,5,6\n7,8,9,10"); var expanded = table.Expand(); Assert.AreEqual(3, expanded.Count); Assert.AreEqual(4, expanded[0].Count); Assert.AreEqual(4, expanded[1].Count); Assert.AreEqual(4, expanded[2].Count); Assert.NotNull(expanded[0][3]); Assert.Null(expanded[0][3].Value); Assert.AreEqual("5", expanded.Select("B2").Value); } [Test] public void RotateTest() { var table = Document.Load("1,2,3\n4,5,6\n7,8,9,10"); var rotated = table.Rotate(); Assert.AreEqual(4, rotated.Count); Assert.AreEqual("7", rotated[0][0].Value); Assert.AreEqual("10", rotated.Select("A4").Value); Assert.NotNull(rotated[3][1]); Assert.Null(rotated[3][1].Value); } [Test] public void CollapseTest() { var table = Document.Load("\n1,,2,,\n,\n,3,\n,\n"); var collapsed = table.Collapse(); Assert.AreEqual(2, collapsed.Count); Assert.AreEqual(3, collapsed[0].Count); Assert.AreEqual(1, collapsed[1].Count); } [Test] public void FallbackTest() { var doc = Document.Load("name,member,age,phone\nadam,no,NaN,---"); var mapper = new Mapper().Map("name", 1).Map("member", 2).Map("age", 3).Map("phone", 4); User user = null; Assert.Throws(() => user = doc[1].Convert(mapper)); mapper.SafeMode = true; Assert.DoesNotThrow(() => user = doc[1].Convert(mapper)); Assert.False(user.member); Assert.AreEqual("adam", user.name); Assert.AreEqual(0, user.age); Assert.AreEqual("---", user.phone); mapper.Remove("member").Remove("age"); Assert.Throws(() => mapper.Map("member", 2, 0)); Assert.DoesNotThrow(() => mapper.Map("member", 2, true).Map("age", 3, 20)); Assert.DoesNotThrow(() => user = doc[1].Convert(mapper)); Assert.True(user.member); Assert.AreEqual(20, user.age); } [TestCase(10, 10), TestCase(100, 100), TestCase(1000, 100)] public void LoadPerformaceTest(int rows, int columns) { var sb = new StringBuilder(); for (int i = 0; i < rows; i++) { for (int j = 0; j < columns; j++) { sb.AppendFormat("{0}{1}", j, j < columns - 1 ? "," : string.Empty); } sb.AppendLine(); } var plain = sb.ToString(); Document.Load(plain); } [TestCase(10), TestCase(100), TestCase(1000), TestCase(5000)] public void ConvertPerformanceTest(int rows) { var sb = new StringBuilder(); sb.AppendLine("name,member,age,phone"); for (int i = 0; i < rows; i++) { sb.AppendFormat("{0},{1},{2},{3}", i, true, i, i); if (i < rows - 1) sb.AppendLine(); } var plain = sb.ToString(); var doc = Document.Load(plain); var users = doc.Convert(1).ToArray(); Assert.AreEqual(rows, users.Length); } [Test] public void AttributeTest() { var doc = Document.Load("name,member,age,phone\n\nadam,false,NaN,---"); Anotheruser[] users = null; Assert.DoesNotThrow(() => users = doc.Convert().ToArray()); Assert.AreEqual(1, users.Length); Assert.AreEqual("adam", users[0].name); Assert.False(users[0].member); Assert.AreEqual(18, users[0].age); Assert.AreEqual("---", users[0].phone); } } }