dohtest 0.1.6 → 0.1.7

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: