/usr/share/doc/libghc-quickcheck2-doc/html/src/Test-QuickCheck-All.html is in libghc-quickcheck2-doc 2.9.2-1build1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 | <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<!-- Generated by HsColour, http://code.haskell.org/~malcolm/hscolour/ -->
<title>Test/QuickCheck/All.hs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
<pre><a name="line-1"></a><span class='hs-comment'>{-# LANGUAGE TemplateHaskell, Rank2Types, CPP #-}</span>
<a name="line-2"></a><span class='hs-cpp'>#ifndef NO_SAFE_HASKELL</span>
<a name="line-3"></a><span class='hs-comment'>{-# LANGUAGE Trustworthy #-}</span>
<a name="line-4"></a><span class='hs-cpp'>#endif</span>
<a name="line-5"></a>
<a name="line-6"></a><span class='hs-comment'>-- | Test all properties in the current module, using Template Haskell.</span>
<a name="line-7"></a><span class='hs-comment'>-- You need to have a @{-\# LANGUAGE TemplateHaskell \#-}@ pragma in</span>
<a name="line-8"></a><span class='hs-comment'>-- your module for any of these to work.</span>
<a name="line-9"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>Test</span><span class='hs-varop'>.</span><span class='hs-conid'>QuickCheck</span><span class='hs-varop'>.</span><span class='hs-conid'>All</span><span class='hs-layout'>(</span>
<a name="line-10"></a> <span class='hs-comment'>-- ** Testing all properties in a module</span>
<a name="line-11"></a> <span class='hs-varid'>quickCheckAll</span><span class='hs-layout'>,</span>
<a name="line-12"></a> <span class='hs-varid'>verboseCheckAll</span><span class='hs-layout'>,</span>
<a name="line-13"></a> <span class='hs-varid'>forAllProperties</span><span class='hs-layout'>,</span>
<a name="line-14"></a> <span class='hs-comment'>-- ** Testing polymorphic properties</span>
<a name="line-15"></a> <span class='hs-varid'>polyQuickCheck</span><span class='hs-layout'>,</span>
<a name="line-16"></a> <span class='hs-varid'>polyVerboseCheck</span><span class='hs-layout'>,</span>
<a name="line-17"></a> <span class='hs-varid'>monomorphic</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-18"></a>
<a name="line-19"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Language</span><span class='hs-varop'>.</span><span class='hs-conid'>Haskell</span><span class='hs-varop'>.</span><span class='hs-conid'>TH</span>
<a name="line-20"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Test</span><span class='hs-varop'>.</span><span class='hs-conid'>QuickCheck</span><span class='hs-varop'>.</span><span class='hs-conid'>Property</span> <span class='hs-varid'>hiding</span> <span class='hs-layout'>(</span><span class='hs-conid'>Result</span><span class='hs-layout'>)</span>
<a name="line-21"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Test</span><span class='hs-varop'>.</span><span class='hs-conid'>QuickCheck</span><span class='hs-varop'>.</span><span class='hs-conid'>Test</span>
<a name="line-22"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Char</span>
<a name="line-23"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>List</span>
<a name="line-24"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Monad</span>
<a name="line-25"></a>
<a name="line-26"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>System</span><span class='hs-varop'>.</span><span class='hs-conid'>IO</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>S</span>
<a name="line-27"></a>
<a name="line-28"></a><a name="polyQuickCheck"></a><span class='hs-comment'>-- | Test a polymorphic property, defaulting all type variables to 'Integer'.</span>
<a name="line-29"></a><span class='hs-comment'>--</span>
<a name="line-30"></a><span class='hs-comment'>-- Invoke as @$('polyQuickCheck' 'prop)@, where @prop@ is a property.</span>
<a name="line-31"></a><span class='hs-comment'>-- Note that just evaluating @'quickCheck' prop@ in GHCi will seem to</span>
<a name="line-32"></a><span class='hs-comment'>-- work, but will silently default all type variables to @()@!</span>
<a name="line-33"></a><span class='hs-comment'>--</span>
<a name="line-34"></a><span class='hs-comment'>-- @$('polyQuickCheck' \'prop)@ means the same as</span>
<a name="line-35"></a><span class='hs-comment'>-- @'quickCheck' $('monomorphic' \'prop)@.</span>
<a name="line-36"></a><span class='hs-comment'>-- If you want to supply custom arguments to 'polyQuickCheck',</span>
<a name="line-37"></a><span class='hs-comment'>-- you will have to combine 'quickCheckWith' and 'monomorphic' yourself.</span>
<a name="line-38"></a><span class='hs-comment'>--</span>
<a name="line-39"></a><span class='hs-comment'>-- If you want to use 'polyQuickCheck' in the same file where you defined the</span>
<a name="line-40"></a><span class='hs-comment'>-- property, the same scoping problems pop up as in 'quickCheckAll':</span>
<a name="line-41"></a><span class='hs-comment'>-- see the note there about @return []@.</span>
<a name="line-42"></a><span class='hs-definition'>polyQuickCheck</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>ExpQ</span>
<a name="line-43"></a><span class='hs-definition'>polyQuickCheck</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-keyglyph'>|</span> <span class='hs-varid'>quickCheck</span> <span class='hs-varop'>$</span><span class='hs-layout'>(</span><span class='hs-varid'>monomorphic</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span><span class='hs-keyglyph'>]</span>
<a name="line-44"></a>
<a name="line-45"></a><a name="polyVerboseCheck"></a><span class='hs-comment'>-- | Test a polymorphic property, defaulting all type variables to 'Integer'.</span>
<a name="line-46"></a><span class='hs-comment'>-- This is just a convenience function that combines 'verboseCheck' and 'monomorphic'.</span>
<a name="line-47"></a><span class='hs-comment'>--</span>
<a name="line-48"></a><span class='hs-comment'>-- If you want to use 'polyVerboseCheck' in the same file where you defined the</span>
<a name="line-49"></a><span class='hs-comment'>-- property, the same scoping problems pop up as in 'quickCheckAll':</span>
<a name="line-50"></a><span class='hs-comment'>-- see the note there about @return []@.</span>
<a name="line-51"></a><span class='hs-definition'>polyVerboseCheck</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>ExpQ</span>
<a name="line-52"></a><span class='hs-definition'>polyVerboseCheck</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-keyglyph'>|</span> <span class='hs-varid'>verboseCheck</span> <span class='hs-varop'>$</span><span class='hs-layout'>(</span><span class='hs-varid'>monomorphic</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span><span class='hs-keyglyph'>]</span>
<a name="line-53"></a>
<a name="line-54"></a><a name="Error"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>Error</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>forall</span> <span class='hs-varid'>a</span><span class='hs-varop'>.</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span>
<a name="line-55"></a>
<a name="line-56"></a><a name="monomorphic"></a><span class='hs-comment'>-- | Monomorphise an arbitrary property by defaulting all type variables to 'Integer'.</span>
<a name="line-57"></a><span class='hs-comment'>--</span>
<a name="line-58"></a><span class='hs-comment'>-- For example, if @f@ has type @'Ord' a => [a] -> [a]@</span>
<a name="line-59"></a><span class='hs-comment'>-- then @$('monomorphic' 'f)@ has type @['Integer'] -> ['Integer']@.</span>
<a name="line-60"></a><span class='hs-comment'>--</span>
<a name="line-61"></a><span class='hs-comment'>-- If you want to use 'monomorphic' in the same file where you defined the</span>
<a name="line-62"></a><span class='hs-comment'>-- property, the same scoping problems pop up as in 'quickCheckAll':</span>
<a name="line-63"></a><span class='hs-comment'>-- see the note there about @return []@.</span>
<a name="line-64"></a><span class='hs-definition'>monomorphic</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>ExpQ</span>
<a name="line-65"></a><span class='hs-definition'>monomorphic</span> <span class='hs-varid'>t</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-66"></a> <span class='hs-varid'>ty0</span> <span class='hs-keyglyph'><-</span> <span class='hs-varid'>fmap</span> <span class='hs-varid'>infoType</span> <span class='hs-layout'>(</span><span class='hs-varid'>reify</span> <span class='hs-varid'>t</span><span class='hs-layout'>)</span>
<a name="line-67"></a> <span class='hs-keyword'>let</span> <span class='hs-varid'>err</span> <span class='hs-varid'>msg</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>error</span> <span class='hs-varop'>$</span> <span class='hs-varid'>msg</span> <span class='hs-varop'>++</span> <span class='hs-str'>": "</span> <span class='hs-varop'>++</span> <span class='hs-varid'>pprint</span> <span class='hs-varid'>ty0</span>
<a name="line-68"></a> <span class='hs-layout'>(</span><span class='hs-varid'>polys</span><span class='hs-layout'>,</span> <span class='hs-varid'>ctx</span><span class='hs-layout'>,</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'><-</span> <span class='hs-varid'>deconstructType</span> <span class='hs-varid'>err</span> <span class='hs-varid'>ty0</span>
<a name="line-69"></a> <span class='hs-keyword'>case</span> <span class='hs-varid'>polys</span> <span class='hs-keyword'>of</span>
<a name="line-70"></a> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>expName</span> <span class='hs-varid'>t</span><span class='hs-layout'>)</span>
<a name="line-71"></a> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyword'>do</span>
<a name="line-72"></a> <span class='hs-varid'>integer</span> <span class='hs-keyglyph'><-</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>t</span><span class='hs-keyglyph'>|</span> <span class='hs-conid'>Integer</span> <span class='hs-keyglyph'>|</span><span class='hs-keyglyph'>]</span>
<a name="line-73"></a> <span class='hs-varid'>ty'</span> <span class='hs-keyglyph'><-</span> <span class='hs-varid'>monomorphiseType</span> <span class='hs-varid'>err</span> <span class='hs-varid'>integer</span> <span class='hs-varid'>ty</span>
<a name="line-74"></a> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>SigE</span> <span class='hs-layout'>(</span><span class='hs-varid'>expName</span> <span class='hs-varid'>t</span><span class='hs-layout'>)</span> <span class='hs-varid'>ty'</span><span class='hs-layout'>)</span>
<a name="line-75"></a>
<a name="line-76"></a><a name="expName"></a><span class='hs-definition'>expName</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Exp</span>
<a name="line-77"></a><span class='hs-definition'>expName</span> <span class='hs-varid'>n</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>isVar</span> <span class='hs-varid'>n</span> <span class='hs-keyword'>then</span> <span class='hs-conid'>VarE</span> <span class='hs-varid'>n</span> <span class='hs-keyword'>else</span> <span class='hs-conid'>ConE</span> <span class='hs-varid'>n</span>
<a name="line-78"></a>
<a name="line-79"></a><a name="isVar"></a><span class='hs-comment'>-- See section 2.4 of the Haskell 2010 Language Report, plus support for "[]"</span>
<a name="line-80"></a><span class='hs-definition'>isVar</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span>
<a name="line-81"></a><span class='hs-definition'>isVar</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>isVar'</span> <span class='hs-layout'>(</span><span class='hs-varid'>c</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>not</span> <span class='hs-layout'>(</span><span class='hs-varid'>isUpper</span> <span class='hs-varid'>c</span> <span class='hs-varop'>||</span> <span class='hs-varid'>c</span> <span class='hs-varop'>`elem`</span> <span class='hs-str'>":["</span><span class='hs-layout'>)</span>
<a name="line-82"></a> <span class='hs-varid'>isVar'</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-83"></a> <span class='hs-keyword'>in</span> <span class='hs-varid'>isVar'</span> <span class='hs-varop'>.</span> <span class='hs-varid'>nameBase</span>
<a name="line-84"></a>
<a name="line-85"></a><a name="infoType"></a><span class='hs-definition'>infoType</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Info</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Type</span>
<a name="line-86"></a><span class='hs-cpp'>#if MIN_VERSION_template_haskell(2,11,0)</span>
<a name="line-87"></a><span class='hs-definition'>infoType</span> <span class='hs-layout'>(</span><span class='hs-conid'>ClassOpI</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>ty</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ty</span>
<a name="line-88"></a><span class='hs-definition'>infoType</span> <span class='hs-layout'>(</span><span class='hs-conid'>DataConI</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>ty</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ty</span>
<a name="line-89"></a><span class='hs-definition'>infoType</span> <span class='hs-layout'>(</span><span class='hs-conid'>VarI</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>ty</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ty</span>
<a name="line-90"></a><span class='hs-cpp'>#else</span>
<a name="line-91"></a><span class='hs-definition'>infoType</span> <span class='hs-layout'>(</span><span class='hs-conid'>ClassOpI</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>ty</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ty</span>
<a name="line-92"></a><span class='hs-definition'>infoType</span> <span class='hs-layout'>(</span><span class='hs-conid'>DataConI</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>ty</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ty</span>
<a name="line-93"></a><span class='hs-definition'>infoType</span> <span class='hs-layout'>(</span><span class='hs-conid'>VarI</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>ty</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ty</span>
<a name="line-94"></a><span class='hs-cpp'>#endif</span>
<a name="line-95"></a>
<a name="line-96"></a><a name="deconstructType"></a><span class='hs-definition'>deconstructType</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Error</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Type</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Q</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>Name</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span> <span class='hs-conid'>Cxt</span><span class='hs-layout'>,</span> <span class='hs-conid'>Type</span><span class='hs-layout'>)</span>
<a name="line-97"></a><span class='hs-definition'>deconstructType</span> <span class='hs-varid'>err</span> <span class='hs-varid'>ty0</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>ForallT</span> <span class='hs-varid'>xs</span> <span class='hs-varid'>ctx</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-98"></a> <span class='hs-keyword'>let</span> <span class='hs-varid'>plain</span> <span class='hs-layout'>(</span><span class='hs-conid'>PlainTV</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-99"></a><span class='hs-cpp'>#if MIN_VERSION_template_haskell(2,8,0)</span>
<a name="line-100"></a> <span class='hs-varid'>plain</span> <span class='hs-layout'>(</span><span class='hs-conid'>KindedTV</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>StarT</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-101"></a><span class='hs-cpp'>#else</span>
<a name="line-102"></a> <span class='hs-varid'>plain</span> <span class='hs-layout'>(</span><span class='hs-conid'>KindedTV</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>StarK</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-103"></a><span class='hs-cpp'>#endif</span>
<a name="line-104"></a> <span class='hs-varid'>plain</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-105"></a> <span class='hs-varid'>unless</span> <span class='hs-layout'>(</span><span class='hs-varid'>all</span> <span class='hs-varid'>plain</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-varid'>err</span> <span class='hs-str'>"Higher-kinded type variables in type"</span>
<a name="line-106"></a> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-layout'>(</span><span class='hs-conid'>PlainTV</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-varid'>xs</span><span class='hs-layout'>,</span> <span class='hs-varid'>ctx</span><span class='hs-layout'>,</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span>
<a name="line-107"></a><span class='hs-definition'>deconstructType</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>ty</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>[]</span><span class='hs-layout'>,</span> <span class='hs-conid'>[]</span><span class='hs-layout'>,</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span>
<a name="line-108"></a>
<a name="line-109"></a><a name="monomorphiseType"></a><span class='hs-definition'>monomorphiseType</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Error</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Type</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Type</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>TypeQ</span>
<a name="line-110"></a><span class='hs-definition'>monomorphiseType</span> <span class='hs-varid'>err</span> <span class='hs-varid'>mono</span> <span class='hs-varid'>ty</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>VarT</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-varid'>mono</span>
<a name="line-111"></a><span class='hs-definition'>monomorphiseType</span> <span class='hs-varid'>err</span> <span class='hs-varid'>mono</span> <span class='hs-layout'>(</span><span class='hs-conid'>AppT</span> <span class='hs-varid'>t1</span> <span class='hs-varid'>t2</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>liftM2</span> <span class='hs-conid'>AppT</span> <span class='hs-layout'>(</span><span class='hs-varid'>monomorphiseType</span> <span class='hs-varid'>err</span> <span class='hs-varid'>mono</span> <span class='hs-varid'>t1</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>monomorphiseType</span> <span class='hs-varid'>err</span> <span class='hs-varid'>mono</span> <span class='hs-varid'>t2</span><span class='hs-layout'>)</span>
<a name="line-112"></a><span class='hs-definition'>monomorphiseType</span> <span class='hs-varid'>err</span> <span class='hs-varid'>mono</span> <span class='hs-varid'>ty</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>ForallT</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>err</span> <span class='hs-varop'>$</span> <span class='hs-str'>"Higher-ranked type"</span>
<a name="line-113"></a><span class='hs-definition'>monomorphiseType</span> <span class='hs-varid'>err</span> <span class='hs-varid'>mono</span> <span class='hs-varid'>ty</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-varid'>ty</span>
<a name="line-114"></a>
<a name="line-115"></a><a name="forAllProperties"></a><span class='hs-comment'>-- | Test all properties in the current module, using a custom</span>
<a name="line-116"></a><span class='hs-comment'>-- 'quickCheck' function. The same caveats as with 'quickCheckAll'</span>
<a name="line-117"></a><span class='hs-comment'>-- apply.</span>
<a name="line-118"></a><span class='hs-comment'>--</span>
<a name="line-119"></a><span class='hs-comment'>-- @$'forAllProperties'@ has type @('Property' -> 'IO' 'Result') -> 'IO' 'Bool'@.</span>
<a name="line-120"></a><span class='hs-comment'>-- An example invocation is @$'forAllProperties' 'quickCheckResult'@,</span>
<a name="line-121"></a><span class='hs-comment'>-- which does the same thing as @$'quickCheckAll'@.</span>
<a name="line-122"></a><span class='hs-comment'>--</span>
<a name="line-123"></a><span class='hs-comment'>-- 'forAllProperties' has the same issue with scoping as 'quickCheckAll':</span>
<a name="line-124"></a><span class='hs-comment'>-- see the note there about @return []@.</span>
<a name="line-125"></a><span class='hs-definition'>forAllProperties</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Q</span> <span class='hs-conid'>Exp</span> <span class='hs-comment'>-- :: (Property -> IO Result) -> IO Bool</span>
<a name="line-126"></a><span class='hs-definition'>forAllProperties</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-127"></a> <span class='hs-conid'>Loc</span> <span class='hs-layout'>{</span> <span class='hs-varid'>loc_filename</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>filename</span> <span class='hs-layout'>}</span> <span class='hs-keyglyph'><-</span> <span class='hs-varid'>location</span>
<a name="line-128"></a> <span class='hs-varid'>when</span> <span class='hs-layout'>(</span><span class='hs-varid'>filename</span> <span class='hs-varop'>==</span> <span class='hs-str'>"<interactive>"</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-varid'>error</span> <span class='hs-str'>"don't run this interactively"</span>
<a name="line-129"></a> <span class='hs-varid'>ls</span> <span class='hs-keyglyph'><-</span> <span class='hs-varid'>runIO</span> <span class='hs-layout'>(</span><span class='hs-varid'>fmap</span> <span class='hs-varid'>lines</span> <span class='hs-layout'>(</span><span class='hs-varid'>readUTF8File</span> <span class='hs-varid'>filename</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-130"></a> <span class='hs-keyword'>let</span> <span class='hs-varid'>prefixes</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-varid'>takeWhile</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>c</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>isAlphaNum</span> <span class='hs-varid'>c</span> <span class='hs-varop'>||</span> <span class='hs-varid'>c</span> <span class='hs-varop'>==</span> <span class='hs-chr'>'_'</span> <span class='hs-varop'>||</span> <span class='hs-varid'>c</span> <span class='hs-varop'>==</span> <span class='hs-chr'>'\''</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span> <span class='hs-varid'>dropWhile</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>c</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>isSpace</span> <span class='hs-varid'>c</span> <span class='hs-varop'>||</span> <span class='hs-varid'>c</span> <span class='hs-varop'>==</span> <span class='hs-chr'>'>'</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varid'>ls</span>
<a name="line-131"></a> <span class='hs-varid'>idents</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>nubBy</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>x</span> <span class='hs-varid'>y</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>snd</span> <span class='hs-varid'>x</span> <span class='hs-varop'>==</span> <span class='hs-varid'>snd</span> <span class='hs-varid'>y</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>filter</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-str'>"prop_"</span> <span class='hs-varop'>`isPrefixOf`</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span> <span class='hs-varid'>snd</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>zip</span> <span class='hs-keyglyph'>[</span><span class='hs-num'>1</span><span class='hs-keyglyph'>..</span><span class='hs-keyglyph'>]</span> <span class='hs-varid'>prefixes</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-132"></a><span class='hs-cpp'>#if MIN_VERSION_template_haskell(2,8,0)</span>
<a name="line-133"></a> <span class='hs-varid'>warning</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>reportWarning</span> <span class='hs-layout'>(</span><span class='hs-str'>"Name "</span> <span class='hs-varop'>++</span> <span class='hs-varid'>x</span> <span class='hs-varop'>++</span> <span class='hs-str'>" found in source file but was not in scope"</span><span class='hs-layout'>)</span>
<a name="line-134"></a><span class='hs-cpp'>#else</span>
<a name="line-135"></a> <span class='hs-varid'>warning</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>report</span> <span class='hs-conid'>False</span> <span class='hs-layout'>(</span><span class='hs-str'>"Name "</span> <span class='hs-varop'>++</span> <span class='hs-varid'>x</span> <span class='hs-varop'>++</span> <span class='hs-str'>" found in source file but was not in scope"</span><span class='hs-layout'>)</span>
<a name="line-136"></a><span class='hs-cpp'>#endif</span>
<a name="line-137"></a> <span class='hs-varid'>quickCheckOne</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>Int</span><span class='hs-layout'>,</span> <span class='hs-conid'>String</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Q</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Exp</span><span class='hs-keyglyph'>]</span>
<a name="line-138"></a> <span class='hs-varid'>quickCheckOne</span> <span class='hs-layout'>(</span><span class='hs-varid'>l</span><span class='hs-layout'>,</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-139"></a> <span class='hs-varid'>exists</span> <span class='hs-keyglyph'><-</span> <span class='hs-layout'>(</span><span class='hs-varid'>warning</span> <span class='hs-varid'>x</span> <span class='hs-varop'>>></span> <span class='hs-varid'>return</span> <span class='hs-conid'>False</span><span class='hs-layout'>)</span> <span class='hs-varop'>`recover`</span> <span class='hs-layout'>(</span><span class='hs-varid'>reify</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkName</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-varop'>>></span> <span class='hs-varid'>return</span> <span class='hs-conid'>True</span><span class='hs-layout'>)</span>
<a name="line-140"></a> <span class='hs-keyword'>if</span> <span class='hs-varid'>exists</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>sequence</span> <span class='hs-keyglyph'>[</span> <span class='hs-keyglyph'>[</span><span class='hs-keyglyph'>|</span> <span class='hs-layout'>(</span><span class='hs-varop'>$</span><span class='hs-layout'>(</span><span class='hs-varid'>stringE</span> <span class='hs-varop'>$</span> <span class='hs-varid'>x</span> <span class='hs-varop'>++</span> <span class='hs-str'>" from "</span> <span class='hs-varop'>++</span> <span class='hs-varid'>filename</span> <span class='hs-varop'>++</span> <span class='hs-str'>":"</span> <span class='hs-varop'>++</span> <span class='hs-varid'>show</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-141"></a> <span class='hs-varid'>property</span> <span class='hs-varop'>$</span><span class='hs-layout'>(</span><span class='hs-varid'>monomorphic</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkName</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>]</span>
<a name="line-142"></a> <span class='hs-keyword'>else</span> <span class='hs-varid'>return</span> <span class='hs-conid'>[]</span>
<a name="line-143"></a> <span class='hs-keyglyph'>[</span><span class='hs-keyglyph'>|</span> <span class='hs-varid'>runQuickCheckAll</span> <span class='hs-varop'>$</span><span class='hs-layout'>(</span><span class='hs-varid'>fmap</span> <span class='hs-layout'>(</span><span class='hs-conid'>ListE</span> <span class='hs-varop'>.</span> <span class='hs-varid'>concat</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>mapM</span> <span class='hs-varid'>quickCheckOne</span> <span class='hs-varid'>idents</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span><span class='hs-keyglyph'>]</span>
<a name="line-144"></a>
<a name="line-145"></a><a name="readUTF8File"></a><span class='hs-definition'>readUTF8File</span> <span class='hs-varid'>name</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>S</span><span class='hs-varop'>.</span><span class='hs-varid'>openFile</span> <span class='hs-varid'>name</span> <span class='hs-conid'>S</span><span class='hs-varop'>.</span><span class='hs-conid'>ReadMode</span> <span class='hs-varop'>>>=</span>
<a name="line-146"></a> <span class='hs-varid'>set_utf8_io_enc</span> <span class='hs-varop'>>>=</span>
<a name="line-147"></a> <span class='hs-conid'>S</span><span class='hs-varop'>.</span><span class='hs-varid'>hGetContents</span>
<a name="line-148"></a>
<a name="line-149"></a><a name="set_utf8_io_enc"></a><span class='hs-comment'>-- Deal with UTF-8 input and output.</span>
<a name="line-150"></a><span class='hs-definition'>set_utf8_io_enc</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>S</span><span class='hs-varop'>.</span><span class='hs-conid'>Handle</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>IO</span> <span class='hs-conid'>S</span><span class='hs-varop'>.</span><span class='hs-conid'>Handle</span>
<a name="line-151"></a><span class='hs-cpp'>#if __GLASGOW_HASKELL__ > 611</span>
<a name="line-152"></a><span class='hs-comment'>-- possibly if MIN_VERSION_base(4,2,0)</span>
<a name="line-153"></a><span class='hs-definition'>set_utf8_io_enc</span> <span class='hs-varid'>h</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-conid'>S</span><span class='hs-varop'>.</span><span class='hs-varid'>hSetEncoding</span> <span class='hs-varid'>h</span> <span class='hs-conid'>S</span><span class='hs-varop'>.</span><span class='hs-varid'>utf8</span><span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-varid'>h</span>
<a name="line-154"></a><span class='hs-cpp'>#else</span>
<a name="line-155"></a><span class='hs-definition'>set_utf8_io_enc</span> <span class='hs-varid'>h</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-varid'>h</span>
<a name="line-156"></a><span class='hs-cpp'>#endif</span>
<a name="line-157"></a>
<a name="line-158"></a><a name="quickCheckAll"></a><span class='hs-comment'>-- | Test all properties in the current module.</span>
<a name="line-159"></a><span class='hs-comment'>-- The name of the property must begin with @prop_@.</span>
<a name="line-160"></a><span class='hs-comment'>-- Polymorphic properties will be defaulted to 'Integer'.</span>
<a name="line-161"></a><span class='hs-comment'>-- Returns 'True' if all tests succeeded, 'False' otherwise.</span>
<a name="line-162"></a><span class='hs-comment'>--</span>
<a name="line-163"></a><span class='hs-comment'>-- To use 'quickCheckAll', add a definition to your module along</span>
<a name="line-164"></a><span class='hs-comment'>-- the lines of</span>
<a name="line-165"></a><span class='hs-comment'>--</span>
<a name="line-166"></a><span class='hs-comment'>-- > return []</span>
<a name="line-167"></a><span class='hs-comment'>-- > runTests = $quickCheckAll</span>
<a name="line-168"></a><span class='hs-comment'>--</span>
<a name="line-169"></a><span class='hs-comment'>-- and then execute @runTests@.</span>
<a name="line-170"></a><span class='hs-comment'>--</span>
<a name="line-171"></a><span class='hs-comment'>-- Note: the bizarre @return []@ in the example above is needed on</span>
<a name="line-172"></a><span class='hs-comment'>-- GHC 7.8; without it, 'quickCheckAll' will not be able to find</span>
<a name="line-173"></a><span class='hs-comment'>-- any of the properties. For the curious, the @return []@ is a</span>
<a name="line-174"></a><span class='hs-comment'>-- Template Haskell splice that makes GHC insert the empty list</span>
<a name="line-175"></a><span class='hs-comment'>-- of declarations at that point in the program; GHC typechecks</span>
<a name="line-176"></a><span class='hs-comment'>-- everything before the @return []@ before it starts on the rest</span>
<a name="line-177"></a><span class='hs-comment'>-- of the module, which means that the later call to 'quickCheckAll'</span>
<a name="line-178"></a><span class='hs-comment'>-- can see everything that was defined before the @return []@. Yikes!</span>
<a name="line-179"></a><span class='hs-definition'>quickCheckAll</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Q</span> <span class='hs-conid'>Exp</span>
<a name="line-180"></a><span class='hs-definition'>quickCheckAll</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-keyglyph'>|</span> <span class='hs-varop'>$</span><span class='hs-layout'>(</span><span class='hs-varid'>forAllProperties</span><span class='hs-layout'>)</span> <span class='hs-varid'>quickCheckResult</span> <span class='hs-keyglyph'>|</span><span class='hs-keyglyph'>]</span>
<a name="line-181"></a>
<a name="line-182"></a><a name="verboseCheckAll"></a><span class='hs-comment'>-- | Test all properties in the current module.</span>
<a name="line-183"></a><span class='hs-comment'>-- This is just a convenience function that combines 'quickCheckAll' and 'verbose'.</span>
<a name="line-184"></a><span class='hs-comment'>--</span>
<a name="line-185"></a><span class='hs-comment'>-- 'verboseCheckAll' has the same issue with scoping as 'quickCheckAll':</span>
<a name="line-186"></a><span class='hs-comment'>-- see the note there about @return []@.</span>
<a name="line-187"></a><span class='hs-definition'>verboseCheckAll</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Q</span> <span class='hs-conid'>Exp</span>
<a name="line-188"></a><span class='hs-definition'>verboseCheckAll</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-keyglyph'>|</span> <span class='hs-varop'>$</span><span class='hs-layout'>(</span><span class='hs-varid'>forAllProperties</span><span class='hs-layout'>)</span> <span class='hs-varid'>verboseCheckResult</span> <span class='hs-keyglyph'>|</span><span class='hs-keyglyph'>]</span>
<a name="line-189"></a>
<a name="line-190"></a><a name="runQuickCheckAll"></a><span class='hs-definition'>runQuickCheckAll</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>String</span><span class='hs-layout'>,</span> <span class='hs-conid'>Property</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-conid'>Property</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>IO</span> <span class='hs-conid'>Result</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>IO</span> <span class='hs-conid'>Bool</span>
<a name="line-191"></a><span class='hs-definition'>runQuickCheckAll</span> <span class='hs-varid'>ps</span> <span class='hs-varid'>qc</span> <span class='hs-keyglyph'>=</span>
<a name="line-192"></a> <span class='hs-varid'>fmap</span> <span class='hs-varid'>and</span> <span class='hs-varop'>.</span> <span class='hs-varid'>forM</span> <span class='hs-varid'>ps</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-layout'>(</span><span class='hs-varid'>xs</span><span class='hs-layout'>,</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyword'>do</span>
<a name="line-193"></a> <span class='hs-varid'>putStrLn</span> <span class='hs-varop'>$</span> <span class='hs-str'>"=== "</span> <span class='hs-varop'>++</span> <span class='hs-varid'>xs</span> <span class='hs-varop'>++</span> <span class='hs-str'>" ==="</span>
<a name="line-194"></a> <span class='hs-varid'>r</span> <span class='hs-keyglyph'><-</span> <span class='hs-varid'>qc</span> <span class='hs-varid'>p</span>
<a name="line-195"></a> <span class='hs-varid'>putStrLn</span> <span class='hs-str'>""</span>
<a name="line-196"></a> <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>r</span> <span class='hs-keyword'>of</span>
<a name="line-197"></a> <span class='hs-conid'>Success</span> <span class='hs-layout'>{</span> <span class='hs-layout'>}</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>True</span>
<a name="line-198"></a> <span class='hs-conid'>Failure</span> <span class='hs-layout'>{</span> <span class='hs-layout'>}</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>False</span>
<a name="line-199"></a> <span class='hs-conid'>NoExpectedFailure</span> <span class='hs-layout'>{</span> <span class='hs-layout'>}</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>False</span>
<a name="line-200"></a> <span class='hs-conid'>GaveUp</span> <span class='hs-layout'>{</span> <span class='hs-layout'>}</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>False</span>
<a name="line-201"></a> <span class='hs-conid'>InsufficientCoverage</span> <span class='hs-layout'>{</span> <span class='hs-layout'>}</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>False</span>
</pre></body>
</html>
|