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);
}
}
}
}