content: --   Copyright 2013 Mario Pastorelli (pastorelli.mario@gmail.com) Samuel Gélineau (gelisam@gmail.com)
  --
  --   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 ExtendedDefaultRules,OverloadedStrings #-}
  module System.Console.Hawk.Representable.Test where
  
  import Data.Map (Map)
  import qualified Data.Map as M
  import Data.Set (Set)
  import qualified Data.Set as S
  
  import System.Console.Hawk.Representable
  
  import Test.Hspec 
  
  
  -- explicitly type all values to avoid warnings.
  
  _1,_2,_3,_4,_5,_6,_7,_8,_9,_10 :: Int
  (_1,_2,_3,_4,_5,_6,_7,_8,_9,_10) = (1,2,3,4,5,6,7,8,9,10)
  
  emptyString,word,word_word,w_w :: String
  (emptyString,word,word_word,w_w) = ("","word","word word","w w")
  
  
  reprSpec' :: Spec
  reprSpec' = describe "repr'" $ do
      it "can convert tuple values" $ do
        example $ repr' " " (_1,True) `shouldBe` "1 True"
        example $ repr' " " (_1,True,_2) `shouldBe` "1 True 2"
        example $ repr' " " (_1,_2,_3,_4) `shouldBe` "1 2 3 4"
        example $ repr' " " (_1,_2,_3,_4,_5) `shouldBe` "1 2 3 4 5"
        example $ repr' " " (_1,_2,_3,_4,_5,_6) `shouldBe` "1 2 3 4 5 6"
        example $ repr' " " (_1,_2,_3,_4,_5,_6,_7) `shouldBe` "1 2 3 4 5 6 7"
        example $ repr' " " (_1,_2,_3,_4,_5,_6,_7,_8) `shouldBe` "1 2 3 4 5 6 7 8"
        example $ repr' " " (_1,_2,_3,_4,_5,_6,_7,_8,_9) `shouldBe` "1 2 3 4 5 6 7 8 9"
        example $ repr' " " (_1,_2,_3,_4,_5,_6,_7,_8,_9,_10) `shouldBe` "1 2 3 4 5 6 7 8 9 10"
  
  reprSpec :: Spec
  reprSpec = describe "repr" $ do
      it "can convert boolean values" $ do
          repr "\t" True `shouldBe` ["True"]
          repr "\t" False `shouldBe` ["False"]
  
      it "can convert char values" $ example $
          repr "\t" 'c' `shouldBe` ["c"]
  
      it "can convert double values" $ example $
          repr "\t" (1.1::Double) `shouldBe` ["1.1"]
  
      it "can convert float values" $ example $
          repr "\t" (1.1::Float) `shouldBe` ["1.1"]
  
      it "can convert int values" $ example $
          repr "\t" (1::Int) `shouldBe` ["1"]
  
      it "can convert integer values" $ example $
          repr "\t" (1::Integer) `shouldBe` ["1"]
  
      it "can convert maybe values" $ do 
          example $ repr "\t" (Nothing::Maybe ()) `shouldBe` [""]
          example $ repr "\t" (Just 1::Maybe Int) `shouldBe` ["1"]
          example $ repr "\t" (Just (Just True)) `shouldBe` ["True"]
  
      it "can convert unit value" $
          repr "\t" () `shouldBe` [""]
  
      it "can convert string values" $ do
          example $ repr "\t" emptyString `shouldBe` [""]
          example $ repr "\t" word `shouldBe` ["word"]
          example $ repr "\t" word_word `shouldBe` ["word word"]
  
      it "can convert tuple values" $ do
          example $ repr "\t" (_1,True) `shouldBe` ["1","True"]
          example $ repr "\t" ((_1,_2),False) `shouldBe` ["1\t2","False"]
          example $ repr "\t" (_1,_2,_3) `shouldBe` ["1","2","3"]
          example $ repr "\t" (_1,_2,_3,_4) `shouldBe` ["1","2","3","4"]
          example $ repr "\t" (_1,_2,_3,_4,_5) `shouldBe` ["1","2","3","4","5"]
          example $ repr "\t" (_1,_2,_3,_4,_5,_6) `shouldBe` ["1","2","3","4","5","6"]
          example $ repr "\t" (_1,_2,_3,_4,_5,_6,_7) `shouldBe` ["1","2","3","4","5","6","7"]
          example $ repr "\t" (_1,_2,_3,_4,_5,_6,_7,_8) `shouldBe` ["1","2","3","4","5","6","7","8"]
          example $ repr "\t" (_1,_2,_3,_4,_5,_6,_7,_8,_9) `shouldBe` ["1","2","3","4","5","6","7","8","9"]
          example $ repr "\t" (_1,_2,_3,_4,_5,_6,_7,_8,_9,_10) `shouldBe` ["1","2","3","4","5","6","7","8","9","10"]
  
      it "can convert list values" $ do
          repr "\t" ([]::[()]) `shouldBe` []
          example $ repr "\t" [True] `shouldBe` ["True"]
          example $ repr "\t" [True,False] `shouldBe` ["True","False"]
          example $ repr "\t" [Just _1,Nothing] `shouldBe` ["1",""]
          example $ repr "\t" [[_1,_2,_3],[_4,_5,_6]] `shouldBe` ["1\t2\t3","4\t5\t6"]
          example $ repr "\t" [w_w,w_w] `shouldBe` ["w w","w w"]
          example $ repr "\t" [[w_w],[w_w]] `shouldBe` ["w w","w w"]
  
      it "can convert map values" $ do
          repr "\t" (M.empty::Map Bool Bool) `shouldBe` []
          example $ repr "\t" (M.fromList [(_1,_2),(_3,_4)]) `shouldBe` ["1\t2","3\t4"]
          example $ repr "\t" ([M.fromList [(_1,_2),(_3,_4)]]) `shouldBe` ["1 2\t3 4"]
  
      it "can convert set values" $ do
          repr "\t" (S.empty::Set Bool) `shouldBe` []
          example $ repr "\t" (S.fromList [_1,_2,_3,_4]) `shouldBe` ["1","2","3","4"]
          example $ repr "\t" ([S.fromList [_1,_2]]) `shouldBe` ["1\t2"]
  