2012-06-12 4 views
7

Ich möchte Tests für eine Suite von Parsec-Parsern schreiben. Hier ist ein einfaches Beispiel eines Parsers ich mit Quick Check testen will:Testen von Parsec-Parsern durch Generieren von Eingaben mit QuickCheck

identifier = do 
    c <- letter 
    cs <- many (alphaNum <|> oneOf identSymbols) 
    skipSpaces 
    return $ Ident $ c:cs 

also im Idealfall würde ich Quick Check will gültige Bezeichner erzeugen, und stellen Sie sicher, dass ich die richtigen Ergebnisse zurück, sowie die Erzeugung von ungültigen Kennungen und stellen sicher, dass sie ParseError zurückgeben. Gibt es irgendwelche Hilfsmittel, die solche Dinge einfacher machen würden? Gibt es eine Möglichkeit, "meinen Parser rückwärts laufen zu lassen", um solche Eingaben zu generieren?

Im Allgemeinen, was würde eine gute Suite von QuickCheck-Tests für diesen Parser aussehen? Zu einem gewissen Grad scheint es, als müsste ich im Grunde die Logik des Parsers in QuickCheck duplizieren, um einen gründlichen Test zu erhalten. Ist das wirklich eine gute Idee, oder ist dies vielleicht eine Situation, in der ein traditionelleres Werkzeug wie Hunit besser geeignet ist als QuickCheck?

Antwort

13

Im Allgemeinen ist die Rückseite eines Parsers ein hübscher Drucker, und die Umkehrung einer zufälligen Eingabe in einen Parser ist ein zufälliges, hübsches Drucken eines AST.

Folgen Sie also der usual approach und definieren Sie eine beliebige Instanz für Ihre AST, die zufällige wohlgeformte Syntaxfragmente antreibt. Mischen Sie einige fehlerhafte Zeichen als Wrapper, um die Fehlerbehandlung zu testen. auch

Siehe:

+0

Eine bestimmte Eigenschaft, die ich gerne verwende, ist, dass parse = parse. ziemlich . analysieren. Dies dient als eine anständige Möglichkeit, die Quotientenbildung von Informationen durch den Parser zu modellieren, es gibt eine nette Ergänzung, um sie aus einer theoretischen Perspektive zu steuern, und sie fängt die Tatsache ein, dass sie hübsch ist. Parsen ist idempotent, wenn nicht die Identitätsfunktion. (Normalerweise analysiert das Parsing einige Informationen) –

+2

die letzten beiden Links sind tot –