rr 0.1.6 → 0.1.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (76) hide show
  1. data/CHANGES +7 -0
  2. data/Rakefile +1 -1
  3. data/examples/environment_fixture_setup.rb +1 -1
  4. data/examples/example_helper.rb +1 -0
  5. data/examples/high_level_example.rb +1 -2
  6. data/examples/rr/do_not_allow_creator_example.rb +1 -2
  7. data/examples/rr/double_bind_example.rb +1 -2
  8. data/examples/rr/double_dispatching_example.rb +2 -3
  9. data/examples/rr/double_example.rb +1 -2
  10. data/examples/rr/double_register_scenario_example.rb +1 -2
  11. data/examples/rr/double_reset_example.rb +1 -2
  12. data/examples/rr/double_verify_example.rb +1 -2
  13. data/examples/rr/errors/rr_error_example.rb +1 -2
  14. data/examples/rr/expectations/any_argument_expectation_example.rb +1 -2
  15. data/examples/rr/expectations/anything_argument_equality_expectation_example.rb +1 -2
  16. data/examples/rr/expectations/argument_equality_expectation_example.rb +1 -2
  17. data/examples/rr/expectations/boolean_argument_equality_expectation_example.rb +1 -2
  18. data/examples/rr/expectations/duck_type_argument_equality_expectation_example.rb +1 -2
  19. data/examples/rr/expectations/is_a_argument_equality_expectation_example.rb +1 -2
  20. data/examples/rr/expectations/numeric_argument_equality_expectation_example.rb +1 -2
  21. data/examples/rr/expectations/range_argument_equality_expectation_example.rb +1 -2
  22. data/examples/rr/expectations/regexp_argument_equality_expectation_example.rb +1 -2
  23. data/examples/rr/expectations/times_called_expectation/times_called_expectation_at_least_example.rb +74 -0
  24. data/examples/rr/expectations/times_called_expectation/times_called_expectation_at_most_example.rb +69 -0
  25. data/examples/rr/expectations/times_called_expectation/times_called_expectation_helper.rb +18 -0
  26. data/examples/rr/expectations/times_called_expectation/times_called_expectation_integer_example.rb +102 -0
  27. data/examples/rr/expectations/times_called_expectation/times_called_expectation_proc_example.rb +80 -0
  28. data/examples/rr/expectations/times_called_expectation/times_called_expectation_range_example.rb +81 -0
  29. data/examples/rr/expectations/times_called_expectation_example.rb +1 -185
  30. data/examples/rr/extensions/double_methods_example.rb +3 -4
  31. data/examples/rr/mock_creator_example.rb +1 -2
  32. data/examples/rr/probe_creator_example.rb +1 -2
  33. data/examples/rr/rspec/rspec_adapter_example.rb +1 -2
  34. data/examples/rr/rspec/rspec_backtrace_tweaking_example.rb +1 -2
  35. data/examples/rr/rspec/rspec_usage_example.rb +1 -2
  36. data/examples/rr/scenario_example.rb +60 -15
  37. data/examples/rr/space_create_example.rb +1 -2
  38. data/examples/rr/space_example.rb +1 -2
  39. data/examples/rr/space_register_example.rb +1 -2
  40. data/examples/rr/space_reset_example.rb +51 -4
  41. data/examples/rr/space_verify_example.rb +4 -5
  42. data/examples/rr/stub_creator_example.rb +1 -2
  43. data/examples/rr/test_unit/test_helper.rb +1 -1
  44. data/examples/rr/times_called_matchers/at_least_matcher_example.rb +74 -0
  45. data/examples/rr/times_called_matchers/at_most_matcher_example.rb +82 -0
  46. data/examples/rr/times_called_matchers/integer_matcher_example.rb +88 -0
  47. data/examples/rr/times_called_matchers/proc_matcher_example.rb +74 -0
  48. data/examples/rr/times_called_matchers/range_matcher_example.rb +94 -0
  49. data/examples/rr/times_called_matchers/times_called_matcher_example.rb +53 -0
  50. data/lib/rr.rb +15 -7
  51. data/lib/rr/adapters/rspec.rb +2 -2
  52. data/lib/rr/adapters/test_unit.rb +1 -1
  53. data/lib/rr/double.rb +2 -2
  54. data/lib/rr/expectations/times_called_expectation.rb +14 -13
  55. data/lib/rr/extensions/double_methods.rb +5 -5
  56. data/lib/rr/scenario.rb +35 -7
  57. data/lib/rr/space.rb +20 -8
  58. data/lib/rr/times_called_matchers/at_least_matcher.rb +22 -0
  59. data/lib/rr/times_called_matchers/at_most_matcher.rb +22 -0
  60. data/lib/rr/times_called_matchers/integer_matcher.rb +17 -0
  61. data/lib/rr/times_called_matchers/proc_matcher.rb +17 -0
  62. data/lib/rr/times_called_matchers/range_matcher.rb +19 -0
  63. data/lib/rr/times_called_matchers/times_called_matcher.rb +44 -0
  64. data/lib/rr/wildcard_matchers/anything.rb +13 -0
  65. data/lib/rr/wildcard_matchers/boolean.rb +18 -0
  66. data/lib/rr/wildcard_matchers/duck_type.rb +24 -0
  67. data/lib/rr/wildcard_matchers/is_a.rb +20 -0
  68. data/lib/rr/wildcard_matchers/numeric.rb +9 -0
  69. data/lib/rr/{expectations/wildcard_matchers → wildcard_matchers}/range.rb +0 -0
  70. data/lib/rr/{expectations/wildcard_matchers → wildcard_matchers}/regexp.rb +0 -0
  71. metadata +27 -9
  72. data/lib/rr/expectations/wildcard_matchers/anything.rb +0 -15
  73. data/lib/rr/expectations/wildcard_matchers/boolean.rb +0 -20
  74. data/lib/rr/expectations/wildcard_matchers/duck_type.rb +0 -26
  75. data/lib/rr/expectations/wildcard_matchers/is_a.rb +0 -22
  76. data/lib/rr/expectations/wildcard_matchers/numeric.rb +0 -11
@@ -0,0 +1,80 @@
1
+ require "examples/example_helper"
2
+
3
+ module RR
4
+ module Expectations
5
+ describe TimesCalledExpectation, " with ProcMatcher", :shared => true do
6
+ it_should_behave_like "RR::Expectations::TimesCalledExpectation"
7
+
8
+ before do
9
+ @expectation = TimesCalledExpectation.new {|value| value == 2}
10
+ @expected_line = __LINE__ - 1
11
+ end
12
+ end
13
+
14
+
15
+ describe TimesCalledExpectation, "#verify" do
16
+ it_should_behave_like "RR::Expectations::TimesCalledExpectation with ProcMatcher"
17
+
18
+ it "matches a block" do
19
+ @expectation.verify.should == false
20
+ @expectation.attempt!
21
+ @expectation.verify.should == false
22
+ @expectation.attempt!
23
+ @expectation.verify.should == true
24
+ @expectation.attempt!
25
+ @expectation.verify.should == false
26
+ end
27
+ end
28
+
29
+ describe TimesCalledExpectation, "#verify! when passed a block (== 2 times)" do
30
+ it_should_behave_like "RR::Expectations::TimesCalledExpectation with ProcMatcher"
31
+
32
+ it "passes after attempt! called 2 times" do
33
+ @expectation.attempt!
34
+ @expectation.attempt!
35
+ @expectation.verify!
36
+ end
37
+
38
+ it "fails after attempt! called 1 time" do
39
+ @expectation.attempt!
40
+ proc {@expectation.verify!}.should raise_error(Errors::TimesCalledError)
41
+ end
42
+
43
+ it "fails after attempt! called 3 times" do
44
+ @expectation.attempt!
45
+ @expectation.attempt!
46
+ @expectation.attempt!
47
+ proc {@expectation.verify!}.should raise_error(Errors::TimesCalledError)
48
+ end
49
+ end
50
+
51
+ describe TimesCalledExpectation, "#attempt? with IntegerMatcher" do
52
+ it_should_behave_like "RR::Expectations::TimesCalledExpectation with ProcMatcher"
53
+
54
+ it "returns true when attempted less than expected times" do
55
+ 1.times {@expectation.attempt!}
56
+ @expectation.should be_attempt
57
+ end
58
+
59
+ it "returns true when attempted expected times" do
60
+ 2.times {@expectation.attempt!}
61
+ @expectation.should be_attempt
62
+ end
63
+
64
+ it "returns true when attempted more than expected times" do
65
+ 3.times {@expectation.attempt!}
66
+ @expectation.should be_attempt
67
+ end
68
+ end
69
+
70
+ describe TimesCalledExpectation, "#attempt! for a proc expectation" do
71
+ it_should_behave_like "RR::Expectations::TimesCalledExpectation with ProcMatcher"
72
+
73
+ it "lets everything pass" do
74
+ @object.foobar
75
+ @object.foobar
76
+ @object.foobar
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,81 @@
1
+ require "examples/example_helper"
2
+
3
+ module RR
4
+ module Expectations
5
+ describe TimesCalledExpectation, " with RangeMatcher", :shared => true do
6
+ it_should_behave_like "RR::Expectations::TimesCalledExpectation"
7
+
8
+ before do
9
+ @expectation = TimesCalledExpectation.new(1..2)
10
+ @expected_line = __LINE__ - 1
11
+ end
12
+ end
13
+
14
+ describe TimesCalledExpectation, "#verify" do
15
+ it_should_behave_like "RR::Expectations::TimesCalledExpectation with RangeMatcher"
16
+
17
+ it "returns true when times called falls within a range" do
18
+ @expectation.verify.should == false
19
+ @expectation.attempt!
20
+ @expectation.verify.should == true
21
+ @expectation.attempt!
22
+ @expectation.verify.should == true
23
+ end
24
+ end
25
+
26
+ describe TimesCalledExpectation, "#verify! when passed a Range (1..2)" do
27
+ it_should_behave_like "RR::Expectations::TimesCalledExpectation with RangeMatcher"
28
+
29
+ it "passes after attempt! called 1 time" do
30
+ @expectation.attempt!
31
+ @expectation.verify!
32
+ end
33
+
34
+ it "passes after attempt! called 2 times" do
35
+ @expectation.attempt!
36
+ @expectation.attempt!
37
+ @expectation.verify!
38
+ end
39
+
40
+ it "can't be called when attempt! is called 3 times" do
41
+ @expectation.attempt!
42
+ @expectation.attempt!
43
+ proc do
44
+ @expectation.attempt!
45
+ end.should raise_error(Errors::TimesCalledError, "Called 3 times. Expected 1..2 times.")
46
+ end
47
+ end
48
+
49
+ describe TimesCalledExpectation, "#attempt? with RangeMatcher" do
50
+ it_should_behave_like "RR::Expectations::TimesCalledExpectation with RangeMatcher"
51
+
52
+ it "returns true when attempted less than low end of range" do
53
+ @expectation.should be_attempt
54
+ end
55
+
56
+ it "returns false when attempted in range" do
57
+ @expectation.attempt!
58
+ @expectation.should be_attempt
59
+ @expectation.attempt!
60
+ @expectation.should be_attempt
61
+ end
62
+
63
+ it "raises error before attempted more than expected times" do
64
+ 2.times {@expectation.attempt!}
65
+ proc {@expectation.attempt!}.should raise_error(
66
+ Errors::TimesCalledError
67
+ )
68
+ end
69
+ end
70
+
71
+ describe TimesCalledExpectation, "#attempt! for a range expectation" do
72
+ it_should_behave_like "RR::Expectations::TimesCalledExpectation with RangeMatcher"
73
+
74
+ it "raises error when attempt! called more than range permits" do
75
+ @expectation.attempt!
76
+ @expectation.attempt!
77
+ raises_expectation_error {@expectation.attempt!}
78
+ end
79
+ end
80
+ end
81
+ end
@@ -1,23 +1,7 @@
1
- dir = File.dirname(__FILE__)
2
- require "#{dir}/../../example_helper"
1
+ require "examples/example_helper"
3
2
 
4
3
  module RR
5
4
  module Expectations
6
- describe TimesCalledExpectation, :shared => true do
7
- before do
8
- @space = Space.new
9
- @object = Object.new
10
- @method_name = :foobar
11
- @double = @space.create_double(@object, @method_name)
12
- @scenario = @space.create_scenario(@double)
13
- @scenario.with_any_args
14
- end
15
-
16
- def raises_expectation_error(&block)
17
- proc {block.call}.should raise_error(Errors::TimesCalledError)
18
- end
19
- end
20
-
21
5
  describe TimesCalledExpectation, ".new" do
22
6
  it "doesn't accept both an argument and a block" do
23
7
  proc do
@@ -25,173 +9,5 @@ describe TimesCalledExpectation, ".new" do
25
9
  end.should raise_error(ArgumentError, "Cannot pass in both an argument and a block")
26
10
  end
27
11
  end
28
-
29
- describe TimesCalledExpectation, "#verify" do
30
- it_should_behave_like "RR::Expectations::TimesCalledExpectation"
31
-
32
- it "returns true when times called exactly matches an integer" do
33
- @expectation = TimesCalledExpectation.new(2)
34
- @expectation.verify.should == false
35
- @expectation.verify_input
36
- @expectation.verify.should == false
37
- @expectation.verify_input
38
- @expectation.verify.should == true
39
- end
40
-
41
- it "returns true when times called falls within a range" do
42
- @expectation = TimesCalledExpectation.new(1..2)
43
-
44
- @expectation.verify.should == false
45
- @expectation.verify_input
46
- @expectation.verify.should == true
47
- @expectation.verify_input
48
- @expectation.verify.should == true
49
- end
50
-
51
- it "matches a block" do
52
- @expectation = TimesCalledExpectation.new {|value| value == 2}
53
-
54
- @expectation.verify.should == false
55
- @expectation.verify_input
56
- @expectation.verify.should == false
57
- @expectation.verify_input
58
- @expectation.verify.should == true
59
- @expectation.verify_input
60
- @expectation.verify.should == false
61
- end
62
- end
63
-
64
- describe TimesCalledExpectation, "#verify! when passed an Integer (2)" do
65
- it_should_behave_like "RR::Expectations::TimesCalledExpectation"
66
-
67
- before do
68
- @expectation = TimesCalledExpectation.new(2)
69
- @expected_line = __LINE__ - 1
70
- end
71
-
72
- it "passes after verify_input called 2 times" do
73
- @expectation.verify_input
74
- @expectation.verify_input
75
- @expectation.verify!
76
- end
77
-
78
- it "fails after verify_input called 1 time" do
79
- @expectation.verify_input
80
- proc {@expectation.verify!}.should raise_error(
81
- Errors::TimesCalledError,
82
- "Called 1 time. Expected 2."
83
- )
84
- end
85
-
86
- it "can't be called when verify_input is called 3 times" do
87
- @expectation.verify_input
88
- @expectation.verify_input
89
- proc do
90
- @expectation.verify_input
91
- end.should raise_error(Errors::TimesCalledError, "Called 3 times. Expected 2.")
92
- end
93
-
94
- it "has a backtrace to where the TimesCalledExpectation was instantiated on failure" do
95
- error = nil
96
- begin
97
- @expectation.verify!
98
- rescue Errors::TimesCalledError => e
99
- error = e
100
- end
101
- e.backtrace.first.should include(__FILE__)
102
- e.backtrace.first.should include(":#{@expected_line}")
103
- end
104
-
105
- it "has an error message that includes the number of times called and expected number of times" do
106
- proc do
107
- @expectation.verify!
108
- end.should raise_error(Errors::TimesCalledError, "Called 0 times. Expected 2.")
109
- end
110
- end
111
-
112
- describe TimesCalledExpectation, "#verify! when passed a Range (1..2)" do
113
- it_should_behave_like "RR::Expectations::TimesCalledExpectation"
114
-
115
- before do
116
- @expectation = TimesCalledExpectation.new(1..2)
117
- end
118
-
119
- it "passes after verify_input called 1 time" do
120
- @expectation.verify_input
121
- @expectation.verify!
122
- end
123
-
124
- it "passes after verify_input called 2 times" do
125
- @expectation.verify_input
126
- @expectation.verify_input
127
- @expectation.verify!
128
- end
129
-
130
- it "can't be called when verify_input is called 3 times" do
131
- @expectation.verify_input
132
- @expectation.verify_input
133
- proc do
134
- @expectation.verify_input
135
- end.should raise_error(Errors::TimesCalledError, "Called 3 times. Expected 1..2.")
136
- end
137
- end
138
-
139
- describe TimesCalledExpectation, "#verify! when passed a block (== 2 times)" do
140
- it_should_behave_like "RR::Expectations::TimesCalledExpectation"
141
-
142
- before do
143
- @expectation = TimesCalledExpectation.new {|value| value == 2}
144
- end
145
-
146
- it "passes after verify_input called 2 times" do
147
- @expectation.verify_input
148
- @expectation.verify_input
149
- @expectation.verify!
150
- end
151
-
152
- it "fails after verify_input called 1 time" do
153
- @expectation.verify_input
154
- proc {@expectation.verify!}.should raise_error(Errors::TimesCalledError)
155
- end
156
-
157
- it "fails after verify_input called 3 times" do
158
- @expectation.verify_input
159
- @expectation.verify_input
160
- @expectation.verify_input
161
- proc {@expectation.verify!}.should raise_error(Errors::TimesCalledError)
162
- end
163
- end
164
-
165
- describe TimesCalledExpectation, "#verify_input for an integer expectation" do
166
- it_should_behave_like "RR::Expectations::TimesCalledExpectation"
167
-
168
- it "raises error when verify_input called more than the expected number of times" do
169
- @expectation = TimesCalledExpectation.new(1)
170
- @expectation.verify_input
171
- raises_expectation_error {@expectation.verify_input}
172
- end
173
- end
174
-
175
- describe TimesCalledExpectation, "#verify_input for a range expectation" do
176
- it_should_behave_like "RR::Expectations::TimesCalledExpectation"
177
-
178
- it "raises error when verify_input called more than range permits" do
179
- @expectation = TimesCalledExpectation.new(1..2)
180
- @expectation.verify_input
181
- @expectation.verify_input
182
- raises_expectation_error {@expectation.verify_input}
183
- end
184
- end
185
-
186
- describe TimesCalledExpectation, "#verify_input for a proc expectation" do
187
- it_should_behave_like "RR::Expectations::TimesCalledExpectation"
188
-
189
- it "lets everything pass" do
190
- @expectation = TimesCalledExpectation.new {|times| times == 1}
191
- @object.foobar
192
- @object.foobar
193
- @object.foobar
194
- end
195
- end
196
12
  end
197
13
  end
@@ -1,5 +1,4 @@
1
- dir = File.dirname(__FILE__)
2
- require "#{dir}/../../example_helper"
1
+ require "examples/example_helper"
3
2
 
4
3
  module RR
5
4
  module Extensions
@@ -25,7 +24,7 @@ module Extensions
25
24
  end
26
25
 
27
26
  scenario = creator.foobar(1, 2) {:baz}
28
- scenario.times_called_expectation.times.should == 1
27
+ scenario.times_called_expectation.matcher.should == TimesCalledMatchers::IntegerMatcher.new(1)
29
28
  scenario.argument_expectation.class.should == RR::Expectations::ArgumentEqualityError
30
29
  scenario.argument_expectation.expected_arguments.should == [1, 2]
31
30
 
@@ -121,7 +120,7 @@ module Extensions
121
120
  end
122
121
 
123
122
  scenario = creator.foobar(1, 2)
124
- scenario.times_called_expectation.times.should == 0
123
+ scenario.times_called_expectation.matcher.should == TimesCalledMatchers::IntegerMatcher.new(0)
125
124
  scenario.argument_expectation.class.should == RR::Expectations::ArgumentEqualityError
126
125
  scenario.argument_expectation.expected_arguments.should == [1, 2]
127
126
  end
@@ -1,5 +1,4 @@
1
- dir = File.dirname(__FILE__)
2
- require "#{dir}/../example_helper"
1
+ require "examples/example_helper"
3
2
 
4
3
  module RR
5
4
  describe MockCreator, :shared => true do
@@ -1,5 +1,4 @@
1
- dir = File.dirname(__FILE__)
2
- require "#{dir}/../example_helper"
1
+ require "examples/example_helper"
3
2
 
4
3
  module RR
5
4
  describe ProbeCreator, :shared => true do
@@ -1,5 +1,4 @@
1
- dir = File.dirname(__FILE__)
2
- require "#{dir}/../../example_helper"
1
+ require "examples/example_helper"
3
2
 
4
3
  module RR
5
4
  module Adapters
@@ -1,5 +1,4 @@
1
- dir = File.dirname(__FILE__)
2
- require "#{dir}/../../example_helper"
1
+ require "examples/example_helper"
3
2
 
4
3
  describe RR, " backtrace tweaking" do
5
4
  it "hides rr library from the backtrace by default" do
@@ -1,5 +1,4 @@
1
- dir = File.dirname(__FILE__)
2
- require "#{dir}/../../example_helper"
1
+ require "examples/example_helper"
3
2
 
4
3
  describe RR, "#mock" do
5
4
  before do
@@ -1,5 +1,4 @@
1
- dir = File.dirname(__FILE__)
2
- require "#{dir}/../example_helper"
1
+ require "examples/example_helper"
3
2
 
4
3
  module RR
5
4
  describe Scenario, :shared => true do
@@ -117,6 +116,53 @@ describe Scenario, "#twice" do
117
116
  end
118
117
  end
119
118
 
119
+ describe Scenario, "#at_least" do
120
+ it_should_behave_like "RR::Scenario"
121
+
122
+ it "returns self" do
123
+ @scenario.with_any_args.at_least(2).should === @scenario
124
+ end
125
+
126
+ it "sets up a Times Called Expectation with 1" do
127
+ @scenario.at_least(2)
128
+ @scenario.should be_attempt
129
+ @scenario.call
130
+ @scenario.should be_attempt
131
+ @scenario.call
132
+ @scenario.should_not be_attempt
133
+ end
134
+
135
+ it "sets return value when block passed in" do
136
+ @scenario.with_any_args.at_least(2) {:return_value}
137
+ @object.foobar.should == :return_value
138
+ end
139
+ end
140
+
141
+ describe Scenario, "#at_most" do
142
+ it_should_behave_like "RR::Scenario"
143
+
144
+ it "returns self" do
145
+ @scenario.with_any_args.at_most(2).should === @scenario
146
+ end
147
+
148
+ it "sets up a Times Called Expectation with 1" do
149
+ @scenario.at_most(2)
150
+ @scenario.call
151
+ @scenario.call
152
+ proc do
153
+ @scenario.call
154
+ end.should raise_error(
155
+ Errors::TimesCalledError,
156
+ "Called 3 times. Expected at most 2 times."
157
+ )
158
+ end
159
+
160
+ it "sets return value when block passed in" do
161
+ @scenario.with_any_args.at_most(2) {:return_value}
162
+ @object.foobar.should == :return_value
163
+ end
164
+ end
165
+
120
166
  describe Scenario, "#times" do
121
167
  it_should_behave_like "RR::Scenario"
122
168
 
@@ -434,29 +480,28 @@ describe Scenario, "#wildcard_match?" do
434
480
  end
435
481
  end
436
482
 
437
- describe Scenario, "#times_called_verified?" do
483
+ describe Scenario, "#attempt?" do
438
484
  it_should_behave_like "RR::Scenario"
439
485
 
440
- it "returns false when times called does not match expectation" do
486
+ it "returns true when TimesCalledExpectation#attempt? is true" do
441
487
  @scenario.with(1, 2, 3).twice
442
- @object.foobar(1, 2, 3)
443
- @scenario.should_not be_times_called_verified
488
+ @scenario.call(1, 2, 3)
489
+ @scenario.times_called_expectation.should be_attempt
490
+ @scenario.should be_attempt
444
491
  end
445
492
 
446
- it "returns true when times called matches expectation" do
493
+ it "returns false when TimesCalledExpectation#attempt? is true" do
447
494
  @scenario.with(1, 2, 3).twice
448
- @object.foobar(1, 2, 3)
449
- @object.foobar(1, 2, 3)
450
- @scenario.should be_times_called_verified
495
+ @scenario.call(1, 2, 3)
496
+ @scenario.call(1, 2, 3)
497
+ @scenario.times_called_expectation.should_not be_attempt
498
+ @scenario.should_not be_attempt
451
499
  end
452
500
 
453
- it "returns false when there is no Times Called expectation" do
501
+ it "returns true when there is no Times Called expectation" do
454
502
  @scenario.with(1, 2, 3)
455
503
  @scenario.times_called_expectation.should be_nil
456
-
457
- @scenario.should_not be_times_called_verified
458
- @object.foobar(1, 2, 3)
459
- @scenario.should_not be_times_called_verified
504
+ @scenario.should be_attempt
460
505
  end
461
506
  end
462
507