changeset 40:02dbd18b7fe9

Moved all tests into its own modules.
author Jacob Carlborg <doob@me.com>
date Sat, 06 Aug 2011 13:27:21 +0200
parents 301476d40518
children b538d02578cb
files orange/serialization/Serializer.d tests/Array.d tests/AssociativeArray.d tests/AssociativeArrayReference.d tests/Enum.d tests/Object.d tests/Pointer.d tests/Primitive.d tests/Serializer.d tests/Slice.d tests/String.d tests/Struct.d tests/Typedef.d tests/Util.d tests/_.d tests/all.d
diffstat 16 files changed, 913 insertions(+), 622 deletions(-) [+]
line wrap: on
line diff
--- a/orange/serialization/Serializer.d	Thu Aug 04 21:29:56 2011 +0200
+++ b/orange/serialization/Serializer.d	Sat Aug 06 13:27:21 2011 +0200
@@ -253,7 +253,7 @@
 				
 				else
 				{
-					static if (isSerializable!(T, Serializer))
+					static if (isSerializable!(T))
 						value.toData(this, key);
 					
 					else
@@ -390,7 +390,7 @@
 	T deserialize (T) (string key)
 	{
 		if (!hasBegunDeserializing)
-			throw new SerializationException("Cannot deserialize without any data, this method should only be called after deserialization has begun", __FILE__, __LINE__);
+			throw new SerializationException("Cannot deserialize without any data, this method should only be called after deserialization has begun.", __FILE__, __LINE__);
 		
 		return deserialize!(T)(archive.untypedData, key);
 	}
@@ -498,7 +498,7 @@
 				
 				else
 				{
-					static if (isSerializable!(T, Serializer))
+					static if (isSerializable!(T))
 						value.fromData(this, key);
 					
 					else
@@ -637,7 +637,7 @@
 				wrapper(value, this, key);
 			}
 			
-			else static if (isSerializable!(T, Serializer))
+			else static if (isSerializable!(T))
 				value.fromData(this, key);
 			
 			else
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/Array.d	Sat Aug 06 13:27:21 2011 +0200
@@ -0,0 +1,56 @@
+/**
+ * Copyright: Copyright (c) 2011 Jacob Carlborg. All rights reserved.
+ * Authors: Jacob Carlborg
+ * Version: Initial created: Aug 6, 2011
+ * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0)
+ */
+module tests.Array;
+
+import orange.core._;
+import orange.serialization.Serializer;
+import orange.serialization.archives.XMLArchive;
+import orange.test.UnitTester;
+import tests.Util;
+
+Serializer serializer;
+XMLArchive!(char) archive;
+
+class D
+{
+	int[] arr;
+}
+
+D d;
+
+unittest
+{
+	archive = new XMLArchive!(char);
+	serializer = new Serializer(archive);
+
+	d = new D;
+	d.arr = [27, 382, 283, 3820, 32, 832].dup;
+
+	describe("serialize array") in {
+		it("should return a serialized array") in {
+			serializer.reset;
+			serializer.serialize(d);
+
+			assert(archive.data().containsDefaultXmlContent());
+			assert(archive.data().containsXmlTag("object", `runtimeType="tests.Array.D" type="D" key="0" id="0"`));
+			assert(archive.data().containsXmlTag("array", `type="int" length="6" key="arr" id="1"`));
+			assert(archive.data().containsXmlTag("int", `key="0" id="2"`, "27"));
+			assert(archive.data().containsXmlTag("int", `key="1" id="3"`, "382"));
+			assert(archive.data().containsXmlTag("int", `key="2" id="4"`, "283"));
+			assert(archive.data().containsXmlTag("int", `key="3" id="5"`, "3820"));
+			assert(archive.data().containsXmlTag("int", `key="4" id="6"`, "32"));
+			assert(archive.data().containsXmlTag("int", `key="5" id="7"`, "832"));
+		};
+	};
+	
+	describe("deserialize array") in {
+		it("should return a deserialize array equal to the original array") in {
+			auto dDeserialized = serializer.deserialize!(D)(archive.untypedData);
+			assert(d.arr == dDeserialized.arr);
+		};
+	};
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/AssociativeArray.d	Sat Aug 06 13:27:21 2011 +0200
@@ -0,0 +1,75 @@
+/**
+ * Copyright: Copyright (c) 2011 Jacob Carlborg. All rights reserved.
+ * Authors: Jacob Carlborg
+ * Version: Initial created: Aug 6, 2011
+ * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0)
+ */
+module tests.AssociativeArray;
+
+import orange.core.string;
+import orange.serialization.Serializer;
+import orange.serialization.archives.XMLArchive;
+import orange.test.UnitTester;
+import tests.Util;
+
+Serializer serializer;
+XMLArchive!(char) archive;
+
+class E
+{
+	int[int] aa;
+}
+
+E e;
+
+unittest
+{
+	archive = new XMLArchive!(char);
+	serializer = new Serializer(archive);
+
+	e = new E;
+	e.aa = [3 : 4, 1 : 2, 39 : 472, 6 : 7];
+
+	describe("serialize associative array") in {
+		it("should return a serialized associative array") in {
+			serializer.reset();
+			serializer.serialize(e);
+	
+			assert(archive.data().containsDefaultXmlContent());
+			assert(archive.data().containsXmlTag("object", `runtimeType="tests.AssociativeArray.E" type="E" key="0" id="0"`));
+			version (Tango) assert(archive.data().containsXmlTag("associativeArray", `keyType="int" valueType="int" length="4" key="aa" id="1"`));
+	
+			assert(archive.data().containsXmlTag("key", `key="0"`));
+			assert(archive.data().containsXmlTag("int", `key="0" id="2"`, "1"));
+			assert(archive.data().containsXmlTag("value", `key="0"`));
+			assert(archive.data().containsXmlTag("int", `key="0" id="3"`, "2"));
+			
+			assert(archive.data().containsXmlTag("key", `key="1"`));
+			assert(archive.data().containsXmlTag("int", `key="1" id="4"`, "3"));
+			assert(archive.data().containsXmlTag("value", `key="1"`));
+			assert(archive.data().containsXmlTag("int", `key="1" id="5"`, "4"));
+			
+			assert(archive.data().containsXmlTag("key", `key="2"`));
+			assert(archive.data().containsXmlTag("int", `key="2" id="6"`, "6"));
+			assert(archive.data().containsXmlTag("value", `key="2"`));
+			assert(archive.data().containsXmlTag("int", `key="2" id="7"`, "7"));
+			
+			assert(archive.data().containsXmlTag("key", `key="3"`));
+			assert(archive.data().containsXmlTag("int", `key="3" id="8"`, "39"));
+			assert(archive.data().containsXmlTag("value", `key="3"`));
+			assert(archive.data().containsXmlTag("int", `key="3" id="9"`, "472"));
+		};
+	};
+	
+	describe("deserialize associative array") in {
+		it("should return an associative array equal to the original associative array") in {
+			auto eDeserialized = serializer.deserialize!(E)(archive.untypedData);
+			
+			foreach (k, v ; eDeserialized.aa)
+				assert(e.aa[k] == v);
+			
+			version (D_Version2)
+				assert(e.aa == eDeserialized.aa);
+		};
+	};
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/AssociativeArrayReference.d	Sat Aug 06 13:27:21 2011 +0200
@@ -0,0 +1,75 @@
+/**
+ * Copyright: Copyright (c) 2011 Jacob Carlborg. All rights reserved.
+ * Authors: Jacob Carlborg
+ * Version: Initial created: Aug 6, 2011
+ * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0)
+ */
+module tests.AssociativeArrayReference;
+
+import orange.core.string;
+import orange.serialization.Serializer;
+import orange.serialization.archives.XMLArchive;
+import orange.test.UnitTester;
+import tests.Util;
+
+Serializer serializer;
+XMLArchive!(char) archive;
+
+class K
+{
+	int[int] a;
+	int[int] b;
+}
+
+K k;
+
+unittest
+{
+	archive = new XMLArchive!(char);
+	serializer = new Serializer(archive);
+
+	k = new K;
+	k.a = [3 : 4, 1 : 2, 39 : 472, 6 : 7];
+	k.b = k.a;
+
+	describe("serialize associative array references") in {
+		it("should return a serialized associative array and a serialized reference") in {
+			serializer.reset();
+			serializer.serialize(k);
+	
+			assert(archive.data().containsDefaultXmlContent());
+			assert(archive.data().containsXmlTag("object", `runtimeType="tests.AssociativeArrayReference.K" type="K" key="0" id="0"`));
+			version (Tango) assert(archive.data().containsXmlTag("associativeArray", `keyType="int" valueType="int" length="4" key="a" id="1"`));
+	
+			assert(archive.data().containsXmlTag("key", `key="0"`));
+			assert(archive.data().containsXmlTag("int", `key="0" id="2"`, "1"));
+			assert(archive.data().containsXmlTag("value", `key="0"`));
+			assert(archive.data().containsXmlTag("int", `key="0" id="3"`, "2"));
+			
+			assert(archive.data().containsXmlTag("key", `key="1"`));
+			assert(archive.data().containsXmlTag("int", `key="1" id="4"`, "3"));
+			assert(archive.data().containsXmlTag("value", `key="1"`));
+			assert(archive.data().containsXmlTag("int", `key="1" id="5"`, "4"));
+			
+			assert(archive.data().containsXmlTag("key", `key="2"`));
+			assert(archive.data().containsXmlTag("int", `key="2" id="6"`, "6"));
+			assert(archive.data().containsXmlTag("value", `key="2"`));
+			assert(archive.data().containsXmlTag("int", `key="2" id="7"`, "7"));
+			
+			assert(archive.data().containsXmlTag("key", `key="3"`));
+			assert(archive.data().containsXmlTag("int", `key="3" id="8"`, "39"));
+			assert(archive.data().containsXmlTag("value", `key="3"`));
+			assert(archive.data().containsXmlTag("int", `key="3" id="9"`, "472"));
+	
+			assert(archive.data().containsXmlTag("reference", `key="b"`, "1"));
+		};
+	};
+	
+	describe("deserialize associative array references") in {
+		it("should return two deserialized associative arrays pointing to the same data") in {
+			auto kDeserialized = serializer.deserialize!(K)(archive.untypedData);
+			
+			assert(kDeserialized.a is kDeserialized.b);
+		};
+	};
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/Enum.d	Sat Aug 06 13:27:21 2011 +0200
@@ -0,0 +1,58 @@
+/**
+ * Copyright: Copyright (c) 2011 Jacob Carlborg. All rights reserved.
+ * Authors: Jacob Carlborg
+ * Version: Initial created: Aug 6, 2011
+ * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0)
+ */
+module tests.Enum;
+
+import orange.core.string;
+import orange.serialization.Serializer;
+import orange.serialization.archives.XMLArchive;
+import orange.test.UnitTester;
+import tests.Util;
+
+Serializer serializer;
+XMLArchive!(char) archive;
+
+enum Foo
+{
+	a,
+	b,
+	c
+}
+
+class G
+{
+	Foo foo;
+}
+
+G g;
+
+unittest
+{
+	archive = new XMLArchive!(char);
+	serializer = new Serializer(archive);
+
+	g = new G;
+	g.foo = Foo.b;
+
+	describe("serialize enum") in {
+		it("should return a serialized enum") in {
+			serializer.reset();
+			serializer.serialize(g);
+	
+			assert(archive.data().containsDefaultXmlContent());
+			assert(archive.data().containsXmlTag("object", `runtimeType="tests.Enum.G" type="G" key="0" id="0"`));
+			assert(archive.data().containsXmlTag("enum", `type="Foo" baseType="int" key="foo" id="1"`, "1"));
+		};
+	};
+	
+	
+	describe("deserialize enum") in {
+		it("should return an enum equal to the original enum") in {
+			auto gDeserialized = serializer.deserialize!(G)(archive.untypedData);
+			assert(g.foo == gDeserialized.foo);
+		};
+	};
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/Object.d	Sat Aug 06 13:27:21 2011 +0200
@@ -0,0 +1,54 @@
+/**
+ * Copyright: Copyright (c) 2011 Jacob Carlborg. All rights reserved.
+ * Authors: Jacob Carlborg
+ * Version: Initial created: Aug 6, 2011
+ * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0)
+ */
+module tests.Object;
+
+import orange.core.string;
+import orange.serialization.Serializer;
+import orange.serialization.archives.XMLArchive;
+import orange.test.UnitTester;
+import tests.Util;
+
+Serializer serializer;
+XMLArchive!(char) archive;
+
+class A
+{
+	equals_t opEquals (Object other)
+	{
+		if (auto o = cast(A) other)
+			return true;
+		
+		return false;
+	}
+}
+
+A a;
+
+unittest
+{
+	archive = new XMLArchive!(char);
+	serializer = new Serializer(archive);
+
+	a = new A;
+
+	describe("serialize object") in {
+		it("should return a serialized object") in {
+			serializer.reset;
+			serializer.serialize(a);
+	
+			assert(archive.data().containsDefaultXmlContent());
+			assert(archive.data().contains(`<object runtimeType="tests.Object.A" type="A" key="0" id="0"/>`));
+		};
+	};
+	
+	describe("deserialize object") in {
+		it("should return a deserialized object equal to the original object") in {
+			auto aDeserialized = serializer.deserialize!(A)(archive.untypedData);
+			assert(a == aDeserialized);
+		};
+	};
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/Pointer.d	Sat Aug 06 13:27:21 2011 +0200
@@ -0,0 +1,64 @@
+/**
+ * Copyright: Copyright (c) 2011 Jacob Carlborg. All rights reserved.
+ * Authors: Jacob Carlborg
+ * Version: Initial created: Aug 6, 2011
+ * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0)
+ */
+module tests.Pointer;
+
+import orange.core.string;
+import orange.serialization.Serializer;
+import orange.serialization.archives.XMLArchive;
+import orange.test.UnitTester;
+import tests.Util;
+
+Serializer serializer;
+XMLArchive!(char) archive;
+
+class F
+{
+	int value;
+	int* ptr;
+	int* ptr2;
+}
+
+F f;
+F fDeserialized;
+int pointee;
+
+unittest
+{
+	archive = new XMLArchive!(char);
+	serializer = new Serializer(archive);
+
+	pointee = 3;
+	f = new F;
+	f.value = 9;
+	f.ptr = &f.value;
+	f.ptr2 = &pointee;
+
+	describe("serialize pointer") in {
+		it("should return a serialized pointer") in {
+			serializer.reset();
+			serializer.serialize(f);
+	
+			assert(archive.data().containsDefaultXmlContent());
+			assert(archive.data().containsXmlTag("object", `runtimeType="tests.Pointer.F" type="F" key="0" id="0"`));
+			assert(archive.data().containsXmlTag("pointer", `key="ptr" id="2"`));
+			assert(archive.data().containsXmlTag("reference", `key="1"`, "1"));
+			assert(archive.data().containsXmlTag("int", `key="value" id="1"`, "9"));
+		};
+	};
+	
+	describe("deserialize pointer") in {
+		fDeserialized = serializer.deserialize!(F)(archive.untypedData);
+	
+		it("should return a deserialized pointer equal to the original pointer") in {
+			assert(*f.ptr == *fDeserialized.ptr);
+		};
+		
+		it("the pointer should point to the deserialized value") in {
+			assert(fDeserialized.ptr == &fDeserialized.value);
+		};
+	};
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/Primitive.d	Sat Aug 06 13:27:21 2011 +0200
@@ -0,0 +1,149 @@
+/**
+ * Copyright: Copyright (c) 2011 Jacob Carlborg. All rights reserved.
+ * Authors: Jacob Carlborg
+ * Version: Initial created: Aug 6, 2011
+ * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0)
+ */
+module tests.Primitive;
+
+import orange.core.string;
+import orange.serialization.Serializer;
+import orange.serialization.archives.XMLArchive;
+import orange.test.UnitTester;
+import tests.Util;
+
+Serializer serializer;
+XMLArchive!(char) archive;
+
+class H
+{
+	bool bool_;
+	byte byte_;
+	//cdouble cdouble_; // currently not suppported by to!()
+	//cent cent_; // currently not implemented but a reserved keyword
+	//cfloat cfloat_; // currently not suppported by to!()
+	char char_;
+	//creal creal_; // currently not suppported by to!()
+	dchar dchar_;
+	double double_;
+	float float_;
+	//idouble idouble_; // currently not suppported by to!()
+	//ifloat ifloat_; // currently not suppported by to!()
+	int int_;
+	//ireal ireal_;  // currently not suppported by to!()
+	long long_;
+	real real_;
+	short short_;
+	ubyte ubyte_;
+	//ucent ucent_; // currently not implemented but a reserved keyword
+	uint uint_;
+	ulong ulong_;
+	ushort ushort_;
+	
+	version (Tango)
+		wchar wchar_; // Phobos to!() function can't handle string -> wchar
+	
+	equals_t opEquals (Object other)
+	{
+		if (auto o =  cast(H) other)
+		{
+			auto result = bool_ == o.bool_ &&
+				   byte_ == o.byte_ &&
+				   //cdouble_ == o.cdouble_ && // currently not suppported by to!()
+				   //cent_ == o.cent_ && // currently not implemented but a reserved keyword
+				   //cfloat_ == o.cfloat_ && // currently not suppported by to!()
+				   char_ == o.char_ &&
+				   //creal_ == o.creal_ && // currently not suppported by to!()
+				   dchar_ == o.dchar_ &&
+				   double_ == o.double_ &&
+				   float_ == o.float_ &&
+				   //idouble_ == o.idouble_ && // currently not suppported by to!()
+				   //ifloat_ == o.ifloat_ && // currently not suppported by to!()
+				   int_ == o.int_ &&
+				   //ireal_ == o.ireal_ &&  // currently not suppported by to!()
+				   long_ == o.long_ &&
+				   real_ == o.real_ &&
+				   short_ == o.short_ &&
+				   ubyte_ == o.ubyte_ &&
+				   //ucent_ == o.ucent_ && // currently not implemented but a reserved keyword
+				   uint_ == o.uint_ &&
+				   ulong_ == o.ulong_ &&
+				   ushort_ == o.ushort_;
+				
+				   version (Tango)
+				   		return result && wchar_ == o.wchar_;
+
+				   else
+						return result;
+		}
+		
+		return false;
+	}
+}
+
+H h;
+
+unittest
+{
+	archive = new XMLArchive!(char);
+	serializer = new Serializer(archive);
+
+	h = new H;	
+	h.bool_ = true;
+	h.byte_ = 1;
+	h.char_ = 'a';
+	//h.cdouble_ = 0.0 + 0.0 * 1.0i; // currently not supported by to!() 
+	//h.cfloat_ = 0.0f + 0.0f * 1.0i; // currently not supported by to!() 
+	//h.creal_ = 0.0 + 0.0 * 1.0i; // currently not supported by to!() 
+	h.dchar_ = 'b';
+	h.double_ = 0.0;
+	h.float_ = 0.0f;
+	//h.idouble_ = 0.0 * 1.0i; // currently not supported by to!() 
+	//h.ifloat_ = 0.0f * 1.0i; // currently not supported by to!()
+	h.int_ = 1;
+	//h.ireal_ = 0.0 * 1.0i; // currently not supported by to!()
+	h.long_ = 1L;
+	h.real_ = 0.0;
+	h.short_ = 1;
+	h.ubyte_ = 1U;
+	h.uint_ = 1U;
+	h.ulong_ = 1LU;
+	h.ushort_ = 1U;
+
+	version (Tango)
+		h.wchar_ = 'c';
+
+	describe("serialize primitives") in {
+		it("should return serialized primitives") in {
+			serializer.reset;
+			serializer.serialize(h);
+	
+			assert(archive.data().containsDefaultXmlContent());
+			assert(archive.data().containsXmlTag("object", `runtimeType="tests.Primitive.H" type="H" key="0" id="0"`));
+			assert(archive.data().containsXmlTag("bool", `key="bool_" id="1"`, "true"));
+			assert(archive.data().containsXmlTag("byte", `key="byte_" id="2"`, "1"));
+			assert(archive.data().containsXmlTag("char", `key="char_" id="3"`, "a"));
+			assert(archive.data().containsXmlTag("dchar", `key="dchar_" id="4"`, "b"));
+			assert(archive.data().containsXmlTag("double", `key="double_" id="5"`, "0"));
+			assert(archive.data().containsXmlTag("float", `key="float_" id="6"`, "0"));
+			assert(archive.data().containsXmlTag("int", `key="int_" id="7"`, "1"));
+			assert(archive.data().containsXmlTag("long", `key="long_" id="8"`, "1"));
+			assert(archive.data().containsXmlTag("real", `key="real_" id="9"`, "0"));
+			assert(archive.data().containsXmlTag("short", `key="short_" id="10"`, "1"));
+			assert(archive.data().containsXmlTag("ubyte", `key="ubyte_" id="11"`, "1"));
+			assert(archive.data().containsXmlTag("uint", `key="uint_" id="12"`, "1"));
+			assert(archive.data().containsXmlTag("ulong", `key="ulong_" id="13"`, "1"));
+			assert(archive.data().containsXmlTag("ushort", `key="ushort_" id="14"`, "1"));
+			
+			version (Tango)
+				assert(archive.data().containsXmlTag("wchar", `key="wchar_" id="15"`, "c"));
+		};
+	};
+	
+	describe("deserialize primitives") in {
+		it("should return deserialized primitives equal to the original primitives") in {
+			auto hDeserialized = serializer.deserialize!(H)(archive.untypedData);
+			assert(h == hDeserialized);
+		};
+	};
+}
\ No newline at end of file
--- a/tests/Serializer.d	Thu Aug 04 21:29:56 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,617 +0,0 @@
-
-/**
- * Copyright: Copyright (c) 2010 Jacob Carlborg. All rights reserved.
- * Authors: Jacob Carlborg
- * Version: Initial created: Nov 5, 2010
- * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0)
- */
-module tests.Serializer;
-
-private:
-
-import orange.serialization.Serializer;
-import orange.serialization.archives.XMLArchive;
-import orange.core.io;
-import orange.core.string;
-
-bool containsDefaultXmlContent (string source)
-{
-	return source.containsXmlHeader() &&
-		   source.containsArchive() &&
-		   source.containsXmlTag("data");
-}
-
-bool containsXmlHeader (string source)
-{
-	return source.contains(`<?xml version="1.0" encoding="UTF-8"?>`);
-}
-
-bool containsArchive (string source)
-{
-	return source.containsArchiveHeader() && source.contains("</archive>");
-}
-
-bool containsArchiveHeader (string source)
-{
-	return source.contains(`<archive type="org.dsource.orange.xml" version="1.0.0">`) ||
-		source.contains(`<archive version="1.0.0" type="org.dsource.orange.xml">`);
-}
-
-bool containsXmlTag (string source, string tag, bool simple = false)
-{
-	return source.containsXmlTag(tag, null, null, simple);
-}
-
-bool containsXmlTag (string source, string tag, string attributes, bool simple = false)
-{
-	return source.containsXmlTag(tag, attributes, null, simple);
-}
-
-bool containsXmlTag (string source, string tag, string attributes, string content, bool simple = false)
-{
-	string pattern = '<' ~ tag;
-		
-	if (attributes.length > 0)
-		pattern ~= ' ' ~ attributes;
-	
-	if (simple)
-		return source.contains(pattern ~ "/>");
-
-	if (content.length > 0)
-		return source.contains(pattern ~ '>' ~ content ~ "</" ~ tag ~ '>');
-
-	return source.contains(pattern ~ '>') && source.contains("</" ~ tag ~ '>');
-}
-
-enum Foo { a, b, c }
-typedef int Int;
-
-class A
-{
-	equals_t opEquals (Object other)
-	{
-		if (auto o = cast(A) other)
-			return true;
-		
-		return false;
-	}
-}
-
-struct B
-{
-	version (Tango)
-	{
-		equals_t opEquals (B b)
-		{
-			return true;
-		}
-	}
-	
-	else
-	{
-		mixin(`bool opEquals (ref const B) const
-		{
-			return true;
-		}`);
-	}
-}
-
-class C { string str; wstring wstr; dstring dstr; }
-class D { int[] arr; }
-class E { int[int] aa; }
-class F { int value; int* ptr; int* ptr2; }
-class G { Foo foo; }
-
-int pointee;
-
-class H
-{
-	bool bool_;
-	byte byte_;
-	//cdouble cdouble_; // currently not suppported by to!()
-	//cent cent_; // currently not implemented but a reserved keyword
-	//cfloat cfloat_; // currently not suppported by to!()
-	char char_;
-	//creal creal_; // currently not suppported by to!()
-	dchar dchar_;
-	double double_;
-	float float_;
-	//idouble idouble_; // currently not suppported by to!()
-	//ifloat ifloat_; // currently not suppported by to!()
-	int int_;
-	//ireal ireal_;  // currently not suppported by to!()
-	long long_;
-	real real_;
-	short short_;
-	ubyte ubyte_;
-	//ucent ucent_; // currently not implemented but a reserved keyword
-	uint uint_;
-	ulong ulong_;
-	ushort ushort_;
-	
-	version (Tango)
-		wchar wchar_; // Phobos to!() function can't handle string -> wchar
-	
-	equals_t opEquals (Object other)
-	{
-		if (auto o =  cast(H) other)
-		{
-			auto result = bool_ == o.bool_ &&
-				   byte_ == o.byte_ &&
-				   //cdouble_ == o.cdouble_ && // currently not suppported by to!()
-				   //cent_ == o.cent_ && // currently not implemented but a reserved keyword
-				   //cfloat_ == o.cfloat_ && // currently not suppported by to!()
-				   char_ == o.char_ &&
-				   //creal_ == o.creal_ && // currently not suppported by to!()
-				   dchar_ == o.dchar_ &&
-				   double_ == o.double_ &&
-				   float_ == o.float_ &&
-				   //idouble_ == o.idouble_ && // currently not suppported by to!()
-				   //ifloat_ == o.ifloat_ && // currently not suppported by to!()
-				   int_ == o.int_ &&
-				   //ireal_ == o.ireal_ &&  // currently not suppported by to!()
-				   long_ == o.long_ &&
-				   real_ == o.real_ &&
-				   short_ == o.short_ &&
-				   ubyte_ == o.ubyte_ &&
-				   //ucent_ == o.ucent_ && // currently not implemented but a reserved keyword
-				   uint_ == o.uint_ &&
-				   ulong_ == o.ulong_ &&
-				   ushort_ == o.ushort_;
-				
-				   version (Tango)
-				   		return result && wchar_ == o.wchar_;
-
-				   else
-						return result;
-		}
-		
-		return false;
-	}
-}
-
-class I
-{
-	Int a;
-}
-
-class J
-{
-	int[] firstSource;
-	int[] firstSlice;
-	
-	int[] secondSlice;
-	int[] secondSource;
-}
-
-class K
-{
-	int[int] a;
-	int[int] b;
-}
-
-import orange.test.UnitTester;
-Serializer serializer;
-XMLArchive!(char) archive;
-
-A a;
-B b;
-C c;
-D d;
-E e;
-F f;
-F fDeserialized;
-G g;
-H h;
-I i;
-J j;
-J jDeserialized;
-K k;
-
-string data;
-
-unittest
-{
-	archive = new XMLArchive!(char);
-	serializer = new Serializer(archive);
-	
-	a = new A;
-	
-	c = new C;
-	c.str = "foo";
-	c.wstr = "bar";
-	c.dstr = "foobar";
-	
-	
-	d = new D;
-	d.arr = [27, 382, 283, 3820, 32, 832].dup;
-	
-	e = new E;
-	e.aa = [3 : 4, 1 : 2, 39 : 472, 6 : 7];
-	
-	pointee = 3;
-	f = new F;
-	f.value = 9;
-	f.ptr = &f.value;
-	f.ptr2 = &pointee;
-	
-	g = new G;
-	g.foo = Foo.b;
-	
-	h = new H;	
-	h.bool_ = true;
-	h.byte_ = 1;
-	h.char_ = 'a';
-	//h.cdouble_ = 0.0 + 0.0 * 1.0i; // currently not supported by to!() 
-	//h.cfloat_ = 0.0f + 0.0f * 1.0i; // currently not supported by to!() 
-	//h.creal_ = 0.0 + 0.0 * 1.0i; // currently not supported by to!() 
-	h.dchar_ = 'b';
-	h.double_ = 0.0;
-	h.float_ = 0.0f;
-	//h.idouble_ = 0.0 * 1.0i; // currently not supported by to!() 
-	//h.ifloat_ = 0.0f * 1.0i; // currently not supported by to!()
-	h.int_ = 1;
-	//h.ireal_ = 0.0 * 1.0i; // currently not supported by to!()
-	h.long_ = 1L;
-	h.real_ = 0.0;
-	h.short_ = 1;
-	h.ubyte_ = 1U;
-	h.uint_ = 1U;
-	h.ulong_ = 1LU;
-	h.ushort_ = 1U;
-	
-	version (Tango)
-		h.wchar_ = 'c';
-	
-	i = new I;
-	i.a = 1;
-	
-	j = new J;
-	j.firstSource = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].dup;
-	j.firstSlice = j.firstSource[3 .. 7];
-	j.secondSource = [10, 11, 12, 13, 14, 15].dup;
-	j.secondSlice = j.secondSource[1 .. 4];
-	
-	k = new K;
-	k.a = [3 : 4, 1 : 2, 39 : 472, 6 : 7];
-	k.b = k.a;
-	
-	describe("Serializer") in {
-		describe("serialize object") in {
-			it("should return a serialized object") in {
-				serializer.reset;
-				serializer.serialize(a);
-
-				assert(archive.data().containsDefaultXmlContent());
-				assert(archive.data().contains(`<object runtimeType="tests.Serializer.A" type="A" key="0" id="0"/>`));
-			};
-		};
-		
-		describe("deserialize object") in {
-			it("should return a deserialized object equal to the original object") in {
-				auto aDeserialized = serializer.deserialize!(A)(archive.data);
-				assert(a == aDeserialized);
-			};
-		};
-		
-		describe("serialize struct") in {
-			it("should return a serialized struct") in {
-				serializer.reset;
-				serializer.serialize(B());
-
-				assert(archive.data().containsDefaultXmlContent());
-				assert(archive.data().contains(`<struct type="B" key="0" id="0"/>`));
-			};
-		};
-		
-		describe("deserialize struct") in {
-			it("should return a deserialized struct equal to the original struct") in {
-				auto bDeserialized = serializer.deserialize!(B)(archive.data);
-				assert(b == bDeserialized);
-			};
-		};
-		
-		describe("serialize strings") in {
-			it("should return serialized strings") in {
-				serializer.reset;
-				serializer.serialize(c);
-
-				assert(archive.data().containsDefaultXmlContent());
-				assert(archive.data().containsXmlTag("object", `runtimeType="tests.Serializer.C" type="C" key="0" id="0"`));
-				
-				version (Tango) string type = "char";
-				else string type = "immutable(char)";
-
-				assert(archive.data().containsXmlTag("string", `type="` ~ type ~ `" length="3" key="str" id="1"`, "foo"));
-				
-				version (Tango) type = "wchar";
-				else type = "immutable(wchar)";
-
-				assert(archive.data().containsXmlTag("string", `type="` ~ type ~ `" length="3" key="wstr" id="2"`, "bar"));
-				
-				version (Tango) type = "dchar";
-				else type = "immutable(dchar)";
-				
-				assert(archive.data().containsXmlTag("string", `type="` ~ type ~ `" length="6" key="dstr" id="3"`, "foobar"));
-			};
-		};
-		
-		describe("deserialize string") in {
-			it("should return a deserialized string equal to the original string") in {
-				auto cDeserialized = serializer.deserialize!(C)(archive.data);
-				assert(c.str == cDeserialized.str);
-			};
-		};
-		
-		describe("serialize array") in {
-			it("should return a serialized array") in {
-				serializer.reset;
-				serializer.serialize(d);
-
-				assert(archive.data().containsDefaultXmlContent());
-				assert(archive.data().containsXmlTag("object", `runtimeType="tests.Serializer.D" type="D" key="0" id="0"`));
-				assert(archive.data().containsXmlTag("array", `type="int" length="6" key="arr" id="1"`));
-				assert(archive.data().containsXmlTag("int", `key="0" id="2"`, "27"));
-				assert(archive.data().containsXmlTag("int", `key="1" id="3"`, "382"));
-				assert(archive.data().containsXmlTag("int", `key="2" id="4"`, "283"));
-				assert(archive.data().containsXmlTag("int", `key="3" id="5"`, "3820"));
-				assert(archive.data().containsXmlTag("int", `key="4" id="6"`, "32"));
-				assert(archive.data().containsXmlTag("int", `key="5" id="7"`, "832"));
-			};
-		};
-		
-		describe("deserialize array") in {
-			it("should return a deserialize array equal to the original array") in {
-				auto dDeserialized = serializer.deserialize!(D)(archive.data);
-				assert(d.arr == dDeserialized.arr);
-			};
-		};
-		
-		describe("serialize associative array") in {
-			it("should return a serialized associative array") in {
-				serializer.reset();
-				serializer.serialize(e);
-
-				assert(archive.data().containsDefaultXmlContent());
-				assert(archive.data().containsXmlTag("object", `runtimeType="tests.Serializer.E" type="E" key="0" id="0"`));
-				version (Tango) assert(archive.data().containsXmlTag("associativeArray", `keyType="int" valueType="int" length="4" key="aa" id="1"`));
-
-				assert(archive.data().containsXmlTag("key", `key="0"`));
-				assert(archive.data().containsXmlTag("int", `key="0" id="2"`, "1"));
-				assert(archive.data().containsXmlTag("value", `key="0"`));
-				assert(archive.data().containsXmlTag("int", `key="0" id="3"`, "2"));
-				
-				assert(archive.data().containsXmlTag("key", `key="1"`));
-				assert(archive.data().containsXmlTag("int", `key="1" id="4"`, "3"));
-				assert(archive.data().containsXmlTag("value", `key="1"`));
-				assert(archive.data().containsXmlTag("int", `key="1" id="5"`, "4"));
-				
-				assert(archive.data().containsXmlTag("key", `key="2"`));
-				assert(archive.data().containsXmlTag("int", `key="2" id="6"`, "6"));
-				assert(archive.data().containsXmlTag("value", `key="2"`));
-				assert(archive.data().containsXmlTag("int", `key="2" id="7"`, "7"));
-				
-				assert(archive.data().containsXmlTag("key", `key="3"`));
-				assert(archive.data().containsXmlTag("int", `key="3" id="8"`, "39"));
-				assert(archive.data().containsXmlTag("value", `key="3"`));
-				assert(archive.data().containsXmlTag("int", `key="3" id="9"`, "472"));
-			};
-		};
-		
-		describe("deserialize associative array") in {
-			it("should return an associative array equal to the original associative array") in {
-				auto eDeserialized = serializer.deserialize!(E)(archive.data);
-				
-				foreach (k, v ; eDeserialized.aa)
-					assert(e.aa[k] == v);
-				
-				version (D_Version2)
-					assert(e.aa == eDeserialized.aa);
-			};
-		};
-		
-		describe("serialize pointer") in {
-			it("should return a serialized pointer") in {
-				serializer.reset();
-				serializer.serialize(f);
-
-				assert(archive.data().containsDefaultXmlContent());
-				assert(archive.data().containsXmlTag("object", `runtimeType="tests.Serializer.F" type="F" key="0" id="0"`));
-				assert(archive.data().containsXmlTag("pointer", `key="ptr" id="2"`));
-				assert(archive.data().containsXmlTag("reference", `key="1"`, "1"));
-				assert(archive.data().containsXmlTag("int", `key="value" id="1"`, "9"));
-			};
-		};
-		
-		describe("deserialize pointer") in {
-			fDeserialized = serializer.deserialize!(F)(archive.data);
-
-			it("should return a deserialized pointer equal to the original pointer") in {
-				assert(*f.ptr == *fDeserialized.ptr);
-			};
-			
-			it("the pointer should point to the deserialized value") in {
-				assert(fDeserialized.ptr == &fDeserialized.value);
-			};
-		};
-		
-		describe("serialize enum") in {
-			it("should return a serialized enum") in {
-				serializer.reset();
-				serializer.serialize(g);
-
-				assert(archive.data().containsDefaultXmlContent());
-				assert(archive.data().containsXmlTag("object", `runtimeType="tests.Serializer.G" type="G" key="0" id="0"`));
-				assert(archive.data().containsXmlTag("enum", `type="Foo" baseType="int" key="foo" id="1"`, "1"));
-			};
-		};
-
-		
-		describe("deserialize enum") in {
-			it("should return an enum equal to the original enum") in {
-				auto gDeserialized = serializer.deserialize!(G)(archive.data);
-				assert(g.foo == gDeserialized.foo);
-			};
-		};
-		
-		describe("serialize primitives") in {
-			it("should return serialized primitives") in {
-				serializer.reset;
-				serializer.serialize(h);
-
-				assert(archive.data().containsDefaultXmlContent());
-				assert(archive.data().containsXmlTag("object", `runtimeType="tests.Serializer.H" type="H" key="0" id="0"`));
-				assert(archive.data().containsXmlTag("bool", `key="bool_" id="1"`, "true"));
-				assert(archive.data().containsXmlTag("byte", `key="byte_" id="2"`, "1"));
-				assert(archive.data().containsXmlTag("char", `key="char_" id="3"`, "a"));
-				assert(archive.data().containsXmlTag("dchar", `key="dchar_" id="4"`, "b"));
-				assert(archive.data().containsXmlTag("double", `key="double_" id="5"`, "0"));
-				assert(archive.data().containsXmlTag("float", `key="float_" id="6"`, "0"));
-				assert(archive.data().containsXmlTag("int", `key="int_" id="7"`, "1"));
-				assert(archive.data().containsXmlTag("long", `key="long_" id="8"`, "1"));
-				assert(archive.data().containsXmlTag("real", `key="real_" id="9"`, "0"));
-				assert(archive.data().containsXmlTag("short", `key="short_" id="10"`, "1"));
-				assert(archive.data().containsXmlTag("ubyte", `key="ubyte_" id="11"`, "1"));
-				assert(archive.data().containsXmlTag("uint", `key="uint_" id="12"`, "1"));
-				assert(archive.data().containsXmlTag("ulong", `key="ulong_" id="13"`, "1"));
-				assert(archive.data().containsXmlTag("ushort", `key="ushort_" id="14"`, "1"));
-				
-				version (Tango)
-					assert(archive.data().containsXmlTag("wchar", `key="wchar_" id="15"`, "c"));
-			};
-		};
-		
-		describe("deserialize primitives") in {
-			it("should return deserialized primitives equal to the original primitives") in {
-				auto hDeserialized = serializer.deserialize!(H)(archive.data);
-				assert(h == hDeserialized);
-			};
-		};
-		
-		describe("serialize typedef") in {
-			it("should return a serialized typedef") in {
-				serializer.reset();
-				serializer.serialize(i);
-				assert(archive.data().containsDefaultXmlContent());
-				assert(archive.data().containsXmlTag("object", `runtimeType="tests.Serializer.I" type="I" key="0" id="0"`));
-				assert(archive.data().containsXmlTag("typedef", `type="Int" key="a" id="2"`));
-				assert(archive.data().containsXmlTag("int", `key="1" id="3"`, "1"));
-			};
-		};
-		
-		// describe("deserialize typedef") in {
-		// 	it("should return a deserialized typedef equal to the original typedef") in {
-		// 		auto iDeserialized = serializer.deserialize!(I)(archive.data);
-		// 		assert(i.a == iDeserialized.a);
-		// 	};
-		// };
-		
-		describe("serialize slices") in {
-			it("should return serialized slices") in {
-				serializer.reset();
-				serializer.serialize(j);
-
-				assert(archive.data().containsDefaultXmlContent());
-				assert(archive.data().containsXmlTag("object", `runtimeType="tests.Serializer.J" type="J" key="0" id="0"`));
-				assert(archive.data().containsXmlTag("array", `type="int" length="10" key="firstSource" id="1"`));
-				
-				assert(archive.data().containsXmlTag("int", `key="0" id="2"`, "0"));
-				assert(archive.data().containsXmlTag("int", `key="1" id="3"`, "1"));
-				assert(archive.data().containsXmlTag("int", `key="2" id="4"`, "2"));
-				assert(archive.data().containsXmlTag("int", `key="3" id="5"`, "3"));
-				assert(archive.data().containsXmlTag("int", `key="4" id="6"`, "4"));
-				assert(archive.data().containsXmlTag("int", `key="5" id="7"`, "5"));
-				assert(archive.data().containsXmlTag("int", `key="6" id="8"`, "6"));
-				assert(archive.data().containsXmlTag("int", `key="7" id="9"`, "7"));
-				assert(archive.data().containsXmlTag("int", `key="8" id="10"`, "8"));
-				assert(archive.data().containsXmlTag("int", `key="9" id="11"`, "9"));
-
-				version (Tango)
-				{
-					assert(archive.data().containsXmlTag("slice", `key="firstSlice" offset="3" length="4"`, "1"));
-					assert(archive.data().containsXmlTag("slice", `key="secondSlice" offset="1" length="3"`, "21"));
-				}
-
-				assert(archive.data().containsXmlTag("array", `type="int" length="6" key="secondSource" id="21"`));
-				
-				assert(archive.data().containsXmlTag("int", `key="0" id="22"`, "10"));
-				assert(archive.data().containsXmlTag("int", `key="1" id="23"`, "11"));
-				assert(archive.data().containsXmlTag("int", `key="2" id="24"`, "12"));
-				assert(archive.data().containsXmlTag("int", `key="3" id="25"`, "13"));
-				assert(archive.data().containsXmlTag("int", `key="4" id="26"`, "14"));
-				assert(archive.data().containsXmlTag("int", `key="5" id="27"`, "15"));
-			};
-		};
-		
-		describe("deserialize slices") in {
-			jDeserialized = serializer.deserialize!(J)(archive.data);
-			
-			it("should return deserialized strings equal to the original strings") in {
-				assert(j.firstSource == jDeserialized.firstSource);
-				assert(j.secondSource == jDeserialized.secondSource);
-			};
-			
-			it("should return deserialized slices equal to the original slices") in {
-				assert(j.firstSlice == jDeserialized.firstSlice);
-				assert(j.secondSlice == jDeserialized.secondSlice);
-			};
-			
-			it("the slices should be equal to a slice of the original sources") in {
-				assert(jDeserialized.firstSource[3 .. 7] == jDeserialized.firstSlice);
-				assert(jDeserialized.secondSource[1 .. 4] == jDeserialized.secondSlice);
-				
-				assert(j.firstSource[3 .. 7] == jDeserialized.firstSlice);
-				assert(j.secondSource[1 .. 4] == jDeserialized.secondSlice);
-			};
-			
-			it("the slices should be able to modify the sources") in {
-				jDeserialized.firstSlice[0] = 55;
-				jDeserialized.secondSlice[0] = 3;
-
-				assert(jDeserialized.firstSource == [0, 1, 2, 55, 4, 5, 6, 7, 8, 9]);
-				assert(jDeserialized.secondSource == [10, 3, 12, 13, 14, 15]);
-			};
-		};
-		
-		describe("serialize associative array references") in {
-			it("should return a serialized associative array and a serialized reference") in {
-				serializer.reset();
-				serializer.serialize(k);
-
-				assert(archive.data().containsDefaultXmlContent());
-				assert(archive.data().containsXmlTag("object", `runtimeType="tests.Serializer.K" type="K" key="0" id="0"`));
-				version (Tango) assert(archive.data().containsXmlTag("associativeArray", `keyType="int" valueType="int" length="4" key="a" id="1"`));
-
-				assert(archive.data().containsXmlTag("key", `key="0"`));
-				assert(archive.data().containsXmlTag("int", `key="0" id="2"`, "1"));
-				assert(archive.data().containsXmlTag("value", `key="0"`));
-				assert(archive.data().containsXmlTag("int", `key="0" id="3"`, "2"));
-				
-				assert(archive.data().containsXmlTag("key", `key="1"`));
-				assert(archive.data().containsXmlTag("int", `key="1" id="4"`, "3"));
-				assert(archive.data().containsXmlTag("value", `key="1"`));
-				assert(archive.data().containsXmlTag("int", `key="1" id="5"`, "4"));
-				
-				assert(archive.data().containsXmlTag("key", `key="2"`));
-				assert(archive.data().containsXmlTag("int", `key="2" id="6"`, "6"));
-				assert(archive.data().containsXmlTag("value", `key="2"`));
-				assert(archive.data().containsXmlTag("int", `key="2" id="7"`, "7"));
-				
-				assert(archive.data().containsXmlTag("key", `key="3"`));
-				assert(archive.data().containsXmlTag("int", `key="3" id="8"`, "39"));
-				assert(archive.data().containsXmlTag("value", `key="3"`));
-				assert(archive.data().containsXmlTag("int", `key="3" id="9"`, "472"));
-
-				assert(archive.data().containsXmlTag("reference", `key="b"`, "1"));
-			};
-		};
-		
-		describe("deserialize associative array references") in {
-			it("should return two deserialized associative arrays pointing to the same data") in {
-				auto kDeserialized = serializer.deserialize!(K)(archive.data);
-				
-				assert(kDeserialized.a is kDeserialized.b);
-			};
-		};
-	};
-}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/Slice.d	Sat Aug 06 13:27:21 2011 +0200
@@ -0,0 +1,107 @@
+/**
+ * Copyright: Copyright (c) 2011 Jacob Carlborg. All rights reserved.
+ * Authors: Jacob Carlborg
+ * Version: Initial created: Aug 6, 2011
+ * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0)
+ */
+module tests.Slice;
+
+import orange.core.string;
+import orange.serialization.Serializer;
+import orange.serialization.archives.XMLArchive;
+import orange.test.UnitTester;
+import tests.Util;
+
+Serializer serializer;
+XMLArchive!(char) archive;
+
+class J
+{
+	int[] firstSource;
+	int[] firstSlice;
+	
+	int[] secondSlice;
+	int[] secondSource;
+}
+
+J j;
+J jDeserialized;
+
+unittest
+{
+	archive = new XMLArchive!(char);
+	serializer = new Serializer(archive);
+
+	j = new J;
+	j.firstSource = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].dup;
+	j.firstSlice = j.firstSource[3 .. 7];
+	j.secondSource = [10, 11, 12, 13, 14, 15].dup;
+	j.secondSlice = j.secondSource[1 .. 4];
+
+	describe("serialize slices") in {
+		it("should return serialized slices") in {
+			serializer.reset();
+			serializer.serialize(j);
+	
+			assert(archive.data().containsDefaultXmlContent());
+			assert(archive.data().containsXmlTag("object", `runtimeType="tests.Slice.J" type="J" key="0" id="0"`));
+			assert(archive.data().containsXmlTag("array", `type="int" length="10" key="firstSource" id="1"`));
+	
+			assert(archive.data().containsXmlTag("int", `key="0" id="2"`, "0"));
+			assert(archive.data().containsXmlTag("int", `key="1" id="3"`, "1"));
+			assert(archive.data().containsXmlTag("int", `key="2" id="4"`, "2"));
+			assert(archive.data().containsXmlTag("int", `key="3" id="5"`, "3"));
+			assert(archive.data().containsXmlTag("int", `key="4" id="6"`, "4"));
+			assert(archive.data().containsXmlTag("int", `key="5" id="7"`, "5"));
+			assert(archive.data().containsXmlTag("int", `key="6" id="8"`, "6"));
+			assert(archive.data().containsXmlTag("int", `key="7" id="9"`, "7"));
+			assert(archive.data().containsXmlTag("int", `key="8" id="10"`, "8"));
+			assert(archive.data().containsXmlTag("int", `key="9" id="11"`, "9"));
+	
+			version (Tango)
+			{
+				assert(archive.data().containsXmlTag("slice", `key="firstSlice" offset="3" length="4"`, "1"));
+				assert(archive.data().containsXmlTag("slice", `key="secondSlice" offset="1" length="3"`, "21"));
+			}
+	
+			assert(archive.data().containsXmlTag("array", `type="int" length="6" key="secondSource" id="21"`));
+	
+			assert(archive.data().containsXmlTag("int", `key="0" id="22"`, "10"));
+			assert(archive.data().containsXmlTag("int", `key="1" id="23"`, "11"));
+			assert(archive.data().containsXmlTag("int", `key="2" id="24"`, "12"));
+			assert(archive.data().containsXmlTag("int", `key="3" id="25"`, "13"));
+			assert(archive.data().containsXmlTag("int", `key="4" id="26"`, "14"));
+			assert(archive.data().containsXmlTag("int", `key="5" id="27"`, "15"));
+		};
+	};
+	
+	describe("deserialize slices") in {
+		jDeserialized = serializer.deserialize!(J)(archive.untypedData);
+	
+		it("should return deserialized strings equal to the original strings") in {
+			assert(j.firstSource == jDeserialized.firstSource);
+			assert(j.secondSource == jDeserialized.secondSource);
+		};
+	
+		it("should return deserialized slices equal to the original slices") in {
+			assert(j.firstSlice == jDeserialized.firstSlice);
+			assert(j.secondSlice == jDeserialized.secondSlice);
+		};
+	
+		it("the slices should be equal to a slice of the original sources") in {
+			assert(jDeserialized.firstSource[3 .. 7] == jDeserialized.firstSlice);
+			assert(jDeserialized.secondSource[1 .. 4] == jDeserialized.secondSlice);
+	
+			assert(j.firstSource[3 .. 7] == jDeserialized.firstSlice);
+			assert(j.secondSource[1 .. 4] == jDeserialized.secondSlice);
+		};
+	
+		it("the slices should be able to modify the sources") in {
+			jDeserialized.firstSlice[0] = 55;
+			jDeserialized.secondSlice[0] = 3;
+	
+			assert(jDeserialized.firstSource == [0, 1, 2, 55, 4, 5, 6, 7, 8, 9]);
+			assert(jDeserialized.secondSource == [10, 3, 12, 13, 14, 15]);
+		};
+	};
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/String.d	Sat Aug 06 13:27:21 2011 +0200
@@ -0,0 +1,71 @@
+/**
+ * Copyright: Copyright (c) 2011 Jacob Carlborg. All rights reserved.
+ * Authors: Jacob Carlborg
+ * Version: Initial created: Aug 6, 2011
+ * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0)
+ */
+module tests.String;
+
+import orange.core.string;
+import orange.serialization.Serializer;
+import orange.serialization.archives.XMLArchive;
+import orange.test.UnitTester;
+import tests.Util;
+
+Serializer serializer;
+XMLArchive!(char) archive;
+
+class C
+{
+	string str;
+	wstring wstr;
+	dstring dstr;
+}
+
+C c;
+
+unittest
+{
+	archive = new XMLArchive!(char);
+	serializer = new Serializer(archive);
+
+	c = new C;
+	c.str = "foo";
+	c.wstr = "bar";
+	c.dstr = "foobar";
+
+	describe("serialize strings") in {
+		it("should return serialized strings") in {
+			serializer.reset;
+			serializer.serialize(c);
+	
+			assert(archive.data().containsDefaultXmlContent());
+			assert(archive.data().containsXmlTag("object", `runtimeType="tests.String.C" type="C" key="0" id="0"`));
+			
+			version (Tango) string type = "char";
+			else string type = "immutable(char)";
+	
+			assert(archive.data().containsXmlTag("string", `type="` ~ type ~ `" length="3" key="str" id="1"`, "foo"));
+			
+			version (Tango) type = "wchar";
+			else type = "immutable(wchar)";
+	
+			assert(archive.data().containsXmlTag("string", `type="` ~ type ~ `" length="3" key="wstr" id="2"`, "bar"));
+			
+			version (Tango) type = "dchar";
+			else type = "immutable(dchar)";
+			
+			assert(archive.data().containsXmlTag("string", `type="` ~ type ~ `" length="6" key="dstr" id="3"`, "foobar"));
+		};
+	};
+	
+	describe("deserialize string") in {
+		it("should return a deserialized string equal to the original string") in {
+			auto cDeserialized = serializer.deserialize!(C)(archive.untypedData);
+
+			assert(c.str == cDeserialized.str);
+			assert(c.wstr == cDeserialized.wstr);
+			assert(c.dstr == cDeserialized.dstr);
+		};
+	};
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/Struct.d	Sat Aug 06 13:27:21 2011 +0200
@@ -0,0 +1,60 @@
+/**
+ * Copyright: Copyright (c) 2011 Jacob Carlborg. All rights reserved.
+ * Authors: Jacob Carlborg
+ * Version: Initial created: Aug 6, 2011
+ * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0)
+ */
+module tests.Struct;
+
+import orange.core.string;
+import orange.serialization.Serializer;
+import orange.serialization.archives.XMLArchive;
+import orange.test.UnitTester;
+import tests.Util;
+
+Serializer serializer;
+XMLArchive!(char) archive;
+
+struct B
+{
+	version (Tango)
+	{
+		equals_t opEquals (B b)
+		{
+			return true;
+		}
+	}
+	
+	else
+	{
+		mixin(`bool opEquals (ref const B) const
+		{
+			return true;
+		}`);
+	}
+}
+
+B b;
+
+unittest
+{
+	archive = new XMLArchive!(char);
+	serializer = new Serializer(archive);
+
+	describe("serialize struct") in {
+		it("should return a serialized struct") in {
+			serializer.reset;
+			serializer.serialize(B());
+	
+			assert(archive.data().containsDefaultXmlContent());
+			assert(archive.data().contains(`<struct type="B" key="0" id="0"/>`));
+		};
+	};
+	
+	describe("deserialize struct") in {
+		it("should return a deserialized struct equal to the original struct") in {
+			auto bDeserialized = serializer.deserialize!(B)(archive.untypedData);
+			assert(b == bDeserialized);
+		};
+	};
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/Typedef.d	Sat Aug 06 13:27:21 2011 +0200
@@ -0,0 +1,52 @@
+/**
+ * Copyright: Copyright (c) 2011 Jacob Carlborg. All rights reserved.
+ * Authors: Jacob Carlborg
+ * Version: Initial created: Aug 6, 2011
+ * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0)
+ */
+module tests.Typedef;
+
+import orange.core.string;
+import orange.serialization.Serializer;
+import orange.serialization.archives.XMLArchive;
+import orange.test.UnitTester;
+import tests.Util;
+
+Serializer serializer;
+XMLArchive!(char) archive;
+
+typedef int Int;
+
+class I
+{
+	Int a;
+}
+
+I i;
+
+unittest
+{
+	archive = new XMLArchive!(char);
+	serializer = new Serializer(archive);
+
+	i = new I;
+	i.a = 1;
+
+	describe("serialize typedef") in {
+		it("should return a serialized typedef") in {
+			serializer.reset();
+			serializer.serialize(i);
+			assert(archive.data().containsDefaultXmlContent());
+			assert(archive.data().containsXmlTag("object", `runtimeType="tests.Typedef.I" type="I" key="0" id="0"`));
+			assert(archive.data().containsXmlTag("typedef", `type="Int" key="a" id="2"`));
+			assert(archive.data().containsXmlTag("int", `key="1" id="3"`, "1"));
+		};
+	};
+	
+	// describe("deserialize typedef") in {
+	// 	it("should return a deserialized typedef equal to the original typedef") in {
+	// 		auto iDeserialized = serializer.deserialize!(I)(archive.untypedData);
+	// 		assert(i.a == iDeserialized.a);
+	// 	};
+	// };
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/Util.d	Sat Aug 06 13:27:21 2011 +0200
@@ -0,0 +1,58 @@
+/**
+ * Copyright: Copyright (c) 2011 Jacob Carlborg. All rights reserved.
+ * Authors: Jacob Carlborg
+ * Version: Initial created: Aug 6, 2011
+ * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0)
+ */
+module tests.Util;
+
+import orange.core.string;
+
+bool containsDefaultXmlContent (string source)
+{
+	return source.containsXmlHeader() &&
+		   source.containsArchive() &&
+		   source.containsXmlTag("data");
+}
+
+bool containsXmlHeader (string source)
+{
+	return source.contains(`<?xml version="1.0" encoding="UTF-8"?>`);
+}
+
+bool containsArchive (string source)
+{
+	return source.containsArchiveHeader() && source.contains("</archive>");
+}
+
+bool containsArchiveHeader (string source)
+{
+	return source.contains(`<archive type="org.dsource.orange.xml" version="1.0.0">`) ||
+		source.contains(`<archive version="1.0.0" type="org.dsource.orange.xml">`);
+}
+
+bool containsXmlTag (string source, string tag, bool simple = false)
+{
+	return source.containsXmlTag(tag, null, null, simple);
+}
+
+bool containsXmlTag (string source, string tag, string attributes, bool simple = false)
+{
+	return source.containsXmlTag(tag, attributes, null, simple);
+}
+
+bool containsXmlTag (string source, string tag, string attributes, string content, bool simple = false)
+{
+	string pattern = '<' ~ tag;
+		
+	if (attributes.length > 0)
+		pattern ~= ' ' ~ attributes;
+	
+	if (simple)
+		return source.contains(pattern ~ "/>");
+
+	if (content.length > 0)
+		return source.contains(pattern ~ '>' ~ content ~ "</" ~ tag ~ '>');
+
+	return source.contains(pattern ~ '>') && source.contains("</" ~ tag ~ '>');
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/_.d	Sat Aug 06 13:27:21 2011 +0200
@@ -0,0 +1,23 @@
+/**
+ * Copyright: Copyright (c) 2011 Jacob Carlborg. All rights reserved.
+ * Authors: Jacob Carlborg
+ * Version: Initial created: Aug 6, 2011
+ * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0)
+ */
+module tests._;
+
+public:
+
+import tests.all;
+import tests.Array;
+import tests.AssociativeArray;
+import tests.AssociativeArrayReference;
+import tests.Enum;
+import tests.Object;
+import tests.Pointer;
+import tests.Primitive;
+import tests.Slice;
+import tests.String;
+import tests.Struct;
+import tests.Typedef;
+import tests.Util;
\ No newline at end of file
--- a/tests/all.d	Thu Aug 04 21:29:56 2011 +0200
+++ b/tests/all.d	Sat Aug 06 13:27:21 2011 +0200
@@ -7,7 +7,13 @@
 module tests.all;
 
 import orange.test.UnitTester;
-import tests.Serializer;
+import tests._;
+
+/*
+ * The tests that test for XML with attributes are not completely
+ * reliable, due to the XML module in Phobos saves the XML
+ * attributes in an associative array.
+ */
 
 void main ()
 {