assert 2.14.0 → 2.15.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.
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,38 +1,50 @@
1
1
  require 'assert'
2
- require 'assert/suite'
3
- require 'assert/view/base'
2
+ require 'assert/view'
3
+
4
4
  require 'stringio'
5
+ require 'assert/suite'
6
+ require 'assert/view_helpers'
5
7
 
6
- class Assert::View::Base
8
+ module Assert::View
7
9
 
8
10
  class UnitTests < Assert::Context
9
- desc "Assert::View::Base"
11
+ desc "Assert::View"
12
+ subject { Assert::View }
13
+
14
+ should have_instance_method :require_user_view
15
+
16
+ end
17
+
18
+ class BaseTests < UnitTests
19
+ desc "Base"
10
20
  setup do
11
- @io = StringIO.new("", "w+")
21
+ @io = StringIO.new("", "w+")
12
22
  @config = Factory.modes_off_config
13
- @view = Assert::View::Base.new(@io, @config, @config.suite)
23
+
24
+ @view = Assert::View::Base.new(@config, @io)
14
25
  end
15
26
  subject{ @view }
16
27
 
17
- # accessors, base methods
18
- should have_imeths :is_tty?, :view, :config, :suite, :fire
28
+ should have_readers :config
29
+ should have_imeths :view, :is_tty?, :ansi_styled_msg
30
+ should have_imeths :fire
19
31
  should have_imeths :before_load, :after_load
20
32
  should have_imeths :on_start, :on_finish, :on_interrupt
21
33
  should have_imeths :before_test, :after_test, :on_result
22
34
 
23
- # common methods
24
- should have_imeths :runner_seed, :count, :tests?, :all_pass?
25
- should have_imeths :run_time, :test_rate, :result_rate
26
- should have_imeths :test_run_time, :test_result_rate
27
- should have_imeths :suite_contexts, :ordered_suite_contexts
28
- should have_imeths :suite_files, :ordered_suite_files
29
- should have_imeths :ordered_profile_tests, :show_test_profile_info?
30
- should have_imeths :show_test_verbose_info?
31
- should have_imeths :result_details_for, :matched_result_details_for, :show_result_details?
32
- should have_imeths :ocurring_result_types, :result_summary_msg
33
- should have_imeths :all_pass_result_summary_msg, :results_summary_sentence
34
- should have_imeths :test_count_statement, :result_count_statement
35
- should have_imeths :to_sentence
35
+ should "include the view helpers" do
36
+ assert_includes Assert::ViewHelpers, subject.class
37
+ end
38
+
39
+ should "default its style options" do
40
+ assert_false subject.styled
41
+
42
+ assert_nil subject.pass_styles
43
+ assert_nil subject.fail_styles
44
+ assert_nil subject.error_styles
45
+ assert_nil subject.skip_styles
46
+ assert_nil subject.ignore_styles
47
+ end
36
48
 
37
49
  should "default its result abbreviations" do
38
50
  assert_equal '.', subject.pass_abbrev
@@ -42,17 +54,45 @@ class Assert::View::Base
42
54
  assert_equal 'E', subject.error_abbrev
43
55
  end
44
56
 
57
+ should "know its config" do
58
+ assert_equal @config, subject.config
59
+ end
60
+
61
+ should "expose itself as `view`" do
62
+ assert_equal subject, subject.view
63
+ end
64
+
45
65
  should "know if it is a tty" do
46
66
  assert_equal !!@io.isatty, subject.is_tty?
47
67
  end
48
68
 
49
- end
69
+ should "know how to build ansi styled messages" do
70
+ msg = Factory.string
71
+ result = [:pass, :fail, :error, :skip, :ignore].choice
50
72
 
51
- class HandlerTests < Assert::Context
52
- desc "Assert::View"
53
- subject { Assert::View }
73
+ Assert.stub(subject, :is_tty?){ false }
74
+ Assert.stub(subject, :styled){ false }
75
+ assert_equal msg, subject.ansi_styled_msg(msg, result)
54
76
 
55
- should have_instance_method :require_user_view
77
+ Assert.stub(subject, :is_tty?){ false }
78
+ Assert.stub(subject, :styled){ true }
79
+ assert_equal msg, subject.ansi_styled_msg(msg, result)
80
+
81
+ Assert.stub(subject, :is_tty?){ true }
82
+ Assert.stub(subject, :styled){ false }
83
+ assert_equal msg, subject.ansi_styled_msg(msg, result)
84
+
85
+ Assert.stub(subject, :is_tty?){ true }
86
+ Assert.stub(subject, :styled){ true }
87
+ Assert.stub(subject, "#{result}_styles"){ [] }
88
+ assert_equal msg, subject.ansi_styled_msg(msg, result)
89
+
90
+ styles = Factory.integer(3).times.map{ Assert::ViewHelpers::Ansi::CODES.keys.choice }
91
+ Assert.stub(subject, "#{result}_styles"){ styles }
92
+ exp_code = Assert::ViewHelpers::Ansi.code_for(*styles)
93
+ exp = exp_code + msg + Assert::ViewHelpers::Ansi.code_for(:reset)
94
+ assert_equal exp, subject.ansi_styled_msg(msg, result)
95
+ end
56
96
 
57
97
  end
58
98
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: assert
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.14.0
4
+ version: 2.15.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kelly Redding
@@ -9,22 +9,8 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-03-23 00:00:00.000000000 Z
13
- dependencies:
14
- - !ruby/object:Gem::Dependency
15
- name: ansi
16
- requirement: !ruby/object:Gem::Requirement
17
- requirements:
18
- - - "~>"
19
- - !ruby/object:Gem::Version
20
- version: '1.3'
21
- type: :runtime
22
- prerelease: false
23
- version_requirements: !ruby/object:Gem::Requirement
24
- requirements:
25
- - - "~>"
26
- - !ruby/object:Gem::Version
27
- version: '1.3'
12
+ date: 2015-08-07 00:00:00.000000000 Z
13
+ dependencies: []
28
14
  description: Test::Unit style testing framework, just better than Test::Unit.
29
15
  email:
30
16
  - kelly@kellyredding.com
@@ -47,11 +33,13 @@ files:
47
33
  - lib/assert/assertions.rb
48
34
  - lib/assert/cli.rb
49
35
  - lib/assert/config.rb
36
+ - lib/assert/config_helpers.rb
50
37
  - lib/assert/context.rb
51
38
  - lib/assert/context/setup_dsl.rb
52
39
  - lib/assert/context/subject_dsl.rb
53
40
  - lib/assert/context/suite_dsl.rb
54
41
  - lib/assert/context/test_dsl.rb
42
+ - lib/assert/default_view.rb
55
43
  - lib/assert/factory.rb
56
44
  - lib/assert/file_line.rb
57
45
  - lib/assert/macro.rb
@@ -64,18 +52,15 @@ files:
64
52
  - lib/assert/utils.rb
65
53
  - lib/assert/version.rb
66
54
  - lib/assert/view.rb
67
- - lib/assert/view/base.rb
68
- - lib/assert/view/default_view.rb
69
- - lib/assert/view/helpers/ansi_styles.rb
70
- - lib/assert/view/helpers/common.rb
55
+ - lib/assert/view_helpers.rb
71
56
  - log/.gitkeep
72
57
  - test/helper.rb
73
58
  - test/support/diff_a.txt
74
59
  - test/support/diff_b.txt
75
60
  - test/support/factory.rb
76
61
  - test/support/inherited_stuff.rb
77
- - test/system/running_tests.rb
78
62
  - test/system/stub_tests.rb
63
+ - test/system/test_tests.rb
79
64
  - test/unit/assert_tests.rb
80
65
  - test/unit/assertions/assert_block_tests.rb
81
66
  - test/unit/assertions/assert_empty_tests.rb
@@ -91,6 +76,7 @@ files:
91
76
  - test/unit/assertions/assert_same_tests.rb
92
77
  - test/unit/assertions/assert_true_false_tests.rb
93
78
  - test/unit/assertions_tests.rb
79
+ - test/unit/config_helpers_tests.rb
94
80
  - test/unit/config_tests.rb
95
81
  - test/unit/context/setup_dsl_tests.rb
96
82
  - test/unit/context/subject_dsl_tests.rb
@@ -106,6 +92,7 @@ files:
106
92
  - test/unit/suite_tests.rb
107
93
  - test/unit/test_tests.rb
108
94
  - test/unit/utils_tests.rb
95
+ - test/unit/view_helpers_tests.rb
109
96
  - test/unit/view_tests.rb
110
97
  - tmp/.gitkeep
111
98
  homepage: http://github.com/redding/assert
@@ -138,8 +125,8 @@ test_files:
138
125
  - test/support/diff_b.txt
139
126
  - test/support/factory.rb
140
127
  - test/support/inherited_stuff.rb
141
- - test/system/running_tests.rb
142
128
  - test/system/stub_tests.rb
129
+ - test/system/test_tests.rb
143
130
  - test/unit/assert_tests.rb
144
131
  - test/unit/assertions/assert_block_tests.rb
145
132
  - test/unit/assertions/assert_empty_tests.rb
@@ -155,6 +142,7 @@ test_files:
155
142
  - test/unit/assertions/assert_same_tests.rb
156
143
  - test/unit/assertions/assert_true_false_tests.rb
157
144
  - test/unit/assertions_tests.rb
145
+ - test/unit/config_helpers_tests.rb
158
146
  - test/unit/config_tests.rb
159
147
  - test/unit/context/setup_dsl_tests.rb
160
148
  - test/unit/context/subject_dsl_tests.rb
@@ -170,4 +158,5 @@ test_files:
170
158
  - test/unit/suite_tests.rb
171
159
  - test/unit/test_tests.rb
172
160
  - test/unit/utils_tests.rb
161
+ - test/unit/view_helpers_tests.rb
173
162
  - test/unit/view_tests.rb
@@ -1,91 +0,0 @@
1
- require 'assert/config'
2
- require 'assert/suite'
3
- require 'assert/result'
4
-
5
- module Assert::View
6
-
7
- class Base
8
-
9
- # include a bunch of common helper methods
10
-
11
- require 'assert/view/helpers/common'
12
- include Helpers::Common
13
-
14
- # setup options and their default values
15
-
16
- option 'pass_abbrev', '.'
17
- option 'fail_abbrev', 'F'
18
- option 'ignore_abbrev', 'I'
19
- option 'skip_abbrev', 'S'
20
- option 'error_abbrev', 'E'
21
-
22
- attr_reader :config, :suite
23
-
24
- def initialize(output_io, *args)
25
- @output_io = output_io
26
- @suite, @config = [
27
- args.last.kind_of?(Assert::Suite) ? args.pop : nil,
28
- args.last.kind_of?(Assert::Config) ? args.pop : nil
29
- ]
30
-
31
- @output_io.sync = true if @output_io.respond_to?(:sync=)
32
- end
33
-
34
- def is_tty?
35
- !!@output_io.isatty
36
- end
37
-
38
- def view
39
- self
40
- end
41
-
42
- def config
43
- @config ||= Assert.config
44
- end
45
-
46
- def suite
47
- @suite ||= Assert.suite
48
- end
49
-
50
- def fire(callback, *args)
51
- self.send(callback, *args)
52
- end
53
-
54
- # Callbacks
55
-
56
- # define callback handlers to output information. handlers are
57
- # instance_eval'd in the scope of the view instance. any stdout is captured
58
- # and sent to the io stream.
59
-
60
- # available callbacks from the runner:
61
- # * `before_load`: called at the beginning, before the suite is loaded
62
- # * `after_load`: called after the suite is loaded, just before `on_start`
63
- # functionally equivalent to `on_start`
64
- # * `on_start`: called when a loaded test suite starts running
65
- # * `before_test`: called before a test starts running
66
- # the test is passed as an arg
67
- # * `on_result`: called when a running tests generates a result
68
- # the result is passed as an arg
69
- # * `after_test`: called after a test finishes running
70
- # the test is passed as an arg
71
- # * `on_finish`: called when the test suite is finished running
72
- # * `on_interrupt`: called when the test suite is interrupted while running
73
- # the interrupt exception is passed as an arg
74
-
75
- def before_load(test_files); end
76
- def after_load; end
77
- def on_start; end
78
- def before_test(test); end
79
- def on_result(result); end
80
- def after_test(test); end
81
- def on_finish; end
82
- def on_interrupt(err); end
83
-
84
- # IO capture
85
-
86
- def puts(*args); @output_io.puts(*args); end
87
- def print(*args); @output_io.print(*args); end
88
-
89
- end
90
-
91
- end
@@ -1,25 +0,0 @@
1
- require 'ansi/code'
2
-
3
- module Assert::View::Helpers
4
-
5
- module AnsiStyles
6
-
7
- def result_ansi_styles(result)
8
- view.styled ? view.send("#{result.to_sym}_styles") : []
9
- end
10
-
11
- def ansi_styled_msg(msg, styles=[])
12
- if !(style = ansi_style(*styles)).empty? && self.is_tty?
13
- style + msg + ANSI.send(:reset)
14
- else
15
- msg
16
- end
17
- end
18
-
19
- def ansi_style(*ansi_codes)
20
- ansi_codes.collect{|code| ANSI.send(code) rescue nil}.compact.join('')
21
- end
22
-
23
- end
24
-
25
- end
@@ -1,209 +0,0 @@
1
- module Assert::View::Helpers
2
-
3
- module Common
4
-
5
- def self.included(receiver)
6
- receiver.class_eval{ extend ClassMethods }
7
- end
8
-
9
- def runner_seed
10
- self.config.runner_seed
11
- end
12
-
13
- def count(type)
14
- self.suite.count(type)
15
- end
16
-
17
- def tests?
18
- self.count(:tests) > 0
19
- end
20
-
21
- def all_pass?
22
- self.count(:pass) == self.count(:results)
23
- end
24
-
25
- # get the formatted suite run time
26
- def run_time(format = '%.6f')
27
- format % self.suite.run_time
28
- end
29
-
30
- # get the formatted suite test rate
31
- def test_rate(format = '%.6f')
32
- format % self.suite.test_rate
33
- end
34
-
35
- # get the formatted suite result rate
36
- def result_rate(format = '%.6f')
37
- format % self.suite.result_rate
38
- end
39
-
40
- # get the formatted run time for an idividual test
41
- def test_run_time(test, format = '%.6f')
42
- format % test.run_time
43
- end
44
-
45
- # get the formatted result rate for an individual test
46
- def test_result_rate(test, format = '%.6f')
47
- format % test.result_rate
48
- end
49
-
50
- # get a uniq list of contexts for the test suite
51
- def suite_contexts
52
- @suite_contexts ||= self.suite.tests.inject([]) do |contexts, test|
53
- contexts << test.context_info.klass
54
- end.uniq
55
- end
56
-
57
- def ordered_suite_contexts
58
- self.suite_contexts.sort{|a,b| a.to_s <=> b.to_s}
59
- end
60
-
61
- # get a uniq list of files containing contexts for the test suite
62
- def suite_files
63
- @suite_files ||= self.suite.tests.inject([]) do |files, test|
64
- files << test.context_info.file
65
- end.uniq
66
- end
67
-
68
- def ordered_suite_files
69
- self.suite_files.sort{|a,b| a.to_s <=> b.to_s}
70
- end
71
-
72
- def ordered_profile_tests
73
- suite.ordered_tests.sort{ |a, b| a.run_time <=> b.run_time }
74
- end
75
-
76
- def show_test_profile_info?
77
- !!config.profile
78
- end
79
-
80
- def show_test_verbose_info?
81
- !!config.verbose
82
- end
83
-
84
- # get all the result details for a set of tests
85
- def result_details_for(tests, result_order = :normal)
86
- test_index = 0
87
- tests.collect do |test|
88
- test_index += 1
89
-
90
- details = test.results.collect do |result|
91
- ResultDetails.new(result, test, test_index)
92
- end
93
- details.reverse! if result_order == :reversed
94
- details
95
- end.compact.flatten
96
- end
97
-
98
- # get all the result details for a set of tests matching a file or context
99
- def matched_result_details_for(match, tests, result_order = :normal)
100
- context_match = match.kind_of?(Class) && match.ancestors.include?(Assert::Context)
101
- file_match = match.kind_of?(String)
102
-
103
- matching_tests = if context_match
104
- tests.select {|test| test.context_info.klass == match}
105
- elsif file_match
106
- tests.select {|test| test.context_info.file == match}
107
- else
108
- tests
109
- end
110
-
111
- result_details_for(matching_tests, result_order)
112
- end
113
-
114
- # only show result details for failed or errored results
115
- # show result details if a skip or passed result was issues w/ a message
116
- def show_result_details?(result)
117
- ([:fail, :error].include?(result.to_sym)) ||
118
- ([:skip, :ignore].include?(result.to_sym) && result.message)
119
- end
120
-
121
- # show any captured output
122
- def captured_output(output)
123
- "--- stdout ---\n"\
124
- "#{output}"\
125
- "--------------"
126
- end
127
-
128
- # return a list of result symbols that have actually occurred
129
- def ocurring_result_types
130
- @result_types ||= [
131
- :pass, :fail, :ignore, :skip, :error
132
- ].select { |result_sym| self.count(result_sym) > 0 }
133
- end
134
-
135
- # print a result summary message for a given result type
136
- def result_summary_msg(result_type)
137
- if result_type == :pass && self.all_pass?
138
- self.all_pass_result_summary_msg
139
- else
140
- "#{self.count(result_type)} #{result_type.to_s}"
141
- end
142
- end
143
-
144
- # generate an appropriate result summary msg for all tests passing
145
- def all_pass_result_summary_msg
146
- if self.count(:results) < 1
147
- "uhh..."
148
- elsif self.count(:results) == 1
149
- "pass"
150
- else
151
- "all pass"
152
- end
153
- end
154
-
155
- # generate a sentence fragment describing the breakdown of test results
156
- # if a block is given, yield each msg in the breakdown for custom formatting
157
- def results_summary_sentence
158
- summaries = self.ocurring_result_types.collect do |result_sym|
159
- summary_msg = self.result_summary_msg(result_sym)
160
- block_given? ? yield(summary_msg, result_sym) : summary_msg
161
- end
162
- self.to_sentence(summaries)
163
- end
164
-
165
- def test_count_statement
166
- "#{self.count(:tests)} test#{'s' if self.count(:tests) != 1}"
167
- end
168
-
169
- def result_count_statement
170
- "#{self.count(:results)} result#{'s' if self.count(:results) != 1}"
171
- end
172
-
173
- # generate a comma-seperated sentence fragment given a list of things
174
- def to_sentence(things)
175
- if things.size <= 2
176
- things.join(things.size == 2 ? ' and ' : '')
177
- else
178
- [things[0..-2].join(", "), things.last].join(", and ")
179
- end
180
- end
181
-
182
- class ResultDetails
183
- attr_reader :result, :test_index, :test, :output
184
-
185
- def initialize(result, test, test_index)
186
- @result = result
187
- @test = test
188
- @test_index = test_index
189
- @output = test.output
190
- end
191
- end
192
-
193
- module ClassMethods
194
-
195
- def option(name, *default_vals)
196
- default = default_vals.size > 1 ? default_vals : default_vals.first
197
- define_method(name) do |*args|
198
- if !(value = args.size > 1 ? args : args.first).nil?
199
- instance_variable_set("@#{name}", value)
200
- end
201
- (val = instance_variable_get("@#{name}")).nil? ? default : val
202
- end
203
- end
204
-
205
- end
206
-
207
- end
208
-
209
- end