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
+
+
+ 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