rspec-mocks 2.13.1 → 2.14.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (99) hide show
  1. data/Changelog.md +45 -4
  2. data/README.md +1 -1
  3. data/features/argument_matchers/README.md +2 -2
  4. data/features/argument_matchers/explicit.feature +2 -3
  5. data/features/argument_matchers/general_matchers.feature +2 -2
  6. data/features/argument_matchers/type_matchers.feature +3 -4
  7. data/features/message_expectations/README.md +2 -2
  8. data/features/message_expectations/any_instance.feature +2 -2
  9. data/features/message_expectations/block_local_expectations.feature.pending +3 -3
  10. data/features/message_expectations/expect_message_using_expect.feature +103 -0
  11. data/features/message_expectations/expect_message_using_should_receive.feature +118 -0
  12. data/features/message_expectations/receive_counts.feature +1 -1
  13. data/features/method_stubs/README.md +1 -1
  14. data/features/method_stubs/any_instance.feature +11 -11
  15. data/features/method_stubs/as_null_object.feature +1 -1
  16. data/features/method_stubs/stub_implementation.feature +2 -2
  17. data/features/outside_rspec/configuration.feature +0 -20
  18. data/features/spies/spy_partial_mock_method.feature +34 -0
  19. data/features/spies/spy_pure_mock_method.feature +76 -0
  20. data/features/spies/spy_unstubbed_method.feature +18 -0
  21. data/features/step_definitions/additional_cli_steps.rb +7 -0
  22. data/features/test_frameworks/test_unit.feature +43 -0
  23. data/lib/rspec/mocks.rb +9 -34
  24. data/lib/rspec/mocks/any_instance/chain.rb +8 -2
  25. data/lib/rspec/mocks/any_instance/expectation_chain.rb +19 -16
  26. data/lib/rspec/mocks/any_instance/recorder.rb +6 -3
  27. data/lib/rspec/mocks/any_instance/stub_chain.rb +11 -11
  28. data/lib/rspec/mocks/any_instance/stub_chain_chain.rb +8 -10
  29. data/lib/rspec/mocks/argument_list_matcher.rb +7 -3
  30. data/lib/rspec/mocks/configuration.rb +28 -1
  31. data/lib/rspec/mocks/deprecation.rb +18 -0
  32. data/lib/rspec/mocks/error_generator.rb +60 -8
  33. data/lib/rspec/mocks/errors.rb +1 -1
  34. data/lib/rspec/mocks/example_methods.rb +39 -3
  35. data/lib/rspec/mocks/extensions/marshal.rb +4 -10
  36. data/lib/rspec/mocks/framework.rb +16 -4
  37. data/lib/rspec/mocks/instance_method_stasher.rb +3 -0
  38. data/lib/rspec/mocks/matchers/have_received.rb +93 -0
  39. data/lib/rspec/mocks/matchers/receive.rb +92 -0
  40. data/lib/rspec/mocks/message_expectation.rb +66 -129
  41. data/lib/rspec/mocks/method_double.rb +50 -43
  42. data/lib/rspec/mocks/mutate_const.rb +8 -20
  43. data/lib/rspec/mocks/proxy.rb +41 -25
  44. data/lib/rspec/mocks/proxy_for_nil.rb +36 -0
  45. data/lib/rspec/mocks/space.rb +64 -11
  46. data/lib/rspec/mocks/stub_chain.rb +51 -0
  47. data/lib/rspec/mocks/syntax.rb +329 -0
  48. data/lib/rspec/mocks/targets.rb +69 -0
  49. data/lib/rspec/mocks/test_double.rb +25 -4
  50. data/lib/rspec/mocks/version.rb +1 -1
  51. data/lib/spec/mocks.rb +1 -3
  52. data/spec/rspec/mocks/and_call_original_spec.rb +8 -0
  53. data/spec/rspec/mocks/and_yield_spec.rb +6 -6
  54. data/spec/rspec/mocks/any_instance_spec.rb +43 -31
  55. data/spec/rspec/mocks/any_number_of_times_spec.rb +6 -0
  56. data/spec/rspec/mocks/argument_expectation_spec.rb +12 -14
  57. data/spec/rspec/mocks/at_least_spec.rb +46 -37
  58. data/spec/rspec/mocks/at_most_spec.rb +12 -12
  59. data/spec/rspec/mocks/block_return_value_spec.rb +18 -1
  60. data/spec/rspec/mocks/bug_report_10260_spec.rb +1 -1
  61. data/spec/rspec/mocks/bug_report_10263_spec.rb +1 -1
  62. data/spec/rspec/mocks/bug_report_11545_spec.rb +4 -4
  63. data/spec/rspec/mocks/bug_report_600_spec.rb +1 -1
  64. data/spec/rspec/mocks/bug_report_7611_spec.rb +1 -1
  65. data/spec/rspec/mocks/configuration_spec.rb +124 -0
  66. data/spec/rspec/mocks/double_spec.rb +13 -1
  67. data/spec/rspec/mocks/failing_argument_matchers_spec.rb +17 -1
  68. data/spec/rspec/mocks/hash_excluding_matcher_spec.rb +13 -13
  69. data/spec/rspec/mocks/matchers/have_received_spec.rb +266 -0
  70. data/spec/rspec/mocks/matchers/receive_spec.rb +318 -0
  71. data/spec/rspec/mocks/methods_spec.rb +27 -0
  72. data/spec/rspec/mocks/mock_ordering_spec.rb +4 -4
  73. data/spec/rspec/mocks/mock_space_spec.rb +94 -39
  74. data/spec/rspec/mocks/mock_spec.rb +65 -50
  75. data/spec/rspec/mocks/multiple_return_value_spec.rb +10 -10
  76. data/spec/rspec/mocks/mutate_const_spec.rb +21 -1
  77. data/spec/rspec/mocks/nil_expectation_warning_spec.rb +10 -4
  78. data/spec/rspec/mocks/null_object_mock_spec.rb +11 -2
  79. data/spec/rspec/mocks/once_counts_spec.rb +5 -5
  80. data/spec/rspec/mocks/options_hash_spec.rb +4 -4
  81. data/spec/rspec/mocks/partial_mock_spec.rb +20 -11
  82. data/spec/rspec/mocks/partial_mock_using_mocks_directly_spec.rb +7 -7
  83. data/spec/rspec/mocks/passing_argument_matchers_spec.rb +2 -2
  84. data/spec/rspec/mocks/precise_counts_spec.rb +6 -6
  85. data/spec/rspec/mocks/serialization_spec.rb +1 -22
  86. data/spec/rspec/mocks/stash_spec.rb +4 -12
  87. data/spec/rspec/mocks/stub_implementation_spec.rb +3 -3
  88. data/spec/rspec/mocks/stub_spec.rb +44 -20
  89. data/spec/rspec/mocks/stubbed_message_expectations_spec.rb +6 -6
  90. data/spec/rspec/mocks/twice_counts_spec.rb +6 -6
  91. data/spec/rspec/mocks_spec.rb +1 -3
  92. data/spec/spec_helper.rb +25 -1
  93. metadata +86 -81
  94. data/features/message_expectations/expect_message.feature +0 -94
  95. data/lib/rspec/mocks/any_instance.rb +0 -81
  96. data/lib/rspec/mocks/extensions/psych.rb +0 -23
  97. data/lib/rspec/mocks/methods.rb +0 -155
  98. data/lib/rspec/mocks/serialization.rb +0 -34
  99. data/spec/rspec/mocks/combining_implementation_instructions_spec.rb +0 -197
@@ -8,8 +8,8 @@ module RSpec
8
8
  it "fails if method is never called" do
9
9
  @double.should_receive(:do_something).at_least(4).times
10
10
  expect {
11
- @double.rspec_verify
12
- }.to raise_error(RSpec::Mocks::MockExpectationError)
11
+ verify @double
12
+ }.to raise_error(/expected: at least 4 times.*received: 0 times/m)
13
13
  end
14
14
 
15
15
  it "fails when called less than n times" do
@@ -18,30 +18,30 @@ module RSpec
18
18
  @double.do_something
19
19
  @double.do_something
20
20
  expect {
21
- @double.rspec_verify
22
- }.to raise_error(RSpec::Mocks::MockExpectationError)
21
+ verify @double
22
+ }.to raise_error(/expected: at least 4 times.*received: 3 times/m)
23
23
  end
24
24
 
25
25
  it "fails when at least once method is never called" do
26
26
  @double.should_receive(:do_something).at_least(:once)
27
27
  expect {
28
- @double.rspec_verify
29
- }.to raise_error(RSpec::Mocks::MockExpectationError)
28
+ verify @double
29
+ }.to raise_error(/expected: at least 1 time.*received: 0 times/m)
30
30
  end
31
31
 
32
32
  it "fails when at least twice method is called once" do
33
33
  @double.should_receive(:do_something).at_least(:twice)
34
34
  @double.do_something
35
35
  expect {
36
- @double.rspec_verify
37
- }.to raise_error(RSpec::Mocks::MockExpectationError)
36
+ verify @double
37
+ }.to raise_error(/expected: at least 2 times.*received: 1 time/m)
38
38
  end
39
39
 
40
40
  it "fails when at least twice method is never called" do
41
41
  @double.should_receive(:do_something).at_least(:twice)
42
42
  expect {
43
- @double.rspec_verify
44
- }.to raise_error(RSpec::Mocks::MockExpectationError)
43
+ verify @double
44
+ }.to raise_error(/expected: at least 2 times.*received: 0 times/m)
45
45
  end
46
46
 
47
47
  it "passes when at least n times method is called exactly n times" do
@@ -50,7 +50,7 @@ module RSpec
50
50
  @double.do_something
51
51
  @double.do_something
52
52
  @double.do_something
53
- @double.rspec_verify
53
+ verify @double
54
54
  end
55
55
 
56
56
  it "passes when at least n times method is called n plus 1 times" do
@@ -60,20 +60,20 @@ module RSpec
60
60
  @double.do_something
61
61
  @double.do_something
62
62
  @double.do_something
63
- @double.rspec_verify
63
+ verify @double
64
64
  end
65
65
 
66
66
  it "passes when at least once method is called once" do
67
67
  @double.should_receive(:do_something).at_least(:once)
68
68
  @double.do_something
69
- @double.rspec_verify
69
+ verify @double
70
70
  end
71
71
 
72
72
  it "passes when at least once method is called twice" do
73
73
  @double.should_receive(:do_something).at_least(:once)
74
74
  @double.do_something
75
75
  @double.do_something
76
- @double.rspec_verify
76
+ verify @double
77
77
  end
78
78
 
79
79
  it "passes when at least twice method is called three times" do
@@ -81,47 +81,56 @@ module RSpec
81
81
  @double.do_something
82
82
  @double.do_something
83
83
  @double.do_something
84
- @double.rspec_verify
84
+ verify @double
85
85
  end
86
86
 
87
87
  it "passes when at least twice method is called twice" do
88
88
  @double.should_receive(:do_something).at_least(:twice)
89
89
  @double.do_something
90
90
  @double.do_something
91
- @double.rspec_verify
91
+ verify @double
92
92
  end
93
93
 
94
94
  it "returns the value given by a block when the at least once method is called" do
95
95
  @double.should_receive(:to_s).at_least(:once) { "testing" }
96
96
  expect(@double.to_s).to eq "testing"
97
- @double.rspec_verify
97
+ verify @double
98
98
  end
99
99
 
100
- it "passes with at_least(0) with no return if called once" do
101
- @double.should_receive(:do_something).at_least(0).times
102
- @double.do_something
103
- end
100
+ context "when sent with 0" do
101
+ before { RSpec.stub(:deprecate) }
104
102
 
105
- it "passes with at_least(0) with return block if called once" do
106
- @double.should_receive(:do_something).at_least(0).times { true }
107
- @double.do_something
108
- end
103
+ it "outputs a deprecation warning" do
104
+ expect(RSpec).to receive(:deprecate).with("at_least\(0\) with should_receive", :replacement => "stub")
105
+ expect(@double).to receive(:do_something).at_least(0).times
106
+ end
109
107
 
110
- it "passes with at_least(0) with and_return if called once" do
111
- @double.should_receive(:do_something).at_least(0).times.and_return true
112
- @double.do_something
113
- end
108
+ it "passes with no return if called once" do
109
+ @double.should_receive(:do_something).at_least(0).times
110
+ @double.do_something
111
+ end
114
112
 
115
- it "passes with at_least(0) with no return if never called" do
116
- @double.should_receive(:do_something).at_least(0).times
117
- end
113
+ it "passes with return block if called once" do
114
+ @double.should_receive(:do_something).at_least(0).times { true }
115
+ @double.do_something
116
+ end
118
117
 
119
- it "passes with at_least(0) with return block if never called" do
120
- @double.should_receive(:do_something).at_least(0).times { true }
121
- end
118
+ it "passes with and_return if called once" do
119
+ @double.should_receive(:do_something).at_least(0).times.and_return true
120
+ @double.do_something
121
+ end
122
+
123
+ it "passes with no return if never called" do
124
+ @double.should_receive(:do_something).at_least(0).times
125
+ end
126
+
127
+ it "passes with return block if never called" do
128
+ @double.should_receive(:do_something).at_least(0).times { true }
129
+ end
122
130
 
123
- it "passes with at_least(0) with and_return if never called" do
124
- @double.should_receive(:do_something).at_least(0).times.and_return true
131
+ it "passes with and_return if never called" do
132
+ @double.should_receive(:do_something).at_least(0).times.and_return true
133
+ end
125
134
  end
126
135
 
127
136
  it "uses a stub value if no value set" do
@@ -11,53 +11,53 @@ module RSpec
11
11
  @double.should_receive(:do_something).at_most(2).times
12
12
  @double.do_something
13
13
  @double.do_something
14
- @double.rspec_verify
14
+ verify @double
15
15
  end
16
16
 
17
17
  it "passes when at_most(n) is called less than n times" do
18
18
  @double.should_receive(:do_something).at_most(2).times
19
19
  @double.do_something
20
- @double.rspec_verify
20
+ verify @double
21
21
  end
22
22
 
23
23
  it "passes when at_most(n) is never called" do
24
24
  @double.should_receive(:do_something).at_most(2).times
25
- @double.rspec_verify
25
+ verify @double
26
26
  end
27
27
 
28
28
  it "passes when at_most(:once) is called once" do
29
29
  @double.should_receive(:do_something).at_most(:once)
30
30
  @double.do_something
31
- @double.rspec_verify
31
+ verify @double
32
32
  end
33
33
 
34
34
  it "passes when at_most(:once) is never called" do
35
35
  @double.should_receive(:do_something).at_most(:once)
36
- @double.rspec_verify
36
+ verify @double
37
37
  end
38
38
 
39
39
  it "passes when at_most(:twice) is called once" do
40
40
  @double.should_receive(:do_something).at_most(:twice)
41
41
  @double.do_something
42
- @double.rspec_verify
42
+ verify @double
43
43
  end
44
44
 
45
45
  it "passes when at_most(:twice) is called twice" do
46
46
  @double.should_receive(:do_something).at_most(:twice)
47
47
  @double.do_something
48
48
  @double.do_something
49
- @double.rspec_verify
49
+ verify @double
50
50
  end
51
51
 
52
52
  it "passes when at_most(:twice) is never called" do
53
53
  @double.should_receive(:do_something).at_most(:twice)
54
- @double.rspec_verify
54
+ verify @double
55
55
  end
56
56
 
57
57
  it "returns the value given by a block when at_most(:once) method is called" do
58
58
  @double.should_receive(:to_s).at_most(:once) { "testing" }
59
59
  expect(@double.to_s).to eq "testing"
60
- @double.rspec_verify
60
+ verify @double
61
61
  end
62
62
 
63
63
  it "fails fast when at_most(n) times method is called n plus 1 times" do
@@ -66,7 +66,7 @@ module RSpec
66
66
  @double.do_something
67
67
  expect {
68
68
  @double.do_something
69
- }.to raise_error(RSpec::Mocks::MockExpectationError)
69
+ }.to raise_error(/expected: at most 2 times.*received: 3 times/m)
70
70
  end
71
71
 
72
72
  it "fails fast when at_most(:once) and is called twice" do
@@ -74,7 +74,7 @@ module RSpec
74
74
  @double.do_something
75
75
  expect {
76
76
  @double.do_something
77
- }.to raise_error(RSpec::Mocks::MockExpectationError)
77
+ }.to raise_error(/expected: at most 1 time.*received: 2 times/m)
78
78
  end
79
79
 
80
80
  it "fails fast when at_most(:twice) and is called three times" do
@@ -83,7 +83,7 @@ module RSpec
83
83
  @double.do_something
84
84
  expect {
85
85
  @double.do_something
86
- }.to raise_error(RSpec::Mocks::MockExpectationError)
86
+ }.to raise_error(/expected: at most 2 times.*received: 3 times/m)
87
87
  end
88
88
  end
89
89
  end
@@ -33,7 +33,7 @@ describe "a double declaration with a block handed to:" do
33
33
  end
34
34
  end
35
35
 
36
- %w[once twice any_number_of_times ordered and_return].each do |method|
36
+ %w[once twice ordered and_return].each do |method|
37
37
  describe method do
38
38
  it "returns the value of executing the block" do
39
39
  obj = Object.new
@@ -43,6 +43,23 @@ describe "a double declaration with a block handed to:" do
43
43
  end
44
44
  end
45
45
 
46
+ describe 'any_number_of_times' do
47
+ before do
48
+ RSpec.stub(:deprecate)
49
+ end
50
+
51
+ it "warns about deprecation" do
52
+ expect(RSpec).to receive(:deprecate).with("any_number_of_times", :replacement => "stub")
53
+ Object.new.stub(:foo).any_number_of_times { 'bar' }
54
+ end
55
+
56
+ it "returns the value of executing the block" do
57
+ obj = Object.new
58
+ obj.stub(:foo).any_number_of_times { 'bar' }
59
+ expect(obj.foo).to eq('bar')
60
+ end
61
+ end
62
+
46
63
  describe "times" do
47
64
  it "returns the value of executing the block" do
48
65
  obj = Object.new
@@ -3,6 +3,6 @@ require 'spec_helper'
3
3
  describe "An RSpec Mock" do
4
4
  it "hides internals in its inspect representation" do
5
5
  m = double('cup')
6
- expect(m.inspect).to match /#<RSpec::Mocks::Mock:0x[a-f0-9.]+ @name="cup">/
6
+ expect(m.inspect).to match(/#<RSpec::Mocks::Mock:0x[a-f0-9.]+ @name="cup">/)
7
7
  end
8
8
  end
@@ -16,7 +16,7 @@ describe "Double" do
16
16
  specify "then the next example should behave as expected instead of saying" do
17
17
  test_double.should_receive(:foobar)
18
18
  test_double.foobar
19
- test_double.rspec_verify
19
+ verify test_double
20
20
  begin
21
21
  test_double.foobar
22
22
  rescue Exception => e
@@ -4,17 +4,17 @@ class LiarLiarPantsOnFire
4
4
  def respond_to?(message, incl_private=false)
5
5
  true
6
6
  end
7
-
7
+
8
8
  def self.respond_to?(message, incl_private=false)
9
9
  true
10
10
  end
11
11
  end
12
-
12
+
13
13
  describe 'should_receive' do
14
14
  before(:each) do
15
15
  @liar = LiarLiarPantsOnFire.new
16
16
  end
17
-
17
+
18
18
  it "works when object lies about responding to a method" do
19
19
  @liar.should_receive(:something)
20
20
  @liar.something
@@ -24,7 +24,7 @@ describe 'should_receive' do
24
24
  LiarLiarPantsOnFire.should_receive(:something)
25
25
  LiarLiarPantsOnFire.something
26
26
  end
27
-
27
+
28
28
  it 'cleans up after itself' do
29
29
  expect((class << LiarLiarPantsOnFire; self; end).instance_methods).not_to include("something")
30
30
  end
@@ -9,7 +9,7 @@ module BugReport600
9
9
  end
10
10
  end
11
11
  end
12
-
12
+
13
13
  it "works" do
14
14
  ExampleClass.should_receive(:define_method).with("defined_method")
15
15
  ExampleClass.method_that_uses_define_method
@@ -11,6 +11,6 @@ module Bug7611
11
11
 
12
12
  it "should" do
13
13
  expect(Bar.new.class).to eq Bar
14
- end
14
+ end
15
15
  end
16
16
  end
@@ -20,6 +20,130 @@ module RSpec
20
20
  expect(instance_methods_of(mod_1)).to include(:stub, :should_receive)
21
21
  expect(instance_methods_of(mod_2)).to include(:stub, :should_receive)
22
22
  end
23
+
24
+ shared_examples_for "configuring the syntax" do
25
+ def sandboxed
26
+ orig_syntax = RSpec::Mocks.configuration.syntax
27
+ yield
28
+ ensure
29
+ configure_syntax(orig_syntax)
30
+ end
31
+
32
+ around(:each) { |ex| sandboxed(&ex) }
33
+ let(:dbl) { double }
34
+ let(:should_methods) { [:should_receive, :stub, :should_not_receive] }
35
+ let(:should_class_methods) { [:any_instance] }
36
+ let(:expect_methods) { [:receive, :allow, :expect_any_instance_of, :allow_any_instance_of] }
37
+
38
+ it 'defaults to enabling both the :should and :expect syntaxes' do
39
+ expect(dbl).to respond_to(*should_methods)
40
+ expect(self).to respond_to(*expect_methods)
41
+ end
42
+
43
+ context 'when configured to :expect' do
44
+ before { configure_syntax :expect }
45
+
46
+ it 'removes the should methods from every object' do
47
+ expect(dbl).not_to respond_to(*should_methods)
48
+ end
49
+
50
+ it 'removes `any_instance` from every class' do
51
+ expect(Class.new).not_to respond_to(*should_class_methods)
52
+ end
53
+
54
+ it 'adds the expect methods to the example group context' do
55
+ expect(self).to respond_to(*expect_methods)
56
+ end
57
+
58
+ it 'reports that the syntax is :expect' do
59
+ expect(configured_syntax).to eq([:expect])
60
+ end
61
+
62
+ it 'is a no-op when configured a second time' do
63
+ expect(Syntax.default_should_syntax_host).not_to receive(:method_undefined)
64
+ expect(::RSpec::Mocks::ExampleMethods).not_to receive(:method_added)
65
+ configure_syntax :expect
66
+ end
67
+ end
68
+
69
+ context 'when configured to :should' do
70
+ before { configure_syntax :should }
71
+
72
+ it 'adds the should methods to every object' do
73
+ expect(dbl).to respond_to(*should_methods)
74
+ end
75
+
76
+ it 'adds `any_instance` to every class' do
77
+ expect(Class.new).to respond_to(*should_class_methods)
78
+ end
79
+
80
+ it 'removes the expect methods from the example group context' do
81
+ expect(self).not_to respond_to(*expect_methods)
82
+ end
83
+
84
+ it 'reports that the syntax is :should' do
85
+ expect(configured_syntax).to eq([:should])
86
+ end
87
+
88
+ it 'is a no-op when configured a second time' do
89
+ Syntax.default_should_syntax_host.should_not_receive(:method_added)
90
+ ::RSpec::Mocks::ExampleMethods.should_not_receive(:method_undefined)
91
+ configure_syntax :should
92
+ end
93
+ end
94
+
95
+ context 'when configured to [:should, :expect]' do
96
+ before { configure_syntax [:should, :expect] }
97
+
98
+ it 'adds the should methods to every object' do
99
+ expect(dbl).to respond_to(*should_methods)
100
+ end
101
+
102
+ it 'adds `any_instance` to every class' do
103
+ expect(Class.new).to respond_to(*should_class_methods)
104
+ end
105
+
106
+ it 'adds the expect methods to the example group context' do
107
+ expect(self).to respond_to(*expect_methods)
108
+ end
109
+
110
+ it 'reports that both syntaxes are enabled' do
111
+ expect(configured_syntax).to eq([:should, :expect])
112
+ end
113
+ end
114
+ end
115
+
116
+ describe "configuring rspec-mocks directly" do
117
+ it_behaves_like "configuring the syntax" do
118
+ def configure_syntax(syntax)
119
+ RSpec::Mocks.configuration.syntax = syntax
120
+ end
121
+
122
+ def configured_syntax
123
+ RSpec::Mocks.configuration.syntax
124
+ end
125
+ end
126
+ end
127
+
128
+ describe "configuring using the rspec-core config API" do
129
+ it_behaves_like "configuring the syntax" do
130
+ def configure_syntax(syntax)
131
+ RSpec.configure do |rspec|
132
+ rspec.mock_with :rspec do |c|
133
+ c.syntax = syntax
134
+ end
135
+ end
136
+ end
137
+
138
+ def configured_syntax
139
+ RSpec.configure do |rspec|
140
+ rspec.mock_with :rspec do |c|
141
+ return c.syntax
142
+ end
143
+ end
144
+ end
145
+ end
146
+ end
23
147
  end
24
148
  end
25
149
  end