content: {-# LANGUAGE DeriveAnyClass    #-}
  {-# LANGUAGE DeriveGeneric     #-}
  {-# LANGUAGE OverloadedStrings #-}
  
  module Dhall.Test.Tutorial where
  
  import qualified Data.Vector
  import qualified Dhall
  import qualified Dhall.Test.Substitution as Substitution
  import qualified Dhall.Test.Util         as Util
  import qualified Test.Tasty
  import qualified Test.Tasty.HUnit
  
  import Data.Text        (Text)
  import Dhall            (ToDhall)
  import GHC.Generics     (Generic)
  import Numeric.Natural  (Natural)
  import Test.Tasty       (TestTree)
  import Test.Tasty.HUnit ((@?=))
  
  tests :: TestTree
  tests =
      Test.Tasty.testGroup "tutorial"
          [ Test.Tasty.testGroup "Interpolation"
              [ _Interpolation_0
              , _Interpolation_1
              ]
          , Test.Tasty.testGroup "Functions"
              [ _Functions_0
              , _Functions_1
              , _Functions_2
              ]
          , Test.Tasty.testGroup "Unions"
              [ example 0 "./tests/tutorial/unions0A.dhall" "./tests/tutorial/unions0B.dhall"
              , example 1 "./tests/tutorial/unions1A.dhall" "./tests/tutorial/unions1B.dhall"
              , example 3 "./tests/tutorial/unions3A.dhall" "./tests/tutorial/unions3B.dhall"
              , example 4 "./tests/tutorial/unions4A.dhall" "./tests/tutorial/unions4B.dhall"
              ]
          , Test.Tasty.testGroup "Substitutions"
              [ Test.Tasty.HUnit.testCase "substitution1.dhall" $ do
                  res <- Substitution.substituteResult "tests/tutorial/substitution1.dhall"
                  res @?= Substitution.Failure 1
              , Test.Tasty.HUnit.testCase "substitution2.dhall" $ do
                  res <- Substitution.substituteResult "tests/tutorial/substitution2.dhall"
                  res @?= Substitution.Failure 1
              , Test.Tasty.HUnit.testCase "substitution3.dhall" $ do
                  res <- Substitution.substituteFoo "tests/tutorial/substitution3.dhall"
                  res @?= True
              ]
          ]
  
  _Interpolation_0 :: TestTree
  _Interpolation_0 = Test.Tasty.HUnit.testCase "Example #0" (do
      e <- Util.code
          "    let name = \"John Doe\"                                 \n\
          \in  let age  = 21                                           \n\
          \in  \"My name is ${name} and my age is ${Natural/show age}\"\n"
      Util.assertNormalizesTo e "\"My name is John Doe and my age is 21\"" )
  
  _Interpolation_1 :: TestTree
  _Interpolation_1 = Test.Tasty.HUnit.testCase "Example #1" (do
      e <- Util.code
          "''\n\
          \    for file in *; do         \n\
          \      echo \"Found ''${file}\"\n\
          \    done                      \n\
          \''                            \n"
      Util.assertNormalized e )
  
  _Functions_0 :: TestTree
  _Functions_0 = Test.Tasty.HUnit.testCase "Example #0" (do
      let text = "\\(n : Bool) -> [ n && True, n && False, n || True, n || False ]"
      makeBools <- Dhall.input Dhall.auto text
      makeBools True @?= Data.Vector.fromList [True,False,True,True] )
  
  _Functions_1 :: TestTree
  _Functions_1 = Test.Tasty.HUnit.testCase "Example #1" (do
      let text = "λ(x : Bool) → λ(y : Bool) → x && y"
      makeBools <- Dhall.input Dhall.auto text
      makeBools True False @?= False )
  
  data Example0 = Example0 { foo :: Bool, bar :: Bool }
      deriving (Generic, ToDhall)
  
  _Functions_2 :: TestTree
  _Functions_2 = Test.Tasty.HUnit.testCase "Example #2" (do
      f <- Dhall.input Dhall.auto "λ(r : { foo : Bool, bar : Bool }) → r.foo && r.bar"
      f (Example0 { foo = True, bar = False }) @?= False
      f (Example0 { foo = True, bar = True  }) @?= True )
  
  example :: Natural -> Text -> Text -> TestTree
  example n text0 text1 =
      Test.Tasty.HUnit.testCase
          ("Example #" <> show n)
          (Util.equivalent text0 text1)
  