packages feed

hnix-0.3.4: tests/EvalTests.hs

{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE OverloadedStrings #-}
module EvalTests (tests) where

import Data.Fix

import Test.Tasty
import Test.Tasty.HUnit
import Test.Tasty.TH

import Nix.Eval
import Nix.Parser
import Nix.Expr

import Data.Monoid (Monoid(..))
import Prelude (String)

case_basic_sum :: Assertion
case_basic_sum = constantEqualStr "2" "1 + 1"

case_basic_function :: Assertion
case_basic_function = constantEqualStr "2" "(a: a) 2"

case_set_attr :: Assertion
case_set_attr = constantEqualStr "2" "{ a = 2; }.a"

case_function_set_arg :: Assertion
case_function_set_arg = constantEqualStr "2" "({ a }: 2) { a = 1; }"

case_function_set_two_arg :: Assertion
case_function_set_two_arg = constantEqualStr "2" "({ a, b ? 3 }: b - a) { a = 1; }"

-- case_function_set_two_arg_default_scope :: Assertion
-- case_function_set_two_arg_default_scope = constantEqualStr "2" "({ a, b ? a * 3 }: b - a) { a = 1; }"

tests :: TestTree
tests = $testGroupGenerator

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

constantEqual :: NExpr -> NExpr -> Assertion
constantEqual a b = do
    Fix (NVConstant a') <- evalExpr a (Fix (NVSet mempty))
    Fix (NVConstant b') <- evalExpr b (Fix (NVSet mempty))
    assertEqual "" a' b'

constantEqualStr :: String -> String -> Assertion
constantEqualStr a b =
  let Success a' = parseNixString a
      Success b' = parseNixString b
  in constantEqual a' b'