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,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