2015-06-15 19 views
10

Da Doctest's readme, si può usare doctest con QuickCheck, in questo modo:Come posso utilizzare l'input multi-linea con QuickCheck in doctest?

-- | 
-- prop> sort xs == (sort . sort) (xs :: [Int]) 

Vorrei descrivere questa struttura utilizzando più righe, probabilmente come

-- | 
-- prop> sort xs == 
--   (sort . sort) (xs :: [Int]) 

doctest stesso supporta input multi-line (ancora una volta da readme)

-- | 
-- >>> :{ 
-- let 
-- x = 1 
-- y = 2 
-- in x + y + multiline 
-- :} 
-- 6 

e ho provato diverse sintassi simile mi è venuta, come

-- | 
-- prop> :{ sort xs == 
--   (sort . sort) (xs :: [Int]) 
-- }: 

senza alcun successo. (Nell'esempio sopra, il messaggio di errore è parse error on input '{'.)

Come è possibile utilizzare l'input su più righe con Quickcheck in doctest?

+0

Credo che proprio come ghci, la sintassi su più righe richiede che i simboli di apertura e chiusura si trovino sulla loro stessa linea. Il tuo esempio non funzionerà perché ': {' non è sulla sua stessa linea. – user2407038

+0

@ user2407038 Credo che tu abbia ragione riguardo a quel caso. Non posso evitare l'errore di analisi e avere 'prop>' riconosce più righe come input. – Yosh

risposta

1

A partire da settembre 2017, doctest does not allow multi-line properties. Tuttavia, è possibile utilizzare quickCheck come al solito in un doctest:

-- >>> import Test.QuickCheck 
-- >>> import Data.List (sort) 
-- >>> :{ 
-- quickCheck $ \xs -> 
--  sort xs == 
--   (sort . sort) (xs :: [Int]) 
-- :} 
-- +++ OK, passed 100 tests. 

Questo è prolisso, ma vi permetterà di scrivere i controlli lunghi arbitrarie. Nota che puoi sempre creare una funzione prop_* e usarla nel tuo doctest.