packages feed

aeson-match-qq-1.7.0: test/Aeson/Match/QQ/Internal/PrettyPrintSpec.hs

{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE GeneralisedNewtypeDeriving #-}
{-# LANGUAGE OverloadedLists #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
module Aeson.Match.QQ.Internal.PrettyPrintSpec (spec) where

import           Test.Hspec

import           Aeson.Match.QQ (qq)
import           Aeson.Match.QQ.Internal.PrettyPrint (pp)


spec :: Spec
spec = do
  it "holes" $ do
    pp [qq| _ |] `shouldBe`
      "[qq|\n\
      \  _\n\
      \|]"
    pp [qq| _hole |] `shouldBe`
      "[qq|\n\
      \  _hole\n\
      \|]"
    pp [qq| _"fancy hole" |] `shouldBe`
      "[qq|\n\
      \  _\"fancy hole\"\n\
      \|]"
    pp [qq| _typed-hole : number |] `shouldBe`
      "[qq|\n\
      \  _typed-hole : number\n\
      \|]"

  it "basic values" $ do
    pp [qq| null |] `shouldBe`
      "[qq|\n\
      \  null\n\
      \|]"

    pp [qq| false |] `shouldBe`
      "[qq|\n\
      \  false\n\
      \|]"
    pp [qq| true |] `shouldBe`
      "[qq|\n\
      \  true\n\
      \|]"

    pp [qq| 4 |] `shouldBe`
      "[qq|\n\
      \  4\n\
      \|]"
    pp [qq| 7.42 |] `shouldBe`
      "[qq|\n\
      \  7.42\n\
      \|]"

    pp [qq| "" |] `shouldBe`
      "[qq|\n\
      \  \"\"\n\
      \|]"
    pp [qq| "foo" |] `shouldBe`
      "[qq|\n\
      \  \"foo\"\n\
      \|]"

    pp [qq| (ci) "" |] `shouldBe`
      "[qq|\n\
      \  (ci)\n\
      \  \"\"\n\
      \|]"
    pp [qq| (ci) "foo" |] `shouldBe`
      "[qq|\n\
      \  (ci)\n\
      \  \"foo\"\n\
      \|]"

  it "arrays" $ do
    pp [qq| [] |] `shouldBe`
      "[qq|\n\
      \  []\n\
      \|]"
    pp [qq| [1,2,3] |] `shouldBe`
      "[qq|\n\
      \  [ 1\n\
      \  , 2\n\
      \  , 3\n\
      \  ]\n\
      \|]"
    pp [qq| [1, ...] |] `shouldBe`
      "[qq|\n\
      \  [ 1\n\
      \  , ...\n\
      \  ]\n\
      \|]"
    pp [qq| [1, {qux: 42, quux: 0, ...}, 3] |] `shouldBe`
      "[qq|\n\
      \  [ 1\n\
      \  , { quux: 0\n\
      \    , qux: 42\n\
      \    , ...\n\
      \    }\n\
      \  , 3\n\
      \  ]\n\
      \|]"

    pp [qq| (unordered) [] |] `shouldBe`
      "[qq|\n\
      \  (unordered)\n\
      \  []\n\
      \|]"
    pp [qq| (unordered) [1,2,3] |] `shouldBe`
      "[qq|\n\
      \  (unordered)\n\
      \  [ 1\n\
      \  , 2\n\
      \  , 3\n\
      \  ]\n\
      \|]"

  it "objects" $ do
    pp [qq| {} |] `shouldBe`
      "[qq|\n\
      \  {}\n\
      \|]"
    pp [qq| {foo: 4, bar: 7} |] `shouldBe`
      "[qq|\n\
      \  { bar: 7\n\
      \  , foo: 4\n\
      \  }\n\
      \|]"
    pp [qq| {foo: 4, ...} |] `shouldBe`
      "[qq|\n\
      \  { foo: 4\n\
      \  , ...\n\
      \  }\n\
      \|]"
    pp [qq| {foo: 4, bar: {qux: 42, quux: 0, ...}, baz: 7} |] `shouldBe`
      "[qq|\n\
      \  { bar:\n\
      \    { quux: 0\n\
      \    , qux: 42\n\
      \    , ...\n\
      \    }\n\
      \  , baz: 7\n\
      \  , foo: 4\n\
      \  }\n\
      \|]"

    let
      spliced = 7 :: Int
    pp [qq| {foo: #{spliced}} |] `shouldBe`
      "[qq|\n\
      \  { foo: 7\n\
      \  }\n\
      \|]"