-
Notifications
You must be signed in to change notification settings - Fork 0
/
FlowControlSpec.hs
96 lines (82 loc) · 2.76 KB
/
FlowControlSpec.hs
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
{-# LANGUAGE MultiWayIf #-}
module FlowControlSpec where
import Test.Hspec
spec :: Spec
spec = do
it "case statement" $ do
let x = 1
name = case x of { 1 -> "one"; 2 -> "two"; 3 -> "three"; _ -> "something else" }
name `shouldBe` "one"
it "case statement with declarations in where clause" $ do
let name = case x of { 1 -> "one"; 2 -> "two"; 3 -> "three"; _ -> "something else"; } where { x = 1 }
name `shouldBe` "one"
it "case statement using indentation to infer semicolons and braces" $ do
-- the right hand side of the binding must be indented at least one space past the beginning of the identifier
let name = case x of
1 -> "one"
2 -> "two"
3 -> "three"
_ -> "something else"
where x = 1
name `shouldBe` "one"
it "if statement" $ do
let three = if mod x 2 == 0 then "even" else "odd" where x = 3
four = if mod x 2 == 0 then "even" else "odd" where x = 4
three `shouldBe` "odd"
four `shouldBe` "even"
it "if statement with indentation" $ do
-- the right hand side of the binding must be indented at least one space past the beginning of the identifier
let three =
if mod x 2 == 0
then "even"
else "odd"
where x = 3
four =
if mod x 2 == 0
then "even"
else "odd"
where x = 4
three `shouldBe` "odd"
four `shouldBe` "even"
it "use function for flow control" $ do
let integerPlusOneOrZeroCase x = case x of
Just n -> n + 1
Nothing -> 0
integerPlusOneOrZeroFunction x = maybe 0 (\n -> n + 1) x
integerPlusOneOrZeroCase (Just 42) `shouldBe` 43
integerPlusOneOrZeroCase Nothing `shouldBe` 0
integerPlusOneOrZeroFunction (Just 42) `shouldBe` 43
integerPlusOneOrZeroFunction Nothing `shouldBe` 0
it "guards on functions" $ do
let sign x
| x < 0 = -1
| x > 0 = 1
| otherwise = 0
sign (-5) `shouldBe` -1
sign 0 `shouldBe` 0
sign 5 `shouldBe` 1
it "guards on case...of" $ do
let sign x = case x of
n | x < 0 -> -1
| x > 0 -> 1
| otherwise -> 0
sign (-5) `shouldBe` -1
sign 0 `shouldBe` 0
sign 5 `shouldBe` 1
it "pattern-matching plus guards" $ do
let signMaybe (Just x)
| x < 0 = -1
| x > 0 = 1
| otherwise = 0
signMaybe Nothing = 0
signMaybe (Just (-5)) `shouldBe` -1
signMaybe (Just 0) `shouldBe` 0
signMaybe (Just 5) `shouldBe` 1
signMaybe Nothing `shouldBe` 0
it "guards using multi-way if" $ do
let sign x = if | x < 0 -> -1
| x > 0 -> 1
| otherwise -> 0
sign (-5) `shouldBe` -1
sign 0 `shouldBe` 0
sign 5 `shouldBe` 1