{-|
Module      : Test.TypeSpec
Description : Type-Level eDSL for Type-Unit-Tests
Copyright   : (c) Sven Heyll, 2016
License     : BSD-3
Maintainer  : sven.heyll@gmail.com
Stability   : experimental

A tiny EDSL to write type-level-unit tests.

A simple example:

> specHelloWorld :: Expect (Int `Isn't` Bool)
> specHelloWorld = Valid

We can also /expect/ a bit more using lists and tuples:

> specGrouped
>   :: Expect '[ Int  `Isn't` Bool
>              , Int  `Is`    Int
>              , Bool `Is`    Bool  `ButNot`  String
>              ]
> specGrouped = Valid

The expectations are /executed/ by the compiler when solving the constraints of
'TypeSpec's constructors.

A 'TypeSpec' also has a 'Show' instance, which can be used in real unit tests
to print the expectations.

 This module contains mainly re-exports of.

 * "Test.TypeSpec.Core"

 * "Test.TypeSpec.Group"

 * "Test.TypeSpec.Label"

 * "Test.TypeSpec.ShouldBe"

-}
module Test.TypeSpec
  (
  -- * 'TypeSpec' Aliases

  type Expect,
  type Explain,

  -- * 'ShouldBe' aliases

  type Is,
  type IsTheSameAs,
  type TheseAreEqual,

  -- * 'ShouldNotBe' aliases

  type IsNot,
  type Isn't,
  type IsNotTheSameAs,
  type IsDifferentFrom,
  type TheseAreNotEqual,

  -- * 'ShouldBeTrue' aliases

  type IsTrue,
  type And,
  type Therefore,
  type That,

  -- * 'ShouldBeFalse' aliases

  type IsFalse,
  type Not,

  -- * Labelling Aliases

  type They,
  type Describe,
  type Context,
  type It's,

  -- * Reexports

  module Test.TypeSpec.Core,
  module Test.TypeSpec.Group,
  module Test.TypeSpec.Label,
  module Test.TypeSpec.ShouldBe

  )
  where

import Test.TypeSpec.Core
import Test.TypeSpec.Group
import Test.TypeSpec.Label
import Test.TypeSpec.ShouldBe

-- * 'TypeSpec' Aliases

type Expect = TypeSpec
type Explain does this = TypeSpec (It does this)

-- * 'ShouldBe' aliases

type Is = ShouldBe
type IsTheSameAs = ShouldBe
type TheseAreEqual = ShouldBe

-- * 'ShouldNotBe' aliases

type IsNot = ShouldNotBe
type Isn't = ShouldNotBe
type IsNotTheSameAs = ShouldNotBe
type IsDifferentFrom = ShouldNotBe
type TheseAreNotEqual = ShouldNotBe

-- * 'ShouldBeTrue' aliases

type IsTrue = ShouldBeTrue
type And = ShouldBeTrue
type Therefore = ShouldBeTrue
type That = ShouldBeTrue

-- * 'ShouldBeFalse' aliases

type IsFalse = ShouldBeFalse
type Not = ShouldBeTrue

-- * Labelling Aliases

type They message expectations = It message expectations
type Describe = It
type Context = It
type It's = It