Mercurial > projects > mde
diff mde/file/mergetag/mdeUT.d @ 81:d8fccaa45d5f
Moved file IO code from mde/mergetag to mde/file[/mergetag] and changed how some errors are caught.
author | Diggory Hardy <diggory.hardy@gmail.com> |
---|---|
date | Fri, 29 Aug 2008 11:59:43 +0100 |
parents | mde/mergetag/mtunittest.d@7fc0a8295c83 |
children | ac1e3fd07275 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mde/file/mergetag/mdeUT.d Fri Aug 29 11:59:43 2008 +0100 @@ -0,0 +1,100 @@ +/* LICENSE BLOCK +Part of mde: a Modular D game-oriented Engine +Copyright © 2007-2008 Diggory Hardy + +This program 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 2 of the License, or (at your option) any later version. + +This program 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 this program. If not, see <http://www.gnu.org/licenses/>. */ + +/// This module provides a unittest for mergetag. +module mde.file.mergetag.mdeUT; + +debug (mdeUnitTest) { + import mde.file.mergetag.Reader; + import mde.file.mergetag.Writer; + import mde.file.mergetag.DataSet; + import mde.file.mergetag.DefaultData; + import mde.file.deserialize; + import mde.file.serialize; + + import tango.io.FilePath; + import tango.util.log.Log : Log, Logger; + + private Logger logger; + static this() { + logger = Log.getLogger ("mde.mergetag.unittest"); + } + + unittest { + /* This does a basic write-out and read-in test for each type with its default value. + * Thus it provides some basic testing for the whole mergetag package. */ + + const file = "unittest"; + const ID UT_ID = cast (ID) "mdeUT"; + const headInfo = "mde Unit Test"; + + DataSet dsW = new DataSet(); + + dsW.header = new DefaultData(); + dsW.header._charA[UT_ID] = headInfo; + + DefaultData secW = new DefaultData(); + dsW.sec[UT_ID] = secW; + + static char[] genUTCode () { + char[] ret; + foreach (type; DefaultData.dataTypes) { + ret ~= `secW.`~DefaultData.varName(type)~`[UT_ID] = (`~type~`).init;`; + } + return ret; + } + mixin (genUTCode()); // Add an entry to dd for each type + + IWriter w = makeWriter (file, dsW, WriterMethod.Both); + w.write(); + + // FIXME: when binary writing is supported, read both formats and check + IReader r = makeReader (FilePath (file~".mtt"), null, true); + r.read(); + + DataSet dsR = r.dataset; + assert (dsR !is null); + + assert (dsR.header !is null); + char[]* p = UT_ID in dsW.header._charA; + assert (p); + assert (*p == headInfo); + + IDataSection* sec_p = (UT_ID in dsR.sec); + assert (sec_p); + DefaultData secR = cast(DefaultData) *sec_p; + assert (secR !is null); + + // FIXME: when comparing associative arrays works, use that. In the mean-time, format!() should work. + static char[] genCheckCode (char[] dd1, char[] dd2) { + const char[] failureMsg = "Assertion failed for type; values: "; + char[] ret; + foreach (type; DefaultData.dataTypes) { + char[] tName = DefaultData.varName(type); + ret ~= `char[] `~tName~`Val1 = parseFrom!(`~type~`[char[]]) (cast(`~type~`[char[]]) `~dd1~`.`~tName~`); +char[] `~tName~`Val2 = parseFrom!(`~type~`[char[]]) (cast(`~type~`[char[]]) `~dd2~`.`~tName~`); +assert (`~tName~`Val1 == `~tName~`Val2, "Assertion failed for type `~type~`; values: "~`~tName~`Val1~", "~`~tName~`Val2 ); +`; + } + return ret; + } + mixin (genCheckCode (`secW`,`secR`)); + + // Delete the unittest file now + FilePath (file~".mtt").remove; + + logger.info ("Unittest complete (for DefaultData)."); + } +}