From 6fa653fdb8df5d48e83faed9e56faa171c6e72e9 Mon Sep 17 00:00:00 2001 From: lukeIam <2lukeiam@gmail.com> Date: Fri, 23 Mar 2018 14:17:07 +0100 Subject: [PATCH] Ported CXmlSerializerTests --- Tests/Tests.csproj | 15 + Tests/VocaluxeLib/XML/CXmlSerializerTest.cs | 509 ++++++++++++++++++ .../XML/TestFiles/Dictionary`2.xml | 34 ++ Tests/VocaluxeLib/XML/TestFiles/SConfig.xml | 97 ++++ .../XML/TestFiles/SDefaultFonts.xml | 35 ++ Tests/VocaluxeLib/XML/TestFiles/SSkin.xml | 268 +++++++++ Tests/VocaluxeLib/XML/TestFiles/STheme.xml | 16 + .../VocaluxeLib/XML/TestFiles/SThemeCover.xml | 37 ++ .../XML/TestFiles/SThemeScreen.xml | 256 +++++++++ 9 files changed, 1267 insertions(+) create mode 100644 Tests/VocaluxeLib/XML/CXmlSerializerTest.cs create mode 100644 Tests/VocaluxeLib/XML/TestFiles/Dictionary`2.xml create mode 100644 Tests/VocaluxeLib/XML/TestFiles/SConfig.xml create mode 100644 Tests/VocaluxeLib/XML/TestFiles/SDefaultFonts.xml create mode 100644 Tests/VocaluxeLib/XML/TestFiles/SSkin.xml create mode 100644 Tests/VocaluxeLib/XML/TestFiles/STheme.xml create mode 100644 Tests/VocaluxeLib/XML/TestFiles/SThemeCover.xml create mode 100644 Tests/VocaluxeLib/XML/TestFiles/SThemeScreen.xml diff --git a/Tests/Tests.csproj b/Tests/Tests.csproj index 357adb5d..0e058173 100644 --- a/Tests/Tests.csproj +++ b/Tests/Tests.csproj @@ -40,10 +40,12 @@ True + + @@ -58,6 +60,19 @@ {D2B6DDEF-E0E1-4DDF-A73A-E6ACEF5C95EC} VocaluxeLib + + {2a1e0f2d-5392-4bb7-b0a1-a9dfa13e79ff} + Vocaluxe + + + + + + + + + + diff --git a/Tests/VocaluxeLib/XML/CXmlSerializerTest.cs b/Tests/VocaluxeLib/XML/CXmlSerializerTest.cs new file mode 100644 index 00000000..be5999e4 --- /dev/null +++ b/Tests/VocaluxeLib/XML/CXmlSerializerTest.cs @@ -0,0 +1,509 @@ +#region license +// This file is part of Vocaluxe. +// +// Vocaluxe is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Vocaluxe is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Vocaluxe. If not, see . +#endregion + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.IO; +using System.Xml.Serialization; +using NUnit.Framework; +using VocaluxeLib; +using VocaluxeLib.Menu; +using VocaluxeLib.Xml; +using Vocaluxe.Base; + +namespace Tests.VocaluxeLib.XML +{ + [TestFixture] + public class CXmlSerializerTest + { + private const string _Head = "\r\n"; + private const string _Empty = _Head + @""; + +#pragma warning disable 649 +#pragma warning disable 169 + private struct SBasic + { + public int I; + public string S; + public float F; + public double D; + } + + [XmlType("Entry")] + private struct SEntry + { + public int I; + } + + private struct SList + { + [XmlArray] + public List Ints; + } + + private struct SArray + { + [XmlArray] + public SEntry[] Ints; + } + + private struct SListEmb + { + public int I; + [XmlElement("Entry")] + public List Ints; + public int J; + } + + private struct SArrayEmb + { + public int I; + [XmlElement("Entry")] + public SEntry[] Ints; + public int J; + } + + private struct SProperty + { + [XmlIgnore] + public int Private; + // ReSharper disable UnusedMember.Local + public int Public + { + get { return Private - 1; } + set { Private = value + 1; } + } + // ReSharper restore UnusedMember.Local + // ReSharper disable UnusedAutoPropertyAccessor.Local + public int Auto { get; set; } + // ReSharper restore UnusedAutoPropertyAccessor.Local + } + + private struct SBytes + { + public byte[] B; + } + + private struct SIgnore + { + [XmlIgnore] + public int I; + public int J; + } + + private class CIgnore + { + [XmlIgnore] + public int I; + public int J; + } + + private struct SDefaultSub + { + [DefaultValue(111)] + public int I; + } + + private struct SDefault + { + [DefaultValue(1337)] + public int I; + [DefaultValue("Foo")] + public string S; + public float? F; + [DefaultValue(666.0)] + public double D; + public SDefaultSub Sub; + } + +#pragma warning restore 169 +#pragma warning restore 649 + + private static void _AssertFail(String xmlString) where T2 : Exception where T : new() + { + var deserializer = new CXmlDeserializer(); + Assert.Throws(() => deserializer.DeserializeString(xmlString)); + } + + private static T _AssertSerDeserMatch(string xmlString) where T : new() + { + var deserializer = new CXmlDeserializer(); + var serializer = new CXmlSerializer(); + T foo = deserializer.DeserializeString(xmlString); + string xmlNew = serializer.Serialize(foo); + Assert.AreEqual(xmlString, xmlNew); + return foo; + } + + [Test] + public void TestBasic() + { + const string s = @" + 1 + 2 + 3 + 4 +"; + const string sUnordered = @" + 4 + 1 + 3 + 2 +"; + var xml = new CXmlDeserializer(); + 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); + foo = xml.DeserializeString(sUnordered); + Assert.AreEqual(1, foo.I); + Assert.AreEqual("2", foo.S); + Assert.AreEqual(3, foo.F, 0.0001); + Assert.AreEqual(4, foo.D, 0.0001); + } + + [Test] + public void TestMissingXmlElement() + { + string[] s = new string[] { @" + 2 + 3 + 4 +", @" + 1 + 3 + 4 +", @" + 1 + 2 + 3 +" }; + foreach (string s1 in s) + { + string sTmp = s1; + _AssertFail(sTmp); + } + } + + [Test] + public void TestMissingStructElement() + { + string[] s = new string[] { @" + 1 + 1 + 2 + 3 + 4 +", @" + 1 + 1 + 2 + 3 + 4 +", @" + 1 + 2 + 3 + 4 + 1 +" }; + foreach (string s1 in s) + { + string sTmp = s1; + _AssertFail(sTmp); + } + } + + [Test] + public void TestBasicSerialization() + { + const string s = _Head + @" + 1 + 2 + 3 + 4 +"; + _AssertSerDeserMatch(s); + } + + private readonly string[] _XmlList = new string[] + { + _Head + @" + + + 1 + + + 1 + + +", + _Head + @" + + +", + _Head + @" + +" + }; + + [Test] + public void TestList() + { + var xml = new CXmlDeserializer(); + var ser = 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 = ser.Serialize(foo); + Assert.AreEqual(_XmlList[0], res, "Serialization failed"); + foo = xml.DeserializeString(_XmlList[1]); + Assert.AreEqual(foo.Ints.Count, 0, "Deserialization2 failed"); + res = ser.Serialize(foo); + Assert.AreEqual(_XmlList[2], res, "Serialization2 failed"); + foo = xml.DeserializeString(_XmlList[2]); + Assert.AreEqual(foo.Ints.Count, 0, "Deserialization2 failed"); + _AssertSerDeserMatch(_XmlList[2]); + res = ser.Serialize(foo); + Assert.AreEqual(_XmlList[2], res, "Serialization2 failed"); + _AssertFail(_Empty); + } + + [Test] + public void TestArray() + { + var xml = new CXmlDeserializer(); + var ser = 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 = ser.Serialize(foo); + Assert.AreEqual(_XmlList[0], res, "Serialization failed"); + foo = xml.DeserializeString(_XmlList[1]); + Assert.AreEqual(foo.Ints.Length, 0, "Deserialization2 failed"); + res = ser.Serialize(foo); + Assert.AreEqual(_XmlList[2], res, "Serialization2 failed"); + foo = xml.DeserializeString(_XmlList[2]); + Assert.AreEqual(foo.Ints.Length, 0, "Deserialization2 failed"); + res = ser.Serialize(foo); + Assert.AreEqual(_XmlList[2], res, "Serialization2 failed"); + _AssertFail(_Empty); + } + + private const string _XmlListEmb = _Head + @" + 2 + + 1 + + 3 +"; + private const string _XmlListEmb2 = _Head + @" + 2 + + 1 + + + 2 + + 3 +"; + private const string _XmlListEmb3 = _Head + @" + 2 + 3 +"; + private const string _XmlListEmb4 = _Head + @" + 2 + + 3 +"; + + [Test] + public void TestListEmbedded() + { + var xml = new CXmlDeserializer(); + var ser = 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 = ser.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 = ser.Serialize(foo); + Assert.AreEqual(_XmlListEmb2, res, "Serialization failed"); + foo = xml.DeserializeString(_XmlListEmb3); + Assert.AreEqual(foo.Ints.Count, 0, "Deserialization failed"); + res = ser.Serialize(foo); + Assert.AreEqual(_XmlListEmb3, res, "Serialization failed"); + ser = new CXmlSerializer(true); + foo.Ints.Clear(); + res = ser.Serialize(foo); + Assert.AreEqual(_XmlListEmb4, res, "Serialization failed"); + _AssertFail(_Empty); + } + + [Test] + public void TestArrayEmbedded() + { + var xml = new CXmlDeserializer(); + var ser = 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 = ser.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 = ser.Serialize(foo); + Assert.AreEqual(_XmlListEmb2, res, "Serialization failed"); + foo = xml.DeserializeString(_XmlListEmb3); + Assert.AreEqual(foo.Ints.Length, 0, "Deserialization failed"); + res = ser.Serialize(foo); + Assert.AreEqual(_XmlListEmb3, res, "Serialization failed"); + ser = new CXmlSerializer(true); + foo.Ints = new SEntry[0]; + res = ser.Serialize(foo); + Assert.AreEqual(_XmlListEmb4, res, "Serialization failed"); + _AssertFail(_Empty); + } + + [Test] + public void TestProperty() + { + const string xmlString = _Head + @" + 2 + 3 +"; + SProperty foo = _AssertSerDeserMatch(xmlString); + Assert.AreEqual(3, foo.Private); + Assert.AreEqual(3, foo.Auto); + } + + [Test] + public void TestByteArray() + { + const string xmlString = _Head + @" + MTMzNw== +"; + _AssertSerDeserMatch(xmlString); + } + + private const string _XmlIgnore = _Head + @" + 2 +"; + private const string _XmlIgnore2 = _Head + @" + 2 + 2 +"; + + [Test] + public void TestIgnore() + { + _AssertSerDeserMatch(_XmlIgnore); + _AssertFail(_XmlIgnore2); + } + + [Test] + public void TestExisting() + { + var foo = new SIgnore { I = 1 }; + var xml = new CXmlDeserializer(); + var ser = new CXmlSerializer(); + SIgnore bar = xml.DeserializeString(_XmlIgnore, foo); + Assert.AreEqual(1, bar.I); + Assert.AreEqual(_XmlIgnore, ser.Serialize(bar)); + + var foo2 = new CIgnore { I = 1 }; + CIgnore bar2 = xml.DeserializeString(_XmlIgnore, foo2); + Assert.AreEqual(1, bar2.I); + Assert.AreEqual(foo2.J, bar2.J, "Original classes should be modified by the deserialization"); + Assert.AreEqual(_XmlIgnore, ser.Serialize(bar2)); + } + + [Test] + public void TestOnlyList() + { + const string s = _Head + @" + 2 + 3 +"; + _AssertSerDeserMatch>(s); + } + + [Test] + public void TestOnlyDict() + { + const string s = _Head + @" + 2 + 3 +"; + _AssertSerDeserMatch>(s); + } + + [Test] + public void TestDefaultValues() + { + const string s = _Head + @" + 1 + 2 + 3 + 4 + + 22 + +"; + _AssertSerDeserMatch(s); + var xml = new CXmlDeserializer(new CXmlErrorHandler(exception => { })); + SDefault foo = xml.DeserializeString(@""); + Assert.AreEqual(foo.I, 1337); + Assert.AreEqual(foo.F, null); + Assert.AreEqual(foo.S, "Foo"); + Assert.AreEqual(foo.D, 666); + Assert.AreEqual(foo.Sub.I, 111); + string newXml = new CXmlSerializer().Serialize(foo); + Assert.AreEqual(_Head + @" + +", newXml); + } + + [Test] + public void TestRealFiles([Values(typeof(SThemeCover), typeof(CConfig.SConfig), typeof(SThemeScreen), typeof(SDefaultFonts), typeof(SSkin), typeof(STheme), typeof(Dictionary))] Type type) + { + string filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "..", "..", "VocaluxeLib", "XML", "TestFiles"); + + string xmlPath = Path.Combine(filePath, type.Name + ".xml"); + var deser = new CXmlDeserializer(); + + object foo = deser.Deserialize(xmlPath, Activator.CreateInstance(type)); + + Assert.IsInstanceOf(type, foo, "Wrong type with " + type.Name); + var ser = new CXmlSerializer(type == typeof(CConfig.SConfig)); + string newXml = ser.Serialize(foo, type == typeof(Dictionary) ? "resources" : null); + // Typename will be uppercase but input is lowercase + newXml = newXml.Replace(" + + Deutsch + Vocaluxe + und + Exit + Speichern + Zurück + Start + Audio-Streams + Video-Streams + Textures + ToneAbs + Max. Volume + Geladene Songs + Maus + Speicherverbrauch + Normal + Duett + Medley + Kurz-Version + Vocal Hero + Superstar + Hit-Künstler + Sternchen + Fortgeschritten + Möchtegern + Amateur + Nichtskönner + Gast + Normaler Benutzer + Administrator + Tastatur + \ No newline at end of file diff --git a/Tests/VocaluxeLib/XML/TestFiles/SConfig.xml b/Tests/VocaluxeLib/XML/TestFiles/SConfig.xml new file mode 100644 index 00000000..c2258062 --- /dev/null +++ b/Tests/VocaluxeLib/XML/TestFiles/SConfig.xml @@ -0,0 +1,97 @@ + + + + + TR_CONFIG_LEVEL_MAX + TR_CONFIG_ON + + + TR_CONFIG_DIRECT3D + TR_CONFIG_TEXTURE_HIGH + 128 + 1024 + 576 + Middle + 0 + 1 + 0 + 0 + X0 + 60 + TR_CONFIG_ON + TR_CONFIG_OFF + 0.4 + + + Ambient + Blue + Blue + TR_CONFIG_ON + TR_CONFIG_ON + TR_CONFIG_TIMERLOOK_EXPANDED + TR_CONFIG_PLAYERINFO_BOTH + TR_CONFIG_FADEPLAYERINFO_OFF + TR_CONFIG_COVERLOADING_ATSTART + Slide + + + GstreamerSharp + PortAudio + B2048 + 0 + TR_CONFIG_ON + 20 + TR_CONFIG_NO_OWN_MUSIC + TR_CONFIG_ON + 50 + 100 + + + Deutsch + E:\Songs + TR_CONFIG_TILE_BOARD + TR_CONFIG_ARTIST_LETTER + TR_CONFIG_ON + 10 + TR_CONFIG_TIMERMODE_REMAINING + 1 + TR_CONFIG_ON + TR_CONFIG_LYRICSPOSITION_BOTTOM + 0.1 + + guest1.xml + guest1.xml + guest1.xml + guest1.xml + + + + + + + + Mikrofon (C-Media USB Headphone Set ) + Mikrofon (C-Media USB Headphone Set )6 + 1 + + 120 + + + TR_CONFIG_ON + TR_CONFIG_ON + 3000 + + \ No newline at end of file diff --git a/Tests/VocaluxeLib/XML/TestFiles/SDefaultFonts.xml b/Tests/VocaluxeLib/XML/TestFiles/SDefaultFonts.xml new file mode 100644 index 00000000..ad954596 --- /dev/null +++ b/Tests/VocaluxeLib/XML/TestFiles/SDefaultFonts.xml @@ -0,0 +1,35 @@ + + + + + Normal + 0 + + 0 + 0 + 0 + 1 + + FreeSans + FreeSans.ttf + FreeSansBold.ttf + FreeSansOblique.ttf + FreeSansBoldOblique.ttf + + + Outline + 0.1 + + 0 + 0 + 0 + 1 + + FreeSans + FreeSans.ttf + FreeSansBold.ttf + FreeSansOblique.ttf + FreeSansBoldOblique.ttf + + + \ No newline at end of file diff --git a/Tests/VocaluxeLib/XML/TestFiles/SSkin.xml b/Tests/VocaluxeLib/XML/TestFiles/SSkin.xml new file mode 100644 index 00000000..23f2a3df --- /dev/null +++ b/Tests/VocaluxeLib/XML/TestFiles/SSkin.xml @@ -0,0 +1,268 @@ + + + 4 + + Blue + bohning + 0 + 0 + + + + 0 + 0 + 1 + 1 + + + 1 + 0 + 0 + 1 + + + 0 + 1 + 0 + 1 + + + 0.5 + 0 + 1 + 1 + + + 1 + 0.8 + 0 + 1 + + + 1 + 0 + 0.5 + 1 + + + 0 + 0 + 0.75 + 1 + + + 0.675 + 0.89 + 0.969 + 1 + + + 0.675 + 0.89 + 0.969 + 0.5 + + + 0.675 + 0.89 + 0.969 + 0.6 + + + 0.675 + 0.89 + 0.969 + 0.3 + + + 0.675 + 0.89 + 0.969 + 1 + + + 0.675 + 0.89 + 0.969 + 0.5 + + + 0.675 + 0.89 + 0.969 + 1 + + + 0.675 + 0.89 + 0.969 + 1 + + + 0.675 + 0.89 + 0.969 + 0.5 + + + 0.675 + 0.89 + 0.969 + 0.5 + + + 0.675 + 0.89 + 0.969 + 0.3 + + + 0.675 + 0.89 + 0.969 + 1 + + + 0.675 + 0.89 + 0.969 + 0.5 + + + 0.675 + 0.89 + 0.969 + 1 + + + 1 + 0 + 0 + 1 + + + 0 + 0 + 0 + 1 + + + 1 + 1 + 1 + 1 + + + 1 + 1 + 1 + 1 + + + 1 + 1 + 1 + 0 + + + 0 + 0 + 1 + 1 + + + 0 + 0 + 0 + 1 + + + 0.3 + 0.3 + 0.3 + 1 + + + 0 + 0 + 1 + 0.5 + + + 0.8 + 0.95 + 1 + 0.5 + + + 0.8 + 0.95 + 1 + 0.85 + + + + [Blue]BG_Default.png + [Blue]BG_Options.png + Menu.png + + CoverTile.png + CoverBackground.png + Cursor.png + TimeBar.png + TimeLine.png + Pointer.png + SelectSlide.png + SelectSlidePlayer.png + SelectSlideArrowLeft.png + SelectSlideArrowRight.png + notes_left.png + notes_mid.png + notes_right.png + notes_bg_left.png + notes_bg_mid.png + notes_bg_right.png + points_bar.png + points_bar_bg.png + Lyrics.png + LyricHelper.png + ToneHelper.png + TextBG.png + Score.png + Star.png + Snowflake.png + SongMenu.png + PerfectNoteStar.png + Pause.png + EnergyBeam.png + DuetIcon.png + VideoIcon.png + VideoIconCO.png + VideoIconBG.png + MedleyCalcIcon.png + MedleyTagIcon.png + PlayerSelector.png + PreviousIcon.png + NextIcon.png + PlayIcon.png + PauseIcon.png + RepeatIcon.png + SongMenuBG.png + Close.png + Delete.png + Save.png + Sing.png + Minus.png + Plus.png + Random.png + Popup.png + ScrollUp.png + ScrollDown.png + + + [Blue]BG_Video.mp4 + [Blue]IntroIn.mp4 + [Blue]IntroMid.mp4 + [Blue]IntroOut.mp4 + + \ No newline at end of file diff --git a/Tests/VocaluxeLib/XML/TestFiles/STheme.xml b/Tests/VocaluxeLib/XML/TestFiles/STheme.xml new file mode 100644 index 00000000..91b0c674 --- /dev/null +++ b/Tests/VocaluxeLib/XML/TestFiles/STheme.xml @@ -0,0 +1,16 @@ + + + 5 + + Ambient + bohning + 0 + 2 + + + Cursor + 40 + 40 + + + \ No newline at end of file diff --git a/Tests/VocaluxeLib/XML/TestFiles/SThemeCover.xml b/Tests/VocaluxeLib/XML/TestFiles/SThemeCover.xml new file mode 100644 index 00000000..bb43c51f --- /dev/null +++ b/Tests/VocaluxeLib/XML/TestFiles/SThemeCover.xml @@ -0,0 +1,37 @@ + + + + Blue + Blue + flokuep + + + + %TEXT% + + Normal + + 500 + + + 1 + 1 + 1 + 0.8 + + + 24 + + 100 + + + 1 + 1 + 1 + 1 + + EmptyCover.png + 0.75 + True + + \ No newline at end of file diff --git a/Tests/VocaluxeLib/XML/TestFiles/SThemeScreen.xml b/Tests/VocaluxeLib/XML/TestFiles/SThemeScreen.xml new file mode 100644 index 00000000..a6751013 --- /dev/null +++ b/Tests/VocaluxeLib/XML/TestFiles/SThemeScreen.xml @@ -0,0 +1,256 @@ + + + + ScreenMain + 2 + + + + Video + + + BG_Default + + + + + + Menu + + + 49 + 32 + 1181 + 50 + 0 + + + + TextBG + + + 150 + 610 + 355 + 30 + -1.9 + + + + + + 10 + 690 + -1 + 15 + 0 + + + Left + Center + + Normal + Vocaluxe "Shining Heaven" v0.3.0 (x64) Beta (0083) + + + 320 + 612 + -2 + 27 + 355 + + + Center + Center + + Outline + TR_SCREENMAIN_TEXT_NOPROFILES + + + + + + + + + + + + + + + + + + + \ No newline at end of file