Restrict assert checks to .rb files.
[ruby_koans.git] / koans / about_blocks.rb
1 require File.expand_path(File.dirname(__FILE__) + '/edgecase')
2
3 class AboutBlocks < EdgeCase::Koan
4   def method_with_block
5     result = yield
6     result
7   end
8
9   def test_methods_can_take_blocks
10     yielded_result = method_with_block { 1 + 2 }
11     assert_equal __, yielded_result
12   end
13
14   def test_blocks_can_be_defined_with_do_end_too
15     yielded_result = method_with_block do 1 + 2 end
16     assert_equal __, yielded_result
17   end
18
19   # ------------------------------------------------------------------
20
21   def method_with_block_arguments
22     yield("Jim")
23   end
24
25   def test_blocks_can_take_arguments
26     result = method_with_block_arguments do |argument|
27       assert_equal __, argument
28     end
29   end
30
31   # ------------------------------------------------------------------
32
33   def many_yields
34     yield(:peanut)
35     yield(:butter)
36     yield(:and)
37     yield(:jelly)
38   end
39
40   def test_methods_can_call_yield_many_times
41     result = []
42     many_yields { |item| result << item }
43     assert_equal __, result
44   end
45
46   # ------------------------------------------------------------------
47
48   def yield_tester
49     if block_given?
50       yield
51     else
52       :no_block
53     end
54   end
55
56   def test_methods_can_see_if_they_have_been_called_with_a_block
57     assert_equal __, yield_tester { :with_block }
58     assert_equal __, yield_tester
59   end
60
61   # ------------------------------------------------------------------
62
63   def test_block_can_affect_variables_in_the_code_where_they_are_created
64     value = :initial_value
65     method_with_block { value = :modified_in_a_block }
66     assert_equal __, value
67   end
68
69   def test_blocks_can_be_assigned_to_variables_and_called_explicitly
70     add_one = lambda { |n| n + 1 }
71     assert_equal __, add_one.call(10)
72
73     # Alternative calling sequence
74     assert_equal __, add_one[10]
75   end
76
77   def test_stand_alone_blocks_can_be_passed_to_methods_expecting_blocks
78     make_upper = lambda { |n| n.upcase }
79     result = method_with_block_arguments(&make_upper)
80     assert_equal __, result
81   end
82
83   # ------------------------------------------------------------------
84
85   def method_with_explicit_block(&block)
86     block.call(10)
87   end
88
89   def test_methods_can_take_an_explicit_block_argument
90     assert_equal __, method_with_explicit_block { |n| n * 2 }
91
92     add_one = lambda { |n| n + 1 }
93     assert_equal __, method_with_explicit_block(&add_one)
94   end
95
96 end