assert 2.0.0.rc.1 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Gemfile +1 -1
- data/{LICENSE → LICENSE.txt} +0 -0
- data/Rakefile +1 -3
- data/assert.gemspec +15 -15
- data/lib/assert.rb +1 -2
- data/lib/assert/assert_runner.rb +2 -1
- data/lib/assert/assertions.rb +153 -189
- data/lib/assert/version.rb +1 -1
- data/test/helper.rb +74 -51
- data/test/{fixtures → support}/inherited_stuff.rb +0 -0
- data/test/{test → system}/running_tests.rb +16 -43
- data/test/{assert_test.rb → unit/assert_tests.rb} +0 -0
- data/test/unit/assertions/assert_block_tests.rb +57 -0
- data/test/unit/assertions/assert_empty_tests.rb +58 -0
- data/test/unit/assertions/assert_equal_tests.rb +59 -0
- data/test/unit/assertions/assert_file_exists_tests.rb +59 -0
- data/test/unit/assertions/assert_includes_tests.rb +61 -0
- data/test/unit/assertions/assert_instance_of_tests.rb +61 -0
- data/test/unit/assertions/assert_kind_of_tests.rb +60 -0
- data/test/unit/assertions/assert_match_tests.rb +59 -0
- data/test/unit/assertions/assert_nil_tests.rb +59 -0
- data/test/unit/assertions/assert_raises_tests.rb +73 -0
- data/test/unit/assertions/assert_respond_to_tests.rb +63 -0
- data/test/unit/assertions/assert_same_tests.rb +65 -0
- data/test/unit/assertions_tests.rb +65 -0
- data/test/unit/context/basic_singleton_tests.rb +86 -0
- data/test/unit/context/setup_teardown_singleton_tests.rb +105 -0
- data/test/unit/context/test_should_singleton_tests.rb +134 -0
- data/test/{context_test.rb → unit/context_tests.rb} +53 -131
- data/test/{macro_test.rb → unit/macro_tests.rb} +15 -11
- data/test/{result_test.rb → unit/result_tests.rb} +27 -26
- data/test/{runner_test.rb → unit/runner_tests.rb} +1 -2
- data/test/{suite_test.rb → unit/suite_tests.rb} +63 -95
- data/test/{test_test.rb → unit/test_tests.rb} +45 -77
- data/test/{view/base_tests.rb → unit/view_tests.rb} +0 -1
- metadata +63 -104
- data/CHANGELOG.md +0 -33
- data/test/assertions/assert_block_test.rb +0 -39
- data/test/assertions/assert_empty_test.rb +0 -43
- data/test/assertions/assert_equal_test.rb +0 -43
- data/test/assertions/assert_file_exists_test.rb +0 -43
- data/test/assertions/assert_includes_test.rb +0 -44
- data/test/assertions/assert_instance_of_test.rb +0 -43
- data/test/assertions/assert_kind_of_test.rb +0 -43
- data/test/assertions/assert_match_test.rb +0 -43
- data/test/assertions/assert_nil_test.rb +0 -43
- data/test/assertions/assert_not_block_test.rb +0 -39
- data/test/assertions/assert_not_empty_test.rb +0 -43
- data/test/assertions/assert_not_equal_test.rb +0 -43
- data/test/assertions/assert_not_file_exists_test.rb +0 -43
- data/test/assertions/assert_not_included_test.rb +0 -44
- data/test/assertions/assert_not_instance_of_test.rb +0 -43
- data/test/assertions/assert_not_kind_of_test.rb +0 -43
- data/test/assertions/assert_not_match_test.rb +0 -43
- data/test/assertions/assert_not_nil_test.rb +0 -43
- data/test/assertions/assert_not_respond_to_test.rb +0 -43
- data/test/assertions/assert_not_same_test.rb +0 -45
- data/test/assertions/assert_nothing_raised_test.rb +0 -46
- data/test/assertions/assert_raises_test.rb +0 -49
- data/test/assertions/assert_respond_to_test.rb +0 -43
- data/test/assertions/assert_same_test.rb +0 -45
- data/test/assertions_test.rb +0 -60
- data/test/context/class_methods_test.rb +0 -531
- data/test/fixtures/sample_context.rb +0 -13
- data/test/fixtures/test_root/one_test.rb +0 -0
- data/test/fixtures/test_root/parent/area_one/area_test.rb +0 -0
- data/test/fixtures/test_root/shallow/deeply/nested_test.rb +0 -0
- data/test/fixtures/test_root/shallow/nested_test.rb +0 -0
- data/test/fixtures/test_root/shallow_test.rb +0 -0
- data/test/fixtures/test_root/two_test.rb +0 -0
- data/test/suite/context_info_test.rb +0 -42
data/lib/assert/version.rb
CHANGED
data/test/helper.rb
CHANGED
@@ -1,19 +1,51 @@
|
|
1
|
-
# this file is automatically required
|
2
|
-
# put test helpers here
|
1
|
+
# this file is automatically required when you run `assert`
|
2
|
+
# put any test helpers here
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
# test/.. (root dir for gem)
|
4
|
+
# add the root dir to the load path
|
7
5
|
$LOAD_PATH.unshift(File.expand_path("../..", __FILE__))
|
8
6
|
|
9
|
-
#
|
10
|
-
#
|
11
|
-
#
|
7
|
+
# Force tests to run without halting on failures (needed so all tests will run
|
8
|
+
# properly). For halt on fail behavior testing, the context of those tests
|
9
|
+
# configures Assert temporarily as needed.
|
10
|
+
|
11
|
+
class Assert::Context
|
12
|
+
def setup
|
13
|
+
Assert.config.halt_on_fail false
|
14
|
+
# Note: don't mess with the `show_output` setting in this setup block. Doing
|
15
|
+
# so will break the capture output tests. If you really need to set it one
|
16
|
+
# way or the other, do so in the `.assert.rb` local settings file.
|
17
|
+
end
|
18
|
+
|
19
|
+
# a context for use in testing all the different context singleton methods
|
20
|
+
class ContextSingletonTests < Assert::Context
|
21
|
+
desc "Assert context singleton"
|
22
|
+
setup do
|
23
|
+
@orig_assert_suite = Assert.suite
|
24
|
+
Assert.config.suite TEST_ASSERT_SUITE
|
25
|
+
@test = Factory.test
|
26
|
+
@context_class = @test.context_class
|
27
|
+
end
|
28
|
+
teardown do
|
29
|
+
TEST_ASSERT_SUITE.tests.clear
|
30
|
+
Assert.config.suite @orig_assert_suite
|
31
|
+
end
|
32
|
+
subject{ @context_class }
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
|
39
|
+
# A Suite for use in the tests. It is seperate from `Assert.suite`
|
40
|
+
# (which is the actual suite being used to run the tests). Don't use
|
41
|
+
# `Assert.suite` in your tests, use TEST_ASSERT_SUITE
|
42
|
+
|
12
43
|
TEST_ASSERT_SUITE = Assert::Suite.new
|
13
44
|
|
14
|
-
#
|
15
|
-
#
|
16
|
-
#
|
45
|
+
# A context for use in the tests and also in the `context_class` factory. This
|
46
|
+
# will ensure any contexts defined as part of the tests will add their methods
|
47
|
+
# to `TEST_ASSERT_SUITE`
|
48
|
+
|
17
49
|
class TestContext < Assert::Context
|
18
50
|
def self.method_added(meth)
|
19
51
|
if meth.to_s =~ Assert::Suite::TEST_METHOD_REGEX
|
@@ -23,54 +55,45 @@ class TestContext < Assert::Context
|
|
23
55
|
end
|
24
56
|
end
|
25
57
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
Assert.config.halt_on_fail false
|
31
|
-
# Note: don't mess with `Assert.config.output` in this setup block - it will
|
32
|
-
# break the capture output tests. If you really need to set it one way or
|
33
|
-
# another, do it in the `.assert.rb` local settings file.
|
58
|
+
module Factory
|
59
|
+
|
60
|
+
def self.context_info_called_from
|
61
|
+
"/path/to_file.rb:1234"
|
34
62
|
end
|
35
|
-
end
|
36
63
|
|
37
|
-
|
38
|
-
|
64
|
+
def self.context_info(context_class)
|
65
|
+
Assert::Suite::ContextInfo.new(context_class, context_info_called_from)
|
66
|
+
end
|
39
67
|
|
40
|
-
|
41
|
-
|
42
|
-
end
|
68
|
+
# Generate an anonymous `Context` inherited from `TestContext` by default.
|
69
|
+
# This provides a common interface for all contexts used in testing.
|
43
70
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
klass = Class.new(inherit_from, &block)
|
52
|
-
default = (const_name = "FactoryAssertContext").dup
|
53
|
-
while(Object.const_defined?(const_name)) do
|
54
|
-
const_name = "FactoryAssertContext#{rand(Time.now.to_i)}"
|
55
|
-
end
|
56
|
-
Object.const_set(const_name, klass)
|
57
|
-
klass
|
71
|
+
def self.context_class(inherit_from=nil, &block)
|
72
|
+
inherit_from ||= TestContext
|
73
|
+
klass = Class.new(inherit_from, &block)
|
74
|
+
default = (const_name = "FactoryAssertContext").dup
|
75
|
+
|
76
|
+
while(Object.const_defined?(const_name)) do
|
77
|
+
const_name = "FactoryAssertContext#{rand(Time.now.to_i)}"
|
58
78
|
end
|
79
|
+
Object.const_set(const_name, klass)
|
80
|
+
klass
|
81
|
+
end
|
59
82
|
|
60
|
-
|
61
|
-
# if you need a no-op test.
|
62
|
-
def test(*args, &block)
|
63
|
-
name = (args[0] || "a test").to_s
|
64
|
-
context_info = args[1] || self.context_info(self.context_class)
|
65
|
-
test_block = (block || args[2] || ::Proc.new{})
|
83
|
+
# Generate a no-op test for use in testing.
|
66
84
|
|
67
|
-
|
68
|
-
|
85
|
+
def self.test(*args, &block)
|
86
|
+
name = (args[0] || "a test").to_s
|
87
|
+
context_info = args[1] || self.context_info(self.context_class)
|
88
|
+
test_block = (block || args[2] || ::Proc.new{})
|
69
89
|
|
70
|
-
|
71
|
-
|
72
|
-
Assert::Result::Skip.new(Factory.test(name), exception)
|
73
|
-
end
|
90
|
+
Assert::Test.new(name, context_info, &test_block)
|
91
|
+
end
|
74
92
|
|
93
|
+
# Generate a skip result for use in testing.
|
94
|
+
|
95
|
+
def self.skip_result(name, exception)
|
96
|
+
Assert::Result::Skip.new(Factory.test(name), exception)
|
75
97
|
end
|
98
|
+
|
76
99
|
end
|
File without changes
|
@@ -1,13 +1,10 @@
|
|
1
1
|
require 'assert'
|
2
2
|
|
3
|
-
class Assert::
|
3
|
+
class RunningTheTestsTests < Assert::Context
|
4
|
+
desc "Assert tests that are run"
|
5
|
+
subject{ @test }
|
4
6
|
|
5
|
-
class
|
6
|
-
desc "Assert tests that are run"
|
7
|
-
subject{ @test }
|
8
|
-
end
|
9
|
-
|
10
|
-
class NothingTests < RunningTests
|
7
|
+
class NothingTests < RunningTheTestsTests
|
11
8
|
desc "and does nothing"
|
12
9
|
setup do
|
13
10
|
@test = Factory.test
|
@@ -20,9 +17,7 @@ class Assert::Test
|
|
20
17
|
|
21
18
|
end
|
22
19
|
|
23
|
-
|
24
|
-
|
25
|
-
class PassTests < RunningTests
|
20
|
+
class PassTests < RunningTheTestsTests
|
26
21
|
desc "and passes a single assertion"
|
27
22
|
setup do
|
28
23
|
@test = Factory.test{ assert(1 == 1) }
|
@@ -38,9 +33,7 @@ class Assert::Test
|
|
38
33
|
|
39
34
|
end
|
40
35
|
|
41
|
-
|
42
|
-
|
43
|
-
class FailTests < RunningTests
|
36
|
+
class FailTests < RunningTheTestsTests
|
44
37
|
desc "and fails a single assertion"
|
45
38
|
setup do
|
46
39
|
@test = Factory.test{ assert(1 == 0) }
|
@@ -56,9 +49,7 @@ class Assert::Test
|
|
56
49
|
|
57
50
|
end
|
58
51
|
|
59
|
-
|
60
|
-
|
61
|
-
class SkipTests < RunningTests
|
52
|
+
class SkipTests < RunningTheTestsTests
|
62
53
|
desc "and skips"
|
63
54
|
setup do
|
64
55
|
@test = Factory.test{ skip }
|
@@ -74,9 +65,7 @@ class Assert::Test
|
|
74
65
|
|
75
66
|
end
|
76
67
|
|
77
|
-
|
78
|
-
|
79
|
-
class ErrorTests < RunningTests
|
68
|
+
class ErrorTests < RunningTheTestsTests
|
80
69
|
desc "and errors"
|
81
70
|
setup do
|
82
71
|
@test = Factory.test{ raise("WHAT") }
|
@@ -92,9 +81,7 @@ class Assert::Test
|
|
92
81
|
|
93
82
|
end
|
94
83
|
|
95
|
-
|
96
|
-
|
97
|
-
class MixedTests < RunningTests
|
84
|
+
class MixedTests < RunningTheTestsTests
|
98
85
|
desc "and has 1 pass and 1 fail assertion"
|
99
86
|
setup do
|
100
87
|
@test = Factory.test do
|
@@ -116,9 +103,7 @@ class Assert::Test
|
|
116
103
|
|
117
104
|
end
|
118
105
|
|
119
|
-
|
120
|
-
|
121
|
-
class MixedSkipTests < RunningTests
|
106
|
+
class MixedSkipTests < RunningTheTestsTests
|
122
107
|
desc "and has 1 pass and 1 fail assertion with a skip call in between"
|
123
108
|
setup do
|
124
109
|
@test = Factory.test do
|
@@ -147,9 +132,7 @@ class Assert::Test
|
|
147
132
|
|
148
133
|
end
|
149
134
|
|
150
|
-
|
151
|
-
|
152
|
-
class MixedErrorTests < RunningTests
|
135
|
+
class MixedErrorTests < RunningTheTestsTests
|
153
136
|
desc "and has 1 pass and 1 fail assertion with an exception raised in between"
|
154
137
|
setup do
|
155
138
|
@test = Factory.test do
|
@@ -178,9 +161,7 @@ class Assert::Test
|
|
178
161
|
|
179
162
|
end
|
180
163
|
|
181
|
-
|
182
|
-
|
183
|
-
class MixedPassTests < RunningTests
|
164
|
+
class MixedPassTests < RunningTheTestsTests
|
184
165
|
desc "and has 1 pass and 1 fail assertion with a pass call in between"
|
185
166
|
setup do
|
186
167
|
@test = Factory.test do
|
@@ -206,9 +187,7 @@ class Assert::Test
|
|
206
187
|
|
207
188
|
end
|
208
189
|
|
209
|
-
|
210
|
-
|
211
|
-
class MixedFailTests < RunningTests
|
190
|
+
class MixedFailTests < RunningTheTestsTests
|
212
191
|
desc "and has 1 pass and 1 fail assertion with a fail call in between"
|
213
192
|
setup do
|
214
193
|
@test = Factory.test do
|
@@ -234,9 +213,7 @@ class Assert::Test
|
|
234
213
|
|
235
214
|
end
|
236
215
|
|
237
|
-
|
238
|
-
|
239
|
-
class MixedFlunkTests < RunningTests
|
216
|
+
class MixedFlunkTests < RunningTheTestsTests
|
240
217
|
desc "and has 1 pass and 1 fail assertion with a flunk call in between"
|
241
218
|
setup do
|
242
219
|
@test = Factory.test do
|
@@ -262,9 +239,7 @@ class Assert::Test
|
|
262
239
|
|
263
240
|
end
|
264
241
|
|
265
|
-
|
266
|
-
|
267
|
-
class WithSetupTests < RunningTests
|
242
|
+
class WithSetupTests < RunningTheTestsTests
|
268
243
|
desc "a Test that runs and has assertions that depend on setups"
|
269
244
|
setup do
|
270
245
|
assert_style_msg = @asm = "set by assert style setup"
|
@@ -307,9 +282,7 @@ class Assert::Test
|
|
307
282
|
|
308
283
|
end
|
309
284
|
|
310
|
-
|
311
|
-
|
312
|
-
class WithTeardownTests < RunningTests
|
285
|
+
class WithTeardownTests < RunningTheTestsTests
|
313
286
|
desc "a Test that runs and has assertions with teardowns"
|
314
287
|
setup do
|
315
288
|
assert_style_msg = @asm = "set by assert style teardown"
|
File without changes
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'assert'
|
2
|
+
require 'assert/assertions'
|
3
|
+
|
4
|
+
module Assert::Assertions
|
5
|
+
|
6
|
+
class AssertBlockTests < Assert::Context
|
7
|
+
desc "the `assert_block` helper"
|
8
|
+
setup do
|
9
|
+
desc = @desc = "assert block fail desc"
|
10
|
+
@test = Factory.test do
|
11
|
+
assert_block{ true } # pass
|
12
|
+
assert_block(desc){ false } # fail
|
13
|
+
end
|
14
|
+
@test.run
|
15
|
+
end
|
16
|
+
subject{ @test }
|
17
|
+
|
18
|
+
should "produce results as expected" do
|
19
|
+
assert_equal 2, subject.result_count
|
20
|
+
assert_equal 1, subject.result_count(:pass)
|
21
|
+
assert_equal 1, subject.result_count(:fail)
|
22
|
+
end
|
23
|
+
|
24
|
+
should "have a fail message with custom and generic explanations" do
|
25
|
+
exp = "#{@desc}\nExpected block to return a true value."
|
26
|
+
assert_equal exp, subject.fail_results.first.message
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
class AssertNotBlockTests < Assert::Context
|
32
|
+
desc "the assert_not_block helper"
|
33
|
+
setup do
|
34
|
+
desc = @desc = "assert not block fail desc"
|
35
|
+
@test = Factory.test do
|
36
|
+
assert_not_block(desc){ true } # fail
|
37
|
+
assert_not_block{ false } # pass
|
38
|
+
end
|
39
|
+
@test.run
|
40
|
+
end
|
41
|
+
subject{ @test }
|
42
|
+
|
43
|
+
should "produce results as expected" do
|
44
|
+
assert_equal 2, subject.result_count
|
45
|
+
assert_equal 1, subject.result_count(:pass)
|
46
|
+
assert_equal 1, subject.result_count(:fail)
|
47
|
+
end
|
48
|
+
|
49
|
+
should "have a fail message with custom and generic explanations" do
|
50
|
+
exp = "#{@desc}\nExpected block to return a false value."
|
51
|
+
assert_equal exp, subject.fail_results.first.message
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'assert'
|
2
|
+
require 'assert/assertions'
|
3
|
+
|
4
|
+
module Assert::Assertions
|
5
|
+
|
6
|
+
class AssertEmptyTests < Assert::Context
|
7
|
+
desc "the assert_empty helper"
|
8
|
+
setup do
|
9
|
+
desc = @desc = "assert empty fail desc"
|
10
|
+
args = @args = [ [ 1 ], desc ]
|
11
|
+
@test = Factory.test do
|
12
|
+
assert_empty([]) # pass
|
13
|
+
assert_empty(*args) # fail
|
14
|
+
end
|
15
|
+
@test.run
|
16
|
+
end
|
17
|
+
subject{ @test }
|
18
|
+
|
19
|
+
should "produce results as expected" do
|
20
|
+
assert_equal 2, subject.result_count
|
21
|
+
assert_equal 1, subject.result_count(:pass)
|
22
|
+
assert_equal 1, subject.result_count(:fail)
|
23
|
+
end
|
24
|
+
|
25
|
+
should "have a fail message with custom and generic explanations" do
|
26
|
+
exp = "#{@args[1]}\nExpected #{@args[0].inspect} to be empty."
|
27
|
+
assert_equal exp, subject.fail_results.first.message
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
class AssertNotEmptyTests < Assert::Context
|
33
|
+
desc "the assert_not_empty helper"
|
34
|
+
setup do
|
35
|
+
desc = @desc = "assert not empty fail desc"
|
36
|
+
args = @args = [ [], desc ]
|
37
|
+
@test = Factory.test do
|
38
|
+
assert_not_empty([ 1 ]) # pass
|
39
|
+
assert_not_empty(*args) # fail
|
40
|
+
end
|
41
|
+
@test.run
|
42
|
+
end
|
43
|
+
subject{ @test }
|
44
|
+
|
45
|
+
should "produce results as expected" do
|
46
|
+
assert_equal 2, subject.result_count
|
47
|
+
assert_equal 1, subject.result_count(:pass)
|
48
|
+
assert_equal 1, subject.result_count(:fail)
|
49
|
+
end
|
50
|
+
|
51
|
+
should "have a fail message with custom and generic explanations" do
|
52
|
+
exp = "#{@args[1]}\nExpected #{@args[0].inspect} to not be empty."
|
53
|
+
assert_equal exp, subject.fail_results.first.message
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'assert'
|
2
|
+
require 'assert/assertions'
|
3
|
+
|
4
|
+
module Assert::Assertions
|
5
|
+
|
6
|
+
class AssertEqualTests < Assert::Context
|
7
|
+
desc "the assert_equal helper"
|
8
|
+
setup do
|
9
|
+
desc = @desc = "assert equal fail desc"
|
10
|
+
args = @args = [ '1', '2', desc ]
|
11
|
+
@test = Factory.test do
|
12
|
+
assert_equal(1, 1) # pass
|
13
|
+
assert_equal(*args) # fail
|
14
|
+
end
|
15
|
+
@test.run
|
16
|
+
end
|
17
|
+
subject{ @test }
|
18
|
+
|
19
|
+
should "produce results as expected" do
|
20
|
+
assert_equal 2, subject.result_count
|
21
|
+
assert_equal 1, subject.result_count(:pass)
|
22
|
+
assert_equal 1, subject.result_count(:fail)
|
23
|
+
end
|
24
|
+
|
25
|
+
should "have a fail message with custom and generic explanations" do
|
26
|
+
exp = "#{@args[2]}\nExpected #{@args[0].inspect}, not #{@args[1].inspect}."
|
27
|
+
assert_equal exp, subject.fail_results.first.message
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
class AssertNotEqualTests < Assert::Context
|
33
|
+
desc "the assert_not_equal helper"
|
34
|
+
setup do
|
35
|
+
desc = @desc = "assert not equal fail desc"
|
36
|
+
args = @args = [ '1', '1', desc ]
|
37
|
+
@test = Factory.test do
|
38
|
+
assert_not_equal(*args) # fail
|
39
|
+
assert_not_equal(1, 2) # pass
|
40
|
+
end
|
41
|
+
@test.run
|
42
|
+
end
|
43
|
+
subject{ @test }
|
44
|
+
|
45
|
+
should "produce results as expected" do
|
46
|
+
assert_equal 2, subject.result_count
|
47
|
+
assert_equal 1, subject.result_count(:pass)
|
48
|
+
assert_equal 1, subject.result_count(:fail)
|
49
|
+
end
|
50
|
+
|
51
|
+
should "have a fail message with custom and generic explanations" do
|
52
|
+
exp = "#{@args[2]}\n"\
|
53
|
+
"#{@args[1].inspect} not expected to equal #{@args[0].inspect}."
|
54
|
+
assert_equal exp, subject.fail_results.first.message
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|