packages feed

language-ninja-0.1.0: tests/Tests/Mock.hs

-- -*- coding: utf-8; mode: haskell; -*-

-- File: tests/Tests/Mock.hs
--
-- License:
--     Copyright 2017 Awake Security
--
--     Licensed under the Apache License, Version 2.0 (the "License");
--     you may not use this file except in compliance with the License.
--     You may obtain a copy of the License at
--
--       http://www.apache.org/licenses/LICENSE-2.0
--
--     Unless required by applicable law or agreed to in writing, software
--     distributed under the License is distributed on an "AS IS" BASIS,
--     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
--     See the License for the specific language governing permissions and
--     limitations under the License.

{-# LANGUAGE FlexibleContexts      #-}
{-# LANGUAGE FlexibleInstances     #-}
{-# LANGUAGE GADTs                 #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings     #-}
{-# LANGUAGE RankNTypes            #-}
{-# LANGUAGE StandaloneDeriving    #-}

-- |
--   Module      : Tests.Mock
--   Copyright   : Copyright 2017 Awake Security
--   License     : Apache-2.0
--   Maintainer  : opensource@awakesecurity.com
--   Stability   : experimental
--
--   This module contains concrete types that are used when mocking interfaces
--   defined in "Language.Ninja.Mock".
module Tests.Mock
  ( FSAction (..)
  ) where

import           Data.Text                    (Text)

import           Language.Ninja.Misc.Path     (Path)
import           Language.Ninja.Mock.ReadFile (MonadReadFile (..))

import qualified Control.Monad.Mock           as Mock
import           Data.Type.Equality           ((:~:) (Refl))

--------------------------------------------------------------------------------

data FSAction r where
  ReadFile  :: !Path          -> FSAction Text
  WriteFile :: !Path -> !Text -> FSAction ()

deriving instance Eq (FSAction r)
deriving instance Show (FSAction r)

instance Mock.Action FSAction where
  eqAction (a@(ReadFile  {})) (b@(ReadFile  {})) | (a == b) = Just Refl
  eqAction (a@(WriteFile {})) (b@(WriteFile {})) | (a == b) = Just Refl
  eqAction _                  _                             = Nothing

instance (Monad m) => MonadReadFile (Mock.MockT FSAction m) where
  readFile path = Mock.mockAction "readFile" (ReadFile path)

--------------------------------------------------------------------------------