packages feed

scrapbook-0.3.2: test/Test/ScrapBook/Cmd.hs

{-# LANGUAGE LambdaCase        #-}
{-# LANGUAGE OverloadedLabels  #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE PolyKinds         #-}

module Test.ScrapBook.Cmd where

import           RIO

import           Data.Extensible
import           Data.Extensible.GetOpt
import           ScrapBook.Cmd
import           Test.Tasty
import           Test.Tasty.HUnit

opts :: Options
opts
    = #input   @= ["sites.yaml"]
   <: #output  @= Just "example"
   <: #write   @= embedAssoc (#feed @= ())
   <: #version @= False
   <: nil

getOptRecord' ::
  RecordOf (OptionDescr h) xs
  -> [String]
  -> Either [String] (RecordOf h xs, [String])
getOptRecord' r args = getOptRecord r args & \case
  (result, rs, [], _) -> Right (result, rs)
  (_, _, errs, _)     -> Left errs

test_toCmd :: [TestTree]
test_toCmd =
  [ testCase "default optsion" $
      toCmd opts @?= RunScrapBook opts
  , testCase "#version field is True" $
      toCmd (opts & #version `set` True) @?= PrintVersion
  ]

test_optParser :: [TestTree]
test_optParser =
  [ testCase "correct case: basic" $
      getOptRecord' parser ["-o", "example", "sites.yaml"] @?=
        Right (shrink opts, ["sites.yaml"])
  , testCase "correct case: version" $
      getOptRecord' parser ["--version", "-o", "example", "sites.yaml"] @?=
        Right (shrink (opts & #version `set` True) , ["sites.yaml"])
  , testCase "correct case: no output" $
      getOptRecord' parser ["sites.yaml"] @?=
        Right (shrink (opts & #output `set` Nothing) , ["sites.yaml"])
  , testCase "correct case: no arguments" $
      getOptRecord' parser [] @?=
        Right (shrink (opts & #output `set` Nothing) , [])
  , testCase "correct case: feed format " $
      getOptRecord' parser ["-o", "example", "-t", "feed", "sites.yaml"] @?=
        Right (shrink opts , ["sites.yaml"])
  , testCase "correct case: json format " $
      getOptRecord' parser ["-o", "example", "-t", "json", "sites.yaml"] @?=
        Right (shrink (opts & #write `set` embedAssoc (#json @= ())) , ["sites.yaml"])
  , testCase "incorrect case: unkown ooption" $
      getOptRecord' parser ["-h", "-o", "example", "sites.yaml"] @?=
        Left ["unrecognized option `-h'\n"]
  ]
  where
    parser
        = #output  @= outputOpt
       <: #write   @= writeFormatOpt
       <: #version @= versionOpt
       <: nil