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).");
+    }
+}