shell_test 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.rdoc +9 -0
- data/README.rdoc +1 -1
- data/lib/shell_test/file_methods.rb +94 -16
- data/lib/shell_test/shell_methods.rb +5 -71
- data/lib/shell_test/string_methods.rb +72 -0
- data/lib/shell_test/unit/shim.rb +2 -0
- data/lib/shell_test/version.rb +1 -1
- metadata +5 -4
data/History.rdoc
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
== 0.2.0 2011/08/03
|
2
|
+
|
3
|
+
* Split out a StringMethods module [issue #7]
|
4
|
+
* Renamed assert_output_equal to assert_str_equal and assert_alike to
|
5
|
+
assert_str_match.
|
6
|
+
* Added FileMethods#_prepare and made prepare outdent content [issue #9]
|
7
|
+
* Added content, mode, and glob to FileMethods [issue #10]
|
8
|
+
* Added FileMethods#prepare_dir
|
9
|
+
|
1
10
|
== 0.1.0 2011/07/07
|
2
11
|
|
3
12
|
Initial release.
|
data/README.rdoc
CHANGED
@@ -130,7 +130,7 @@ ShellTest is available as a gem[http://rubygems.org/gems/shell_test].
|
|
130
130
|
|
131
131
|
To get started, checkout the code from GitHub[http://github.com/thinkerbot/shell_test] and run:
|
132
132
|
|
133
|
-
git clone
|
133
|
+
git clone git://github.com/thinkerbot/shell_test.git
|
134
134
|
cd shell_test
|
135
135
|
rake test
|
136
136
|
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'fileutils'
|
2
|
+
require 'shell_test/string_methods'
|
2
3
|
|
3
4
|
module ShellTest
|
4
5
|
module FileMethods
|
@@ -124,17 +125,25 @@ module ShellTest
|
|
124
125
|
end
|
125
126
|
end
|
126
127
|
|
128
|
+
include StringMethods
|
127
129
|
extend ModuleMethods
|
128
130
|
|
131
|
+
# Calls cleanup to remove any files left over from previous test runs (for
|
132
|
+
# instance by running with a flag to keep outputs).
|
129
133
|
def setup
|
130
134
|
super
|
131
135
|
cleanup
|
132
136
|
end
|
133
137
|
|
138
|
+
# Generic cleanup method. Returns users to the user_dir then calls
|
139
|
+
# cleanup unless keep_outputs? returns true. If cleanup is called, any
|
140
|
+
# empty directories under method_dir are also removed.
|
141
|
+
#
|
142
|
+
# Be sure to call super if teardown is overridden in a test case.
|
134
143
|
def teardown
|
135
144
|
Dir.chdir(user_dir)
|
136
145
|
|
137
|
-
unless
|
146
|
+
unless keep_outputs?
|
138
147
|
cleanup
|
139
148
|
|
140
149
|
dir = method_dir
|
@@ -147,50 +156,74 @@ module ShellTest
|
|
147
156
|
super
|
148
157
|
end
|
149
158
|
|
159
|
+
# Returns true if KEEP_OUTPUTS is set to 'true' in ENV.
|
160
|
+
def keep_outputs?
|
161
|
+
ENV["KEEP_OUTPUTS"] == "true"
|
162
|
+
end
|
163
|
+
|
164
|
+
# Returns the absolute path to the current working directory.
|
150
165
|
def user_dir
|
151
166
|
@user_dir ||= File.expand_path('.')
|
152
167
|
end
|
153
168
|
|
169
|
+
# Returns the absolute path to a directory specific to the current test
|
170
|
+
# class, specifically the class.class_dir expanded relative to the
|
171
|
+
# user_dir.
|
154
172
|
def class_dir
|
155
173
|
@class_dir ||= File.expand_path(self.class.class_dir, user_dir)
|
156
174
|
end
|
157
175
|
|
176
|
+
# Returns the absolute path to a directory specific to the current test
|
177
|
+
# method, specifically method_name expanded relative to class_dir.
|
158
178
|
def method_dir
|
159
179
|
@method_dir ||= File.expand_path(method_name.to_s, class_dir)
|
160
180
|
end
|
161
181
|
|
182
|
+
# Returns the method name of the current test.
|
183
|
+
#
|
184
|
+
# Really this method is an alias for __name__ which is present in
|
185
|
+
# MiniTest::Unit and reproduces the method_name in Test::Unit.
|
186
|
+
# ShellTest::Unit ensures this method is set up correctly in those
|
187
|
+
# frameworks. If this module is used in other frameworks, then
|
188
|
+
# method_name must be implemented separately.
|
162
189
|
def method_name
|
163
190
|
__name__
|
164
191
|
end
|
165
192
|
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
def cleanup
|
171
|
-
if cleanup_paths = cleanup_methods[method_name.to_sym]
|
172
|
-
cleanup_paths.each {|relative_path| remove(relative_path) }
|
173
|
-
end
|
174
|
-
end
|
175
|
-
|
193
|
+
# Expands relative_path relative to method_dir and returns the resulting
|
194
|
+
# absolute path. Raises an error if the resulting path is not relative to
|
195
|
+
# method_dir.
|
176
196
|
def path(relative_path)
|
177
|
-
|
197
|
+
full_path = File.expand_path(relative_path, method_dir)
|
178
198
|
|
179
|
-
unless
|
199
|
+
unless full_path.index(method_dir) == 0
|
180
200
|
raise "does not make a path relative to method_dir: #{relative_path.inspect}"
|
181
201
|
end
|
182
202
|
|
183
|
-
|
203
|
+
full_path
|
184
204
|
end
|
185
205
|
|
186
|
-
|
206
|
+
# Globs the pattern under method_dir.
|
207
|
+
def glob(pattern)
|
208
|
+
Dir.glob path(pattern)
|
209
|
+
end
|
210
|
+
|
211
|
+
# Creates a directory under method_dir.
|
212
|
+
def prepare_dir(relative_path)
|
213
|
+
target_dir = path(relative_path)
|
214
|
+
FileUtils.mkdir_p(target_dir)
|
215
|
+
target_dir
|
216
|
+
end
|
217
|
+
|
218
|
+
# Same as prepare but does not outdent content.
|
219
|
+
def _prepare(relative_path, content=nil, &block)
|
187
220
|
target = path(relative_path)
|
188
221
|
|
189
222
|
if File.exists?(target)
|
190
223
|
FileUtils.rm(target)
|
191
224
|
else
|
192
225
|
target_dir = File.dirname(target)
|
193
|
-
FileUtils.mkdir_p(target_dir)
|
226
|
+
FileUtils.mkdir_p(target_dir)
|
194
227
|
end
|
195
228
|
|
196
229
|
FileUtils.touch(target)
|
@@ -200,9 +233,54 @@ module ShellTest
|
|
200
233
|
target
|
201
234
|
end
|
202
235
|
|
236
|
+
# Creates a file under method_dir with the specified content, which may be
|
237
|
+
# provided as a string or with a block (the block recieves an open File).
|
238
|
+
# If no content is given, then an empty file is created.
|
239
|
+
#
|
240
|
+
# Content provided as a string is outdented (see StringMethods#outdent),
|
241
|
+
# so this syntax is possible:
|
242
|
+
#
|
243
|
+
# path = prepare 'file', %{
|
244
|
+
# line one
|
245
|
+
# line two
|
246
|
+
# }
|
247
|
+
# File.read(path) # => "line one\nline two\n"
|
248
|
+
#
|
249
|
+
# Returns the absolute path to the new file.
|
250
|
+
def prepare(relative_path, content=nil, &block)
|
251
|
+
content = outdent(content) if content
|
252
|
+
_prepare(relative_path, content, &block)
|
253
|
+
end
|
254
|
+
|
255
|
+
# Returns the content of the file under method_dir, if it exists.
|
256
|
+
def content(relative_path, length=nil, offset=nil)
|
257
|
+
full_path = path(relative_path)
|
258
|
+
File.exists?(full_path) ? File.read(full_path, length, offset) : nil
|
259
|
+
end
|
260
|
+
|
261
|
+
# Returns the formatted string mode (ex '100640') of the file under
|
262
|
+
# method_dir, if it exists.
|
263
|
+
def mode(relative_path)
|
264
|
+
full_path = path(relative_path)
|
265
|
+
File.exists?(full_path) ? sprintf("%o", File.stat(full_path).mode) : nil
|
266
|
+
end
|
267
|
+
|
268
|
+
# Removes a file or directory under method_dir, if it exists.
|
203
269
|
def remove(relative_path)
|
204
270
|
full_path = path(relative_path)
|
205
271
|
FileUtils.rm_r(full_path) if File.exists?(full_path)
|
206
272
|
end
|
273
|
+
|
274
|
+
# Shortcut to access the class.cleanup_methods.
|
275
|
+
def cleanup_methods
|
276
|
+
self.class.cleanup_methods
|
277
|
+
end
|
278
|
+
|
279
|
+
# Recursively removes paths specified for cleanup in cleanup_methods.
|
280
|
+
def cleanup
|
281
|
+
if cleanup_paths = cleanup_methods[method_name.to_sym]
|
282
|
+
cleanup_paths.each {|relative_path| remove(relative_path) }
|
283
|
+
end
|
284
|
+
end
|
207
285
|
end
|
208
286
|
end
|
@@ -1,8 +1,11 @@
|
|
1
1
|
require 'shell_test/regexp_escape'
|
2
2
|
require 'shell_test/command_parser'
|
3
|
+
require 'shell_test/string_methods'
|
3
4
|
|
4
5
|
module ShellTest
|
5
6
|
module ShellMethods
|
7
|
+
include StringMethods
|
8
|
+
|
6
9
|
def setup
|
7
10
|
super
|
8
11
|
@notify_method_name = true
|
@@ -86,7 +89,7 @@ module ShellTest
|
|
86
89
|
parse_script(script, options).each do |cmd, output, status|
|
87
90
|
result = sh(cmd)
|
88
91
|
|
89
|
-
|
92
|
+
_assert_str_equal(output, result, cmd) if output
|
90
93
|
assert_equal(status, $?.exitstatus, cmd) if status
|
91
94
|
end
|
92
95
|
end
|
@@ -99,78 +102,9 @@ module ShellTest
|
|
99
102
|
parse_script(script, options).each do |cmd, output, status|
|
100
103
|
result = sh(cmd)
|
101
104
|
|
102
|
-
|
105
|
+
_assert_str_match(output, result, cmd) if output
|
103
106
|
assert_equal(status, $?.exitstatus, cmd) if status
|
104
107
|
end
|
105
108
|
end
|
106
|
-
|
107
|
-
# Asserts whether or not the a and b strings are equal, with a more
|
108
|
-
# readable output than assert_equal for large strings (especially large
|
109
|
-
# strings with significant whitespace).
|
110
|
-
def assert_output_equal(a, b, msg=nil)
|
111
|
-
_assert_output_equal outdent(a), b, msg
|
112
|
-
end
|
113
|
-
|
114
|
-
def _assert_output_equal(a, b, msg=nil)
|
115
|
-
if a == b
|
116
|
-
assert true
|
117
|
-
else
|
118
|
-
flunk %Q{
|
119
|
-
#{msg}
|
120
|
-
==================== expected output ====================
|
121
|
-
#{whitespace_escape(a)}
|
122
|
-
======================== but was ========================
|
123
|
-
#{whitespace_escape(b)}
|
124
|
-
=========================================================
|
125
|
-
}
|
126
|
-
end
|
127
|
-
end
|
128
|
-
|
129
|
-
# Asserts whether or not b is like a (which should be a Regexp), and
|
130
|
-
# provides a more readable output in the case of a failure as compared
|
131
|
-
# with assert_match.
|
132
|
-
#
|
133
|
-
# If a is a string it is turned into a RegexpEscape.
|
134
|
-
def assert_alike(a, b, msg=nil)
|
135
|
-
a = outdent(a) if a.kind_of?(String)
|
136
|
-
_assert_alike a, b, msg
|
137
|
-
end
|
138
|
-
|
139
|
-
def _assert_alike(a, b, msg=nil)
|
140
|
-
if a.kind_of?(String)
|
141
|
-
a = RegexpEscape.new(a)
|
142
|
-
end
|
143
|
-
|
144
|
-
if b =~ a
|
145
|
-
assert true
|
146
|
-
else
|
147
|
-
flunk %Q{
|
148
|
-
#{msg}
|
149
|
-
================= expected output like ==================
|
150
|
-
#{whitespace_escape(a)}
|
151
|
-
======================== but was ========================
|
152
|
-
#{whitespace_escape(b)}
|
153
|
-
=========================================================
|
154
|
-
}
|
155
|
-
end
|
156
|
-
end
|
157
|
-
|
158
|
-
# helper for stripping indentation off a string
|
159
|
-
def outdent(str)
|
160
|
-
str =~ /\A(?:\s*?\n)( *)(.*)\z/m ? $2.gsub!(/^ {0,#{$1.length}}/, '') : str
|
161
|
-
end
|
162
|
-
|
163
|
-
# helper for formatting escaping whitespace into readable text
|
164
|
-
def whitespace_escape(str)
|
165
|
-
str.to_s.gsub(/\s/) do |match|
|
166
|
-
case match
|
167
|
-
when "\n" then "\\n\n"
|
168
|
-
when "\t" then "\\t"
|
169
|
-
when "\r" then "\\r"
|
170
|
-
when "\f" then "\\f"
|
171
|
-
else match
|
172
|
-
end
|
173
|
-
end
|
174
|
-
end
|
175
109
|
end
|
176
110
|
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
module ShellTest
|
2
|
+
module StringMethods
|
3
|
+
# Asserts whether or not the a and b strings are equal, with a more
|
4
|
+
# readable output than assert_equal for large strings (especially large
|
5
|
+
# strings with significant whitespace).
|
6
|
+
def assert_str_equal(a, b, msg=nil)
|
7
|
+
_assert_str_equal outdent(a), b, msg
|
8
|
+
end
|
9
|
+
|
10
|
+
def _assert_str_equal(a, b, msg=nil)
|
11
|
+
if a == b
|
12
|
+
assert true
|
13
|
+
else
|
14
|
+
flunk %Q{
|
15
|
+
#{msg}
|
16
|
+
==================== expected output ====================
|
17
|
+
#{whitespace_escape(a)}
|
18
|
+
======================== but was ========================
|
19
|
+
#{whitespace_escape(b)}
|
20
|
+
=========================================================
|
21
|
+
}
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# Asserts whether or not b is like a (which should be a Regexp), and
|
26
|
+
# provides a more readable output in the case of a failure as compared
|
27
|
+
# with assert_match.
|
28
|
+
#
|
29
|
+
# If a is a string it is turned into a RegexpEscape.
|
30
|
+
def assert_str_match(a, b, msg=nil)
|
31
|
+
a = outdent(a) if a.kind_of?(String)
|
32
|
+
_assert_str_match a, b, msg
|
33
|
+
end
|
34
|
+
|
35
|
+
def _assert_str_match(a, b, msg=nil)
|
36
|
+
if a.kind_of?(String)
|
37
|
+
a = RegexpEscape.new(a)
|
38
|
+
end
|
39
|
+
|
40
|
+
if b =~ a
|
41
|
+
assert true
|
42
|
+
else
|
43
|
+
flunk %Q{
|
44
|
+
#{msg}
|
45
|
+
================= expected output like ==================
|
46
|
+
#{whitespace_escape(a)}
|
47
|
+
======================== but was ========================
|
48
|
+
#{whitespace_escape(b)}
|
49
|
+
=========================================================
|
50
|
+
}
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# helper for stripping indentation off a string
|
55
|
+
def outdent(str)
|
56
|
+
str =~ /\A(?:\s*?\n)( *)(.*)\z/m ? $2.gsub!(/^ {0,#{$1.length}}/, '') : str
|
57
|
+
end
|
58
|
+
|
59
|
+
# helper for formatting escaping whitespace into readable text
|
60
|
+
def whitespace_escape(str)
|
61
|
+
str.to_s.gsub(/\s/) do |match|
|
62
|
+
case match
|
63
|
+
when "\n" then "\\n\n"
|
64
|
+
when "\t" then "\\t"
|
65
|
+
when "\r" then "\\r"
|
66
|
+
when "\f" then "\\f"
|
67
|
+
else match
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
data/lib/shell_test/unit/shim.rb
CHANGED
@@ -34,6 +34,8 @@ class Test::Unit::TestResult
|
|
34
34
|
@skips ||= []
|
35
35
|
end
|
36
36
|
|
37
|
+
alias shell_test_original_add_error add_error
|
38
|
+
|
37
39
|
# Partition errors from a SkipException from other errors and records as
|
38
40
|
# them as skips (the error is extended to display as a skip).
|
39
41
|
def add_error(error)
|
data/lib/shell_test/version.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: shell_test
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 23
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
8
|
+
- 2
|
9
9
|
- 0
|
10
|
-
version: 0.
|
10
|
+
version: 0.2.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Simon Chiang
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-08-03 00:00:00 -06:00
|
19
19
|
default_executable:
|
20
20
|
dependencies: []
|
21
21
|
|
@@ -36,6 +36,7 @@ files:
|
|
36
36
|
- lib/shell_test/file_methods.rb
|
37
37
|
- lib/shell_test/regexp_escape.rb
|
38
38
|
- lib/shell_test/shell_methods.rb
|
39
|
+
- lib/shell_test/string_methods.rb
|
39
40
|
- lib/shell_test/unit.rb
|
40
41
|
- lib/shell_test/unit/shim.rb
|
41
42
|
- lib/shell_test/version.rb
|