tap-test 0.2.0 → 0.3.0
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.
- data/History +4 -0
- data/MIT-LICENSE +17 -18
- data/README +2 -5
- data/lib/tap/test.rb +5 -0
- data/lib/tap/test/shell_test.rb +93 -45
- data/lib/tap/test/shell_test/class_methods.rb +4 -1
- data/lib/tap/test/shell_test/regexp_escape.rb +88 -0
- data/lib/tap/test/subset_test.rb +1 -1
- data/lib/tap/test/tap_test.rb +13 -5
- data/lib/tap/test/version.rb +9 -0
- metadata +9 -5
data/History
CHANGED
data/MIT-LICENSE
CHANGED
|
@@ -1,22 +1,21 @@
|
|
|
1
1
|
Copyright (c) 2009, Regents of the University of Colorado.
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
obtaining a copy of this software and associated documentation
|
|
5
|
-
files (the "Software"), to deal in the Software without
|
|
6
|
-
restriction, including without limitation the rights to use,
|
|
7
|
-
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
8
|
-
copies of the Software, and to permit persons to whom the
|
|
9
|
-
Software is furnished to do so, subject to the following
|
|
10
|
-
conditions:
|
|
3
|
+
Copyright (c) 2009, Simon Chiang.
|
|
11
4
|
|
|
12
|
-
|
|
13
|
-
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
14
11
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
data/README
CHANGED
|
@@ -18,7 +18,6 @@ test modules into other test frameworks.
|
|
|
18
18
|
documentation, development, and bug tracking.
|
|
19
19
|
|
|
20
20
|
* Website[http://tap.rubyforge.org]
|
|
21
|
-
* Lighthouse[http://bahuvrihi.lighthouseapp.com/projects/9908-tap-task-application/tickets]
|
|
22
21
|
* Github[http://github.com/bahuvrihi/tap/tree/master]
|
|
23
22
|
* {Google Group}[http://groups.google.com/group/ruby-on-tap]
|
|
24
23
|
|
|
@@ -111,13 +110,11 @@ Sets up Tap::App.instance for testing tasks.
|
|
|
111
110
|
|
|
112
111
|
== Installation
|
|
113
112
|
|
|
114
|
-
Tap-Test is available as a gem on
|
|
113
|
+
Tap-Test is available as a gem on Gemcutter[http://gemcutter.org/gems/tap-test].
|
|
115
114
|
|
|
116
115
|
% gem install tap-test
|
|
117
116
|
|
|
118
117
|
== Info
|
|
119
118
|
|
|
120
|
-
|
|
121
|
-
Developer:: {Simon Chiang}[http://bahuvrihi.wordpress.com], {Biomolecular Structure Program}[http://biomol.uchsc.edu/], {Hansen Lab}[http://hsc-proteomics.uchsc.edu/hansenlab/]
|
|
122
|
-
Support:: CU Denver School of Medicine Deans Academic Enrichment Fund
|
|
119
|
+
Developer:: {Simon Chiang}[http://bahuvrihi.wordpress.com]
|
|
123
120
|
License:: {MIT-Style}[link:files/MIT-LICENSE.html]
|
data/lib/tap/test.rb
CHANGED
data/lib/tap/test/shell_test.rb
CHANGED
|
@@ -1,22 +1,5 @@
|
|
|
1
|
-
if RUBY_PLATFORM =~ /mswin32/
|
|
2
|
-
begin
|
|
3
|
-
require 'rubygems'
|
|
4
|
-
require 'win32/open3'
|
|
5
|
-
rescue(LoadError)
|
|
6
|
-
puts %q{
|
|
7
|
-
Tap:Test::ShellTest requires the win32-open3 gem on Windows.
|
|
8
|
-
Use this command and try again:
|
|
9
|
-
|
|
10
|
-
% gem install win32-open3
|
|
11
|
-
|
|
12
|
-
}
|
|
13
|
-
raise
|
|
14
|
-
end
|
|
15
|
-
else
|
|
16
|
-
require 'open3'
|
|
17
|
-
end
|
|
18
|
-
|
|
19
1
|
require 'tap/test/shell_test/class_methods'
|
|
2
|
+
require 'tap/test/shell_test/regexp_escape'
|
|
20
3
|
|
|
21
4
|
module Tap
|
|
22
5
|
module Test
|
|
@@ -67,19 +50,25 @@ module Tap
|
|
|
67
50
|
# setup in an including module.
|
|
68
51
|
def setup
|
|
69
52
|
super
|
|
70
|
-
@
|
|
53
|
+
@notify_method_name = true
|
|
71
54
|
end
|
|
72
55
|
|
|
73
56
|
# Returns true if the ENV variable 'VERBOSE' is true. When verbose,
|
|
74
57
|
# ShellTest prints the expanded commands of sh_test to $stdout.
|
|
75
58
|
def verbose?
|
|
76
|
-
ENV['VERBOSE']
|
|
59
|
+
verbose = ENV['VERBOSE']
|
|
60
|
+
verbose && verbose =~ /^true$/i ? true : false
|
|
77
61
|
end
|
|
78
62
|
|
|
79
63
|
# Returns true if the ENV variable 'QUIET' is true. When quiet,
|
|
80
64
|
# ShellTest does not print any extra information to $stdout.
|
|
65
|
+
#
|
|
66
|
+
# If 'VERBOSE' and 'QUIET' are both set, verbose wins.
|
|
81
67
|
def quiet?
|
|
82
|
-
|
|
68
|
+
return false if verbose?
|
|
69
|
+
|
|
70
|
+
quiet = ENV['QUIET']
|
|
71
|
+
quiet && quiet =~ /^true$/i ? true : false
|
|
83
72
|
end
|
|
84
73
|
|
|
85
74
|
# Sets the specified ENV variables for the duration of the block.
|
|
@@ -115,11 +104,30 @@ module Tap
|
|
|
115
104
|
#
|
|
116
105
|
# % gem install win32-open3
|
|
117
106
|
#
|
|
118
|
-
def sh(cmd)
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
107
|
+
def sh(cmd, options={})
|
|
108
|
+
if @notify_method_name && !quiet?
|
|
109
|
+
@notify_method_name = false
|
|
110
|
+
puts
|
|
111
|
+
puts method_name
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
original_cmd = cmd
|
|
115
|
+
if cmd_pattern = options[:cmd_pattern]
|
|
116
|
+
cmd = cmd.sub(cmd_pattern, options[:cmd].to_s)
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
start = Time.now
|
|
120
|
+
result = with_env(options[:env], options[:replace_env]) do
|
|
121
|
+
IO.popen(cmd) do |io|
|
|
122
|
+
yield(io) if block_given?
|
|
123
|
+
io.read
|
|
124
|
+
end
|
|
122
125
|
end
|
|
126
|
+
|
|
127
|
+
finish = Time.now
|
|
128
|
+
elapsed = "%.3f" % [finish-start]
|
|
129
|
+
puts " (#{elapsed}s) #{verbose? ? cmd : original_cmd}" unless quiet?
|
|
130
|
+
result
|
|
123
131
|
end
|
|
124
132
|
|
|
125
133
|
# Peforms a shell test. Shell tests execute the command and yield the
|
|
@@ -171,29 +179,24 @@ module Tap
|
|
|
171
179
|
def sh_test(cmd, options={})
|
|
172
180
|
options = sh_test_options.merge(options)
|
|
173
181
|
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
puts method_name
|
|
178
|
-
end
|
|
182
|
+
cmd, expected = cmd.lstrip.split(/^/, 2)
|
|
183
|
+
cmd.strip!
|
|
184
|
+
result = sh(cmd, options)
|
|
179
185
|
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
+
assert_equal(expected, result, cmd) if expected
|
|
187
|
+
yield(result) if block_given?
|
|
188
|
+
result
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
def sh_match(cmd, *regexps)
|
|
186
192
|
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
193
|
+
options = regexps.last.kind_of?(Hash) ? regexps.pop : {}
|
|
194
|
+
options = sh_test_options.merge(options)
|
|
195
|
+
result = sh(cmd, options)
|
|
196
|
+
|
|
197
|
+
regexps.each do |regexp|
|
|
198
|
+
assert_match regexp, result, cmd
|
|
190
199
|
end
|
|
191
|
-
finish = Time.now
|
|
192
|
-
|
|
193
|
-
elapsed = "%.3f" % [finish-start]
|
|
194
|
-
puts " (#{elapsed}s) #{verbose? ? cmd : original_cmd}" unless quiet?
|
|
195
|
-
|
|
196
|
-
assert_equal(expected, result, cmd) if expected
|
|
197
200
|
yield(result) if block_given?
|
|
198
201
|
result
|
|
199
202
|
end
|
|
@@ -203,6 +206,51 @@ module Tap
|
|
|
203
206
|
def sh_test_options
|
|
204
207
|
self.class.sh_test_options
|
|
205
208
|
end
|
|
209
|
+
|
|
210
|
+
def assert_output_equal(a, b, msg=nil)
|
|
211
|
+
a = a[1..-1] if a[0] == ?\n
|
|
212
|
+
if a == b
|
|
213
|
+
assert true
|
|
214
|
+
else
|
|
215
|
+
flunk %Q{
|
|
216
|
+
#{msg}
|
|
217
|
+
==================== expected output ====================
|
|
218
|
+
#{whitespace_escape(a)}
|
|
219
|
+
======================== but was ========================
|
|
220
|
+
#{whitespace_escape(b)}
|
|
221
|
+
=========================================================
|
|
222
|
+
}
|
|
223
|
+
end
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
def assert_alike(a, b, msg=nil)
|
|
227
|
+
if b =~ a
|
|
228
|
+
assert true
|
|
229
|
+
else
|
|
230
|
+
flunk %Q{
|
|
231
|
+
#{msg}
|
|
232
|
+
================= expected output like ==================
|
|
233
|
+
#{whitespace_escape(a)}
|
|
234
|
+
======================== but was ========================
|
|
235
|
+
#{whitespace_escape(b)}
|
|
236
|
+
=========================================================
|
|
237
|
+
}
|
|
238
|
+
end
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
private
|
|
242
|
+
|
|
243
|
+
def whitespace_escape(str)
|
|
244
|
+
str.to_s.gsub(/\s/) do |match|
|
|
245
|
+
case match
|
|
246
|
+
when "\n" then "\\n\n"
|
|
247
|
+
when "\t" then "\\t"
|
|
248
|
+
when "\r" then "\\r"
|
|
249
|
+
when "\f" then "\\f"
|
|
250
|
+
else match
|
|
251
|
+
end
|
|
252
|
+
end
|
|
253
|
+
end
|
|
206
254
|
end
|
|
207
255
|
end
|
|
208
256
|
end
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
module Tap
|
|
2
|
+
module Test
|
|
3
|
+
module ShellTest
|
|
4
|
+
# RegexpEscape is a subclass of regexp that escapes all but the text in a
|
|
5
|
+
# special escape sequence. This allows the creation of complex regexps
|
|
6
|
+
# to match, for instance, console output.
|
|
7
|
+
#
|
|
8
|
+
# The RegexpEscape.escape (or equivalently the quote) method does the
|
|
9
|
+
# work; all regexp-active characters are escaped except for characters
|
|
10
|
+
# enclosed by ':.' and '.:' delimiters.
|
|
11
|
+
#
|
|
12
|
+
# RegexpEscape.escape('reg[exp]+ chars. are(quoted)') # => 'reg\[exp\]\+\ chars\.\ are\(quoted\)'
|
|
13
|
+
# RegexpEscape.escape('these are not: :.a(b*)c.:') # => 'these\ are\ not:\ a(b*)c'
|
|
14
|
+
#
|
|
15
|
+
# In addition, all-period regexps are automatically upgraded to '.*?';
|
|
16
|
+
# use the '.{n}' notation to specify n arbitrary characters.
|
|
17
|
+
#
|
|
18
|
+
# RegexpEscape.escape('_:..:_:...:_:....:') # => '_.*?_.*?_.*?'
|
|
19
|
+
# RegexpEscape.escape(':..{1}.:') # => '.{1}'
|
|
20
|
+
#
|
|
21
|
+
# RegexpEscape instances are initialized using the escaped input string
|
|
22
|
+
# and return the original string upon to_s.
|
|
23
|
+
#
|
|
24
|
+
# str = %q{
|
|
25
|
+
# a multiline
|
|
26
|
+
# :...:
|
|
27
|
+
# example}
|
|
28
|
+
# r = RegexpEscape.new(str)
|
|
29
|
+
#
|
|
30
|
+
# r =~ %q{
|
|
31
|
+
# a multiline
|
|
32
|
+
# matching
|
|
33
|
+
# example} # => true
|
|
34
|
+
#
|
|
35
|
+
# r !~ %q{
|
|
36
|
+
# a failing multiline
|
|
37
|
+
# example} # => true
|
|
38
|
+
#
|
|
39
|
+
# r.to_s # => str
|
|
40
|
+
#
|
|
41
|
+
class RegexpEscape < Regexp
|
|
42
|
+
|
|
43
|
+
# matches the escape sequence
|
|
44
|
+
ESCAPE_SEQUENCE = /:\..*?\.:/
|
|
45
|
+
|
|
46
|
+
class << self
|
|
47
|
+
|
|
48
|
+
# Escapes regexp-active characters in str, except for character
|
|
49
|
+
# delimited by ':.' and '.:'. See the class description for
|
|
50
|
+
# details.
|
|
51
|
+
def escape(str)
|
|
52
|
+
substituents = []
|
|
53
|
+
str.scan(ESCAPE_SEQUENCE) do
|
|
54
|
+
regexp_str = $&[2...-2]
|
|
55
|
+
regexp_str = ".*?" if regexp_str =~ /^\.*$/
|
|
56
|
+
substituents << regexp_str
|
|
57
|
+
end
|
|
58
|
+
substituents << ""
|
|
59
|
+
|
|
60
|
+
splits = str.split(ESCAPE_SEQUENCE).collect do |split|
|
|
61
|
+
super(split)
|
|
62
|
+
end
|
|
63
|
+
splits << "" if splits.empty?
|
|
64
|
+
|
|
65
|
+
splits.zip(substituents).to_a.flatten.join
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# Same as escape.
|
|
69
|
+
def quote(str)
|
|
70
|
+
escape(str)
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# Generates a new RegexpEscape by escaping the str, using the same
|
|
75
|
+
# options as Regexp.
|
|
76
|
+
def initialize(str, *options)
|
|
77
|
+
super(RegexpEscape.escape(str), *options)
|
|
78
|
+
@original_str = str
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# Returns the original string for self
|
|
82
|
+
def to_s
|
|
83
|
+
@original_str
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
data/lib/tap/test/subset_test.rb
CHANGED
data/lib/tap/test/tap_test.rb
CHANGED
|
@@ -3,18 +3,26 @@ require 'tap/app'
|
|
|
3
3
|
module Tap
|
|
4
4
|
module Test
|
|
5
5
|
|
|
6
|
-
#
|
|
7
|
-
#
|
|
6
|
+
# Sets up and tears down Tap::App.instance. This prevents tests that modify
|
|
7
|
+
# either from inadvertently conflicting with one another.
|
|
8
8
|
module TapTest
|
|
9
9
|
|
|
10
10
|
# The test specific app
|
|
11
11
|
attr_reader :app
|
|
12
|
-
|
|
12
|
+
|
|
13
13
|
def setup
|
|
14
14
|
super
|
|
15
|
-
|
|
15
|
+
Tap::App.instance = @app = Tap::App.new(app_config)
|
|
16
16
|
end
|
|
17
|
-
|
|
17
|
+
|
|
18
|
+
def env_config
|
|
19
|
+
{:gems => :none, :root => @method_root || Dir.pwd}
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def app_config
|
|
23
|
+
{:debug => true, :quiet => true, :env => Tap::Env.new(env_config)}
|
|
24
|
+
end
|
|
25
|
+
|
|
18
26
|
def teardown
|
|
19
27
|
Tap::App.instance = nil
|
|
20
28
|
super
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: tap-test
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.3.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Simon Chiang
|
|
@@ -9,7 +9,7 @@ autorequire:
|
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
11
|
|
|
12
|
-
date: 2009-
|
|
12
|
+
date: 2009-12-05 00:00:00 -07:00
|
|
13
13
|
default_executable:
|
|
14
14
|
dependencies:
|
|
15
15
|
- !ruby/object:Gem::Dependency
|
|
@@ -20,7 +20,7 @@ dependencies:
|
|
|
20
20
|
requirements:
|
|
21
21
|
- - ">="
|
|
22
22
|
- !ruby/object:Gem::Version
|
|
23
|
-
version: 0.
|
|
23
|
+
version: 0.19.0
|
|
24
24
|
version:
|
|
25
25
|
description:
|
|
26
26
|
email: simon.a.chiang@gmail.com
|
|
@@ -38,17 +38,21 @@ files:
|
|
|
38
38
|
- lib/tap/test/file_test/class_methods.rb
|
|
39
39
|
- lib/tap/test/shell_test.rb
|
|
40
40
|
- lib/tap/test/shell_test/class_methods.rb
|
|
41
|
+
- lib/tap/test/shell_test/regexp_escape.rb
|
|
41
42
|
- lib/tap/test/subset_test.rb
|
|
42
43
|
- lib/tap/test/subset_test/class_methods.rb
|
|
43
44
|
- lib/tap/test/tap_test.rb
|
|
44
45
|
- lib/tap/test/unit.rb
|
|
45
46
|
- lib/tap/test/utils.rb
|
|
47
|
+
- lib/tap/test/version.rb
|
|
46
48
|
- tap.yml
|
|
47
49
|
- History
|
|
48
50
|
- README
|
|
49
51
|
- MIT-LICENSE
|
|
50
52
|
has_rdoc: true
|
|
51
53
|
homepage: http://tap.rubyforge.org/tap-test/
|
|
54
|
+
licenses: []
|
|
55
|
+
|
|
52
56
|
post_install_message:
|
|
53
57
|
rdoc_options:
|
|
54
58
|
- --main
|
|
@@ -74,9 +78,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
74
78
|
requirements: []
|
|
75
79
|
|
|
76
80
|
rubyforge_project: tap
|
|
77
|
-
rubygems_version: 1.3.
|
|
81
|
+
rubygems_version: 1.3.5
|
|
78
82
|
signing_key:
|
|
79
|
-
specification_version:
|
|
83
|
+
specification_version: 3
|
|
80
84
|
summary: Test modules for Tap
|
|
81
85
|
test_files: []
|
|
82
86
|
|