dyaml/test/src/inputoutput.d
Ferdinand Majerech ee0a449977 Style.
2014-07-31 03:12:25 +02:00

94 lines
2.9 KiB
D

// Copyright Ferdinand Majerech 2011-2014.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
module dyaml.testinputoutput;
import std.array;
import std.file;
import std.system;
import dyaml.testcommon;
alias std.system.endian endian;
/// Get an UTF-16 byte order mark.
///
/// Params: wrong = Get the incorrect BOM for this system.
///
/// Returns: UTF-16 byte order mark.
wchar bom16(bool wrong = false) pure
{
wchar little = *(cast(wchar*)ByteOrderMarks[BOM.UTF16LE]);
wchar big = *(cast(wchar*)ByteOrderMarks[BOM.UTF16BE]);
if(!wrong){return endian == Endian.littleEndian ? little : big;}
return endian == Endian.littleEndian ? big : little;
}
/// Get an UTF-32 byte order mark.
///
/// Params: wrong = Get the incorrect BOM for this system.
///
/// Returns: UTF-32 byte order mark.
dchar bom32(bool wrong = false) pure
{
dchar little = *(cast(dchar*)ByteOrderMarks[BOM.UTF32LE]);
dchar big = *(cast(dchar*)ByteOrderMarks[BOM.UTF32BE]);
if(!wrong){return endian == Endian.littleEndian ? little : big;}
return endian == Endian.littleEndian ? big : little;
}
/// Unicode input unittest. Tests various encodings.
///
/// Params: verbose = Print verbose output?
/// unicodeFilename = File name to read from.
void testUnicodeInput(bool verbose, string unicodeFilename)
{
string data = readText(unicodeFilename);
string expected = data.split().join(" ");
Node output = Loader(new MemoryStream(to!(char[])(data))).load();
assert(output.as!string == expected);
foreach(stream; [new MemoryStream(cast(byte[])(bom16() ~ to!(wchar[])(data))),
new MemoryStream(cast(byte[])(bom32() ~ to!(dchar[])(data)))])
{
output = Loader(stream).load();
assert(output.as!string == expected);
}
}
/// Unicode input error unittest. Tests various encodings with incorrect BOMs.
///
/// Params: verbose = Print verbose output?
/// unicodeFilename = File name to read from.
void testUnicodeInputErrors(bool verbose, string unicodeFilename)
{
string data = readText(unicodeFilename);
foreach(stream; [new MemoryStream(cast(byte[])(to!(wchar[])(data))),
new MemoryStream(cast(byte[])(to!(wchar[])(data))),
new MemoryStream(cast(byte[])(bom16(true) ~ to!(wchar[])(data))),
new MemoryStream(cast(byte[])(bom32(true) ~ to!(dchar[])(data)))])
{
try{Loader(stream).load();}
catch(YAMLException e)
{
if(verbose){writeln(typeid(e).toString(), "\n", e);}
continue;
}
assert(false, "Expected an exception");
}
}
unittest
{
writeln("D:YAML I/O unittest");
run("testUnicodeInput", &testUnicodeInput, ["unicode"]);
run("testUnicodeInputErrors", &testUnicodeInputErrors, ["unicode"]);
}