changeset 150:0395ab376f4f

added test.bat generator for Windows J C Calvarese <jcc7@cox.net> news:cnrctq$3t1$1@digitaldaemon.com
author thomask
date Tue, 23 Nov 2004 13:01:15 +0000
parents 01612c05a7af
children f50665879ed4
files beta/create_test.bat beta/dstresstest.d
diffstat 2 files changed, 285 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/beta/create_test.bat	Tue Nov 23 13:01:15 2004 +0000
@@ -0,0 +1,11 @@
+@echo off
+dmd dstresstest.d -unittest
+dstresstest.exe
+echo.
+echo Ignore the warning about not finding stlp45dm_static.lib.
+echo It doesn't matter.
+echo.
+echo Now it's time to run 'test.bat'.
+pause
+erase *.map
+erase *.obj
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/beta/dstresstest.d	Tue Nov 23 13:01:15 2004 +0000
@@ -0,0 +1,274 @@
+/* 
+
+DStressTest
+by J C Calvarese 
+License: Public Domain
+
+
+Creates a batch file that will run through 
+tests and output results to files.
+
+(Designed for Windows.)
+
+Compiling instructions:
+
+dmd dstresstest.d -unittest
+dstresstest.exe
+pause
+
+*/
+
+import std.recls; /* for Search */
+import std.stream; /* for File */
+import std.string; /* for replace, find, & tolower */
+import std.file; /* for getcwd */
+import std.path; /* for sep, linesep */
+
+alias std.path.sep dirSep;
+alias std.path.linesep lineSep;
+alias std.path.pathsep pathSep;
+
+enum TryToCompileEnum
+{
+    dontKnow,
+    shouldCompile,
+    shouldntCompile,
+    dontTry,
+    shouldntRun, 
+    shouldRun 
+}
+
+const char[] dstressFlag = "__DSTRESS_DFLAGS__";
+const char[] testFile = "test.bat";
+
+
+void main()
+{   
+    /* Recursively adds each of the files in the current directory to a batch file as a compile command and creates a .lib. */
+
+    char[] DirBase = getcwd ~ dirSep;
+    char[] logFile = DirBase ~ "win32_log.txt";
+    char[] resultFile = DirBase ~ "win32_dmd.txt";
+    char[] bufCompile;
+    char[] relPath;
+    char[] fullPath;
+    char[] compileOptions;
+    char[] ln;
+    char[] lp;
+    char[] dstressDir;
+    char[] lastDir;
+    int pos;
+    File f;
+    TryToCompileEnum shouldItCompile;
+
+
+    bufCompile ~= "ECHO dstress results ... > " ~ resultFile ~ \r\n;
+    bufCompile ~= "ECHO dstress log ... > " ~ logFile ~ \r\n;
+
+    Search search = new Search(".", "*.d", RECLS_FLAG.RECLS_F_RECURSIVE);
+    foreach(Entry entry; search)
+    {        
+        with(entry)
+        { 
+
+            pos = find(DirectoryPath(), pathSep);
+            fullPath = DirectoryPath[pos+1 .. DirectoryPath().length];
+
+            /* Get path relative path */
+            relPath = replace(DirectoryPath(), DirBase, "");
+
+            lp = toLinuxPath(relPath ~ File());
+	    /* strip of the ending */
+	    if(std.string.ifind(lp, ".d")){
+		    lp=lp[0 .. lp.length-2];
+	    }else if(std.string.ifind(lp, ".html")){
+		    lp=lp[0 .. lp.length-5];
+	    }else if(std.string.ifind(lp, ".htm")){
+		    lp=lp[0 .. lp.length-4];
+	    }
+
+            pos = find(relPath, dirSep);
+            if(pos == -1) pos = dstressDir.length;
+            dstressDir = tolower(relPath[0..pos]);
+
+            f = new std.stream.File(DirectoryPath() ~  entry.File());
+
+            /+debug+/ printf("%.*s\n", DirectoryPath() ~  entry.File());
+
+            compileOptions = "";
+            pos = -1;
+            while(!f.eof && pos == -1) 
+              /* stop at the end of the file or the first flag */
+            {
+                ln = f.readLine();
+
+                /* 
+                    look for special compile options 
+                    (such as with run/constructor)
+                */
+
+                pos = find(ln, dstressFlag);
+                if(pos != -1)
+                {
+                    /* Set compile options */
+                    compileOptions = toHostPath(ln[pos + dstressFlag.length .. ln.length]);
+                    debug printf("Compile Option(s) Found:" ~ compileOptions ~ "(" ~ DirectoryPath() ~  entry.File() ~ ")\n");
+                }
+
+            }
+            f.close();
+
+            shouldItCompile = TryToCompileEnum.dontKnow;
+            switch(dstressDir)
+            {
+                case "":
+                    shouldItCompile = TryToCompileEnum.dontTry;
+                    break;
+
+                case "addon":
+                    shouldItCompile = TryToCompileEnum.dontTry;
+                    break;
+
+                case "benchmark":
+                    shouldItCompile = TryToCompileEnum.dontTry;
+                    break;
+
+                case "compile":
+                    shouldItCompile = TryToCompileEnum.shouldCompile;
+                    break;
+
+                case "complex":
+                    shouldItCompile = TryToCompileEnum.dontTry;
+                    break;
+
+                case "nocompile":
+                    shouldItCompile = TryToCompileEnum.shouldntCompile;
+                    break;
+
+                case "norun":
+                    shouldItCompile = TryToCompileEnum.shouldntRun;
+                    break;
+
+                case "obj":
+                    shouldItCompile = TryToCompileEnum.dontTry;
+                    break;
+
+                case "raw-results":
+                    shouldItCompile = TryToCompileEnum.dontTry;
+                    break;
+
+                case "run":
+                    shouldItCompile = TryToCompileEnum.shouldRun;
+                    break;
+
+                case "www":
+                    shouldItCompile = TryToCompileEnum.dontTry;
+                    break;
+
+                default:
+                    printf("Unexpected directory: '%.*s'\n", dstressDir);
+                    break;
+            }
+
+            if((shouldItCompile != TryToCompileEnum.dontTry) && (relPath <> lastDir))
+            { 
+                lastDir = relPath;
+                bufCompile ~= "CD " ~ fullPath ~ \r\n;                
+            }
+
+            switch(shouldItCompile){
+                case TryToCompileEnum.shouldCompile:
+                {
+
+                    debug printf("Should compile\n");
+
+                    bufCompile ~= "ECHO Attempting to compile " ~ lp ~ "... >> " ~ logFile ~ \r\n;
+                    bufCompile ~= "dmd -c " ~ File() ~ " " ~ compileOptions ~ " >> " ~ logFile ~ \r\n;
+
+                    bufCompile ~= "IF ERRORLEVEL 1 (ECHO FAIL: " ~ lp ~ " >> " ~ resultFile ~ ") " ~
+                      "ELSE (ECHO PASS:  " ~ lp ~ " >> " ~ resultFile ~ ")" ~ \r\n;
+                    bufCompile ~= "ECHO. >>" ~ logFile ~ \r\n;
+                    break;
+               }
+               case TryToCompileEnum.shouldntCompile:
+               {
+                    debug printf("Shouldn't compile\n");
+
+                    bufCompile ~= "ECHO Attempting to compile " ~ lp ~ "... >> " ~ logFile ~ \r\n;
+                    bufCompile ~= "dmd -c " ~ File() ~ " " ~ compileOptions ~ " >> " ~ logFile ~ \r\n;
+
+                    bufCompile ~= "IF ERRORLEVEL 1 (ECHO XFAIL:  " ~ lp ~ " >> " ~ resultFile ~ ") " ~
+                      "ELSE (ECHO XPASS: " ~ lp ~ " >> " ~ resultFile ~ ")" ~ \r\n;
+                    bufCompile ~= "ECHO. >>" ~ logFile ~ \r\n;
+                    break;
+               }
+               case TryToCompileEnum.shouldntRun:
+               case TryToCompileEnum.shouldRun:
+               {
+                    bufCompile ~= "ECHO Todo " ~ lp ~ "... >> " ~ logFile ~ lineSep;
+                    break;
+               }
+               case TryToCompileEnum.dontTry:
+               case TryToCompileEnum.dontKnow:
+               {
+                    bufCompile ~= "ECHO Skipping " ~ lp ~ "... >> " ~ logFile ~ \r\n;
+		    break;
+               } 
+               default:
+	       {
+                    bufCompile ~= "ECHO Script BUG " ~ lp ~ "... >> " ~ logFile ~ lineSep;
+               }
+            } 
+        }
+    }
+
+    /* The following code doesn't work right, but the batch file is empty if I take it out. */
+    if(bufCompile == "") printf("Is the buffer there? '%.*s'\n", bufCompile);
+
+    debug printf("Buffer: '%.*s'\n", bufCompile);
+
+    File fOut = new File();
+    with(fOut)
+    {   
+        create(getcwd ~ "\\" ~ testFile);
+        writeString(bufCompile ~ "pause\r\nerase *.obj\r\n");
+        close();    
+    }
+}
+
+
+
+char[] toLinuxPath(char[] s)
+{
+   /* Switch the backslash (\) for Windows with
+      Linux directory separator (/) */
+
+    return replace(s, "\\", "/");
+}
+
+
+
+char[] toHostPath(char[] s)
+{
+   /* Switch the Linux directory separator (/) 
+      with backslash (\) for Windows           */
+
+    return replace(s, "/", dirSep);
+}
+
+
+
+unittest /* requires importation of std.recls and std.file */
+{    
+    /* Test the current directory from std.recls against std.file's getcwd. */
+    
+    Search  searchBase  =   new Search(".", ".", RECLS_FLAG.RECLS_F_DIRECTORIES);
+    foreach(Entry entry; searchBase)
+    {
+        /* I'm only expecting one entry, but I don't know a way to access it without a foreach. */
+        assert(entry.DirectoryPath() == getcwd ~ "\\");    
+    }
+    assert(getcwd != "");
+    printf("Unittests successful.\n");    
+}
+