summaryrefslogtreecommitdiff
path: root/test/lib
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-03-11 08:03:11 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-03-11 08:03:11 +0000
commit83e36bb5a6e02b747d10c1baf5e1b7ff2b4c49fe (patch)
treecb0be93b838fa7e4f104a4be727cf2b594509e81 /test/lib
parent59766643db17f8dbfe518cafa20f6ba36a9b8d9b (diff)
testunit: negative filter
* test/lib/test/unit.rb (Options#non_options): make regexp name options prefixed with "!" negative filters. * common.mk (TEST_EXCLUDES): use negative filter to exclude memory leak tests. -x option excludes test files, not test methods. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@54086 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'test/lib')
-rw-r--r--test/lib/test/unit.rb30
1 files changed, 26 insertions, 4 deletions
diff --git a/test/lib/test/unit.rb b/test/lib/test/unit.rb
index 2825c2eb4a..3ab0527e6b 100644
--- a/test/lib/test/unit.rb
+++ b/test/lib/test/unit.rb
@@ -87,7 +87,7 @@ module Test
end
opts.on '-n', '--name PATTERN', "Filter test method names on pattern: /REGEXP/ or STRING" do |a|
- options[:filter] = a
+ (options[:filter] ||= []) << a
end
opts.on '--test-order=random|alpha|sorted', [:random, :alpha, :sorted] do |a|
@@ -96,6 +96,30 @@ module Test
end
def non_options(files, options)
+ filter = options[:filter]
+ if filter
+ pos_pat = /\A\/(.*)\/\z/
+ neg_pat = /\A!\/(.*)\/\z/
+ negative, positive = filter.partition {|s| neg_pat =~ s}
+ if positive.empty?
+ filter = nil
+ elsif negative.empty? and positive.size == 1 and pos_pat !~ positive[0]
+ filter = positive[0]
+ else
+ filter = Regexp.union(*positive.map! {|s| s[pos_pat, 1] || "\\A#{Regexp.quote(s)}\\z"})
+ end
+ unless negative.empty?
+ negative = Regexp.union(*negative.map! {|s| s[neg_pat, 1]})
+ filter = /\A(?!.*#{negative})#{filter}/
+ end
+ if Regexp === filter
+ # bypass conversion in minitest
+ def filter.=~(other) # :nodoc:
+ super unless Regexp === other
+ end
+ end
+ options[:filter] = filter
+ end
true
end
end
@@ -594,9 +618,7 @@ module Test
@verbose = !options[:parallel]
end
@output = Output.new(self) unless @options[:testing]
- if /\A\/(.*)\/\z/ =~ (filter = options[:filter])
- filter = Regexp.new($1)
- end
+ filter = options[:filter]
type = "#{type}_methods"
total = if filter
suites.inject(0) {|n, suite| n + suite.send(type).grep(filter).size}