packages feed

arith-encode-1.0.1: test/Tests/Data/ArithEncode/Util.hs

-- Copyright (c) 2014 Eric McCorkle.  All rights reserved.
--
-- Redistribution and use in source and binary forms, with or without
-- modification, are permitted provided that the following conditions
-- are met:
--
-- 1. Redistributions of source code must retain the above copyright
--    notice, this list of conditions and the following disclaimer.
--
-- 2. Redistributions in binary form must reproduce the above copyright
--    notice, this list of conditions and the following disclaimer in the
--    documentation and/or other materials provided with the distribution.
--
-- 3. Neither the name of the author nor the names of any contributors
--    may be used to endorse or promote products derived from this software
--    without specific prior written permission.
--
-- THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS''
-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-- TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
-- PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS
-- OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-- USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-- ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-- OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
-- OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-- SUCH DAMAGE.

module Tests.Data.ArithEncode.Util(tests) where

import Data.ArithEncode
import Data.Hashable
import Test.HUnitPlus.Base
import Tests.Data.ArithEncode.TestUtils

import qualified Data.HashMap.Lazy as HashMap
import qualified Data.HashSet as HashSet
import qualified Data.Map as Map
import qualified Data.Set as Set

finiteFuncVals = [
    [],
    [('A','A')],
    [('A','B')],
    [('A','C')],
    [('B','A')],
    [('B','B')],
    [('B','C')],
    [('C','A')],
    [('C','B')],
    [('C','C')],
    [('A','A'),('B','A')],
    [('A','B'),('B','A')],
    [('A','C'),('B','A')],
    [('A','A'),('B','B')],
    [('A','B'),('B','B')],
    [('A','C'),('B','B')],
    [('A','A'),('B','C')],
    [('A','B'),('B','C')],
    [('A','C'),('B','C')],
    [('A','A'),('C','A')],
    [('A','B'),('C','A')],
    [('A','C'),('C','A')],
    [('A','A'),('C','B')],
    [('A','B'),('C','B')],
    [('A','C'),('C','B')],
    [('A','A'),('C','C')],
    [('A','B'),('C','C')],
    [('A','C'),('C','C')],
    [('B','A'),('C','A')],
    [('B','B'),('C','A')],
    [('B','C'),('C','A')],
    [('B','A'),('C','B')],
    [('B','B'),('C','B')],
    [('B','C'),('C','B')],
    [('B','A'),('C','C')],
    [('B','B'),('C','C')],
    [('B','C'),('C','C')],
    [('A','A'),('B','A'),('C','A')],
    [('A','B'),('B','A'),('C','A')],
    [('A','C'),('B','A'),('C','A')],
    [('A','A'),('B','B'),('C','A')],
    [('A','B'),('B','B'),('C','A')],
    [('A','C'),('B','B'),('C','A')],
    [('A','A'),('B','C'),('C','A')],
    [('A','B'),('B','C'),('C','A')],
    [('A','C'),('B','C'),('C','A')],
    [('A','A'),('B','A'),('C','B')],
    [('A','B'),('B','A'),('C','B')],
    [('A','C'),('B','A'),('C','B')],
    [('A','A'),('B','B'),('C','B')],
    [('A','B'),('B','B'),('C','B')],
    [('A','C'),('B','B'),('C','B')],
    [('A','A'),('B','C'),('C','B')],
    [('A','B'),('B','C'),('C','B')],
    [('A','C'),('B','C'),('C','B')],
    [('A','A'),('B','A'),('C','C')],
    [('A','B'),('B','A'),('C','C')],
    [('A','C'),('B','A'),('C','C')],
    [('A','A'),('B','B'),('C','C')],
    [('A','B'),('B','B'),('C','C')],
    [('A','C'),('B','B'),('C','C')],
    [('A','A'),('B','C'),('C','C')],
    [('A','B'),('B','C'),('C','C')],
    [('A','C'),('B','C'),('C','C')]
  ]

infiniteDomainFunctionTests keyiso valiso =
  let
    iso = function keyiso valiso
  in
    testInfDimlessEncoding ["function"] iso

finiteDomainFunctionTests =
  let
    funcs = map Map.fromList finiteFuncVals
    nonvals = map Map.fromList [[('D', 'A')], [('A', 'A'),('B', 'E')]]
    finite = fromHashableList ['A', 'B', 'C']
    iso = function finite finite
  in
    testFiniteEncodingWithVals ["function"] iso funcs nonvals

functionTests =
  let
    infinite = integralInteger
    finite = fromHashableList ['D', 'E', 'F', 'G']
  in
    [ "infinite_infinite" ~: infiniteDomainFunctionTests infinite infinite,
      "infinite_finite" ~: infiniteDomainFunctionTests infinite finite,
      "finite_infinite" ~: infiniteDomainFunctionTests finite infinite,
      "finite_finite" ~: finiteDomainFunctionTests ]

infiniteDomainHashableFunctionTests keyiso valiso =
  let
    iso = functionHashable keyiso valiso
  in
    testInfDimlessEncoding ["functionHashable"] iso

finiteDomainHashableFunctionTests =
  let
    funcs = map HashMap.fromList finiteFuncVals
    nonvals = map HashMap.fromList [[('D', 'A')], [('A', 'A'),('B', 'E')]]
    finite = fromHashableList ['A', 'B', 'C']
    iso = functionHashable finite finite
  in
    testFiniteEncodingWithVals ["functionHashable"] iso funcs nonvals

hashableFunctionTests =
  let
    infinite = integralInteger
    finite = fromHashableList ['D', 'E', 'F', 'G']
  in
    [ "infinite_infinite" ~: infiniteDomainHashableFunctionTests infinite infinite,
      "infinite_finite" ~: infiniteDomainHashableFunctionTests infinite finite,
      "finite_infinite" ~: infiniteDomainHashableFunctionTests finite infinite,
      "finite_finite" ~: finiteDomainHashableFunctionTests ]

finiteRelVals = [
    [],
    [('A',['A'])],
    [('A',['B'])],
    [('A',['C'])],
    [('A',['A','B'])],
    [('A',['A','C'])],
    [('A',['B','C'])],
    [('A',['A','B','C'])],
    [('B',['A'])],
    [('B',['B'])],
    [('B',['C'])],
    [('B',['A','B'])],
    [('B',['A','C'])],
    [('B',['B','C'])],
    [('B',['A','B','C'])],
    [('C',['A'])],
    [('C',['B'])],
    [('C',['C'])],
    [('C',['A','B'])],
    [('C',['A','C'])],
    [('C',['B','C'])],
    [('C',['A','B','C'])],
    [('A',['A']),
     ('B',['A'])],
    [('A',['B']),
     ('B',['A'])],
    [('A',['C']),
     ('B',['A'])],
    [('A',['A','B']),
     ('B',['A'])],
    [('A',['A','C']),
     ('B',['A'])],
    [('A',['B','C']),
     ('B',['A'])],
    [('A',['A','B','C']),
     ('B',['A'])],
    [('A',['A']),
     ('B',['B'])],
    [('A',['B']),
     ('B',['B'])],
    [('A',['C']),
     ('B',['B'])],
    [('A',['A','B']),
     ('B',['B'])],
    [('A',['A','C']),
     ('B',['B'])],
    [('A',['B','C']),
     ('B',['B'])],
    [('A',['A','B','C']),
     ('B',['B'])],
    [('A',['A']),
     ('B',['C'])],
    [('A',['B']),
     ('B',['C'])],
    [('A',['C']),
     ('B',['C'])],
    [('A',['A','B']),
     ('B',['C'])],
    [('A',['A','C']),
     ('B',['C'])],
    [('A',['B','C']),
     ('B',['C'])],
    [('A',['A','B','C']),
     ('B',['C'])],
    [('A',['A']),
     ('B',['A','B'])],
    [('A',['B']),
     ('B',['A','B'])],
    [('A',['C']),
     ('B',['A','B'])],
    [('A',['A','B']),
     ('B',['A','B'])],
    [('A',['A','C']),
     ('B',['A','B'])],
    [('A',['B','C']),
     ('B',['A','B'])],
    [('A',['A','B','C']),
     ('B',['A','B'])],
    [('A',['A']),
     ('B',['A','C'])],
    [('A',['B']),
     ('B',['A','C'])],
    [('A',['C']),
     ('B',['A','C'])],
    [('A',['A','B']),
     ('B',['A','C'])],
    [('A',['A','C']),
     ('B',['A','C'])],
    [('A',['B','C']),
     ('B',['A','C'])],
    [('A',['A','B','C']),
     ('B',['A','C'])],
    [('A',['A']),
     ('B',['B','C'])],
    [('A',['B']),
     ('B',['B','C'])],
    [('A',['C']),
     ('B',['B','C'])],
    [('A',['A','B']),
     ('B',['B','C'])],
    [('A',['A','C']),
     ('B',['B','C'])],
    [('A',['B','C']),
     ('B',['B','C'])],
    [('A',['A','B','C']),
     ('B',['B','C'])],
    [('A',['A']),
     ('B',['A','B','C'])],
    [('A',['B']),
     ('B',['A','B','C'])],
    [('A',['C']),
     ('B',['A','B','C'])],
    [('A',['A','B']),
     ('B',['A','B','C'])],
    [('A',['A','C']),
     ('B',['A','B','C'])],
    [('A',['B','C']),
     ('B',['A','B','C'])],
    [('A',['A','B','C']),
     ('B',['A','B','C'])],
    [('A',['A']),
     ('C',['A'])],
    [('A',['B']),
     ('C',['A'])],
    [('A',['C']),
     ('C',['A'])],
    [('A',['A','B']),
     ('C',['A'])],
    [('A',['A','C']),
     ('C',['A'])],
    [('A',['B','C']),
     ('C',['A'])],
    [('A',['A','B','C']),
     ('C',['A'])],
    [('A',['A']),
     ('C',['B'])],
    [('A',['B']),
     ('C',['B'])],
    [('A',['C']),
     ('C',['B'])],
    [('A',['A','B']),
     ('C',['B'])],
    [('A',['A','C']),
     ('C',['B'])],
    [('A',['B','C']),
     ('C',['B'])],
    [('A',['A','B','C']),
     ('C',['B'])],
    [('A',['A']),
     ('C',['C'])],
    [('A',['B']),
     ('C',['C'])],
    [('A',['C']),
     ('C',['C'])],
    [('A',['A','B']),
     ('C',['C'])],
    [('A',['A','C']),
     ('C',['C'])],
    [('A',['B','C']),
     ('C',['C'])],
    [('A',['A','B','C']),
     ('C',['C'])],
    [('A',['A']),
     ('C',['A','B'])],
    [('A',['B']),
     ('C',['A','B'])],
    [('A',['C']),
     ('C',['A','B'])],
    [('A',['A','B']),
     ('C',['A','B'])],
    [('A',['A','C']),
     ('C',['A','B'])],
    [('A',['B','C']),
     ('C',['A','B'])],
    [('A',['A','B','C']),
     ('C',['A','B'])],
    [('A',['A']),
     ('C',['A','C'])],
    [('A',['B']),
     ('C',['A','C'])],
    [('A',['C']),
     ('C',['A','C'])],
    [('A',['A','B']),
     ('C',['A','C'])],
    [('A',['A','C']),
     ('C',['A','C'])],
    [('A',['B','C']),
     ('C',['A','C'])],
    [('A',['A','B','C']),
     ('C',['A','C'])],
    [('A',['A']),
     ('C',['B','C'])],
    [('A',['B']),
     ('C',['B','C'])],
    [('A',['C']),
     ('C',['B','C'])],
    [('A',['A','B']),
     ('C',['B','C'])],
    [('A',['A','C']),
     ('C',['B','C'])],
    [('A',['B','C']),
     ('C',['B','C'])],
    [('A',['A','B','C']),
     ('C',['B','C'])],
    [('A',['A']),
     ('C',['A','B','C'])],
    [('A',['B']),
     ('C',['A','B','C'])],
    [('A',['C']),
     ('C',['A','B','C'])],
    [('A',['A','B']),
     ('C',['A','B','C'])],
    [('A',['A','C']),
     ('C',['A','B','C'])],
    [('A',['B','C']),
     ('C',['A','B','C'])],
    [('A',['A','B','C']),
     ('C',['A','B','C'])],
    [('B',['A']),
     ('C',['A'])],
    [('B',['B']),
     ('C',['A'])],
    [('B',['C']),
     ('C',['A'])],
    [('B',['A','B']),
     ('C',['A'])],
    [('B',['A','C']),
     ('C',['A'])],
    [('B',['B','C']),
     ('C',['A'])],
    [('B',['A','B','C']),
     ('C',['A'])],
    [('B',['A']),
     ('C',['B'])],
    [('B',['B']),
     ('C',['B'])],
    [('B',['C']),
     ('C',['B'])],
    [('B',['A','B']),
     ('C',['B'])],
    [('B',['A','C']),
     ('C',['B'])],
    [('B',['B','C']),
     ('C',['B'])],
    [('B',['A','B','C']),
     ('C',['B'])],
    [('B',['A']),
     ('C',['C'])],
    [('B',['B']),
     ('C',['C'])],
    [('B',['C']),
     ('C',['C'])],
    [('B',['A','B']),
     ('C',['C'])],
    [('B',['A','C']),
     ('C',['C'])],
    [('B',['B','C']),
     ('C',['C'])],
    [('B',['A','B','C']),
     ('C',['C'])],
    [('B',['A']),
     ('C',['A','B'])],
    [('B',['B']),
     ('C',['A','B'])],
    [('B',['C']),
     ('C',['A','B'])],
    [('B',['A','B']),
     ('C',['A','B'])],
    [('B',['A','C']),
     ('C',['A','B'])],
    [('B',['B','C']),
     ('C',['A','B'])],
    [('B',['A','B','C']),
     ('C',['A','B'])],
    [('B',['A']),
     ('C',['A','C'])],
    [('B',['B']),
     ('C',['A','C'])],
    [('B',['C']),
     ('C',['A','C'])],
    [('B',['A','B']),
     ('C',['A','C'])],
    [('B',['A','C']),
     ('C',['A','C'])],
    [('B',['B','C']),
     ('C',['A','C'])],
    [('B',['A','B','C']),
     ('C',['A','C'])],
    [('B',['A']),
     ('C',['B','C'])],
    [('B',['B']),
     ('C',['B','C'])],
    [('B',['C']),
     ('C',['B','C'])],
    [('B',['A','B']),
     ('C',['B','C'])],
    [('B',['A','C']),
     ('C',['B','C'])],
    [('B',['B','C']),
     ('C',['B','C'])],
    [('B',['A','B','C']),
     ('C',['B','C'])],
    [('B',['A']),
     ('C',['A','B','C'])],
    [('B',['B']),
     ('C',['A','B','C'])],
    [('B',['C']),
     ('C',['A','B','C'])],
    [('B',['A','B']),
     ('C',['A','B','C'])],
    [('B',['A','C']),
     ('C',['A','B','C'])],
    [('B',['B','C']),
     ('C',['A','B','C'])],
    [('B',['A','B','C']),
     ('C',['A','B','C'])],
    [('A',['A']),
     ('B',['A']),
     ('C',['A'])],
    [('A',['B']),
     ('B',['A']),
     ('C',['A'])],
    [('A',['C']),
     ('B',['A']),
     ('C',['A'])],
    [('A',['A','B']),
     ('B',['A']),
     ('C',['A'])],
    [('A',['A','C']),
     ('B',['A']),
     ('C',['A'])],
    [('A',['B','C']),
     ('B',['A']),
     ('C',['A'])],
    [('A',['A','B','C']),
     ('B',['A']),
     ('C',['A'])],
    [('A',['A']),
     ('B',['B']),
     ('C',['A'])],
    [('A',['B']),
     ('B',['B']),
     ('C',['A'])],
    [('A',['C']),
     ('B',['B']),
     ('C',['A'])],
    [('A',['A','B']),
     ('B',['B']),
     ('C',['A'])],
    [('A',['A','C']),
     ('B',['B']),
     ('C',['A'])],
    [('A',['B','C']),
     ('B',['B']),
     ('C',['A'])],
    [('A',['A','B','C']),
     ('B',['B']),
     ('C',['A'])],
    [('A',['A']),
     ('B',['C']),
     ('C',['A'])],
    [('A',['B']),
     ('B',['C']),
     ('C',['A'])],
    [('A',['C']),
     ('B',['C']),
     ('C',['A'])],
    [('A',['A','B']),
     ('B',['C']),
     ('C',['A'])],
    [('A',['A','C']),
     ('B',['C']),
     ('C',['A'])],
    [('A',['B','C']),
     ('B',['C']),
     ('C',['A'])],
    [('A',['A','B','C']),
     ('B',['C']),
     ('C',['A'])],
    [('A',['A']),
     ('B',['A','B']),
     ('C',['A'])],
    [('A',['B']),
     ('B',['A','B']),
     ('C',['A'])],
    [('A',['C']),
     ('B',['A','B']),
     ('C',['A'])],
    [('A',['A','B']),
     ('B',['A','B']),
     ('C',['A'])],
    [('A',['A','C']),
     ('B',['A','B']),
     ('C',['A'])],
    [('A',['B','C']),
     ('B',['A','B']),
     ('C',['A'])],
    [('A',['A','B','C']),
     ('B',['A','B']),
     ('C',['A'])],
    [('A',['A']),
     ('B',['A','C']),
     ('C',['A'])],
    [('A',['B']),
     ('B',['A','C']),
     ('C',['A'])],
    [('A',['C']),
     ('B',['A','C']),
     ('C',['A'])],
    [('A',['A','B']),
     ('B',['A','C']),
     ('C',['A'])],
    [('A',['A','C']),
     ('B',['A','C']),
     ('C',['A'])],
    [('A',['B','C']),
     ('B',['A','C']),
     ('C',['A'])],
    [('A',['A','B','C']),
     ('B',['A','C']),
     ('C',['A'])],
    [('A',['A']),
     ('B',['B','C']),
     ('C',['A'])],
    [('A',['B']),
     ('B',['B','C']),
     ('C',['A'])],
    [('A',['C']),
     ('B',['B','C']),
     ('C',['A'])],
    [('A',['A','B']),
     ('B',['B','C']),
     ('C',['A'])],
    [('A',['A','C']),
     ('B',['B','C']),
     ('C',['A'])],
    [('A',['B','C']),
     ('B',['B','C']),
     ('C',['A'])],
    [('A',['A','B','C']),
     ('B',['B','C']),
     ('C',['A'])],
    [('A',['A']),
     ('B',['A','B','C']),
     ('C',['A'])],
    [('A',['B']),
     ('B',['A','B','C']),
     ('C',['A'])],
    [('A',['C']),
     ('B',['A','B','C']),
     ('C',['A'])],
    [('A',['A','B']),
     ('B',['A','B','C']),
     ('C',['A'])],
    [('A',['A','C']),
     ('B',['A','B','C']),
     ('C',['A'])],
    [('A',['B','C']),
     ('B',['A','B','C']),
     ('C',['A'])],
    [('A',['A','B','C']),
     ('B',['A','B','C']),
     ('C',['A'])],
    [('A',['A']),
     ('B',['A']),
     ('C',['B'])],
    [('A',['B']),
     ('B',['A']),
     ('C',['B'])],
    [('A',['C']),
     ('B',['A']),
     ('C',['B'])],
    [('A',['A','B']),
     ('B',['A']),
     ('C',['B'])],
    [('A',['A','C']),
     ('B',['A']),
     ('C',['B'])],
    [('A',['B','C']),
     ('B',['A']),
     ('C',['B'])],
    [('A',['A','B','C']),
     ('B',['A']),
     ('C',['B'])],
    [('A',['A']),
     ('B',['B']),
     ('C',['B'])],
    [('A',['B']),
     ('B',['B']),
     ('C',['B'])],
    [('A',['C']),
     ('B',['B']),
     ('C',['B'])],
    [('A',['A','B']),
     ('B',['B']),
     ('C',['B'])],
    [('A',['A','C']),
     ('B',['B']),
     ('C',['B'])],
    [('A',['B','C']),
     ('B',['B']),
     ('C',['B'])],
    [('A',['A','B','C']),
     ('B',['B']),
     ('C',['B'])],
    [('A',['A']),
     ('B',['C']),
     ('C',['B'])],
    [('A',['B']),
     ('B',['C']),
     ('C',['B'])],
    [('A',['C']),
     ('B',['C']),
     ('C',['B'])],
    [('A',['A','B']),
     ('B',['C']),
     ('C',['B'])],
    [('A',['A','C']),
     ('B',['C']),
     ('C',['B'])],
    [('A',['B','C']),
     ('B',['C']),
     ('C',['B'])],
    [('A',['A','B','C']),
     ('B',['C']),
     ('C',['B'])],
    [('A',['A']),
     ('B',['A','B']),
     ('C',['B'])],
    [('A',['B']),
     ('B',['A','B']),
     ('C',['B'])],
    [('A',['C']),
     ('B',['A','B']),
     ('C',['B'])],
    [('A',['A','B']),
     ('B',['A','B']),
     ('C',['B'])],
    [('A',['A','C']),
     ('B',['A','B']),
     ('C',['B'])],
    [('A',['B','C']),
     ('B',['A','B']),
     ('C',['B'])],
    [('A',['A','B','C']),
     ('B',['A','B']),
     ('C',['B'])],
    [('A',['A']),
     ('B',['A','C']),
     ('C',['B'])],
    [('A',['B']),
     ('B',['A','C']),
     ('C',['B'])],
    [('A',['C']),
     ('B',['A','C']),
     ('C',['B'])],
    [('A',['A','B']),
     ('B',['A','C']),
     ('C',['B'])],
    [('A',['A','C']),
     ('B',['A','C']),
     ('C',['B'])],
    [('A',['B','C']),
     ('B',['A','C']),
     ('C',['B'])],
    [('A',['A','B','C']),
     ('B',['A','C']),
     ('C',['B'])],
    [('A',['A']),
     ('B',['B','C']),
     ('C',['B'])],
    [('A',['B']),
     ('B',['B','C']),
     ('C',['B'])],
    [('A',['C']),
     ('B',['B','C']),
     ('C',['B'])],
    [('A',['A','B']),
     ('B',['B','C']),
     ('C',['B'])],
    [('A',['A','C']),
     ('B',['B','C']),
     ('C',['B'])],
    [('A',['B','C']),
     ('B',['B','C']),
     ('C',['B'])],
    [('A',['A','B','C']),
     ('B',['B','C']),
     ('C',['B'])],
    [('A',['A']),
     ('B',['A','B','C']),
     ('C',['B'])],
    [('A',['B']),
     ('B',['A','B','C']),
     ('C',['B'])],
    [('A',['C']),
     ('B',['A','B','C']),
     ('C',['B'])],
    [('A',['A','B']),
     ('B',['A','B','C']),
     ('C',['B'])],
    [('A',['A','C']),
     ('B',['A','B','C']),
     ('C',['B'])],
    [('A',['B','C']),
     ('B',['A','B','C']),
     ('C',['B'])],
    [('A',['A','B','C']),
     ('B',['A','B','C']),
     ('C',['B'])],
    [('A',['A']),
     ('B',['A']),
     ('C',['C'])],
    [('A',['B']),
     ('B',['A']),
     ('C',['C'])],
    [('A',['C']),
     ('B',['A']),
     ('C',['C'])],
    [('A',['A','B']),
     ('B',['A']),
     ('C',['C'])],
    [('A',['A','C']),
     ('B',['A']),
     ('C',['C'])],
    [('A',['B','C']),
     ('B',['A']),
     ('C',['C'])],
    [('A',['A','B','C']),
     ('B',['A']),
     ('C',['C'])],
    [('A',['A']),
     ('B',['B']),
     ('C',['C'])],
    [('A',['B']),
     ('B',['B']),
     ('C',['C'])],
    [('A',['C']),
     ('B',['B']),
     ('C',['C'])],
    [('A',['A','B']),
     ('B',['B']),
     ('C',['C'])],
    [('A',['A','C']),
     ('B',['B']),
     ('C',['C'])],
    [('A',['B','C']),
     ('B',['B']),
     ('C',['C'])],
    [('A',['A','B','C']),
     ('B',['B']),
     ('C',['C'])],
    [('A',['A']),
     ('B',['C']),
     ('C',['C'])],
    [('A',['B']),
     ('B',['C']),
     ('C',['C'])],
    [('A',['C']),
     ('B',['C']),
     ('C',['C'])],
    [('A',['A','B']),
     ('B',['C']),
     ('C',['C'])],
    [('A',['A','C']),
     ('B',['C']),
     ('C',['C'])],
    [('A',['B','C']),
     ('B',['C']),
     ('C',['C'])],
    [('A',['A','B','C']),
     ('B',['C']),
     ('C',['C'])],
    [('A',['A']),
     ('B',['A','B']),
     ('C',['C'])],
    [('A',['B']),
     ('B',['A','B']),
     ('C',['C'])],
    [('A',['C']),
     ('B',['A','B']),
     ('C',['C'])],
    [('A',['A','B']),
     ('B',['A','B']),
     ('C',['C'])],
    [('A',['A','C']),
     ('B',['A','B']),
     ('C',['C'])],
    [('A',['B','C']),
     ('B',['A','B']),
     ('C',['C'])],
    [('A',['A','B','C']),
     ('B',['A','B']),
     ('C',['C'])],
    [('A',['A']),
     ('B',['A','C']),
     ('C',['C'])],
    [('A',['B']),
     ('B',['A','C']),
     ('C',['C'])],
    [('A',['C']),
     ('B',['A','C']),
     ('C',['C'])],
    [('A',['A','B']),
     ('B',['A','C']),
     ('C',['C'])],
    [('A',['A','C']),
     ('B',['A','C']),
     ('C',['C'])],
    [('A',['B','C']),
     ('B',['A','C']),
     ('C',['C'])],
    [('A',['A','B','C']),
     ('B',['A','C']),
     ('C',['C'])],
    [('A',['A']),
     ('B',['B','C']),
     ('C',['C'])],
    [('A',['B']),
     ('B',['B','C']),
     ('C',['C'])],
    [('A',['C']),
     ('B',['B','C']),
     ('C',['C'])],
    [('A',['A','B']),
     ('B',['B','C']),
     ('C',['C'])],
    [('A',['A','C']),
     ('B',['B','C']),
     ('C',['C'])],
    [('A',['B','C']),
     ('B',['B','C']),
     ('C',['C'])],
    [('A',['A','B','C']),
     ('B',['B','C']),
     ('C',['C'])],
    [('A',['A']),
     ('B',['A','B','C']),
     ('C',['C'])],
    [('A',['B']),
     ('B',['A','B','C']),
     ('C',['C'])],
    [('A',['C']),
     ('B',['A','B','C']),
     ('C',['C'])],
    [('A',['A','B']),
     ('B',['A','B','C']),
     ('C',['C'])],
    [('A',['A','C']),
     ('B',['A','B','C']),
     ('C',['C'])],
    [('A',['B','C']),
     ('B',['A','B','C']),
     ('C',['C'])],
    [('A',['A','B','C']),
     ('B',['A','B','C']),
     ('C',['C'])],
    [('A',['A']),
     ('B',['A']),
     ('C',['A','B'])],
    [('A',['B']),
     ('B',['A']),
     ('C',['A','B'])],
    [('A',['C']),
     ('B',['A']),
     ('C',['A','B'])],
    [('A',['A','B']),
     ('B',['A']),
     ('C',['A','B'])],
    [('A',['A','C']),
     ('B',['A']),
     ('C',['A','B'])],
    [('A',['B','C']),
     ('B',['A']),
     ('C',['A','B'])],
    [('A',['A','B','C']),
     ('B',['A']),
     ('C',['A','B'])],
    [('A',['A']),
     ('B',['B']),
     ('C',['A','B'])],
    [('A',['B']),
     ('B',['B']),
     ('C',['A','B'])],
    [('A',['C']),
     ('B',['B']),
     ('C',['A','B'])],
    [('A',['A','B']),
     ('B',['B']),
     ('C',['A','B'])],
    [('A',['A','C']),
     ('B',['B']),
     ('C',['A','B'])],
    [('A',['B','C']),
     ('B',['B']),
     ('C',['A','B'])],
    [('A',['A','B','C']),
     ('B',['B']),
     ('C',['A','B'])],
    [('A',['A']),
     ('B',['C']),
     ('C',['A','B'])],
    [('A',['B']),
     ('B',['C']),
     ('C',['A','B'])],
    [('A',['C']),
     ('B',['C']),
     ('C',['A','B'])],
    [('A',['A','B']),
     ('B',['C']),
     ('C',['A','B'])],
    [('A',['A','C']),
     ('B',['C']),
     ('C',['A','B'])],
    [('A',['B','C']),
     ('B',['C']),
     ('C',['A','B'])],
    [('A',['A','B','C']),
     ('B',['C']),
     ('C',['A','B'])],
    [('A',['A']),
     ('B',['A','B']),
     ('C',['A','B'])],
    [('A',['B']),
     ('B',['A','B']),
     ('C',['A','B'])],
    [('A',['C']),
     ('B',['A','B']),
     ('C',['A','B'])],
    [('A',['A','B']),
     ('B',['A','B']),
     ('C',['A','B'])],
    [('A',['A','C']),
     ('B',['A','B']),
     ('C',['A','B'])],
    [('A',['B','C']),
     ('B',['A','B']),
     ('C',['A','B'])],
    [('A',['A','B','C']),
     ('B',['A','B']),
     ('C',['A','B'])],
    [('A',['A']),
     ('B',['A','C']),
     ('C',['A','B'])],
    [('A',['B']),
     ('B',['A','C']),
     ('C',['A','B'])],
    [('A',['C']),
     ('B',['A','C']),
     ('C',['A','B'])],
    [('A',['A','B']),
     ('B',['A','C']),
     ('C',['A','B'])],
    [('A',['A','C']),
     ('B',['A','C']),
     ('C',['A','B'])],
    [('A',['B','C']),
     ('B',['A','C']),
     ('C',['A','B'])],
    [('A',['A','B','C']),
     ('B',['A','C']),
     ('C',['A','B'])],
    [('A',['A']),
     ('B',['B','C']),
     ('C',['A','B'])],
    [('A',['B']),
     ('B',['B','C']),
     ('C',['A','B'])],
    [('A',['C']),
     ('B',['B','C']),
     ('C',['A','B'])],
    [('A',['A','B']),
     ('B',['B','C']),
     ('C',['A','B'])],
    [('A',['A','C']),
     ('B',['B','C']),
     ('C',['A','B'])],
    [('A',['B','C']),
     ('B',['B','C']),
     ('C',['A','B'])],
    [('A',['A','B','C']),
     ('B',['B','C']),
     ('C',['A','B'])],
    [('A',['A']),
     ('B',['A','B','C']),
     ('C',['A','B'])],
    [('A',['B']),
     ('B',['A','B','C']),
     ('C',['A','B'])],
    [('A',['C']),
     ('B',['A','B','C']),
     ('C',['A','B'])],
    [('A',['A','B']),
     ('B',['A','B','C']),
     ('C',['A','B'])],
    [('A',['A','C']),
     ('B',['A','B','C']),
     ('C',['A','B'])],
    [('A',['B','C']),
     ('B',['A','B','C']),
     ('C',['A','B'])],
    [('A',['A','B','C']),
     ('B',['A','B','C']),
     ('C',['A','B'])],
    [('A',['A']),
     ('B',['A']),
     ('C',['A','C'])],
    [('A',['B']),
     ('B',['A']),
     ('C',['A','C'])],
    [('A',['C']),
     ('B',['A']),
     ('C',['A','C'])],
    [('A',['A','B']),
     ('B',['A']),
     ('C',['A','C'])],
    [('A',['A','C']),
     ('B',['A']),
     ('C',['A','C'])],
    [('A',['B','C']),
     ('B',['A']),
     ('C',['A','C'])],
    [('A',['A','B','C']),
     ('B',['A']),
     ('C',['A','C'])],
    [('A',['A']),
     ('B',['B']),
     ('C',['A','C'])],
    [('A',['B']),
     ('B',['B']),
     ('C',['A','C'])],
    [('A',['C']),
     ('B',['B']),
     ('C',['A','C'])],
    [('A',['A','B']),
     ('B',['B']),
     ('C',['A','C'])],
    [('A',['A','C']),
     ('B',['B']),
     ('C',['A','C'])],
    [('A',['B','C']),
     ('B',['B']),
     ('C',['A','C'])],
    [('A',['A','B','C']),
     ('B',['B']),
     ('C',['A','C'])],
    [('A',['A']),
     ('B',['C']),
     ('C',['A','C'])],
    [('A',['B']),
     ('B',['C']),
     ('C',['A','C'])],
    [('A',['C']),
     ('B',['C']),
     ('C',['A','C'])],
    [('A',['A','B']),
     ('B',['C']),
     ('C',['A','C'])],
    [('A',['A','C']),
     ('B',['C']),
     ('C',['A','C'])],
    [('A',['B','C']),
     ('B',['C']),
     ('C',['A','C'])],
    [('A',['A','B','C']),
     ('B',['C']),
     ('C',['A','C'])],
    [('A',['A']),
     ('B',['A','B']),
     ('C',['A','C'])],
    [('A',['B']),
     ('B',['A','B']),
     ('C',['A','C'])],
    [('A',['C']),
     ('B',['A','B']),
     ('C',['A','C'])],
    [('A',['A','B']),
     ('B',['A','B']),
     ('C',['A','C'])],
    [('A',['A','C']),
     ('B',['A','B']),
     ('C',['A','C'])],
    [('A',['B','C']),
     ('B',['A','B']),
     ('C',['A','C'])],
    [('A',['A','B','C']),
     ('B',['A','B']),
     ('C',['A','C'])],
    [('A',['A']),
     ('B',['A','C']),
     ('C',['A','C'])],
    [('A',['B']),
     ('B',['A','C']),
     ('C',['A','C'])],
    [('A',['C']),
     ('B',['A','C']),
     ('C',['A','C'])],
    [('A',['A','B']),
     ('B',['A','C']),
     ('C',['A','C'])],
    [('A',['A','C']),
     ('B',['A','C']),
     ('C',['A','C'])],
    [('A',['B','C']),
     ('B',['A','C']),
     ('C',['A','C'])],
    [('A',['A','B','C']),
     ('B',['A','C']),
     ('C',['A','C'])],
    [('A',['A']),
     ('B',['B','C']),
     ('C',['A','C'])],
    [('A',['B']),
     ('B',['B','C']),
     ('C',['A','C'])],
    [('A',['C']),
     ('B',['B','C']),
     ('C',['A','C'])],
    [('A',['A','B']),
     ('B',['B','C']),
     ('C',['A','C'])],
    [('A',['A','C']),
     ('B',['B','C']),
     ('C',['A','C'])],
    [('A',['B','C']),
     ('B',['B','C']),
     ('C',['A','C'])],
    [('A',['A','B','C']),
     ('B',['B','C']),
     ('C',['A','C'])],
    [('A',['A']),
     ('B',['A','B','C']),
     ('C',['A','C'])],
    [('A',['B']),
     ('B',['A','B','C']),
     ('C',['A','C'])],
    [('A',['C']),
     ('B',['A','B','C']),
     ('C',['A','C'])],
    [('A',['A','B']),
     ('B',['A','B','C']),
     ('C',['A','C'])],
    [('A',['A','C']),
     ('B',['A','B','C']),
     ('C',['A','C'])],
    [('A',['B','C']),
     ('B',['A','B','C']),
     ('C',['A','C'])],
    [('A',['A','B','C']),
     ('B',['A','B','C']),
     ('C',['A','C'])],
    [('A',['A']),
     ('B',['A']),
     ('C',['B','C'])],
    [('A',['B']),
     ('B',['A']),
     ('C',['B','C'])],
    [('A',['C']),
     ('B',['A']),
     ('C',['B','C'])],
    [('A',['A','B']),
     ('B',['A']),
     ('C',['B','C'])],
    [('A',['A','C']),
     ('B',['A']),
     ('C',['B','C'])],
    [('A',['B','C']),
     ('B',['A']),
     ('C',['B','C'])],
    [('A',['A','B','C']),
     ('B',['A']),
     ('C',['B','C'])],
    [('A',['A']),
     ('B',['B']),
     ('C',['B','C'])],
    [('A',['B']),
     ('B',['B']),
     ('C',['B','C'])],
    [('A',['C']),
     ('B',['B']),
     ('C',['B','C'])],
    [('A',['A','B']),
     ('B',['B']),
     ('C',['B','C'])],
    [('A',['A','C']),
     ('B',['B']),
     ('C',['B','C'])],
    [('A',['B','C']),
     ('B',['B']),
     ('C',['B','C'])],
    [('A',['A','B','C']),
     ('B',['B']),
     ('C',['B','C'])],
    [('A',['A']),
     ('B',['C']),
     ('C',['B','C'])],
    [('A',['B']),
     ('B',['C']),
     ('C',['B','C'])],
    [('A',['C']),
     ('B',['C']),
     ('C',['B','C'])],
    [('A',['A','B']),
     ('B',['C']),
     ('C',['B','C'])],
    [('A',['A','C']),
     ('B',['C']),
     ('C',['B','C'])],
    [('A',['B','C']),
     ('B',['C']),
     ('C',['B','C'])],
    [('A',['A','B','C']),
     ('B',['C']),
     ('C',['B','C'])],
    [('A',['A']),
     ('B',['A','B']),
     ('C',['B','C'])],
    [('A',['B']),
     ('B',['A','B']),
     ('C',['B','C'])],
    [('A',['C']),
     ('B',['A','B']),
     ('C',['B','C'])],
    [('A',['A','B']),
     ('B',['A','B']),
     ('C',['B','C'])],
    [('A',['A','C']),
     ('B',['A','B']),
     ('C',['B','C'])],
    [('A',['B','C']),
     ('B',['A','B']),
     ('C',['B','C'])],
    [('A',['A','B','C']),
     ('B',['A','B']),
     ('C',['B','C'])],
    [('A',['A']),
     ('B',['A','C']),
     ('C',['B','C'])],
    [('A',['B']),
     ('B',['A','C']),
     ('C',['B','C'])],
    [('A',['C']),
     ('B',['A','C']),
     ('C',['B','C'])],
    [('A',['A','B']),
     ('B',['A','C']),
     ('C',['B','C'])],
    [('A',['A','C']),
     ('B',['A','C']),
     ('C',['B','C'])],
    [('A',['B','C']),
     ('B',['A','C']),
     ('C',['B','C'])],
    [('A',['A','B','C']),
     ('B',['A','C']),
     ('C',['B','C'])],
    [('A',['A']),
     ('B',['B','C']),
     ('C',['B','C'])],
    [('A',['B']),
     ('B',['B','C']),
     ('C',['B','C'])],
    [('A',['C']),
     ('B',['B','C']),
     ('C',['B','C'])],
    [('A',['A','B']),
     ('B',['B','C']),
     ('C',['B','C'])],
    [('A',['A','C']),
     ('B',['B','C']),
     ('C',['B','C'])],
    [('A',['B','C']),
     ('B',['B','C']),
     ('C',['B','C'])],
    [('A',['A','B','C']),
     ('B',['B','C']),
     ('C',['B','C'])],
    [('A',['A']),
     ('B',['A','B','C']),
     ('C',['B','C'])],
    [('A',['B']),
     ('B',['A','B','C']),
     ('C',['B','C'])],
    [('A',['C']),
     ('B',['A','B','C']),
     ('C',['B','C'])],
    [('A',['A','B']),
     ('B',['A','B','C']),
     ('C',['B','C'])],
    [('A',['A','C']),
     ('B',['A','B','C']),
     ('C',['B','C'])],
    [('A',['B','C']),
     ('B',['A','B','C']),
     ('C',['B','C'])],
    [('A',['A','B','C']),
     ('B',['A','B','C']),
     ('C',['B','C'])],
    [('A',['A']),
     ('B',['A']),
     ('C',['A','B','C'])],
    [('A',['B']),
     ('B',['A']),
     ('C',['A','B','C'])],
    [('A',['C']),
     ('B',['A']),
     ('C',['A','B','C'])],
    [('A',['A','B']),
     ('B',['A']),
     ('C',['A','B','C'])],
    [('A',['A','C']),
     ('B',['A']),
     ('C',['A','B','C'])],
    [('A',['B','C']),
     ('B',['A']),
     ('C',['A','B','C'])],
    [('A',['A','B','C']),
     ('B',['A']),
     ('C',['A','B','C'])],
    [('A',['A']),
     ('B',['B']),
     ('C',['A','B','C'])],
    [('A',['B']),
     ('B',['B']),
     ('C',['A','B','C'])],
    [('A',['C']),
     ('B',['B']),
     ('C',['A','B','C'])],
    [('A',['A','B']),
     ('B',['B']),
     ('C',['A','B','C'])],
    [('A',['A','C']),
     ('B',['B']),
     ('C',['A','B','C'])],
    [('A',['B','C']),
     ('B',['B']),
     ('C',['A','B','C'])],
    [('A',['A','B','C']),
     ('B',['B']),
     ('C',['A','B','C'])],
    [('A',['A']),
     ('B',['C']),
     ('C',['A','B','C'])],
    [('A',['B']),
     ('B',['C']),
     ('C',['A','B','C'])],
    [('A',['C']),
     ('B',['C']),
     ('C',['A','B','C'])],
    [('A',['A','B']),
     ('B',['C']),
     ('C',['A','B','C'])],
    [('A',['A','C']),
     ('B',['C']),
     ('C',['A','B','C'])],
    [('A',['B','C']),
     ('B',['C']),
     ('C',['A','B','C'])],
    [('A',['A','B','C']),
     ('B',['C']),
     ('C',['A','B','C'])],
    [('A',['A']),
     ('B',['A','B']),
     ('C',['A','B','C'])],
    [('A',['B']),
     ('B',['A','B']),
     ('C',['A','B','C'])],
    [('A',['C']),
     ('B',['A','B']),
     ('C',['A','B','C'])],
    [('A',['A','B']),
     ('B',['A','B']),
     ('C',['A','B','C'])],
    [('A',['A','C']),
     ('B',['A','B']),
     ('C',['A','B','C'])],
    [('A',['B','C']),
     ('B',['A','B']),
     ('C',['A','B','C'])],
    [('A',['A','B','C']),
     ('B',['A','B']),
     ('C',['A','B','C'])],
    [('A',['A']),
     ('B',['A','C']),
     ('C',['A','B','C'])],
    [('A',['B']),
     ('B',['A','C']),
     ('C',['A','B','C'])],
    [('A',['C']),
     ('B',['A','C']),
     ('C',['A','B','C'])],
    [('A',['A','B']),
     ('B',['A','C']),
     ('C',['A','B','C'])],
    [('A',['A','C']),
     ('B',['A','C']),
     ('C',['A','B','C'])],
    [('A',['B','C']),
     ('B',['A','C']),
     ('C',['A','B','C'])],
    [('A',['A','B','C']),
     ('B',['A','C']),
     ('C',['A','B','C'])],
    [('A',['A']),
     ('B',['B','C']),
     ('C',['A','B','C'])],
    [('A',['B']),
     ('B',['B','C']),
     ('C',['A','B','C'])],
    [('A',['C']),
     ('B',['B','C']),
     ('C',['A','B','C'])],
    [('A',['A','B']),
     ('B',['B','C']),
     ('C',['A','B','C'])],
    [('A',['A','C']),
     ('B',['B','C']),
     ('C',['A','B','C'])],
    [('A',['B','C']),
     ('B',['B','C']),
     ('C',['A','B','C'])],
    [('A',['A','B','C']),
     ('B',['B','C']),
     ('C',['A','B','C'])],
    [('A',['A']),
     ('B',['A','B','C']),
     ('C',['A','B','C'])],
    [('A',['B']),
     ('B',['A','B','C']),
     ('C',['A','B','C'])],
    [('A',['C']),
     ('B',['A','B','C']),
     ('C',['A','B','C'])],
    [('A',['A','B']),
     ('B',['A','B','C']),
     ('C',['A','B','C'])],
    [('A',['A','C']),
     ('B',['A','B','C']),
     ('C',['A','B','C'])],
    [('A',['B','C']),
     ('B',['A','B','C']),
     ('C',['A','B','C'])],
    [('A',['A','B','C']),
     ('B',['A','B','C']),
     ('C',['A','B','C'])]
  ]

infiniteDomainRelationTests keyiso valiso =
  let
    iso = relation keyiso valiso
  in
    testInfDimlessEncoding ["relation"] iso

finiteDomainRelationTests =
  let
    funcs = map (Map.fromList . map (\(a, b) -> (a, Set.fromList b))) finiteRelVals
    nonvals = map Map.fromList [[('D', Set.fromList ['A'])],
                                [('A', Set.fromList [])],
                                [('A', Set.fromList ['A']),
                                 ('B', Set.fromList ['E'])]]
    finite = fromHashableList ['A', 'B', 'C']
    iso = relation finite finite
  in
    testFiniteEncodingWithVals ["relation"] iso funcs nonvals

relationTests =
  let
    infinite = integralInteger
    finite = fromHashableList ['D', 'E', 'F', 'G']
  in
    [ "infinite_infinite" ~: infiniteDomainRelationTests infinite infinite,
      "infinite_finite" ~: infiniteDomainRelationTests infinite finite,
      "finite_infinite" ~: infiniteDomainRelationTests finite infinite,
      "finite_finite" ~: finiteDomainRelationTests ]

infiniteDomainHashableRelationTests keyiso valiso =
  let
    iso = relationHashable keyiso valiso
  in
    testInfDimlessEncoding ["relationHashable"] iso

finiteDomainHashableRelationTests =
  let
    funcs = map (HashMap.fromList . map (\(a, b) -> (a, HashSet.fromList b)))
                finiteRelVals
    nonvals = map HashMap.fromList [[('D', HashSet.fromList ['A'])],
                                    [('A', HashSet.fromList [])],
                                    [('A', HashSet.fromList ['A']),
                                     ('B', HashSet.fromList ['E'])]]
    finite = fromHashableList ['A', 'B', 'C']
    iso = relationHashable finite finite
  in
    testFiniteEncodingWithVals ["relationHashable"] iso funcs nonvals

hashableRelationTests =
  let
    infinite = integralInteger
    finite = fromHashableList ['D', 'E', 'F', 'G']
  in
    [ "infinite_infinite" ~: infiniteDomainHashableRelationTests infinite infinite,
      "infinite_finite" ~: infiniteDomainHashableRelationTests infinite finite,
      "finite_infinite" ~: infiniteDomainHashableRelationTests finite infinite,
      "finite_finite" ~: finiteDomainRelationTests ]

testlist :: [Test]
testlist = [
    "function" ~: functionTests,
    "functionHashable" ~: hashableFunctionTests,
    "relation" ~: relationTests,
    "relationHashable" ~: hashableRelationTests
  ]

tests :: Test
tests = "Util" ~: testlist