rspec 0.5.3 → 0.5.4

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 (100) hide show
  1. data/CHANGES +57 -32
  2. data/EXAMPLES.rd +0 -0
  3. data/Rakefile +22 -21
  4. data/bin/spec +9 -11
  5. data/doc/README +1 -3
  6. data/doc/plugin/syntax.rb +27 -5
  7. data/doc/src/core_team.page +22 -0
  8. data/doc/src/default.css +11 -11
  9. data/doc/src/default.template +0 -1
  10. data/doc/src/documentation/index.page +183 -8
  11. data/doc/src/documentation/meta.info +7 -7
  12. data/doc/src/documentation/mocks.page +168 -109
  13. data/doc/src/documentation/underscores.page +20 -0
  14. data/doc/src/examples.page +2 -1
  15. data/doc/src/images/David_and_Aslak.jpg +0 -0
  16. data/doc/src/images/Whats_That_Dude.jpg +0 -0
  17. data/doc/src/index.page +70 -3
  18. data/doc/src/meta.info +18 -11
  19. data/doc/src/tools/index.page +40 -134
  20. data/doc/src/tools/meta.info +9 -3
  21. data/doc/src/tools/rails.page +3 -1
  22. data/doc/src/tools/rake.page +20 -3
  23. data/doc/src/tools/rcov.page +19 -0
  24. data/doc/src/tools/spec.page +99 -0
  25. data/doc/src/tools/test2rspec.page +2 -4
  26. data/doc/src/tutorials/index.page +52 -0
  27. data/doc/src/tutorials/meta.info +31 -0
  28. data/doc/src/tutorials/notes.txt +252 -0
  29. data/doc/src/tutorials/stack.rb +11 -0
  30. data/doc/src/tutorials/stack_01.page +224 -0
  31. data/doc/src/tutorials/stack_02.page +180 -0
  32. data/doc/src/tutorials/stack_03.page +291 -0
  33. data/doc/src/tutorials/stack_04.page +203 -0
  34. data/doc/src/tutorials/stack_04.page.orig +123 -0
  35. data/doc/src/tutorials/stack_05.page +90 -0
  36. data/doc/src/tutorials/stack_05.page.orig +124 -0
  37. data/doc/src/tutorials/stack_06.page +359 -0
  38. data/doc/src/tutorials/stack_06.page.orig +359 -0
  39. data/doc/src/tutorials/stack_spec.rb +41 -0
  40. data/examples/airport_spec.rb +4 -4
  41. data/examples/{spec_framework_spec.rb → bdd_framework_spec.rb} +6 -7
  42. data/examples/mocking_spec.rb +0 -5
  43. data/examples/stack_spec.rb +6 -7
  44. data/examples/sugar_spec.rb +14 -0
  45. data/lib/spec/api.rb +5 -2
  46. data/lib/spec/api/helper/should_base.rb +17 -22
  47. data/lib/spec/api/helper/should_helper.rb +4 -3
  48. data/lib/spec/api/helper/should_negator.rb +3 -2
  49. data/lib/spec/api/mocks/argument_expectation.rb +104 -0
  50. data/lib/spec/api/{mock.rb → mocks/message_expectation.rb} +47 -96
  51. data/lib/spec/api/mocks/mock.rb +63 -0
  52. data/lib/spec/api/mocks/order_group.rb +21 -0
  53. data/lib/spec/api/sugar.rb +47 -0
  54. data/lib/spec/rake/rcov_verify.rb +45 -0
  55. data/lib/spec/rake/spectask.rb +41 -56
  56. data/lib/spec/runner.rb +4 -1
  57. data/lib/spec/runner/backtrace_tweaker.rb +24 -3
  58. data/lib/spec/runner/base_text_formatter.rb +28 -0
  59. data/lib/spec/runner/context.rb +21 -18
  60. data/lib/spec/runner/context_runner.rb +20 -31
  61. data/lib/spec/runner/execution_context.rb +3 -3
  62. data/lib/spec/runner/kernel_ext.rb +10 -1
  63. data/lib/spec/runner/option_parser.rb +32 -14
  64. data/lib/spec/runner/progress_bar_formatter.rb +21 -0
  65. data/lib/spec/runner/rdoc_formatter.rb +15 -5
  66. data/lib/spec/runner/reporter.rb +100 -0
  67. data/lib/spec/runner/specdoc_formatter.rb +20 -0
  68. data/lib/spec/runner/specification.rb +42 -22
  69. data/lib/spec/version.rb +1 -1
  70. data/test/rcov/rcov_testtask.rb +1 -0
  71. data/test/spec/api/duck_type_test.rb +4 -4
  72. data/test/spec/api/helper/raising_test.rb +37 -17
  73. data/test/spec/api/{mock_arg_constraints_test.rb → mocks/mock_arg_constraints_test.rb} +10 -4
  74. data/test/spec/api/mocks/mock_ordering_test.rb +62 -0
  75. data/test/spec/api/{mock_test.rb → mocks/mock_test.rb} +30 -7
  76. data/test/spec/api/mocks/null_object_test.rb +31 -0
  77. data/test/spec/api/sugar_test.rb +71 -0
  78. data/test/spec/runner/backtrace_tweaker_test.rb +52 -4
  79. data/test/spec/runner/context_runner_test.rb +41 -21
  80. data/test/spec/runner/context_test.rb +60 -32
  81. data/test/spec/runner/execution_context_test.rb +4 -3
  82. data/test/spec/runner/failure_dump_test.rb +92 -0
  83. data/test/spec/runner/kernel_ext_test.rb +1 -2
  84. data/test/spec/runner/option_parser_test.rb +48 -28
  85. data/test/spec/runner/progress_bar_formatter_test.rb +48 -0
  86. data/test/spec/runner/rdoc_formatter_test.rb +31 -4
  87. data/test/spec/runner/reporter_test.rb +103 -0
  88. data/test/spec/runner/specdoc_formatter_test.rb +50 -0
  89. data/test/spec/runner/specification_test.rb +49 -11
  90. data/test/test_helper.rb +1 -4
  91. metadata +46 -15
  92. data/doc/src/community.page +0 -7
  93. data/doc/src/documentation/api.page +0 -185
  94. data/doc/src/why_rspec.page +0 -7
  95. data/examples/empty_stack_spec.rb +0 -22
  96. data/examples/team_spec.rb +0 -30
  97. data/lib/spec/api/duck_type.rb +0 -16
  98. data/lib/spec/runner/simple_text_reporter.rb +0 -88
  99. data/test/rcov/rcov_verify.rb +0 -28
  100. data/test/spec/runner/simple_text_reporter_test.rb +0 -123
data/CHANGES CHANGED
@@ -1,30 +1,55 @@
1
1
  = RSpec Changelog
2
2
 
3
+ == Version 0.5.4 (in SVN)
4
+ Release notes go here
5
+
6
+ * Support for running a single spec with --spec
7
+ * Exitcode is now 1 unless all specs pass, in which case it's 0.
8
+ * -v, --version now both mean the same thing
9
+ * For what was verbose output (-v), use --format specdoc or -f s
10
+ * --format rdoc always runs in dry-run mode
11
+ * Removed --doc and added --format and --dry-run
12
+ * Refactored towards more pluggable formatters
13
+ * Use webgen's execute tag when generating website (more accurate)
14
+ * Fixed incorrect quoting of spec_opts in SpecTask
15
+ * Added patch to enable underscored shoulds like 1.should_equal(1) - patch from Rich Kilmer
16
+ * Removed most inherited instance method from Mock, making more methods mockable.
17
+ * Made the RCovVerify task part of the standard toolset.
18
+ * Documented Rake task and how to use it with Rcov
19
+ * Implemented <ruby></ruby> tags for website (hooking into ERB, RedCloth and syntax)
20
+ * RSpec Rake task now takes spec_opts and out params so it can be used for doc generation
21
+ * RCov integration for RSpec Rake task (#4058)
22
+ * Group all results instead of printing them several times (#4057)
23
+ * Mocks can now yield
24
+ * Various improvements to error reporting (including #4191)
25
+ * backtrace excludes rspec code - use -b to include it
26
+ * split examples into examples (passing) and failing_examples
27
+
3
28
  == Version 0.5.3
4
29
  The "hurry up, CoR is in two days" release.
5
30
 
6
- * Don't run rcov by default [aslak_hellesoy]
7
- * Make separate task for running tests with RCov [aslak_hellesoy]
8
- * Added Rake task to fail build if coverage drops below a certain threshold [aslak_hellesoy]
9
- * Even more failure output cleanup (simplification) [dchelimsky]
10
- * Added duck_type constraint for mocks [dchelimsky]
31
+ * Don't run rcov by default
32
+ * Make separate task for running tests with RCov
33
+ * Added Rake task to fail build if coverage drops below a certain threshold
34
+ * Even more failure output cleanup (simplification)
35
+ * Added duck_type constraint for mocks
11
36
 
12
37
  == Version 0.5.2
13
38
  This release has minor improvements to the commandline and fixes some gem warnings
14
39
 
15
- * Readded README to avoid RDoc warnings [aslak_hellesoy]
16
- * Added --version switch to commandline [aslak_hellesoy]
17
- * More changes to the mock API [dastels], [dchelimsky]
40
+ * Readded README to avoid RDoc warnings
41
+ * Added --version switch to commandline
42
+ * More changes to the mock API
18
43
 
19
44
  == Version 0.5.1
20
45
  This release is the first release of RSpec with a new website. It will look better soon.
21
46
 
22
- * Added initial documentation for API [dastels]
23
- * Added website based on webgen [aslak_hellesoy]
24
- * Modified test task to use rcov [aslak_hellesoy]
25
- * Deleted unused code (thanks, rcov!) [aslak_hellesoy]
26
- * Various changes to the mock API [dastels], [dchelimsky]
27
- * Various improvements to failure reporting [dchelimsky]
47
+ * Added initial documentation for API
48
+ * Added website based on webgen
49
+ * Modified test task to use rcov
50
+ * Deleted unused code (thanks, rcov!)
51
+ * Various changes to the mock API,
52
+ * Various improvements to failure reporting
28
53
 
29
54
  == Version 0.5.0
30
55
  This release introduces a new API and obsolesces previous versions.
@@ -74,23 +99,23 @@ This release improves installation and documentation, mock integration and error
74
99
  * Comparison errors now print the class name too.
75
100
  * Mocks now take an optional +options+ parameter to specify behaviour.
76
101
  * Removed __expects in favour of should_receive
77
- * Added line number reporting in mock error messages for unreceived message expectations (AH).
78
- * Added should_match and should_not_match (AH).
79
- * Added a +mock+ method to Spec::Context which will create mocks that autoverify (no need to call __verify) (AH).
80
- * Mocks now require names in the constructor to ensure sensible error messages (AH).
81
- * Made 'spec' executable and updated usage instructions in README accordingly (AH).
82
- * Made more parts of the Spec::Context API private to avoid accidental usage (AH).
102
+ * Added line number reporting in mock error messages for unreceived message expectations.
103
+ * Added should_match and should_not_match.
104
+ * Added a +mock+ method to Spec::Context which will create mocks that autoverify (no need to call __verify).
105
+ * Mocks now require names in the constructor to ensure sensible error messages.
106
+ * Made 'spec' executable and updated usage instructions in README accordingly.
107
+ * Made more parts of the Spec::Context API private to avoid accidental usage.
83
108
  * Added more RDoc to Spec::Context.
84
109
 
85
110
  == Version 0.1.6
86
111
 
87
112
  More should methods.
88
113
 
89
- * Added should_match and should_not_match (AH).
114
+ * Added should_match and should_not_match.
90
115
 
91
116
  == Version 0.1.5
92
117
 
93
- Included examples and tests in gem (AH).
118
+ Included examples and tests in gem.
94
119
 
95
120
  == Version 0.1.4
96
121
 
@@ -106,23 +131,23 @@ Improved mocking:
106
131
 
107
132
  This release adds some improvements to the mock API and minor syntax improvements
108
133
 
109
- * Added Mock.should_expect for a more consistent DSL (AH).
110
- * Added MockExpectation.and_returns for a better DSL (AH).
111
- * Made Mock behave as a null object after a call to Mock.ignore_missing (AH)
112
- * Internal syntax improvements (AH).
113
- * Improved exception trace by adding exception class name to error message (AH).
114
- * Renamed some tests for better consistency (AH).
134
+ * Added Mock.should_expect for a more consistent DSL.
135
+ * Added MockExpectation.and_returns for a better DSL.
136
+ * Made Mock behave as a null object after a call to Mock.ignore_missing
137
+ * Internal syntax improvements.
138
+ * Improved exception trace by adding exception class name to error message.
139
+ * Renamed some tests for better consistency.
115
140
 
116
141
  == Version 0.1.1
117
142
 
118
143
  This release adds some shoulds and improves error reporting
119
144
 
120
- * Added should_be_same_as and should_not_be_same_as (AH).
121
- * Improved error reporting for comparison expectations (AH).
145
+ * Added should_be_same_as and should_not_be_same_as.
146
+ * Improved error reporting for comparison expectations.
122
147
 
123
148
  == Version 0.1.0
124
149
 
125
150
  This is the first preview release of RSpec, a Behaviour-Driven Development library for Ruby
126
151
 
127
- * Added Rake script with tasks for gems, rdoc etc (AH).
128
- * Added an XForge task to make release go easier (AH).
152
+ * Added Rake script with tasks for gems, rdoc etc.
153
+ * Added an XForge task to make release go easier.
File without changes
data/Rakefile CHANGED
@@ -5,10 +5,16 @@ require 'rake/contrib/rubyforgepublisher'
5
5
  require 'rake/clean'
6
6
  require 'rake/testtask'
7
7
  require 'rake/rdoctask'
8
- require 'lib/spec/version'
9
- require 'lib/spec/rake/spectask'
8
+ require 'spec/version'
9
+ require 'spec/rake/spectask'
10
+ require 'spec/rake/rcov_verify'
10
11
  require 'test/rcov/rcov_testtask'
11
- require 'test/rcov/rcov_verify'
12
+
13
+ # Some of the tasks are in separate files since they are also part of the website documentation
14
+ load File.dirname(__FILE__) + '/test/tasks/examples.rake'
15
+ load File.dirname(__FILE__) + '/test/tasks/examples_specdoc.rake'
16
+ load File.dirname(__FILE__) + '/test/tasks/examples_with_rcov.rake'
17
+ load File.dirname(__FILE__) + '/test/tasks/rcov_verify.rake'
12
18
 
13
19
  PKG_NAME = "rspec"
14
20
  # Versioning scheme: MAJOR.MINOR.PATCH
@@ -27,11 +33,11 @@ PKG_FILES = FileList[
27
33
  'doc/**/*'
28
34
  ]
29
35
 
30
- task :default => [:test] #, :test_text_runner]
36
+ task :default => [:test]
31
37
 
32
- Spec::Rake::SpecTask.new do |t|
33
- t.spec_files = FileList['examples/**/*_spec.rb']
34
- t.verbose = true
38
+ desc "Run all failing examples"
39
+ Spec::Rake::SpecTask.new('failing_examples') do |t|
40
+ t.spec_files = FileList['failing_examples/**/*_spec.rb']
35
41
  end
36
42
 
37
43
  Rake::TestTask.new do |t|
@@ -46,7 +52,7 @@ end
46
52
 
47
53
  desc 'Generate HTML documentation'
48
54
  task :doc do
49
- sh %{pushd doc; webgen; popd }
55
+ sh %{pushd doc; webgen; popd}
50
56
  end
51
57
 
52
58
  desc 'Generate RDoc'
@@ -54,8 +60,7 @@ rd = Rake::RDocTask.new("rdoc") do |rdoc|
54
60
  rdoc.rdoc_dir = 'doc/output/rdoc'
55
61
  rdoc.title = "RSpec"
56
62
  rdoc.options << '--line-numbers' << '--inline-source' << '--main' << 'README'
57
- rdoc.rdoc_files.include('README', 'CHANGES')
58
- rdoc.rdoc_files.include('lib/**/*.rb', 'doc/**/*.rdoc')
63
+ rdoc.rdoc_files.include('README', 'CHANGES', 'EXAMPLES.rd', 'lib/**/*.rb')
59
64
  end
60
65
 
61
66
  spec = Gem::Specification.new do |s|
@@ -120,15 +125,10 @@ task :clobber do
120
125
  rm_rf 'doc/output'
121
126
  end
122
127
 
123
- task :release => [:clobber, :verify_user, :verify_password, :test, :upload_releases, :publish_website, :publish_news]
128
+ task :release => [:clobber, :verify_user, :verify_password, :test, :publish_packages, :publish_website, :publish_news]
124
129
 
125
130
  desc "Build the website with rdoc and rcov, but do not publish it"
126
- task :website => [:clobber, :copy_rcov_report, :doc, :rdoc]
127
-
128
- RCov::VerifyTask.new do |t|
129
- t.threshold = 99.1 # Don't make it lower unless you have a damn good reason.
130
- t.index_html = 'coverage/index.html'
131
- end
131
+ task :website => [:clobber, :copy_rcov_report, :doc, :examples_specdoc, :rdoc]
132
132
 
133
133
  task :copy_rcov_report => [:test_with_rcov, :rcov_verify] do
134
134
  rm_rf 'doc/output/coverage'
@@ -138,6 +138,7 @@ end
138
138
 
139
139
  task :verify_user do
140
140
  raise "RUBYFORGE_USER environment variable not set!" unless ENV['RUBYFORGE_USER']
141
+ raise "BEHAVIOURDRIVEN_USER environment variable not set!" unless ENV['BEHAVIOURDRIVEN_USER']
141
142
  end
142
143
 
143
144
  task :verify_password do
@@ -147,16 +148,16 @@ end
147
148
  desc "Upload Website to RubyForge"
148
149
  task :publish_website => [:verify_user, :website] do
149
150
  publisher = Rake::SshDirPublisher.new(
150
- "#{ENV['RUBYFORGE_USER']}@rubyforge.org",
151
- "/var/www/gforge-projects/#{PKG_NAME}",
151
+ "#{ENV['BEHAVIOURDRIVEN_USER']}@www.behaviourdriven.org",
152
+ "/var/www/behaviourdriven.org/htdocs/#{PKG_NAME}",
152
153
  "doc/output"
153
154
  )
154
155
 
155
156
  publisher.upload
156
157
  end
157
158
 
158
- desc "Release gem+tgz+zip to RubyForge. You must make sure lib/version.rb is aligned with the CHANGELOG file"
159
- task :upload_releases => [:verify_user, :verify_password, :package] do
159
+ desc "Publish gem+tgz+zip on RubyForge. You must make sure lib/version.rb is aligned with the CHANGELOG file"
160
+ task :publish_packages => [:verify_user, :verify_password, :package] do
160
161
  require 'meta_project'
161
162
  require 'rake/contrib/xforge'
162
163
  release_files = FileList[
data/bin/spec CHANGED
@@ -1,18 +1,16 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require 'find'
4
- require File.dirname(__FILE__) + "/../lib/spec"
3
+ require File.expand_path(File.dirname(__FILE__) + "/../lib/spec") # better stack traces this way
5
4
 
6
- context_runner = Spec::Runner::ContextRunner.new(ARGV)
7
- Spec::Runner::Context.context_runner = context_runner
5
+ $context_runner = ::Spec::Runner::OptionParser.create_context_runner(ARGV, false, STDERR, STDOUT)
8
6
 
9
- ARGV.each do |file|
10
- Find.find(file) do |path|
11
- if FileTest.file?(path) and File.extname(path) == '.rb'
12
- require path
13
- end
14
- end
7
+ ARGV.each do |file_or_dir|
8
+ if File.lstat(file_or_dir).directory? then
9
+ (Dir.open(file_or_dir).select {|f| f =~ /.*\.rb/}).each {|file| require "#{file_or_dir}/#{file}"}
10
+ else
11
+ require file_or_dir
12
+ end
15
13
  end
16
14
 
17
- context_runner.run
15
+ $context_runner.run(true)
18
16
 
data/doc/README CHANGED
@@ -1,5 +1,3 @@
1
1
  The website can be generated with
2
2
  webgen
3
- (Install the following gems: webgen, redcloth, bluecloth)
4
-
5
- TODO: write rake task that will generate website, put rdoc underneath it and upload everything.
3
+ (Install the following gems: webgen, redcloth, syntax)
@@ -1,6 +1,29 @@
1
+ # gem install syntax
2
+ require 'syntax/convertors/html'
3
+ RUBY2HTML = Syntax::Convertors::HTML.for_syntax "ruby"
4
+
5
+ class ERB
6
+ class Compiler
7
+ alias old_compile compile
8
+
9
+ def compile(s)
10
+ s.gsub! /<ruby>/n, "<notextile><%= ruby <<-EOR"
11
+ s.gsub! /<\/ruby>/n, "EOR\n%></notextile>"
12
+ s.gsub! /<ruby\s+file="(.*)"\s*\/>/, "{ruby_inline: {filename: \\1}}"
13
+ old_compile(s)
14
+ end
15
+ end
16
+ end
17
+
18
+ module FileHandlers
19
+ class PageFileHandler < DefaultFileHandler
20
+ def ruby(code)
21
+ RUBY2HTML.convert(code)
22
+ end
23
+ end
24
+ end
25
+
1
26
  module Tags
2
- # gem install syntax
3
- require 'syntax/convertors/html'
4
27
 
5
28
  # prints out nicely formatted ruby code in html
6
29
  class RubyInliner < DefaultTag
@@ -9,11 +32,10 @@ module Tags
9
32
  add_param 'filename', nil, 'The File to insert'
10
33
  set_mandatory 'filename', true
11
34
 
12
- CONVERTOR = Syntax::Convertors::HTML.for_syntax "ruby"
13
35
 
14
36
  def initialize
15
37
  super
16
- register_tag( 'ruby_inline')
38
+ register_tag('ruby_inline')
17
39
  end
18
40
 
19
41
  def process_tag(tag, node, ref_node)
@@ -32,7 +54,7 @@ module Tags
32
54
  rescue
33
55
  self.logger.error { "Given file <#{filename}> does not exist (tag specified in <#{ref_node.recursive_value( 'src' )}>" }
34
56
  end
35
- CONVERTOR.convert(content)
57
+ RUBY2HTML.convert(content)
36
58
  end
37
59
  end
38
60
  end
@@ -0,0 +1,22 @@
1
+ ---
2
+ title: The Core Team
3
+ inMenu: true
4
+ ---
5
+
6
+ h2. The Core Team
7
+
8
+ * Dave Astels
9
+ * Steve Baker
10
+ * David Chelimsky
11
+ * Aslak Hellesoy
12
+
13
+ <table>
14
+ <tr>
15
+ <td><img src="images/David_and_Aslak.jpg"></td>
16
+ <td><img src="images/Whats_That_Dude.jpg"></td>
17
+ </tr>
18
+ <tr>
19
+ <td align="center">David and Aslak getting ready for 1.0</td>
20
+ <td align="center">What's that, Dude?</td>
21
+ </tr>
22
+ </table>
@@ -21,7 +21,7 @@ acronym {
21
21
  }
22
22
  #container {
23
23
  font-size:1.2em;
24
- width:550px;
24
+ width:94%;
25
25
  margin:0 auto;
26
26
  border-right:3px double #000;
27
27
  }
@@ -42,7 +42,7 @@ acronym {
42
42
  color:#c00;
43
43
  }
44
44
  #header h2 {
45
- margin:140px 0 0 0;
45
+ margin:30px 0 0 0;
46
46
  font-size:1em;
47
47
  font-weight:normal;
48
48
  color:#999;
@@ -52,10 +52,7 @@ acronym {
52
52
  }
53
53
  #navigation {
54
54
  text-align:right;
55
- margin:10px 10px 10px auto;
56
- }
57
- #navigation {
58
- margin:0 10px 0 0;
55
+ margin:0 18px 10px auto;
59
56
  padding:0;
60
57
  }
61
58
  #navigation li {
@@ -76,6 +73,9 @@ acronym {
76
73
  color:#C00;
77
74
  border-bottom:1px solid #ddd;
78
75
  }
76
+ #navigation li.webgen-menu-item-selected a, #naviation li.webgen-menu-item-selected a:hover {
77
+ color: #000;
78
+ }
79
79
  #content {
80
80
  margin:20px 0 20px 10px;
81
81
  padding:0;
@@ -98,7 +98,7 @@ acronym {
98
98
  }
99
99
  #content h2 {
100
100
  display:block;
101
- margin:20px 0 0 0px;
101
+ margin:20px 20px 0 0px;
102
102
  padding:0;
103
103
  font-family:"Trebuchet MS",arial,sans-serif;
104
104
  font-size:1.1em;
@@ -137,9 +137,9 @@ acronym {
137
137
  text-indent:0;
138
138
  }
139
139
  #content code {
140
- font-family:"courier new";
141
- color:#444;
142
- font-weight:bold;
140
+ font-family:monospace;
141
+ color:#222;
142
+ font-size:1.3em;
143
143
  }
144
144
  #content pre {
145
145
  padding:10px;
@@ -160,7 +160,7 @@ acronym {
160
160
  #footer {
161
161
  font-size:0.9em;
162
162
  font-family:arial,sans-serif;
163
- margin:90px 0 20px 0;
163
+ margin:60px 18px 20px 0;
164
164
  padding:5px;
165
165
  border-top:1px solid #c00;
166
166
  }
@@ -15,7 +15,6 @@
15
15
  </div>
16
16
 
17
17
  <div id="navigation">
18
- <!-- Not sure how to get this in the menu -->
19
18
  {menu: {menuStyle: horizontal}}
20
19
  </div>
21
20
 
@@ -1,13 +1,188 @@
1
1
  ---
2
- title: Writing Specifications
2
+ title: Core API
3
3
  inMenu: true
4
+ ordering: 5
4
5
  ---
5
- h2. Writing Specifications
6
+ h2. Core API
6
7
 
7
- An RSpec specification is a Ruby file with a context and one or more specifications. Example:
8
+ When RSpec executes specifications, it defines a method <code>should</code> on every object in the system. This <code>should</code> method is your entry to the magic of RSpec.
8
9
 
9
- {ruby_inline: {filename: ../examples/empty_stack_spec.rb}}
10
-
11
- A context represents a collection of specifications and must be defined with a name and a block (do-end).
12
- A specification is defined with the *specify* keyword and a sentence describing what's being specified.
13
- It is highly recommended to include
10
+ Almost all expectation forms have a corresponding negated form. It is listed when it is supported and, unless otherwise stated, is met when ever the non-negated form would be violated.
11
+
12
+ h3. General
13
+
14
+ h4. Arbitrary Block
15
+
16
+ <ruby>
17
+ target.should.satisfy {|arg| ...}
18
+ target.should.not.satisfy {|arg| ...}
19
+ </ruby>
20
+
21
+ The supplied block is evaluated, passing <code>target</code> as the sole argument. If the block evaluates to <code>false</code>, <code>ExpectationNotMetError</code> is raised.
22
+
23
+ <ruby>
24
+ target.should.satisfy {|arg| arg > 0}
25
+ </ruby>
26
+
27
+ h4. Equality
28
+
29
+ <ruby>
30
+ target.should.equal <value>
31
+ target.should.not.equal <value>
32
+ </ruby>
33
+
34
+ The target object is compared to <code>value</code> using ==. If the result is <code>false</code>, <code>ExpectationNotMetError</code> is raised.
35
+
36
+ h4. Floating Point Comparison
37
+
38
+ <ruby>
39
+ target.should.be.close <value>, <tolerance>
40
+ target.should.not.be.close <value>, <tolerance>
41
+ </ruby>
42
+
43
+ The target object is compared to <code>value</code>. If they differ by more that <code>tolerance</code>, <code>ExpectationNotMetError</code> is raised. In the negated case, <code>ExpectationNotMetError</code> is raised if they differ by less than <code>tolerance</code>.
44
+
45
+ <ruby>
46
+ target.should.be.close 27.35, 0.05
47
+ </ruby>
48
+
49
+ h4. Identity
50
+
51
+ <ruby>
52
+ target.should.be <value>
53
+ target.should.not.be <value>
54
+ </ruby>
55
+
56
+ The target object is compared to <code>value</code> using <code>equal?</code>. If the result is <code>false</code>, <code>ExpectationNotMetError</code> is raised.
57
+
58
+ h4. Arbitrary Predicate
59
+
60
+ <ruby>
61
+ target.should.predicate [optional args]
62
+ target.should.be.predicate [optional args]
63
+ target.should.not.predicate [optional args]
64
+ target.should.not.be.predicate [optional args]
65
+ </ruby>
66
+
67
+ The message <code>predicate?</code> is sent to <code>target</code> with any supplied arguments. If the result is <code>false</code>, <code>ExpectationNotMetError</code> is raised.
68
+
69
+ For example:
70
+
71
+ <ruby>
72
+ container.should.include('a') => container.include?('a')
73
+ container.should.be.empty => container.empty?
74
+ </ruby>
75
+
76
+ h4. Pattern Matching
77
+
78
+ <ruby>
79
+ target.should.match <regex>
80
+ target.should.not.match <regex>
81
+ </ruby>
82
+
83
+ The <code>target</code> is matched against <code>regex</code>. An <code>ExpectationNotMetError</code> is raised if the match fails.
84
+
85
+ h3. Class/Type
86
+
87
+ h4. Direct Instance
88
+
89
+ <ruby>
90
+ target.should.be.an.instance.of <class>
91
+ target.should.not.be.an.instance.of <class>
92
+ </ruby>
93
+
94
+ An <code>ExpectationNotMetError</code> is raised if <code>target</code> is not or is, respectively, an direct instance of <code>class</code>. As expected this correlates to <code>target.instance_of? class</code>.
95
+
96
+ h4. Ancestor Class
97
+
98
+ <ruby>
99
+ target.should.be.a.kind.of <class>
100
+ target.should.not.be.a.kind.of <class>
101
+ </ruby>
102
+
103
+ As above, but uses <code>target.kind_of? class</code>: checking whether <code>class</code> is the direct class of <code>target</code>, or an ancestor of <code>target</code>'s direct class.
104
+
105
+ h4. Type
106
+
107
+ <ruby>
108
+ target.should.respond.to <symbol>
109
+ target.should.not.respond.to <symbol>
110
+ </ruby>
111
+
112
+ Uses <code>target.respond_to?(symbol)</code> to check whether <code>symbol</code> is the name of a message that <code>target</code> understands.
113
+
114
+ h3. Procs
115
+
116
+ h4. Raising
117
+
118
+ <ruby>
119
+ proc.should.raise <exception>
120
+ proc.should.not.raise <exception>
121
+ </ruby>
122
+
123
+ Checks that <code>proc</code> causes the named exception to be raised or not. The latter is actually one of two cases: some other exception is raised, or no exception is raised. Typically the <code>proc</code> is created in place using <code>lambda</code>. For example:
124
+
125
+ <ruby>
126
+ lambda { 3 / 0 }.should.raise ZeroDivisionError
127
+ </ruby>
128
+
129
+ There is a more general form as well.
130
+
131
+ <ruby>
132
+ proc.should.raise
133
+ proc.should.not.raise
134
+ </ruby>
135
+
136
+ These forms don't worry about what exception is raised (or not). All they are concerned with is that some except was raised, or that no exception was.
137
+
138
+ h4. Throwing
139
+
140
+ <ruby>
141
+ proc.should.throw <symbol>
142
+ proc.should.not.throw <symbol>
143
+ </ruby>
144
+
145
+ Similar to the above, but checks that <code>symbol</code> is thrown from within <code>proc</code>, or not. The latter is actually one of two cases: some other symbol is thrown, or no symbol is thrown.
146
+
147
+ <ruby>
148
+ proc.should.not.throw
149
+ </ruby>
150
+
151
+ This form is more specific. It checks that no symbol is thrown from within <code>proc</code>.
152
+
153
+ h3. Collections
154
+
155
+ h4. Containment
156
+
157
+ <ruby>
158
+ target.should.include <object>
159
+ target.should.not.include <object>
160
+ </ruby>
161
+
162
+ This is simply a specific case of the arbitrary predicate form. It uses <code>target.include?(object)</code> and raises an <code>ExpectationNotMetError</code> if that returns false.
163
+
164
+ The remaining collection forms are a little more involved. They rely on two things: 1) <code>target</code> responds to the message <code>things</code> by returning an object that 2) responds to either <code>length</code> or <code>size</code>, which return a number that is a measure of size. Currently <code>length</code> is used if is appropriate, otherwise <code>size</code> is attempted.
165
+
166
+ h4. Exact Size
167
+
168
+ <ruby>
169
+ target.should.have(<number>).things
170
+ </ruby>
171
+
172
+ The <code>things</code> of <code>target</code> has a length/size of exactly <code>number</code>.
173
+
174
+ h4. Lower Bound
175
+
176
+ <ruby>
177
+ target.should.have.at.least(<number>).things
178
+ </ruby>
179
+
180
+ The <code>things</code> of <code>target</code> has a length/size of no less than <code>number</code>.
181
+
182
+ h4. Upper Bound
183
+
184
+ <ruby>
185
+ target.should.have.at.most(<number>).things
186
+ </ruby>
187
+
188
+ The <code>things</code> of <code>target</code> has a length/size of no more than <code>number</code>.