File: ChasingBottoms.cabal

package info (click to toggle)
haskell-chasingbottoms 1.3.1.4-3
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 216 kB
  • sloc: haskell: 1,849; makefile: 2
file content (185 lines) | stat: -rw-r--r-- 6,311 bytes parent folder | download
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
name:               ChasingBottoms
version:            1.3.1.4
license:            MIT
license-file:       LICENCE
copyright:          Copyright (c) Nils Anders Danielsson 2004-2018.
author:             Nils Anders Danielsson
maintainer:         http://www.cse.chalmers.se/~nad/
synopsis:           For testing partial and infinite values.
description:
  Do you ever feel the need to test code involving bottoms (e.g. calls to
  the @error@ function), or code involving infinite values? Then this
  library could be useful for you.
  .
  It is usually easy to get a grip on bottoms by showing a value and
  waiting to see how much gets printed before the first exception is
  encountered. However, that quickly gets tiresome and is hard to automate
  using e.g. QuickCheck
  (<http://www.cse.chalmers.se/~rjmh/QuickCheck/>). With this library you
  can do the tests as simply as the following examples show.
  .
  Testing explicitly for bottoms:
  .
  > > isBottom (head [])
  > True
  .
  > > isBottom bottom
  > True
  .
  > > isBottom (\_ -> bottom)
  > False
  .
  > > isBottom (bottom, bottom)
  > False
  .
  Comparing finite, partial values:
  .
  > > ((bottom, 3) :: (Bool, Int)) ==! (bottom, 2+5-4)
  > True
  .
  > > ((bottom, bottom) :: (Bool, Int)) <! (bottom, 8)
  > True
  .
  Showing partial and infinite values (@\\\/!@ is join and @\/\\!@ is meet):
  .
  > > approxShow 4 $ (True, bottom) \/! (bottom, 'b')
  > "Just (True, 'b')"
  .
  > > approxShow 4 $ (True, bottom) /\! (bottom, 'b')
  > "(_|_, _|_)"
  .
  > > approxShow 4 $ ([1..] :: [Int])
  > "[1, 2, 3, _"
  .
  > > approxShow 4 $ (cycle [bottom] :: [Bool])
  > "[_|_, _|_, _|_, _"
  .
  Approximately comparing infinite, partial values:
  .
  > > approx 100 [2,4..] ==! approx 100 (filter even [1..] :: [Int])
  > True
  .
  > > approx 100 [2,4..] /=! approx 100 (filter even [bottom..] :: [Int])
  > True
  .
  The code above relies on the fact that @bottom@, just as @error
  \"...\"@, @undefined@ and pattern match failures, yield
  exceptions. Sometimes we are dealing with properly non-terminating
  computations, such as the following example, and then it can be nice to
  be able to apply a time-out:
  .
  > > timeOut' 1 (reverse [1..5])
  > Value [5,4,3,2,1]
  .
  > > timeOut' 1 (reverse [1..])
  > NonTermination
  .
  The time-out functionality can be used to treat \"slow\" computations as
  bottoms:
  .
  @
  \> let tweak = Tweak &#x7b; approxDepth = Just 5, timeOutLimit = Just 2 &#x7d;
  \> semanticEq tweak (reverse [1..], [1..]) (bottom :: [Int], [1..] :: [Int])
  True
  @
  .
  @
  \> let tweak = noTweak &#x7b; timeOutLimit = Just 2 &#x7d;
  \> semanticJoin tweak (reverse [1..], True) ([] :: [Int], bottom)
  Just ([],True)
  @
  .
  This can of course be dangerous:
  .
  @
  \> let tweak = noTweak &#x7b; timeOutLimit = Just 0 &#x7d;
  \> semanticEq tweak (reverse [1..100000000]) (bottom :: [Integer])
  True
  @
  .
  Timeouts can also be applied to @IO@ computations:
  .
  > > let primes () = unfoldr (\(x:xs) -> Just (x, filter ((/= 0) . (`mod` x)) xs)) [2..]
  > > timeOutMicro 100 (print $ primes ())
  > [2,NonTermination
  > > timeOutMicro 10000 (print $ take 10 $ primes ())
  > [2,3,5,7,11,13,17,19,23,29]
  > Value ()
  .
  For the underlying theory and a larger example involving use of
  QuickCheck, see the article \"Chasing Bottoms, A Case Study in Program
  Verification in the Presence of Partial and Infinite Values\"
  (<http://www.cse.chalmers.se/~nad/publications/danielsson-jansson-mpc2004.html>).
  .
  The code has been tested using GHC. Most parts can probably be
  ported to other Haskell compilers, but this would require some work.
  The @TimeOut@ functions require preemptive scheduling, and most of
  the rest requires @Data.Generics@; @isBottom@ only requires
  exceptions, though.
category:           Testing
tested-with:        GHC == 6.12.3,
                    GHC == 7.0.4,
                    GHC == 7.4.2,
                    GHC == 7.6.3,
                    GHC == 7.8.4,
                    GHC == 7.10.3,
                    GHC == 8.0.2,
                    GHC == 8.2.1
cabal-version:      >= 1.9.2
build-type:         Simple

source-repository head
  type:     darcs
  location: http://www.cse.chalmers.se/~nad/repos/ChasingBottoms/

library
    exposed-modules:
        Test.ChasingBottoms,
        Test.ChasingBottoms.Approx,
        Test.ChasingBottoms.ApproxShow,
        Test.ChasingBottoms.ContinuousFunctions,
        Test.ChasingBottoms.IsBottom,
        Test.ChasingBottoms.Nat,
        Test.ChasingBottoms.SemanticOrd,
        Test.ChasingBottoms.TimeOut

    other-modules: Test.ChasingBottoms.IsType

    build-depends: QuickCheck >= 2.3 && < 2.12,
                   mtl >= 2 && < 2.3,
                   base >= 4.2 && < 4.12,
                   containers >= 0.3 && < 0.6,
                   random >= 1.0 && < 1.2,
                   syb >= 0.1.0.2 && < 0.8

test-suite ChasingBottomsTestSuite
    type:          exitcode-stdio-1.0

    main-is:       Test/ChasingBottoms/Tests.hs

    other-modules: Test.ChasingBottoms.Approx,
                   Test.ChasingBottoms.Approx.Tests,
                   Test.ChasingBottoms.ApproxShow,
                   Test.ChasingBottoms.ApproxShow.Tests,
                   Test.ChasingBottoms.ContinuousFunctions,
                   Test.ChasingBottoms.ContinuousFunctions.Tests,
                   Test.ChasingBottoms.IsBottom,
                   Test.ChasingBottoms.IsBottom.Tests,
                   Test.ChasingBottoms.IsType,
                   Test.ChasingBottoms.IsType.Tests,
                   Test.ChasingBottoms.Nat,
                   Test.ChasingBottoms.Nat.Tests,
                   Test.ChasingBottoms.SemanticOrd,
                   Test.ChasingBottoms.SemanticOrd.Tests,
                   Test.ChasingBottoms.TestUtilities,
                   Test.ChasingBottoms.TestUtilities.Generators,
                   Test.ChasingBottoms.TimeOut
                   Test.ChasingBottoms.TimeOut.Tests

    build-depends: QuickCheck >= 2.3 && < 2.12,
                   mtl >= 2 && < 2.3,
                   base >= 4.2 && < 4.12,
                   containers >= 0.3 && < 0.6,
                   random >= 1.0 && < 1.2,
                   syb >= 0.1.0.2 && < 0.8,
                   array >= 0.3 && < 0.6