-
Notifications
You must be signed in to change notification settings - Fork 103
/
testresult.rb
132 lines (114 loc) · 3.2 KB
/
testresult.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#--
# Author:: Nathaniel Talbott.
# Copyright:: Copyright (c) 2000-2002 Nathaniel Talbott. All rights reserved.
# License:: Ruby license.
require 'test/unit/util/observable'
require 'test/unit/failure'
require 'test/unit/error'
require 'test/unit/omission'
require 'test/unit/pending'
require 'test/unit/notification'
module Test
module Unit
module NullResultContainerInitializer
private
def initialize_containers
end
end
# Collects Test::Unit::Failure and Test::Unit::Error so that
# they can be displayed to the user. To this end, observers
# can be added to it, allowing the dynamic updating of, say, a
# UI.
class TestResult
include Util::Observable
include NullResultContainerInitializer
include TestResultFailureSupport
include TestResultErrorSupport
include TestResultPendingSupport
include TestResultOmissionSupport
include TestResultNotificationSupport
FINISHED = name + "::FINISHED"
CHANGED = name + "::CHANGED"
PASS_ASSERTION = name + "::PASS_ASSERTION"
FAULT = name + "::FAULT"
attr_reader :run_count, :pass_count, :assertion_count, :faults
attr_accessor :stop_tag
# Constructs a new, empty TestResult.
def initialize
@run_count, @pass_count, @assertion_count = 0, 0, 0
@summary_generators = []
@problem_checkers = []
@faults = []
@stop_tag = nil
initialize_containers
end
# Records a test run.
def add_run
@run_count += 1
notify_listeners(FINISHED, self)
notify_changed
end
def add_pass
@pass_count += 1
end
# Records an individual assertion.
def add_assertion
@assertion_count += 1
notify_listeners(PASS_ASSERTION, self)
notify_changed
end
# Returns a string contain the recorded runs, assertions,
# failures and errors in this TestResult.
def summary
["#{run_count} tests",
"#{assertion_count} assertions",
*@summary_generators.collect {|generator| __send__(generator)}].join(", ")
end
# Returnes a string that shows result status.
def status
if passed?
if pending_count > 0
"pending"
elsif omission_count > 0
"omission"
elsif notification_count > 0
"notification"
else
"pass"
end
elsif error_count > 0
"error"
elsif failure_count > 0
"failure"
end
end
def stop
throw @stop_tag
end
def to_s
summary
end
# Returns whether or not this TestResult represents
# successful completion.
def passed?
@problem_checkers.all? {|checker| not __send__(checker)}
end
def pass_percentage
n_tests = @run_count - omission_count
if n_tests.zero?
0
else
100.0 * (@pass_count / n_tests.to_f)
end
end
private
def notify_changed
notify_listeners(CHANGED, self)
end
def notify_fault(fault)
@faults << fault
notify_listeners(FAULT, fault)
end
end
end
end