rspec 0.4.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
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
+