2011-07-21 5 views
1

J'ai joué avec la bibliothèque de malédictions tranchantes (wrapper aC# pour pdcurses), en écrivant un code de test unitaire pour avoir un aperçu de l'API et comment ça marche, et je suis venu avec une question.Tests unitaires avec NUnit et la console

je peux courir malédictions nettes à partir d'une DLL (de sorte que nUnit peut le tester), en utilisant le code suivant:

 bool consoleAllocated = AllocConsole(); 
     if (!consoleAllocated) 
      throw new Exception("Unable to allocate a new console."); 

     Curses.InitScr(); 

     Stdscr.Add(4, 6, "This is a test title"); 

     Curses.EndWin(); 

     FreeConsole(); 

AllocConsole et FreeConsole sont importés de kernel32 de extern. Ce que je voudrais faire est de pouvoir lire la sortie de la console à partir de la position 4,6 vers une chaîne afin de vérifier par programme que la chaîne que j'ai entrée a été sortie correctement. Il serait très important d'être capable de faire des contrôles de ce genre afin de créer une application de style curses utilisant TDD par exemple.

J'ai regardé les objets Curses et Stdscr (les deux objets Curses Sharp) et l'objet Console (depuis la bibliothèque Windows) et je n'ai pas encore trouvé de solution. Quelqu'un a-t-il une idée?

Répondre

3

J'ai réussi à trouver une réponse, au cas où quelqu'un serait intéressé, j'ai inclus le code ci-dessous. C'est désordonné, car je ne l'ai pas encore nettoyé, mais cela devrait servir d'exemple quant à la façon de le faire.

Merci à pinvoke.net pour leur excellente collection de signature.

[DllImport("kernel32", SetLastError = true)] 
    static extern bool AllocConsole(); 

    [DllImport("kernel32", SetLastError = true)] 
    static extern bool FreeConsole(); 

    [DllImport("kernel32", SetLastError = true)] 
    static extern IntPtr GetStdHandle(int nStdHandle); 

    [DllImport("kernel32", SetLastError = true)] 
    static extern bool ReadConsoleOutputCharacter(IntPtr hConsoleOutput, 
     [Out]StringBuilder lpCharacter, uint nLength, COORD dwReadCoord, 
     out uint lpNumberOfCharsRead); 

    const int STD_OUTPUT_HANDLE = -11; 

    [StructLayout(LayoutKind.Sequential)] 
    struct COORD 
    { 
     public short X; 
     public short Y; 
    } 

    [Test] 
    public void WriteTitle() 
    { 
     bool consoleAllocated = AllocConsole(); 
     if (!consoleAllocated) 
      throw new Exception("Unable to allocate a new console."); 

     Curses.InitScr(); 

     Stdscr.Add(4, 6, "This is a test title"); 
     Stdscr.Refresh(); 

     IntPtr stdOut = GetStdHandle(STD_OUTPUT_HANDLE); 
     uint length = 20; 
     StringBuilder consoleOutput = new StringBuilder((int)length); 
     COORD readCoord; 
     readCoord.X = 6; 
     readCoord.Y = 4; 
     uint numOfCharsRead = 0; 

     ReadConsoleOutputCharacter(stdOut, consoleOutput, length, readCoord, out numOfCharsRead); 

     string outputString = consoleOutput.ToString(); 
     Assert.That(outputString, Is.EqualTo("This is a test title")); 

     Curses.EndWin(); 

     FreeConsole(); 
    }