rspec 0.4.0 → 0.5.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.
Files changed (94) hide show
  1. data/CHANGES +7 -12
  2. data/Rakefile +17 -12
  3. data/TUTORIAL +1 -1
  4. data/WHY_RSPEC +115 -0
  5. data/bin/spec +17 -4
  6. data/bin/test2rspec +35 -0
  7. data/examples/airport_spec.rb +35 -0
  8. data/examples/mocking_spec.rb +16 -0
  9. data/examples/spec_framework_spec.rb +28 -0
  10. data/examples/stack.rb +36 -0
  11. data/examples/stack_spec.rb +112 -0
  12. data/lib/spec.rb +5 -18
  13. data/lib/spec/api.rb +4 -0
  14. data/lib/spec/{exceptions.rb → api/exceptions.rb} +1 -1
  15. data/lib/spec/{expectations.rb → api/expectations.rb} +5 -4
  16. data/lib/spec/api/helper.rb +10 -0
  17. data/lib/spec/{have_helper.rb → api/helper/have_helper.rb} +1 -1
  18. data/lib/spec/{instance_helper.rb → api/helper/instance_helper.rb} +0 -0
  19. data/lib/spec/{instance_negator.rb → api/helper/instance_negator.rb} +0 -0
  20. data/lib/spec/{kind_helper.rb → api/helper/kind_helper.rb} +0 -0
  21. data/lib/spec/{kind_negator.rb → api/helper/kind_negator.rb} +0 -0
  22. data/lib/spec/{respond_helper.rb → api/helper/respond_helper.rb} +0 -0
  23. data/lib/spec/{respond_negator.rb → api/helper/respond_negator.rb} +0 -0
  24. data/lib/spec/{should_base.rb → api/helper/should_base.rb} +6 -4
  25. data/lib/spec/{should_helper.rb → api/helper/should_helper.rb} +12 -0
  26. data/lib/spec/{should_negator.rb → api/helper/should_negator.rb} +11 -0
  27. data/lib/spec/api/mock.rb +184 -0
  28. data/lib/spec/rake/spectask.rb +153 -0
  29. data/lib/spec/runner.rb +9 -0
  30. data/lib/spec/runner/backtrace_tweaker.rb +17 -0
  31. data/lib/spec/runner/context.rb +47 -0
  32. data/lib/spec/runner/context_runner.rb +52 -0
  33. data/lib/spec/runner/execution_context.rb +15 -0
  34. data/lib/spec/runner/instance_exec.rb +15 -0
  35. data/lib/spec/runner/kernel_ext.rb +6 -0
  36. data/lib/spec/runner/option_parser.rb +41 -0
  37. data/lib/spec/runner/rdoc_formatter.rb +17 -0
  38. data/lib/spec/runner/simple_text_reporter.rb +92 -0
  39. data/lib/spec/runner/specification.rb +42 -0
  40. data/lib/spec/tool/command_line.rb +39 -0
  41. data/lib/spec/tool/test_unit_translator.rb +112 -0
  42. data/lib/spec/version.rb +13 -0
  43. data/test/spec/api/helper/arbitrary_predicate_test.rb +121 -0
  44. data/test/spec/api/helper/containment_test.rb +117 -0
  45. data/test/spec/api/helper/equality_test.rb +46 -0
  46. data/test/spec/api/helper/identity_test.rb +68 -0
  47. data/test/spec/api/helper/raising_test.rb +50 -0
  48. data/test/spec/api/helper/regex_matching_test.rb +38 -0
  49. data/test/spec/api/helper/should_satisfy_test.rb +37 -0
  50. data/test/spec/api/helper/throwing_test.rb +56 -0
  51. data/test/spec/api/helper/true_false_special_case_test.rb +87 -0
  52. data/test/spec/api/helper/typing_test.rb +107 -0
  53. data/test/spec/api/mock_test.rb +161 -0
  54. data/test/spec/runner/backtrace_tweaker_test.rb +20 -0
  55. data/test/spec/runner/context_runner_test.rb +19 -0
  56. data/test/spec/runner/context_test.rb +29 -0
  57. data/test/spec/runner/execution_context_test.rb +13 -0
  58. data/test/spec/runner/option_parser_test.rb +50 -0
  59. data/test/spec/runner/rdoc_formatter_test.rb +23 -0
  60. data/test/spec/runner/simple_text_reporter_test.rb +128 -0
  61. data/test/spec/runner/specification_test.rb +70 -0
  62. data/test/spec/tool/command_line_test.rb +22 -0
  63. data/test/spec/tool/test_unit_api_spec.rb +61 -0
  64. data/test/spec/tool/test_unit_api_test.rb +61 -0
  65. data/test/spec/tool/test_unit_translator_test.rb +29 -0
  66. data/test/test_helper.rb +8 -0
  67. metadata +89 -67
  68. data/examples/add_specification_spec.rb +0 -15
  69. data/examples/craps.rb +0 -15
  70. data/examples/craps_spec.rb +0 -105
  71. data/examples/dsl_spec.rb +0 -8
  72. data/examples/movie.rb +0 -7
  73. data/examples/movie_list.rb +0 -19
  74. data/examples/movie_spec.rb +0 -37
  75. data/lib/spec/collector.rb +0 -17
  76. data/lib/spec/context.rb +0 -89
  77. data/lib/spec/dsl.rb +0 -23
  78. data/lib/spec/gui_runner.rb +0 -59
  79. data/lib/spec/mock.rb +0 -183
  80. data/lib/spec/text_runner.rb +0 -75
  81. data/test/collection_owner.rb +0 -48
  82. data/test/context_fixtures_test.rb +0 -71
  83. data/test/context_run_test.rb +0 -174
  84. data/test/dsl_test.rb +0 -48
  85. data/test/error_reporting_test.rb +0 -225
  86. data/test/expectations_for_should_have_test.rb +0 -144
  87. data/test/expectations_test.rb +0 -592
  88. data/test/get_classes.rb +0 -6
  89. data/test/gui_runner_test.rb +0 -162
  90. data/test/mock_test.rb +0 -157
  91. data/test/spec_collection_test.rb +0 -39
  92. data/test/specification_addition_test.rb +0 -29
  93. data/test/specification_identification_test.rb +0 -71
  94. data/test/text_runner_test.rb +0 -146
data/CHANGES CHANGED
@@ -1,22 +1,17 @@
1
1
  = RSpec Changelog
2
2
 
3
- == Explanation of this file:
4
-
5
- * This document should be updated for every commit.
3
+ == Version 0.5.0
6
4
 
7
- * The first section of each version (until the lines starting with a *)
8
- will be used in the release notes' summary as well
9
- as in the news posted on rubyforge. Therefore,
10
- make sure it is a sentence that makes sense to the reader.
11
- It should summarise the release at a high level.
12
-
13
- * Make sure the PKG_VERSION constant in Rakefile.rb is
14
- consistent with the latest version in this document.
5
+ This release introduces a new API and obsoletes previous versions
6
+ * Lots and lots of changes. See examples.
15
7
 
16
8
  == Version 0.4.0
17
9
 
18
- The "two Daves walked into a bar" release.
10
+ The "two Daves walked into a bar and Aslak ruined the party" release.
19
11
 
12
+ * Moved source code to separate subfolders
13
+ * Added new DSL runner based on instance_exec
14
+ * Added spike for testdox/rdoc generation
20
15
  * merge Astels' and Chelimsky's work on ShouldHelper
21
16
  * this would be 0.5.0 if I updated the documentation
22
17
  * it breaks all of your existing specifications. We're not sorry.
data/Rakefile CHANGED
@@ -7,6 +7,8 @@ require 'rake/contrib/xforge'
7
7
  require 'rake/clean'
8
8
  require 'rake/testtask'
9
9
  require 'rake/rdoctask'
10
+ require 'lib/spec/version'
11
+ require 'lib/spec/rake/spectask'
10
12
 
11
13
  PKG_NAME = "rspec"
12
14
  # Versioning scheme: MAJOR.MINOR.PATCH
@@ -19,7 +21,7 @@ PKG_NAME = "rspec"
19
21
  # (This is subject to change - AH)
20
22
  #
21
23
  # REMEMBER TO KEEP PKG_VERSION IN SYNC WITH CHANGELOG
22
- PKG_VERSION = "0.4.0"
24
+ PKG_VERSION = Spec::VERSION::STRING
23
25
  PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
24
26
  PKG_FILES = FileList[
25
27
  '[A-Z]*',
@@ -29,23 +31,26 @@ PKG_FILES = FileList[
29
31
  'doc/**/*'
30
32
  ]
31
33
 
32
- task :default => [:test, :test_text_runner]
34
+ task :default => [:test] #, :test_text_runner]
35
+
36
+ Spec::Rake::SpecTask.new do |t|
37
+ t.spec_files = FileList['examples/**/*_spec.rb']
38
+ t.verbose = true
39
+ end
33
40
 
34
41
  Rake::TestTask.new do |t|
35
42
  t.libs << "test"
36
- t.test_files = FileList['**/*_test.rb'].exclude("test/*_collector_test.rb",
37
- "test/rspec_*.rb", "test/text_runner_test.rb")
43
+ t.test_files = FileList['test/**/*_test.rb']
38
44
  t.verbose = true
39
45
  end
40
46
 
41
47
  # text runner tests need to run individually
42
-
43
- Rake::TestTask.new(:test_text_runner) do |t|
44
- t.libs << "test"
45
- t.libs << "examples"
46
- t.test_files = FileList['test/text_runner_test.rb']
47
- t.verbose = true
48
- end
48
+ #Rake::TestTask.new(:test_text_runner) do |t|
49
+ # t.libs << "test"
50
+ # t.libs << "examples"
51
+ # t.test_files = FileList['test/text_runner_test.rb']
52
+ # t.verbose = true
53
+ #end
49
54
 
50
55
 
51
56
  # Create a task to build the RDOC documentation tree.
@@ -95,7 +100,7 @@ spec = Gem::Specification.new do |s|
95
100
  s.autorequire = 'spec'
96
101
 
97
102
  s.bindir = "bin"
98
- s.executables = ["spec"]
103
+ s.executables = ["spec", "test2rspec"]
99
104
  s.default_executable = "spec"
100
105
 
101
106
  #### Author and project details.
data/TUTORIAL CHANGED
@@ -236,7 +236,7 @@ includes "Star Wars", you will get the following error:
236
236
 
237
237
  1)
238
238
  <#<MovieList:0x284c1e0 @movies={"Star Wars"=>#<Movie:0x284c180 @name="Star Wars"
239
- >}>> should include <"Space Balls"> (Spec::Exceptions::ExpectationNotMetError)
239
+ >}>> should include <"Space Balls"> (Spec::Api::ExpectationNotMetError)
240
240
  ./movie_spec.rb:34:in `should_include_space_balls'
241
241
  ../bin/spec:10
242
242
 
@@ -0,0 +1,115 @@
1
+ == Why RSpec
2
+
3
+ === Readability
4
+ RSpec specifications read better than Test::Unit tests. Compare this:
5
+
6
+ class TemperatureCoverterTest < Test::Unit::TestCase
7
+ def test_converts_0C_to_32F
8
+ c = TemperatureCoverter.new
9
+ assert_equal(32.0, c.convert_from_c_to_f(0.0)
10
+ end
11
+
12
+ def test_converts_100C_to_100F
13
+ c = TemperatureCoverter.new
14
+ assert_equal(212.0, c.convert_from_c_to_f(100.0)
15
+ end
16
+ end
17
+
18
+ to this:
19
+
20
+ context "TemperatureCoverter"
21
+ specify "Converts 0C to 32F"
22
+ c = TemperatureCoverter.new
23
+ c.convert_from_c_to_f(0.0).should.equal 32.0
24
+ end
25
+
26
+ specify "Converts 100C to 212F"
27
+ c = TemperatureCoverter.new
28
+ c.convert_from_c_to_f(100.0).should.equal 212.0
29
+ end
30
+ end
31
+
32
+ === Built-in mocks
33
+ ....
34
+
35
+ === Self-documenting
36
+ RSpec specifications are self documenting. If run with the --rspec-report option,
37
+ it will produce the following report:
38
+
39
+ == TemperatureCoverter
40
+ * Converts 0C to 32F
41
+ * Converts 100C to 212F
42
+
43
+ RSpec reports gives a high-level overview of how the classes
44
+ in the system should behave. Of course, the developers have to
45
+ name their specifications appropriately.
46
+
47
+ By making RSpec reports visible as part of the API documentation,
48
+ developers are likely to put a little effort into making the RSpec
49
+ report make sense. Consider this example (translated from an
50
+ imaginary Test::Unit test):
51
+
52
+ context "TemperatureCoverter"
53
+ specify "Convert"
54
+ c = TemperatureCoverter.new
55
+ c.convert_from_c_to_f(0.0).should.equal 32.0
56
+ c.convert_from_c_to_f(100.0).should.equal 212.0
57
+ end
58
+ end
59
+
60
+ And the generated report:
61
+
62
+ == TemperatureCoverter
63
+ * Convert
64
+
65
+ This specification was translated from a Test::Unit file that has one test method,
66
+ <tt>test_onvert</tt>. It doesn't read so well, and it doesn't convey much high-leve
67
+ information about how the TemperatureCoverter class is supposed to behave. RSpec
68
+ encourages developers to give specifications a name that conveys the intent of the
69
+ specification. This in turn has several subtle benefits:
70
+
71
+ * Specifications tend to become smaller
72
+ * It tends to higlight too coupled code (specification names become complex)
73
+
74
+ It is the developers' responsibility to make sure that the name of each specification
75
+ represent at a high level what is being assumed in the specification body.
76
+
77
+ == What about my existing Test::Unit tests?
78
+ RSpec comes with a migration tool that will translate all of your existing
79
+ Test::Unit tests to RSpec specifications.
80
+
81
+ == How do I run RSpec specifications?
82
+
83
+ There are several ways to do this.
84
+
85
+ === Just run the ruby file
86
+ Any RSpec specification is stand-alone and can be run with:
87
+
88
+ ruby path/to/my/spec.rb
89
+
90
+ This will run your spec and output the results to stdout. You can use command line options
91
+ to tell RSpec to output documentation to a specific file too:
92
+
93
+ ruby path/to/my/spec.rb --rspec-report doc/rspec_report.rd
94
+
95
+ === Use the spec commandline
96
+ You can run several specifications with:
97
+
98
+ spec path/to/my/directory
99
+
100
+ or
101
+
102
+ spec path/to/my/directory --rspec-report doc/rspec_report.rd
103
+
104
+ === Use Rake
105
+ RSpec ships with a task similar that lets you run RSpec specifications
106
+ from Rake. Just upt the following in your Rakefile:
107
+
108
+ Rake::RSpecTask.new
109
+
110
+ This will create a task called <tt>spec</tt> task that you can run like this:
111
+
112
+ rake spec
113
+
114
+ By default this will run all the specifications under the spec directory. See
115
+ the Rake::RSpecTask documentation for details on how to override the defaults.
data/bin/spec CHANGED
@@ -1,10 +1,23 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require 'spec'
3
+ if ARGV.empty?
4
+ puts "You must provide a directory or file to run"
5
+ exit
6
+ end
7
+
8
+ require 'find'
9
+ require File.dirname(__FILE__) + "/../lib/spec"
10
+
11
+ context_runner = Spec::Runner::ContextRunner.new(ARGV)
12
+ Spec::Runner::Context.context_runner = context_runner
4
13
 
5
14
  ARGV.each do |file|
6
- require file
15
+ Find.find(file) do |path|
16
+ if FileTest.file?(path) and File.extname(path) == '.rb'
17
+ require path
18
+ end
19
+ end
7
20
  end
8
21
 
9
- runner = Spec::TextRunner.new
10
- runner.run
22
+ context_runner.run
23
+
@@ -0,0 +1,35 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'find'
4
+ require 'ostruct'
5
+ require 'optparse'
6
+ require File.dirname(__FILE__) + "/../lib/spec/tool/command_line.rb"
7
+ require File.dirname(__FILE__) + "/../lib/spec/tool/test_unit_translator.rb"
8
+
9
+ opts = OptionParser.new do |opts|
10
+ opts.banner = "Usage: test2rspec [options] SRC [DEST]"
11
+ opts.separator ""
12
+
13
+ opts.on_tail("-h", "--help", "Show this message") do
14
+ puts opts
15
+ exit
16
+ end
17
+ end
18
+ opts.parse!(ARGV)
19
+
20
+ cl = Spec::Tool::CommandLine.new
21
+ source = ARGV[0]
22
+ target = ARGV[1]
23
+
24
+ if source.nil?
25
+ STDERR.puts opts
26
+ exit 1
27
+ end
28
+
29
+ begin
30
+ cl.run source, target, STDOUT
31
+ rescue => e
32
+ STDERR.puts e.message
33
+ STDERR.puts e.backtrace.join("\n")
34
+ STDERR.puts opts
35
+ end
@@ -0,0 +1,35 @@
1
+ require File.dirname(__FILE__) + '/../lib/spec'
2
+
3
+ class Airport
4
+ def working?
5
+ true
6
+ end
7
+
8
+ def need?(thing)
9
+ thing != :cables
10
+ end
11
+ end
12
+
13
+ context "Airport at home" do
14
+ setup do
15
+ @airport = Airport.new
16
+ end
17
+
18
+ specify "should always work" do
19
+ @airport.should.be.working
20
+ end
21
+
22
+ specify "should not need cables" do
23
+ @airport.should.not.need :cables
24
+ end
25
+
26
+ specify "should not need electricity" do
27
+ # This will fail...
28
+ @airport.should.not.need :electricity
29
+ end
30
+
31
+ teardown do
32
+ @airport = nil
33
+ end
34
+
35
+ end
@@ -0,0 +1,16 @@
1
+ require File.dirname(__FILE__) + '/../lib/spec'
2
+
3
+ context "Mocker" do
4
+
5
+ specify "should be able to call mock()" do
6
+ mock = mock("poke me")
7
+ mock.should_receive(:poke)
8
+ mock.poke
9
+ end
10
+
11
+ specify "should fail when expected message not received" do
12
+ mock = mock("poke me")
13
+ mock.should_receive(:poke)
14
+ end
15
+
16
+ end
@@ -0,0 +1,28 @@
1
+ require File.dirname(__FILE__) + '/../lib/spec'
2
+
3
+ class SpecFramework
4
+ def intuitive?
5
+ true
6
+ end
7
+
8
+ def adopted_quickly?
9
+ false
10
+ end
11
+ end
12
+
13
+ context "Spec framework" do
14
+
15
+ setup do
16
+ @spec_framework = SpecFramework.new
17
+ end
18
+
19
+ specify "should be intuitive" do
20
+ @spec_framework.should.be.intuitive
21
+ end
22
+
23
+ specify "should be adopted quickly" do
24
+ #this will fail
25
+ @spec_framework.should.be.adopted_quickly
26
+ end
27
+
28
+ end
@@ -0,0 +1,36 @@
1
+ class StackUnderflowError < RuntimeError
2
+ end
3
+
4
+ class StackOverflowError < RuntimeError
5
+ end
6
+
7
+ class Stack
8
+
9
+ def initialize
10
+ @items = []
11
+ end
12
+
13
+ def push object
14
+ raise StackOverflowError if @items.length == 10
15
+ @items.push object
16
+ end
17
+
18
+ def pop
19
+ raise StackUnderflowError if @items.empty?
20
+ @items.delete @items.last
21
+ end
22
+
23
+ def top
24
+ raise StackUnderflowError if @items.empty?
25
+ @items.last
26
+ end
27
+
28
+ def empty?
29
+ @items.empty?
30
+ end
31
+
32
+ def size
33
+ @items.length
34
+ end
35
+
36
+ end
@@ -0,0 +1,112 @@
1
+ context "An empty stack" do
2
+
3
+ setup do
4
+ @stack = Stack.new
5
+ end
6
+
7
+ specify "should accept an item when sent push" do
8
+ lambda { @stack.push Object.new }.should.not.raise
9
+ end
10
+
11
+ specify "should complain when sent top" do
12
+ lambda { @stack.top }.should.raise StackUnderflowError
13
+ end
14
+
15
+ specify "should complain when sent pop" do
16
+ lambda { @stack.pop }.should.raise StackUnderflowError
17
+ end
18
+
19
+ end
20
+
21
+ context "A stack with one item" do
22
+ setup do
23
+ @stack = Stack.new
24
+ @stack.push 3
25
+ end
26
+
27
+ specify "should accept an item when sent push" do
28
+ lambda { @stack.push Object.new }.should.not.raise
29
+ end
30
+
31
+ specify "should return top when sent top" do
32
+ @stack.top.should.be 3
33
+ end
34
+
35
+ specify "should not remove top when sent top" do
36
+ @stack.top.should.be 3
37
+ @stack.top.should.be 3
38
+ end
39
+
40
+ specify "should return top when sent pop" do
41
+ @stack.pop.should.be 3
42
+ end
43
+
44
+ specify "should remove top when sent pop" do
45
+ @stack.pop.should.be 3
46
+ lambda { @stack.pop }.should.raise StackUnderflowError
47
+ end
48
+
49
+ end
50
+
51
+ context "An almost full stack (with one item less than capacity)" do
52
+ setup do
53
+ @stack = Stack.new
54
+ (1..9).each { |i| @stack.push i }
55
+ end
56
+
57
+ specify "should accept an item when sent push" do
58
+ @stack.push Object.new
59
+ end
60
+
61
+ specify "should return top when sent top" do
62
+ @stack.top.should.be 9
63
+ end
64
+
65
+ specify "should not remove top when sent top" do
66
+ @stack.top.should.be 9
67
+ @stack.top.should.be 9
68
+ end
69
+
70
+ specify "should return top when sent pop" do
71
+ @stack.pop.should.be 9
72
+ end
73
+
74
+ specify "should remove top when sent pop" do
75
+ @stack.pop.should.be 9
76
+ @stack.pop.should.be 8
77
+ end
78
+
79
+ end
80
+ context "A full stack" do
81
+
82
+ setup do
83
+ @stack = Stack.new
84
+ (1..10).each { |i| @stack.push i }
85
+ end
86
+
87
+ specify "should complain on push" do
88
+ lambda { @stack.push Object.new }.should.raise StackOverflowError
89
+ end
90
+
91
+ specify "should return top when sent top" do
92
+ @stack.top.should.be 10
93
+ end
94
+
95
+ specify "should not remove top when sent top" do
96
+ @stack.top.should.be 10
97
+ @stack.top.should.be 10
98
+ end
99
+
100
+ specify "should return top when sent pop" do
101
+ @stack.pop.should.be 10
102
+ end
103
+
104
+ specify "should remove top when sent pop" do
105
+ @stack.pop.should.be 10
106
+ @stack.pop.should.be 9
107
+ end
108
+
109
+ end
110
+
111
+
112
+