b8b67ea12971a8de47db9561b4e6a0e052797c5b
[ruby_koans.git] / src / about_classes.rb
1 require File.expand_path(File.dirname(__FILE__) + '/edgecase')
2
3 class AboutClasses < EdgeCase::Koan
4   class Dog
5   end
6
7   def test_instances_of_classes_can_be_created_with_new
8     fido = Dog.new
9     assert_equal __(Dog), fido.class
10   end
11
12   # ------------------------------------------------------------------
13
14   class Dog2
15     def set_name(a_name)
16       @name = a_name
17     end
18   end
19
20   def test_instance_variables_can_be_set_by_assigning_to_them
21     fido = Dog2.new
22     assert_equal __([]), fido.instance_variables
23
24     fido.set_name("Fido")
25     assert_equal __(["@name"], [:@name]), fido.instance_variables
26   end
27
28   def test_instance_variables_cannot_be_accessed_outside_the_class
29     fido = Dog2.new
30     fido.set_name("Fido")
31
32     assert_raise(___(NoMethodError)) do
33       fido.name
34     end
35
36     assert_raise(___(SyntaxError)) do
37       eval "fido.@name"
38       # NOTE: Using eval because the above line is a syntax error.
39     end
40   end
41
42   def test_you_can_politely_ask_for_instance_variable_values
43     fido = Dog2.new
44     fido.set_name("Fido")
45
46     assert_equal __("Fido"), fido.instance_variable_get("@name")
47   end
48
49   def test_you_can_rip_the_value_out_using_instance_eval
50     fido = Dog2.new
51     fido.set_name("Fido")
52
53     assert_equal __("Fido"), fido.instance_eval("@name")  # string version
54     assert_equal __("Fido"), fido.instance_eval { @name } # block version
55   end
56
57   # ------------------------------------------------------------------
58
59   class Dog3
60     def set_name(a_name)
61       @name = a_name
62     end
63     def name
64       @name
65     end
66   end
67
68   def test_you_can_create_accessor_methods_to_return_instance_variables
69     fido = Dog3.new
70     fido.set_name("Fido")
71
72     assert_equal __("Fido"), fido.name
73   end
74
75   # ------------------------------------------------------------------
76
77   class Dog4
78     attr_reader :name
79
80     def set_name(a_name)
81       @name = a_name
82     end
83   end
84
85
86   def test_attr_reader_will_automatically_define_an_accessor
87     fido = Dog4.new
88     fido.set_name("Fido")
89
90     assert_equal __("Fido"), fido.name
91   end
92
93   # ------------------------------------------------------------------
94
95   class Dog5
96     attr_accessor :name
97   end
98
99
100   def test_attr_accessor_will_automatically_define_both_read_and_write_accessors
101     fido = Dog5.new
102
103     fido.name = "Fido"
104     assert_equal __("Fido"), fido.name
105   end
106
107   # ------------------------------------------------------------------
108
109   class Dog6
110     attr_reader :name
111     def initialize(initial_name)
112       @name = initial_name
113     end
114   end
115
116   def test_initialize_provides_initial_values_for_instance_variables
117     fido = Dog6.new("Fido")
118     assert_equal __("Fido"), fido.name
119   end
120
121   def test_args_to_new_must_match_initialize
122     assert_raise(___(ArgumentError)) do
123       Dog6.new
124     end
125     # THINK ABOUT IT:
126     # Why is this so?
127   end
128
129   def test_different_objects_have_difference_instance_variables
130     fido = Dog6.new("Fido")
131     rover = Dog6.new("Rover")
132
133     assert_equal __(true), rover.name != fido.name
134   end
135
136   # ------------------------------------------------------------------
137
138   class Dog7
139     attr_reader :name
140
141     def initialize(initial_name)
142       @name = initial_name
143     end
144
145     def get_self
146       self
147     end
148
149     def to_s
150       __(@name)
151     end
152
153     def inspect
154       "<Dog named '#{name}'>"
155     end
156   end
157
158   def test_inside_a_method_self_refers_to_the_containing_object
159     fido = Dog7.new("Fido")
160
161     fidos_self = fido.get_self
162     assert_equal __(fido), fidos_self
163   end
164
165   def test_to_s_provides_a_string_version_of_the_object
166     fido = Dog7.new("Fido")
167     assert_equal __("Fido"), fido.to_s
168   end
169
170   def test_to_s_is_used_in_string_interpolation
171     fido = Dog7.new("Fido")
172     assert_equal __("My dog is Fido"), "My dog is #{fido}"
173   end
174
175   def test_inspect_provides_a_more_complete_string_version
176     fido = Dog7.new("Fido")
177     assert_equal __("<Dog named 'Fido'>"), fido.inspect
178   end
179
180   def test_all_objects_support_to_s_and_inspect
181     array = [1,2,3]
182
183     assert_equal __("123", "[1, 2, 3]"), array.to_s
184     assert_equal __("[1, 2, 3]"), array.inspect
185
186     assert_equal __("STRING"), "STRING".to_s
187     assert_equal __('"STRING"'), "STRING".inspect
188   end
189
190 end