{-# LANGUAGE OverloadedStrings, OverloadedLists #-} {-# LANGUAGE StandaloneDeriving #-} {-# LANGUAGE ViewPatterns #-} module Thermoprint.Server.Printer.GenericSpec (spec) where import Test.Hspec import Test.Hspec.QuickCheck (prop) import Test.QuickCheck (Property, Discard(..), property) import Test.QuickCheck.Instances import Thermoprint.Server.Printer.Generic import Thermoprint.Printout import Data.Text (Text) import qualified Data.Text.Lazy as TL (pack) import qualified Data.ByteString.Lazy as L (ByteString) import qualified Data.ByteString.Lazy as L.BS import Data.String (IsString(..)) import Control.Monad (zipWithM_, join) import Data.Monoid ((<>)) import Data.Function (on) import Data.Word import Data.Sequence (Seq) import qualified Data.Sequence as Seq instance IsString Line where fromString = (\(Right l) -> l) . text . TL.pack spec :: Spec spec = do describe "example printouts" $ zipWithM_ example [1..] examples where example n (s, ts) = let str = show s in specify str $ (mkPrintout . Printout . fmap (Paragraph . Seq.singleton) . fmap Cooked $ s) == ts final, initial :: L.ByteString initial = esc [64] <> esc [64] final = "\n\n\n \n" esc :: [Word8] -> L.ByteString esc = L.BS.pack . (27:) p :: L.ByteString -> L.ByteString p = (<> final) . (initial <>) examples :: [(Seq Block, L.ByteString)] examples = [ ( [Line (JuxtaPos ["Hello", HSpace 1, "World!"])] , p "Hello World!") , ( [Line (JuxtaPos ["Hello", HSpace 4, "World!"])] , p "Hello World!") , ( [Line ("Par1"), Line ("Par2"), Line (JuxtaPos ["Par3", HSpace 1, "Word2"])] , p "Par1\n\nPar2\n\nPar3 Word2") , ( [Line (JuxtaPos ["Par1", HSpace 4]), NewlSep [VSpace 2, Line ("Par2")], Line (JuxtaPos ["Par3", HSpace 1, "Word2"])] , p "Par1 \n\n\n\n\nPar2\n\nPar3 Word2") , ( [Line (JuxtaPos [Markup [Bold] (JuxtaPos ["B",HSpace 1,Markup [Underline] "BM"]),HSpace 1,Markup [Bold,Underline] "BM"])] , p $ esc [33, 8] <> "B " <> esc [33, 128 + 8] <> "BM" <> esc [33, 8] <> esc [33, 0] <> " " <> esc [33, 128 + 8] <> "BM" <> esc [33, 0]) ]