dohtest 0.1.6 → 0.1.7

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.
@@ -1,55 +1,62 @@
1
- module DohTest
1
+ require 'doh/test/failure'
2
2
 
3
- AssertionFailed = Class.new(StandardError)
3
+ module DohTest
4
4
 
5
5
  class TestGroup
6
- def assert(condition, msg = nil)
7
- if condition
6
+ def assert(boolean, msg = nil)
7
+ if boolean
8
8
  @runner.assertion_passed
9
9
  else
10
- raise DohTest::AssertionFailed, msg || "Assertion failed."
10
+ raise DohTest::Failure.new(msg, :boolean, nil, nil)
11
11
  end
12
12
  end
13
13
 
14
- def build_equal_msg(expected, actual)
15
- if (expected.to_s.size + actual.to_s.size) < 50
16
- "expected: #{expected}; actual: #{actual}"
14
+ def assert_equal(expected, actual, msg = nil)
15
+ if expected == actual
16
+ @runner.assertion_passed
17
17
  else
18
- "\nexpected: #{expected}\n actual: #{actual}"
18
+ raise DohTest::Failure.new(msg, :equal, expected, actual)
19
19
  end
20
20
  end
21
21
 
22
- def assert_equal(expected, actual, msg = nil)
23
- assert(expected == actual, msg || build_equal_msg(expected, actual))
24
- end
25
-
26
- def assert_raises(*args)
27
- msg = args.pop if args.last.is_a?(String)
28
-
22
+ def assert_raises(*expected)
23
+ msg = expected.pop if expected.last.is_a?(String)
29
24
  begin
30
25
  yield
31
26
  no_exception = true
32
- rescue Exception => excpt
33
- expected_str = if (args.size == 1) then args.first else "one of #{args.join(',')}" end
34
- assert(args.include?(excpt.class), msg || "expected: #{expected_str}; actual: #{excpt.class}: #{excpt.message}")
35
- return
36
- end
37
-
38
- if no_exception
39
- raise DohTest::AssertionFailed, msg || "expected: #{args}, but no exception was raised"
27
+ rescue Exception => actual_excpt
28
+ actual_class = actual_excpt.class
29
+ if expected.any? { |elem| elem.instance_of?(Module) ? actual_excpt.kind_of?(elem) : elem == actual_class }
30
+ @runner.assertion_passed
31
+ else
32
+ raise DohTest::Failure.new(msg, :raises, expected, actual_class)
33
+ end
40
34
  end
35
+ raise DohTest::Failure.new(msg, :raises, expected, nil) if no_exception
41
36
  end
42
37
 
43
38
  def assert_instance_of(expected_class, actual_object, msg = nil)
44
- assert(actual_object.instance_of?(expected_class), msg || "expected class: #{expected_class}; actual: #{actual_object.class}")
39
+ if actual_object.instance_of?(expected_class)
40
+ @runner.assertion_passed
41
+ else
42
+ raise DohTest::Failure.new(msg, :instance_of, expected_class, actual_object)
43
+ end
45
44
  end
46
45
 
47
46
  def assert_match(expected_regex, actual_str, msg = nil)
48
- assert(actual_str.match(expected_regex), msg || "expected regex #{expected_regex} to match str: #{actual_str}")
47
+ if actual_str.match(expected_regex)
48
+ @runner.assertion_passed
49
+ else
50
+ raise DohTest::Failure.new(msg, :match, expected_regex, actual_str)
51
+ end
49
52
  end
50
53
 
51
54
  def assert_not_equal(expected, actual, msg = nil)
52
- assert(expected != actual, msg || "expected unequal values")
55
+ if expected != actual
56
+ @runner.assertion_passed
57
+ else
58
+ raise DohTest::Failure.new(msg, :not_equal, expected, actual)
59
+ end
53
60
  end
54
61
  end
55
62
 
@@ -0,0 +1,53 @@
1
+ module DohTest
2
+
3
+ class CaptureOutput
4
+ attr_reader :events
5
+
6
+ def initialize
7
+ @events = []
8
+ end
9
+
10
+ def run_begin(config)
11
+ add(:config => config)
12
+ end
13
+
14
+ def run_end(duration)
15
+ add(:duration => duration)
16
+ end
17
+
18
+ def group_begin(group_name)
19
+ add(:group_name => group_name)
20
+ end
21
+
22
+ def group_end(group_name, tests_ran, tests_skipped, assertions_passed, assertions_failed)
23
+ add(:group_name => group_name, :tests_ran => tests_ran, :tests_skipped => tests_skipped, :assertions_passed => assertions_passed, :assertions_failed => assertions_failed)
24
+ end
25
+
26
+ def test_begin(group_name, test_name)
27
+ add(:group_name => group_name, :test_name => test_name)
28
+ end
29
+
30
+ def test_end(group_name, test_name)
31
+ add(:group_name => group_name, :test_name => test_name)
32
+ end
33
+
34
+ def test_error(group_name, test_name, error)
35
+ add(:group_name => group_name, :test_name => test_name, :error => error)
36
+ end
37
+
38
+ def assertion_failed(group_name, test_name, failure)
39
+ add(:group_name => group_name, :test_name => test_name, :failure => failure)
40
+ end
41
+
42
+ def assertion_passed(group_name, test_name)
43
+ add(:group_name => group_name, :test_name => test_name)
44
+ end
45
+
46
+ private
47
+ def add(args)
48
+ args[:name] = caller.first.rpartition(':in ').last[1..-2]
49
+ @events.push(args)
50
+ end
51
+ end
52
+
53
+ end
@@ -0,0 +1,12 @@
1
+ module DohTest
2
+
3
+ class Failure < StandardError
4
+ attr_reader :assert, :expected, :actual
5
+
6
+ def initialize(message, assert, expected, actual)
7
+ super(message || '')
8
+ @assert, @expected, @actual = assert, expected, actual
9
+ end
10
+ end
11
+
12
+ end
@@ -7,64 +7,120 @@ class GroupRunner
7
7
  @group_class,@output = group_class,output
8
8
  @config = config || {}
9
9
  @group_name = @group_class.to_s
10
- @group_failed = false
11
- @tests_ran = 0
12
- @tests_skipped = 0
13
- @assertions_passed = 0
14
- @assertions_failed = 0
10
+ @before_all_failed = false
11
+ @error_count = @tests_ran = @tests_skipped = @assertions_failed = @assertions_passed = 0
15
12
  end
16
13
 
17
14
  def run
18
15
  @output.group_begin(@group_name)
19
- create_group
20
- run_before_all unless @group_failed
21
- run_tests unless @group_failed
22
- run_after_all unless @group_failed
16
+ if create_group
17
+ run_before_all
18
+ run_tests unless @before_all_failed
19
+ run_after_all
20
+ end
23
21
  @output.group_end(@group_name, @tests_ran, @tests_skipped, @assertions_passed, @assertions_failed)
22
+ past_brink?
24
23
  end
25
24
 
26
25
  def create_group
27
26
  @group = @group_class.new
28
27
  rescue => error
29
- @group_failed = true
30
- @output.test_error(@group_name, 'initialize', error)
28
+ caught_error(error, 'initialize')
29
+ false
31
30
  else
32
31
  @group.runner = self
32
+ true
33
33
  end
34
34
 
35
35
  def run_before_all
36
36
  @group.before_all if @group.respond_to?(:before_all)
37
37
  rescue => error
38
- @group_failed = true
39
- @output.test_error(@group_name, 'before_all', error)
38
+ @before_all_failed = true
39
+ caught_error(error, 'before_all')
40
40
  end
41
41
 
42
42
  def run_after_all
43
43
  @group.after_all if @group.respond_to?(:after_all)
44
44
  rescue => error
45
- @output.test_error(@group_name, 'after_all', error)
45
+ caught_error(error, 'after_all')
46
46
  end
47
47
 
48
- def run_tests
49
- determine_test_methods
48
+ def find_before_each_method
50
49
  has_before_each = @group.respond_to?(:before_each)
50
+ has_setup = @group.respond_to?(:setup)
51
+ if has_before_each && has_setup
52
+ raise ":before_each and :setup both defined; please pick one"
53
+ elsif has_before_each
54
+ @before_each_method = :before_each
55
+ elsif has_setup
56
+ @before_each_method = :setup
57
+ else
58
+ @before_each_method = nil
59
+ end
60
+ end
61
+
62
+ def find_after_each_method
51
63
  has_after_each = @group.respond_to?(:after_each)
64
+ has_teardown = @group.respond_to?(:teardown)
65
+ if has_after_each && has_teardown
66
+ raise ":after_each and :teardown both defined; please pick one"
67
+ elsif has_after_each
68
+ @after_each_method = :after_each
69
+ elsif has_teardown
70
+ @after_each_method = :teardown
71
+ else
72
+ @after_each_method = nil
73
+ end
74
+ end
75
+
76
+ def run_before_each
77
+ @group.send(@before_each_method)
78
+ rescue => error
79
+ @before_each_failed = true
80
+ caught_error(error)
81
+ end
82
+
83
+ def run_after_each
84
+ @group.send(@after_each_method)
85
+ rescue => error
86
+ caught_error(error)
87
+ end
88
+
89
+ def run_test_method
90
+ @group.send(@test_name)
91
+ rescue DohTest::Failure => failure
92
+ @assertions_failed += 1
93
+ @output.assertion_failed(@group_name, @test_name, failure)
94
+ rescue => error
95
+ caught_error(error)
96
+ end
97
+
98
+ def setup_brink
99
+ @max_errors = if @config.key?(:max_errors) then @config[:max_errors].to_i else nil end
100
+ @max_failures = if @config.key?(:max_failures) then @config[:max_failures].to_i else nil end
101
+ @has_brink = @max_errors || @max_failures
102
+ end
103
+
104
+ def past_brink?
105
+ (@max_errors && (@error_count > @max_errors)) || (@max_failures && (@assertions_failed > @max_failures))
106
+ end
107
+
108
+ def run_tests
109
+ determine_test_methods
110
+ find_before_each_method
111
+ find_after_each_method
112
+ setup_brink
52
113
 
53
114
  @test_methods.each do |method_name|
115
+ break if @has_brink && past_brink?
54
116
  @test_name = method_name
55
- begin
56
- @group.send(:before_each) if has_before_each
57
- @output.test_begin(@group_name, @test_name)
58
- @group.send(@test_name)
59
- @tests_ran += 1
60
- @output.test_end(@group_name, @test_name)
61
- @group.send(:after_each) if has_after_each
62
- rescue DohTest::AssertionFailed => failure
63
- @assertions_failed += 1
64
- @output.assertion_failed(@group_name, @test_name, failure)
65
- rescue => error
66
- @output.test_error(@group_name, @test_name, error)
67
- end
117
+ @before_each_failed = false
118
+ @output.test_begin(@group_name, @test_name)
119
+ run_before_each if @before_each_method
120
+ run_test_method unless @before_each_failed
121
+ run_after_each if @after_each_method
122
+ @tests_ran += 1
123
+ @output.test_end(@group_name, @test_name)
68
124
  end
69
125
  end
70
126
 
@@ -81,6 +137,11 @@ class GroupRunner
81
137
  @assertions_passed += 1
82
138
  @output.assertion_passed(@group_name, @test_name)
83
139
  end
140
+
141
+ def caught_error(error, test_name = nil)
142
+ @error_count += 1
143
+ @output.test_error(@group_name, test_name || @test_name, error)
144
+ end
84
145
  end
85
146
 
86
147
  end
@@ -13,7 +13,9 @@ class MasterRunner
13
13
  DohTest::require_paths(@config[:glob], @paths)
14
14
  srand(@config[:seed])
15
15
  @output.run_begin(@config)
16
- TestGroup.descendants.each { |group_class| GroupRunner.new(group_class, @output, @config).run }
16
+ TestGroup.descendants.each do |group_class|
17
+ break if GroupRunner.new(group_class, @output, @config).run
18
+ end
17
19
  @output.run_end(Time.now - start_time)
18
20
  end
19
21
  end
@@ -75,13 +75,13 @@ class StreamOutput
75
75
  def test_error(group_name, test_name, error)
76
76
  @badness.add(group_name)
77
77
  @error_count += 1
78
- display_badness('error', group_name, test_name, error, true)
78
+ display_badness(group_name, test_name, error)
79
79
  end
80
80
 
81
81
  def assertion_failed(group_name, test_name, failure)
82
82
  @badness.add(group_name)
83
83
  @assertions_failed += 1
84
- display_badness('failure', group_name, test_name, failure, false)
84
+ display_badness(group_name, test_name, failure)
85
85
  end
86
86
 
87
87
  def assertion_passed(group_name, test_name)
@@ -89,18 +89,61 @@ class StreamOutput
89
89
  end
90
90
 
91
91
  private
92
- def display_badness(title, group_name, test_name, excpt, display_name)
92
+ def display_badness(group_name, test_name, excpt)
93
+ badness_type = if excpt.is_a?(DohTest::Failure) then :failure else :error end
93
94
  parser = DohTest::BacktraceParser.new(excpt.backtrace)
94
- warn "#{title} in #{group_name}.#{test_name}"
95
- badname = if display_name then "#{excpt.class}: " else '' end
96
- warn "=> #{badname}#{excpt}"
97
- # main_call = parser.relevant_stack.last
98
- # warn "=> #{main_call.first}:#{main_call.last}"
99
- # warn "=> #{parser.summary}"
95
+ warn "#{badness_type} in #{group_name}.#{test_name}"
96
+ if badness_type == :error
97
+ warn "#{excpt.class}: #{excpt}"
98
+ else
99
+ display_failure_message(excpt)
100
+ end
100
101
  parser.relevant_stack.each do |path, line|
101
- warn "=> #{path}:#{line}"
102
+ warn "#{path}:#{line}"
103
+ end
104
+ end
105
+
106
+ def display_failure_message(failure)
107
+ if failure.message.empty?
108
+ warn send("display_#{failure.assert}_failure", failure)
109
+ else
110
+ warn failure.message
111
+ end
112
+ end
113
+
114
+ def display_boolean_failure(failure)
115
+ "assertion failed"
116
+ end
117
+
118
+ def display_equal_failure(failure)
119
+ if (failure.expected.to_s.size + failure.actual.to_s.size) < 50
120
+ "expected: #{failure.expected}; actual: #{failure.actual}"
121
+ else
122
+ "\nexpected: #{failure.expected}\n actual: #{failure.actual}"
102
123
  end
103
124
  end
125
+
126
+ def display_raises_failure(failure)
127
+ if failure.actual
128
+ expected_str = if (failure.expected.size == 1) then failure.expected.first else "one of #{failure.expected.join(',')}" end
129
+ "expected: #{expected_str}; actual: #{failure.actual.class}: #{failure.actual.message}"
130
+ else
131
+ "expected: #{failure.expected}, but no exception was raised"
132
+ end
133
+ end
134
+
135
+ def display_instance_of_failure(failure)
136
+ "expected class: #{failure.expected}; actual: #{failure.actual}"
137
+ end
138
+
139
+ def display_match_failure(failure)
140
+ "expected regex #{failure.expected} to match str: #{failure.actual}"
141
+ end
142
+
143
+ def display_not_equal_failure(failure)
144
+ "expected unequal values; both are: #{failure.expected}"
145
+ end
146
+
104
147
  end
105
148
 
106
149
  end
@@ -1,5 +1,6 @@
1
+ require 'doh/root'; Doh::find_root_from_file
1
2
  require 'minitest/autorun'
2
- require_relative '../lib/doh/test/backtrace_parser'
3
+ require 'doh/test/backtrace_parser'
3
4
 
4
5
  module DohTest
5
6
 
@@ -0,0 +1,169 @@
1
+ require 'doh/root'; Doh::find_root_from_file
2
+ require 'minitest/autorun'
3
+ require 'doh/test/group_runner'
4
+ require 'doh/test/capture_output'
5
+
6
+ module DohTest
7
+
8
+ class TestGroupRunner < MiniTest::Unit::TestCase
9
+ def verify_event(expected_pairs, event)
10
+ expected_pairs.each_pair do |key, value|
11
+ assert_equal(value, event[key])
12
+ end
13
+ end
14
+
15
+ def run_group(group_klass, grepstr = nil)
16
+ @group_klass = group_klass
17
+ @output = CaptureOutput.new
18
+ config = if grepstr then {:grep => grepstr} else nil end
19
+ @runner = GroupRunner.new(@group_klass, @output, config)
20
+ @runner.run
21
+ @events = @output.events
22
+ assert_equal({:name => 'group_begin', :group_name => @group_klass.to_s}, @events.shift)
23
+ verify_event({:name => 'group_end', :group_name => @group_klass.to_s}, @events.last)
24
+ end
25
+
26
+
27
+ class EmptyTestGroup < DohTest::TestGroup; end
28
+ def test_empty_group
29
+ run_group(EmptyTestGroup)
30
+ assert_equal(1, @events.size)
31
+ assert_equal({:name => 'group_end', :group_name => EmptyTestGroup.to_s, :tests_ran => 0, :tests_skipped => 0, :assertions_passed => 0, :assertions_failed => 0}, @events.shift)
32
+ end
33
+
34
+ class SetupTeardownWithErrorGroup < DohTest::TestGroup
35
+ def initialize
36
+ @@ran_setup = @@ran_teardown = false
37
+ end
38
+
39
+ def setup
40
+ @@ran_setup = true
41
+ end
42
+
43
+ def teardown
44
+ @@ran_teardown = true
45
+ end
46
+
47
+ def test_just_an_error
48
+ raise "an error"
49
+ end
50
+ end
51
+
52
+ def test_setup_teardown_with_error
53
+ run_group(SetupTeardownWithErrorGroup)
54
+ assert_equal(4, @events.size)
55
+ assert_equal('test_begin', @events.shift[:name])
56
+ assert_equal('test_error', @events.shift[:name])
57
+ assert_equal('test_end', @events.shift[:name])
58
+ verify_event({:tests_ran => 1, :tests_skipped => 0, :assertions_passed => 0, :assertions_failed => 0}, @events.shift)
59
+ assert(@group_klass.class_variable_get(:@@ran_setup))
60
+ assert(@group_klass.class_variable_get(:@@ran_teardown))
61
+ end
62
+
63
+ class BeforeAfterWithErrorGroup < DohTest::TestGroup
64
+ def initialize
65
+ @@ran_before = @@ran_after = false
66
+ end
67
+
68
+ def before_each
69
+ @@ran_before = true
70
+ end
71
+
72
+ def after_each
73
+ @@ran_after = true
74
+ end
75
+
76
+ def test_just_an_error
77
+ raise "an error"
78
+ end
79
+ end
80
+
81
+ def test_before_after_with_error
82
+ run_group(BeforeAfterWithErrorGroup)
83
+ assert_equal(4, @events.size)
84
+ assert_equal('test_begin', @events.shift[:name])
85
+ assert_equal('test_error', @events.shift[:name])
86
+ assert_equal('test_end', @events.shift[:name])
87
+ verify_event({:tests_ran => 1, :tests_skipped => 0, :assertions_passed => 0, :assertions_failed => 0}, @events.shift)
88
+ assert(@group_klass.class_variable_get(:@@ran_before))
89
+ assert(@group_klass.class_variable_get(:@@ran_after))
90
+ end
91
+
92
+ class ErrorInBefore < DohTest::TestGroup
93
+ def initialize
94
+ @@ran_before = @@ran_test = @@ran_after = false
95
+ end
96
+
97
+ def before_each
98
+ @@ran_before = true
99
+ raise "blah"
100
+ end
101
+
102
+ def after_each
103
+ @@ran_after = true
104
+ end
105
+
106
+ def test_no_error
107
+ @@ran_test = true
108
+ end
109
+ end
110
+
111
+ def test_error_in_before
112
+ run_group(ErrorInBefore)
113
+ assert_equal(4, @events.size)
114
+ assert_equal('test_begin', @events.shift[:name])
115
+ assert_equal('test_error', @events.shift[:name])
116
+ assert_equal('test_end', @events.shift[:name])
117
+ verify_event({:tests_ran => 1, :tests_skipped => 0, :assertions_passed => 0, :assertions_failed => 0}, @events.shift)
118
+ assert(@group_klass.class_variable_get(:@@ran_before))
119
+ assert(!@group_klass.class_variable_get(:@@ran_test))
120
+ assert(@group_klass.class_variable_get(:@@ran_after))
121
+ end
122
+
123
+ class GreppingWithPass < DohTest::TestGroup
124
+ def test_blah
125
+ assert(true)
126
+ end
127
+ def test_blee
128
+ assert(true);assert(true)
129
+ end
130
+ def test_blahblah
131
+ assert(true);assert(true);assert(true)
132
+ end
133
+ def test_blahblee
134
+ assert(true);assert(true);assert(true);assert(true)
135
+ end
136
+ def test_blahbloo
137
+ assert(true);assert(true);assert(true);assert(true);assert(true)
138
+ end
139
+ end
140
+
141
+ def test_grepping_with_pass_no_grep
142
+ run_group(GreppingWithPass)
143
+ # group_end (1) + test_begin (5) + test_end (5) + assertion_passed (15)
144
+ assert_equal(26, @events.size)
145
+ verify_event({:tests_ran => 5, :tests_skipped => 0, :assertions_passed => 15, :assertions_failed => 0}, @events.last)
146
+ end
147
+
148
+ def test_grepping_with_pass_grep_blah
149
+ run_group(GreppingWithPass, 'blah')
150
+ verify_event({:tests_ran => 4, :tests_skipped => 1, :assertions_passed => 13, :assertions_failed => 0}, @events.last)
151
+ end
152
+
153
+ def test_grepping_with_pass_grep_blee
154
+ run_group(GreppingWithPass, 'blee')
155
+ verify_event({:tests_ran => 2, :tests_skipped => 3, :assertions_passed => 6, :assertions_failed => 0}, @events.last)
156
+ end
157
+
158
+ def test_grepping_with_pass_grep_bloo
159
+ run_group(GreppingWithPass, 'bloo')
160
+ verify_event({:tests_ran => 1, :tests_skipped => 4, :assertions_passed => 5, :assertions_failed => 0}, @events.last)
161
+ end
162
+
163
+ def test_grepping_with_pass_grep_zzz
164
+ run_group(GreppingWithPass, 'zzz')
165
+ verify_event({:tests_ran => 0, :tests_skipped => 5, :assertions_passed => 0, :assertions_failed => 0}, @events.last)
166
+ end
167
+ end
168
+
169
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dohtest
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 0.1.7
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,11 +10,11 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-03-01 00:00:00.000000000Z
13
+ date: 2012-03-14 00:00:00.000000000Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: dohroot
17
- requirement: &70365604410140 !ruby/object:Gem::Requirement
17
+ requirement: &70349766447240 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ! '>='
@@ -22,7 +22,7 @@ dependencies:
22
22
  version: 0.1.0
23
23
  type: :runtime
24
24
  prerelease: false
25
- version_requirements: *70365604410140
25
+ version_requirements: *70349766447240
26
26
  description: Minimalist unit test framework, easy to understand and extend.
27
27
  email:
28
28
  - devinfo@atpsoft.com
@@ -35,13 +35,16 @@ files:
35
35
  - bin/dohtest
36
36
  - lib/doh/test/assertions.rb
37
37
  - lib/doh/test/backtrace_parser.rb
38
+ - lib/doh/test/capture_output.rb
38
39
  - lib/doh/test/configure.rb
40
+ - lib/doh/test/failure.rb
39
41
  - lib/doh/test/group_runner.rb
40
42
  - lib/doh/test/master_runner.rb
41
43
  - lib/doh/test/require_paths.rb
42
44
  - lib/doh/test/stream_output.rb
43
45
  - lib/doh/test/test_group.rb
44
46
  - test/test_backtrace_parser.rb
47
+ - test/test_group_runner.rb
45
48
  - MIT-LICENSE
46
49
  homepage: https://github.com/atpsoft/dohtest
47
50
  licenses:
@@ -70,4 +73,5 @@ specification_version: 3
70
73
  summary: minimalist unit test framework
71
74
  test_files:
72
75
  - test/test_backtrace_parser.rb
76
+ - test/test_group_runner.rb
73
77
  has_rdoc: