module Aws.ElasticTranscoder.Json.Test ( tests , testAll , testAllVerbose ) where import Aws.ElasticTranscoder.Json.Types import Text.Printf import Data.Aeson import qualified Test.QuickCheck as QC import qualified Distribution.TestSuite as TS -- | Detailed-0.9/Cabal-1.14.0 test suite: tests :: [TS.Test] tests = map TS.impure simple_tests -- | Something to run in ghci: testAll :: IO () testAll = mapM_ part simple_tests where part st = do putStr $ printf "%-35s: " $ nameST st testST st False -- | Verbose tests from ghci: testAllVerbose :: IO () testAllVerbose = mapM_ part simple_tests where part st = do putStr $ printf "\n%s:\n" $ nameST st testST st True -- Our list of tests: simple_tests :: [SimpleTest] simple_tests = [ ae (mk_aet "JobId" :: AETest JobId ) , ae (mk_aet "PresetId" :: AETest PresetId ) , ae (mk_aet "PageToken" :: AETest PageToken ) , ae (mk_aet "JobSpec" :: AETest JobSpec ) , ae (mk_aet "JobSingle" :: AETest JobSingle ) , ae (mk_aet "JobList" :: AETest JobList ) , ae (mk_aet "JobSpecId" :: AETest JobSpecId ) , ae (mk_aet "JSInput" :: AETest JSInput ) , ae (mk_aet "JSOutput" :: AETest JSOutput ) , ae (mk_aet "JSOutputStatus" :: AETest JSOutputStatus ) , ae (mk_aet "FrameRate" :: AETest FrameRate ) , ae (mk_aet "Resolution" :: AETest Resolution ) , ae (mk_aet "AspectRatio" :: AETest AspectRatio ) , ae (mk_aet "Container" :: AETest Container ) , ae (mk_aet "Rotate" :: AETest Rotate ) , ae (mk_aet "Status" :: AETest Status ) , ae (mk_aet "PipelineName" :: AETest PipelineName ) , ae (mk_aet "PipelineId" :: AETest PipelineId ) , ae (mk_aet "Pipeline" :: AETest Pipeline ) , ae (mk_aet "PipelineSingle" :: AETest PipelineSingle ) , ae (mk_aet "PipelineList" :: AETest PipelineList ) , ae (mk_aet "PipelineIdStatus" :: AETest PipelineIdStatus ) , ae (mk_aet "Notifications" :: AETest Notifications ) , ae (mk_aet "PipelineIdAndStatus" :: AETest PipelineIdAndStatus) , ae (mk_aet "PipelineIdAndNotifications" :: AETest PipelineIdAndNotifications) , ae (mk_aet "RoleTest" :: AETest RoleTest ) , ae (mk_aet "PresetName" :: AETest PresetName ) , ae (mk_aet "Preset" :: AETest Preset ) , ae (mk_aet "PresetResponse" :: AETest PresetResponse ) , ae (mk_aet "Audio" :: AETest Audio ) , ae (mk_aet "Video" :: AETest Video ) , ae (mk_aet "Thumbnails" :: AETest Thumbnails ) , ae (mk_aet "CodecOptions" :: AETest CodecOptions ) , ae (mk_aet "AudioCodec" :: AETest AudioCodec ) , ae (mk_aet "SampleRate" :: AETest SampleRate ) , ae (mk_aet "Channels" :: AETest Channels ) , ae (mk_aet "VideoCodec" :: AETest VideoCodec ) , ae (mk_aet "ThumbnailFormat" :: AETest ThumbnailFormat ) , ae (mk_aet "Profile" :: AETest Profile ) , ae (mk_aet "Level" :: AETest Level ) , ae (mk_aet "PrestetType" :: AETest PresetType ) , ae (mk_aet "BitRate" :: AETest BitRate ) , ae (mk_aet "KeyFrameRate" :: AETest KeyFrameRate ) , ae (mk_aet "FixedGOP" :: AETest FixedGOP ) , ae (mk_aet "Interval" :: AETest Interval ) , ae (mk_aet "MessagesSuccess" :: AETest MessagesSuccess ) , ae (mk_aet "AutoBool" :: AETest AutoBool ) , ae (mk_aet "TextOrNull" :: AETest TextOrNull ) , ae (mk_aet "EtsServiceError" :: AETest EtsServiceError ) ] where ae (AET st) = st -- Our simple QC tests and instances to insert into the Cabal framework. data SimpleTest = ST { nameST :: String , testST :: Bool -> IO QC.Result } instance TS.TestOptions SimpleTest where name = nameST options = const [] defaultOptions = const $ return $ TS.Options [] check = const $ const $ return [] instance TS.ImpureTestable SimpleTest where runM st _ = cnv_result `fmap` testST st False cnv_result :: QC.Result -> TS.Result cnv_result qcr = case qcr of QC.Success _ _ _ -> TS.Pass _ -> TS.Fail "Failed" -- AETest adds a phantom index to SimpleTest as a convenience -- to simplify usage of mk_aet, the generator for the -- aeson-round-trip tests. newtype AETest a = AET SimpleTest -- Check aeson decode is an inverse of encode, namely that: -- -- decode (encode [x]) == [x] -- -- N.B. x rwapped in list as JSON not good for encoding simple -- data types like strings and numbers and aeson strictly -- adheres to the standard. mk_aet :: (QC.Arbitrary a,Show a,FromJSON a,ToJSON a,Eq a) => String -> AETest a mk_aet nm0 = tst $ \x -> maybe False (==[x]) $ decode $ encode [x] where nm = "aeson." ++ nm0 tst :: (QC.Arbitrary a,Show a,FromJSON a,ToJSON a,Eq a) => (a->Bool) -> AETest a tst p = AET $ ST nm $ qc p qc p v = if v then QC.verboseCheckResult p else QC.quickCheckResult p