import Control.Monad ((<=<)) import Data.Default (Default(def)) import Data.Maybe (fromMaybe) import Data.Time.Calendar (fromGregorian) import Data.Time.LocalTime (LocalTime(..), TimeOfDay(..)) import Paths_clippings (getDataFileName) import Test.Assert (runAssertions) import Text.Kindle.Clippings.Reader (readClipping) import Text.Kindle.Clippings.Types (Clipping(..),Interval(..),Document(..),Position(..),Content(..)) import Text.Kindle.Clippings.Writer () import Text.Parsec (parse) fromMaybeEither :: Default b => Either a (Maybe b) -> b fromMaybeEither = fromMaybe def .$ either (Just . const def) id (.$) :: (b -> c) -> (a -> b) -> a -> c (.$) = ((.) $) getClipping :: String -> Clipping getClipping = fromMaybeEither . parse readClipping "tests/Reader.hs" inFixture :: Clipping inFixture = Clipping { date = LocalTime (fromGregorian 2013 06 10) (TimeOfDay 6 58 17) , document = Document "Haskell Monoids and their Uses" (Just "sigfpe") , position = Position Nothing . Just $ Proper 3 4 , content = Highlight "Haskell is a great language for constructing code modularly from small but orthogonal building blocks." } inPw2Fixture :: Clipping inPw2Fixture = Clipping { date = LocalTime (fromGregorian 2014 06 08) (TimeOfDay 20 36 53) , document = Document "Stand on Zanzibar" (Just "John Brunner") , position = Position Nothing . Just $ Proper 4607 4607 , content = Highlight "Shinka will" } inPw2pdfFixture :: Clipping inPw2pdfFixture = Clipping { date = LocalTime (fromGregorian 2014 07 29) (TimeOfDay 07 53 28) , document = Document "Tyler Cowen-Creative Destruction_ How Globalization Is Changing the World's Cultures-Princeton University Press (2002)_k2opt" Nothing , position = Position (Just $ Proper 303 303) Nothing , content = Highlight "The fundamental story about consumer taste, in modern times, is not one of dumbing down or of producers seeking to satisfy a homogeneous least common denominator at the expense of quality. Rather, the basic trend is of increasing variety and diversity, at all levels of quality, high and low" } getTitle :: Clipping -> String getTitle = title . document getAuthor :: Clipping -> Maybe String getAuthor = author . document main :: IO () main = do [clipping, brackets, nested, pw2, pw2pdf] <- mapM (readFile <=< getDataFileName) [ "tests/fixtures/clipping.txt" , "tests/fixtures/brackets.txt" , "tests/fixtures/nested_brackets.txt" , "tests/fixtures/pw2clipping.txt" , "tests/fixtures/pw2pdfclipping.txt" ] runAssertions $ [ ("Fixture should parse to sigfpe clipping.", getClipping clipping == inFixture) , ("Brackets in clippings' titles should be preserved." , getTitle (getClipping brackets) == "An Introduction to Statistical Learning: with Applications in R (Springer Texts in Statistics)") , ("Nested brackets in clippings' authors should be preserved.", getAuthor (getClipping nested) == Just "G. K. (Gilbert Keith) Chesterton") , ("Pw2Fixture should parse to Zanzibar clipping", getClipping pw2 == inPw2Fixture) , ("Pw2pdfFixture should parse to Tyler clipping", getClipping pw2pdf == inPw2pdfFixture) ]