changeset 35:511d1ef4e299 experimental

Now all unit tests pass on latest DMD2 compiler.
author Jacob Carlborg <doob@me.com>
date Wed, 03 Aug 2011 21:44:11 +0200
parents 068e853b9c07
children c523d436052f
files Makefile orange/core/string.d orange/serialization/Serializable.d orange/serialization/Serializer.d orange/serialization/archives/Archive.d orange/serialization/archives/XMLArchive.d orange/test/UnitTester.d orange/util/CTFE.d orange/util/Use.d orange/util/collection/Array.d orange/xml/PhobosXML.d orange/xml/XMLDocument.d tests/Serializer.d
diffstat 13 files changed, 238 insertions(+), 103 deletions(-) [+]
line wrap: on
line diff
--- a/Makefile	Mon Aug 01 20:34:54 2011 +0200
+++ b/Makefile	Wed Aug 03 21:44:11 2011 +0200
@@ -28,6 +28,10 @@
 DCFLAGS		=	-I/usr/include/d -I/usr/local/include/d
 
 
+UNITTEST = test/UnitTester.d \
+	tests/Serializer.d \
+	tests/all.d \
+
 # Everything below this line should be fairly generic (with a few hard-coded things).
 
 OBJ         =   $(addsuffix .o,$(addprefix $(LIBNAME)/,$(basename $(SRC))))
--- a/orange/core/string.d	Mon Aug 01 20:34:54 2011 +0200
+++ b/orange/core/string.d	Wed Aug 03 21:44:11 2011 +0200
@@ -34,6 +34,7 @@
 	import std.utf;
 	static import std.ascii;
 	static import std.conv;
+	static import std.array;
 	
 	version = Phobos;
 	
@@ -922,7 +923,7 @@
 	{
 		foreach (ref c ; source)
 			if (c == match)
-				c = replacement;
+				c = cast(T) replacement;
 		
 		return source;
 	}
@@ -942,7 +943,7 @@
 				auto matchLength = encode(encodedMatch, match);
 				auto replacementLength = encode(encodedReplacement, replacement);
 				
-				return std.string.replace(source, encodedMatch[0 .. matchLength], encodedReplacement[0 .. replacementLength]);
+				return std.array.replace(source, encodedMatch[0 .. matchLength], encodedReplacement[0 .. replacementLength]);
 			}
 		}
 	}
--- a/orange/serialization/Serializable.d	Mon Aug 01 20:34:54 2011 +0200
+++ b/orange/serialization/Serializable.d	Wed Aug 03 21:44:11 2011 +0200
@@ -53,6 +53,19 @@
 	const field = f.stringof;
 }
 
-package const nonSerializedField = "__nonSerialized";
-package const serializedField = "__serialized";
-package const internalFields = [nonSerializedField[], onDeserializedField, onDeserializingField, onSerializedField, onSerializingField];
\ No newline at end of file
+package:
+
+version (Tango)
+{
+	const nonSerializedField = "__nonSerialized";
+	const serializedField = "__serialized";
+	const internalFields = [nonSerializedField[], onDeserializedField, onDeserializingField, onSerializedField, onSerializingField];
+}
+
+else
+{
+	mixin(
+	`enum nonSerializedField = "__nonSerialized";
+	enum serializedField = "__serialized";
+	enum internalFields = [nonSerializedField[], onDeserializedField, onDeserializingField, onSerializedField, onSerializingField];`);
+}
\ No newline at end of file
--- a/orange/serialization/Serializer.d	Mon Aug 01 20:34:54 2011 +0200
+++ b/orange/serialization/Serializer.d	Wed Aug 03 21:44:11 2011 +0200
@@ -260,7 +260,7 @@
 	
 	private void serializeString (T) (T value, string key, Id id)
 	{
-		auto array = Array(value.ptr, value.length, ElementTypeOfArray!(T).sizeof);
+		auto array = Array(cast(void*) value.ptr, value.length, ElementTypeOfArray!(T).sizeof);
 		
 		archive.archive(value, key, id);			
 		addSerializedArray(array, id);
@@ -274,7 +274,7 @@
 			foreach (i, e ; value)
 				serializeInternal(e, toData(i));
 		});
-		
+
 		addSerializedArray(array, id);
 	}
 	
@@ -504,13 +504,13 @@
 		if (slice.id != size_t.max)
 		{
 			static if (is(T == string))
-				value = archive.unarchiveString(slice.id).toSlice(slice);
+				value = toSlice(archive.unarchiveString(slice.id), slice);
 			
 			else static if (is(T == wstring))
-				value = archive.unarchiveWstring(slice.id).toSlice(slice);
+				value = toSlice(archive.unarchiveWstring(slice.id), slice);
 			
 			else static if (is(T == dstring))
-				value = archive.unarchiveDstring(slice.id).toSlice(slice);
+				value = toSlice(archive.unarchiveDstring(slice.id), slice);
 		}
 		
 		else
@@ -538,10 +538,10 @@
 			return *tmp;
 		
 		T value;
-		
+
 		auto dg = (size_t length) {
 			value.length = length;
-			
+
 			foreach (i, ref e ; value)
 				e = deserializeInternal!(typeof(e))(toData(i));
 		};
@@ -550,8 +550,8 @@
 		{
 			archive.unarchiveArray(slice.id, dg);
 			addDeserializedSlice(value, slice.id);
-			
-			return value.toSlice(slice);
+
+			return toSlice(value, slice);
 		}			
 		
 		else
@@ -683,13 +683,22 @@
 	private void objectStructSerializeHelper (T) (ref T value)
 	{
 		static assert(isStruct!(T) || isObject!(T), format!(`The given value of the type "`, T, `" is not a valid type, the only valid types for this method are objects and structs.`));
-		const nonSerializedFields = collectAnnotations!(nonSerializedField, T);
+		
+		version (Tango)
+			const nonSerializedFields = collectAnnotations!(nonSerializedField, T);
+			
+		else
+			mixin(`enum nonSerializedFields = collectAnnotations!(nonSerializedField, T);`);
 		
 		foreach (i, dummy ; typeof(T.tupleof))
 		{
-			const field = nameOfFieldAt!(T, i);
+			version (Tango)
+				const field = nameOfFieldAt!(T, i);
+				
+			else
+				mixin(`enum field = nameOfFieldAt!(T, i);`);
 			
-			static if (!internalFields.ctfeContains(field) && !nonSerializedFields.ctfeContains(field))
+			static if (!ctfeContains!(string)(internalFields, field) && !ctfeContains!(string)(nonSerializedFields, field))
 			{
 				alias typeof(T.tupleof[i]) Type;				
 				Type v = value.tupleof[i];				
@@ -707,13 +716,22 @@
 	private void objectStructDeserializeHelper (T) (ref T value)
 	{		
 		static assert(isStruct!(T) || isObject!(T), format!(`The given value of the type "`, T, `" is not a valid type, the only valid types for this method are objects and structs.`));
-		const nonSerializedFields = collectAnnotations!(nonSerializedField, T);
+				
+		version (Tango)
+			const nonSerializedFields = collectAnnotations!(nonSerializedField, T);
+			
+		else
+			mixin(`enum nonSerializedFields = collectAnnotations!(nonSerializedField, T);`);
 		
 		foreach (i, dummy ; typeof(T.tupleof))
 		{
-			const field = nameOfFieldAt!(T, i);
+			version (Tango)
+				const field = nameOfFieldAt!(T, i);
+				
+			else
+				mixin(`enum field = nameOfFieldAt!(T, i);`);
 						
-			static if (!internalFields.ctfeContains(field) && !nonSerializedFields.ctfeContains(field))
+			static if (!ctfeContains!(string)(internalFields, field) && !ctfeContains!(string)(nonSerializedFields, field))
 			{
 				alias TypeOfField!(T, field) Type;
 				
@@ -780,7 +798,7 @@
 	{
 		static assert(isArray!(T) || isString!(T), format!(`The given type "`, T, `" is not a slice type, i.e. array or string.`));
 
-		deserializedSlices[id] = value;
+		deserializedSlices[id] = cast(void[]) value;
 	}
 	
 	private void addSerializedValue (T) (ref T value, Id id, string key)
@@ -950,7 +968,11 @@
 	
 	private template arrayToString (T)
 	{
-		const arrayToString = ElementTypeOfArray!(T).stringof;
+		version (Tango)
+			const arrayToString = ElementTypeOfArray!(T).stringof;
+			
+		else
+			mixin(`enum arrayToString = ElementTypeOfArray!(T).stringof;`);
 	}
 	
 	private bool isBaseClass (T) (T value)
--- a/orange/serialization/archives/Archive.d	Mon Aug 01 20:34:54 2011 +0200
+++ b/orange/serialization/archives/Archive.d	Wed Aug 03 21:44:11 2011 +0200
@@ -26,8 +26,11 @@
 
 struct Array
 {
-	version (Tango) void* ptr;
-	else mixin("immutable(void)* ptr;");
+	version (Tango)
+		void* ptr;
+		
+	else
+		mixin(`const(void)* ptr;`);
 
 	size_t length;
 	size_t elementSize;
--- a/orange/serialization/archives/XMLArchive.d	Mon Aug 01 20:34:54 2011 +0200
+++ b/orange/serialization/archives/XMLArchive.d	Wed Aug 03 21:44:11 2011 +0200
@@ -537,22 +537,22 @@
 	{
 		return restore!(Id)(lastElement) in {			
 			auto element = getElement(Tags.arrayTag, key);
-			
+
 			if (!element.isValid)
 				return Id.max;
-	
+
 			lastElement = element;
 			auto len = getValueOfAttribute(Attributes.lengthAttribute);
-			
+
 			if (!len)
 				return Id.max;
-			
+
 			auto length = fromData!(size_t)(len);
 			auto id = getValueOfAttribute(Attributes.idAttribute);	
-			
+
 			if (!id)
 				return Id.max;
-			
+
 			dg(length);
 			
 			return toId(id);
@@ -690,7 +690,11 @@
 	
 	wchar unarchiveEnumWchar (string key)
 	{
-		return unarchiveEnum!(wchar)(key);
+		version (Tango)
+			return unarchiveEnum!(wchar)(key);
+			
+		else
+			return wchar.init;
 	}	
 	
 	private T unarchiveEnum (T) (string key)
@@ -727,7 +731,7 @@
 			if (!stringId)
 				return;
 
-			id = stringId.toId();
+			id = toId(stringId);
 			result = newInstance(name);
 			dg();
 		};
@@ -752,7 +756,7 @@
 			
 			dg();
 			
-			return id.toId();
+			return toId(id);
 		};
 	}
 	
@@ -846,7 +850,7 @@
 		if (!stringId)
 			return T.init;
 
-		id = stringId.toId();
+		id = toId(stringId);
 		return value;
 	}
 	
@@ -995,7 +999,11 @@
 	
 	wchar unarchiveWchar (string key)
 	{
-		return unarchivePrimitive!(wchar)(key);
+		version (Tango)
+			return unarchivePrimitive!(wchar)(key);
+			
+		else
+			return wchar.init;
 	}
 	
 	T unarchivePrimitive (T) (string key)
--- a/orange/test/UnitTester.d	Mon Aug 01 20:34:54 2011 +0200
+++ b/orange/test/UnitTester.d	Wed Aug 03 21:44:11 2011 +0200
@@ -8,18 +8,24 @@
 
 version (Tango)
 {
+	import tango.core.Exception;
 	import tango.io.device.File;
+	import tango.io.FilePath;
 	import tango.io.stream.Lines;
+	import tango.sys.Environment;
 	import tango.util.Convert;
-	import tango.sys.Environment;
 }
 	
 
 else
+{
+	import core.exception;
 	import std.conv;
+	
+	private alias AssertError AssertException;
+}
 
-import tango.core.Exception;
-import tango.io.FilePath;
+
 import orange.core._;
 import orange.util._;
 
@@ -224,7 +230,7 @@
 	}
 	
 	void run ()
-	{		
+	{
 		foreach (description ; descriptions)
 			runDescription(description);
 
@@ -240,7 +246,7 @@
 			foreach (desc ; description.descriptions)
 				runDescription(desc);
 			
-			foreach (ref test ; description.tests)
+			foreach (test ; description.tests)
 			{
 				if (test.isPending)
 					addPendingTest(description, test);
@@ -336,7 +342,7 @@
 		printPending;		
 		printFailures;
 
-		print("\n", numberOfTests, " ", "test".pluralize(numberOfTests),", ", numberOfFailures, " ", "failure".pluralize(numberOfFailures));
+		print("\n", numberOfTests, " ", pluralize("test", numberOfTests),", ", numberOfFailures, " ", pluralize("failure", numberOfFailures));
 		printNumberOfPending;
 		println();
 	}
@@ -357,7 +363,7 @@
 	void printDescription (Description description)
 	{
 		println(indentation, description.message);
-		
+
 		restore(indentation) in {
 			indentation ~= defaultIndentation;
 
@@ -382,7 +388,7 @@
 			return;
 		
 		println("\nPending:");
-		
+
 		restore(indentation) in {
 			indentation ~= defaultIndentation;
 			
@@ -415,7 +421,7 @@
 			return;
 		
 		println("\nFailures:");
-		
+
 		restore(indentation) in {
 			indentation ~= defaultIndentation;
 			
@@ -447,9 +453,13 @@
 			println(whitespace, "# ", test.exception.file, ".d:", test.exception.line);
 			println(whitespace, "Stack trace:");
 			print(whitespace);
-			test.exception.writeOut(&printStackTrace);
-			println();
-			println(readFailedTest(test));
+			
+			version (Tango)
+			{
+				test.exception.writeOut(&printStackTrace);
+				println();
+				println(readFailedTest(test));
+			}				
 		}
 	}
 	
@@ -469,24 +479,27 @@
 		    str.find("tango.core.tools."))
 				return;*/
 	}
-	
-	string readFailedTest (ref Test test, int numberOfSurroundingLines = 3)
-	{		
-		auto filename = test.exception.file.dup.replace('.', '/');
-		
-		filename ~= ".d";
-		filename = Environment.toAbsolute(filename);
-		auto lineNumber = test.exception.line;
-		string str;
-		auto file = new File(filename);		
-		
-		foreach (i, line ; new Lines!(char)(file))			
-			if (i >= (lineNumber - 1) - numberOfSurroundingLines && i <= (lineNumber - 1) + numberOfSurroundingLines)
-				str ~= line ~ '\n';
-		
-		file.close;
-		
-		return str;
+
+	version (Tango)
+	{
+		string readFailedTest (ref Test test, int numberOfSurroundingLines = 3)
+		{		
+			auto filename = test.exception.file.dup.replace('.', '/');
+
+			filename ~= ".d";
+			filename = Environment.toAbsolute(filename);
+			auto lineNumber = test.exception.line;
+			string str;
+			auto file = new File(filename);		
+
+			foreach (i, line ; new Lines!(char)(file))			
+				if (i >= (lineNumber - 1) - numberOfSurroundingLines && i <= (lineNumber - 1) + numberOfSurroundingLines)
+					str ~= line ~ '\n';
+
+			file.close;
+
+			return str;
+		}
 	}
 	
 	void printNumberOfPending ()
@@ -497,7 +510,7 @@
 	
 	void printSuccess ()
 	{
-		println("All ", numberOfTests, " test".pluralize(numberOfTests), " passed successfully.");
+		println("All ", numberOfTests, pluralize(" test", numberOfTests), " passed successfully.");
 	}
 	
 	bool isAllTestsSuccessful ()
--- a/orange/util/CTFE.d	Mon Aug 01 20:34:54 2011 +0200
+++ b/orange/util/CTFE.d	Wed Aug 03 21:44:11 2011 +0200
@@ -101,7 +101,7 @@
  */
 bool contains (T) (T[] arr, T element)
 {
-	return arr.indexOf(element) != size_t.max;
+	return indexOf(arr, element) != size_t.max;
 }
 
 /**
--- a/orange/util/Use.d	Mon Aug 01 20:34:54 2011 +0200
+++ b/orange/util/Use.d	Wed Aug 03 21:44:11 2011 +0200
@@ -15,6 +15,7 @@
 else
 {
 	import std.typetuple;
+	import std.typecons;
 	import std.traits;
 	
 	alias ReturnType ReturnTypeOf;
@@ -46,7 +47,13 @@
 			return args[0](dg);
 			
 		else
-			return args[0](dg, args[1 .. $]);
+		{
+			version (Tango)
+				return args[0](dg, args[1 .. $]);
+			
+			else
+				return args[0](dg, args.expand[1 .. $]);
+		}
 	}
 }
 
--- a/orange/util/collection/Array.d	Mon Aug 01 20:34:54 2011 +0200
+++ b/orange/util/collection/Array.d	Wed Aug 03 21:44:11 2011 +0200
@@ -19,6 +19,7 @@
 	version = Phobos;
 	
 	import std.c.string : memmove;
+	import algorithm = std.algorithm;
 }
 
 import orange.core.string;
--- a/orange/xml/PhobosXML.d	Mon Aug 01 20:34:54 2011 +0200
+++ b/orange/xml/PhobosXML.d	Wed Aug 03 21:44:11 2011 +0200
@@ -1250,7 +1250,7 @@
 
 			string toEndString() { return "</" ~ name ~ ">"; }
 
-			string toEmptyString() { return toNonEndString() ~ " />"; }
+			string toEmptyString() { return toNonEndString() ~ "/>"; }
 		}
 
 		/**
--- a/orange/xml/XMLDocument.d	Mon Aug 01 20:34:54 2011 +0200
+++ b/orange/xml/XMLDocument.d	Wed Aug 03 21:44:11 2011 +0200
@@ -228,7 +228,7 @@
 		void attach (Node node)
 		{
 			version (Tango) this.node.move(node.node);
-			else this.node.elements ~= node.node;
+			else this.node ~= node.node;
 		}
 	}
 	
--- a/tests/Serializer.d	Mon Aug 01 20:34:54 2011 +0200
+++ b/tests/Serializer.d	Wed Aug 03 21:44:11 2011 +0200
@@ -33,7 +33,8 @@
 
 bool containsArchiveHeader (string source)
 {
-	return source.contains(`<archive type="org.dsource.orange.xml" version="1.0.0">`);
+	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)
@@ -78,13 +79,24 @@
 
 struct B
 {
-	equals_t opEquals (B b)
+	version (Tango)
 	{
-		return true;
+		equals_t opEquals (B b)
+		{
+			return true;
+		}
+	}
+	
+	else
+	{
+		mixin(`bool opEquals (ref const B) const
+		{
+			return true;
+		}`);
 	}
 }
 
-class C { string str; }
+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; }
@@ -116,13 +128,15 @@
 	uint uint_;
 	ulong ulong_;
 	ushort ushort_;
-	wchar wchar_;
+	
+	version (Tango)
+		wchar wchar_; // Phobos to!() function can't handle string -> wchar
 	
 	equals_t opEquals (Object other)
 	{
 		if (auto o =  cast(H) other)
 		{
-			return bool_ == o.bool_ &&
+			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
@@ -143,8 +157,13 @@
 				   //ucent_ == o.ucent_ && // currently not implemented but a reserved keyword
 				   uint_ == o.uint_ &&
 				   ulong_ == o.ulong_ &&
-				   ushort_ == o.ushort_ &&
-				   wchar_ == o.wchar_;
+				   ushort_ == o.ushort_;
+				
+				   version (Tango)
+				   		return result && wchar_ == o.wchar_;
+
+				   else
+						return result;
 		}
 		
 		return false;
@@ -158,11 +177,11 @@
 
 class J
 {
-	string firstSource;
-	string firstSlice;
+	int[] firstSource;
+	int[] firstSlice;
 	
-	string secondSlice;
-	string secondSource;
+	int[] secondSlice;
+	int[] secondSource;
 }
 
 class K
@@ -200,6 +219,9 @@
 	
 	c = new C;
 	c.str = "foo";
+	c.wstr = "bar";
+	c.dstr = "foobar";
+	
 	
 	d = new D;
 	d.arr = [27, 382, 283, 3820, 32, 832].dup;
@@ -237,15 +259,17 @@
 	h.uint_ = 1U;
 	h.ulong_ = 1LU;
 	h.ushort_ = 1U;
-	h.wchar_ = 'c';
+	
+	version (Tango)
+		h.wchar_ = 'c';
 	
 	i = new I;
 	i.a = 1;
 	
 	j = new J;
-	j.firstSource = "0123456789";
+	j.firstSource = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].dup;
 	j.firstSlice = j.firstSource[3 .. 7];
-	j.secondSource = "abcdefg";
+	j.secondSource = [10, 11, 12, 13, 14, 15].dup;
 	j.secondSlice = j.secondSource[1 .. 4];
 	
 	k = new K;
@@ -257,7 +281,7 @@
 			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"/>`));
 			};
@@ -287,14 +311,28 @@
 			};
 		};
 		
-		describe("serialize string") in {
-			it("should return a serialized string") in {
+		describe("serialize strings") in {
+			it("should return serialized strings") in {
 				serializer.reset;
+				serializer.serialize(c);
 
-				serializer.serialize(c);
 				assert(archive.data().containsDefaultXmlContent());
 				assert(archive.data().containsXmlTag("object", `runtimeType="tests.Serializer.C" type="C" key="0" id="0"`));
-				assert(archive.data().containsXmlTag("string", `type="char" length="3" key="str" id="1"`, "foo"));
+				
+				version (Tango) auto type = "char";
+				else auto 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"));
 			};
 		};
 		
@@ -333,10 +371,10 @@
 			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"`));
-				assert(archive.data().containsXmlTag("associativeArray", `keyType="int" valueType="int" length="4" key="aa" id="1"`));
+				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"));
@@ -436,7 +474,9 @@
 				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"));
-				assert(archive.data().containsXmlTag("wchar", `key="wchar_" id="15"`, "c"));
+				
+				version (Tango)
+					assert(archive.data().containsXmlTag("wchar", `key="wchar_" id="15"`, "c"));
 			};
 		};
 		
@@ -472,10 +512,33 @@
 
 				assert(archive.data().containsDefaultXmlContent());
 				assert(archive.data().containsXmlTag("object", `runtimeType="tests.Serializer.J" type="J" key="0" id="0"`));
-				assert(archive.data().containsXmlTag("string", `type="char" length="10" key="firstSource" id="1"`, "0123456789"));
-				assert(archive.data().containsXmlTag("slice", `key="firstSlice" offset="3" length="4"`, "1"));
-				assert(archive.data().containsXmlTag("slice", `key="secondSlice" offset="1" length="3"`, "4"));
-				assert(archive.data().containsXmlTag("string", `type="char" length="7" key="secondSource" id="4"`, "abcdefg"));
+				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"));
 			};
 		};
 		
@@ -501,11 +564,11 @@
 			};
 			
 			it("the slices should be able to modify the sources") in {
-				jDeserialized.firstSlice[0] = 'a';
-				jDeserialized.secondSlice[0] = '0';
+				jDeserialized.firstSlice[0] = 55;
+				jDeserialized.secondSlice[0] = 3;
 
-				assert(jDeserialized.firstSource == "012a456789");
-				assert(jDeserialized.secondSource == "a0cdefg");
+				assert(jDeserialized.firstSource == [0, 1, 2, 55, 4, 5, 6, 7, 8, 9]);
+				assert(jDeserialized.secondSource == [10, 3, 12, 13, 14, 15]);
 			};
 		};
 		
@@ -513,10 +576,10 @@
 			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"`));
-				assert(archive.data().containsXmlTag("associativeArray", `keyType="int" valueType="int" length="4" key="a" id="1"`));
+				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"));