assert 2.17.0 → 2.18.4
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.
- checksums.yaml +4 -4
- data/Gemfile +2 -2
- data/README.md +66 -41
- data/assert.gemspec +2 -3
- data/lib/assert.rb +0 -10
- data/lib/assert/actual_value.rb +127 -0
- data/lib/assert/assert_runner.rb +0 -3
- data/lib/assert/assertions.rb +10 -23
- data/lib/assert/cli.rb +30 -46
- data/lib/assert/config.rb +0 -4
- data/lib/assert/config_helpers.rb +0 -4
- data/lib/assert/context.rb +18 -9
- data/lib/assert/context/let_dsl.rb +13 -0
- data/lib/assert/context/method_missing.rb +19 -0
- data/lib/assert/context/setup_dsl.rb +0 -4
- data/lib/assert/context/subject_dsl.rb +23 -28
- data/lib/assert/context/suite_dsl.rb +0 -4
- data/lib/assert/context/test_dsl.rb +0 -4
- data/lib/assert/context_info.rb +0 -4
- data/lib/assert/default_runner.rb +0 -4
- data/lib/assert/default_suite.rb +0 -5
- data/lib/assert/default_view.rb +0 -4
- data/lib/assert/factory.rb +0 -3
- data/lib/assert/file_line.rb +0 -4
- data/lib/assert/macro.rb +0 -3
- data/lib/assert/macros/methods.rb +4 -10
- data/lib/assert/result.rb +2 -17
- data/lib/assert/runner.rb +0 -3
- data/lib/assert/stub.rb +15 -1
- data/lib/assert/suite.rb +0 -4
- data/lib/assert/test.rb +2 -7
- data/lib/assert/utils.rb +0 -4
- data/lib/assert/version.rb +1 -1
- data/lib/assert/view.rb +0 -3
- data/lib/assert/view_helpers.rb +0 -11
- data/log/{.gitkeep → .keep} +0 -0
- data/test/helper.rb +23 -29
- data/test/support/factory.rb +14 -0
- data/test/support/inherited_stuff.rb +0 -2
- data/test/system/stub_tests.rb +332 -352
- data/test/system/test_tests.rb +98 -124
- data/test/unit/actual_value_tests.rb +335 -0
- data/test/unit/assert_tests.rb +121 -46
- data/test/unit/assertions/assert_block_tests.rb +30 -35
- data/test/unit/assertions/assert_empty_tests.rb +33 -35
- data/test/unit/assertions/assert_equal_tests.rb +75 -83
- data/test/unit/assertions/assert_file_exists_tests.rb +32 -36
- data/test/unit/assertions/assert_includes_tests.rb +38 -41
- data/test/unit/assertions/assert_instance_of_tests.rb +34 -37
- data/test/unit/assertions/assert_kind_of_tests.rb +34 -37
- data/test/unit/assertions/assert_match_tests.rb +34 -37
- data/test/unit/assertions/assert_nil_tests.rb +30 -35
- data/test/unit/assertions/assert_raises_tests.rb +54 -60
- data/test/unit/assertions/assert_respond_to_tests.rb +36 -39
- data/test/unit/assertions/assert_same_tests.rb +86 -88
- data/test/unit/assertions/assert_true_false_tests.rb +60 -66
- data/test/unit/assertions_tests.rb +14 -17
- data/test/unit/config_helpers_tests.rb +41 -39
- data/test/unit/config_tests.rb +38 -37
- data/test/unit/context/let_dsl_tests.rb +10 -0
- data/test/unit/context/setup_dsl_tests.rb +68 -87
- data/test/unit/context/subject_dsl_tests.rb +15 -49
- data/test/unit/context/suite_dsl_tests.rb +15 -20
- data/test/unit/context/test_dsl_tests.rb +50 -57
- data/test/unit/context_info_tests.rb +23 -18
- data/test/unit/context_tests.rb +183 -194
- data/test/unit/default_runner_tests.rb +1 -7
- data/test/unit/default_suite_tests.rb +57 -56
- data/test/unit/factory_tests.rb +5 -6
- data/test/unit/file_line_tests.rb +33 -39
- data/test/unit/macro_tests.rb +14 -18
- data/test/unit/result_tests.rb +159 -196
- data/test/unit/runner_tests.rb +64 -71
- data/test/unit/suite_tests.rb +58 -59
- data/test/unit/test_tests.rb +125 -136
- data/test/unit/utils_tests.rb +43 -54
- data/test/unit/view_helpers_tests.rb +54 -58
- data/test/unit/view_tests.rb +22 -27
- metadata +15 -10
- data/tmp/.gitkeep +0 -0
@@ -2,60 +2,55 @@ require "assert"
|
|
2
2
|
require "assert/assertions"
|
3
3
|
|
4
4
|
module Assert::Assertions
|
5
|
-
|
6
5
|
class AssertBlockTests < Assert::Context
|
7
6
|
include Assert::Test::TestHelpers
|
8
7
|
|
9
8
|
desc "`assert_block`"
|
10
|
-
|
11
|
-
desc =
|
12
|
-
|
13
|
-
assert_block{ true } # pass
|
14
|
-
assert_block(desc){ false } # fail
|
9
|
+
subject {
|
10
|
+
desc = desc1
|
11
|
+
Factory.test do
|
12
|
+
assert_block { true } # pass
|
13
|
+
assert_block(desc) { false } # fail
|
15
14
|
end
|
16
|
-
|
17
|
-
|
18
|
-
|
15
|
+
}
|
16
|
+
|
17
|
+
let(:desc1) { "assert block fail desc" }
|
19
18
|
|
20
19
|
should "produce results as expected" do
|
21
|
-
|
22
|
-
assert_equal 1, test_run_result_count(:pass)
|
23
|
-
assert_equal 1, test_run_result_count(:fail)
|
24
|
-
end
|
20
|
+
subject.run(&test_run_callback)
|
25
21
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
end
|
22
|
+
assert_that(test_run_result_count).equals(2)
|
23
|
+
assert_that(test_run_result_count(:pass)).equals(1)
|
24
|
+
assert_that(test_run_result_count(:fail)).equals(1)
|
30
25
|
|
26
|
+
exp = "#{desc1}\nExpected block to return a true value."
|
27
|
+
assert_that(test_run_results(:fail).first.message).equals(exp)
|
28
|
+
end
|
31
29
|
end
|
32
30
|
|
33
31
|
class AssertNotBlockTests < Assert::Context
|
34
32
|
include Assert::Test::TestHelpers
|
35
33
|
|
36
34
|
desc "`assert_not_block`"
|
37
|
-
|
38
|
-
desc =
|
39
|
-
|
40
|
-
assert_not_block(desc){ true } # fail
|
41
|
-
assert_not_block{ false } # pass
|
35
|
+
subject {
|
36
|
+
desc = desc1
|
37
|
+
Factory.test do
|
38
|
+
assert_not_block(desc) { true } # fail
|
39
|
+
assert_not_block { false } # pass
|
42
40
|
end
|
43
|
-
|
44
|
-
|
45
|
-
|
41
|
+
}
|
42
|
+
|
43
|
+
let(:desc1) { "assert not block fail desc" }
|
46
44
|
|
47
45
|
should "produce results as expected" do
|
48
|
-
|
49
|
-
assert_equal 1, test_run_result_count(:pass)
|
50
|
-
assert_equal 1, test_run_result_count(:fail)
|
51
|
-
end
|
46
|
+
subject.run(&test_run_callback)
|
52
47
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
end
|
48
|
+
assert_that(test_run_result_count).equals(2)
|
49
|
+
assert_that(test_run_result_count(:pass)).equals(1)
|
50
|
+
assert_that(test_run_result_count(:fail)).equals(1)
|
57
51
|
|
52
|
+
exp = "#{desc1}\nExpected block to not return a true value."
|
53
|
+
assert_that(test_run_results(:fail).first.message).equals(exp)
|
54
|
+
end
|
58
55
|
end
|
59
|
-
|
60
56
|
end
|
61
|
-
|
@@ -4,63 +4,61 @@ require "assert/assertions"
|
|
4
4
|
require "assert/utils"
|
5
5
|
|
6
6
|
module Assert::Assertions
|
7
|
-
|
8
7
|
class AssertEmptyTests < Assert::Context
|
9
8
|
include Assert::Test::TestHelpers
|
10
9
|
|
11
10
|
desc "`assert_empty`"
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
@test = Factory.test do
|
11
|
+
subject {
|
12
|
+
args = args1
|
13
|
+
Factory.test do
|
16
14
|
assert_empty([]) # pass
|
17
15
|
assert_empty(*args) # fail
|
18
16
|
end
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
17
|
+
}
|
18
|
+
|
19
|
+
let(:desc1) { "assert empty fail desc" }
|
20
|
+
let(:args1) { [[1], desc1] }
|
21
|
+
let(:config1) { subject.config }
|
23
22
|
|
24
23
|
should "produce results as expected" do
|
25
|
-
|
26
|
-
assert_equal 1, test_run_result_count(:pass)
|
27
|
-
assert_equal 1, test_run_result_count(:fail)
|
28
|
-
end
|
24
|
+
subject.run(&test_run_callback)
|
29
25
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
end
|
26
|
+
assert_that(test_run_result_count).equals(2)
|
27
|
+
assert_that(test_run_result_count(:pass)).equals(1)
|
28
|
+
assert_that(test_run_result_count(:fail)).equals(1)
|
34
29
|
|
30
|
+
exp =
|
31
|
+
"#{args1[1]}\nExpected #{Assert::U.show(args1[0], config1)} to be empty."
|
32
|
+
assert_that(test_run_results(:fail).first.message).equals(exp)
|
33
|
+
end
|
35
34
|
end
|
36
35
|
|
37
36
|
class AssertNotEmptyTests < Assert::Context
|
38
37
|
include Assert::Test::TestHelpers
|
39
38
|
|
40
39
|
desc "`assert_not_empty`"
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
assert_not_empty([1]) # pass
|
40
|
+
subject {
|
41
|
+
args = args1
|
42
|
+
Factory.test do
|
43
|
+
assert_not_empty([1]) # pass
|
46
44
|
assert_not_empty(*args) # fail
|
47
45
|
end
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
46
|
+
}
|
47
|
+
|
48
|
+
let(:desc1) { "assert not empty fail desc" }
|
49
|
+
let(:args1) { [[], desc1] }
|
50
|
+
let(:config1) { subject.config }
|
52
51
|
|
53
52
|
should "produce results as expected" do
|
54
|
-
|
55
|
-
assert_equal 1, test_run_result_count(:pass)
|
56
|
-
assert_equal 1, test_run_result_count(:fail)
|
57
|
-
end
|
53
|
+
subject.run(&test_run_callback)
|
58
54
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
end
|
55
|
+
assert_that(test_run_result_count).equals(2)
|
56
|
+
assert_that(test_run_result_count(:pass)).equals(1)
|
57
|
+
assert_that(test_run_result_count(:fail)).equals(1)
|
63
58
|
|
59
|
+
exp =
|
60
|
+
"#{args1[1]}\nExpected #{Assert::U.show(args1[0], config1)} to not be empty."
|
61
|
+
assert_that(test_run_results(:fail).first.message).equals(exp)
|
62
|
+
end
|
64
63
|
end
|
65
|
-
|
66
64
|
end
|
@@ -4,144 +4,136 @@ require "assert/assertions"
|
|
4
4
|
require "assert/utils"
|
5
5
|
|
6
6
|
module Assert::Assertions
|
7
|
-
|
8
7
|
class AssertEqualTests < Assert::Context
|
9
8
|
include Assert::Test::TestHelpers
|
10
9
|
|
11
10
|
desc "`assert_equal`"
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
assert_equal(
|
17
|
-
assert_equal(*a) # fail
|
11
|
+
subject {
|
12
|
+
args = args1
|
13
|
+
Factory.test do
|
14
|
+
assert_equal(1, 1) # pass
|
15
|
+
assert_equal(*args) # fail
|
18
16
|
end
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
17
|
+
}
|
18
|
+
|
19
|
+
let(:desc1) { "assert equal fail desc" }
|
20
|
+
let(:args1) { ["1", "2", desc1] }
|
21
|
+
let(:config1) { subject.config }
|
23
22
|
|
24
23
|
should "produce results as expected" do
|
25
|
-
|
26
|
-
assert_equal 1, test_run_result_count(:pass)
|
27
|
-
assert_equal 1, test_run_result_count(:fail)
|
28
|
-
end
|
24
|
+
subject.run(&test_run_callback)
|
29
25
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
assert_equal exp, test_run_results(:fail).first.message
|
34
|
-
end
|
26
|
+
assert_that(test_run_result_count).equals(2)
|
27
|
+
assert_that(test_run_result_count(:pass)).equals(1)
|
28
|
+
assert_that(test_run_result_count(:fail)).equals(1)
|
35
29
|
|
30
|
+
exp =
|
31
|
+
"#{args1[2]}\nExpected #{Assert::U.show(args1[1], config1)}"\
|
32
|
+
" to be equal to #{Assert::U.show(args1[0], config1)}."
|
33
|
+
assert_that(test_run_results(:fail).first.message).equals(exp)
|
34
|
+
end
|
36
35
|
end
|
37
36
|
|
38
37
|
class AssertNotEqualTests < Assert::Context
|
39
38
|
include Assert::Test::TestHelpers
|
40
39
|
|
41
40
|
desc "`assert_not_equal`"
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
assert_not_equal(
|
47
|
-
assert_not_equal(1, 2) # pass
|
41
|
+
subject {
|
42
|
+
args = args1
|
43
|
+
Factory.test do
|
44
|
+
assert_not_equal(*args) # fail
|
45
|
+
assert_not_equal(1, 2) # pass
|
48
46
|
end
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
47
|
+
}
|
48
|
+
|
49
|
+
let(:desc1) { "assert not equal fail desc" }
|
50
|
+
let(:args1) { ["1", "1", desc1] }
|
51
|
+
let(:config1) { subject.config }
|
53
52
|
|
54
53
|
should "produce results as expected" do
|
55
|
-
|
56
|
-
assert_equal 1, test_run_result_count(:pass)
|
57
|
-
assert_equal 1, test_run_result_count(:fail)
|
58
|
-
end
|
54
|
+
subject.run(&test_run_callback)
|
59
55
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
assert_equal exp, test_run_results(:fail).first.message
|
64
|
-
end
|
56
|
+
assert_that(test_run_result_count).equals(2)
|
57
|
+
assert_that(test_run_result_count(:pass)).equals(1)
|
58
|
+
assert_that(test_run_result_count(:fail)).equals(1)
|
65
59
|
|
60
|
+
exp =
|
61
|
+
"#{args1[2]}\nExpected #{Assert::U.show(args1[1], config1)}"\
|
62
|
+
" to not be equal to #{Assert::U.show(args1[0], config1)}."
|
63
|
+
assert_that(test_run_results(:fail).first.message).equals(exp)
|
64
|
+
end
|
66
65
|
end
|
67
66
|
|
68
67
|
class EqualOrderTests < Assert::Context
|
69
68
|
include Assert::Test::TestHelpers
|
70
69
|
|
71
70
|
desc "with objects that define custom equality operators"
|
72
|
-
setup do
|
73
|
-
is_class = Class.new do
|
74
|
-
def ==(other); true; end
|
75
|
-
end
|
76
|
-
@is = is_class.new
|
77
71
|
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
72
|
+
let(:is_class) { Class.new do; def ==(other); true; end; end }
|
73
|
+
let(:is_not_class) { Class.new do; def ==(other); false; end; end }
|
74
|
+
|
75
|
+
let(:is1) { is_class.new }
|
76
|
+
let(:is_not1) { is_not_class.new }
|
83
77
|
|
84
78
|
should "use the equality operator of the exp value" do
|
85
|
-
|
86
|
-
|
79
|
+
assert_that(is1).equals(is_not1)
|
80
|
+
assert_that(is_not1).does_not_equal(is1)
|
87
81
|
end
|
88
|
-
|
89
82
|
end
|
90
83
|
|
91
84
|
class DiffTests < Assert::Context
|
92
85
|
include Assert::Test::TestHelpers
|
93
86
|
|
94
87
|
desc "with objects that should use diff when showing"
|
95
|
-
setup do
|
96
|
-
@exp_obj = "I'm a\nstring"
|
97
|
-
@act_obj = "I am a \nstring"
|
98
|
-
|
99
|
-
@c = Factory.modes_off_config
|
100
|
-
@c.use_diff_proc(Assert::U.default_use_diff_proc)
|
101
|
-
@c.run_diff_proc(Assert::U.syscmd_diff_proc)
|
102
88
|
|
103
|
-
|
104
|
-
|
105
|
-
|
89
|
+
let(:config1) {
|
90
|
+
Factory.modes_off_config.tap do |config|
|
91
|
+
config.use_diff_proc(Assert::U.default_use_diff_proc)
|
92
|
+
config.run_diff_proc(Assert::U.syscmd_diff_proc)
|
93
|
+
end
|
94
|
+
}
|
106
95
|
|
96
|
+
let(:exp_obj1) { "I'm a\nstring" }
|
97
|
+
let(:act_obj1) { "I am a \nstring" }
|
98
|
+
let(:exp_obj_show1) { Assert::U.show_for_diff(exp_obj1, config1) }
|
99
|
+
let(:act_obj_show1) { Assert::U.show_for_diff(act_obj1, config1) }
|
107
100
|
end
|
108
101
|
|
109
102
|
class AssertEqualDiffTests < DiffTests
|
110
103
|
desc "`assert_equal`"
|
111
|
-
|
112
|
-
exp_obj, act_obj =
|
113
|
-
|
104
|
+
subject {
|
105
|
+
exp_obj, act_obj = exp_obj1, act_obj1
|
106
|
+
Factory.test(config1) do
|
114
107
|
assert_equal(exp_obj, act_obj)
|
115
108
|
end
|
116
|
-
|
117
|
-
end
|
118
|
-
subject{ @test }
|
109
|
+
}
|
119
110
|
|
120
111
|
should "include diff output in the fail messages" do
|
121
|
-
|
122
|
-
"#{Assert::U.syscmd_diff_proc.call(@exp_obj_show, @act_obj_show)}"
|
123
|
-
assert_equal exp, test_run_results(:fail).first.message
|
124
|
-
end
|
112
|
+
subject.run(&test_run_callback)
|
125
113
|
|
114
|
+
exp =
|
115
|
+
"Expected does not equal actual, diff:\n"\
|
116
|
+
"#{Assert::U.syscmd_diff_proc.call(exp_obj_show1, act_obj_show1)}"
|
117
|
+
assert_that(test_run_results(:fail).first.message).equals(exp)
|
118
|
+
end
|
126
119
|
end
|
127
120
|
|
128
121
|
class AssertNotEqualDiffTests < DiffTests
|
129
122
|
desc "`assert_not_equal`"
|
130
|
-
|
131
|
-
exp_obj
|
132
|
-
|
123
|
+
subject {
|
124
|
+
exp_obj = exp_obj1
|
125
|
+
Factory.test(config1) do
|
133
126
|
assert_not_equal(exp_obj, exp_obj)
|
134
127
|
end
|
135
|
-
|
136
|
-
end
|
137
|
-
subject{ @test }
|
128
|
+
}
|
138
129
|
|
139
130
|
should "include diff output in the fail messages" do
|
140
|
-
|
141
|
-
"#{Assert::U.syscmd_diff_proc.call(@exp_obj_show, @exp_obj_show)}"
|
142
|
-
assert_equal exp, test_run_results(:fail).first.message
|
143
|
-
end
|
131
|
+
subject.run(&test_run_callback)
|
144
132
|
|
133
|
+
exp =
|
134
|
+
"Expected equals actual, diff:\n"\
|
135
|
+
"#{Assert::U.syscmd_diff_proc.call(exp_obj_show1, exp_obj_show1)}"
|
136
|
+
assert_that(test_run_results(:fail).first.message).equals(exp)
|
137
|
+
end
|
145
138
|
end
|
146
|
-
|
147
139
|
end
|
@@ -9,59 +9,55 @@ module Assert::Assertions
|
|
9
9
|
include Assert::Test::TestHelpers
|
10
10
|
|
11
11
|
desc "`assert_file_exists`"
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
@test = Factory.test do
|
12
|
+
subject {
|
13
|
+
args = args1
|
14
|
+
Factory.test do
|
16
15
|
assert_file_exists(__FILE__) # pass
|
17
16
|
assert_file_exists(*args) # fail
|
18
17
|
end
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
18
|
+
}
|
19
|
+
|
20
|
+
let(:desc1) { "assert file exists fail desc" }
|
21
|
+
let(:args1) { ["/a/path/to/some/file/that/no/exists", desc1] }
|
22
|
+
let(:config1) { subject.config }
|
23
23
|
|
24
24
|
should "produce results as expected" do
|
25
|
-
|
26
|
-
assert_equal 1, test_run_result_count(:pass)
|
27
|
-
assert_equal 1, test_run_result_count(:fail)
|
28
|
-
end
|
25
|
+
subject.run(&test_run_callback)
|
29
26
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
end
|
27
|
+
assert_that(test_run_result_count).equals(2)
|
28
|
+
assert_that(test_run_result_count(:pass)).equals(1)
|
29
|
+
assert_that(test_run_result_count(:fail)).equals(1)
|
34
30
|
|
31
|
+
exp = "#{args1[1]}\nExpected #{Assert::U.show(args1[0], config1)} to exist."
|
32
|
+
assert_that(test_run_results(:fail).first.message).equals(exp)
|
33
|
+
end
|
35
34
|
end
|
36
35
|
|
37
36
|
class AssertNotFileExistsTests < Assert::Context
|
38
37
|
include Assert::Test::TestHelpers
|
39
38
|
|
40
39
|
desc "`assert_not_file_exists`"
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
assert_not_file_exists(
|
46
|
-
assert_not_file_exists(*args) # fail
|
40
|
+
subject {
|
41
|
+
args = args1
|
42
|
+
Factory.test do
|
43
|
+
assert_not_file_exists("/file/path") # pass
|
44
|
+
assert_not_file_exists(*args) # fail
|
47
45
|
end
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
46
|
+
}
|
47
|
+
|
48
|
+
let(:desc1) { "assert not file exists fail desc" }
|
49
|
+
let(:args1) { [__FILE__, desc1] }
|
50
|
+
let(:config1) { subject.config }
|
52
51
|
|
53
52
|
should "produce results as expected" do
|
54
|
-
|
55
|
-
assert_equal 1, test_run_result_count(:pass)
|
56
|
-
assert_equal 1, test_run_result_count(:fail)
|
57
|
-
end
|
53
|
+
subject.run(&test_run_callback)
|
58
54
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
end
|
55
|
+
assert_that(test_run_result_count).equals(2)
|
56
|
+
assert_that(test_run_result_count(:pass)).equals(1)
|
57
|
+
assert_that(test_run_result_count(:fail)).equals(1)
|
63
58
|
|
59
|
+
exp = "#{args1[1]}\nExpected #{Assert::U.show(args1[0], config1)} to not exist."
|
60
|
+
assert_that(test_run_results(:fail).first.message).equals(exp)
|
61
|
+
end
|
64
62
|
end
|
65
|
-
|
66
63
|
end
|
67
|
-
|