{-# LANGUAGE TemplateHaskell #-}

module Test.Flag where


import Data.Flag.Simple
import Data.Word

import Test.Framework
import Test.Framework.Providers.HUnit
import Test.Framework.TH
import Test.HUnit.Base
import Test.QuickCheck

import Test.Flag.Env


tests = $(testGroupGenerator)

test_showFlag =
  [ testCase "\"0000000000000000000000000000000000000000000000000000000001001001\" == showFlag  73" c_sF01
  , testCase "\"0000000000000000000000000000000000000000000000000000000001111101\" == showFlag 125" c_sF02
  , testCase "\"0000000000000000000000000000000000000000000000000000000011001011\" == showFlag 203" c_sF03
  , testCase "\"0000000000000000000000000000000000000000000000000000000011001111\" == showFlag 207" c_sF04
  , testCase "\"0000000000000000000000000000000000000000000000000000000101001001\" == showFlag 329" c_sF05
  ]

c_sF01 = "0000000000000000000000000000000000000000000000000000000001001001" @=? showFlag  73
c_sF02 = "0000000000000000000000000000000000000000000000000000000001111101" @=? showFlag 125
c_sF03 = "0000000000000000000000000000000000000000000000000000000011001011" @=? showFlag 203
c_sF04 = "0000000000000000000000000000000000000000000000000000000011001111" @=? showFlag 207
c_sF05 = "0000000000000000000000000000000000000000000000000000000101001001" @=? showFlag 329

test_eqAbout =
  [ testCase "eqAbout 125 203 329 == True" c_eA01
  , testCase "eqAbout 125 207 329 == False" c_eA02
  ]

c_eA01 = assertBool ""        (eqAbout 125 203 329)
c_eA02 = assertBool "" (not $ eqAbout 125 207 329)

-- To understand `readFlag` with any character which is not '0' or '1', read the document.
filterFlag = readFlag "0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F"

test_includeAbout =
  [ testCase "includeAbout (Flag '0101010101010101') (Flag '1110111011101110') (Flag '1110111011101110') == True" c_iA01
  , testCase "includeAbout (Flag '0101010101010101') (Flag '1110111011101110') (Flag '1010101010101110') == True" c_iA02
  , testCase "includeAbout (Flag '0101010101010101') (Flag '1110111001000100') (Flag '1110111011101110') == True" c_iA03
  , testCase "includeAbout (Flag '0101010101010101') (Flag '1110111011101110') (Flag '1110111011101111') == False" c_iA04
  , testCase "includeAbout (Flag '0101010101010101') (Flag '1110111011101110') (Flag '1010101010101011') == False" c_iA05
  ]

c_iA01 = assertBool ""       (includeAbout filterFlag (readFlag "_1_0_1_0_1_0_1_0") (readFlag "_1_0_1_0_1_0_1_0"))
c_iA02 = assertBool ""       (includeAbout filterFlag (readFlag "_1_0_1_0_1_0_1_0") (readFlag "_1_0_0_0_0_0_1_0"))
c_iA03 = assertBool ""       (includeAbout filterFlag (readFlag "_1_0_1_001000100") (readFlag "_1_0_1_0_1_0_1_0"))
c_iA04 = assertBool "" (not $ includeAbout filterFlag (readFlag "_1_0_1_0_1_0_1_0") (readFlag "_1_0_1_0_1_0_1_1"))
c_iA05 = assertBool "" (not $ includeAbout filterFlag (readFlag "_1_0_1_0_1_0_1_0") (readFlag "_0_0_0_0_0_0_0_1"))

test_excludeAbout =
  [ testCase "excludeAbout (Flag '0101010101010101') (Flag '1110111011101110') (Flag '1110111011101110') == True"  c_xA01
  , testCase "excludeAbout (Flag '0101010101010101') (Flag '1110111011101110') (Flag '1010101010101110') == True"  c_xA02
  , testCase "excludeAbout (Flag '0101010101010101') (Flag '1110111001000100') (Flag '1110111011101110') == True"  c_xA03
  , testCase "excludeAbout (Flag '0101010101010101') (Flag '1110111011101110') (Flag '1110111011101111') == False" c_xA04
  , testCase "excludeAbout (Flag '0101010101010101') (Flag '1110111011101110') (Flag '1010101010101011') == False" c_xA05
  ]

c_xA01 = assertBool ""       (excludeAbout filterFlag (readFlag "_1_0_1_0_1_0_1_0") (readFlag "_0_1_0_1_0_1_0_1"))
c_xA02 = assertBool ""       (excludeAbout filterFlag (readFlag "_1_0_1_0_1_0_1_0") (readFlag "_0_1_0_0_0_1_0_0"))
c_xA03 = assertBool ""       (excludeAbout filterFlag (readFlag "_1_0_1_001000100") (readFlag "_0_1_0_1_0_1_0_1"))
c_xA04 = assertBool "" (not $ excludeAbout filterFlag (readFlag "_1_0_1_0_1_0_1_0") (readFlag "_1_0_1_0_1_0_1_1"))
c_xA05 = assertBool ""       (excludeAbout filterFlag (readFlag "_1_0_1_0_1_0_1_0") (readFlag "_0_0_0_0_0_0_0_1"))

test_anyReq =
  [ testCase "anyReq (Flag '0000') (Flag '000') == True"  c_aR01
  , testCase "anyReq (Flag '0000') (Flag '001') == False" c_aR02
  , testCase "anyReq (Flag '0001') (Flag '001') == True"  c_aR03
  , testCase "anyReq (Flag '0001') (Flag '000') == True"  c_aR04
  , testCase "anyReq (Flag '0110') (Flag '001') == False" c_aR05
  , testCase "anyReq (Flag '0011') (Flag '001') == True"  c_aR06
  , testCase "anyReq (Flag '0011') (Flag '010') == True"  c_aR07
  , testCase "anyReq (Flag '0011') (Flag '100') == False" c_aR08
  , testCase "anyReq (Flag '0001') (Flag '101') == True"  c_aR09
  ]

c_aR01 = assertBool ""       (anyReq (readFlag "0000") (readFlag "000"))
c_aR02 = assertBool "" (not $ anyReq (readFlag "0000") (readFlag "001"))
c_aR03 = assertBool ""       (anyReq (readFlag "0001") (readFlag "001"))
c_aR04 = assertBool ""       (anyReq (readFlag "0001") (readFlag "000"))
c_aR05 = assertBool "" (not $ anyReq (readFlag "0110") (readFlag "001"))
c_aR06 = assertBool ""       (anyReq (readFlag "0011") (readFlag "001"))
c_aR07 = assertBool ""       (anyReq (readFlag "0011") (readFlag "010"))
c_aR08 = assertBool "" (not $ anyReq (readFlag "0011") (readFlag "100"))
c_aR09 = assertBool ""       (anyReq (readFlag "0001") (readFlag "101"))

test_allReq =
  [ testCase "allReq (Flag '0000') (Flag '000') == True"  c_AR01
  , testCase "allReq (Flag '0000') (Flag '001') == False" c_AR02
  , testCase "allReq (Flag '0001') (Flag '001') == True"  c_AR03
  , testCase "allReq (Flag '0001') (Flag '000') == True"  c_AR04
  , testCase "allReq (Flag '0110') (Flag '001') == False" c_AR05
  , testCase "allReq (Flag '0011') (Flag '001') == True"  c_AR06
  , testCase "allReq (Flag '0011') (Flag '010') == True"  c_AR07
  , testCase "allReq (Flag '0011') (Flag '100') == False" c_AR08
  , testCase "allReq (Flag '0101') (Flag '101') == True"  c_AR09
  ]

c_AR01 = assertBool ""       (allReq (readFlag "0000") (readFlag "000"))
c_AR02 = assertBool "" (not $ allReq (readFlag "0000") (readFlag "001"))
c_AR03 = assertBool ""       (allReq (readFlag "0001") (readFlag "001"))
c_AR04 = assertBool ""       (allReq (readFlag "0001") (readFlag "000"))
c_AR05 = assertBool "" (not $ allReq (readFlag "0110") (readFlag "001"))
c_AR06 = assertBool ""       (allReq (readFlag "0011") (readFlag "001"))
c_AR07 = assertBool ""       (allReq (readFlag "0011") (readFlag "010"))
c_AR08 = assertBool "" (not $ allReq (readFlag "0011") (readFlag "100"))
c_AR09 = assertBool ""       (allReq (readFlag "0101") (readFlag "101"))
c_AR10 = assertBool "" (not $ allReq (readFlag "0101") (readFlag "111"))