cue-sheet-0.1.1: tests/Text/CueSheet/RenderSpec.hs
{-# LANGUAGE OverloadedStrings #-}
module Text.CueSheet.RenderSpec
( spec )
where
import Control.Monad.Catch
import Data.List.NonEmpty (NonEmpty (..))
import Test.Hspec
import Test.QuickCheck
import Text.CueSheet.Parser
import Text.CueSheet.Render
import Text.CueSheet.Types
import qualified Data.ByteString.Lazy as BL
import qualified Data.List.NonEmpty as NE
spec :: Spec
spec =
describe "renderCueSheet" $ do
it "doesn't ever produce trailing whitespace" $
property $ \csrf cueSheet -> do
let r = renderCueSheet csrf cueSheet
f x = if csrf then BL.take (BL.length x - 1) x else x
BL.split 10 r `shouldNotSatisfy`
any ((" " `BL.isSuffixOf`) . f)
it "always ends with the specified new line sequence" $
property $ \csrf cueSheet -> do
let r = renderCueSheet csrf cueSheet
eol = if csrf then "\r\n" else "\n"
r `shouldSatisfy` (eol `BL.isSuffixOf`)
it "doesn't look too bad" $ do
expected <- BL.readFile "cue-sheet-samples/rendered0.cue"
cueSheet <- testCueSheet
renderCueSheet False cueSheet `shouldBe` expected
it "produces content that can be correctly parsed back" $
property $ \csrf cueSheet ->
parseCueSheet "" (renderCueSheet csrf cueSheet)
`shouldBe` Right cueSheet
-- | A manually constructed testing CUE sheet.
testCueSheet :: MonadThrow m => m CueSheet
testCueSheet = do
mcn <- mkMcn "1112223334445"
performer <- mkCueText "The Famous Foobar"
title <- mkCueText "Bobla Fett"
songwriter <- mkCueText "Paul"
isrc <- mkIsrc "agree1234567"
pregap <- fromMmSsFf 1 0 13
index <- fromMmSsFf 0 0 15
postgap <- fromMmSsFf 0 8 9
return CueSheet
{ cueCatalog = Just mcn
, cueCdTextFile = Just "/home/mark/mycdtextfile.txt"
, cuePerformer = Just performer
, cueTitle = Just title
, cueSongwriter = Just songwriter
, cueFirstTrackNumber = 1
, cueFiles = NE.fromList
[ CueFile
{ cueFileName = "the-famous-foobar-cd1.flac"
, cueFileType = Wave
, cueFileTracks = NE.fromList
[ CueTrack
{ cueTrackDigitalCopyPermitted = False
, cueTrackFourChannelAudio = False
, cueTrackPreemphasisEnabled = True
, cueTrackSerialCopyManagement = True
, cueTrackType = CueTrackAudio
, cueTrackIsrc = Just isrc
, cueTrackTitle = Just title
, cueTrackPerformer = Just performer
, cueTrackSongwriter = Nothing
, cueTrackPregap = Nothing
, cueTrackPregapIndex = Nothing
, cueTrackIndices = index :| []
, cueTrackPostgap = Nothing }
, CueTrack
{ cueTrackDigitalCopyPermitted = True
, cueTrackFourChannelAudio = True
, cueTrackPreemphasisEnabled = False
, cueTrackSerialCopyManagement = False
, cueTrackType = CueTrackCdg
, cueTrackIsrc = Just isrc
, cueTrackTitle = Just title
, cueTrackPerformer = Just performer
, cueTrackSongwriter = Nothing
, cueTrackPregap = Just pregap
, cueTrackPregapIndex = Nothing
, cueTrackIndices = index :| []
, cueTrackPostgap = Just postgap } ] }
, CueFile
{ cueFileName = "the-famous-foobar-cd2.mp3"
, cueFileType = MP3
, cueFileTracks = NE.fromList
[ CueTrack
{ cueTrackDigitalCopyPermitted = False
, cueTrackFourChannelAudio = False
, cueTrackPreemphasisEnabled = False
, cueTrackSerialCopyManagement = False
, cueTrackType = CueTrackMode1_2048
, cueTrackIsrc = Just isrc
, cueTrackTitle = Just title
, cueTrackPerformer = Just performer
, cueTrackSongwriter = Nothing
, cueTrackPregap = Nothing
, cueTrackPregapIndex = Nothing
, cueTrackIndices = index :| []
, cueTrackPostgap = Nothing }
, CueTrack
{ cueTrackDigitalCopyPermitted = True
, cueTrackFourChannelAudio = True
, cueTrackPreemphasisEnabled = True
, cueTrackSerialCopyManagement = True
, cueTrackType = CueTrackMode2_2336
, cueTrackIsrc = Just isrc
, cueTrackTitle = Just title
, cueTrackPerformer = Just performer
, cueTrackSongwriter = Nothing
, cueTrackPregap = Nothing
, cueTrackPregapIndex = Nothing
, cueTrackIndices = index :| []
, cueTrackPostgap = Nothing } ] }
]
}