-- Copyright 2021 Google LLC -- -- 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 DataKinds #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE DerivingVia #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE TypeApplications #-} module Main where import Test.Framework (defaultMain, testGroup) import Test.Framework.Providers.HUnit (testCase) import Test.HUnit ((@?=)) import Data.Portray import Data.Portray.Prettyprinter main :: IO () main = defaultMain [ testGroup "Atom" [ testCase "()" $ prettyShowPortrayal "()" @?= "()" , testCase "2" $ prettyShowPortrayal "2" @?= "2" ] , testGroup "Apply" [ testCase "nullary" $ prettyShowPortrayal (Apply "Nothing" []) @?= "Nothing" , testCase "nullary 2" $ prettyShowPortrayal (Apply "id" [Apply "Nothing" []]) @?= "id Nothing" , testCase "unary" $ prettyShowPortrayal (Apply "Just" ["2"]) @?= "Just 2" , testCase "parens" $ prettyShowPortrayal (Apply "Just" [Apply "Just" ["2"]]) @?= "Just (Just 2)" , testCase "binary" $ prettyShowPortrayal (Apply "These" ["2", "4"]) @?= "These 2 4" , testCase "nested" $ prettyShowPortrayal (Apply (Apply "These" ["2"]) ["4"]) @?= "These 2 4" ] , testGroup "Binop" [ testCase "operator" $ prettyShowPortrayal (Binop ":|" (infixr_ 5) "5" (List [])) @?= "5 :| []" , testCase "con" $ prettyShowPortrayal (Binop "`InfixCon`" (infixl_ 9) "2" "True") @?= "2 `InfixCon` True" , testCase "nest prec" $ prettyShowPortrayal (Binop "+" (infixl_ 6) (Binop "*" (infixl_ 7) "2" "4") "6") @?= "2 * 4 + 6" , testCase "nest anti-prec" $ prettyShowPortrayal (Binop "*" (infixl_ 7) (Binop "+" (infixl_ 6) "2" "4") "6") @?= "(2 + 4) * 6" , testCase "nest assoc" $ prettyShowPortrayal (Binop "+" (infixl_ 6) (Binop "+" (infixl_ 6) "2" "4") "6") @?= "2 + 4 + 6" , testCase "nest anti-assoc" $ prettyShowPortrayal (Binop "+" (infixl_ 6) "2" (Binop "+" (infixl_ 6) "4" "6")) @?= "2 + (4 + 6)" ] , testGroup "Tuple" [ testCase "pair" $ prettyShowPortrayal (Tuple ["2", "4"]) @?= "(2, 4)" , testCase "triple" $ prettyShowPortrayal (Tuple ["2", "4", "6"]) @?= "(2, 4, 6)" , testCase "line-break" $ prettyShowPortrayal (Tuple ["222", strAtom (replicate 80 '2')]) @?= "( 222\n\ \, 2222222222222222222222222222222222222222222222222222222222222\ \2222222222222222222\n\ \)" ] , testGroup "List" [ testCase "empty" $ prettyShowPortrayal (List []) @?= "[]" , testCase "singleton" $ prettyShowPortrayal (List ["2"]) @?= "[2]" ] , testGroup "LambdaCase" [ testCase "empty" $ prettyShowPortrayal (LambdaCase []) @?= "\\case {}" , testCase "singleton" $ prettyShowPortrayal (LambdaCase [("()", "2")]) @?= "\\case {() -> 2}" , testCase "two" $ prettyShowPortrayal (LambdaCase [("True", "2"), ("False", "4")]) @?= "\\case {True -> 2; False -> 4}" , testCase "line-break" $ prettyShowPortrayal (LambdaCase [ ("True", strAtom (replicate 40 '2')) , ("False", strAtom (replicate 40 '4')) ]) @?= "\\case\n\ \ { True -> 2222222222222222222222222222222222222222\n\ \ ; False -> 4444444444444444444444444444444444444444\n\ \ }" , testCase "no-parens" $ prettyShowPortrayal (LambdaCase [(Apply "Just" ["2"], Apply "Just" ["4"])]) @?= "\\case {Just 2 -> Just 4}" ] , testGroup "Record" [ testCase "empty" $ prettyShowPortrayal (Record "Nothing" []) @?= "Nothing" , testCase "singleton" $ prettyShowPortrayal (Record "Just" [FactorPortrayal "it" "2"]) @?= "Just {it = 2}" , testCase "two" $ prettyShowPortrayal (Record "These" [FactorPortrayal "l" "2", FactorPortrayal "r" "4"]) @?= "These {l = 2, r = 4}" , testCase "line-break" $ prettyShowPortrayal (Record "These" [ FactorPortrayal "l" (portray @[Int] [0..10]) , FactorPortrayal "r" (portray @[Int] [0..10]) ]) @?= "These\n\ \ { l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\n\ \ , r = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\n\ \ }" ] , testGroup "TyApp" [ testCase "con" $ prettyShowPortrayal (TyApp "typeRep" "Int") @?= "typeRep @Int" , testCase "parens" $ prettyShowPortrayal (TyApp "typeRep" (Apply "Maybe" ["Int"])) @?= "typeRep @(Maybe Int)" , testCase "line-break" $ prettyShowPortrayal (TyApp (strAtom $ replicate 50 'a') (strAtom $ replicate 50 'a')) @?= "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n\ \ @aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" ] , testGroup "TySig" [ testCase "con" $ prettyShowPortrayal (TySig "2" "Int") @?= "2 :: Int" , testCase "no-parens" $ prettyShowPortrayal (TySig (Apply "Just" ["2"]) (Apply "Maybe" ["Int"])) @?= "Just 2 :: Maybe Int" , testCase "line-break" $ prettyShowPortrayal (TySig (strAtom $ replicate 50 'a') (strAtom $ replicate 50 'a')) @?= "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n\ \ :: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" , testCase "parens" $ prettyShowPortrayal (Apply "Just" [TySig "2" "Int"]) @?= "Just (2 :: Int)" ] ]