qed 1.3 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.txt +647 -0
- data/HISTORY +16 -0
- data/bin/qedoc +2 -51
- data/demo/error.rdoc +21 -0
- data/demo/{03_site.qed → website.rdoc} +0 -0
- data/doc/qedoc/index.html +160 -69
- data/lib/qed.rb +2 -2
- data/lib/qed/advice.rb +61 -0
- data/lib/qed/advice/events.rb +54 -0
- data/lib/qed/advice/patterns.rb +64 -0
- data/lib/qed/command.rb +76 -65
- data/lib/qed/config.rb +48 -13
- data/lib/qed/evaluator.rb +124 -0
- data/lib/qed/reporter/base.rb +93 -39
- data/lib/qed/reporter/bullet.rb +79 -0
- data/lib/qed/reporter/dotprogress.rb +9 -29
- data/lib/qed/reporter/html.rb +61 -0
- data/lib/qed/reporter/verbatim.rb +41 -47
- data/lib/qed/scope.rb +77 -0
- data/lib/qed/script.rb +66 -399
- data/lib/qed/session.rb +95 -0
- data/lib/qedoc/command.rb +76 -0
- data/lib/{qed → qedoc}/document.rb +31 -22
- data/lib/{qed → qedoc}/document/jquery.js +0 -0
- data/lib/{qed → qedoc}/document/markup.rb +0 -0
- data/lib/{qed → qedoc}/document/template.rhtml +0 -0
- data/meta/requires +2 -0
- data/meta/version +1 -1
- metadata +71 -34
- data/Syckfile +0 -70
- data/demo/01_spec.qed +0 -175
- data/demo/02_err.qed +0 -18
- data/demo/data.txt +0 -1
- data/demo/helpers/sample.rb +0 -4
- data/demo/table.yml +0 -5
- data/lib/qed/extract.rb +0 -137
- data/lib/qed/reporter/ditto.rb +0 -72
- data/lib/qed/reporter/summary.rb +0 -68
- data/lib/qed/runner.rb +0 -198
- data/lib/qed/script1.rb +0 -495
@@ -0,0 +1,124 @@
|
|
1
|
+
module QED
|
2
|
+
|
3
|
+
require 'tilt'
|
4
|
+
require 'nokogiri'
|
5
|
+
require 'qed/scope'
|
6
|
+
|
7
|
+
# = Demo Script Evaluator
|
8
|
+
#
|
9
|
+
#--
|
10
|
+
# TODO: Currently the Evaluator class uses #travserse to work
|
11
|
+
# thru the HTML document and trigger events accordingly. This
|
12
|
+
# works well enough for simple HTML documents --the kind produced
|
13
|
+
# by typical wiki-markup formats. However, for complex HTML it
|
14
|
+
# it will not produce ideal output (although the code segements
|
15
|
+
# should still run just fine). To counter this weakness, we will
|
16
|
+
# have to swtich to a more complex SAX parser in the future.
|
17
|
+
#--
|
18
|
+
class Evaluator
|
19
|
+
|
20
|
+
#
|
21
|
+
def initialize(script, *observers)
|
22
|
+
@script = script
|
23
|
+
@file = script.file
|
24
|
+
@scope = script.scope
|
25
|
+
@root = script.root
|
26
|
+
|
27
|
+
@observers = observers
|
28
|
+
end
|
29
|
+
|
30
|
+
#
|
31
|
+
def run
|
32
|
+
Dir.chdir(File.dirname(@file)) do
|
33
|
+
advise!(:before_document, @script)
|
34
|
+
@root.traverse do |element|
|
35
|
+
call_tag(element)
|
36
|
+
end
|
37
|
+
advise!(:after_document, @script)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
#
|
42
|
+
def call_tag(element)
|
43
|
+
advise!(:tag, element)
|
44
|
+
__send__("tag_#{element.name}", element)
|
45
|
+
end
|
46
|
+
|
47
|
+
# T A G S
|
48
|
+
|
49
|
+
#
|
50
|
+
def tag_a(element)
|
51
|
+
case element['href']
|
52
|
+
when /qed:\/\/(.*?)$/
|
53
|
+
file = $1
|
54
|
+
case File.extname(file)
|
55
|
+
when '.rb'
|
56
|
+
import!(file)
|
57
|
+
else
|
58
|
+
Script.new(file, scope).run
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
#
|
64
|
+
def tag_pre(element)
|
65
|
+
advise!(:before_code, element, @file)
|
66
|
+
begin
|
67
|
+
eval(element.text, @scope.__binding__, @file, element.line)
|
68
|
+
pass!(element)
|
69
|
+
rescue Assertion => exception
|
70
|
+
fail!(element, exception)
|
71
|
+
rescue Exception => exception
|
72
|
+
error!(element, exception)
|
73
|
+
end
|
74
|
+
advise!(:after_code, element, @file)
|
75
|
+
end
|
76
|
+
|
77
|
+
#
|
78
|
+
def tag_p(element)
|
79
|
+
advise!(:when, element.text)
|
80
|
+
end
|
81
|
+
|
82
|
+
#
|
83
|
+
def method_missing(s, *a)
|
84
|
+
super(s, *a) unless /^tag/ =~ s.to_s
|
85
|
+
end
|
86
|
+
|
87
|
+
#
|
88
|
+
def pass!(element)
|
89
|
+
advise!(:pass, element)
|
90
|
+
end
|
91
|
+
|
92
|
+
#
|
93
|
+
def fail!(element, exception)
|
94
|
+
advise!(:fail, element, exception)
|
95
|
+
#raise exception
|
96
|
+
end
|
97
|
+
|
98
|
+
#
|
99
|
+
def error!(element, exception)
|
100
|
+
advise!(:error, element, exception)
|
101
|
+
#raise exception
|
102
|
+
end
|
103
|
+
|
104
|
+
#
|
105
|
+
def import!(file)
|
106
|
+
advise!(:unload)
|
107
|
+
eval(File.read(file), @scope.__binding__, file)
|
108
|
+
advise!(:load, file)
|
109
|
+
end
|
110
|
+
|
111
|
+
#
|
112
|
+
def advise!(signal, *args)
|
113
|
+
@observers.each{ |o| o.update(signal, *args) }
|
114
|
+
@scope.__advice__.call(signal, *args)
|
115
|
+
end
|
116
|
+
|
117
|
+
#
|
118
|
+
#def advise_when!(match)
|
119
|
+
# @scope.__advice__.call_when(match)
|
120
|
+
#end
|
121
|
+
|
122
|
+
end
|
123
|
+
|
124
|
+
end
|
data/lib/qed/reporter/base.rb
CHANGED
@@ -6,99 +6,153 @@ module Reporter
|
|
6
6
|
|
7
7
|
# = Reporter BaseClass
|
8
8
|
#
|
9
|
-
# Serves as the base class for all other
|
10
|
-
# output formats.
|
9
|
+
# Serves as the base class for all other output formats.
|
11
10
|
#
|
12
11
|
class BaseClass
|
13
12
|
|
14
|
-
ANSICode = ANSI::Code
|
15
|
-
|
16
13
|
attr :io
|
17
14
|
attr :steps
|
15
|
+
attr :omit
|
18
16
|
attr :pass
|
19
17
|
attr :fail
|
20
18
|
attr :error
|
21
19
|
|
22
20
|
def initialize(options={})
|
23
|
-
@io
|
24
|
-
@
|
21
|
+
@io = options[:io] || STDOUT
|
22
|
+
@trace = options[:trace]
|
25
23
|
|
26
24
|
@demos = 0
|
27
25
|
@steps = 0
|
26
|
+
@omit = []
|
28
27
|
@pass = []
|
29
28
|
@fail = []
|
30
29
|
@error = []
|
31
30
|
end
|
32
31
|
|
33
32
|
#
|
34
|
-
def
|
35
|
-
@
|
33
|
+
def trace?
|
34
|
+
@trace
|
36
35
|
end
|
37
36
|
|
38
|
-
#
|
39
|
-
def
|
37
|
+
#
|
38
|
+
def update(type, *args)
|
39
|
+
__send__("#{type}", *args)
|
40
40
|
end
|
41
41
|
|
42
|
-
|
43
|
-
def
|
44
|
-
|
42
|
+
|
43
|
+
def self.When(type, &block)
|
44
|
+
#raise ArgumentError unless %w{session demo demonstration step}.include?(type.to_s)
|
45
|
+
#type = :demonstration if type.to_s == 'demo'
|
46
|
+
define_method(type, &block)
|
45
47
|
end
|
46
48
|
|
47
|
-
|
48
|
-
|
49
|
+
def self.Before(type, &block)
|
50
|
+
# raise ArgumentError unless %w{session demo demonstration step}.include?(type.to_s)
|
51
|
+
# type = :demonstration if type.to_s == 'demo'
|
52
|
+
define_method("before_#{type}", &block)
|
49
53
|
end
|
50
54
|
|
51
|
-
|
52
|
-
|
55
|
+
def self.After(type, &block)
|
56
|
+
# raise ArgumentError unless %w{session demo demonstration step pass fail error}.include?(type.to_s)
|
57
|
+
# type = :demonstration if type.to_s == 'demo'
|
58
|
+
define_method("after_#{type}", &block)
|
53
59
|
end
|
54
60
|
|
55
|
-
#
|
56
|
-
#def
|
57
|
-
#
|
61
|
+
#
|
62
|
+
#def Before(type, target, *args)
|
63
|
+
# type = :demonstration if type.to_s == 'demo'
|
64
|
+
# __send__("before_#{type}", target, *args)
|
65
|
+
#end
|
66
|
+
|
67
|
+
#
|
68
|
+
#def After(type, target, *args)
|
69
|
+
# type = :demonstration if type.to_s == 'demo'
|
70
|
+
# __send__("after_#{type}", target, *args)
|
58
71
|
#end
|
59
72
|
|
73
|
+
# At the start of a session, before running any demonstrations.
|
74
|
+
def before_session(session)
|
75
|
+
end
|
76
|
+
|
77
|
+
# Beginning of a demonstration.
|
78
|
+
def before_document(demo) #demo(demo)
|
79
|
+
@demos += 1
|
80
|
+
end
|
81
|
+
|
82
|
+
#
|
83
|
+
def tag(element)
|
84
|
+
end
|
85
|
+
|
86
|
+
#
|
87
|
+
def load(demo)
|
88
|
+
end
|
89
|
+
#
|
90
|
+
def import(file)
|
91
|
+
end
|
92
|
+
|
60
93
|
# Before running a step.
|
61
|
-
def
|
94
|
+
def element(step)
|
95
|
+
end
|
96
|
+
|
97
|
+
def comment(elem)
|
98
|
+
end
|
99
|
+
|
100
|
+
# Before running a step that is omitted.
|
101
|
+
#def omit_step(step)
|
102
|
+
# @omit << step
|
103
|
+
#end
|
104
|
+
|
105
|
+
#
|
106
|
+
def before_code(step, file)
|
62
107
|
@steps += 1
|
63
108
|
end
|
64
109
|
|
65
|
-
#
|
66
|
-
def
|
110
|
+
# After running a step that passed.
|
111
|
+
def pass(step)
|
67
112
|
@pass << step
|
68
113
|
end
|
69
114
|
|
70
|
-
#
|
71
|
-
def
|
115
|
+
# After running a step that failed.
|
116
|
+
def fail(step, assertion)
|
72
117
|
@fail << [step, assertion]
|
73
118
|
end
|
74
119
|
|
75
|
-
#
|
76
|
-
def
|
120
|
+
# After running a step that raised an error.
|
121
|
+
def error(step, exception)
|
77
122
|
raise exception if $DEBUG
|
78
123
|
@error << [step, exception]
|
79
124
|
end
|
80
125
|
|
81
|
-
# Since regular macro step does not pass or fail,
|
82
|
-
# this method is used instead.
|
83
126
|
#
|
84
|
-
|
85
|
-
def report_macro(step)
|
127
|
+
def after_code(step, file)
|
86
128
|
end
|
87
129
|
|
88
|
-
#
|
89
|
-
def
|
130
|
+
#
|
131
|
+
def after_element(elem)
|
90
132
|
end
|
91
133
|
|
92
|
-
#
|
93
|
-
def
|
134
|
+
#
|
135
|
+
def unload
|
94
136
|
end
|
95
137
|
|
96
|
-
# End of a
|
97
|
-
def
|
138
|
+
# End of a demonstration.
|
139
|
+
def after_document(demo) #demo(demo)
|
98
140
|
end
|
99
141
|
|
100
|
-
# After running all
|
101
|
-
|
142
|
+
# After running all demonstrations. This is the place
|
143
|
+
# to output a summary of the session, if applicable.
|
144
|
+
def after_session(session)
|
145
|
+
end
|
146
|
+
|
147
|
+
#
|
148
|
+
def when(*args)
|
149
|
+
end
|
150
|
+
|
151
|
+
private
|
152
|
+
|
153
|
+
#
|
154
|
+
def clean_backtrace(btrace)
|
155
|
+
btrace.chomp(":in \`__binding__'")
|
102
156
|
end
|
103
157
|
|
104
158
|
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
module QED
|
2
|
+
module Reporter #:nodoc:
|
3
|
+
|
4
|
+
require 'qed/reporter/base'
|
5
|
+
|
6
|
+
# = Bullet Point Reporter
|
7
|
+
#
|
8
|
+
# Similar to the Verbatim reporter, but does
|
9
|
+
# not display test code for passing tests.
|
10
|
+
class BulletPoint < BaseClass
|
11
|
+
|
12
|
+
#
|
13
|
+
def tag(step)
|
14
|
+
case step.name
|
15
|
+
when 'pre'
|
16
|
+
# none
|
17
|
+
when /h\d/
|
18
|
+
io.puts ANSI::Code.bold("#{step.text}\n")
|
19
|
+
when 'p'
|
20
|
+
txt = step.text.to_s.strip.tabto(2)
|
21
|
+
txt[0,1] = "*"
|
22
|
+
io.puts txt
|
23
|
+
io.puts
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def pass(step)
|
28
|
+
#io.puts ANSICode.green("#{step}")
|
29
|
+
end
|
30
|
+
|
31
|
+
def fail(step, assertion)
|
32
|
+
msg = ''
|
33
|
+
msg << " ##### FAIL #####\n"
|
34
|
+
msg << " # " + assertion.to_s
|
35
|
+
msg = ANSI::Code.magenta(msg)
|
36
|
+
io.puts msg
|
37
|
+
#io.puts
|
38
|
+
io.puts ANSI::Code.red("#{step.text}")
|
39
|
+
end
|
40
|
+
|
41
|
+
def error(step, exception)
|
42
|
+
raise exception if $DEBUG
|
43
|
+
msg = ''
|
44
|
+
msg << " ##### ERROR #####\n"
|
45
|
+
msg << " # " + exception.to_s + "\n"
|
46
|
+
msg << " # " + clean_backtrace(exception.backtrace[0])
|
47
|
+
msg = ANSI::Code.magenta(msg)
|
48
|
+
io.puts msg
|
49
|
+
#io.puts
|
50
|
+
io.puts ANSI::Code.red("#{step.text}")
|
51
|
+
end
|
52
|
+
|
53
|
+
#def report(str)
|
54
|
+
# count[-1] += 1 unless count.empty?
|
55
|
+
# str = str.chomp('.') + '.'
|
56
|
+
# str = count.join('.') + ' ' + str
|
57
|
+
# io.puts str.strip
|
58
|
+
#end
|
59
|
+
|
60
|
+
#def report_comment(step)
|
61
|
+
# txt = step.to_s.strip.tabto(2)
|
62
|
+
# txt[0,1] = "*"
|
63
|
+
# io.puts txt
|
64
|
+
# io.puts
|
65
|
+
#end
|
66
|
+
|
67
|
+
#def report_macro(step)
|
68
|
+
# txt = step.to_s.tabto(2)
|
69
|
+
# txt[0,1] = "*"
|
70
|
+
# io.puts txt
|
71
|
+
# #io.puts
|
72
|
+
# #io.puts ANSICode.magenta("#{step}")
|
73
|
+
#end
|
74
|
+
|
75
|
+
end #class Summary
|
76
|
+
|
77
|
+
end#module Reporter
|
78
|
+
end#module QED
|
79
|
+
|
@@ -8,37 +8,24 @@ module Reporter #:nodoc:
|
|
8
8
|
class DotProgress < BaseClass
|
9
9
|
|
10
10
|
#
|
11
|
-
def
|
11
|
+
def before_session(session)
|
12
12
|
@start_time = Time.now
|
13
13
|
io.puts "Started"
|
14
14
|
end
|
15
15
|
|
16
16
|
#
|
17
|
-
def
|
18
|
-
super
|
19
|
-
|
20
|
-
io.print "."
|
21
|
-
#str = "(%s) %s" % [count.join('.'), str.tab(6).strip]
|
22
|
-
#puts "* #{step.text.tab(2).strip}"
|
23
|
-
#puts "\n#{step.code}\n" if $VERBOSE
|
24
|
-
#else
|
25
|
-
#puts "\n#{step.text}"
|
26
|
-
#end
|
17
|
+
def before_code(step, file)
|
18
|
+
super(step, file)
|
19
|
+
io.print "." if step.name == 'pre'
|
27
20
|
end
|
28
21
|
|
29
|
-
#
|
30
|
-
|
31
|
-
# str = str.chomp('.') + '.'
|
32
|
-
# str = count.join('.') + ' ' + str
|
33
|
-
# puts str.strip
|
34
|
-
#end
|
35
|
-
|
36
|
-
def report_summary
|
22
|
+
#
|
23
|
+
def after_session(session)
|
37
24
|
io.puts "\nFinished in #{Time.now - @start_time} seconds.\n\n"
|
38
25
|
|
39
26
|
@error.each do |step, exception|
|
40
27
|
backtrace = clean_backtrace(exception.backtrace[0])
|
41
|
-
io.puts
|
28
|
+
io.puts ANSI::Code.red("***** ERROR *****")
|
42
29
|
io.puts "#{exception}"
|
43
30
|
io.puts ":#{backtrace}:"
|
44
31
|
#io.puts ":#{exception.backtrace[1]}:"
|
@@ -48,8 +35,8 @@ module Reporter #:nodoc:
|
|
48
35
|
|
49
36
|
@fail.each do |step, assertion|
|
50
37
|
backtrace = clean_backtrace(assertion.backtrace[0])
|
51
|
-
io.puts
|
52
|
-
io.puts
|
38
|
+
io.puts ANSI::Code.red("***** FAIL *****")
|
39
|
+
io.puts ANSI::Code.bold("#{assertion}")
|
53
40
|
io.puts ":#{backtrace}:"
|
54
41
|
#io.puts assertion if $VERBOSE
|
55
42
|
io.puts
|
@@ -58,13 +45,6 @@ module Reporter #:nodoc:
|
|
58
45
|
io.puts "%s demos, %s steps, %s failures, %s errors" % [@demos, @steps, @fail.size, @error.size] #, @pass.size ]
|
59
46
|
end
|
60
47
|
|
61
|
-
private
|
62
|
-
|
63
|
-
#
|
64
|
-
def clean_backtrace(btrace)
|
65
|
-
btrace.chomp(":in `_binding'")
|
66
|
-
end
|
67
|
-
|
68
48
|
end#class DotProgress
|
69
49
|
|
70
50
|
end#module Reporter
|