2010-12-05 6 views
6

Je voudrais être en mesure de prendre un dossier avec des déclarations telles que:Obtenir la liste des noms d'objets dans le module avec le modèle haskell?

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

et générer une fonction d'exécution de base comme

main = runTests [test_1, test2] 

Le but est d'obtenir quelque chose comme nosetest Python. Est-ce que je peux le faire avec le modèle Haskell?

Je ne trouve pas beaucoup de documentation dessus (il y a beaucoup de liens cassés dans le Wiki).

+0

De quoi avez-vous besoin Template Haskell ici? 'runTests' est une fonction parfaitement ordinaire; est l'idée de pouvoir écrire '$ (runTestsInModule" My.Module ")' et que cela produise 'runTests [test_1, test_2, ...]'? –

+1

Oui! RunTestsInModule est une fonction qui existe ou dois-je l'écrire? Sinon, c'est la fonction que je veux savoir écrire. – luispedro

Répondre

4

Vous voudrez peut-être examiner la famille de packages test-framework. En particulier, le package test-framework-th fournit la fonction Template Haskell defaultMainGenerator qui fait exactement ce que vous voulez pour les tests QuickCheck et HUnit, à condition que vous suiviez la convention de préfixer les cas de test HUnit avec les propriétés case_ et QuickCheck avec prop_.

{-# 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

Il y a une autre façon, vous n'avez pas besoin d'utiliser le modèle haskell. haskell-src-exts peut analyser Haskell, et vous pourriez en extraire.

Ou si votre but est pratique, vous pouvez faire comme quickcheck et faire une analyse syntaxique simple d'esprit, à la recherche-à-dire pour les identifiants qui commencent par prop_ dans la colonne 0. Ceci est une solution parfaitement adéquate pour le travail réel, mais il peut être théoriquement insatisfaisant.

+0

Merci. Mon but est purement pratique. Je continue d'écrire des tests unitaires, puis j'oublie de les ajouter à la liste des tests à exécuter, donc je cherchais à automatiser ça. – luispedro