using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Xml; using System.Xml.Serialization; using Microsoft.VisualStudio.TestTools.UnitTesting; using Vocaluxe.Base; using VocaluxeLib; using VocaluxeLib.Menu; using VocaluxeLib.Xml; namespace VocaluxeTests { [TestClass] public class CXmlSerializerTest { private const string sHead = "\r\n"; private const string sEmpty = sHead + @""; private struct SBasic { public int I; public string S; public float F; public double D; } [TestMethod] public void TestBasic() { const string s = @" 1 2 3 4 "; var xml = new CXmlSerializer(); SBasic foo = xml.DeserializeString(s); Assert.AreEqual(1, foo.I); Assert.AreEqual("2", foo.S); Assert.AreEqual(3, foo.F, 0.0001); Assert.AreEqual(4, foo.D, 0.0001); } private static void _AssertFail(Action test) where T : Exception { try { test.Invoke(); Assert.Fail("Exception " + typeof(T).Name + " not thrown!"); } catch (Exception e) { Assert.IsInstanceOfType(e, typeof(T)); } } [TestMethod] public void TestMissingXmlElement() { string[] s = new string[] {@" 2 3 4 ", @" 1 3 4 ", @" 1 2 3 "}; var xml = new CXmlSerializer(); foreach (string s1 in s) { string sTmp = s1; _AssertFail(() => xml.DeserializeString(sTmp)); } } [TestMethod] public void TestMissingStructElement() { string[] s = new string[] {@" 1 1 2 3 4 ", @" 1 1 2 3 4 ", @" 1 2 3 4 1 "}; var xml = new CXmlSerializer(); foreach (string s1 in s) { string sTmp = s1; _AssertFail(() => xml.DeserializeString(sTmp)); } } [TestMethod] public void TestBasicSerialization() { const string s = sHead + @" 1 2 3 4 "; var xml = new CXmlSerializer(); SBasic foo = xml.DeserializeString(s); string s2 = xml.Serialize(foo); Assert.AreEqual(s, s2); } private readonly string[] _XMLList = new string[] { sHead + @" 1 1 ", sHead + @" ", sHead + @" " }; [XmlType("Entry")] private struct SEntry { public int I; } private struct SList { [XmlArray] public List Ints; } [TestMethod] public void TestList() { var xml = new CXmlSerializer(); SList foo = xml.DeserializeString(_XMLList[0]); Assert.AreEqual(foo.Ints.Count, 2, "Deserialization failed"); Assert.AreEqual(foo.Ints[0].I, 1, "Deserialization failed"); Assert.AreEqual(foo.Ints[1].I, 1, "Deserialization failed"); string res = xml.Serialize(foo); Assert.AreEqual(_XMLList[0], res, "Serialization failed"); foo = xml.DeserializeString(_XMLList[1]); Assert.AreEqual(foo.Ints.Count, 0, "Deserialization2 failed"); res = xml.Serialize(foo); Assert.AreEqual(_XMLList[2], res, "Serialization2 failed"); foo = xml.DeserializeString(_XMLList[2]); Assert.AreEqual(foo.Ints.Count, 0, "Deserialization2 failed"); res = xml.Serialize(foo); Assert.AreEqual(_XMLList[2], res, "Serialization2 failed"); _AssertFail(() => xml.DeserializeString(sEmpty)); } private struct SArray { [XmlArray] public SEntry[] Ints; } [TestMethod] public void TestArray() { var xml = new CXmlSerializer(); SArray foo = xml.DeserializeString(_XMLList[0]); Assert.AreEqual(foo.Ints.Length, 2, "Deserialization failed"); Assert.AreEqual(foo.Ints[0].I, 1, "Deserialization failed"); Assert.AreEqual(foo.Ints[1].I, 1, "Deserialization failed"); string res = xml.Serialize(foo); Assert.AreEqual(_XMLList[0], res, "Serialization failed"); foo = xml.DeserializeString(_XMLList[1]); Assert.AreEqual(foo.Ints.Length, 0, "Deserialization2 failed"); res = xml.Serialize(foo); Assert.AreEqual(_XMLList[2], res, "Serialization2 failed"); foo = xml.DeserializeString(_XMLList[2]); Assert.AreEqual(foo.Ints.Length, 0, "Deserialization2 failed"); res = xml.Serialize(foo); Assert.AreEqual(_XMLList[2], res, "Serialization2 failed"); _AssertFail(() => xml.DeserializeString(sEmpty)); } private const string _XMLListEmb = sHead + @" 2 1 3 "; private const string _XMLListEmb2 = sHead + @" 2 1 2 3 "; private const string _XMLListEmb3 = sHead + @" 2 3 "; private struct SListEmb { public int I; [XmlElement("Entry")] public List Ints; public int J; } [TestMethod] public void TestListEmbedded() { var xml = new CXmlSerializer(); SListEmb foo = xml.DeserializeString(_XMLListEmb); Assert.AreEqual(foo.Ints.Count, 1, "Deserialization failed"); Assert.AreEqual(foo.Ints[0].I, 1, "Deserialization failed"); string res = xml.Serialize(foo); Assert.AreEqual(_XMLListEmb, res, "Serialization failed"); foo = xml.DeserializeString(_XMLListEmb2); Assert.AreEqual(foo.Ints.Count, 2, "Deserialization failed"); Assert.AreEqual(foo.Ints[1].I, 2, "Deserialization failed"); res = xml.Serialize(foo); Assert.AreEqual(_XMLListEmb2, res, "Serialization failed"); foo = xml.DeserializeString(_XMLListEmb3); Assert.AreEqual(foo.Ints.Count, 0, "Deserialization failed"); res = xml.Serialize(foo); Assert.AreEqual(_XMLListEmb3, res, "Serialization failed"); _AssertFail(() => xml.DeserializeString(sEmpty)); } private struct SArrayEmb { public int I; [XmlElement("Entry")] public SEntry[] Ints; public int J; } [TestMethod] public void TestArrayEmbedded() { var xml = new CXmlSerializer(); SArrayEmb foo = xml.DeserializeString(_XMLListEmb); Assert.AreEqual(foo.Ints.Length, 1, "Deserialization failed"); Assert.AreEqual(foo.Ints[0].I, 1, "Deserialization failed"); string res = xml.Serialize(foo); Assert.AreEqual(_XMLListEmb, res, "Serialization failed"); foo = xml.DeserializeString(_XMLListEmb2); Assert.AreEqual(foo.Ints.Length, 2, "Deserialization failed"); Assert.AreEqual(foo.Ints[1].I, 2, "Deserialization failed"); res = xml.Serialize(foo); Assert.AreEqual(_XMLListEmb2, res, "Serialization failed"); foo = xml.DeserializeString(_XMLListEmb3); Assert.AreEqual(foo.Ints.Length, 0, "Deserialization failed"); res = xml.Serialize(foo); Assert.AreEqual(_XMLListEmb3, res, "Serialization failed"); _AssertFail(() => xml.DeserializeString(sEmpty)); } [TestMethod] public void TestRealFiles() { Type[] types = new Type[] {typeof(SThemeCover), typeof(CConfig.SConfig), typeof(SThemeScreen), typeof(SDefaultFonts), typeof(SSkin), typeof(STheme)}; string filePath = Path.Combine(new string[] {AppDomain.CurrentDomain.BaseDirectory, "..", "..", "..", "TestXmlFiles"}); foreach (Type type in types) { string xmlPath = Path.Combine(filePath, type.Name + ".xml"); var xml = new CXmlSerializer(type == typeof(CConfig.SConfig)); object foo = xml.GetType().GetMethod("Deserialize").MakeGenericMethod(new Type[] {type}).Invoke(xml, new object[] {xmlPath}); Assert.IsInstanceOfType(foo, type); string newXml = xml.Serialize(foo); string oldXml = File.ReadAllText(xmlPath); Assert.AreEqual(oldXml, newXml, "Error in " + type.Name); } } } }