d36e9ab3849835c6829307a9de63c9842bd3cba2
[ruby_koans.git] / koans / about_methods.rb
1 require File.expand_path(File.dirname(__FILE__) + '/edgecase')
2
3 def my_global_method(a,b)
4   a + b
5 end
6
7 class AboutMethods < EdgeCase::Koan
8
9   def test_calling_global_methods
10     assert_equal __, my_global_method(2,3)
11   end
12
13   def test_calling_global_methods_without_parentheses
14     result = my_global_method 2, 3
15     assert_equal __, result
16   end
17
18   # (NOTE: We are Using eval below because the example code is
19   # considered to be syntactically invalid).
20   def test_sometimes_missing_parentheses_are_ambiguous
21     eval "assert_equal 5, my_global_method 2, 3" # ENABLE CHECK
22     #
23     # Ruby doesn't know if you mean:
24     #
25     #   assert_equal(5, my_global_method(2), 3)
26     # or
27     #   assert_equal(5, my_global_method(2, 3))
28     #
29     # Rewrite the eval string to continue.
30     #
31   end
32
33   # NOTE: wrong number of argument is not a SYNTAX error, but a
34   # runtime error.
35   def test_calling_global_methods_with_wrong_number_of_arguments
36     exception = assert_raise(___) do
37       my_global_method
38     end
39     assert_match(/__/, exception.message)
40
41     exception = assert_raise(___) do
42       my_global_method(1,2,3)
43     end
44     assert_match(/__/, exception.message)
45   end
46
47   # ------------------------------------------------------------------
48
49   def method_with_defaults(a, b=:default_value)
50     [a, b]
51   end
52
53   def test_calling_with_default_values
54     assert_equal [1, __], method_with_defaults(1)
55     assert_equal [1, __], method_with_defaults(1, 2)
56   end
57
58   # ------------------------------------------------------------------
59
60   def method_with_var_args(*args)
61     args
62   end
63
64   def test_calling_with_variable_arguments
65     assert_equal __, method_with_var_args
66     assert_equal __, method_with_var_args(:one)
67     assert_equal __, method_with_var_args(:one, :two)
68   end
69
70   # ------------------------------------------------------------------
71
72   def method_with_explicit_return
73     :a_non_return_value
74     return :return_value
75     :another_non_return_value
76   end
77
78   def test_method_with_explicit_return
79     assert_equal __, method_with_explicit_return
80   end
81
82   # ------------------------------------------------------------------
83
84   def method_without_explicit_return
85     :a_non_return_value
86     :return_value
87   end
88
89   def test_method_without_explicit_return
90     assert_equal __, method_without_explicit_return
91   end
92
93   # ------------------------------------------------------------------
94
95   def my_same_class_method(a, b)
96     a * b
97   end
98
99   def test_calling_methods_in_same_class
100     assert_equal __, my_same_class_method(3,4)
101   end
102
103   def test_calling_methods_in_same_class_with_explicit_receiver
104     assert_equal __, self.my_same_class_method(3,4)
105   end
106
107   # ------------------------------------------------------------------
108
109   def my_private_method
110     "a secret"
111   end
112   private :my_private_method
113
114   def test_calling_private_methods_without_receiver
115     assert_equal __, my_private_method
116   end
117
118   def test_calling_private_methods_with_an_explicit_receiver
119     exception = assert_raise(___) do
120       self.my_private_method
121     end
122     assert_match /__/, exception.message
123   end
124
125   # ------------------------------------------------------------------
126
127   class Dog
128     def name
129       "Fido"
130     end
131
132     private
133
134     def tail
135       "tail"
136     end
137   end
138
139   def test_calling_methods_in_other_objects_require_explicit_receiver
140     rover = Dog.new
141     assert_equal __, rover.name
142   end
143
144   def test_calling_private_methods_in_other_objects
145     rover = Dog.new
146     assert_raise(___) do
147       rover.tail
148     end
149   end
150 end