packages feed

aeson-schemas-1.4.0.0: test/Tests/Quickstart.hs

{-# LANGUAGE OverloadedStrings #-}

module Tests.Quickstart (test) where

import Data.Maybe (fromMaybe)
import Data.Text (Text)
import qualified Data.Text as Text
import qualified Data.Text.IO as Text
import System.FilePath ((</>))
import System.IO.Temp (withSystemTempDirectory)
import System.Process (readProcess)
import Test.Tasty (TestTree)

import TestUtils (testGoldenIO)

test :: TestTree
test = testGoldenIO "README Quickstart works" "README_Quickstart.golden" $
  withSystemTempDirectory "readme-quickstart" $ \tmpdir -> do
    let testfile = tmpdir </> "readme_quickstart.hs"
    readme <- Text.readFile "README.md"
    Text.writeFile testfile (getQuickstartCode readme)
    readProcess "runghc" [testfile] ""

getQuickstartCode :: Text -> Text
getQuickstartCode = Text.unlines . getQuickstartLines . Text.lines
  where
    getQuickstartLines readmeLines =
      fromMaybe (error "Could not find Quickstart in README") $
        between (== "## Quickstart") ("## " `Text.isPrefixOf`) readmeLines
          >>= between (== "```haskell") (== "```")

    between start end xs =
      case dropWhile (not . start) xs of
        [] -> Nothing
        _ : afterStart -> Just $ takeWhile (not . end) afterStart