{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TemplateHaskell #-}
-- Bricks
import Bricks.Expression
import Bricks.Expression.Construction
import Bricks.Rendering
-- Bricks internal
import Bricks.Internal.Prelude
import qualified Bricks.Internal.Seq as Seq
import Bricks.Internal.Text (Text)
-- Bricks test
import Bricks.Test.Hedgehog
import Bricks.Test.QQ
-- Hedgehog
import Hedgehog (Property, property, withTests, (===))
import qualified Hedgehog
-- Base
import System.IO (IO)
main :: IO ()
main = runTests $$(Hedgehog.discover)
prop_render_expression :: Property
prop_render_expression = withTests 1 $ property $ do
render'expression
renderContext'default
(dot (var "a") (str ["b"]))
=== [text|a.b|]
render'expression
renderContext'default
(dot (var "a") (var "b"))
=== [text|a.${b}|]
render'expression
renderContext'default
(dot (str ["a"]) (str ["b", antiquote (var "c")]))
=== [text|"a"."b${c}"|]
render'expression
renderContext'default
(lambda
(param "a" <> pattern
[ dict'param "f"
, dict'param "b" & def (apply (var "g") (var "x"))
] <> ellipsis)
(apply (var "f") (var "b")))
=== [text|┃a@{ f, b ? g x, ... }:
┃f b|]
render'expression
renderContext'default
(let'in
[ let'eq "d" (dict
[ dict'eq (str ["a"]) (str ["b", antiquote (var "c")])
, dict'inherit'from (var "x") ["y", "z"]
])]
(dot (var "d") (str ["y"])))
=== [text|┃let
┃ d = {
┃ a = "b${c}";
┃ inherit (x) y z;
┃ };
┃in
┃ d.y|]
prop_render_identifier :: Property
prop_render_identifier = withTests 1 $ property $ do
let
test :: Text -> Text
test x =
render'strStatic'unquotedIfPossible renderContext'default $
Str'Static x Nothing
test "abc" === [text|abc|]
test "a\"b" === [text|"a\"b"|]
test "-ab" === [text|-ab|]
test "" === [text|""|]
prop_render_string_dynamic_quoted :: Property
prop_render_string_dynamic_quoted = withTests 1 $ property $ do
let
test :: [Str'1] -> Text
test xs =
render'strDynamic'quoted renderContext'default $
Str'Dynamic (Seq.fromList xs) Nothing
test [] === [text|""|]
test [ Str'1'Literal (Str'Static "hello" Nothing) ] === [text|"hello"|]
test [ Str'1'Literal (Str'Static "escape ${ this and \" this" Nothing) ]
=== [text|"escape \${ this and \" this"|]
test [ Str'1'Literal (Str'Static "Hello, my name is " Nothing)
, Str'1'Antiquote (var "name")
, Str'1'Literal (Str'Static "!" Nothing)
]
=== [text|"Hello, my name is ${name}!"|]
prop_render_dict_pattern :: Property
prop_render_dict_pattern = withTests 1 $ property $ do
let
test :: [DictPattern'1] -> Bool -> Text
test a b =
render'dictPattern renderContext'default $
DictPattern (Seq.fromList a) b
test [] False === [text|{ }|]
test [] True === [text|{ ... }|]
let
item1 = dict'param "x"
item2 = dict'param "y" & def (str ["abc"])
test [ item1, item2 ] False === [text|{ x, y ? "abc" }|]
test [ item1, item2 ] True === [text|{ x, y ? "abc", ... }|]
prop_render_list :: Property
prop_render_list = withTests 1 $ property $ do
let
test :: [Expression] -> Text
test x =
render'list renderContext'default $
List (Seq.fromList x) Nothing
test [] === [text|[ ]|]
test [ var "a" ] === [text|┃[
┃ a
┃]|]
test [ var "a", var "b" ] === [text|┃[
┃ a
┃ b
┃]|]
let a = apply (var "f") (var "x")
test [ a ] === [text|┃[
┃ (f x)
┃]|]
test [ a, var "a" ] === [text|┃[
┃ (f x)
┃ a
┃]|]