2010-12-05 9 views
6

Ich möchte in der Lage sein, eine Datei mit Erklärungen zu nehmen wie:Liste der Objektnamen im Modul mit Vorlage haskell erhalten?

test_1 = assert $ 1 == 1 
test_2 = assert $ 2 == 1 

und erzeugt eine Grundlauffunktion wie

main = runTests [test_1, test2] 

Das Ziel ist, so etwas wie nosetest Python zu bekommen.

Kann ich dies mit Vorlage Haskell tun? Ich kann nicht viel Dokumentation darüber finden (es gibt viele defekte Links im Wiki).

+0

Was benötigen Sie Template Haskell für hier? 'runTests' ist eine ganz normale Funktion; ist die Idee, '$ (runTestsInModule" My.Module ")' 'schreiben zu können und' runTests [test_1, test_2, ...] 'erzeugen zu lassen? –

+1

Ja! Ist runTestsInModule eine Funktion, die existiert oder muss ich sie schreiben? Wenn nicht, ist das die Funktion, die ich wissen möchte, wie man schreibt. – luispedro

Antwort

4

Vielleicht möchten Sie in die test-framework Familie von Paketen suchen. Insbesondere bietet das test-framework-th Paket die Template Haskell-Funktion defaultMainGenerator, die genau das tut, was Sie sowohl für QuickCheck- als auch HUnit-Tests wollen, solange Sie die Konvention der Präfixierung von HUnit-Testfällen mit case_ und QuickCheck-Eigenschaften mit prop_ befolgen.

{-# LANGUAGE TemplateHaskell #-} 

import Test.Framework.Providers.HUnit 
import Test.Framework.Providers.QuickCheck2 
import Test.Framework.TH 

import Test.HUnit 
import Test.QuickCheck 

main = $(defaultMainGenerator) 

case_checkThatHUnitWorks = 
    assert $ 1 == 1 

prop_checkThatQuickCheckWorks = 
    (1 == 1) 
4

Es gibt einen anderen Weg, Sie müssen Vorlage Haskell nicht verwenden. haskell-src-exts kann Haskell parsen, und Sie könnten daraus extrahieren.

Oder wenn Ihr Zweck praktisch ist, können Sie wie quickcheck machen und eine einfältige Parse zu tun, also für Bezeichner suchen, der mit prop_ in Spalte beginnen 0. Dies ist eine perfekt passende Lösung für echte Arbeit, obwohl es sein kann, theoretisch unbefriedigend.

+0

Danke. Mein Ziel ist rein praktisch. Ich schreibe weiterhin Komponententests und vergesse dann, sie der Liste der Tests hinzuzufügen, die ich ausführen möchte, also wollte ich das automatisieren. – luispedro