-
Notifications
You must be signed in to change notification settings - Fork 111
/
cucumber.rb
127 lines (103 loc) · 2.94 KB
/
cucumber.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
# Copyright (c) 2006-2012 Nick Sieger <nicksieger@gmail.com>
# See the file LICENSE.txt included with the distribution for
# software license details.
require 'ci/reporter/core'
require 'cucumber'
begin
require 'cucumber/ast/visitor'
rescue LoadError
end
module CI
module Reporter
class CucumberFailure
attr_reader :step
def initialize(step)
@step = step
end
def failure?
true
end
def error?
!failure?
end
def name
step.exception.class.name
end
def message
step.exception.message
end
def location
step.exception.backtrace.join("\n")
end
end
class Cucumber
attr_accessor :report_manager, :test_suite, :name
def initialize(step_mother, io, options)
@report_manager = ReportManager.new("features")
end
def before_feature(feature)
self.test_suite = TestSuite.new(@name)
test_suite.start
end
def after_feature(feature)
test_suite.name = @name
test_suite.finish
report_manager.write_report(@test_suite)
@test_suite = nil
end
def before_background(*args)
end
def after_background(*args)
end
def feature_name(keyword, name)
@name = (name || "Unnamed feature").split("\n").first
end
def scenario_name(keyword, name, *args)
@scenario = (name || "Unnamed scenario").split("\n").first
end
def before_steps(steps)
@test_case = TestCase.new(@scenario)
@test_case.start
end
def after_steps(steps)
@test_case.finish
case steps.status
when :pending, :undefined
@test_case.name = "#{@test_case.name} (PENDING)"
when :skipped
@test_case.name = "#{@test_case.name} (SKIPPED)"
when :failed
@test_case.failures << CucumberFailure.new(steps)
end
test_suite.testcases << @test_case
@test_case = nil
end
def before_examples(*args)
@header_row = true
end
def after_examples(*args)
end
def before_table_row(table_row)
row = table_row # shorthand for table_row
# check multiple versions of the row and try to find the best fit
outline = (row.respond_to? :name) ? row.name :
(row.respond_to? :scenario_outline) ? row.scenario_outline :
row.to_s
@test_case = TestCase.new("#@scenario (outline: #{outline})")
@test_case.start
end
def after_table_row(table_row)
if @header_row
@header_row = false
return
end
@test_case.finish
if table_row.respond_to? :failed?
@test_case.failures << CucumberFailure.new(table_row) if table_row.failed?
test_suite.testcases << @test_case
@test_case = nil
end
end
end
end
end