phocus 1.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/LICENSE +19 -0
- data/README +79 -0
- data/Rakefile +79 -0
- data/TODO +17 -0
- data/lib/phocus/autodetect.rb +46 -0
- data/lib/phocus.rb +123 -0
- data/phocus.gemspec +73 -0
- data/test/README +8 -0
- data/test/compat/test_contest.rb +49 -0
- data/test/compat/test_context.rb +42 -0
- data/test/compat/test_minitest.rb +50 -0
- data/test/compat/test_shoulda.rb +53 -0
- data/test/compat/test_test_unit.rb +50 -0
- data/test/test_helper.rb +27 -0
- data/test/test_phocus.rb +136 -0
- metadata +69 -0
data/LICENSE
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
Copyright © 2009 Martin Aumont (mynyml)
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
4
|
+
this software and associated documentation files (the "Software"), to deal in
|
5
|
+
the Software without restriction, including without limitation the rights to
|
6
|
+
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
7
|
+
of the Software, and to permit persons to whom the Software is furnished to do
|
8
|
+
so, subject to the following conditions:
|
9
|
+
|
10
|
+
The above copyright notice and this permission notice shall be included in all
|
11
|
+
copies or substantial portions of the Software.
|
12
|
+
|
13
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
16
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
19
|
+
SOFTWARE.
|
data/README
ADDED
@@ -0,0 +1,79 @@
|
|
1
|
+
==== Summary
|
2
|
+
|
3
|
+
Phocus let's you temporarily focus some tests, ignoring all others, even across test classes.
|
4
|
+
|
5
|
+
|
6
|
+
==== Features
|
7
|
+
|
8
|
+
* Ultra simple to use
|
9
|
+
* Works accross testcase classes
|
10
|
+
* Works within contexts
|
11
|
+
* Can focus multiple tests
|
12
|
+
* Simple code (< 50 LOCs)
|
13
|
+
* Compatible with various testing frameworks
|
14
|
+
|
15
|
+
|
16
|
+
==== Examples
|
17
|
+
|
18
|
+
require 'test/unit'
|
19
|
+
require 'rubygems'
|
20
|
+
require 'phocus'
|
21
|
+
|
22
|
+
class TestUser < Test::Unit::TestCase
|
23
|
+
|
24
|
+
focus
|
25
|
+
def test_foo
|
26
|
+
assert User.do_something
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_bar
|
30
|
+
assert User.do_something_else
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
class TestAcmeWidget < Test::Unit::TestCase
|
35
|
+
|
36
|
+
def test_abc
|
37
|
+
assert true
|
38
|
+
end
|
39
|
+
|
40
|
+
focus
|
41
|
+
def test_xyz
|
42
|
+
assert true
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
Executing these tests (say with <tt>rake test</tt> or <tt>autotest</tt>), will
|
47
|
+
only run <tt>test_foo</tt> and <tt>test_xyz</tt>.
|
48
|
+
|
49
|
+
Also works fine with <tt>test "description"</tt> style tests.
|
50
|
+
|
51
|
+
focus
|
52
|
+
test "abc" do
|
53
|
+
assert true
|
54
|
+
end
|
55
|
+
|
56
|
+
|
57
|
+
==== Testing Framework Compatibility
|
58
|
+
|
59
|
+
Phocus is known to be compatible with the following testing frameworks (see test/compat/*):
|
60
|
+
|
61
|
+
* test/unit
|
62
|
+
* minitest/unit
|
63
|
+
* shoulda
|
64
|
+
* context
|
65
|
+
* contest
|
66
|
+
|
67
|
+
It is possibly compatible out of the box with other test/unit-based testing
|
68
|
+
frameworks as well, but it should be fairly easy to set up if it isn't (include
|
69
|
+
Phocus in parent testcase class and set proper method_pattern. See rdocs)
|
70
|
+
|
71
|
+
|
72
|
+
==== Links
|
73
|
+
|
74
|
+
source:: http://github.com/mynyml/phocus
|
75
|
+
rdocs:: http://docs.github.com/mynyml/phocus
|
76
|
+
|
77
|
+
|
78
|
+
==== License
|
79
|
+
MIT. See LICENSE file.
|
data/Rakefile
ADDED
@@ -0,0 +1,79 @@
|
|
1
|
+
# --------------------------------------------------
|
2
|
+
# based on thin's Rakefile (http://github.com/macournoyer/thin)
|
3
|
+
# --------------------------------------------------
|
4
|
+
require 'rake/gempackagetask'
|
5
|
+
require 'rake/rdoctask'
|
6
|
+
require 'pathname'
|
7
|
+
require 'yaml'
|
8
|
+
|
9
|
+
RUBY_1_9 = RUBY_VERSION =~ /^1\.9/
|
10
|
+
WIN = (RUBY_PLATFORM =~ /mswin|cygwin/)
|
11
|
+
SUDO = (WIN ? "" : "sudo")
|
12
|
+
|
13
|
+
def gem
|
14
|
+
RUBY_1_9 ? 'gem19' : 'gem'
|
15
|
+
end
|
16
|
+
|
17
|
+
def all_except(res)
|
18
|
+
Dir['**/*'].reject do |path|
|
19
|
+
Array(res).any? {|re| path.match(re) }
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
spec = Gem::Specification.new do |s|
|
24
|
+
s.name = 'phocus'
|
25
|
+
s.version = '1.0'
|
26
|
+
s.summary = "Run focused tests on test/unit."
|
27
|
+
s.description = "Tell test/unit exactly which tests you want run. It will ignore all the other ones and let you concentrate on a few."
|
28
|
+
s.author = "Martin Aumont"
|
29
|
+
s.email = 'mynyml@gmail.com'
|
30
|
+
s.homepage = ''
|
31
|
+
s.has_rdoc = true
|
32
|
+
s.require_path = "lib"
|
33
|
+
s.files = all_except([/doc/, /pkg/])
|
34
|
+
end
|
35
|
+
|
36
|
+
desc "Generate rdoc documentation."
|
37
|
+
Rake::RDocTask.new("rdoc") { |rdoc|
|
38
|
+
rdoc.rdoc_dir = 'doc/rdoc'
|
39
|
+
rdoc.title = "Phocus"
|
40
|
+
rdoc.options << '--line-numbers' << '--inline-source'
|
41
|
+
rdoc.options << '--charset' << 'utf-8'
|
42
|
+
rdoc.rdoc_files.include('README')
|
43
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
44
|
+
}
|
45
|
+
|
46
|
+
Rake::GemPackageTask.new(spec) do |p|
|
47
|
+
p.gem_spec = spec
|
48
|
+
end
|
49
|
+
|
50
|
+
desc "Remove package products"
|
51
|
+
task :clean => :clobber_package
|
52
|
+
|
53
|
+
desc "Update the gemspec for GitHub's gem server"
|
54
|
+
task :gemspec do
|
55
|
+
Pathname("#{spec.name}.gemspec").open('w') {|f| f << YAML.dump(spec) }
|
56
|
+
end
|
57
|
+
|
58
|
+
desc "Install gem"
|
59
|
+
task :install => [:clobber, :package] do
|
60
|
+
sh "#{SUDO} #{gem} install pkg/#{spec.full_name}.gem"
|
61
|
+
end
|
62
|
+
|
63
|
+
desc "Uninstall gem"
|
64
|
+
task :uninstall => :clean do
|
65
|
+
sh "#{SUDO} #{gem} uninstall -v #{spec.version} -x #{spec.name}"
|
66
|
+
end
|
67
|
+
|
68
|
+
desc "run framework compatibility tests"
|
69
|
+
task :test_all do
|
70
|
+
paths = %w(
|
71
|
+
test/compat/test_contest.rb
|
72
|
+
test/compat/test_context.rb
|
73
|
+
test/compat/test_minitest.rb
|
74
|
+
test/compat/test_shoulda.rb
|
75
|
+
test/compat/test_test_unit.rb
|
76
|
+
test/test_phocus.rb
|
77
|
+
)
|
78
|
+
paths.each {|path| system("ruby #{path}") }
|
79
|
+
end
|
data/TODO
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
# :stopdoc:
|
2
|
+
# Script to auto detect the test framework in use, and set it up with Phocus.
|
3
|
+
|
4
|
+
# Somewhat hackish, but simple/straightforward. If there ever is a need for
|
5
|
+
# extendability I'll gladly refactor.
|
6
|
+
|
7
|
+
|
8
|
+
# --------------------------------------------------
|
9
|
+
# test/unit, contest
|
10
|
+
# --------------------------------------------------
|
11
|
+
if defined?(Test::Unit::TestCase)
|
12
|
+
|
13
|
+
Test::Unit::TestCase.class_eval { include ::Phocus }
|
14
|
+
Test::Unit::TestSuite.class_eval { def empty?() false end }
|
15
|
+
Phocus.method_pattern = /^test_/
|
16
|
+
end
|
17
|
+
|
18
|
+
# --------------------------------------------------
|
19
|
+
# minitest
|
20
|
+
# --------------------------------------------------
|
21
|
+
if defined?(MiniTest::Unit::TestCase)
|
22
|
+
|
23
|
+
MiniTest::Unit::TestCase.class_eval { include ::Phocus }
|
24
|
+
Phocus.method_pattern = /^test_/
|
25
|
+
end
|
26
|
+
|
27
|
+
# --------------------------------------------------
|
28
|
+
# context
|
29
|
+
# --------------------------------------------------
|
30
|
+
if defined?(Test::Unit::TestCase) &&
|
31
|
+
Test::Unit::TestCase.class_eval { class << self; self; end }.included_modules.map {|m| m.to_s }.include?('Context::Context')
|
32
|
+
|
33
|
+
Test::Unit::TestCase.class_eval { include ::Phocus }
|
34
|
+
Phocus.method_pattern = /test:/
|
35
|
+
end
|
36
|
+
|
37
|
+
# --------------------------------------------------
|
38
|
+
# shoulda (test/unit)
|
39
|
+
# --------------------------------------------------
|
40
|
+
if defined?(Test::Unit::TestCase) &&
|
41
|
+
defined?(Shoulda)
|
42
|
+
|
43
|
+
Test::Unit::TestCase.class_eval { include ::Phocus }
|
44
|
+
Test::Unit::TestSuite.class_eval { def empty?() false end }
|
45
|
+
Phocus.method_pattern = /^test:/
|
46
|
+
end
|
data/lib/phocus.rb
ADDED
@@ -0,0 +1,123 @@
|
|
1
|
+
require 'pathname'
|
2
|
+
|
3
|
+
# Phocus let's you single out selected methods out of a defined group of methods.
|
4
|
+
#
|
5
|
+
# It is intended to be used to focus one or more tests in a test suite,
|
6
|
+
# although it is generic enough that it could conceivably be used in other
|
7
|
+
# circumstances as well.
|
8
|
+
#
|
9
|
+
# Use the <tt>focus</tt> statement right before defining your test method.
|
10
|
+
#
|
11
|
+
# ===== Examples
|
12
|
+
# require 'test/unit'
|
13
|
+
# require 'phocus'
|
14
|
+
#
|
15
|
+
# Phocus.method_pattern = /^test_/
|
16
|
+
#
|
17
|
+
# class TestUser < Test::Unit::TestCase
|
18
|
+
# include Phocus
|
19
|
+
#
|
20
|
+
# focus
|
21
|
+
# def test_foo
|
22
|
+
# assert true
|
23
|
+
# end
|
24
|
+
#
|
25
|
+
# def test_bar
|
26
|
+
# flunk "not focused"
|
27
|
+
# end
|
28
|
+
# end
|
29
|
+
#
|
30
|
+
# When executed, only test_foo will be run. Can also be used on more than one
|
31
|
+
# methods.
|
32
|
+
#
|
33
|
+
# Phocus also let's you focus methods across classes, which is almost always
|
34
|
+
# the desired behaviour. Simply include the mixin in the parent class. In the
|
35
|
+
# case of test/unit and test/unit based testing frameworks, this means:
|
36
|
+
#
|
37
|
+
# class Test::Unit::TestCase
|
38
|
+
# include Phocus
|
39
|
+
# end
|
40
|
+
#
|
41
|
+
# Now focusing will work across *all* your tests. Not much benifit if you run
|
42
|
+
# your test files individually, but indispensable when using <tt>rake test</tt>
|
43
|
+
# or autotest.
|
44
|
+
#
|
45
|
+
module Phocus
|
46
|
+
class << self
|
47
|
+
attr_accessor :method_pattern
|
48
|
+
|
49
|
+
# Specify a pattern that identifies the names of the group of methods
|
50
|
+
# focusing will apply to.
|
51
|
+
#
|
52
|
+
# For example, when using test/unit, you want the relevant group of methods
|
53
|
+
# to be your test methods, which are the ones starting with <tt>test_</tt>.
|
54
|
+
#
|
55
|
+
# Phocus.method_pattern = /^test_/
|
56
|
+
#
|
57
|
+
# (which happens to be the default pattern)
|
58
|
+
#
|
59
|
+
# On the other hand, context (http://github.com/jeremymcanally/context),
|
60
|
+
# has test methods starting with <tt>test:</tt>, so you can specify:
|
61
|
+
#
|
62
|
+
# Phocus.method_pattern = /^test:/
|
63
|
+
#
|
64
|
+
# In reality, it's not so much that Phocus focuses on certain methods, but
|
65
|
+
# rather it ignores others. Since we don't want to ignore helper methods
|
66
|
+
# (setup, teardown, custom helpers, etc.), we must restrict the scope of
|
67
|
+
# ignored methods, which is what <tt>method_pattern</tt> allows us to do.
|
68
|
+
def method_pattern
|
69
|
+
@method_pattern || /^test_/
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def self.included(base) #:nodoc:
|
74
|
+
base.extend ClassMethods
|
75
|
+
end
|
76
|
+
|
77
|
+
module ClassMethods
|
78
|
+
@@__test_methods = {}
|
79
|
+
@@__focused = false
|
80
|
+
@@__focus_next = false
|
81
|
+
|
82
|
+
# Use right before defining a method to focus it.
|
83
|
+
def focus
|
84
|
+
unless @@__focused
|
85
|
+
clear_test_methods!
|
86
|
+
@@__focused = true
|
87
|
+
end
|
88
|
+
@@__focus_next = true
|
89
|
+
end
|
90
|
+
# :stopdoc:
|
91
|
+
alias :focused :focus
|
92
|
+
alias :phocus :focus
|
93
|
+
# :startdoc:
|
94
|
+
|
95
|
+
# If the method belongs to target group (method_pattern), then remove it
|
96
|
+
# unless it is focused.
|
97
|
+
#
|
98
|
+
# We don't want any methods removed if focus is never used, so until it is,
|
99
|
+
# keep a reference to methods being defined so that we can come back and
|
100
|
+
# remove them later.
|
101
|
+
#
|
102
|
+
def method_added(name) #:nodoc:
|
103
|
+
super
|
104
|
+
if name.to_s.match(Phocus.method_pattern)
|
105
|
+
if @@__focused
|
106
|
+
@@__focus_next ? @@__focus_next = false : remove_method(name)
|
107
|
+
else
|
108
|
+
@@__test_methods[self] ||= []
|
109
|
+
@@__test_methods[self] << name
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
private
|
115
|
+
def clear_test_methods!
|
116
|
+
@@__test_methods.each do |klass, method_names|
|
117
|
+
method_names.each {|name| klass.class_eval { remove_method(name) } }
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
require Pathname(__FILE__).dirname.expand_path + 'phocus/autodetect'
|
data/phocus.gemspec
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: phocus
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: "1.0"
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Martin Aumont
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-06-11 00:00:00 -04:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description: Tell test/unit exactly which tests you want run. It will ignore all the other ones and let you concentrate on a few.
|
17
|
+
email: mynyml@gmail.com
|
18
|
+
executables: []
|
19
|
+
|
20
|
+
extensions: []
|
21
|
+
|
22
|
+
extra_rdoc_files: []
|
23
|
+
|
24
|
+
files:
|
25
|
+
- Rakefile
|
26
|
+
- test
|
27
|
+
- test/test_phocus.rb
|
28
|
+
- test/compat
|
29
|
+
- test/compat/test_shoulda.rb
|
30
|
+
- test/compat/test_context.rb
|
31
|
+
- test/compat/test_contest.rb
|
32
|
+
- test/compat/test_test_unit.rb
|
33
|
+
- test/compat/test_minitest.rb
|
34
|
+
- test/README
|
35
|
+
- test/test_helper.rb
|
36
|
+
- TODO
|
37
|
+
- lib
|
38
|
+
- lib/phocus
|
39
|
+
- lib/phocus/autodetect.rb
|
40
|
+
- lib/phocus.rb
|
41
|
+
- phocus.gemspec
|
42
|
+
- LICENSE
|
43
|
+
- README
|
44
|
+
has_rdoc: true
|
45
|
+
homepage: ""
|
46
|
+
licenses: []
|
47
|
+
|
48
|
+
post_install_message:
|
49
|
+
rdoc_options: []
|
50
|
+
|
51
|
+
require_paths:
|
52
|
+
- lib
|
53
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
54
|
+
requirements:
|
55
|
+
- - ">="
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: "0"
|
58
|
+
version:
|
59
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - ">="
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: "0"
|
64
|
+
version:
|
65
|
+
requirements: []
|
66
|
+
|
67
|
+
rubyforge_project:
|
68
|
+
rubygems_version: 1.3.3
|
69
|
+
signing_key:
|
70
|
+
specification_version: 3
|
71
|
+
summary: Run focused tests on test/unit.
|
72
|
+
test_files: []
|
73
|
+
|
data/test/README
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'test/test_helper'
|
2
|
+
require 'contest'
|
3
|
+
require 'lib/phocus'
|
4
|
+
|
5
|
+
class Test::Unit::TestCase
|
6
|
+
def setup
|
7
|
+
reset_phocused_classes(TestContestA, TestContestB, TestContestC)
|
8
|
+
reset_phocus
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
# should focus a method
|
13
|
+
class TestContestA < Test::Unit::TestCase
|
14
|
+
test "foo" do
|
15
|
+
flunk "not focused"
|
16
|
+
end
|
17
|
+
|
18
|
+
focus
|
19
|
+
test "bar" do
|
20
|
+
assert true
|
21
|
+
end
|
22
|
+
|
23
|
+
test "baz" do
|
24
|
+
flunk "not focused"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# should focus methods across test classes
|
29
|
+
class TestContestB < Test::Unit::TestCase
|
30
|
+
test "abc" do
|
31
|
+
flunk "not focused"
|
32
|
+
end
|
33
|
+
|
34
|
+
focus
|
35
|
+
test "def" do
|
36
|
+
assert true
|
37
|
+
end
|
38
|
+
|
39
|
+
focus
|
40
|
+
test "ghi" do
|
41
|
+
assert true
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# should not complain when no methods are left after focusing
|
46
|
+
class TestContestC < Test::Unit::TestCase
|
47
|
+
test "xyz" do
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'test/test_helper'
|
2
|
+
require 'context'
|
3
|
+
require 'lib/phocus'
|
4
|
+
|
5
|
+
# should focus a method
|
6
|
+
class TestContextA < Test::Unit::TestCase
|
7
|
+
test "foo" do
|
8
|
+
flunk "not focused"
|
9
|
+
end
|
10
|
+
|
11
|
+
focus
|
12
|
+
test "bar" do
|
13
|
+
assert true
|
14
|
+
end
|
15
|
+
|
16
|
+
test "baz" do
|
17
|
+
flunk "not focused"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# should focus methods across test classes
|
22
|
+
class TestContextB < Test::Unit::TestCase
|
23
|
+
test "abc" do
|
24
|
+
flunk "not focused"
|
25
|
+
end
|
26
|
+
|
27
|
+
focus
|
28
|
+
test "def" do
|
29
|
+
assert true
|
30
|
+
end
|
31
|
+
|
32
|
+
focus
|
33
|
+
test "ghi" do
|
34
|
+
assert true
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# should not complain when no methods are left after focusing
|
39
|
+
class TestContextC < Test::Unit::TestCase
|
40
|
+
test "xyz" do
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'test/test_helper'
|
2
|
+
require 'minitest/autorun'
|
3
|
+
require 'lib/phocus'
|
4
|
+
|
5
|
+
class MiniTest::Unit::TestCase
|
6
|
+
def setup
|
7
|
+
reset_phocused_classes(TestMiniTestA, TestMiniTestB, TestMiniTestC)
|
8
|
+
reset_phocus
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
# should focus a method
|
13
|
+
class TestMiniTestA < MiniTest::Unit::TestCase
|
14
|
+
def test_foo
|
15
|
+
flunk "not focused"
|
16
|
+
end
|
17
|
+
|
18
|
+
focus
|
19
|
+
def test_bar
|
20
|
+
assert true
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_baz
|
24
|
+
flunk "not focused"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# should focus methods across test classes
|
29
|
+
class TestMiniTestB < MiniTest::Unit::TestCase
|
30
|
+
def test_abc
|
31
|
+
flunk "not focused"
|
32
|
+
end
|
33
|
+
|
34
|
+
focus
|
35
|
+
def test_def
|
36
|
+
assert true
|
37
|
+
end
|
38
|
+
|
39
|
+
focus
|
40
|
+
def test_ghi
|
41
|
+
assert true
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# should not complain when no methods are left after focusing
|
46
|
+
class TestMiniTestC < MiniTest::Unit::TestCase
|
47
|
+
def test_xyz
|
48
|
+
flunk "not focused"
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'test/test_helper'
|
2
|
+
require 'test/unit'
|
3
|
+
require 'shoulda'
|
4
|
+
require 'lib/phocus'
|
5
|
+
|
6
|
+
# testing shoulda/test_unit
|
7
|
+
|
8
|
+
class Test::Unit::TestCase
|
9
|
+
def setup
|
10
|
+
reset_phocused_classes(TestShouldaA, TestShouldaB, TestShouldaC)
|
11
|
+
reset_phocus
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
# should focus a method
|
16
|
+
class TestShouldaA < Test::Unit::TestCase
|
17
|
+
should "foo" do
|
18
|
+
flunk "not focused"
|
19
|
+
end
|
20
|
+
|
21
|
+
focus
|
22
|
+
should "bar" do
|
23
|
+
assert true
|
24
|
+
end
|
25
|
+
|
26
|
+
should "baz" do
|
27
|
+
flunk "not focused"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
# should focus methods across test classes
|
32
|
+
class TestShouldaB < Test::Unit::TestCase
|
33
|
+
should "abc" do
|
34
|
+
flunk "not focused"
|
35
|
+
end
|
36
|
+
|
37
|
+
focus
|
38
|
+
should "def" do
|
39
|
+
assert true
|
40
|
+
end
|
41
|
+
|
42
|
+
focus
|
43
|
+
should "ghi" do
|
44
|
+
assert true
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
# should not complain when no methods are left after focusing
|
49
|
+
class TestShouldaC < Test::Unit::TestCase
|
50
|
+
should "xyz" do
|
51
|
+
flunk "not focused"
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'test/test_helper'
|
2
|
+
require 'test/unit'
|
3
|
+
require 'lib/phocus'
|
4
|
+
|
5
|
+
class Test::Unit::TestCase
|
6
|
+
def setup
|
7
|
+
reset_phocused_classes(TestTestUnitA, TestTestUnitB, TestTestUnitC)
|
8
|
+
reset_phocus
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
# should focus a method
|
13
|
+
class TestTestUnitA < Test::Unit::TestCase
|
14
|
+
def test_foo
|
15
|
+
flunk "not focused"
|
16
|
+
end
|
17
|
+
|
18
|
+
focus
|
19
|
+
def test_bar
|
20
|
+
assert true
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_baz
|
24
|
+
flunk "not focused"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# should focus methods across test classes
|
29
|
+
class TestTestUnitB < Test::Unit::TestCase
|
30
|
+
def test_abc
|
31
|
+
flunk "not focused"
|
32
|
+
end
|
33
|
+
|
34
|
+
focus
|
35
|
+
def test_def
|
36
|
+
assert true
|
37
|
+
end
|
38
|
+
|
39
|
+
focus
|
40
|
+
def test_ghi
|
41
|
+
assert true
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# should not complain when no methods are left after focusing
|
46
|
+
class TestTestUnitC < Test::Unit::TestCase
|
47
|
+
def test_xyz
|
48
|
+
flunk "not focused"
|
49
|
+
end
|
50
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'pathname'
|
2
|
+
require 'set'
|
3
|
+
require 'rubygems'
|
4
|
+
begin
|
5
|
+
require 'ruby-debug'
|
6
|
+
rescue LoadError, RuntimeError
|
7
|
+
end
|
8
|
+
|
9
|
+
class Object
|
10
|
+
def self.metaclass
|
11
|
+
(class << self; self; end)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def reset_phocused_classes(*classes)
|
16
|
+
Array(classes).flatten.each do |klass|
|
17
|
+
klass.metaclass.class_eval do
|
18
|
+
class_variable_set(:@@__focused, false )
|
19
|
+
class_variable_set(:@@__focus_next, false )
|
20
|
+
class_variable_set(:@@__test_methods, {} )
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def reset_phocus
|
26
|
+
Phocus.method_pattern = nil
|
27
|
+
end
|
data/test/test_phocus.rb
ADDED
@@ -0,0 +1,136 @@
|
|
1
|
+
require 'test/test_helper'
|
2
|
+
require 'expectations'
|
3
|
+
require 'lib/phocus'
|
4
|
+
|
5
|
+
class TestCase
|
6
|
+
include Phocus
|
7
|
+
end
|
8
|
+
class TestA < TestCase; end
|
9
|
+
class TestB < TestCase; end
|
10
|
+
|
11
|
+
def reset
|
12
|
+
klasses = [TestA, TestB]
|
13
|
+
reset_phocused_classes(*klasses)
|
14
|
+
klasses.each do |klass|
|
15
|
+
klass.class_eval do
|
16
|
+
instance_methods(false).each {|name| remove_method(name) }
|
17
|
+
end
|
18
|
+
end
|
19
|
+
reset_phocus
|
20
|
+
end
|
21
|
+
|
22
|
+
Expectations do
|
23
|
+
|
24
|
+
## api
|
25
|
+
|
26
|
+
expect true do
|
27
|
+
reset
|
28
|
+
TestA.respond_to?(:focus) &&
|
29
|
+
TestA.respond_to?(:focused) &&
|
30
|
+
TestA.respond_to?(:phocus)
|
31
|
+
end
|
32
|
+
|
33
|
+
## pattern
|
34
|
+
|
35
|
+
# custom pattern for relevant methods.
|
36
|
+
# all other methods will be ignored by Phocus
|
37
|
+
# (i.e. they cannot be focused, nor will they ever be removed)
|
38
|
+
expect %w( test_baz test:bar).to_set do
|
39
|
+
reset
|
40
|
+
Phocus.method_pattern = /^test:/
|
41
|
+
class TestA
|
42
|
+
define_method(:'test:foo') {}
|
43
|
+
focus
|
44
|
+
define_method(:'test:bar') {}
|
45
|
+
define_method(:'test_baz') {}
|
46
|
+
end
|
47
|
+
|
48
|
+
TestA.instance_methods(false).to_set
|
49
|
+
end
|
50
|
+
|
51
|
+
## focused tests
|
52
|
+
|
53
|
+
# only keeps focused method
|
54
|
+
expect %w( test_foo ).to_set do
|
55
|
+
reset
|
56
|
+
class TestA
|
57
|
+
focus
|
58
|
+
def test_foo() end
|
59
|
+
def test_bar() end
|
60
|
+
end
|
61
|
+
|
62
|
+
TestA.instance_methods(false).to_set
|
63
|
+
end
|
64
|
+
|
65
|
+
# keeps more than one focused methods
|
66
|
+
expect %w( test_foo test_bar ).to_set do
|
67
|
+
reset
|
68
|
+
class TestA
|
69
|
+
focus
|
70
|
+
def test_foo() end
|
71
|
+
focus
|
72
|
+
def test_bar() end
|
73
|
+
def test_baz() end
|
74
|
+
end
|
75
|
+
|
76
|
+
TestA.instance_methods(false).to_set
|
77
|
+
end
|
78
|
+
|
79
|
+
# focuses across subclasses
|
80
|
+
expect %w( test_foo ).to_set do
|
81
|
+
reset
|
82
|
+
class TestA
|
83
|
+
focus
|
84
|
+
def test_foo() end
|
85
|
+
def test_bar() end
|
86
|
+
end
|
87
|
+
class TestB
|
88
|
+
def test_abc() end
|
89
|
+
end
|
90
|
+
|
91
|
+
TestA.instance_methods(false).to_set +
|
92
|
+
TestB.instance_methods(false).to_set
|
93
|
+
end
|
94
|
+
|
95
|
+
# focuses more than one methods across subclasses
|
96
|
+
expect %w( test_foo test_def ).to_set do
|
97
|
+
reset
|
98
|
+
class TestA
|
99
|
+
focus
|
100
|
+
def test_foo() end
|
101
|
+
def test_bar() end
|
102
|
+
end
|
103
|
+
class TestB
|
104
|
+
def test_abc() end
|
105
|
+
focus
|
106
|
+
def test_def() end
|
107
|
+
end
|
108
|
+
|
109
|
+
TestA.instance_methods(false).to_set +
|
110
|
+
TestB.instance_methods(false).to_set
|
111
|
+
end
|
112
|
+
|
113
|
+
# non-test methods aren't touched
|
114
|
+
expect %w( test_foo helper ).to_set do
|
115
|
+
reset
|
116
|
+
class TestA
|
117
|
+
focus
|
118
|
+
def test_foo() end
|
119
|
+
def test_bar() end
|
120
|
+
def helper() end
|
121
|
+
end
|
122
|
+
|
123
|
+
TestA.instance_methods(false).to_set
|
124
|
+
end
|
125
|
+
|
126
|
+
# test methods don't get removed if nothing is focused (control test)
|
127
|
+
expect %w( test_foo test_bar ).to_set do
|
128
|
+
reset
|
129
|
+
class TestA
|
130
|
+
def test_foo() end
|
131
|
+
def test_bar() end
|
132
|
+
end
|
133
|
+
|
134
|
+
TestA.instance_methods(false).to_set
|
135
|
+
end
|
136
|
+
end
|
metadata
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: phocus
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: "1.0"
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Martin Aumont
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-08-25 00:00:00 -04:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description: Tell test/unit exactly which tests you want run. It will ignore all the other ones and let you concentrate on a few.
|
17
|
+
email: mynyml@gmail.com
|
18
|
+
executables: []
|
19
|
+
|
20
|
+
extensions: []
|
21
|
+
|
22
|
+
extra_rdoc_files: []
|
23
|
+
|
24
|
+
files:
|
25
|
+
- Rakefile
|
26
|
+
- test/test_phocus.rb
|
27
|
+
- test/compat/test_shoulda.rb
|
28
|
+
- test/compat/test_context.rb
|
29
|
+
- test/compat/test_contest.rb
|
30
|
+
- test/compat/test_test_unit.rb
|
31
|
+
- test/compat/test_minitest.rb
|
32
|
+
- test/README
|
33
|
+
- test/test_helper.rb
|
34
|
+
- TODO
|
35
|
+
- lib/phocus/autodetect.rb
|
36
|
+
- lib/phocus.rb
|
37
|
+
- phocus.gemspec
|
38
|
+
- LICENSE
|
39
|
+
- README
|
40
|
+
has_rdoc: true
|
41
|
+
homepage: ""
|
42
|
+
licenses: []
|
43
|
+
|
44
|
+
post_install_message:
|
45
|
+
rdoc_options: []
|
46
|
+
|
47
|
+
require_paths:
|
48
|
+
- lib
|
49
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ">="
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: "0"
|
54
|
+
version:
|
55
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - ">="
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: "0"
|
60
|
+
version:
|
61
|
+
requirements: []
|
62
|
+
|
63
|
+
rubyforge_project:
|
64
|
+
rubygems_version: 1.3.5
|
65
|
+
signing_key:
|
66
|
+
specification_version: 3
|
67
|
+
summary: Run focused tests on test/unit.
|
68
|
+
test_files: []
|
69
|
+
|