Simplified Maybe
[ruby-do-notation.git] / test / specs.rb
blob062c32a87c850c68453acfa61958180c697f5aab
1 require File.join(File.dirname(__FILE__), %w(.. init))
3 describe "Maybe:" do
4   specify "one or more nils results in nil" do
5     maybe = Maybe.run do
6       x <- unit(1)
7       y <- unit(nil)
8   
9       unit(x+y)
10     end
12     maybe.value.should == nil
13   end
15   specify "all non-nil results in complete calculation" do
16     maybe = Maybe.run do
17       x <- unit(1)
18       y <- unit(2)
19   
20       unit(x+y)
21     end
22     
23     maybe.value.should == 3
24   end
25 end
27 describe "Array:" do
28   specify "all results are calculated and concatenated" do
29     array = Array.run do
30       x <- [1,2,3]
31       y <- [10,20,30]
33       unit(x+y)
34     end
36     array.should == [11, 21, 31, 12, 22, 32, 13, 23, 33]
37   end
38 end
40 describe "Monad.run" do
41   specify "should pass extra arguments into the block" do
42     foo = 8000
44     array = Array.run(foo) do |foo|
45       x <- [1,2,3]
46       y <- [10,20,30]
48       unit(x+y+foo)
49     end
51     array.should == [8011, 8021, 8031, 8012, 8022, 8032, 8013, 8023, 8033]
52     
53     foo = 8000
54     bar = 70000
56     array = Array.run(foo, bar) do |foo, bar|
57       x <- [1,2,3]
58       y <- [10,20,30]
60       unit(x+y+foo+bar)
61     end
63     array.should == [78011, 78021, 78031, 78012, 78022, 78032, 78013, 78023, 78033]
64   end
65   
66   specify "should be nestable" do
67     array = Array.run do
68       x <- run do
69         a <- ['A','a']
70         b <- ['B','b']
72         unit(a+b)
73       end
75       y <- run do
76         a <- ['C','c']
77         b <- ['D','d']
79         unit(a+b)
80       end
82       unit(x+y)
83     end
84     
85     array.should == ["ABCD", "ABCd", "ABcD", "ABcd",
86                      "AbCD", "AbCd", "AbcD", "Abcd",
87                      "aBCD", "aBCd", "aBcD", "aBcd",
88                      "abCD", "abCd", "abcD", "abcd"]
89   end
90 end