test-spec 0.2 → 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.
@@ -1,6 +1,6 @@
1
1
  = test/spec, a BDD interface for Test::Unit
2
2
 
3
- Copyright (C) 2006 Christian Neukirchen <mailto:chneukirchen@gmail.com>
3
+ Copyright (C) 2006, 2007 Christian Neukirchen <mailto:chneukirchen@gmail.com>
4
4
 
5
5
 
6
6
  == What is test/spec?
@@ -95,6 +95,56 @@ If you write an useful general-purpose assertion, I'd like to hear of
95
95
  it and may add it to the test/spec distribution.
96
96
 
97
97
 
98
+ == Messaging/Blaming
99
+
100
+ With more complex assertions, it may be helpful to provide a message
101
+ to show if the assertion has failed. This can be done with the
102
+ Should#blaming or Should#messaging methods:
103
+
104
+ RUBY_VERSION.should.messaging("Ruby too old.").be > "1.8.4"
105
+
106
+ (1 + 1).should.blaming("weird math").not.equal 11
107
+
108
+
109
+ == Custom shoulds ("Matchers")
110
+
111
+ To capture recurring patterns in parts of your specifications, you can
112
+ define custom "shoulds" (RSpec calls them "matchers") in your
113
+ contexts, or include modules of them:
114
+
115
+ context "Numbers"
116
+ class EqualString < Test::Spec::CustomShould
117
+ def matches?(other)
118
+ object == other.to_s
119
+ end
120
+ end
121
+
122
+ def equal_string(str)
123
+ EqualString.new(str)
124
+ end
125
+
126
+ specify "should have to_s"
127
+ 42.should equal_string("42")
128
+ end
129
+ end
130
+
131
+ Alternatively, your implementation can define
132
+ CustomShould#assumptions, where you can use test/spec assertions
133
+ instead of Boolean predicates:
134
+
135
+ class EqualString < Test::Spec::CustomShould
136
+ def assumptions(other)
137
+ object.should.equal other.to_s
138
+ end
139
+ end
140
+
141
+ A CustomShould by default takes one argument, which is placed in
142
+ self.object for your convenience.
143
+
144
+ You can CustomShould#failure_message to provide a better error
145
+ message.
146
+
147
+
98
148
  == SpecDox and RDox
99
149
 
100
150
  test/spec adds two additional test runners to Test::Unit, based on the
@@ -130,6 +180,13 @@ SpecDox and RDox work for Test::Unit too:
130
180
  3 specifications (30 requirements), 0 failures
131
181
 
132
182
 
183
+ == Disabled specifications
184
+
185
+ Akin to the usual Test::Unit practice, tests quickly can be disabled
186
+ by replacing +specify+ with +xspecify+. test/spec will count the
187
+ disabled tests when you run it with SpecDox or RDox.
188
+
189
+
133
190
  == specrb
134
191
 
135
192
  Since version 0.2, test/spec features a standalone test runner called
@@ -151,6 +208,18 @@ plain Test::Unit suites, too.
151
208
  Run <tt>specrb --help</tt> for the usage.
152
209
 
153
210
 
211
+ == Installing with RubyGems
212
+
213
+ Since version 0.3, a Gem of test/spec is available. You can install with:
214
+
215
+ gem install test-spec
216
+
217
+ I also provide a local mirror of the gems (and development snapshots)
218
+ at my site:
219
+
220
+ gem install test-spec --source http://chneukirchen.org/releases/gems
221
+
222
+
154
223
  == History
155
224
 
156
225
  * September 29th, 2006: First public release 0.1.
@@ -163,6 +232,18 @@ Run <tt>specrb --help</tt> for the usage.
163
232
  * Nested contexts
164
233
  * Standalone test/spec runner, specrb
165
234
 
235
+ * January 24th, 2007: Third public release 0.3.
236
+ * should.be_close, should.be_an_instance_of, should.be_a_kind_of,
237
+ and should.be_nil have been deprecated. Use the dot-variants of
238
+ them. These assertions will be removed in 1.0.
239
+ * specrb -a now includes -Ilib by default for easier out-of-the-box
240
+ testing.
241
+ * Added custom shoulds.
242
+ * Added messaging/blaming.
243
+ * Added disabling of specifications.
244
+ * Small bug fixes.
245
+ * Gem available.
246
+
166
247
 
167
248
  == Contact
168
249
 
@@ -176,6 +257,8 @@ http://chneukirchen.org/repos/testspec
176
257
  == Thanks to
177
258
 
178
259
  * Eero Saynatkari for writing <tt>should.output</tt>.
260
+ * Jean-Michel Garnier for packaging the first gem.
261
+ * Mikko Lehtonen for testing the gem.
179
262
  * Thomas Fuchs for script.aculo.us BDD testing which convinced me.
180
263
  * Dave Astels for BDD.
181
264
  * The RSpec team for API inspiration.
@@ -184,7 +267,7 @@ http://chneukirchen.org/repos/testspec
184
267
 
185
268
  == Copying
186
269
 
187
- Copyright (C) 2006 Christian Neukirchen <http://purl.org/net/chneukirchen>
270
+ Copyright (C) 2006, 2007 Christian Neukirchen <http://purl.org/net/chneukirchen>
188
271
 
189
272
  test/spec is licensed under the same terms as Ruby itself.
190
273
 
data/ROADMAP ADDED
@@ -0,0 +1 @@
1
+ Version 1.0 (February 2006):: first stable release.
data/Rakefile CHANGED
@@ -1,55 +1,6 @@
1
1
  # Rakefile for testspec. -*-ruby-*-
2
- #
3
- #
4
- #
5
- require 'rubygems'
6
- require 'rake'
7
- require 'rake/clean'
8
- require 'rake/testtask'
9
- require 'rake/packagetask'
10
- require 'rake/gempackagetask'
11
2
  require 'rake/rdoctask'
12
- require 'rake/contrib/rubyforgepublisher'
13
- require 'fileutils'
14
- require 'hoe'
15
- include FileUtils
16
- require File.join(File.dirname(__FILE__), 'lib', 'test-spec', 'version')
17
-
18
- AUTHOR = "Christian Neukirchen" # can also be an array of Authors
19
- EMAIL = "chneukirchen@gmail.com"
20
- DESCRIPTION = "Behaviour Driven Development with Test::Unit"
21
- GEM_NAME = "test-spec" # what ppl will type to install your gem
22
- RUBYFORGE_PROJECT = "test-spec" # The unix name for your project
23
- HOMEPATH = "http://#{RUBYFORGE_PROJECT}.rubyforge.org"
24
- RELEASE_TYPES = %w( gem ) # can use: gem, tar, zip
25
-
26
-
27
- NAME = "test-spec"
28
- REV = nil # UNCOMMENT IF REQUIRED: File.read(".svn/entries")[/committed-rev="(d+)"/, 1] rescue nil
29
- VERS = ENV['VERSION'] || (TestSpec::VERSION::STRING + (REV ? ".#{REV}" : ""))
30
- CLEAN.include ['**/.*.sw?', '*.gem', '.config']
31
- RDOC_OPTS = ['--quiet', '--title', "test_spec documentation",
32
- "--opname", "index.html",
33
- "--line-numbers",
34
- "--main", "README",
35
- "--inline-source"]
36
-
37
- # Generate all the Rake tasks
38
- # Run 'rake -T' to see list of generated tasks (from gem root directory)
39
- hoe = Hoe.new(GEM_NAME, VERS) do |p|
40
- p.author = AUTHOR
41
- p.description = DESCRIPTION
42
- p.email = EMAIL
43
- p.summary = DESCRIPTION
44
- p.url = HOMEPATH
45
- p.rubyforge_name = RUBYFORGE_PROJECT if RUBYFORGE_PROJECT
46
- p.test_globs = ["test/**/*_test.rb"]
47
- p.clean_globs = CLEAN #An array of file patterns to delete on clean.
48
- p.extra_deps = ['flexmock','>= 0.4.3'],['mocha','>= 0.3.2']
49
- # == Optional
50
- #p.changes - A description of the release's latest changes.
51
- #p.spec_extras - A hash of extra values to set in the gemspec.
52
- end
3
+ require 'rake/testtask'
53
4
 
54
5
 
55
6
  desc "Run all the tests"
@@ -59,15 +10,36 @@ desc "Do predistribution stuff"
59
10
  task :predist => [:chmod, :changelog, :rdoc]
60
11
 
61
12
 
62
- desc "Run all the tests"
63
- task :test => :chmod do
64
- ruby "bin/specrb -Ilib:test -w #{ENV['TEST'] || '-a'} #{ENV['TESTOPTS']}"
65
- end
66
-
67
13
  desc "Make an archive as .tar.gz"
68
14
  task :dist => :test do
69
15
  system "export DARCS_REPO=#{File.expand_path "."}; " +
70
- "darcs dist -d testspec#{get_darcs_tree_version}"
16
+ "darcs dist -d test-spec#{get_darcs_tree_version}"
17
+ end
18
+
19
+ # Helper to retrieve the "revision number" of the darcs tree.
20
+ def get_darcs_tree_version
21
+ return "" unless File.directory? "_darcs"
22
+
23
+ changes = `darcs changes`
24
+ count = 0
25
+ tag = "0.0"
26
+
27
+ changes.each("\n\n") { |change|
28
+ head, title, desc = change.split("\n", 3)
29
+
30
+ if title =~ /^ \*/
31
+ # Normal change.
32
+ count += 1
33
+ elsif title =~ /tagged (.*)/
34
+ # Tag. We look for these.
35
+ tag = $1
36
+ break
37
+ else
38
+ warn "Unparsable change: #{change}"
39
+ end
40
+ }
41
+
42
+ "-" + tag + "." + count.to_s
71
43
  end
72
44
 
73
45
  desc "Make binaries executable"
@@ -80,10 +52,78 @@ task :changelog do
80
52
  system "darcs changes --repo=#{ENV["DARCS_REPO"] || "."} >ChangeLog"
81
53
  end
82
54
 
55
+
56
+ desc "Generate RDox"
57
+ task "SPECS" do
58
+ ruby "bin/specrb -Ilib:test -a --rdox >SPECS"
59
+ end
60
+
61
+
62
+ begin
63
+ # To generate the gem, run "rake package"
64
+
65
+ $" << "sources" if defined? FromSrc
66
+ require 'rubygems'
67
+
68
+ require 'rake'
69
+ require 'rake/clean'
70
+ require 'rake/packagetask'
71
+ require 'rake/gempackagetask'
72
+ require 'rake/contrib/rubyforgepublisher'
73
+ require 'fileutils'
74
+ require 'hoe'
75
+ rescue LoadError
76
+ # Too bad.
77
+
78
+ desc "Run all the tests"
79
+ task :test => :chmod do
80
+ ruby "bin/specrb -Ilib:test -w #{ENV['TEST'] || '-a'} #{ENV['TESTOPTS']}"
81
+ end
82
+
83
+ else
84
+
85
+ RDOC_OPTS = ['--title', "test/spec documentation",
86
+ "--opname", "index.html",
87
+ "--line-numbers",
88
+ "--main", "README",
89
+ "--inline-source"]
90
+
91
+ # Generate all the Rake tasks
92
+ # Run 'rake -T' to see list of generated tasks (from gem root directory)
93
+ hoe = Hoe.new("test-spec", get_darcs_tree_version[1..-1]) do |p|
94
+ p.author = "Christian Neukirchen"
95
+ p.description = "a Behaviour Driven Development interface for Test::Unit"
96
+ p.email = "chneukirchen@gmail.com"
97
+ p.summary = <<EOF
98
+ test/spec layers an RSpec-inspired interface on top of Test::Unit, so
99
+ you can mix TDD and BDD (Behavior-Driven Development).
100
+
101
+ test/spec is a clean-room implementation that maps most kinds of
102
+ Test::Unit assertions to a `should'-like syntax.
103
+ EOF
104
+ p.url = "http://test-spec.rubyforge.org"
105
+ p.test_globs = ["test/**/{test,spec}_*.rb"]
106
+ p.clean_globs = []
107
+ p.extra_deps = ['flexmock','>= 0.4.1'],['mocha','>= 0.3.2']
108
+ p.need_tar = false # we do that ourselves
109
+ p.changes = File.read("README")[/^== History\n(.*?)^==/m, 1].
110
+ split(/\n{2,}/).last
111
+ end
112
+
113
+ task :package => ["Manifest.txt", :dist]
114
+
115
+ # Yes, this is ridiculous.
116
+ hoe.spec.dependencies.delete_if { |dep| dep.name == "hoe" }
117
+ Rake.application.instance_variable_get(:@tasks).delete :docs
118
+ Rake.application.instance_variable_get(:@tasks).delete "doc/index.html"
119
+ task :docs => :rdoc
120
+ end
121
+
122
+
83
123
  desc "Generate RDoc documentation"
84
124
  Rake::RDocTask.new(:rdoc) do |rdoc|
85
125
  rdoc.options << '--line-numbers' << '--inline-source'
86
- rdoc.rdoc_dir = "rdoc"
126
+ rdoc.rdoc_dir = "doc"
87
127
  rdoc.rdoc_files.include 'README'
88
128
  rdoc.rdoc_files.include 'ROADMAP'
89
129
  rdoc.rdoc_files.include 'SPECS'
@@ -91,47 +131,21 @@ Rake::RDocTask.new(:rdoc) do |rdoc|
91
131
  end
92
132
  task :rdoc => "SPECS"
93
133
 
94
- desc "Generate RDox"
95
- task "SPECS" do
96
- ruby "bin/specrb -Ilib:test -a --rdox >SPECS"
134
+
135
+ desc "Generate Manifest.txt"
136
+ task "Manifest.txt" do
137
+ system "darcs query manifest | sed 's:^./::' >Manifest.txt"
97
138
  end
98
139
 
99
140
  begin
100
141
  require 'rcov/rcovtask'
101
142
 
102
143
  Rcov::RcovTask.new do |t|
103
- t.test_files = FileList['test/spec_*.rb'] + ['--', '-rs'] # evil
144
+ t.test_files = FileList['test/{spec,test}_*.rb'] + ['--', '-rs'] # evil
104
145
  t.verbose = true # uncomment to see the executed command
105
- t.rcov_opts = ["--text-report", "--include-file", "^lib\\|^test"]
146
+ t.rcov_opts = ["--text-report",
147
+ "--include-file", "^lib,^test",
148
+ "--exclude-only", "^/usr,^/home/.*/src"]
106
149
  end
107
150
  rescue LoadError
108
151
  end
109
-
110
-
111
- # Helper to retrieve the "revision number" of the darcs tree.
112
- def get_darcs_tree_version
113
- return "" unless File.directory? "_darcs"
114
-
115
- changes = `darcs changes`
116
- count = 0
117
- tag = "0.0"
118
-
119
- changes.each("\n\n") { |change|
120
- head, title, desc = change.split("\n", 3)
121
-
122
- if title =~ /^ \*/
123
- # Normal change.
124
- count += 1
125
- elsif title =~ /tagged (.*)/
126
- # Tag. We look for these.
127
- tag = $1
128
- break
129
- else
130
- warn "Unparsable change: #{change}"
131
- end
132
- }
133
-
134
- "-" + tag + "." + count.to_s
135
- end
136
-
137
-
data/TODO ADDED
@@ -0,0 +1,2 @@
1
+ - see ROADMAP
2
+ - better handling of .should outside of specify(?)
@@ -0,0 +1,104 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- ruby -*-
3
+
4
+ require 'optparse'
5
+
6
+ testrbargv = []
7
+ automatic = false
8
+
9
+ opts = OptionParser.new("", 24, ' ') { |opts|
10
+ opts.banner = "Usage: specrb [options] [files | -a] [-- untouched arguments]"
11
+
12
+ opts.separator ""
13
+ opts.separator "Ruby options:"
14
+
15
+ lineno = 1
16
+ opts.on("-e", "--eval LINE", "evaluate a LINE of code") { |line|
17
+ eval line, TOPLEVEL_BINDING, "-e", lineno
18
+ lineno += 1
19
+ }
20
+
21
+ opts.on("-d", "--debug", "set debugging flags (set $DEBUG to true)") {
22
+ $DEBUG = true
23
+ }
24
+ opts.on("-w", "--warn", "turn warnings on for your script") {
25
+ $-w = true
26
+ }
27
+
28
+ opts.on("-I", "--include PATH",
29
+ "specify $LOAD_PATH (may be used more than once)") { |path|
30
+ $LOAD_PATH.unshift *path.split(":")
31
+ }
32
+
33
+ opts.on("-r", "--require LIBRARY",
34
+ "require the library, before executing your script") { |library|
35
+ require library
36
+ }
37
+
38
+ opts.separator ""
39
+ opts.separator "test/spec options:"
40
+
41
+ opts.on("-s", "--specdox", "do AgileDox-like output") {
42
+ testrbargv << "--runner=specdox"
43
+ }
44
+ opts.on("--rdox", "do AgileDox-like output with RDoc formatting") {
45
+ testrbargv << "--runner=rdox"
46
+ }
47
+
48
+ opts.on("-a", "--automatic", "gather tests from ./test/, include ./lib/") {
49
+ $LOAD_PATH.unshift "lib" if File.directory? "lib"
50
+ automatic = true
51
+ }
52
+
53
+ opts.separator ""
54
+ opts.separator "test/unit options:"
55
+
56
+ opts.on('-n', '--name NAME', String,
57
+ "runs tests matching regexp NAME") { |n|
58
+ testrbargv << "-n" << "/#{n}/"
59
+ }
60
+
61
+ opts.on('-t', '--testcase TESTCASE', String,
62
+ "runs tests in TestCases matching regexp TESTCASE") { |t|
63
+ testrbargv << "-t" << "/#{t}/"
64
+ }
65
+
66
+ opts.separator ""
67
+ opts.separator "Common options:"
68
+
69
+ opts.on_tail("-h", "--help", "Show this message") do
70
+ puts opts
71
+ exit
72
+ end
73
+
74
+ opts.on_tail("--version", "Show version") do
75
+ require 'test/spec'
76
+ puts "specrb #{Test::Spec::VERSION}"
77
+ exit
78
+ end
79
+
80
+ opts.parse! ARGV
81
+ }
82
+
83
+ files = ARGV
84
+
85
+ if automatic
86
+ files.concat Dir["test/test_*.rb"]
87
+ files.concat Dir["test/spec_*.rb"]
88
+ files.concat Dir["spec/spec_*.rb"]
89
+ end
90
+
91
+ if files.empty?
92
+ puts opts.banner
93
+ exit 1
94
+ end
95
+
96
+ argv = testrbargv + ["--"] + files
97
+
98
+ require 'test/spec'
99
+
100
+ Test::Unit.run = false
101
+ runner = Test::Unit::AutoRunner.new true
102
+ runner.process_args(argv) ||
103
+ abort("internal error calling Test::Unit, please report a bug")
104
+ exit runner.run