packages feed

regexchar-0.9.0.14: src-test/Grecce/Test/QuickCheck/MetaChar.hs

{-# OPTIONS_GHC -fno-warn-orphans #-}
{-
	Copyright (C) 2010-2015 Dr. Alistair Ward

	This program is free software: you can redistribute it and/or modify
	it under the terms of the GNU General Public License as published by
	the Free Software Foundation, either version 3 of the License, or
	(at your option) any later version.

	This program is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	GNU General Public License for more details.

	You should have received a copy of the GNU General Public License
	along with this program.  If not, see <http://www.gnu.org/licenses/>.
-}
{- |
 [@AUTHOR@]	Dr. Alistair Ward

 [@DESCRIPTION@]	Implements 'Test.QuickCheck.Arbitrary' & defines tests based on it.

 [@TODO@]	Test /Perl-style shortcuts/ & /Posix Character-classes/.
-}

module Grecce.Test.QuickCheck.MetaChar(
-- * Constants
	results,
--	testCharacters,
-- * Types
-- ** Type-synonyms
--	Testable
) where

import qualified	Data.List
import qualified	RegExChar.MetaChar	as MetaChar	-- CAVEAT: beware of the similar name.
import qualified	RegExDot.BracketExpression
import qualified	RegExDot.BracketExpressionMember
import qualified	RegExDot.Meta
import qualified	Test.QuickCheck
import qualified	ToolShed.Test.ReversibleIO

testCharacters :: String
testCharacters	= filter (`notElem` [RegExDot.Meta.shortcutToken, RegExDot.BracketExpression.negationToken]) [' ' .. '~']	-- TODO: permit all characters.

instance Test.QuickCheck.Arbitrary MetaChar.MetaChar	where
	arbitrary	= Test.QuickCheck.oneof $ map (fmap MetaChar.MkMetaChar) [
		return {-to Gen-monad-} RegExDot.Meta.Any,
		RegExDot.Meta.Literal `fmap` Test.QuickCheck.elements testCharacters,
		(RegExDot.Meta.AnyOf . map RegExDot.BracketExpressionMember.Literal . Data.List.nub) `fmap` arbitraryCharList 1 16,	-- Test.QuickCheck.vector 16 {-Char-},
		(RegExDot.Meta.NoneOf . map RegExDot.BracketExpressionMember.Literal . Data.List.nub) `fmap` arbitraryCharList 1 4
	 ] where
		arbitraryCharList :: Int -> Int -> Test.QuickCheck.Gen String
		arbitraryCharList i j	= do
			l	<- Test.QuickCheck.arbitrary {-Int-}

			(take (min j $ i `max` l) . Data.List.nub . Data.List.filter (`elem` testCharacters)) `fmap` Test.QuickCheck.vector maxBound {-Char-}

type Testable	= MetaChar.MetaChar -> Test.QuickCheck.Property

-- | The constant test-results for this data-type.
results :: IO [Test.QuickCheck.Result]
results = mapM Test.QuickCheck.quickCheckResult [prop_io]	where
	prop_io :: Testable
	prop_io	= Test.QuickCheck.label "prop_io" . ToolShed.Test.ReversibleIO.isReversible