assert 2.14.0 → 2.15.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -3
  3. data/assert.gemspec +0 -2
  4. data/lib/assert/assert_runner.rb +1 -1
  5. data/lib/assert/assertions.rb +1 -1
  6. data/lib/assert/config.rb +6 -1
  7. data/lib/assert/config_helpers.rb +75 -0
  8. data/lib/assert/context.rb +20 -14
  9. data/lib/assert/context/test_dsl.rb +17 -13
  10. data/lib/assert/{view/default_view.rb → default_view.rb} +9 -17
  11. data/lib/assert/factory.rb +2 -7
  12. data/lib/assert/file_line.rb +7 -3
  13. data/lib/assert/macro.rb +1 -1
  14. data/lib/assert/macros/methods.rb +1 -1
  15. data/lib/assert/result.rb +84 -90
  16. data/lib/assert/runner.rb +8 -2
  17. data/lib/assert/suite.rb +15 -5
  18. data/lib/assert/test.rb +112 -75
  19. data/lib/assert/version.rb +1 -1
  20. data/lib/assert/view.rb +108 -21
  21. data/lib/assert/view_helpers.rb +238 -0
  22. data/test/support/factory.rb +23 -6
  23. data/test/system/test_tests.rb +359 -0
  24. data/test/unit/assertions_tests.rb +1 -1
  25. data/test/unit/config_helpers_tests.rb +95 -0
  26. data/test/unit/config_tests.rb +5 -1
  27. data/test/unit/context/test_dsl_tests.rb +25 -17
  28. data/test/unit/context_tests.rb +45 -10
  29. data/test/unit/factory_tests.rb +9 -11
  30. data/test/unit/file_line_tests.rb +22 -0
  31. data/test/unit/result_tests.rb +219 -160
  32. data/test/unit/runner_tests.rb +19 -5
  33. data/test/unit/suite_tests.rb +23 -4
  34. data/test/unit/test_tests.rb +167 -33
  35. data/test/unit/view_helpers_tests.rb +210 -0
  36. data/test/unit/view_tests.rb +66 -26
  37. metadata +12 -23
  38. data/lib/assert/view/base.rb +0 -91
  39. data/lib/assert/view/helpers/ansi_styles.rb +0 -25
  40. data/lib/assert/view/helpers/common.rb +0 -209
  41. data/test/system/running_tests.rb +0 -404
@@ -1,16 +1,30 @@
1
1
  require 'assert'
2
- require 'assert/suite'
3
- require 'assert/view/base'
4
2
  require 'assert/runner'
5
3
 
4
+ require 'stringio'
5
+ require 'assert/config_helpers'
6
+ require 'assert/suite'
7
+ require 'assert/view'
8
+
6
9
  class Assert::Runner
7
10
 
8
11
  class UnitTests < Assert::Context
9
12
  desc "Assert::Runner"
13
+ subject{ Assert::Runner }
14
+
15
+ should "include the config helpers" do
16
+ assert_includes Assert::ConfigHelpers, subject
17
+ end
18
+
19
+ end
20
+
21
+ class InitTests < UnitTests
22
+ desc "when init"
10
23
  setup do
11
24
  @config = Factory.modes_off_config
12
- @suite = Assert::Suite.new(@config)
13
- @view = Assert::View::Base.new(StringIO.new("", "w+"), @suite)
25
+ @config.suite Assert::Suite.new(@config)
26
+ @config.view Assert::View::Base.new(@config, StringIO.new("", "w+"))
27
+
14
28
  @runner = Assert::Runner.new(@config)
15
29
  end
16
30
  subject { @runner }
@@ -23,7 +37,7 @@ class Assert::Runner
23
37
  end
24
38
 
25
39
  should "return an integer exit code" do
26
- assert_equal 0, subject.run(@suite, @view)
40
+ assert_equal 0, subject.run
27
41
  end
28
42
 
29
43
  end
@@ -14,7 +14,8 @@ class Assert::Suite
14
14
  subject{ @suite }
15
15
 
16
16
  should have_accessors :config, :tests, :test_methods, :start_time, :end_time
17
- should have_imeths :ordered_tests, :results, :ordered_results
17
+ should have_imeths :ordered_tests, :ordered_tests_by_run_time
18
+ should have_imeths :results, :ordered_results
18
19
  should have_imeths :run_time, :test_rate, :result_rate
19
20
  should have_imeths :count, :test_count, :result_count
20
21
  should have_imeths :setup, :startup, :teardown, :shutdown
@@ -57,7 +58,12 @@ class Assert::Suite
57
58
  end
58
59
 
59
60
  should "know its ordered tests" do
60
- assert_equal subject.test_count, subject.ordered_tests.size
61
+ assert_equal subject.tests, subject.ordered_tests
62
+ end
63
+
64
+ should "know its tests ordered by run time" do
65
+ exp = subject.ordered_tests.sort{ |a, b| a.run_time <=> b.run_time }
66
+ assert_equal exp, subject.ordered_tests_by_run_time
61
67
  end
62
68
 
63
69
  should "know how many results it has" do
@@ -65,7 +71,7 @@ class Assert::Suite
65
71
  end
66
72
 
67
73
  should "know its ordered results" do
68
- assert_equal subject.test_count, subject.ordered_tests.size
74
+ assert_equal subject.results, subject.ordered_results
69
75
  end
70
76
 
71
77
  should "know how many pass results it has" do
@@ -170,7 +176,7 @@ class Assert::Suite
170
176
  end
171
177
 
172
178
  class ContextInfoTests < UnitTests
173
- desc "a suite's context info"
179
+ desc "ContextInfo"
174
180
  setup do
175
181
  @caller = caller
176
182
  @klass = Assert::Context
@@ -179,6 +185,7 @@ class Assert::Suite
179
185
  subject{ @info }
180
186
 
181
187
  should have_readers :called_from, :klass, :file
188
+ should have_imeths :test_name
182
189
 
183
190
  should "set its klass on init" do
184
191
  assert_equal @klass, subject.klass
@@ -201,6 +208,18 @@ class Assert::Suite
201
208
  assert_nil info.file
202
209
  end
203
210
 
211
+ should "know how to build the contextual test name for a given name" do
212
+ desc = Factory.string
213
+ name = Factory.string
214
+
215
+ assert_equal name, subject.test_name(name)
216
+ assert_equal '', subject.test_name('')
217
+ assert_equal '', subject.test_name(nil)
218
+
219
+ Assert.stub(subject.klass, :description){ desc }
220
+ assert_equal "#{desc} #{name}", subject.test_name(name)
221
+ end
222
+
204
223
  end
205
224
 
206
225
  end
@@ -3,68 +3,201 @@ require 'assert/test'
3
3
 
4
4
  require 'assert/config'
5
5
  require 'assert/file_line'
6
+ require 'assert/result'
6
7
 
7
8
  class Assert::Test
8
9
 
9
10
  class UnitTests < Assert::Context
10
11
  desc "Assert::Test"
11
12
  setup do
12
- @test_code = lambda{ assert(true) }
13
13
  @context_class = Factory.modes_off_context_class{ desc "context class" }
14
14
  @context_info = Factory.context_info(@context_class)
15
- @test = Factory.test("should do something amazing", @context_info, :code => @test_code)
15
+ @config = Factory.modes_off_config
16
+ @test_code = proc{ assert(true) }
17
+ end
18
+ subject{ Assert::Test }
19
+
20
+ should have_imeths :result_count_meth, :name_file_line_context_data
21
+ should have_imeths :for_block, :for_method
22
+
23
+ should "know the result count method name for a given type" do
24
+ type = Factory.string
25
+ exp = "#{type}_result_count".to_sym
26
+ assert_equal exp, subject.result_count_meth(type)
27
+ end
28
+
29
+ should "know how to build the name and file line given context" do
30
+ test_name = Factory.string
31
+ data = subject.name_file_line_context_data(@context_info, test_name)
32
+
33
+ exp = @context_info.test_name(test_name)
34
+ assert_equal exp, data[:name]
35
+
36
+ exp = @context_info.called_from
37
+ assert_equal exp, data[:file_line]
38
+ end
39
+
40
+ should "build tests for a block" do
41
+ name = Factory.string
42
+ test = subject.for_block(name, @context_info, @config, &@test_code)
43
+
44
+ exp = Assert::FileLine.parse(@context_info.called_from)
45
+ assert_equal exp, test.file_line
46
+
47
+ exp = @context_info.test_name(name)
48
+ assert_equal exp, test.name
49
+
50
+ assert_equal @context_info, test.context_info
51
+ assert_equal @config, test.config
52
+ assert_equal @test_code, test.code
53
+ end
54
+
55
+ should "build tests for a method" do
56
+ meth = 'a_test_method'
57
+ test = subject.for_method(meth, @context_info, @config)
58
+
59
+ exp = Assert::FileLine.parse(@context_info.called_from)
60
+ assert_equal exp, test.file_line
61
+
62
+ exp = @context_info.test_name(meth)
63
+ assert_equal exp, test.name
64
+
65
+ assert_equal @context_info, test.context_info
66
+ assert_equal @config, test.config
67
+
68
+ assert_kind_of Proc, test.code
69
+ self.instance_eval(&test.code)
70
+ assert_true @a_test_method_called
71
+ end
72
+
73
+ def a_test_method
74
+ @a_test_method_called = true
75
+ end
76
+
77
+ end
78
+
79
+ class InitWithDataTests < UnitTests
80
+ desc "when init with data"
81
+ setup do
82
+ @file_line = Assert::FileLine.new(Factory.string, Factory.integer.to_s)
83
+ @meta_data = {
84
+ :file_line => @file_line.to_s,
85
+ :name => Factory.string,
86
+ :output => Factory.string,
87
+ :run_time => Factory.float(1.0),
88
+ }
89
+ @meta_data[:total_result_count] = Factory.integer(100)
90
+ Assert::Result.types.keys.each do |type|
91
+ @meta_data[Assert::Test.result_count_meth(type)] = Factory.integer(100)
92
+ end
93
+ @run_data = {
94
+ :context_info => @context_info,
95
+ :config => @config,
96
+ :code => @test_code
97
+ }
98
+
99
+ @test = Assert::Test.new(@meta_data.merge(@run_data))
16
100
  end
17
101
  subject{ @test }
18
102
 
19
- should have_readers :context_info, :config
20
- should have_readers :name, :file_line, :code
21
- should have_accessors :results, :output, :run_time
22
- should have_imeths :context_class, :file, :line_number
23
- should have_imeths :run, :result_count, :result_rate
24
- should have_imeths *Assert::Result.types.keys.collect{ |k| "#{k}_results" }
103
+ should have_readers :file_line, :name, :output, :run_time, :total_result_count
104
+ should have_imeths *Assert::Result.types.keys.map{ |k| Assert::Test.result_count_meth(k) }
105
+ should have_readers :context_info, :config, :code, :results
106
+ should have_imeths :data, :context_class, :file, :line_number
107
+ should have_imeths :result_rate, :result_count, :capture_result, :run
108
+ should have_imeths *Assert::Result.types.keys.map{ |k| "#{k}_results" }
25
109
 
26
- should "know its context class" do
27
- assert_equal @context_class, subject.context_class
110
+ should "use any given attrs" do
111
+ assert_equal @file_line, subject.file_line
112
+ assert_equal @meta_data[:name], subject.name
113
+ assert_equal @meta_data[:output], subject.output
114
+ assert_equal @meta_data[:run_time], subject.run_time
115
+
116
+ assert_equal @meta_data[:total_result_count], subject.total_result_count
117
+
118
+ Assert::Result.types.keys.each do |type|
119
+ n = Assert::Test.result_count_meth(type)
120
+ assert_equal @meta_data[n], subject.send(n)
121
+ end
122
+
123
+ assert_equal @context_info, subject.context_info
124
+ assert_equal @config, subject.config
125
+ assert_equal @test_code, subject.code
126
+ end
127
+
128
+ should "default its attrs" do
129
+ test = Assert::Test.new
130
+
131
+ assert_equal Assert::FileLine.parse(''), test.file_line
132
+ assert_equal '', test.name
133
+ assert_equal '', test.output
134
+ assert_equal 0, test.run_time
135
+ assert_equal 0, test.total_result_count
136
+
137
+ Assert::Result.types.keys.each do |type|
138
+ assert_equal 0, test.send(Assert::Test.result_count_meth(type))
139
+ end
140
+
141
+ assert_nil test.context_info
142
+ assert_nil test.config
143
+ assert_nil test.code
28
144
  end
29
145
 
30
- should "know its config" do
31
- cust_config = Assert::Config.new
32
- assert_equal cust_config, Factory.test(cust_config).config
146
+ should "have no results before running" do
147
+ assert_empty subject.results
33
148
  end
34
149
 
35
- should "know its name, file line, file and number" do
36
- exp = "context class should do something amazing"
37
- assert_equal exp, subject.name
150
+ should "know its data hash" do
151
+ assert_equal @meta_data, subject.data
152
+ end
38
153
 
39
- exp = Assert::FileLine.new(*@context_info.called_from.split(':'))
40
- assert_equal exp, subject.file_line
154
+ should "know its context class" do
155
+ assert_equal @context_class, subject.context_class
156
+ end
41
157
 
158
+ should "file line and number" do
42
159
  assert_equal subject.file_line.file, subject.file
43
160
  assert_equal subject.file_line.line, subject.line_number
44
161
  end
45
162
 
46
- should "get its code from any passed opt, falling back on any given block" do
47
- assert_equal @test_code, subject.code
163
+ should "know its result rate" do
164
+ count = Factory.integer(100)
165
+ time = Factory.float(1.0) + 1.0
48
166
 
49
- given_block = Proc.new{ assert(false) }
50
- assert_equal given_block, Factory.test(&given_block).code
167
+ Assert.stub(subject, :result_count){ count }
168
+ Assert.stub(subject, :run_time){ time }
169
+ exp = count / time
170
+ assert_equal exp, subject.result_rate
51
171
 
52
- assert_kind_of Proc, Factory.test.code
53
- end
172
+ Assert.stub(subject, :run_time){ 0 }
173
+ assert_equal 0.0, subject.result_rate
54
174
 
55
- should "have zero results before running" do
56
- assert_equal 0, subject.result_count
175
+ Assert.stub(subject, :run_time){ 0.0 }
176
+ assert_equal 0.0, subject.result_rate
57
177
  end
58
178
 
59
- should "have a zero run time and result rate by default" do
60
- assert_equal 0, subject.run_time
61
- assert_equal 0, subject.result_rate
179
+ should "know its result counts" do
180
+ assert_equal subject.total_result_count, subject.result_count
181
+
182
+ Assert::Result.types.keys.each do |type|
183
+ exp = subject.send(Assert::Test.result_count_meth(type))
184
+ assert_equal exp, subject.result_count(type)
185
+ end
62
186
  end
63
187
 
64
- should "have a non-zero run time and result rate after it is run" do
65
- subject.run
66
- assert_not_equal 0, subject.run_time
67
- assert_not_equal 0, subject.result_rate
188
+ should "capture results" do
189
+ result = Factory.pass_result
190
+ prev_total_count = subject.total_result_count
191
+ prev_pass_count = subject.pass_result_count
192
+ callback_result = nil
193
+ callback = proc{ |r| callback_result = r}
194
+
195
+ subject.capture_result(result, callback)
196
+
197
+ assert_equal result, subject.results.last
198
+ assert_equal prev_total_count + 1, subject.total_result_count
199
+ assert_equal prev_pass_count + 1, subject.pass_result_count
200
+ assert_equal result, callback_result
68
201
  end
69
202
 
70
203
  should "have a custom inspect that only shows limited attributes" do
@@ -307,6 +440,7 @@ class Assert::Test
307
440
  "std out from the teardown\n"
308
441
  assert_equal(exp_out, @test.output)
309
442
  end
443
+
310
444
  end
311
445
 
312
446
  end
@@ -0,0 +1,210 @@
1
+ require 'assert'
2
+ require 'assert/view_helpers'
3
+
4
+ require 'assert/config'
5
+ require 'assert/config_helpers'
6
+ require 'assert/result'
7
+
8
+ module Assert::ViewHelpers
9
+
10
+ class UnitTests < Assert::Context
11
+ desc "Assert::ViewHelpers"
12
+ setup do
13
+ test_opt_val = @test_opt_val = Factory.string
14
+ @helpers_class = Class.new do
15
+ include Assert::ViewHelpers
16
+
17
+ option 'test_opt', test_opt_val
18
+
19
+ def config
20
+ # use the assert config since it has tests, contexts, etc
21
+ # also maybe use a fresh config that is empty
22
+ @config ||= [Assert.config, Assert::Config.new].choice
23
+ end
24
+ end
25
+ end
26
+ subject{ @helpers_class }
27
+
28
+ should have_imeths :option
29
+
30
+ should "include the config helpers" do
31
+ assert_includes Assert::ConfigHelpers, subject
32
+ end
33
+
34
+ should "write option values" do
35
+ helpers = @helpers_class.new
36
+ assert_equal @test_opt_val, helpers.test_opt
37
+
38
+ new_val = Factory.integer
39
+ helpers.test_opt new_val
40
+ assert_equal new_val, helpers.test_opt
41
+
42
+ other_val = Factory.integer
43
+ helpers.test_opt new_val, other_val
44
+ assert_equal [new_val, other_val], helpers.test_opt
45
+ end
46
+
47
+ end
48
+
49
+ class InitTests < UnitTests
50
+ desc "when init"
51
+ setup do
52
+ @helpers = @helpers_class.new
53
+ end
54
+ subject{ @helpers }
55
+
56
+ should have_imeths :test_run_time, :test_result_rate
57
+ should have_imeths :result_details_for, :matched_result_details_for
58
+ should have_imeths :show_result_details?, :captured_output
59
+ should have_imeths :test_count_statement, :result_count_statement
60
+ should have_imeths :to_sentence
61
+ should have_imeths :all_pass_result_summary_msg, :result_summary_msg
62
+ should have_imeths :results_summary_sentence
63
+
64
+ should "know a test's formatted run time and result rate" do
65
+ test = Factory.test
66
+ format = '%.6f'
67
+
68
+ exp = format % test.run_time
69
+ assert_equal exp, subject.test_run_time(test, format)
70
+ assert_equal exp, subject.test_run_time(test)
71
+
72
+ exp = format % test.result_rate
73
+ assert_equal exp, subject.test_result_rate(test, format)
74
+ assert_equal exp, subject.test_result_rate(test)
75
+ end
76
+
77
+ # note: not formally testing the result details for methods as the views
78
+ # will break if these are broken.
79
+
80
+ should "know whether to show result details" do
81
+ assert_false subject.show_result_details?(Factory.pass_result)
82
+
83
+ assert_true subject.show_result_details?(Factory.fail_result)
84
+ assert_true subject.show_result_details?(Factory.error_result)
85
+
86
+ skip_res, ignore_res = Factory.skip_result, Factory.ignore_result
87
+ assert_true subject.show_result_details?(skip_res)
88
+ assert_true subject.show_result_details?(ignore_res)
89
+
90
+ Assert.stub(skip_res, :message){ nil}
91
+ Assert.stub(ignore_res, :message){ nil}
92
+ assert_false subject.show_result_details?(skip_res)
93
+ assert_false subject.show_result_details?(ignore_res)
94
+ end
95
+
96
+ should "know how to build captured output" do
97
+ output = Factory.string
98
+ exp = "--- stdout ---\n"\
99
+ "#{output}"\
100
+ "--------------"
101
+ assert_equal exp, subject.captured_output(output)
102
+ end
103
+
104
+ should "know its test count and result count statements" do
105
+ exp = "#{subject.count(:tests)} test#{'s' if subject.count(:tests) != 1}"
106
+ assert_equal exp, subject.test_count_statement
107
+
108
+ exp = "#{subject.count(:results)} result#{'s' if subject.count(:results) != 1}"
109
+ assert_equal exp, subject.result_count_statement
110
+ end
111
+
112
+ should "know how to build a sentence from a list of items" do
113
+ items = 1.times.map{ Factory.string }
114
+ assert_equal items.first, subject.to_sentence(items)
115
+
116
+ items = 2.times.map{ Factory.string }
117
+ assert_equal items.join(' and '), subject.to_sentence(items)
118
+
119
+ items = (Factory.integer(3)+2).times.map{ Factory.string }
120
+ exp = [items[0..-2].join(", "), items.last].join(", and ")
121
+ assert_equal exp, subject.to_sentence(items)
122
+ end
123
+
124
+ should "know its all pass result summary message" do
125
+ Assert.stub(subject, :count).with(:results){ 0 }
126
+ assert_equal "uhh...", subject.all_pass_result_summary_msg
127
+
128
+ Assert.stub(subject, :count).with(:results){ 1 }
129
+ assert_equal "pass", subject.all_pass_result_summary_msg
130
+
131
+ Assert.stub(subject, :count).with(:results){ Factory.integer(10)+1 }
132
+ assert_equal "all pass", subject.all_pass_result_summary_msg
133
+ end
134
+
135
+ should "know its result summary msg" do
136
+ res_type = :pass
137
+ Assert.stub(subject, :all_pass?){ true }
138
+ exp = subject.all_pass_result_summary_msg
139
+ assert_equal exp, subject.result_summary_msg(res_type)
140
+
141
+ Assert.stub(subject, :all_pass?){ false }
142
+ res_type = [:pass, :ignore, :fail, :skip, :error].choice
143
+ exp = "#{subject.count(res_type)} #{res_type.to_s}"
144
+ assert_equal exp, subject.result_summary_msg(res_type)
145
+ end
146
+
147
+ should "know its results summary sentence" do
148
+ items = subject.ocurring_result_types.map do |result_sym|
149
+ subject.result_summary_msg(result_sym)
150
+ end
151
+ exp = subject.to_sentence(items)
152
+ assert_equal exp, subject.results_summary_sentence
153
+
154
+ block = proc{ |summary, result| "#{summary}--#{result}" }
155
+ items = subject.ocurring_result_types.map do |result_sym|
156
+ block.call(subject.result_summary_msg(result_sym), result_sym)
157
+ end
158
+ exp = subject.to_sentence(items)
159
+ assert_equal exp, subject.results_summary_sentence(&block)
160
+ end
161
+
162
+ end
163
+
164
+ class AnsiTests < UnitTests
165
+ desc "Ansi"
166
+ subject{ Ansi }
167
+
168
+ should have_imeths :code_for
169
+
170
+ should "know its codes" do
171
+ assert_not_empty subject::CODES
172
+ end
173
+
174
+ should "map its code style names to ansi code strings" do
175
+ styles = Factory.integer(3).times.map{ subject::CODES.keys.choice }
176
+ exp = styles.map{ |n| "\e[#{subject::CODES[n]}m" }.join('')
177
+ assert_equal exp, subject.code_for(*styles)
178
+
179
+ styles = Factory.integer(3).times.map{ Factory.string }
180
+ assert_equal '', subject.code_for(*styles)
181
+
182
+ styles = []
183
+ assert_equal '', subject.code_for(*styles)
184
+ end
185
+
186
+ end
187
+
188
+ class ResultDetailsTests < UnitTests
189
+ desc "ResultDetails"
190
+ setup do
191
+ @result = Factory.string
192
+ @test = Factory.test
193
+ @index = Factory.integer
194
+
195
+ @details = ResultDetails.new(@result, @test, @index)
196
+ end
197
+ subject{ @details }
198
+
199
+ should have_readers :result, :test_index, :test, :output
200
+
201
+ should "know its attrs" do
202
+ assert_equal @result, subject.result
203
+ assert_equal @test, subject.test
204
+ assert_equal @index, subject.test_index
205
+ assert_equal @test.output, subject.output
206
+ end
207
+
208
+ end
209
+
210
+ end