-- Copyright (c) 2019 Herbert Valerio Riedel -- -- This file is free software: you may copy, redistribute and/or modify it -- under the terms of the GNU General Public License as published by the -- Free Software Foundation, either version 2 of the License, or (at your -- option) any later version. -- -- This file 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 (see `LICENSE`). If not, see -- . {-# LANGUAGE DataKinds #-} {-# LANGUAGE FlexibleInstances #-} {-# OPTIONS_GHC -fno-warn-orphans #-} module Arbitrary () where import LDAPv3 import Data.Coerce (coerce) import Data.Int import qualified Data.Text.Short as TS import Test.QuickCheck.Instances () import Test.Tasty.QuickCheck instance Arbitrary TS.ShortText where arbitrary = TS.fromText <$> arbitrary shrink t = map TS.fromText (shrink (TS.toText t)) instance Arbitrary x => Arbitrary (IMPLICIT tag x) where arbitrary = IMPLICIT <$> arbitrary shrink (IMPLICIT x) = coerce (shrink x) instance Arbitrary x => Arbitrary (EXPLICIT tag x) where arbitrary = EXPLICIT <$> arbitrary shrink (EXPLICIT x) = coerce (shrink x) instance Arbitrary x => Arbitrary (SET x) where arbitrary = SET <$> arbitrary shrink (SET x) = coerce (shrink x) instance Arbitrary x => Arbitrary (SET1 x) where arbitrary = SET1 <$> arbitrary shrink (SET1 x) = coerce (shrink x) instance Arbitrary MessageID where arbitrary = MessageID <$> arbitrary shrink (MessageID i) = coerce (shrink i) instance Arbitrary (UInt 1 127 Int8) where arbitrary = either (\_ -> 1) id . toUInt <$> choose (1,127) instance Arbitrary (UInt 0 MaxInt Int32) where arbitrary = int2msgid <$> arbitrary shrink = map int2msgid . shrink . fromUInt int2msgid :: Int32 -> UInt 0 MaxInt Int32 int2msgid = either (\_ -> 0) id . toUInt . abs instance Arbitrary ResultCode where arbitrary = arbitraryBoundedEnum shrink ResultCode'success = [] shrink _ = [ResultCode'success] instance Arbitrary LDAPMessage where arbitrary = LDAPMessage <$> arbitrary <*> arbitrary <*> arbitrary shrink = genericShrink instance Arbitrary BOOLEAN_DEFAULT_FALSE where arbitrary = pure BOOL_TRUE instance Arbitrary Control where arbitrary = Control <$> arbitrary <*> oneof [pure Nothing, pure (Just BOOL_TRUE)] <*> arbitrary shrink = genericShrink instance Arbitrary LDAPResult where arbitrary = LDAPResult <$> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary shrink = genericShrink instance Arbitrary ProtocolOp where arbitrary = frequency [ (2, ProtocolOp'bindRequest <$> arbitrary) , (2, ProtocolOp'bindResponse <$> arbitrary) , (1, ProtocolOp'unbindRequest <$> arbitrary) , (5, ProtocolOp'searchRequest <$> arbitrary) , (1, ProtocolOp'searchResDone <$> arbitrary) , (5, ProtocolOp'searchResEntry <$> arbitrary) , (2, ProtocolOp'searchResRef <$> arbitrary) , (2, ProtocolOp'modifyRequest <$> arbitrary) , (1, ProtocolOp'modifyResponse <$> arbitrary) , (2, ProtocolOp'addRequest <$> arbitrary) , (1, ProtocolOp'addResponse <$> arbitrary) , (1, ProtocolOp'delRequest <$> arbitrary) , (1, ProtocolOp'delResponse <$> arbitrary) , (2, ProtocolOp'modDNRequest <$> arbitrary) , (1, ProtocolOp'modDNResponse <$> arbitrary) , (2, ProtocolOp'compareRequest <$> arbitrary) , (1, ProtocolOp'compareResponse <$> arbitrary) , (1, ProtocolOp'abandonRequest <$> arbitrary) , (2, ProtocolOp'extendedReq <$> arbitrary) , (2, ProtocolOp'extendedResp <$> arbitrary) , (2, ProtocolOp'intermediateResponse <$> arbitrary) ] shrink = genericShrink instance Arbitrary BindRequest where arbitrary = BindRequest <$> arbitrary <*> arbitrary <*> arbitrary shrink = genericShrink instance Arbitrary AuthenticationChoice where arbitrary = oneof [ AuthenticationChoice'simple <$> arbitrary , AuthenticationChoice'sasl <$> arbitrary ] shrink = genericShrink instance Arbitrary SaslCredentials where arbitrary = SaslCredentials <$> arbitrary <*> arbitrary shrink = genericShrink instance Arbitrary BindResponse where arbitrary = BindResponse <$> arbitrary <*> arbitrary shrink = genericShrink instance Arbitrary SearchRequest where arbitrary = SearchRequest <$> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary shrink = genericShrink instance Arbitrary Scope where arbitrary = arbitraryBoundedEnum shrink = genericShrink instance Arbitrary DerefAliases where arbitrary = arbitraryBoundedEnum shrink = genericShrink instance Arbitrary Filter where arbitrary = frequency [( 1, Filter'and <$> arbitrary) ,( 1, Filter'or <$> arbitrary) ,( 1, Filter'not <$> arbitrary) ,(100, Filter'equalityMatch <$> arbitrary) ,(100, Filter'substrings <$> arbitrary) ,(100, Filter'greaterOrEqual <$> arbitrary) ,(100, Filter'lessOrEqual <$> arbitrary) ,(100, Filter'present <$> arbitrary) ,(100, Filter'approxMatch <$> arbitrary) ,(100, Filter'extensibleMatch <$> arbitrary) ] shrink = genericShrink instance Arbitrary SubstringFilter where arbitrary = SubstringFilter <$> arbitrary <*> arbitrary shrink = genericShrink instance Arbitrary MatchingRuleAssertion where arbitrary = MatchingRuleAssertion <$> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary shrink = genericShrink instance Arbitrary Substring where arbitrary = oneof [ Substring'initial <$> arbitrary , Substring'any <$> arbitrary , Substring'final <$> arbitrary ] shrink = genericShrink instance Arbitrary SearchResultEntry where arbitrary = SearchResultEntry <$> arbitrary <*> arbitrary shrink = genericShrink instance Arbitrary PartialAttribute where arbitrary = PartialAttribute <$> arbitrary <*> arbitrary shrink = genericShrink instance Arbitrary Attribute where arbitrary = Attribute <$> arbitrary <*> arbitrary shrink = genericShrink instance Arbitrary SearchResultReference where arbitrary = SearchResultReference <$> arbitrary shrink = genericShrink instance Arbitrary ModifyRequest where arbitrary = ModifyRequest <$> arbitrary <*> arbitrary shrink = genericShrink instance Arbitrary Change where arbitrary = Change <$> arbitrary <*> arbitrary shrink = genericShrink instance Arbitrary Operation where arbitrary = arbitraryBoundedEnum shrink = genericShrink instance Arbitrary AddRequest where arbitrary = AddRequest <$> arbitrary <*> arbitrary shrink = genericShrink instance Arbitrary CompareRequest where arbitrary = CompareRequest <$> arbitrary <*> arbitrary shrink = genericShrink instance Arbitrary AttributeValueAssertion where arbitrary = AttributeValueAssertion <$> arbitrary <*> arbitrary shrink = genericShrink instance Arbitrary ModifyDNRequest where arbitrary = ModifyDNRequest <$> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary shrink = genericShrink instance Arbitrary ExtendedRequest where arbitrary = ExtendedRequest <$> arbitrary <*> arbitrary shrink = genericShrink instance Arbitrary ExtendedResponse where arbitrary = ExtendedResponse <$> arbitrary <*> arbitrary <*> arbitrary shrink = genericShrink instance Arbitrary IntermediateResponse where arbitrary = IntermediateResponse <$> arbitrary <*> arbitrary shrink = genericShrink