{-# LANGUAGE OverloadedStrings #-} -- | Test suite module Main where import Data.Text.Arbitrary import Test.QuickCheck import qualified Data.Text as T import Data.Char import Optics.Core (view, Field1(_1)) import Token(MyTok(..) ,MyLoc(..) ,Tokenized) import Token.Haskell(tokenizer) import qualified Render.Debug import FindColumns import Render.ColSpan import Alignment(Processed) prop_tokenizer str = case tokenizer str of Nothing -> label "cannot lex" $ True Just t -> label "lexed" $ length t <= T.length str prop_debug_renderer_text_length input = case debug of Nothing -> label "cannot lex" $ True Just t -> label "lexed" $ all (uncurry (<=)) $ zip (extract input) (extract t) where extract :: T.Text -> [Int] extract = fmap T.length . T.lines debug :: Maybe T.Text debug = tokenizer input >>= (return . Render.Debug.render . findColumns) prop_colspans input = case debug of Nothing -> label "cannot lex" $ True Just t -> label "lexed" $ sameNumber t where extract :: T.Text -> [Int] extract = fmap T.length . T.lines debug :: Maybe [Int] debug = tokenizer input >>= (return . sumColSpans . findColumns) sameNumber [] = True sameNumber (n:ns) = all (n==) ns prop_tableColumns input = T.any (not . Data.Char.isSpace) input ==> case tokenizer input of Nothing -> label "cannot lex" $ True Just tokens | all ((TBlank==) . view _1) tokens -> label "only blanks" $ True Just tokens -> case findColumns tokens of [] -> label "empty" $ True t -> case sumColSpans t of [] -> label "no colspans" $ True c:_ -> label "tableColumns" $ c == length (tableColumns t) where extract :: T.Text -> [Int] extract = fmap T.length . T.lines debug :: Maybe [Processed] debug = tokenizer input >>= (return . findColumns) sameNumber [] = True sameNumber (n:ns) = all (n==) ns main :: IO () main = do problem " a\na" problem "--" problem "a\n a" quickCheck prop_tokenizer quickCheck prop_debug_renderer_text_length quickCheck $ withMaxSuccess 10000 prop_colspans -- is it sufficient? quickCheck $ withMaxSuccess 100000 prop_tableColumns -- is it sufficient? where problem example = do putStrLn $ "Example: " <> show example print $ tokenizer example >>= (return . tableColumns . findColumns) print $ tokenizer example >>= (return . sumColSpans . findColumns) print $ tokenizer example >>= (return . findColumns) print $ tokenizer example sumColSpans = map (sum . map (\(_,c,_) -> c)) . colspans