etest-unit 0.7.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/README.md +58 -0
- data/lib/etest-unit/version.rb +3 -0
- data/lib/etest-unit.rb +76 -0
- data/lib/module_ext.rb +65 -0
- data/lib/string_ext.rb +14 -0
- data/test/etest_test.rb +37 -0
- metadata +69 -0
data/README.md
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
# etest-unit
|
2
|
+
|
3
|
+
## Installation
|
4
|
+
|
5
|
+
gem install etest-unit
|
6
|
+
|
7
|
+
## Intro
|
8
|
+
|
9
|
+
~/projects/ruby/scratch > irb
|
10
|
+
irb> class X
|
11
|
+
irb> def self.foo; "baz"; end
|
12
|
+
irb> end
|
13
|
+
irb> module X::Etest
|
14
|
+
irb> def test_abc
|
15
|
+
irb> assert_equal X.foo, "bar"
|
16
|
+
irb> end
|
17
|
+
irb> end
|
18
|
+
irb* require "etest-unit"
|
19
|
+
=> true
|
20
|
+
irb> X.etest
|
21
|
+
Warning: Cannot reload module X
|
22
|
+
Loaded suite X::Etest
|
23
|
+
Started
|
24
|
+
F
|
25
|
+
===============================================================================
|
26
|
+
Failure:
|
27
|
+
test_abc()
|
28
|
+
(irb):7:in `test_abc'
|
29
|
+
<"baz"> expected but was
|
30
|
+
<"bar">
|
31
|
+
|
32
|
+
[ ... ]
|
33
|
+
57.30 tests/s, 57.30 assertions/s
|
34
|
+
=> 1 tests, 1 assertions, 1 failures, 0 errors, 0 pendings, 0 omissions, 0 notifications
|
35
|
+
|
36
|
+
|
37
|
+
irb> # fix the typo
|
38
|
+
irb* class X
|
39
|
+
irb> def self.foo; "bar"; end
|
40
|
+
irb> end
|
41
|
+
=> nil
|
42
|
+
irb> # run test again
|
43
|
+
irb* X.etest
|
44
|
+
Warning: Cannot reload module X
|
45
|
+
Loaded suite X::Etest
|
46
|
+
Started
|
47
|
+
.
|
48
|
+
|
49
|
+
Finished in 0.00111 seconds.
|
50
|
+
|
51
|
+
1 tests, 1 assertions, 0 failures, 0 errors, 0 pendings, 0 omissions, 0 notifications
|
52
|
+
100% passed
|
53
|
+
|
54
|
+
irb>
|
55
|
+
|
56
|
+
## License
|
57
|
+
|
58
|
+
The etest-unit gem is distributed under the terms of the Modified BSD License, see LICENSE.BSD for details.
|
data/lib/etest-unit.rb
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
require "test/unit"
|
2
|
+
|
3
|
+
require File.dirname(__FILE__) + "/string_ext"
|
4
|
+
require File.dirname(__FILE__) + "/module_ext"
|
5
|
+
|
6
|
+
require "test/unit/ui/console/testrunner"
|
7
|
+
|
8
|
+
module Etest
|
9
|
+
class TestCase < Test::Unit::TestCase
|
10
|
+
def self.etest=(etest)
|
11
|
+
include @etest = etest
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.suite
|
15
|
+
suite = super
|
16
|
+
suite.name = @etest.name
|
17
|
+
suite
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.run(etest)
|
22
|
+
test_case_klass = Class.new(TestCase)
|
23
|
+
test_case_klass.etest = etest
|
24
|
+
Test::Unit::UI::Console::TestRunner.new(test_case_klass).start
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
class Test::Unit::TestSuite
|
29
|
+
attr :name, true
|
30
|
+
end
|
31
|
+
|
32
|
+
__END__
|
33
|
+
|
34
|
+
def self.autorun
|
35
|
+
auto_run
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.auto_run
|
39
|
+
#
|
40
|
+
# find all modules that are not named /::Etest$/, and try to load
|
41
|
+
# the respective Etest module.
|
42
|
+
etests = Module.instances.map { |mod|
|
43
|
+
#next if mod.name =~ /\bEtest$/
|
44
|
+
next if mod.name == "Object"
|
45
|
+
|
46
|
+
Module.by_name "#{mod.name}::Etest"
|
47
|
+
}.compact.uniq.sort_by(&:name)
|
48
|
+
|
49
|
+
run(*etests)
|
50
|
+
end
|
51
|
+
|
52
|
+
def self.run(*etests)
|
53
|
+
#
|
54
|
+
# convert all Etest modules into a test case
|
55
|
+
test_cases = etests.map { |etest|
|
56
|
+
STDERR.puts "Running: #{etest}"
|
57
|
+
to_test_case etest
|
58
|
+
}
|
59
|
+
|
60
|
+
MiniTest::Test.run_etests(*test_cases)
|
61
|
+
end
|
62
|
+
|
63
|
+
#
|
64
|
+
# convert an Etest moodule into a MiniTest testcase
|
65
|
+
def self.to_test_case(mod)
|
66
|
+
klass = Class.new TestCase
|
67
|
+
klass.send :include, mod
|
68
|
+
klass.send :include, Assertions
|
69
|
+
|
70
|
+
Kernel.silent do
|
71
|
+
mod.const_set("TestCase", klass)
|
72
|
+
end
|
73
|
+
klass
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
data/lib/module_ext.rb
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
module Kernel
|
2
|
+
def self.silent(&block)
|
3
|
+
old_verbose, $VERBOSE = $VERBOSE, nil
|
4
|
+
yield
|
5
|
+
ensure
|
6
|
+
$VERBOSE = old_verbose
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
#
|
11
|
+
# TDD helpers for modules.
|
12
|
+
class Module
|
13
|
+
#
|
14
|
+
# reloads the module, and runs the module's etests.
|
15
|
+
def etest
|
16
|
+
reload if respond_to?(:reload)
|
17
|
+
::Etest.run self.const_get("Etest")
|
18
|
+
end
|
19
|
+
|
20
|
+
#
|
21
|
+
# returns all instances of a module
|
22
|
+
def instances #:nodoc:
|
23
|
+
r = []
|
24
|
+
ObjectSpace.each_object(self) { |mod| r << mod }
|
25
|
+
r
|
26
|
+
end
|
27
|
+
|
28
|
+
#
|
29
|
+
# load a module by name.
|
30
|
+
def self.by_name(name) #:nodoc:
|
31
|
+
Kernel.silent do
|
32
|
+
r = eval(name, nil, __FILE__, __LINE__)
|
33
|
+
r if r.is_a?(Module) && r.name == name
|
34
|
+
end
|
35
|
+
rescue NameError, LoadError
|
36
|
+
nil
|
37
|
+
end
|
38
|
+
|
39
|
+
#
|
40
|
+
# tries to reload the source file for this module. THIS IS A DEVELOPMENT
|
41
|
+
# helper, don't try to use it in production mode!
|
42
|
+
#
|
43
|
+
# Limitations:
|
44
|
+
#
|
45
|
+
# To reload a module with a name of "X::Y" we try to load (in that order)
|
46
|
+
# "x/y.rb", "x.rb"
|
47
|
+
#
|
48
|
+
def reload
|
49
|
+
Module::Reloader.reload_file("#{to_s.underscore}.rb") || begin
|
50
|
+
STDERR.puts("Warning: Cannot reload module #{self}")
|
51
|
+
false
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
module Reloader #:nodoc:
|
56
|
+
def self.reload_file(file)
|
57
|
+
begin
|
58
|
+
load(file) && file
|
59
|
+
rescue LoadError
|
60
|
+
nfile = file.gsub(/\/[^\/]+\.rb/, ".rb")
|
61
|
+
nfile != file && reload_file(nfile)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
data/lib/string_ext.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
class String
|
2
|
+
# taken from active-support
|
3
|
+
def underscore
|
4
|
+
gsub(/::/, '/').
|
5
|
+
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
|
6
|
+
gsub(/([a-z\d])([A-Z])/,'\1_\2').
|
7
|
+
tr("-", "_").
|
8
|
+
downcase
|
9
|
+
end
|
10
|
+
|
11
|
+
def camelize
|
12
|
+
gsub(/\/(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase }
|
13
|
+
end
|
14
|
+
end
|
data/test/etest_test.rb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
DIRNAME = File.expand_path File.dirname(__FILE__)
|
3
|
+
Dir.chdir(DIRNAME)
|
4
|
+
|
5
|
+
ETEST_TEST=true
|
6
|
+
|
7
|
+
require "etest-unit"
|
8
|
+
|
9
|
+
# ---------------------------------------------------------------------
|
10
|
+
|
11
|
+
module String::Etest
|
12
|
+
def test_camelize
|
13
|
+
assert_equal "x", "X".underscore
|
14
|
+
assert_equal "xa_la_nder", "XaLaNder".underscore
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_underscore
|
18
|
+
assert_equal "X", "x".camelize
|
19
|
+
assert_equal "XaLaNder", "xa_la_nder".camelize
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
module Fixnum::Etest
|
24
|
+
def test_success
|
25
|
+
$etests_did_run = true
|
26
|
+
assert true
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
String.etest
|
31
|
+
|
32
|
+
$etests_did_run = false
|
33
|
+
Fixnum.etest
|
34
|
+
exit(0) if $etests_did_run
|
35
|
+
|
36
|
+
STDERR.puts "Etests didn't run"
|
37
|
+
exit(1)
|
metadata
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: etest-unit
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.7.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- radiospiel
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-05-21 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: test-unit
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
description: Build your tests alongside your code.
|
31
|
+
email: eno@radiospiel.org
|
32
|
+
executables: []
|
33
|
+
extensions: []
|
34
|
+
extra_rdoc_files: []
|
35
|
+
files:
|
36
|
+
- lib/etest-unit/version.rb
|
37
|
+
- lib/etest-unit.rb
|
38
|
+
- lib/module_ext.rb
|
39
|
+
- lib/string_ext.rb
|
40
|
+
- README.md
|
41
|
+
- test/etest_test.rb
|
42
|
+
homepage: http://github.com/radiospiel/etest
|
43
|
+
licenses: []
|
44
|
+
post_install_message:
|
45
|
+
rdoc_options: []
|
46
|
+
require_paths:
|
47
|
+
- lib
|
48
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
segments:
|
55
|
+
- 0
|
56
|
+
hash: 1268382848584802831
|
57
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
58
|
+
none: false
|
59
|
+
requirements:
|
60
|
+
- - ! '>='
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
63
|
+
requirements: []
|
64
|
+
rubyforge_project:
|
65
|
+
rubygems_version: 1.8.24
|
66
|
+
signing_key:
|
67
|
+
specification_version: 3
|
68
|
+
summary: Build your tests alongside your code.
|
69
|
+
test_files: []
|