2014-01-16 4 views
7

Ich benutze Haskell und Parsec, um ein Dateiformat zu analysieren. Meine Analysefunktion sieht ungefähr so ​​aus:Wie verbessere ich das Debuggen von QuickCheck und Parsec?

parseInput :: String -> Model 
parseInput input = ... 

data Model = Model { mNumV :: Int, mNumF :: Int, ... } 

Um dies zu testen, verwende ich QuickCheck. Ich habe eine Arbitrary Instanz definiert, die eine String repräsentiert den Inhalt einer formatierten Datei erzeugt:

instance Arbitrary File where 
    arbitrary = ... 

data File = File { fContents :: String, fNumV :: Int, fNumF :: Int, ... } 

Eine meiner Eigenschaften könnten überprüfen, um festzustellen, ob mNumV == fNumV nach dem Parsen der willkürlichen String. Das funktioniert gut - wenn es funktioniert.

Aber wenn etwas ausfällt, Parsec wirft einen Fehler wie:

*** Failed (after 1 test): 
Exception: 
    (line 302, column 3): 
    unexpected "\n" 
    expecting space 

Dies ist nützlich - aber nach dem Test verschwinden die Inhalte der beliebigen Datei fehlschlägt. Ich kann nicht gehen und Referenzzeile 302.

Die einzige Alternative, die ich sehen kann, ist das Drucken der fContents von jeder beliebigen Datei nach jedem Test - aber das scheint eine schreckliche Idee. Gleiches gilt für das Weiterleiten jeder beliebigen Datei an eine Datei auf der Festplatte zur späteren Referenz.

Gibt es einen gemeinsamen Weg?

+1

Es gibt eine andere Frage darüber, wie man den Wert zurückgibt, für den quickCheck fehlgeschlagen ist: http://stackoverflow.com/questions/8191131/find-the-value-that-failed-for-quickcheck –

+0

@JakobRunge Ich denke ich schon habe diesen Wert - mir fehlt ein Weg, die Zeilennummer von Parsec zu bekommen und einen Blick auf den Dateiinhalt zu werfen. – sdasdadas

+1

Wenn Sie wissen, wie Sie den fehlerhaften Wert erhalten, und Parsec Ihnen die Zeilen- und Spaltennummer gegeben hat, sollten Sie nicht in der Lage sein, an diesen Ort zu gehen, um zu sehen, welche Eingabe den Fehler verursacht? – user2407038

Antwort

1

Sie können whenFail verwenden, um die fehlerhafte Zeichenfolge bei einem Fehler zu drucken (oder in eine Datei abzulegen).