diff options
Diffstat (limited to 'vendor/plugins/rspec')
372 files changed, 7018 insertions, 26443 deletions
diff --git a/vendor/plugins/rspec/.autotest b/vendor/plugins/rspec/.autotest index 6ca66a445..8a863e46f 100644 --- a/vendor/plugins/rspec/.autotest +++ b/vendor/plugins/rspec/.autotest @@ -1,3 +1,5 @@ Autotest.add_hook :initialize do |at| at.add_exception("spec/interop/test/unit/resources") -end
\ No newline at end of file + at.add_exception("spec/spec/runner/drb_command_line_spec.rb") +end + diff --git a/vendor/plugins/rspec/.gitignore b/vendor/plugins/rspec/.gitignore deleted file mode 100644 index 8e5fb3a88..000000000 --- a/vendor/plugins/rspec/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -pkg -doc -tmtags -story_server/prototype/rspec_stories.html -.DS_Store -.emacs-project -*~ diff --git a/vendor/plugins/rspec/CHANGES b/vendor/plugins/rspec/CHANGES deleted file mode 100644 index 0ac5b62f9..000000000 --- a/vendor/plugins/rspec/CHANGES +++ /dev/null @@ -1,1080 +0,0 @@ -== Version 1.1.4 - -Maintenance release. - -Note: we've removed the metaclass method from Object. There were some -generated specs that used it, and they will now break. Just replace the -metaclass call with (class << self; self; end) and all will be well. - -* pending steps print out yellow in stories (patch from Kyle Hargraves) -* Deprecation warnings for specs that assume auto-inclusion of modules. Closes #326 (patch from Scott Taylor) -* mock.should_not_receive(:anything) fails fast (once again) -* Patch from Antti Tarvainen to stop files from being loaded repeatedly when running heckle. Closes #333. -* Fixed bug in which session object in example was not the same instance used in the controller. Closes #331. -* Applied patch from Antti Tarvainen to fix bug where heckle runs rspec runs heckle runs rspec etc. Closes #280. -* Applied patch from Zach Dennis to merge :steps functionality to :steps_for. Closes #324. -* Applied patch from Ryan Davis to add eval of block passed to raise_error matcher. Closes #321. -* alias :context :describe in example_group_methods. Closes #312. -* Applied patch from Ben Mabey to make the Story runner exit with a non-0 exit code on failing stories. Closes #228. -* Applied patch from Coda Hale to get the :red hook called in autotest. Closes #279. -* Applied patch from Patrick Ritchie to support --drb in spec.opts. Closes #274, #293. -* Moved metaclass method from Object to an internal module which gets included where it is needed. -* Applied patch from Dayo Esho: and_yield clobbers return value from block. Closes #217. -* Applied patch from Bob Cotton: ExampleGroupFactory.default resets previously registered types. Closes #222. -* Applied patch from Mike Williams to support the lib directory in rails apps with the Textmate Alternate File command. Closes #276. -* ExampleGroupMethods#xspecify aliases #xit -* A SharedExampleGroup can be created within another ExampleGroup. -* Applied patch from Bob Cotton: Nested ExampleGroups do not have a spec_path. Closes #224. -* Add before_suite and after_suite callbacks to ExampleGroupMethods and Options. Closes #210. -* The after(:suite) callback lambda is passed a boolean representing whether the suite passed or failed -* Added NestedTextFormatter. Closes #366. -* decoupled mock framework from global extensions used by rspec - supports use of flexmock or mocha w/ rails -* Applied patch from Roman Chernyatchik to allow the user to pass in the rails version into spectask. Closes #325, #370 - -== Version 1.1.3 - -Maintenance release. -Notice to autotest users: you must also upgrade to ZenTest-3.9.0. - -* Tightened up exceptions list in autotest/rails_spec. Closes #264. -* Applied patch from Ryan Davis for ZenTest-3.9.0 compatibility -* Applied patch from Kero to add step_upcoming to story listeners. Closes #253. -* Fixed bug where the wrong named error was not always caught by "should raise_error" -* Applied patch from Luis Lavena: No coloured output on Windows due missing RUBYOPT. Closes #244. -* Applied patch from Craig Demyanovich to add support for "should_not render_template" to rspec_on_rails. Closes #241. -* Added --pattern (-p for short) option to control what files get loaded. Defaults to '**/*_spec.rb' -* Exit with non-0 exit code if examples *or tests* (in test/unit interop mode) fail. Closes #203. -* Moved at_exit hook to a method in Spec::Runner which only runs if specs get loaded. Closes #242. -* Applied patch from kakutani ensuring that base_view_path gets cleared after each view example. Closes #235. -* More tweaks to regexp step names -* Fixed focused specs in nested ExampleGroups. Closes #225. - -== Version 1.1.2 - -Minor bug fixes/enhancements. -Notice to autotest users: you must also upgrade to ZenTest-3.8.0. - -* RSpec's Autotest subclasses compatible with ZenTest-3.8.0 (thanks to Ryan Davis for making it easier on Autotest subs). -* Applied patch from idl to add spec/lib to rake stats. Closes #226. -* calling setup_fixtures and teardown_fixtures for Rails >= r8570. Closes #219. -* Applied patch from Josh Knowles using ActiveSupport's Inflector (when available) to make 'should have' read a bit better. Closes #197. -* Fixed regression in 1.1 that caused failing examples to fail to generate their own names. Closes #209. -* Applied doc patch from Jens Krämer for capturing content_for -* Applied patch from Alexander Lang to clean up story steps after each story. Closes #198. -* Applied patch from Josh Knowles to support 'string_or_response.should have_text(...)'. Closes #193. -* Applied patch from Ian Dees to quiet the Story Runner backtrace. Closes #183. -* Complete support for defining steps with regexp 'names'. - -== Version 1.1.1 - -Bug fix release. - -* Fix regression in 1.1.0 that caused transactions to not get rolled back between examples. -* Applied patch from Bob Cotton to reintroduce ExampleGroup.description_options. Closes LH[#186] - -== Version 1.1.0 - -The "tell me a story and go nest yourself" release. - -* Applied patch from Mike Vincent to handle generators rails > 2.0.1. Closes LH[#181] -* Formatter.pending signature changed so it gets passed an ExampleGroup instance instead of the name ( LH[#180]) -* Fixed LH[#180] Spec::Rails::Example::ModelExampleGroup and friends show up in rspec/rails output -* Spec::Rails no longer loads ActiveRecord extensions if it's disabled in config/boot.rb -* Applied LH[#178] small annoyances running specs with warnings enabled (Patch from Mikko Lehtonen) -* Tighter integration with Rails fixtures. Take advantage of fixture caching to get performance improvements (Thanks to Pat Maddox, Nick Kallen, Jonathan Barnes, and Curtis) - -== Version 1.1.0-RC1 - -Textmate Bundle users - this release adds a new RSpec bundle that highlights describe, it, before and after and -provides navigation to descriptions and examples (rather than classes and methods). When you first install this, -it is going to try to hijack all of your .rb files. All you need to do is open a .rb file that does not end with -'spec.rb' and change the bundle selection from RSpec to Ruby. TextMate will do the right thing from then on. - -Shortcuts for tab-activated snippets all follow the TextMate convention of 2 or 3 letters of the first word, followed by the first letter of each subsequent word. So "should have_at_least" would be triggered by shhal. - -We reduced the scope for running spec directories, files, a single file or individual spec in TextMate to source.ruby.rspec. This allowed us to restore the standard Ruby shortcuts: - -CMD-R runs all the specs in one file -CMD-SHIFT-R runs an individual spec -CMD-OPT-R runs any files or directories selected in the TextMate drawer - -rspec_on_rails users - don't forget to run script/generate rspec - -* Added shared_examples_for method, which you can (should) use instead of describe Foo, :shared => true -* Applied LH[#168] Fix describe Object, "description contains a # in it" (Patch from Martin Emde) -* Applied LH[#15] Reverse loading of ActionView::Base helper modules (Patch from Mark Van Holstyn) -* Applied LH[#149] Update contribute page to point towards lighthouse (Patch from Josh Knowles) -* Applied LH[#142] verify_rcov fails with latest rcov (Patch from Kyle Hargraves) -* Applied LH[#10] Allow stubs to yield and return values (Patch from Pat Maddox) -* Fixed LH[#139] version.rb in trunk missing svn last changed number -* Applied LH[#14] Adding support for by_at_least/by_at_most in Change matcher (Patch from Saimon Moore) -* Applied LH[#12] Fix for TM when switching to alternate file (Patch from Trevor Squires) -* Applied LH[#133] ExampleMatcher should match against before(:all) (Patch from Bob Cotton) -* Applied LH[#134] Only load spec inside spec_helper.rb (Patch from Mark Van Holstyn) -* RSpec now bails immediately if there are examples with identical names. -* Applied LH[#132] Plain Text stories should support Given and Given: (Patch from Jarkko Laine) -* Applied patch from Pat Maddox: Story Mediator - the glue that binds the plain text story parser with the rest of the system -* Applied LH[#16] Have SimpleMatchers expose their description for specdocs (Patch from Bryan Helmkamp) -* Stories now support --colour -* Changed the DSL modules to Example (i.e. Spec::Example instead of Spec::DSL) -* Applied [#15608] Story problem if parenthesis used in Given, When, Then or And (Patch from Sinclair Bain) -* Applied [#15659] GivenScenario fails when it is a RailsStory (Patch from Nathan Sutton) -* Fixed [#15639] rcov exclusion configuration. (Spec::Rails projects can configure rcov with spec/rcov.opts) -* The rdoc formatter (--format rdoc) is gone. It was buggy and noone was using it. -* Changed Spec::DSL::Behaviour to Spec::DSL::ExampleGroup -* Changed Spec::DSL::SharedBehaviour to Spec::DSL::SharedExampleGroup -* Applied [#14023] Small optimization for heavily proxied objects. (Patch from Ian Leitch) -* Applied [#13943] ProfileFormatter (Top 10 slowest examples) (Patch from Ian Leitch) -* Fixed [#15232] heckle is not working correctly in trunk (as of r2801) -* Applied [#14399] Show pending reasons in HTML report (Patch from Bryan Helmkamp) -* Discovered fixed: [#10263] mock "leak" when setting an expectation in a block passed to mock#should_receive -* Fixed [#14671] Spec::DSL::ExampleRunner gives "NO NAME because of --dry-run" for every example for 'rake spec:doc' -* Fixed [#14543] rspec_scaffold broken with Rails 2.0 -* Removed Patch [#10577] Rails with Oracle breaks 0.9.2 - was no longer necessary since we moved describe to the Main object (instead of Object) -* Fixed [#14527] specs run twice on rails 1.2.4 and rspec/rspec_on_rails trunk -* Applied [#14043] Change output ordering to show pending before errors (Patch from Mike Mangino) -* Applied [#14095] Don't have ./script/generate rspec create previous_failures.txt (Patch from Bryan Helmkamp) -* Applied [#14254] Improved error handling for Object#should and Object#should_not (Patch from Antti Tarvainen) -* Applied [#14186] Remove dead code from message_expecation.rb (Patch from Antti Tarvainen) -* Applied [#14183] Tiny improvement on mock_spec.rb (Patch from Antti Tarvainen) -* Applied [#14208] Fix to Mock#method_missing raising NameErrors instead of MockExpectationErrors (Patch from Antti Tarvainen) -* Applied [#14255] Fixed examples in mock_spec.rb and shared_behaviour_spec.rb (Patch from Antti Tarvainen) -* Applied [#14362] partially mocking objects that define == can blow up (Patch from Pat Maddox) -* test_ methods with an arity of 0 defined in a describe block or Example object will be run as an Example, providing a seamless transition from Test::Unit -* Removed BehaviourRunner -* Fixed [#13969] Spec Failures on Trunk w/ Autotest -* Applied [#14156] False positives with should_not (Patch from Antti Tarvainen) -* Applied [#14170] route_for and params_from internal specs fixed (Patch from Antti Tarvainen) -* Fixed [#14166] Cannot build trunk -* Applied [#14142] Fix for bug #11602: Nested #have_tag specifications fails on the wrong line number (Patch from Antti Tarvainen) -* Removed warn_if_no_files argument and feature -* Steps (Given/When/Then) with no blocks are treated as pending -* Applied [#13913] Scenario should treat no code block as pending (Patch from Evan Light) -* Fixed [#13370] Weird mock expectation error (Patch from Mike Mangino) -* Applied [#13952] Fix for performance regression introduced in r2096 (Patch from Ian Leitch) -* Applied [#13881] Dynamically include Helpers that are included on ActionView::Base (Patch from Brandon Keepers) -* Applied [#13833] ActionView::Helpers::JavaScriptMacrosHelper removed after 1.2.3 (Patch from Yurii Rashkovskii) -* Applied [#13814] RSpec on Rails w/ fixture-scenarios (Patch from Shintaro Kakutani) -* Add ability to define Example subclass instead of using describe -* Applied Patch from James Edward Gray II to improve syntax highlighting in TextMate -* Fixed [#13579] NoMethodError not raised for missing helper methods -* Fixed [#13713] form helper method 'select' can not be called when calling custom helper methods from specs -* Example subclasses Test::Unit::TestCase -* Added stub_everything method to create a stub that will return itself for any message it doesn't understand -* Added stories directory with stories/all.rb and stories/helper.rb when you script/generate rspec -* Applied [#13554] Add "And" so you can say Given... And... When... Then... And... -* Applied [#11254] RSpec syntax coloring and function pop-up integration in TextMate (Patch from Wincent Colaiuta) -* Applied [#13143] ActionView::Helpers::RecordIdentificationHelper should be included if present (Patch from Jay Levitt) -* Applied [#13567] patch to allow stubs to yield consecutive values (Patch from Rupert Voelcker) -* Applied [#13559] reverse version of route_for (Patch from Rupert Voelcker) -* Added [#13532] /lib specs should get base EvalContext -* Applied [#13451] Add a null_object option to mock_model (Patch from James Deville) -* Applied [#11919] Making non-implemented specs easy in textmate (Patch from Scott Taylor) -* Applied [#13274] ThrowSymbol recognized a NameError triggered by Kernel#method_missing as a thrown Symbol -* Applied [#12722] the alternate file command does not work in rails views due to scope (Patch from Carl Porth) -* Behaviour is now a Module that is used by Example class methods and SharedBehaviour -* Added ExampleDefinition -* Added story runner framework based on rbehave [#12628] -* Applied [#13336] Helper directory incorrect for rake stats in statsetup task (Patch from Curtis Miller) -* Applied [#13339] Add the ability for spec_parser to parse describes with :behaviour_type set (Patch from Will Leinweber and Dav Yaginuma) -* Fixed [#13271] incorrect behaviour with expect_render and stub_render -* Applied [#13129] Fix failing specs in spec_distributed (Patch from Bob Cotton) -* Applied [#13118] Rinda support for Spec::Distributed (Patch from Bob Cotton) -* Removed BehaviourEval -* Removed Behaviour#inherit -* Moved implementation of install_dependencies to example_rails_app -* Renamed RSPEC_DEPS to VENDOR_DEPS -* Added Example#not_implemented? -* You can now stub!(:msg).with(specific args) -* describe("A", Hash, "with one element") will generate description "A Hash with one element" (Tip from Ola Bini) -* Applied [#13016] [DOC] Point out that view specs render, well, a view (Patch from Jay Levitt) -* Applied [#13078] Develop rspec with autotest (Patch from Scott Taylor) -* Fixed [#13065] Named routes throw a NoMethodError in Helper specs (Patches from James Deville and Mike Mangino) -* Added (back) the verbose attribute in Spec::Rake::SpecTask -* Changed documentation to point at the new http svn URL, which is more accessible. - -== Version 1.0.8 - -Another bugfix release - this time to resolve the version mismatch - -== Version 1.0.7 - -Quick bugfix release to ensure that you don't have to have the rspec gem installed -in order to use autotest with rspec_on_rails. - -* Fixed [#13015] autotest gives failure in 'spec_command' after upgrade 1.0.5 to 1.0.6 - -== Version 1.0.6 - -The "holy cow, batman, it's been a long time since we released and there are a ton of bug -fixes, patches and even new features" release. - -Warning: Spec::Rails users: In fixing 11508, we've removed the raise_controller_errors method. As long as you -follow the upgrade instructions and run 'script/generate rspec' you'll be fine, but if you skip this -step you need to manually go into spec_helper.rb and remove the call to that method (if present - it -might not be if you haven't upgraded in a while). - -Warning: Implementors of custom formatters. Formatters will now be sent an Example object instead of just a -String for #example_started, #example_passed and #example_failed. In certain scenarios -(Spec::Ui with Spec::Distributed), the formatter must ask the Example for its sequence number instead of -keeping track of a sequence number internal to the formatter. Most of you shouldn't need to upgrade -your formatters though - the Example#to_s method returns the example name/description, so you should be -able to use the passed Example instance as if it were a String. - -* Applied [#12986] Autotest Specs + Refactoring (Patch from Scott Tayler) -* Added a #close method to formatters, which allows them to gracefully close streams. -* Applied [#12935] Remove requirement that mocha must be installed as a gem when used as mocking framework. (Patch from Ryan Kinderman). -* Fixed [#12893] RSpec's Autotest should work with rspec's trunk -* Fixed [#12865] Partial mock error when object has an @options instance var -* Applied [#12701] Allow checking of content captured with content_for in view specs (Patch from Jens Kr�mer) -* Applied [#12817] Cannot include same shared behaviour when required with absolute paths (Patch from Ian Leitch) -* Applied [#12719] rspec_on_rails should not include pagination helper (Patch from Matthijs Langenberg) -* Fixed [#12714] helper spec not finding rails core helpers -* Applied [#12611] should_not redirect_to implementation (Patch from Yurii Rashkovskii) -* Applied [#12682] Not correctly aliasing original 'stub!' and 'should_receive' methods for ApplicationController (Patch from Matthijs Langenberg) -* Disabled controller.should_receive(:render) and controller.stub!(:render). Use expect_render or stub_render instead. -* Applied [#12484] Allow a Behaviour's Description to flow through to the Formatter (Patch from Bob Cotton) -* Fixed [#12448] The spec:plugins rake task from rspec_on_rails should ignore specs from the rspec_on_rails plugin -* Applied [#12300] rr integration (patch from Kyle Hargraves) -* Implemented [#12284] mock_with :rr (integration with RR mock framework: http://rubyforge.org/projects/pivotalrb/) -* Applied [#12237] (tiny) added full path to mate in switch_command (Patch from Carl Porth) -* Formatters will now be sent an Example object instead of just a String for certain methods -* All Spec::Rake::SpecTask attributes can now be procs, which allows for lazy evaluation. -* Changed the Spec::Ui interfaces slightly. See examples. -* Applied [#12174] mishandling of paths with spaces in spec_mate switch_command (Patch from Carl Porth) -* Implemented [#8315] File "Go to..." functionality -* Applied [#11917] Cleaner Spec::Ui error for failed Selenium connection (Patch from Ian Dees) -* Applied [#11888] rspec_on_rails spews out warnings when assert_select is used with an XML response (Patch from Ian Leitch) -* Applied [#12010] Nicer failure message formatting (Patch from Wincent Colaiuta) -* Applied [#12156] smooth open mate patch (Patch from Ienaga Eiji) -* Applied [#10577] Rails with Oracle breaks 0.9.2. (Patch from Sinclair Bain) -* Fixed [#12079] auto-generated example name incomplete: should have 1 error on ....] -* Applied [#12066] Docfix for mocks/mocks.page (Patch from Kyle Hargraves) -* Fixed [#11891] script/generate rspec_controller fails to create appropriate views (from templates) on edge rails -* Applied [#11921] Adds the correct controller_name from derived_controller_name() to the ViewExampleGroupController (Patch from Eloy Duran) -* Fixed [#11903] config.include with behaviour_type 'hash' does not work -* Examples without blocks and pending is now reported with a P instead of a * -* Pending blocks that now pass are rendered blue -* New behaviour for after: If an after block raises an error, the other ones will still run instead of bailing at the first. -* Made it possible to run spec from RSpec.tmbundle with --drb against a Rails spec_server. -* Applied [#11868] Add ability for pending to optionally hold a failing block and to fail when it passes (Patch from Bob Cotton) -* Fixed [#11843] watir_behaviour missing from spec_ui gem -* Added 'switch between source and spec file' command in Spec::Mate (based on code from Ruy Asan) -* Applied [#11509] Documentation - RSpec requires hpricot -* Applied [#11807] Daemonize spec_server and rake tasks to manage them. (patch from Kyosuke MOROHASHI) -* Added pending(message) method -* Fixed [#11777] should render_template doesn't check paths correctly -* Fixed [#11749] Use of 'rescue => e' does not catch all exceptions -* Fixed [#11793] should raise_error('with a message') does not work correctly -* Fixed [#11774] Mocks should respond to :kind_of? in the same way they respond to :is_a? -* Fixed [#11508] Exceptions are not raised for Controller Specs (removed experimental raise_controller_errors) -* Applied [#11615] Partial mock methods give ambiguous failures when given a method name as a String (Patch from Jay Phillips) -* Fixed [#11545] Rspec doesn't handle should_receive on ActiveRecord associations (Patch from Ian White) -* Fixed [#11514] configuration.use_transactional_fixtures is ALWAYS true, regardless of assignment -* Improved generated RESTful controller examples to cover both successful and unsuccessful POST and PUT -* Changed TextMate snippets for controllers to pass controller class names to #describe rather than controller_name. -* Changed TextMate snippets for mocks to use no_args() and any_args() instead of the deprecated Symbols. -* Applied [#11500] Documentation: no rails integration specs in 1.0 -* Renamed SpecMate's shortcuts for running all examples and focused examples to avoid conflicts (CMD-d and CMD-i) -* Added a TextMate snippet for custom matchers, lifted from Geoffrey Grosenbach's RSpec peepcode show. -* The translator translates mock constraints to the new matchers that were introduced in 1.0.4 -* Documented environment variables for Spec::Rake::SpecTask. Renamed SPECOPTS and RCOVOPTS to SPEC_OPTS and RCOV_OPTS. -* Fixed [#10534] Windows: undefined method 'controller_name' - -== Version 1.0.5 -Bug fixes. Autotest plugin tweaks. - -* Fixed [#11378] fix to 10814 broke drb (re-opened #10814) -* Fixed [#11223] Unable to access flash from rails helper specs -* Fixed [#11337] autotest runs specs redundantly -* Fixed [#11258] windows: autotest won't run -* Applied [#11253] Tweaks to autotest file mappings (Patch from Wincent Colaiuta) -* Applied [#11252] Should be able to re-load file containing shared behaviours without raising an exception (Patch from Wincent Colaiuta) -* Fixed [#11247] standalone autotest doesn't work because of unneeded autotest.rb -* Applied [#11221] Autotest support does not work w/o Rails Gem installed (Patch from Josh Knowles) - -== Version 1.0.4 -The getting ready for JRuby release. - -* Fixed [#11181] behaviour_type scoping of config.before(:each) is not working -* added mock argument constraint matchers (anything(), boolean(), an_instance_of(Type)) which work with rspec or mocha -* added mock argument constraint matchers (any_args(), no_args()) which only work with rspec -* deprecated rspec's symbol mock argument constraint matchers (:any_args, :no_args, :anything, :boolean, :numeric, :string) -* Added tarball of rspec_on_rails to the release build to support folks working behind a firewall that blocks svn access. -* Fixed [#11137] rspec incorrectly handles flash after resetting the session -* Fixed [#11143] Views code for ActionController::Base#render broke between 1.0.0 and 1.0.3 on Rails Edge r6731 -* Added raise_controller_errors for controller examples in Spec::Rails - -== Version 1.0.3 -Bug fixes. - -* Fixed [#11104] Website uses old specify notation -* Applied [#11101] StringHelpers.starts_with?(prefix) assumes a string parameter for _prefix_ -* Removed 'rescue nil' which was hiding errors in controller examples. -* Fixed [#11075] controller specs fail when using mocha without integrated_views -* Fixed problem with redirect_to failing incorrectly against edge rails. -* Fixed [#11082] RspecResourceGenerator should be RspecScaffoldGenerator -* Fixed [#10959] Focused Examples do not work for Behaviour defined with constant with modules - -== Version 1.0.2 -This is just to align the version numbers in rspec and rspec_on_rails. - -== Version 1.0.1 -This is a maintenance release with mostly cleaning up, and one minor enhancement - -Modules are automatically included when described directly. - -* Renamed Spec::Rails' rspec_resource generator to rspec_scaffold. -* Removed Spec::Rails' be_feed matcher since it's based on assert_select_feed which is not part of Rails (despite that docs for assert_select_encoded says it is). -* describe(SomeModule) will include that module in the examples. Like for Spec::Rails helpers, but now also in core. -* Header in HTML report will be yellow instead of red if there is one failed example -* Applied [#10951] Odd instance variable name in rspec_model template (patch from Kyle Hargraves) -* Improved integration with autotest (Patches from Ryan Davis and David Goodland) -* Some small fixes to make all specs run on JRuby. - -== Version 1.0.0 -The stake in the ground release. This represents a commitment to the API as it is. No significant -backwards compatibility changes in the API are expected after this release. - -* Fixed [#10923] have_text matcher does not support should_not -* Fixed [#10673] should > and should >= broken -* Applied [#10921] Allow verify_rcov to accept greater than threshold coverage %'s via configuration -* Applied [#10920] Added support for not implemented examples (Patch from Chad Humphries and Ken Barker) -* Patch to allow not implemented examples. This works by not providing a block to the example. (Patch from Chad Humphries, Ken Barker) -* Yanked support for Rails 1.1.6 in Spec::Rails -* RSpec.tmbundle uses CMD-SHIFT-R to run focused examples now. -* Spec::Rails now bundles a spec:rcov task by default (suggestion from Kurt Schrader) -* Fixed [#10814] Runner loads shared code, test cases require them again -* Fixed [#10753] Global before and after -* Fixed [#10774] Allow before and after to be specified in config II -* Refactored Spec::Ui examples to use new global before and after blocks. -* Added instructions about how to get Selenium working with Spec::Ui (spec_ui/examples/selenium/README.txt) -* Fixed [#10805] selenium.rb missing from gem? -* Added rdocs explaining how to deal with errors in Rails' controller actions -* Applied [#10770] Finer grained includes. -* Fixed [#10747] Helper methods defined in shared specs are not visible when shared spec is used -* Fixed [#10748] Shared descriptions in separate files causes 'already exists' error -* Applied [#10698] Running with --drb executes specs twice (patch from Ruy Asan) -* Fixed [#10871] 0.9.4 - Focussed spec runner fails to run specs in descriptions with type and string when there is no leading space in the string - -== Version 0.9.4 -This release introduces massive improvements to Spec::Ui - the user interface functional testing -extension to RSpec. There are also some minor bug fixes to the RSpec core. - -* Massive improvements to Spec::Ui. Complete support for all Watir's ie.xxx(how, what) methods. Inline screenshots and HTML. -* Reactivated --timeout, which had mysteriously been deactivated in a recent release. -* Fixed [#10669] Kernel#describe override does not cover Kernel#context -* Applied [#10636] Added spec for OptionParser in Runner (Patch from Scott Taylor) -* Added [#10516] should_include should be able to accept multiple items -* Applied [#10631] redirect_to matcher doesn't respect request.host (Patch from Tim Lucas) -* Each formatter now flushes their own IO. This is to avoid buffering of output. -* Fixed [#10670] IVarProxy#delete raises exception when instance variable does not exist - -== Version 0.9.3 -This is a bugfix release. - -* Fixed [#10594] Failing Custom Matcher show NAME NOT GENERATED description -* describe(SomeType, "#message") will not add a space: "SomeType#message" (likewise for '.') -* describe(SomeType, "message") will have a decription with a space: "SomeType message" -* Applied [#10566] prepend_before and prepend_after callbacks -* Applied [#10567] Call setup and teardown using before and after callbacks - -== Version 0.9.2 -This is a quick maintenance release. - -* Added some website love -* Fixed [#10542] reverse predicate matcher syntax -* Added a spec:translate Rake task to make 0.9 translation easier with Spec:Rails -* Better translation of should_redirect_to -* Fixed --colour support for Windows. This is a regression that was introduced in 0.9.1 -* Applied [#10460] Make SpecRunner easier to instantiate without using commandline args - -== Version 0.9.1 - -This release introduces #describe and #it (aliased as #context and #specify for -backwards compatibility). This allows you to express specs like this: - - describe SomeClass do # Creates a Behaviour - it "should do something" do # Creates an Example - end - end - -The command line features four new options that give you more control over what specs -are being run and in what order. This can be used to verify that your specs are -independent (by running in opposite order with --reverse). It can also be used to cut -down feedback time by running the most recently modified specs first (--loadby mtime --reverse). - -Further, --example replaces the old --spec option, and it can now take a file name of -spec names as an alternative to just a spec name. The --format failing_examples:file.txt -option allows you to output an --example compatible file, which makes it possible to only -rerun the specs that failed in the last run. Spec::Rails uses all of these four options -by default to optimise your RSpec experience. - -There is now a simple configuration model. For Spec::Rails, you do something like this: - - Spec::Runner.configure do |config| - config.use_transactional_fixtures = true - config.use_instantiated_fixtures = false - config.fixture_path = RAILS_ROOT + '/spec/fixtures' - end - -You can now use mocha or flexmock with RSpec if you prefer either to -RSpec's own mock framework. Just put this: - - Spec::Runner.configure do |config| - config.mock_with :mocha - end - -or this: - - Spec::Runner.configure do |config| - config.mock_with :flexmock - end - -in a file that is loaded before your specs. You can also -configure included modules and predicate_matchers: - - Spec::Runner.configure do |config| - config.include SomeModule - config.predicate_matchers[:does_something?] = :do_something - end - -See Spec::DSL::Behaviour for more on predicate_matchers - -* Sugar FREE! -* Added [10434 ] Please Make -s synonymous with -e for autotest compat. This is temporary until autotest uses -e instead of -s. -* Fixed [#10133] custom predicate matchers -* Applied [#10473] Add should exist (new matcher) - Patch from Bret Pettichord -* Added another formatter: failing_behaviours. Writes the names of the failing behaviours for use with --example. -* Applied [#10315] Patch to fix pre_commit bug 10313 - pre_commit_rails: doesn't always build correctly (Patch from Antii Tarvainen) -* Applied [#10245] Patch to HTML escape the behavior name when using HTML Formatter (Patch from Josh Knowles) -* Applied [#10410] redirect_to does not behave consistently with regards to query string parameter ordering (Patch from Nicholas Evans) -* Applied [#9605] Patch for ER 9472, shared behaviour (Patch by Bob Cotton) -* The '--format rdoc' option no longer causes a dry-run by default. --dry-run must be used explicitly. -* It's possible to specify the output file in the --format option (See explanation in --help) -* Several --format options may be specified to output several formats in one run. -* The --out option is gone. Use --format html:path/to/my.html instead (or similar). -* Spec::Runner::Formatter::BaseTextFormatter#initialize only takes one argument - an IO. dry_run and color are setters. -* Made Spec::Ui *much* easier to install. It will be released separately. Check out trunk/spec_ui/examples -* HTML reports now include a syntax highlighted snippet of the source code where the spec failed (needs the syntax gem) -* Added [#10262] Better Helper testing of Erb evaluation block helpers -* Added [#9735] support flexmock (thanks to Jim Weirich for his modifications to flexmock to support this) -* Spec::Rails controller specs will no longer let mock exception ripple through to the response. -* Fixed [#9260] IvarProxy does not act like a hash. -* Applied [#9458] The rspec_scaffold generator does not take into account class nesting (Patch from Steve Tendon) -* Applied [#9132] Rakefile spec:doc can fail without preparing database (Patch from Steve Ross) -* Applied [#9678] Custom runner command line switch, and multi-threaded runner (Patch from Bob Cotton) -* Applied [#9926] Rakefile - RSPEC_DEPS constant as an Array of Hashes instead of an Array of Arrays (Patch from Scott Taylor) -* Applied [#9925] Changed ".rhtml" to "template" in REST spec generator (Patch from Scott Taylor) -* Applied [#9852] Patch for RSpec's Website using Webgen 0.4.2 (Patch from Scott Taylor) -* Fixed [#6523] Run rspec on rails without a db -* Fixed [#9295] rake spec should run anything in the spec directory (not just rspec's standard dirs) -* Added [#9786] infer controller and helper names from the described type -* Fixed [#7795] form_tag renders action='/view_spec' in view specs -* Fixed [#9767] rspec_on_rails should not define rescue_action on controllers -* Fixed [#9421] --line doesn't work with behaviours that use class names -* Fixed [#9760] rspec generators incompatible with changes to edge rails -* Added [#9786] infer controller and helper names from the described type -* Applied a simplified version of [#9282] Change to allow running specs from textmate with rspec installed as a rails plugin (and no rspec gem installed) -* Applied [#9700] Make Spec::DSL::Example#name public / Add a --timeout switch. A great way to prevent specs from getting slow. -* In Rails, script/generate rspec will generate a spec.opts file that optimises faster/more efficient running of specs. -* Added [#9522] support using rspec's expectations with test/unit -* Moved rspec_on_rails up to the project root, simplifying the download url -* Fixed [#8103] RSpec not installing spec script correctly. -* The --spec option is replaced by the --example option. -* The --loadby option no longer supports a file argument. Use --example file_name instead. -* The --example option can now take a file name as an argument. The file should contain example names. -* Internal classes are named Behaviour/Example (rather than Context/Specification). -* You can now use mocha by saying config.mock_with :mocha in a spec_helper -* before_context_eval is replaced by before_eval. -* Applied [#9509] allow spaced options in spec.opts -* Applied [#9510] Added File for Ruby 1.8.6 -* Applied [#9511] Clarification to README file in spec/ -* Moved all of the Spec::Rails specs down to the plugins directory - now you can run the specs after you install. -* Updated RSpec.tmbundle to the 0.9 syntax and replaced context/specify with describe/it. -* Applied [#9232] ActionController::Base#render is sometimes protected (patch from Dan Manges) -* Added --reverse option, allowing contexts/specs to be run in reverse order. -* Added --loadby option, allowing better control over load order for spec files. mtime and file.txt supported. -* Implemented [#8696] --order option (see --reverse and --loadby) -* Added describe/it as aliases for context/specify - suggestion from Dan North. -* Applied [#7637] [PATCH] add skip-migration option to rspec_scaffold generator -* Added [#9167] string.should have_tag -* Changed script/rails_spec_server to script/spec_server and added script/spec (w/ path to vendor/plugins/rspec) -* Fixed [#8897] Error when mixing controller spec with/without integrated views and using template system other than rhtml -* Updated sample app specs to 0.9 syntax -* Updated generated specs to 0.9 syntax -* Applied [#8994] trunk: generated names for be_ specs (Multiple patches from Yurii Rashkovskii) -* Applied [#9983]: Allow before and after to be called in BehaviourEval. This is useful for shared examples. - -== Version 0.8.2 - -Replaced assert_select fork with an assert_select wrapper for have_tag. This means that "should have_rjs" no longer supports :hide or :effect, but you can still use should_have_rjs for those. - -== Version 0.8.1 - -Quick "in house" bug-fix - -== Version 0.8.0 - -This release introduces a new approach to handling expectations using Expression Matchers. - -See Upgrade[http://rspec.rubyforge.org/upgrade.html], Spec::Expectations, Spec::Matchers and RELEASE-PLAN for more info. - -This release also improves the spec command line by adding DRb support and making it possible to -store command line options in a file. This means a more flexible RSpec experience with Rails, -Rake and editor plugins like TextMate. - -It also sports myriad new features, bug fixes, patches and general goodness: - -* Fixed [#8928] rspec_on_rails 0.8.0-RC1 controller tests make double call to setup_with_fixtures -* Fixed [#8925] Documentation bug in 0.8.0RC1 rspec website -* Applied [#8132] [PATCH] RSpec breaks "rake db:sessions:create" in a rails project that has the rspec_on_rails plugin (Patch from Erik Kastner) -* Fixed [#8789] --line and --spec not working when the context has parenhesis in the name -* Added [#8783] auto generate spec names from last expectation -* --heckle now fails if the heckled class or module is not found. -* Fixed [#8771] Spec::Mocks::BaseExpectation#with converts hash params to array of arrays with #collect -* Fixed [#8750] should[_not]_include backwards compatibility between 0.8.0-RC1 and 0.7.5.1 broken -* Fixed [#8646] Context Runner does not report on Non standard exceptions and return a 0 return code -* RSpec on Rails' spec_helper.rb will only force RAILS_ENV to test if it was not specified on the command line. -* Fixed [#5485] proc#should_raise and proc#should_not_raise output -* Added [#8484] should_receive with blocks -* Applied [#8218] heckle_runner.rb doesn't work with heckle >= 1.2.0 (Patch from Michal Kwiatkowski) -* Fixed [#8240] Cryptic error message when no controller_name -* Applied [#7461] [PATCH] Contexts don't call Module::included when they include a module -* Removed unintended block of test/unit assertions in rspec_on_rails - they should all, in theory, now be accessible -* Added mock_model method to RSpec on Rails, which stubs common methods. Based on http://metaclass.org/2006/12/22/making-a-mockery-of-activerecord -* Fixed [#8165] Partial Mock Errors when respond_to? is true but the method is not in the object -* Fixed [#7611] Partial Mocks override Subclass methods -* Fixed [#8302] Strange side effect when mocking a class method -* Applied [#8316] to_param should return a stringified key in resource generator's controller spec (Patch from Chris Anderson) -* Applied [#8216] shortcut for creating object stub -* Applied [#8008] Correct generated specs for view when calling resource generator (Patch from Jonathan Tron) -* Fixed [#7754] Command-R fails to run spec in TextMate (added instruction from Luke Redpath to the website) -* Fixed [#7826] RSpect.tmbundle web page out of date. -* RSpec on Rails specs are now running against RoR 1.2.1 and 1.2.2 -* rspec_scaffold now generates specs for views -* In a Rails app, RSpec core is only loaded when RAILS_ENV==test (init.rb) -* Added support for target.should arbitrary_expectation_handler and target.should_not arbitrary_expectation_handler -* Fixed [#7533] Spec suite fails and the process exits with a code 0 -* Fixed [#7565] Subsequent stub! calls for method fail to override the first call to method -* Applied [#7524] Incorrect Documentation for 'pattern' in Rake task (patch from Stephen Duncan) -* Fixed [#7409] default fixtures do not appear to run. -* Fixed [#7507] "render..and return" doesn't return -* Fixed [#7509] rcov/rspec incorrectly includes boot.rb (Patch from Courtenay) -* Fixed [#7506] unnecessary complex output on failure of response.should be_redirect -* Applied [#6098] Make scaffold_resource generator. Based on code from Pat Maddox. -* The drbspec command is gone. Use spec --drb instead. -* The drb option is gone from the Rake task. Pass --drb to spec_opts instead. -* New -X/--drb option for running specs against a server like spec/rails' script/rails_spec_server -* New -O/--options and -G/--generate flags for file-based options (handy for spec/rails) -* Applied [#7339] Turn off caching in HTML reports -* Applied [#7419] "c option for colorizing output does not work with rails_spec" (Patch from Shintaro Kakutani) -* Applied [#7406] [PATCH] 0.7.5 rspec_on_rails loads fixtures into development database (Patch from Wilson Bilkovich) -* Applied [#7387] Allow stubs to return consecutive values (Patch from Pat Maddox) -* Applied [#7393] Fix for rake task (Patch from Pat Maddox) -* Reinstated support for response.should_render (in addition to controller.should_render) - -== Version 0.7.5.1 - -Bug fix release to allow downloads of rspec gem using rubygems 0.9.1. - -== Version 0.7.5 -This release adds support for Heckle - Seattle'rb's code mutation tool. -There are also several bug fixes to the RSpec core and the RSpec on Rails plugin. - -* Removed svn:externals on rails versions and plugins -* Applied [#7345] Adding context_setup and context_teardown, with specs and 100% rcov -* Applied [#7320] [PATCH] Allow XHR requests in controller specs to render RJS templates -* Applied [#7319] Migration code uses drop_column when it should use remove_column (patch from Pat Maddox) -* Added support for Heckle -* Applied [#7282] dump results even if spec is interrupted (patch from Kouhei Sutou) -* Applied [#7277] model.should_have(n).errors_on(:attribute) (patch from Wilson Bilkovich) -* Applied [#7270] RSpec render_partial colliding with simply_helpful (patch from David Goodlad) -* Added [#7250] stubs should support throwing -* Added [#7249] stubs should support yielding -* Fixed [#6760] fatal error when accessing nested finders in rspec -* Fixed [#7179] script/generate rspec_scaffold generates incorrect helper name -* Added preliminary support for assert_select (response.should_have) -* Fixed [#6971] and_yield does not work when the arity is -1 -* Fixed [#6898] Can we separate rspec from the plugins? -* Added [#7025] should_change should accept a block -* Applied [#6989] partials with locals (patch from Micah Martin) -* Applied [#7023] Typo in team.page - -== Version 0.7.4 - -This release features a complete redesign of the reports generated with --format html. -As usual there are many bug fixes - mostly related to spec/rails. - -* Applied [#7010] Fixes :spacer_template does not work w/ view spec (patch from Shintaro Kakutani) -* Applied [#6798] ensure two ':' in the first backtrace line for Emacs's 'next-error' command (patch from Kouhei Sutou) -* Added Much nicer reports to generated website -* Much nicer reports with --format --html (patch from Luke Redpath) -* Applied [#6959] Calls to render and redirect in controllers should return true -* Fixed [#6981] helper method is not available in partial template. -* Added [#6978] mock should tell you the expected and actual args when receiving the right message with the wrong args -* Added the possibility to tweak the output of the HtmlFormatter (by overriding extra_failure_content). -* Fixed [#6936] View specs don't include ApplicationHelper by default -* Fixed [#6903] Rendering a partial in a view makes the view spec blow up -* Added callback library from Brian Takita -* Added [#6925] support controller.should_render :action_name -* Fixed [#6884] intermittent errors related to method binding -* Fixed [#6870] rspec on edge rails spec:controller fixture loading fails -* Using obj.inspect for all messages -* Improved performance by getting rid of instance_exec (instance_eval is good enough because we never need to pass it args) - -== Version 0.7.3 - -Almost normal bug fix/new feature release. - -A couple of things you need to change in your rails specs: -# spec_helper.rb is a little different (see http://rspec.rubyforge.org/upgrade.html) -# use controller.should_render before OR after the action (controller.should_have_rendered is deprecated) - -* Applied [#6577] messy mock backtrace when frozen to edge rails (patch from Jay Levitt) -* Fixed [#6674] rspec_on_rails fails on @session deprecation warning -* Fixed [#6780] routing() was failing...fix included - works for 1.1.6 and edge (1.2) -* Fixed [#6835] bad message with arbitrary predicate -* Added [#6731] Partial templates rendered -* Fixed [#6713] helper methods not rendered in view tests? -* Fixed [#6707] cannot run controller / helper tests via rails_spec or spec only works with rake -* Applied [#6417] lambda {...}.should_change(receiver, :message) (patch from Wilson Bilkovich) -* Eliminated dependency on ZenTest -* Fixed [#6650] Reserved characters in the TextMate bundle break svn on Win32 -* Fixed [#6643] script/generate rspec_controller: invalid symbol generation for 'controller_name' for *modularized* controllers -* The script/rails_spec command has been moved to bin/drbspec in RSpec core (installed by the gem) - -== Version 0.7.2 - -This release introduces a brand new RSpec bundle for TextMate, plus some small bugfixes. - -* Packaged RSpec.tmbundle.tgz as part of the distro -* Fixed [#6593] Add moving progress bar to HtmlFormatter using Javascript -* Applied [#6265] should_raise should accept an Exception object -* Fixed [#6616] Can't run Rails specs with RSpec.tmbundle -* Fixed [#6411] Can't run Rails specs with ruby -* Added [#6589] New -l --line option. This is useful for IDE/editor runners/extensions. -* Fixed [#6615] controller.should_render_rjs should support :partial => 'path/to/template' - -== Version 0.7.1 - -Bug fixes and a couple o' new features. - -* Fixed [#6575] Parse error in aliasing the partial mock original method (patch by Brian Takita) -* Fixed [#6277] debris left by stubbing (trunk) [submitted by dastels] (fixed by fix to [#6575]) -* Fixed [#6575] Parse error in aliasing the partial mock original method -* Fixed [#6555] should_have_tag does not match documentation -* Fixed [#6567] SyntaxError should not stop entire run -* Fixed [#6558] integrated views look for template even when redirected -* Fixed [#6547] response.should be_redirect broken in 0.7.0 -* Applied [#6471] Easy way to spec routes -* Applied [#6587] Rspec on Rails displays "Spec::Rails::ContextFactory" as context name -* Applied [#6514] Document has trivial typos. -* Added [#6560] controller.session should be available before the action -* Added support for should_have_rjs :visual_effect -* Different printing and colours for unmet expectations (red) and other exceptions (magenta) -* Simplified method_missing on mock_methods to make it less invasive on partial mocks. - -== Version 0.7.0 - -This is the "Grow up and eat your own dog food release". RSpec is now used on itself and -we're no longer using Test::Unit to test it. Although, we are still extending Test::Unit -for the rails plugin (indirectly - through ZenTest) - -IMPORTANT NOTE: THIS RELEASE IS NOT 100% BACKWARDS COMPATIBLE TO 0.6.x - -There are a few changes that will require that you change your existing specs. - -RSpec now handles equality exactly like ruby does: - -# actual.should_equal(expected) will pass if actual.equal?(expected) returns true -# actual.should eql(expected) will pass if actual.eql?(expected) returns true -# actual.should == expected will pass if actual == expected) returns true - -At the high level, eql? implies equivalence, while equal? implies object identity. For more -information on how ruby deals w/ equality, you should do this: - -ri equal? - -or look at this: - -http://www.ruby-doc.org/core/classes/Object.html#M001057 - -Also, we left in should_be as a synonym for should_equal, so the only specs that should break are the -ones using should_equal (which used to use <code>==</code> instead of <code>.equal?</code>). - -Lastly, should_be used to handle true and false differently from any other values. We've removed -this special handling, so now actual.should_be true will fail for any value other than true (it -used to pass for any non-nil, non-false value), and actual.should_be false will fail for any -value other than false (it used to pass for nil or false). - -Here's what you'll need to do to update your specs: -# search for "should_equal" and replace with "should_eql" -# run specs - -If any specs still fail, they are probably related to should be_true or should_be_false using -non-boolean values. Those you'll just have to inspect manually and adjust appropriately (sorry!). - --------------------------------------------------- -Specifying multiple return values in mocks now works like this: - -mock.should_receive(:message).and_return(1,2,3) - -It used to work like this: - -mock.should_receive(:message).and_return([1,2,3]) - -but we decided that was counter intuitive and otherwise lame. - -Here's what you'll need to do to update your specs: -# search for "and_return([" -# get rid of the "[" and "]" - --------------------------------------------------- -RSpec on Rails now supports the following (thanks to ZenTest upon which it is built): - -# Separate specs for models, views, controllers and helpers -# Controller specs are completely decoupled from the views by default (though you can tell them to couple themselves if you prefer) -# View specs are completely decoupled from app-specific controllers - -See http://rspec.rubyforge.org/documentation/rails/index.html for more information --------------------------------------------------- -As usual, there are also other new features and bug fixes: - -* Added lots of documentation on mocks/stubs and the rails plugin. -* Added support for assigns[key] syntax for controller specs (to align w/ pre-existing syntax for view specs) -* Added support for controller.should_redirect_to -* RSpec on Rails automatically checks whether it's compatible with the installed RSpec -* Applied [#6393] rspec_on_rails uses deprecated '@response' instead of the accessor -* RSpec now has 100% spec coverage(!) -* Added support for stubbing and partial mocking -* Progress (....F..F.) is now coloured. Tweaked patch from KAKUTANI Shintaro. -* Backtrace now excludes the rcov runner (/usr/local/bin/rcov) -* Fixed [#5539] predicates do not work w/ rails -* Added [#6091] support for Regexp matching messages sent to should_raise -* Added [#6333] support for Regexp matching in mock arguments -* Applied [#6283] refactoring of diff support to allow selectable formats and custom differs -* Fixed [#5564] "ruby spec_file.rb" doesn't work the same way as "spec spec_file.rb" -* Fixed [#6056] Multiple output of failing-spec notice -* Fixed [#6233] Colours in specdoc -* Applied [#6207] Allows --diff option to diff target and expected's #inspect output (Patch by Lachie Cox) -* Fixed [#6203] Failure messages are misleading - consider using inspect. -* Added [#6334] subject.should_have_xyz will try to call subject.has_xyz? - use this for hash.should_have_key(key) -* Fixed [#6017] Rake task should ignore empty or non-existent spec-dirs - -== Version 0.6.4 - -In addition to a number of bug fixes and patches, this release begins to formalize the support for -RSpec on Rails. - -* Added Christopher Petrilli's TextMate bundle to vendor/textmate/RSpec.tmbundle -* Fixed [#5909], once again supporting multi_word_predicates -* Applied [#5873] - response.should_have_rjs (initial patch from Jake Howerton, based on ARTS by Kevin Clark) -* Added generation of view specs for rspec_on_rails -* Applied [#5815] active_record_subclass.should_have(3).records -* Added support in "rake stats" for view specs (in spec/views) -* Applied [#5801] QuickRef.pdf should say RSpec, not rSpec -* Applied [#5728] rails_spec_runner fails on Windows (Patch from Lindsay Evans). -* Applied [#5708] RSpec Rails plugin rspec_controller generator makes specs that do not parse. -* Cleaned up RSpec on Rails so it doesn't pollute as much during bootstrapping. -* Added support for response.should_have_tag and response.should_not_have_tag (works just like assert_tag in rails) -* Added new -c, --colour, --color option for colourful (red/green) output. Inspired from Pat Eyler's Redgreen gem. -* Added examples for Watir and Selenium under the gem's vendor directory. -* Renamed rails_spec_runner to rails_spec_server (as referred to in the docs) -* Added support for trying a plural for arbitrary predicates. E.g. Album.should_exist(:name => "Hey Jude") will call Album.exists?(:name => "Hey Jude") -* Added support for should_have to work with methods taking args returning a collection. E.g. @dave.should_have(3).albums_i_have_that_this_guy_doesnt(@aslak) -* Added [#5570] should_not_receive(:msg).with(:specific, "args") -* Applied [#5065] to support using define_method rather than method_missing to capture expected messages on mocks. Thanks to Eero Saynatkari for the tip that made it work. -* Restructured directories and Modules in order to separate rspec into three distinct Modules: Spec::Expectations, Spec::Runner and Spec::Mocks. This will allow us to more easily integrate other mock frameworks and/or allow test/unit users to take advantage of the expectation API. -* Applied [#5620] support any boolean method and arbitrary comparisons (5.should_be < 6) (Patch from Mike Williams) - -== Version 0.6.3 - -This release fixes some minor bugs related to RSpec on Rails -Note that if you upgrade a rails app with this version of the rspec_on_rails plugin -you should remove your lib/tasks/rspec.rake if it exists. - -* Backtraces from drb (and other standard ruby libraries) are now stripped from backtraces. -* Applied [#5557] Put rspec.rake into the task directory of the RSpec on Rails plugin (Patch from Daniel Siemssen) -* Applied [#5556] rails_spec_server loads environment.rb twice (Patch from Daniel Siemssen) - -== Version 0.6.2 -This release fixes a couple of regressions with the rake task that were introduced in the previous version (0.6.1) - -* Fixed [#5518] ruby -w: warnings in 0.6.1 -* Applied [#5525] fix rake task path to spec tool for gem-installed rspec (patch from Riley Lynch) -* Fixed a teensey regression with the rake task - introduced in 0.6.1. The spec command is now quoted so it works on windows. - -== Version 0.6.1 -This is the "fix the most annoying bugs release" of RSpec. There are 9 bugfixes this time. -Things that may break backwards compatibility: -1) Spec::Rake::SpecTask no longer has the options attribute. Use ruby_opts, spec_opts and rcov_opts instead. - -* Fixed [#4891] RCOV task failing on windows -* Fixed [#4896] Shouldn't modify user's $LOAD_PATH (Tip from Gavin Sinclair) -* Fixed [#5369] ruby -w: warnings in RSpec 0.5.16 (Tip from Suraj Kurapati) -* Applied [#5141] ExampleMatcher doesn't escape strings before matching (Patch from Nikolai Weibull). -* Fixed [#5224] Move 'require diff-lcs' from test_helper.rb to diff_test.rb (Tip from Chris Roos) -* Applied [#5449] Rake stats for specs (Patch from Nick Sieger) -* Applied [#5468, #5058] Fix spec runner to correctly run controller specs (Patch from Daniel Siemssen) -* Applied fixes to rails_spec_server to improve its ability to run several times. (Patch from Daniel Siemssen) -* Changed RCov::VerifyTask to fail if the coverage is above the threshold. This is to ensure it gets bumped when coverage improves. - -== Version 0.6.0 -This release makes an official commitment to underscore_syntax (with no more support for dot.syntax) - -* Fixed bug (5292) that caused mock argument matching to fail -* Converted ALL tests to use underscore syntax -* Fixed all remaining problems with underscores revealed by converting all the tests to underscores -* Enhanced sugar to support combinations of methods (i.e. once.and_return) -* Simplified helper structure taking advantage of dot/underscore combos (i.e. should.be.an_instance_of, which can be expressed as should be_an_instance_of) -* Added support for at_most in mocks -* Added support for should_not_receive(:msg) (will be removing should_receive(:msg).never some time soon) -* Added support for should_have_exactly(5).items_in_collection - -== Version 0.5.16 -This release improves Rails support and test2spec translation. - -* Fixed underscore problems that occurred when RSpec was used in Rails -* Simplified the Rails support by packaging it as a plugin instead of a generator gem. -* Fixed [#5063] 'rspec_on_rails' require line in spec_helper.rb -* Added pre_commit rake task to reduce risk of regressions. Useful for RSpec developers and patchers. -* Added failure_message to RSpec Rake task -* test2spec now defines converted helper methods outside of the setup block (bug #5057). - -== Version 0.5.15 -This release removes a prematurely added feature that shouldn't have been added. - -* Removed support for differences that was added in 0.5.14. The functionality is not aligned with RSpec's vision. - -== Version 0.5.14 -This release introduces better ways to extend specs, improves some of the core API and -a experimental support for faster rails specs. - -* Added proc methods for specifying differences (increments and decrements). See difference_test.rb -* Methods can now be defined alongside specs. This obsoletes the need for defining methods in setup. (Patch #5002 from Brian Takita) -* Sugar (underscores) now works correctly with should be_a_kind_of and should be_an_instance_of -* Added support for include and inherit in contexts. (Patch #4971 from Brian Takita) -* Added rails_spec and rails_spec_server for faster specs on rails (still buggy - help needed) -* Fixed bug that caused should_render to break if given a :symbol (in Rails) -* Added support for comparing exception message in should_raise and should_not_raise - -== Version 0.5.13 -This release fixes some subtle bugs in the mock API. - -* Use fully-qualified class name of Exceptions in failure message. Easier to debug that way. -* Fixed a bug that caused mocks to yield a one-element array (rather than the element) when one yield arg specified. -* Mocks not raise AmbiguousReturnError if an explicit return is used at the same time as an expectation block. -* Blocks passed to yielding mocks can now raise without causing mock verification to fail. - -== Version 0.5.12 -This release adds diff support for failure messages, a HTML formatter plus some other -minor enhancements. - -* Added HTML formatter. -* Added fail_on_error option to spectask. -* Added support for diffing, using the diff-lcs Rubygem (#2648). -* Remove RSpec on Rails files from backtrace (#4694). -* All of RSpec's own tests run successfully after translation with test2spec. -* Added --verbose mode for test2spec - useful for debugging when classes fail to translate. -* Output of various formatters is now flushed - to get more continuous output. - -== Version 0.5.11 -This release makes test2spec usable with Rails (with some manual steps). -See http://rspec.rubyforge.org/tools/rails.html for more details - -* test2spec now correctly translates bodies of helper methods (non- test_*, setup and teardown ones). -* Added more documentation about how to get test2spec to work with Rails. - -== Version 0.5.10 -This version features a second rewrite of test2spec - hopefully better than the previous one. - -* Improved test2spec's internals. It now transforms the syntax tree before writing out the code. - -== Version 0.5.9 -This release improves test2spec by allowing more control over the output - -* Added --template option to test2spec, which allows for custom output driven by ERB -* Added --quiet option to test2spec -* Removed unnecessary dependency on RubyToC - -== Version 0.5.8 -This release features a new Test::Unit to RSpec translation tool. -Also note that the RubyGem of the previous release (0.5.7) was corrupt. -We're close to being able to translate all of RSpec's own Test::Unit -tests and have them run successfully! - -* Updated test2spec documentation. -* Replaced old test2rspec with a new test2spec, which is based on ParseTree and RubyInline. - -== Version 0.5.7 -This release changes examples and documentation to recommend underscores rather than dots, -and addresses some bugfixes and changes to the spec commandline. - -* spec DIR now works correctly, recursing down and slurping all *.rb files -* All documentation and examples are now using '_' instead of '.' -* Custom external formatters can now be specified via --require and --format. - -== Version 0.5.6 -This release fixes a bug in the Rails controller generator - -* The controller generator did not write correct source code (missing 'do'). Fixed. - -== Version 0.5.5 -This release adds initial support for Ruby on Rails in the rspec_generator gem. - -* [Rails] Reorganised Lachie's original code to be a generator packaged as a gem rather than a plugin. -* [Rails] Imported code from http://lachie.info/svn/projects/rails_plugins/rspec_on_rails (Written by Lachie Cox) -* Remove stack trace lines from TextMate's Ruby bundle -* Better error message from spectask when no spec files are found. - -== Version 0.5.4 -The "the tutorial is ahead of the gem" release - -* Support for running a single spec with --spec -* Exitcode is now 1 unless all specs pass, in which case it's 0. -* -v, --version now both mean the same thing -* For what was verbose output (-v), use --format specdoc or -f s -* --format rdoc always runs in dry-run mode -* Removed --doc and added --format and --dry-run -* Refactored towards more pluggable formatters -* Use webgen's execute tag when generating website (more accurate) -* Fixed incorrect quoting of spec_opts in SpecTask -* Added patch to enable underscored shoulds like 1.should_equal(1) - patch from Rich Kilmer -* Removed most inherited instance method from Mock, making more methods mockable. -* Made the RCovVerify task part of the standard toolset. -* Documented Rake task and how to use it with Rcov -* Implemented <ruby></ruby> tags for website (hooking into ERB, RedCloth and syntax) -* RSpec Rake task now takes spec_opts and out params so it can be used for doc generation -* RCov integration for RSpec Rake task (#4058) -* Group all results instead of printing them several times (#4057) -* Mocks can now yield -* Various improvements to error reporting (including #4191) -* backtrace excludes rspec code - use -b to include it -* split examples into examples (passing) and failing_examples - -== Version 0.5.3 -The "hurry up, CoR is in two days" release. - -* Don't run rcov by default -* Make separate task for running tests with RCov -* Added Rake task to fail build if coverage drops below a certain threshold -* Even more failure output cleanup (simplification) -* Added duck_type constraint for mocks - -== Version 0.5.2 -This release has minor improvements to the commandline and fixes some gem warnings - -* Readded README to avoid RDoc warnings -* Added --version switch to commandline -* More changes to the mock API - -== Version 0.5.1 -This release is the first release of RSpec with a new website. It will look better soon. - -* Added initial documentation for API -* Added website based on webgen -* Modified test task to use rcov -* Deleted unused code (thanks, rcov!) -* Various changes to the mock API, -* Various improvements to failure reporting - -== Version 0.5.0 -This release introduces a new API and obsolesces previous versions. - -* Moved source code to separate subfolders -* Added new DSL runner based on instance_exec -* Added spike for testdox/rdoc generation -* merge Astels' and Chelimsky's work on ShouldHelper -* this would be 0.5.0 if I updated the documentation -* it breaks all of your existing specifications. We're not sorry. - -== Version 0.3.2 - -The "srbaker is an idiot" release. - -* also forgot to update the path to the actual Subversion repository -* this should be it - -== Version 0.3.1 - -This is just 0.3.0, but with the TUTORIAL added to the documentation list. - -* forgot to include TUTORIAL in the documentation - -== Version 0.3.0 - -It's been a while since last release, lots of new stuff is available. For instance: - -* improvements to the runners -* addition of should_raise expectation (thanks to Brian Takita) -* some documentation improvements -* RSpec usable as a DSL - -== Version 0.2.0 - -This release provides a tutorial for new users wishing to get started with -RSpec, and many improvements. - -* improved reporting in the spec runner output -* update the examples to the new mock api -* added TUTORIAL, a getting started document for new users of RSpec - -== Version 0.1.7 - -This release improves installation and documentation, mock integration and error reporting. - -* Comparison errors now print the class name too. -* Mocks now take an optional +options+ parameter to specify behaviour. -* Removed __expects in favour of should_receive -* Added line number reporting in mock error messages for unreceived message expectations. -* Added should_match and should_not_match. -* Added a +mock+ method to Spec::Context which will create mocks that autoverify (no need to call __verify). -* Mocks now require names in the constructor to ensure sensible error messages. -* Made 'spec' executable and updated usage instructions in README accordingly. -* Made more parts of the Spec::Context API private to avoid accidental usage. -* Added more RDoc to Spec::Context. - -== Version 0.1.6 - -More should methods. - -* Added should_match and should_not_match. - -== Version 0.1.5 - -Included examples and tests in gem. - -== Version 0.1.4 - -More tests on block based Mock expectations. - -== Version 0.1.3 - -Improved mocking: - -* block based Mock expectations. - -== Version 0.1.2 - -This release adds some improvements to the mock API and minor syntax improvements - -* Added Mock.should_expect for a more consistent DSL. -* Added MockExpectation.and_returns for a better DSL. -* Made Mock behave as a null object after a call to Mock.ignore_missing -* Internal syntax improvements. -* Improved exception trace by adding exception class name to error message. -* Renamed some tests for better consistency. - -== Version 0.1.1 - -This release adds some shoulds and improves error reporting - -* Added should be_same_as and should_not be_same_as. -* Improved error reporting for comparison expectations. - -== Version 0.1.0 - -This is the first preview release of RSpec, a Behaviour-Driven Development library for Ruby - -* Added Rake script with tasks for gems, rdoc etc. -* Added an XForge task to make release go easier. diff --git a/vendor/plugins/rspec/MIT-LICENSE b/vendor/plugins/rspec/MIT-LICENSE deleted file mode 100644 index 336e52c94..000000000 --- a/vendor/plugins/rspec/MIT-LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (c) 2005-2008 The RSpec Development Team - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/plugins/rspec/README b/vendor/plugins/rspec/README deleted file mode 100644 index a532dca93..000000000 --- a/vendor/plugins/rspec/README +++ /dev/null @@ -1,36 +0,0 @@ -== RSpec - -RSpec is a Behaviour Driven Development framework with tools to express User Stories -with Executable Scenarios and Executable Examples at the code level. - -RSpec ships with several modules: - -Spec::Story provides a framework for expressing User Stories and Scenarios - -Spec::Example provides a framework for expressing Isolated Examples - -Spec::Matchers provides Expression Matchers for use with Spec::Expectations -and Spec::Mocks. - -Spec::Expectations supports setting expectations on your objects so you -can do things like: - - result.should equal(expected_result) - -Spec::Mocks supports creating Mock Objects, Stubs, and adding Mock/Stub -behaviour to your existing objects. - -== Installation - -The simplest approach is to install the gem (as root in some environments): - - gem install -r rspec - -== Building the RSpec gem - -If you prefer to build the gem locally: - - git clone git://github.com/dchelimsky/rspec.git - cd rspec - rake gem - gem install pkg/rspec-0.x.x.gem #as root diff --git a/vendor/plugins/rspec/Rakefile b/vendor/plugins/rspec/Rakefile index 9405e30bf..1a0a7cfe6 100644 --- a/vendor/plugins/rspec/Rakefile +++ b/vendor/plugins/rspec/Rakefile @@ -1,105 +1,101 @@ -$:.unshift('lib') -require 'rubygems' -require 'rake/gempackagetask' -require 'rake/contrib/rubyforgepublisher' -require 'rake/clean' -require 'rake/rdoctask' -require 'rake/testtask' +# -*- ruby -*- +gem 'hoe', '>=2.0.0' +require 'hoe' + +$:.unshift 'lib' + require 'spec/version' -dir = File.dirname(__FILE__) +require 'spec/rake/spectask' +require 'spec/ruby' +require 'cucumber/rake/task' -# Some of the tasks are in separate files since they are also part of the website documentation -load File.dirname(__FILE__) + '/rake_tasks/examples.rake' -load File.dirname(__FILE__) + '/rake_tasks/examples_with_rcov.rake' -load File.dirname(__FILE__) + '/rake_tasks/failing_examples_with_html.rake' -load File.dirname(__FILE__) + '/rake_tasks/verify_rcov.rake' +Hoe.spec 'rspec' do + self.version = Spec::VERSION::STRING + self.summary = Spec::VERSION::SUMMARY + self.description = "Behaviour Driven Development for Ruby." + self.rubyforge_name = 'rspec' + self.developer('RSpec Development Team', 'rspec-devel@rubyforge.org') + self.extra_dev_deps << ["cucumber",">=0.3"] << ["bmabey-fakefs",">=0.1.1"] << ["syntax",">=1.0"] << ["diff-lcs",">=1.1.2"] + self.extra_dev_deps << ["heckle",">=1.4.3"] unless Spec::Ruby.version >= "1.9" + self.remote_rdoc_dir = "rspec/#{Spec::VERSION::STRING}" + self.rspec_options = ['--options', 'spec/spec.opts'] + self.history_file = 'History.rdoc' + self.readme_file = 'README.rdoc' + self.post_install_message = <<-POST_INSTALL_MESSAGE +#{'*'*50} -PKG_NAME = "rspec" -PKG_VERSION = Spec::VERSION::STRING -PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}" -PKG_FILES = FileList[ - '[A-Z]*', - 'lib/**/*.rb', - 'spec/**/*', - 'examples/**/*', - 'failing_examples/**/*', - 'plugins/**/*', - 'stories/**/*', - 'rake_tasks/**/*' -] + Thank you for installing rspec-#{Spec::VERSION::STRING} -task :default => [:verify_rcov] -task :verify_rcov => [:spec, :stories] + Please be sure to read History.rdoc and Upgrade.rdoc + for useful information about this release. -desc "Run all specs" -Spec::Rake::SpecTask.new do |t| - t.spec_files = FileList['spec/**/*_spec.rb'] - t.spec_opts = ['--options', 'spec/spec.opts'] - unless ENV['NO_RCOV'] - t.rcov = true - t.rcov_dir = '../doc/output/coverage' - t.rcov_opts = ['--exclude', 'spec\/spec,bin\/spec,examples,\/var\/lib\/gems,\/Library\/Ruby,\.autotest'] - end +#{'*'*50} +POST_INSTALL_MESSAGE end -desc "Run all stories" -task :stories do - html = 'story_server/prototype/rspec_stories.html' - ruby "stories/all.rb --colour --format plain --format html:#{html}" - unless IO.read(html) =~ /<span class="param">/m - raise 'highlighted parameters are broken in story HTML' - end +['audit','test','test_deps','default','post_blog'].each do |task| + Rake.application.instance_variable_get('@tasks').delete(task) end -desc "Run all specs and store html output in doc/output/report.html" -Spec::Rake::SpecTask.new('spec_html') do |t| - t.spec_files = FileList['spec/**/*_spec.rb'] - t.spec_opts = ['--format html:../../../../doc/output/report.html', '--format progress','--backtrace'] +task :post_blog do + # no-op end -desc "Run all failing examples" -Spec::Rake::SpecTask.new('failing_examples') do |t| - t.spec_files = FileList['failing_examples/**/*_spec.rb'] -end +# Some of the tasks are in separate files since they are also part of the website documentation +load 'resources/rake/examples.rake' +load 'resources/rake/examples_with_rcov.rake' +load 'resources/rake/failing_examples_with_html.rake' +load 'resources/rake/verify_rcov.rake' -desc 'Generate RDoc' -rd = Rake::RDocTask.new do |rdoc| - rdoc.rdoc_dir = '../doc/output/rdoc' - rdoc.options << '--title' << 'RSpec' << '--line-numbers' << '--inline-source' << '--main' << 'README' - rdoc.rdoc_files.include('README', 'CHANGES', 'MIT-LICENSE', 'UPGRADE', 'lib/**/*.rb') +task :cleanup_rcov_files do + rm_rf 'coverage.data' end -spec = Gem::Specification.new do |s| - s.name = PKG_NAME - s.version = PKG_VERSION - s.summary = Spec::VERSION::DESCRIPTION - s.description = <<-EOF - RSpec is a behaviour driven development (BDD) framework for Ruby. RSpec was - created in response to Dave Astels' article _A New Look at Test Driven Development_ - which can be read at: http://daveastels.com/index.php?p=5 RSpec is intended to - provide the features discussed in Dave's article. - EOF - s.files = PKG_FILES.to_a - s.require_path = 'lib' +if RUBY_VERSION =~ /^1.8/ + task :default => [:cleanup_rcov_files, :features, :verify_rcov] +else + task :default => [:spec, :features] +end - s.has_rdoc = true - s.rdoc_options = rd.options - s.extra_rdoc_files = rd.rdoc_files.reject { |fn| fn =~ /\.rb$|^EXAMPLES.rd$/ }.to_a +namespace :spec do - s.bindir = 'bin' - s.executables = ['spec', 'spec_translator'] - s.default_executable = 'spec' - s.author = "RSpec Development Team" - s.email = "rspec-devel@rubyforge.org" - s.homepage = "http://rspec.rubyforge.org" - s.platform = Gem::Platform::RUBY - s.rubyforge_project = "rspec" + desc "Run all specs with rcov" + Spec::Rake::SpecTask.new(:rcov) do |t| + t.spec_files = FileList['spec/**/*_spec.rb'] + t.spec_opts = ['--options', 'spec/spec.opts'] + t.rcov = true + t.rcov_dir = 'coverage' + t.rcov_opts = ['--exclude', "features,kernel,load-diff-lcs\.rb,instance_exec\.rb,lib/spec.rb,lib/spec/runner.rb,^spec/*,bin/spec,examples,/gems,/Library/Ruby,\.autotest,#{ENV['GEM_HOME']}"] + t.rcov_opts << '--sort coverage --text-summary --aggregate coverage.data' + end + + desc "Run files listed in spec/spec_files.txt" + Spec::Rake::SpecTask.new(:focus) do |t| + if File.exists?('spec/spec_files.txt') + t.spec_files = File.readlines('spec/spec_files.txt').collect{|f| f.chomp} + end + end end -Rake::GemPackageTask.new(spec) do |pkg| - pkg.need_zip = true - pkg.need_tar = true +desc "Run Cucumber features" +if RUBY_VERSION =~ /^1.8/ + Cucumber::Rake::Task.new :features do |t| + t.rcov = true + t.rcov_opts = ['--exclude', "features,kernel,load-diff-lcs\.rb,instance_exec\.rb,lib/spec.rb,lib/spec/runner.rb,^spec/*,bin/spec,examples,/gems,/Library/Ruby,\.autotest,#{ENV['GEM_HOME']}"] + t.rcov_opts << '--no-html --aggregate coverage.data' + t.cucumber_opts = %w{--format progress} + end +else + task :features do + sh 'cucumber --profile no_heckle' + end +end + +desc "Run failing examples (see failure output)" +Spec::Rake::SpecTask.new('failing_examples') do |t| + t.spec_files = FileList['failing_examples/**/*_spec.rb'] + t.spec_opts = ['--options', 'spec/spec.opts'] end def egrep(pattern) @@ -121,148 +117,29 @@ task :todo do egrep /(FIXME|TODO|TBD)/ end -task :clobber do - core.clobber -end - -task :release => [:clobber, :verify_committed, :verify_user, :spec, :publish_packages, :tag, :publish_news] +desc "verify_committed, verify_rcov, post_news, release" +task :complete_release => [:verify_committed, :verify_rcov, :post_news, :release] desc "Verifies that there is no uncommitted code" task :verify_committed do - IO.popen('svn stat') do |io| + IO.popen('git status') do |io| io.each_line do |line| - raise "\n!!! Do a svn commit first !!!\n\n" if line =~ /^\s*M\s*/ + raise "\n!!! Do a git commit first !!!\n\n" if line =~ /^#\s*modified:/ end end end -desc "Creates a tag in svn" -task :tag do - from = `svn info #{File.dirname(__FILE__)}`.match(/URL: (.*)\/rspec/n)[1] - to = from.gsub(/trunk/, "tags/#{Spec::VERSION::TAG}") - current = from.gsub(/trunk/, "tags/CURRENT") - - puts "Creating tag in SVN" - tag_cmd = "svn cp #{from} #{to} -m \"Tag release #{Spec::VERSION::FULL_VERSION}\"" - `#{tag_cmd}` ; raise "ERROR: #{tag_cmd}" unless $? == 0 - - puts "Removing CURRENT" - remove_current_cmd = "svn rm #{current} -m \"Remove tags/CURRENT\"" - `#{remove_current_cmd}` ; raise "ERROR: #{remove_current_cmd}" unless $? == 0 - - puts "Re-Creating CURRENT" - create_current_cmd = "svn cp #{to} #{current} -m \"Copy #{Spec::VERSION::TAG} to tags/CURRENT\"" - `#{create_current_cmd}` ; "ERROR: #{create_current_cmd}" unless $? == 0 -end - -task :verify_user do - raise "RUBYFORGE_USER environment variable not set!" unless ENV['RUBYFORGE_USER'] -end - -desc "Upload Website to RubyForge" -task :publish_website => [:verify_user, :website] do - unless Spec::VERSION::RELEASE_CANDIDATE - publisher = Rake::SshDirPublisher.new( - "rspec-website@rubyforge.org", - "/var/www/gforge-projects/#{PKG_NAME}", - "../doc/output" - ) - publisher.upload - else - puts "** Not publishing packages to RubyForge - this is a prerelease" - end -end - -desc "Upload Website archive to RubyForge" -task :archive_website => [:verify_user, :website] do - publisher = Rake::SshDirPublisher.new( - "rspec-website@rubyforge.org", - "/var/www/gforge-projects/#{PKG_NAME}/#{Spec::VERSION::TAG}", - "../doc/output" - ) - publisher.upload -end - -desc "Package the Rails plugin" -task :package_rspec_on_rails do - mkdir 'pkg' rescue nil - rm_rf 'pkg/rspec-rails' rescue nil - `svn export ../rspec-rails pkg/rspec_on_rails-#{PKG_VERSION}` - Dir.chdir 'pkg' do - `tar cvzf rspec-rails-#{PKG_VERSION}.tgz rspec-rails-#{PKG_VERSION}` - end -end -task :pkg => :package_rspec_on_rails - -desc "Package the RSpec.tmbundle" -task :package_tmbundle do - mkdir 'pkg' rescue nil - rm_rf 'pkg/RSpec.tmbundle' rescue nil - `svn export ../RSpec.tmbundle pkg/RSpec.tmbundle` - Dir.chdir 'pkg' do - `tar cvzf RSpec-#{PKG_VERSION}.tmbundle.tgz RSpec.tmbundle` +namespace :update do + desc "update the manifest" + task :manifest do + system %q[touch Manifest.txt; rake check_manifest | grep -v "(in " | patch] end end -task :pkg => :package_tmbundle -desc "Publish gem+tgz+zip on RubyForge. You must make sure lib/version.rb is aligned with the CHANGELOG file" -task :publish_packages => [:verify_user, :package] do - release_files = FileList[ - "pkg/#{PKG_FILE_NAME}.gem", - "pkg/#{PKG_FILE_NAME}.tgz", - "pkg/rspec-rails-#{PKG_VERSION}.tgz", - "pkg/#{PKG_FILE_NAME}.zip", - "pkg/RSpec-#{PKG_VERSION}.tmbundle.tgz" - ] - unless Spec::VERSION::RELEASE_CANDIDATE - require 'meta_project' - require 'rake/contrib/xforge' - - Rake::XForge::Release.new(MetaProject::Project::XForge::RubyForge.new(PKG_NAME)) do |xf| - # Never hardcode user name and password in the Rakefile! - xf.user_name = ENV['RUBYFORGE_USER'] - xf.files = release_files.to_a - xf.release_name = "RSpec #{PKG_VERSION}" - end - else - puts "SINCE THIS IS A PRERELEASE, FILES ARE UPLOADED WITH SSH, NOT TO THE RUBYFORGE FILE SECTION" - puts "YOU MUST TYPE THE PASSWORD #{release_files.length} TIMES..." - - host = "rspec-website@rubyforge.org" - remote_dir = "/var/www/gforge-projects/#{PKG_NAME}" - - publisher = Rake::SshFilePublisher.new( - host, - remote_dir, - File.dirname(__FILE__), - *release_files - ) - publisher.upload - - puts "UPLADED THE FOLLOWING FILES:" - release_files.each do |file| - name = file.match(/pkg\/(.*)/)[1] - puts "* http://rspec.rubyforge.org/#{name}" - end - - puts "They are not linked to anywhere, so don't forget to tell people!" - end -end - -desc "Publish news on RubyForge" -task :publish_news => [:verify_user] do - unless Spec::VERSION::RELEASE_CANDIDATE - require 'meta_project' - require 'rake/contrib/xforge' - Rake::XForge::NewsPublisher.new(MetaProject::Project::XForge::RubyForge.new(PKG_NAME)) do |news| - # Never hardcode user name and password in the Rakefile! - news.user_name = ENV['RUBYFORGE_USER'] - end - else - puts "** Not publishing news to RubyForge - this is a prerelease" - end -end +task :clobber => :clobber_tmp -def core - PreCommit::Core.new(self) +task :clobber_tmp do + cmd = %q[rm -r tmp] + puts cmd + system cmd if test ?d, 'tmp' end diff --git a/vendor/plugins/rspec/TODO b/vendor/plugins/rspec/TODO deleted file mode 100644 index 8b1378917..000000000 --- a/vendor/plugins/rspec/TODO +++ /dev/null @@ -1 +0,0 @@ - diff --git a/vendor/plugins/rspec/UPGRADE b/vendor/plugins/rspec/UPGRADE deleted file mode 100644 index 923b31530..000000000 --- a/vendor/plugins/rspec/UPGRADE +++ /dev/null @@ -1,7 +0,0 @@ -== Spec::Rails - - script/generate rspec - -Or modify spec_helper.rb based on the template, which can be found at: - - vendor/plugins/rspec_on_rails/generators/rspec/templates/spec_helper.rb
\ No newline at end of file diff --git a/vendor/plugins/rspec/bin/spec b/vendor/plugins/rspec/bin/spec index 283176d76..d3dd2430f 100755 --- a/vendor/plugins/rspec/bin/spec +++ b/vendor/plugins/rspec/bin/spec @@ -1,4 +1,5 @@ #!/usr/bin/env ruby -$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__) + "/../lib")) -require 'spec' -exit ::Spec::Runner::CommandLine.run(rspec_options) +rspec_dir = File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib')) +$LOAD_PATH.unshift(rspec_dir) unless $LOAD_PATH.include?(rspec_dir) +require 'spec/autorun' +exit ::Spec::Runner::CommandLine.run diff --git a/vendor/plugins/rspec/bin/spec_translator b/vendor/plugins/rspec/bin/spec_translator deleted file mode 100755 index abd50b743..000000000 --- a/vendor/plugins/rspec/bin/spec_translator +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env ruby -raise "\n\nUsage: spec_translator from_dir to_dir\n\n" if ARGV.size != 2 -$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__) + "/../lib")) -require 'spec/translator' -t = ::Spec::Translator.new -from = ARGV[0] -to = ARGV[1] -t.translate(from, to) diff --git a/vendor/plugins/rspec/examples/pure/autogenerated_docstrings_example.rb b/vendor/plugins/rspec/examples/pure/autogenerated_docstrings_example.rb deleted file mode 100644 index a4928ef4a..000000000 --- a/vendor/plugins/rspec/examples/pure/autogenerated_docstrings_example.rb +++ /dev/null @@ -1,19 +0,0 @@ -require File.dirname(__FILE__) + '/spec_helper' - -# Run spec w/ -fs to see the output of this file - -describe "Examples with no descriptions" do - - # description is auto-generated as "should equal(5)" based on the last #should - it do - 3.should equal(3) - 5.should equal(5) - end - - it { 3.should be < 5 } - - it { ["a"].should include("a") } - - it { [1,2,3].should respond_to(:size) } - -end diff --git a/vendor/plugins/rspec/examples/pure/before_and_after_example.rb b/vendor/plugins/rspec/examples/pure/before_and_after_example.rb deleted file mode 100644 index 7db6274ef..000000000 --- a/vendor/plugins/rspec/examples/pure/before_and_after_example.rb +++ /dev/null @@ -1,40 +0,0 @@ -require File.dirname(__FILE__) + '/spec_helper' -$global = 0 - -describe "State created in before(:all)" do - before :all do - @sideeffect = 1 - $global +=1 - end - - before :each do - @isolated = 1 - end - - it "should be accessible from example" do - @sideeffect.should == 1 - $global.should == 1 - @isolated.should == 1 - - @sideeffect += 1 - @isolated += 1 - end - - it "should not have sideffects" do - @sideeffect.should == 1 - $global.should == 2 - @isolated.should == 1 - - @sideeffect += 1 - @isolated += 1 - end - - after :each do - $global += 1 - end - - after :all do - $global.should == 3 - $global = 0 - end -end diff --git a/vendor/plugins/rspec/examples/pure/behave_as_example.rb b/vendor/plugins/rspec/examples/pure/behave_as_example.rb deleted file mode 100644 index e95d1469a..000000000 --- a/vendor/plugins/rspec/examples/pure/behave_as_example.rb +++ /dev/null @@ -1,45 +0,0 @@ -require File.dirname(__FILE__) + '/spec_helper' - -def behave_as_electric_musician - respond_to(:read_notes, :turn_down_amp) -end - -def behave_as_musician - respond_to(:read_notes) -end - -module BehaveAsExample - - class BluesGuitarist - def read_notes; end - def turn_down_amp; end - end - - class RockGuitarist - def read_notes; end - def turn_down_amp; end - end - - class ClassicGuitarist - def read_notes; end - end - - describe BluesGuitarist do - it "should behave as guitarist" do - BluesGuitarist.new.should behave_as_electric_musician - end - end - - describe RockGuitarist do - it "should behave as guitarist" do - RockGuitarist.new.should behave_as_electric_musician - end - end - - describe ClassicGuitarist do - it "should not behave as guitarist" do - ClassicGuitarist.new.should behave_as_musician - end - end - -end diff --git a/vendor/plugins/rspec/examples/pure/custom_expectation_matchers.rb b/vendor/plugins/rspec/examples/pure/custom_expectation_matchers.rb deleted file mode 100644 index 075bb542d..000000000 --- a/vendor/plugins/rspec/examples/pure/custom_expectation_matchers.rb +++ /dev/null @@ -1,54 +0,0 @@ -module AnimalSpecHelper - class Eat - def initialize(food) - @food = food - end - - def matches?(animal) - @animal = animal - @animal.eats?(@food) - end - - def failure_message - "expected #{@animal} to eat #{@food}, but it does not" - end - - def negative_failure_message - "expected #{@animal} not to eat #{@food}, but it does" - end - end - - def eat(food) - Eat.new(food) - end -end - -module Animals - class Animal - def eats?(food) - return foods_i_eat.include?(food) - end - end - - class Mouse < Animal - def foods_i_eat - [:cheese] - end - end - - describe Mouse do - include AnimalSpecHelper - before(:each) do - @mouse = Animals::Mouse.new - end - - it "should eat cheese" do - @mouse.should eat(:cheese) - end - - it "should not eat cat" do - @mouse.should_not eat(:cat) - end - end - -end diff --git a/vendor/plugins/rspec/examples/pure/custom_formatter.rb b/vendor/plugins/rspec/examples/pure/custom_formatter.rb deleted file mode 100644 index c449fdc2e..000000000 --- a/vendor/plugins/rspec/examples/pure/custom_formatter.rb +++ /dev/null @@ -1,12 +0,0 @@ -require File.dirname(__FILE__) + '/spec_helper' -require 'spec/runner/formatter/progress_bar_formatter' - -# Example of a formatter with custom bactrace printing. Run me with: -# ruby bin/spec failing_examples -r examples/custom_formatter.rb -f CustomFormatter -class CustomFormatter < Spec::Runner::Formatter::ProgressBarFormatter - def backtrace_line(line) - line.gsub(/([^:]*\.rb):(\d*)/) do - "<a href=\"file://#{File.expand_path($1)}\">#{$1}:#{$2}</a> " - end - end -end diff --git a/vendor/plugins/rspec/examples/pure/dynamic_spec.rb b/vendor/plugins/rspec/examples/pure/dynamic_spec.rb deleted file mode 100644 index 15d473d61..000000000 --- a/vendor/plugins/rspec/examples/pure/dynamic_spec.rb +++ /dev/null @@ -1,9 +0,0 @@ -require File.dirname(__FILE__) + '/spec_helper' - -describe "Some integers" do - (1..10).each do |n| - it "The root of #{n} square should be #{n}" do - Math.sqrt(n*n).should == n - end - end -end diff --git a/vendor/plugins/rspec/examples/pure/file_accessor.rb b/vendor/plugins/rspec/examples/pure/file_accessor.rb deleted file mode 100644 index ff6fb743c..000000000 --- a/vendor/plugins/rspec/examples/pure/file_accessor.rb +++ /dev/null @@ -1,19 +0,0 @@ -require File.dirname(__FILE__) + '/spec_helper' -class FileAccessor - def open_and_handle_with(pathname, processor) - pathname.open do |io| - processor.process(io) - end - end -end - -if __FILE__ == $0 - require File.dirname(__FILE__) + '/io_processor' - require 'pathname' - - accessor = FileAccessor.new - io_processor = IoProcessor.new - file = Pathname.new ARGV[0] - - accessor.open_and_handle_with(file, io_processor) -end diff --git a/vendor/plugins/rspec/examples/pure/file_accessor_spec.rb b/vendor/plugins/rspec/examples/pure/file_accessor_spec.rb deleted file mode 100644 index 628d4c0b0..000000000 --- a/vendor/plugins/rspec/examples/pure/file_accessor_spec.rb +++ /dev/null @@ -1,38 +0,0 @@ -require File.dirname(__FILE__) + '/spec_helper' -require File.dirname(__FILE__) + '/file_accessor' -require 'stringio' - -describe "A FileAccessor" do - # This sequence diagram illustrates what this spec specifies. - # - # +--------------+ +----------+ +-------------+ - # | FileAccessor | | Pathname | | IoProcessor | - # +--------------+ +----------+ +-------------+ - # | | | - # open_and_handle_with | | | - # -------------------->| | open | | - # | |--------------->| | | - # | | io | | | - # | |<...............| | | - # | | | process(io) | - # | |---------------------------------->| | - # | | | | | - # | |<..................................| | - # | | | - # - it "should open a file and pass it to the processor's process method" do - # This is the primary actor - accessor = FileAccessor.new - - # These are the primary actor's neighbours, which we mock. - file = mock "Pathname" - io_processor = mock "IoProcessor" - - io = StringIO.new "whatever" - file.should_receive(:open).and_yield io - io_processor.should_receive(:process).with(io) - - accessor.open_and_handle_with(file, io_processor) - end - -end diff --git a/vendor/plugins/rspec/examples/pure/greeter_spec.rb b/vendor/plugins/rspec/examples/pure/greeter_spec.rb deleted file mode 100644 index ec7669dcc..000000000 --- a/vendor/plugins/rspec/examples/pure/greeter_spec.rb +++ /dev/null @@ -1,31 +0,0 @@ -require File.dirname(__FILE__) + '/spec_helper' -# greeter.rb -# -# Based on http://glu.ttono.us/articles/2006/12/19/tormenting-your-tests-with-heckle -# -# Run with: -# -# spec greeter_spec.rb --heckle Greeter -# -class Greeter - def initialize(person = nil) - @person = person - end - - def greet - @person.nil? ? "Hi there!" : "Hi #{@person}!" - end -end - -describe "Greeter" do - it "should say Hi to person" do - greeter = Greeter.new("Kevin") - greeter.greet.should == "Hi Kevin!" - end - - it "should say Hi to nobody" do - greeter = Greeter.new - # Uncomment the next line to make Heckle happy - #greeter.greet.should == "Hi there!" - end -end diff --git a/vendor/plugins/rspec/examples/pure/helper_method_example.rb b/vendor/plugins/rspec/examples/pure/helper_method_example.rb deleted file mode 100644 index d97f19e65..000000000 --- a/vendor/plugins/rspec/examples/pure/helper_method_example.rb +++ /dev/null @@ -1,14 +0,0 @@ -require File.dirname(__FILE__) + '/spec_helper' - -module HelperMethodExample - describe "an example group with helper a method" do - def helper_method - "received call" - end - - it "should make that method available to specs" do - helper_method.should == "received call" - end - end -end - diff --git a/vendor/plugins/rspec/examples/pure/io_processor.rb b/vendor/plugins/rspec/examples/pure/io_processor.rb deleted file mode 100644 index 6b15147b6..000000000 --- a/vendor/plugins/rspec/examples/pure/io_processor.rb +++ /dev/null @@ -1,8 +0,0 @@ -class DataTooShort < StandardError; end - -class IoProcessor - # Does some fancy stuff unless the length of +io+ is shorter than 32 - def process(io) - raise DataTooShort if io.read.length < 32 - end -end diff --git a/vendor/plugins/rspec/examples/pure/io_processor_spec.rb b/vendor/plugins/rspec/examples/pure/io_processor_spec.rb deleted file mode 100644 index 5cab7bf31..000000000 --- a/vendor/plugins/rspec/examples/pure/io_processor_spec.rb +++ /dev/null @@ -1,21 +0,0 @@ -require File.dirname(__FILE__) + '/spec_helper' -require File.dirname(__FILE__) + '/io_processor' -require 'stringio' - -describe "An IoProcessor" do - before(:each) do - @processor = IoProcessor.new - end - - it "should raise nothing when the file is exactly 32 bytes" do - lambda { - @processor.process(StringIO.new("z"*32)) - }.should_not raise_error - end - - it "should raise an exception when the file length is less than 32 bytes" do - lambda { - @processor.process(StringIO.new("z"*31)) - }.should raise_error(DataTooShort) - end -end diff --git a/vendor/plugins/rspec/examples/pure/legacy_spec.rb b/vendor/plugins/rspec/examples/pure/legacy_spec.rb deleted file mode 100644 index c86369515..000000000 --- a/vendor/plugins/rspec/examples/pure/legacy_spec.rb +++ /dev/null @@ -1,11 +0,0 @@ -require File.dirname(__FILE__) + '/spec_helper' -context "A legacy spec" do - setup do - end - - specify "should work fine" do - end - - teardown do - end -end diff --git a/vendor/plugins/rspec/examples/pure/mocking_example.rb b/vendor/plugins/rspec/examples/pure/mocking_example.rb deleted file mode 100644 index 6adbef59d..000000000 --- a/vendor/plugins/rspec/examples/pure/mocking_example.rb +++ /dev/null @@ -1,27 +0,0 @@ -require File.dirname(__FILE__) + '/spec_helper' - -describe "A consumer of a mock" do - it "should be able to send messages to the mock" do - mock = mock("poke me") - mock.should_receive(:poke) - mock.poke - end -end - -describe "a mock" do - it "should be able to mock the same message twice w/ different args" do - mock = mock("mock") - mock.should_receive(:msg).with(:arg1).and_return(:val1) - mock.should_receive(:msg).with(:arg2).and_return(:val2) - mock.msg(:arg1).should eql(:val1) - mock.msg(:arg2).should eql(:val2) - end - - it "should be able to mock the same message twice w/ different args in reverse order" do - mock = mock("mock") - mock.should_receive(:msg).with(:arg1).and_return(:val1) - mock.should_receive(:msg).with(:arg2).and_return(:val2) - mock.msg(:arg2).should eql(:val2) - mock.msg(:arg1).should eql(:val1) - end -end diff --git a/vendor/plugins/rspec/examples/pure/multi_threaded_behaviour_runner.rb b/vendor/plugins/rspec/examples/pure/multi_threaded_behaviour_runner.rb deleted file mode 100644 index 36edcd497..000000000 --- a/vendor/plugins/rspec/examples/pure/multi_threaded_behaviour_runner.rb +++ /dev/null @@ -1,28 +0,0 @@ -class MultiThreadedExampleGroupRunner < Spec::Runner::ExampleGroupRunner - def initialize(options, arg) - super(options) - # configure these - @thread_count = 4 - @thread_wait = 0 - end - - def run - @threads = [] - q = Queue.new - example_groups.each { |b| q << b} - success = true - @thread_count.times do - @threads << Thread.new(q) do |queue| - while not queue.empty? - example_group = queue.pop - success &= example_group.suite.run(nil) - end - end - sleep @thread_wait - end - @threads.each {|t| t.join} - success - end -end - -MultiThreadedBehaviourRunner = MultiThreadedExampleGroupRunner
\ No newline at end of file diff --git a/vendor/plugins/rspec/examples/pure/nested_classes_example.rb b/vendor/plugins/rspec/examples/pure/nested_classes_example.rb deleted file mode 100644 index abe43b0a6..000000000 --- a/vendor/plugins/rspec/examples/pure/nested_classes_example.rb +++ /dev/null @@ -1,36 +0,0 @@ -require File.dirname(__FILE__) + '/spec_helper' -require File.dirname(__FILE__) + '/stack' - -class StackExamples < Spec::ExampleGroup - describe(Stack) - before(:each) do - @stack = Stack.new - end -end - -class EmptyStackExamples < StackExamples - describe("when empty") - it "should be empty" do - @stack.should be_empty - end -end - -class AlmostFullStackExamples < StackExamples - describe("when almost full") - before(:each) do - (1..9).each {|n| @stack.push n} - end - it "should be full" do - @stack.should_not be_full - end -end - -class FullStackExamples < StackExamples - describe("when full") - before(:each) do - (1..10).each {|n| @stack.push n} - end - it "should be full" do - @stack.should be_full - end -end
\ No newline at end of file diff --git a/vendor/plugins/rspec/examples/pure/partial_mock_example.rb b/vendor/plugins/rspec/examples/pure/partial_mock_example.rb deleted file mode 100644 index 2af608b2f..000000000 --- a/vendor/plugins/rspec/examples/pure/partial_mock_example.rb +++ /dev/null @@ -1,29 +0,0 @@ -require File.dirname(__FILE__) + '/spec_helper' - -class MockableClass - def self.find id - return :original_return - end -end - -describe "A partial mock" do - - it "should work at the class level" do - MockableClass.should_receive(:find).with(1).and_return {:stub_return} - MockableClass.find(1).should equal(:stub_return) - end - - it "should revert to the original after each spec" do - MockableClass.find(1).should equal(:original_return) - end - - it "can be mocked w/ ordering" do - MockableClass.should_receive(:msg_1).ordered - MockableClass.should_receive(:msg_2).ordered - MockableClass.should_receive(:msg_3).ordered - MockableClass.msg_1 - MockableClass.msg_2 - MockableClass.msg_3 - end - -end diff --git a/vendor/plugins/rspec/examples/pure/pending_example.rb b/vendor/plugins/rspec/examples/pure/pending_example.rb deleted file mode 100644 index 13f3d00c4..000000000 --- a/vendor/plugins/rspec/examples/pure/pending_example.rb +++ /dev/null @@ -1,20 +0,0 @@ -require File.dirname(__FILE__) + '/spec_helper' - -describe "pending example (using pending method)" do - it %Q|should be reported as "PENDING: for some reason"| do - pending("for some reason") - end -end - -describe "pending example (with no block)" do - it %Q|should be reported as "PENDING: Not Yet Implemented"| -end - -describe "pending example (with block for pending)" do - it %Q|should have a failing block, passed to pending, reported as "PENDING: for some reason"| do - pending("for some reason") do - raise "some reason" - end - end -end - diff --git a/vendor/plugins/rspec/examples/pure/predicate_example.rb b/vendor/plugins/rspec/examples/pure/predicate_example.rb deleted file mode 100644 index 1202bb670..000000000 --- a/vendor/plugins/rspec/examples/pure/predicate_example.rb +++ /dev/null @@ -1,27 +0,0 @@ -require File.dirname(__FILE__) + '/spec_helper' - -class BddFramework - def intuitive? - true - end - - def adopted_quickly? - true - end -end - -describe "BDD framework" do - - before(:each) do - @bdd_framework = BddFramework.new - end - - it "should be adopted quickly" do - @bdd_framework.should be_adopted_quickly - end - - it "should be intuitive" do - @bdd_framework.should be_intuitive - end - -end diff --git a/vendor/plugins/rspec/examples/pure/priority.txt b/vendor/plugins/rspec/examples/pure/priority.txt deleted file mode 100644 index 5b00064e2..000000000 --- a/vendor/plugins/rspec/examples/pure/priority.txt +++ /dev/null @@ -1 +0,0 @@ -examples/custom_expectation_matchers.rb
\ No newline at end of file diff --git a/vendor/plugins/rspec/examples/pure/shared_example_group_example.rb b/vendor/plugins/rspec/examples/pure/shared_example_group_example.rb deleted file mode 100644 index fb81af1ec..000000000 --- a/vendor/plugins/rspec/examples/pure/shared_example_group_example.rb +++ /dev/null @@ -1,81 +0,0 @@ -require File.dirname(__FILE__) + '/spec_helper' - -module SharedExampleGroupExample - class OneThing - def what_things_do - "stuff" - end - end - - class AnotherThing - def what_things_do - "stuff" - end - end - - class YetAnotherThing - def what_things_do - "stuff" - end - end - - # A SharedExampleGroup is an example group that doesn't get run. - # You can create one like this: - share_examples_for "most things" do - def helper_method - "helper method" - end - - it "should do what things do" do - @thing.what_things_do.should == "stuff" - end - end - - # A SharedExampleGroup is also module. If you create one like this - # it gets assigned to the constant AllThings - share_as :MostThings do - def helper_method - "helper method" - end - - it "should do what things do" do - @thing.what_things_do.should == "stuff" - end - end - - describe OneThing do - # Now you can include the shared example group like this, which - # feels more like what you might say ... - it_should_behave_like "most things" - - before(:each) { @thing = OneThing.new } - - it "should have access to helper methods defined in the shared example group" do - helper_method.should == "helper method" - end - end - - describe AnotherThing do - # ... or you can include the example group like this, which - # feels more like the programming language we love. - it_should_behave_like MostThings - - before(:each) { @thing = AnotherThing.new } - - it "should have access to helper methods defined in the shared example group" do - helper_method.should == "helper method" - end - end - - describe YetAnotherThing do - # ... or you can include the example group like this, which - # feels more like the programming language we love. - include MostThings - - before(:each) { @thing = AnotherThing.new } - - it "should have access to helper methods defined in the shared example group" do - helper_method.should == "helper method" - end - end -end diff --git a/vendor/plugins/rspec/examples/pure/shared_stack_examples.rb b/vendor/plugins/rspec/examples/pure/shared_stack_examples.rb deleted file mode 100644 index 7a0816250..000000000 --- a/vendor/plugins/rspec/examples/pure/shared_stack_examples.rb +++ /dev/null @@ -1,38 +0,0 @@ -require File.join(File.dirname(__FILE__), *%w[spec_helper]) - -shared_examples_for "non-empty Stack" do - - it { @stack.should_not be_empty } - - it "should return the top item when sent #peek" do - @stack.peek.should == @last_item_added - end - - it "should NOT remove the top item when sent #peek" do - @stack.peek.should == @last_item_added - @stack.peek.should == @last_item_added - end - - it "should return the top item when sent #pop" do - @stack.pop.should == @last_item_added - end - - it "should remove the top item when sent #pop" do - @stack.pop.should == @last_item_added - unless @stack.empty? - @stack.pop.should_not == @last_item_added - end - end - -end - -shared_examples_for "non-full Stack" do - - it { @stack.should_not be_full } - - it "should add to the top when sent #push" do - @stack.push "newly added top item" - @stack.peek.should == "newly added top item" - end - -end
\ No newline at end of file diff --git a/vendor/plugins/rspec/examples/pure/spec_helper.rb b/vendor/plugins/rspec/examples/pure/spec_helper.rb deleted file mode 100644 index 1e880796c..000000000 --- a/vendor/plugins/rspec/examples/pure/spec_helper.rb +++ /dev/null @@ -1,3 +0,0 @@ -lib_path = File.expand_path("#{File.dirname(__FILE__)}/../../lib") -$LOAD_PATH.unshift lib_path unless $LOAD_PATH.include?(lib_path) -require 'spec' diff --git a/vendor/plugins/rspec/examples/pure/stack.rb b/vendor/plugins/rspec/examples/pure/stack.rb deleted file mode 100644 index 407173f7b..000000000 --- a/vendor/plugins/rspec/examples/pure/stack.rb +++ /dev/null @@ -1,36 +0,0 @@ -class StackUnderflowError < RuntimeError -end - -class StackOverflowError < RuntimeError -end - -class Stack - - def initialize - @items = [] - end - - def push object - raise StackOverflowError if @items.length == 10 - @items.push object - end - - def pop - raise StackUnderflowError if @items.empty? - @items.delete @items.last - end - - def peek - raise StackUnderflowError if @items.empty? - @items.last - end - - def empty? - @items.empty? - end - - def full? - @items.length == 10 - end - -end diff --git a/vendor/plugins/rspec/examples/pure/stack_spec.rb b/vendor/plugins/rspec/examples/pure/stack_spec.rb deleted file mode 100644 index 2a769da00..000000000 --- a/vendor/plugins/rspec/examples/pure/stack_spec.rb +++ /dev/null @@ -1,63 +0,0 @@ -require File.dirname(__FILE__) + '/spec_helper' -require File.dirname(__FILE__) + "/stack" -require File.dirname(__FILE__) + '/shared_stack_examples' - -describe Stack, " (empty)" do - before(:each) do - @stack = Stack.new - end - - # NOTE that this one auto-generates the description "should be empty" - it { @stack.should be_empty } - - it_should_behave_like "non-full Stack" - - it "should complain when sent #peek" do - lambda { @stack.peek }.should raise_error(StackUnderflowError) - end - - it "should complain when sent #pop" do - lambda { @stack.pop }.should raise_error(StackUnderflowError) - end -end - -describe Stack, " (with one item)" do - before(:each) do - @stack = Stack.new - @stack.push 3 - @last_item_added = 3 - end - - it_should_behave_like "non-empty Stack" - it_should_behave_like "non-full Stack" - -end - -describe Stack, " (with one item less than capacity)" do - before(:each) do - @stack = Stack.new - (1..9).each { |i| @stack.push i } - @last_item_added = 9 - end - - it_should_behave_like "non-empty Stack" - it_should_behave_like "non-full Stack" -end - -describe Stack, " (full)" do - before(:each) do - @stack = Stack.new - (1..10).each { |i| @stack.push i } - @last_item_added = 10 - end - - # NOTE that this one auto-generates the description "should be full" - it { @stack.should be_full } - - it_should_behave_like "non-empty Stack" - - it "should complain on #push" do - lambda { @stack.push Object.new }.should raise_error(StackOverflowError) - end - -end diff --git a/vendor/plugins/rspec/examples/pure/stack_spec_with_nested_example_groups.rb b/vendor/plugins/rspec/examples/pure/stack_spec_with_nested_example_groups.rb deleted file mode 100644 index 05f6ad464..000000000 --- a/vendor/plugins/rspec/examples/pure/stack_spec_with_nested_example_groups.rb +++ /dev/null @@ -1,67 +0,0 @@ -require File.dirname(__FILE__) + '/spec_helper' -require File.dirname(__FILE__) + '/stack' -require File.dirname(__FILE__) + '/shared_stack_examples' - -describe Stack do - - before(:each) do - @stack = Stack.new - end - - describe "(empty)" do - - it { @stack.should be_empty } - - it_should_behave_like "non-full Stack" - - it "should complain when sent #peek" do - lambda { @stack.peek }.should raise_error(StackUnderflowError) - end - - it "should complain when sent #pop" do - lambda { @stack.pop }.should raise_error(StackUnderflowError) - end - - end - - describe "(with one item)" do - - before(:each) do - @stack.push 3 - @last_item_added = 3 - end - - it_should_behave_like "non-empty Stack" - it_should_behave_like "non-full Stack" - - end - - describe "(with one item less than capacity)" do - - before(:each) do - (1..9).each { |i| @stack.push i } - @last_item_added = 9 - end - - it_should_behave_like "non-empty Stack" - it_should_behave_like "non-full Stack" - end - - describe "(full)" do - - before(:each) do - (1..10).each { |i| @stack.push i } - @last_item_added = 10 - end - - it { @stack.should be_full } - - it_should_behave_like "non-empty Stack" - - it "should complain on #push" do - lambda { @stack.push Object.new }.should raise_error(StackOverflowError) - end - - end - -end diff --git a/vendor/plugins/rspec/examples/pure/stubbing_example.rb b/vendor/plugins/rspec/examples/pure/stubbing_example.rb deleted file mode 100644 index 31354aec6..000000000 --- a/vendor/plugins/rspec/examples/pure/stubbing_example.rb +++ /dev/null @@ -1,69 +0,0 @@ -require File.dirname(__FILE__) + '/spec_helper' - -describe "A consumer of a stub" do - it "should be able to stub methods on any Object" do - obj = Object.new - obj.stub!(:foobar).and_return {:return_value} - obj.foobar.should equal(:return_value) - end -end - -class StubbableClass - def self.find id - return :original_return - end -end - -describe "A stubbed method on a class" do - it "should return the stubbed value" do - StubbableClass.stub!(:find).and_return(:stub_return) - StubbableClass.find(1).should equal(:stub_return) - end - - it "should revert to the original method after each spec" do - StubbableClass.find(1).should equal(:original_return) - end - - it "can stub! and mock the same message" do - StubbableClass.stub!(:msg).and_return(:stub_value) - StubbableClass.should_receive(:msg).with(:arg).and_return(:mock_value) - - StubbableClass.msg.should equal(:stub_value) - StubbableClass.msg(:other_arg).should equal(:stub_value) - StubbableClass.msg(:arg).should equal(:mock_value) - StubbableClass.msg(:another_arg).should equal(:stub_value) - StubbableClass.msg(:yet_another_arg).should equal(:stub_value) - StubbableClass.msg.should equal(:stub_value) - end -end - -describe "A mock" do - it "can stub!" do - mock = mock("stubbing mock") - mock.stub!(:msg).and_return(:value) - (1..10).each {mock.msg.should equal(:value)} - end - - it "can stub! and mock" do - mock = mock("stubbing mock") - mock.stub!(:stub_message).and_return(:stub_value) - mock.should_receive(:mock_message).once.and_return(:mock_value) - (1..10).each {mock.stub_message.should equal(:stub_value)} - mock.mock_message.should equal(:mock_value) - (1..10).each {mock.stub_message.should equal(:stub_value)} - end - - it "can stub! and mock the same message" do - mock = mock("stubbing mock") - mock.stub!(:msg).and_return(:stub_value) - mock.should_receive(:msg).with(:arg).and_return(:mock_value) - mock.msg.should equal(:stub_value) - mock.msg(:other_arg).should equal(:stub_value) - mock.msg(:arg).should equal(:mock_value) - mock.msg(:another_arg).should equal(:stub_value) - mock.msg(:yet_another_arg).should equal(:stub_value) - mock.msg.should equal(:stub_value) - end -end - - diff --git a/vendor/plugins/rspec/examples/stories/adder.rb b/vendor/plugins/rspec/examples/stories/adder.rb deleted file mode 100644 index 0b027b0ff..000000000 --- a/vendor/plugins/rspec/examples/stories/adder.rb +++ /dev/null @@ -1,13 +0,0 @@ -class Adder - def initialize - @addends = [] - end - - def <<(val) - @addends << val - end - - def sum - @addends.inject(0) { |sum_so_far, val| sum_so_far + val } - end -end
\ No newline at end of file diff --git a/vendor/plugins/rspec/examples/stories/addition b/vendor/plugins/rspec/examples/stories/addition deleted file mode 100644 index 58f092990..000000000 --- a/vendor/plugins/rspec/examples/stories/addition +++ /dev/null @@ -1,34 +0,0 @@ -This is a story about a calculator. The text up here above the Story: declaration -won't be processed, so you can write whatever you wish! - -Story: simple addition - - As an accountant - I want to add numbers - So that I can count beans - - Scenario: add one plus one - Given an addend of 1 - And an addend of 1 - - When the addends are addeds - - Then the sum should be 3 - And the corks should be popped - - Scenario: add two plus five - Given an addend of 2 - And an addend of 5 - - When the addends are added - - Then the sum should be 7 - Then it should snow - - Scenario: add three more - GivenScenario add two plus five - And an addend of 3 - - When the addends are added - - Then the sum should be 10 diff --git a/vendor/plugins/rspec/examples/stories/addition.rb b/vendor/plugins/rspec/examples/stories/addition.rb deleted file mode 100644 index e43f5cf39..000000000 --- a/vendor/plugins/rspec/examples/stories/addition.rb +++ /dev/null @@ -1,9 +0,0 @@ -require File.join(File.dirname(__FILE__), "helper") -require File.join(File.dirname(__FILE__), "adder") - -# with_steps_for :addition, :more_addition do -with_steps_for :addition, :more_addition do - # Then("the corks should be popped") { } - run File.expand_path(__FILE__).gsub(".rb","") -end - diff --git a/vendor/plugins/rspec/examples/stories/calculator.rb b/vendor/plugins/rspec/examples/stories/calculator.rb deleted file mode 100644 index d86fc7e5c..000000000 --- a/vendor/plugins/rspec/examples/stories/calculator.rb +++ /dev/null @@ -1,65 +0,0 @@ -$:.push File.join(File.dirname(__FILE__), *%w[.. .. lib]) -require 'spec' - -class AdditionMatchers < Spec::Story::StepGroup - steps do |add| - add.given("an addend of $addend") do |addend| - @adder ||= Adder.new - @adder << addend.to_i - end - end -end - -steps = AdditionMatchers.new do |add| - add.then("the sum should be $sum") do |sum| - @sum.should == sum.to_i - end -end - -steps.when("they are added") do - @sum = @adder.sum -end - -# This Story uses steps (see above) instead of blocks -# passed to Given, When and Then - -Story "addition", %{ - As an accountant - I want to add numbers - So that I can count some beans -}, :steps_for => steps do - Scenario "2 + 3" do - Given "an addend of 2" - And "an addend of 3" - When "they are added" - Then "the sum should be 5" - end - - # This scenario uses GivenScenario, which silently runs - # all the steps in a previous scenario. - - Scenario "add 4 more" do - GivenScenario "2 + 3" - Given "an addend of 4" - When "they are added" - Then "the sum should be 9" - end -end - -# And the class that makes the story pass - -class Adder - def << addend - addends << addend - end - - def sum - @addends.inject(0) do |result, addend| - result + addend.to_i - end - end - - def addends - @addends ||= [] - end -end diff --git a/vendor/plugins/rspec/examples/stories/game-of-life/.loadpath b/vendor/plugins/rspec/examples/stories/game-of-life/.loadpath deleted file mode 100644 index 9a6222015..000000000 --- a/vendor/plugins/rspec/examples/stories/game-of-life/.loadpath +++ /dev/null @@ -1,5 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<loadpath> - <pathentry path="" type="src"/> - <pathentry path="org.rubypeople.rdt.launching.RUBY_CONTAINER" type="con"/> -</loadpath> diff --git a/vendor/plugins/rspec/examples/stories/game-of-life/README.txt b/vendor/plugins/rspec/examples/stories/game-of-life/README.txt deleted file mode 100644 index 9624ad411..000000000 --- a/vendor/plugins/rspec/examples/stories/game-of-life/README.txt +++ /dev/null @@ -1,21 +0,0 @@ -John Conway's Game of Life - -The Rules ---------- -The Game of Life was invented by John Conway (as you might have gathered). -The game is played on a field of cells, each of which has eight neighbors (adjacent cells). -A cell is either occupied (by an organism) or not. -The rules for deriving a generation from the previous one are these: - -Survival --------- -If an occupied cell has 2 or 3 neighbors, the organism survives to the next generation. - -Death ------ -If an occupied cell has 0, 1, 4, 5, 6, 7, or 8 occupied neighbors, the organism dies -(0, 1: of loneliness; 4 thru 8: of overcrowding). - -Birth ------ -If an unoccupied cell has 3 occupied neighbors, it becomes occupied. diff --git a/vendor/plugins/rspec/examples/stories/game-of-life/behaviour/everything.rb b/vendor/plugins/rspec/examples/stories/game-of-life/behaviour/everything.rb deleted file mode 100644 index 90a281da5..000000000 --- a/vendor/plugins/rspec/examples/stories/game-of-life/behaviour/everything.rb +++ /dev/null @@ -1,6 +0,0 @@ -$:.unshift File.join(File.dirname(__FILE__), '..', '..', '..', '..', 'lib') -$:.unshift File.join(File.dirname(__FILE__), '..') - -require 'spec' -require 'behaviour/examples/examples' -require 'behaviour/stories/stories' diff --git a/vendor/plugins/rspec/examples/stories/game-of-life/behaviour/examples/examples.rb b/vendor/plugins/rspec/examples/stories/game-of-life/behaviour/examples/examples.rb deleted file mode 100644 index 1cadfb3c1..000000000 --- a/vendor/plugins/rspec/examples/stories/game-of-life/behaviour/examples/examples.rb +++ /dev/null @@ -1,3 +0,0 @@ -require 'spec' -require 'behaviour/examples/game_behaviour' -require 'behaviour/examples/grid_behaviour' diff --git a/vendor/plugins/rspec/examples/stories/game-of-life/behaviour/examples/game_behaviour.rb b/vendor/plugins/rspec/examples/stories/game-of-life/behaviour/examples/game_behaviour.rb deleted file mode 100644 index ff5b357f0..000000000 --- a/vendor/plugins/rspec/examples/stories/game-of-life/behaviour/examples/game_behaviour.rb +++ /dev/null @@ -1,35 +0,0 @@ -require 'life' - -describe Game do - it 'should have a grid' do - # given - game = Game.new(5, 5) - - # then - game.grid.should be_kind_of(Grid) - end - - it 'should create a cell' do - # given - game = Game.new(2, 2) - expected_grid = Grid.from_string( 'X. ..' ) - - # when - game.create_at(0, 0) - - # then - game.grid.should == expected_grid - end - - it 'should destroy a cell' do - # given - game = Game.new(2,2) - game.grid = Grid.from_string('X. ..') - - # when - game.destroy_at(0,0) - - # then - game.grid.should == Grid.from_string('.. ..') - end -end diff --git a/vendor/plugins/rspec/examples/stories/game-of-life/behaviour/examples/grid_behaviour.rb b/vendor/plugins/rspec/examples/stories/game-of-life/behaviour/examples/grid_behaviour.rb deleted file mode 100644 index 5be3af519..000000000 --- a/vendor/plugins/rspec/examples/stories/game-of-life/behaviour/examples/grid_behaviour.rb +++ /dev/null @@ -1,66 +0,0 @@ -describe Grid do - it 'should be empty when created' do - # given - expected_contents = [ - [0, 0, 0], - [0, 0, 0] - ] - grid = Grid.new(2, 3) - - # when - contents = grid.contents - - # then - contents.should == expected_contents - end - - it 'should compare equal based on its contents' do - # given - grid1 = Grid.new(2, 3) - grid2 = Grid.new(2, 3) - - # then - grid1.should == grid2 - end - - it 'should be able to replace its contents' do - # given - grid = Grid.new(2,2) - new_contents = [[0,1,0], [1,0,1]] - - # when - grid.contents = new_contents - - # then - grid.contents.should == new_contents - grid.rows.should == 2 - grid.columns.should == 3 - end - - it 'should add an organism' do - # given - grid = Grid.new(2, 2) - expected = Grid.new(2, 2) - expected.contents = [[1,0],[0,0]] - - # when - grid.create_at(0,0) - - # then - grid.should == expected - end - - it 'should create itself from a string' do - # given - expected = Grid.new 3, 3 - expected.create_at(0,0) - expected.create_at(1,0) - expected.create_at(2,2) - - # when - actual = Grid.from_string "X.. X.. ..X" - - # then - actual.should == expected - end -end diff --git a/vendor/plugins/rspec/examples/stories/game-of-life/behaviour/stories/CellsWithLessThanTwoNeighboursDie.story b/vendor/plugins/rspec/examples/stories/game-of-life/behaviour/stories/CellsWithLessThanTwoNeighboursDie.story deleted file mode 100644 index 8374e86c5..000000000 --- a/vendor/plugins/rspec/examples/stories/game-of-life/behaviour/stories/CellsWithLessThanTwoNeighboursDie.story +++ /dev/null @@ -1,21 +0,0 @@ -Story: cells with less than two neighbours die
-
-As a game producer
-I want cells with less than two neighbours to die
-So that I can illustrate how the game works to people with money
-
-Scenario: cells with zero or one neighbour die
-
-Given the grid looks like
-........
-.XX.XX..
-.XX.....
-....X...
-........
-When the next step occurs
-Then the grid should look like
-........
-.XX.....
-.XX.....
-........
-........
diff --git a/vendor/plugins/rspec/examples/stories/game-of-life/behaviour/stories/CellsWithMoreThanThreeNeighboursDie.story b/vendor/plugins/rspec/examples/stories/game-of-life/behaviour/stories/CellsWithMoreThanThreeNeighboursDie.story deleted file mode 100644 index 0d30b59be..000000000 --- a/vendor/plugins/rspec/examples/stories/game-of-life/behaviour/stories/CellsWithMoreThanThreeNeighboursDie.story +++ /dev/null @@ -1,21 +0,0 @@ -Story: cells with more than three neighbours die
-
-As a game producer
-I want cells with more than three neighbours to die
-So that I can show the people with money how we are getting on
-
-Scenario: blink
-
-Given the grid looks like
-.....
-...XX
-...XX
-.XX..
-.XX..
-When the next step occurs
-Then the grid should look like
-.....
-...XX
-....X
-.X...
-.XX..
diff --git a/vendor/plugins/rspec/examples/stories/game-of-life/behaviour/stories/EmptySpacesWithThreeNeighboursCreateACell.story b/vendor/plugins/rspec/examples/stories/game-of-life/behaviour/stories/EmptySpacesWithThreeNeighboursCreateACell.story deleted file mode 100644 index cbc248e73..000000000 --- a/vendor/plugins/rspec/examples/stories/game-of-life/behaviour/stories/EmptySpacesWithThreeNeighboursCreateACell.story +++ /dev/null @@ -1,42 +0,0 @@ -Story: Empty spaces with three neighbours create a cell
-
-As a game producer
-I want empty cells with three neighbours to die
-So that I have a minimum feature set to ship
-
-Scenario: the glider
-
-Given the grid looks like
-...X..
-..X...
-..XXX.
-......
-......
-When the next step occurs
-Then the grid should look like
-......
-..X.X.
-..XX..
-...X..
-......
-When the next step occurs
-Then the grid should look like
-......
-..X...
-..X.X.
-..XX..
-......
-When the next step occurs
-Then the grid should look like
-......
-...X..
-.XX...
-..XX..
-......
-When the next step occurs
-Then the grid should look like
-......
-..X...
-.X....
-.XXX..
-......
diff --git a/vendor/plugins/rspec/examples/stories/game-of-life/behaviour/stories/ICanCreateACell.story b/vendor/plugins/rspec/examples/stories/game-of-life/behaviour/stories/ICanCreateACell.story deleted file mode 100644 index 88895cb69..000000000 --- a/vendor/plugins/rspec/examples/stories/game-of-life/behaviour/stories/ICanCreateACell.story +++ /dev/null @@ -1,42 +0,0 @@ -Story: I can create a cell
-
-As a game producer
-I want to create a cell
-So that I can show the grid to people
-
-Scenario: nothing to see here
-
-Given a 3 x 3 game
-Then the grid should look like
-...
-...
-...
-
-Scenario: all on its lonesome
-
-Given a 3 x 3 game
-When I create a cell at 1, 1
-Then the grid should look like
-...
-.X.
-...
-
-Scenario: the grid has three cells
-
-Given a 3 x 3 game
-When I create a cell at 0, 0
-and I create a cell at 0, 1
-and I create a cell at 2, 2
-Then the grid should look like
-XX.
-...
-..X
-
-Scenario: more cells more more
-
-Given the grid has three cells
-When I create a celll at 3, 1
-Then the grid should look like
-XX.
-..X
-..X
diff --git a/vendor/plugins/rspec/examples/stories/game-of-life/behaviour/stories/ICanKillACell.story b/vendor/plugins/rspec/examples/stories/game-of-life/behaviour/stories/ICanKillACell.story deleted file mode 100644 index a9cf1ac64..000000000 --- a/vendor/plugins/rspec/examples/stories/game-of-life/behaviour/stories/ICanKillACell.story +++ /dev/null @@ -1,17 +0,0 @@ -Story: I can kill a cell
-
-As a game producer
-I want to kill a cell
-So that when I make a mistake I dont have to start again
-
-Scenario: bang youre dead
-
-Given the grid looks like
-XX.
-.X.
-..X
-When I destroy the cell at 0, 1
-Then the grid should look like
-X..
-.X.
-..X
diff --git a/vendor/plugins/rspec/examples/stories/game-of-life/behaviour/stories/TheGridWraps.story b/vendor/plugins/rspec/examples/stories/game-of-life/behaviour/stories/TheGridWraps.story deleted file mode 100644 index aeeede77d..000000000 --- a/vendor/plugins/rspec/examples/stories/game-of-life/behaviour/stories/TheGridWraps.story +++ /dev/null @@ -1,53 +0,0 @@ -Story: The grid wraps
-
-As a game player
-I want the grid to wrap
-So that untidy stuff at the edges is avoided
-
-Scenario: crowded in the corners
-
-Given the grid looks like
-X.X
-...
-X.X
-When the next step is taken
-Then the grid should look like
-X.X
-...
-X.X
-
-
-Scenario: the glider returns
-
-Given the glider
-......
-..X...
-.X....
-.XXX..
-......
-When the next step is taken
-and the next step is taken
-and the next step is taken
-and the next step is taken
-Then the grid should look like
-......
-......
-.X....
-X.....
-XXX...
-When the next step is taken
-Then the grid should look like
-.X....
-......
-......
-X.X...
-XX....
-When the next step is taken
-Then the grid should look like
-XX....
-......
-......
-X.....
-X.X...
-
-
diff --git a/vendor/plugins/rspec/examples/stories/game-of-life/behaviour/stories/create_a_cell.rb b/vendor/plugins/rspec/examples/stories/game-of-life/behaviour/stories/create_a_cell.rb deleted file mode 100644 index 81f86baba..000000000 --- a/vendor/plugins/rspec/examples/stories/game-of-life/behaviour/stories/create_a_cell.rb +++ /dev/null @@ -1,52 +0,0 @@ -require File.join(File.dirname(__FILE__), *%w[helper]) - -Story "I can create a cell", - %(As a game producer - I want to create a cell - So that I can show the grid to people), :steps_for => :life do - - Scenario "nothing to see here" do - Given "a game with dimensions", 3, 3 do |rows,cols| - @game = Game.new(rows,cols) - end - - Then "the grid should look like", %( - ... - ... - ... - ) - end - - Scenario "all on its lonesome" do - Given "a game with dimensions", 2, 2 - When "I create a cell at", 1, 1 do |row,col| - @game.create_at(row,col) - end - Then "the grid should look like", %( - .. - .X - ) - end - - Scenario "the grid has three cells" do - Given "a game with dimensions", 3, 3 - When "I create a cell at", 0, 0 - When "I create a cell at", 0, 1 - When "I create a cell at", 2, 2 - Then "the grid should look like", %( - XX. - ... - ..X - ) - end - - Scenario "more cells more more" do - GivenScenario "the grid has three cells" - When "I create a cell at", 2, 0 - Then "the grid should look like", %( - XX. - ... - X.X - ) - end -end diff --git a/vendor/plugins/rspec/examples/stories/game-of-life/behaviour/stories/helper.rb b/vendor/plugins/rspec/examples/stories/game-of-life/behaviour/stories/helper.rb deleted file mode 100644 index 70ed21ec5..000000000 --- a/vendor/plugins/rspec/examples/stories/game-of-life/behaviour/stories/helper.rb +++ /dev/null @@ -1,6 +0,0 @@ -dir = File.dirname(__FILE__) -$LOAD_PATH.unshift(File.expand_path("#{dir}/../../../../../../rspec/lib")) -require 'spec' -$LOAD_PATH.unshift(File.expand_path("#{dir}/../../")) -require "#{dir}/../../life" -require File.join(File.dirname(__FILE__), *%w[steps])
\ No newline at end of file diff --git a/vendor/plugins/rspec/examples/stories/game-of-life/behaviour/stories/kill_a_cell.rb b/vendor/plugins/rspec/examples/stories/game-of-life/behaviour/stories/kill_a_cell.rb deleted file mode 100644 index 7ae2d912d..000000000 --- a/vendor/plugins/rspec/examples/stories/game-of-life/behaviour/stories/kill_a_cell.rb +++ /dev/null @@ -1,26 +0,0 @@ -require File.join(File.dirname(__FILE__), *%w[helper]) - -Story 'I can kill a cell', - %(As a game producer - I want to kill a cell - So that when I make a mistake I don't have to start again), :steps_for => :life do - - Scenario "bang, you're dead" do - - Given 'a game that looks like', %( - XX. - .X. - ..X - ) do |dots| - @game = Game.from_string dots - end - When 'I destroy the cell at', 0, 1 do |row,col| - @game.destroy_at(row,col) - end - Then 'the grid should look like', %( - X.. - .X. - ..X - ) - end -end diff --git a/vendor/plugins/rspec/examples/stories/game-of-life/behaviour/stories/steps.rb b/vendor/plugins/rspec/examples/stories/game-of-life/behaviour/stories/steps.rb deleted file mode 100644 index 793590d70..000000000 --- a/vendor/plugins/rspec/examples/stories/game-of-life/behaviour/stories/steps.rb +++ /dev/null @@ -1,5 +0,0 @@ -steps_for :life do - Then "the grid should look like" do |dots| - @game.grid.should == Grid.from_string(dots) - end -end
\ No newline at end of file diff --git a/vendor/plugins/rspec/examples/stories/game-of-life/behaviour/stories/stories.rb b/vendor/plugins/rspec/examples/stories/game-of-life/behaviour/stories/stories.rb deleted file mode 100644 index e60fe01de..000000000 --- a/vendor/plugins/rspec/examples/stories/game-of-life/behaviour/stories/stories.rb +++ /dev/null @@ -1,3 +0,0 @@ -require File.join(File.dirname(__FILE__), *%w[helper]) -require 'behaviour/stories/create_a_cell' -require 'behaviour/stories/kill_a_cell' diff --git a/vendor/plugins/rspec/examples/stories/game-of-life/behaviour/stories/stories.txt b/vendor/plugins/rspec/examples/stories/game-of-life/behaviour/stories/stories.txt deleted file mode 100644 index d8f809be3..000000000 --- a/vendor/plugins/rspec/examples/stories/game-of-life/behaviour/stories/stories.txt +++ /dev/null @@ -1,22 +0,0 @@ -Story: Show the game field - As a game player - I want to see the field - so that I can observe the progress of the organisms - -Scenario: an empty field - Given a new game starts - When the game displays the field - Then the field should be empty - - - - - -StoryBuilder story = stories.createStory().called("a story") - .asA("person") - .iWant("to do something") - .soThat("I can rule the world"); -story.addScenario().called("happy path").as() - .given("some context") - .when("some event happens") - .then("expect some outcome"); diff --git a/vendor/plugins/rspec/examples/stories/game-of-life/life.rb b/vendor/plugins/rspec/examples/stories/game-of-life/life.rb deleted file mode 100644 index 88263bd00..000000000 --- a/vendor/plugins/rspec/examples/stories/game-of-life/life.rb +++ /dev/null @@ -1,3 +0,0 @@ -$: << File.dirname(__FILE__) -require 'life/game' -require 'life/grid' diff --git a/vendor/plugins/rspec/examples/stories/game-of-life/life/game.rb b/vendor/plugins/rspec/examples/stories/game-of-life/life/game.rb deleted file mode 100644 index 5411b01bf..000000000 --- a/vendor/plugins/rspec/examples/stories/game-of-life/life/game.rb +++ /dev/null @@ -1,23 +0,0 @@ -class Game - attr_accessor :grid - def initialize(rows,cols) - @grid = Grid.new(rows, cols) - end - - def create_at(row,col) - @grid.create_at(row,col) - end - - def destroy_at(row,col) - @grid.destroy_at(row, col) - end - - def self.from_string(dots) - grid = Grid.from_string(dots) - game = new(grid.rows, grid.columns) - game.instance_eval do - @grid = grid - end - return game - end -end diff --git a/vendor/plugins/rspec/examples/stories/game-of-life/life/grid.rb b/vendor/plugins/rspec/examples/stories/game-of-life/life/grid.rb deleted file mode 100644 index aca23087c..000000000 --- a/vendor/plugins/rspec/examples/stories/game-of-life/life/grid.rb +++ /dev/null @@ -1,43 +0,0 @@ -class Grid - - attr_accessor :contents - - def initialize(rows, cols) - @contents = [] - rows.times do @contents << [0] * cols end - end - - def rows - @contents.size - end - - def columns - @contents[0].size - end - - def ==(other) - self.contents == other.contents - end - - def create_at(row,col) - @contents[row][col] = 1 - end - - def destroy_at(row,col) - @contents[row][col] = 0 - end - - def self.from_string(str) - row_strings = str.split(' ') - grid = new(row_strings.size, row_strings[0].size) - - row_strings.each_with_index do |row, row_index| - row_chars = row.split(//) - row_chars.each_with_index do |col_char, col_index| - grid.create_at(row_index, col_index) if col_char == 'X' - end - end - return grid - end - -end diff --git a/vendor/plugins/rspec/examples/stories/helper.rb b/vendor/plugins/rspec/examples/stories/helper.rb deleted file mode 100644 index 2e825b278..000000000 --- a/vendor/plugins/rspec/examples/stories/helper.rb +++ /dev/null @@ -1,9 +0,0 @@ -$:.unshift File.join(File.dirname(__FILE__), '..', '..', 'lib') -require 'spec/story' - -# won't have to do this once plain_text_story_runner is moved into the library -# require File.join(File.dirname(__FILE__), "plain_text_story_runner") - -Dir[File.join(File.dirname(__FILE__), "steps/*.rb")].each do |file| - require file -end
\ No newline at end of file diff --git a/vendor/plugins/rspec/examples/stories/steps/addition_steps.rb b/vendor/plugins/rspec/examples/stories/steps/addition_steps.rb deleted file mode 100644 index 3f27095a9..000000000 --- a/vendor/plugins/rspec/examples/stories/steps/addition_steps.rb +++ /dev/null @@ -1,18 +0,0 @@ -require File.expand_path("#{File.dirname(__FILE__)}/../helper") - -# This creates steps for :addition -steps_for(:addition) do - Given("an addend of $addend") do |addend| - @adder ||= Adder.new - @adder << addend.to_i - end -end - -# This appends to them -steps_for(:addition) do - When("the addends are added") { @sum = @adder.sum } -end - -steps_for(:more_addition) do - Then("the sum should be $sum") { |sum| @sum.should == sum.to_i } -end diff --git a/vendor/plugins/rspec/failing_examples/README.txt b/vendor/plugins/rspec/failing_examples/README.txt deleted file mode 100644 index 38c667d92..000000000 --- a/vendor/plugins/rspec/failing_examples/README.txt +++ /dev/null @@ -1,7 +0,0 @@ -"Why have failing examples?", you might ask. - -They allow us to see failure messages. RSpec wants to provide meaningful and helpful failure messages. The failures in this directory not only provide you a way of seeing the failure messages, but they provide RSpec's own specs a way of describing what they should look like and ensuring they stay correct. - -To see the types of messages you can expect, stand in this directory and run: - -../bin/spec ./*.rb
\ No newline at end of file diff --git a/vendor/plugins/rspec/failing_examples/diffing_spec.rb b/vendor/plugins/rspec/failing_examples/diffing_spec.rb deleted file mode 100644 index 85e13e8c0..000000000 --- a/vendor/plugins/rspec/failing_examples/diffing_spec.rb +++ /dev/null @@ -1,36 +0,0 @@ -describe "Running specs with --diff" do - it "should print diff of different strings" do - uk = <<-EOF -RSpec is a -behaviour driven development -framework for Ruby -EOF - usa = <<-EOF -RSpec is a -behavior driven development -framework for Ruby -EOF - usa.should == uk - end - - class Animal - def initialize(name,species) - @name,@species = name,species - end - - def inspect - <<-EOA -<Animal -name=#{@name}, -species=#{@species} -> - EOA - end - end - - it "should print diff of different objects' pretty representation" do - expected = Animal.new "bob", "giraffe" - actual = Animal.new "bob", "tortoise" - expected.should eql(actual) - end -end diff --git a/vendor/plugins/rspec/failing_examples/failing_autogenerated_docstrings_example.rb b/vendor/plugins/rspec/failing_examples/failing_autogenerated_docstrings_example.rb deleted file mode 100644 index 8a7d2490e..000000000 --- a/vendor/plugins/rspec/failing_examples/failing_autogenerated_docstrings_example.rb +++ /dev/null @@ -1,19 +0,0 @@ -require File.dirname(__FILE__) + '/spec_helper' - -# Run spec w/ -fs to see the output of this file - -describe "Failing examples with no descriptions" do - - # description is auto-generated as "should equal(5)" based on the last #should - it do - 3.should equal(2) - 5.should equal(5) - end - - it { 3.should be > 5 } - - it { ["a"].should include("b") } - - it { [1,2,3].should_not respond_to(:size) } - -end diff --git a/vendor/plugins/rspec/failing_examples/failure_in_setup.rb b/vendor/plugins/rspec/failing_examples/failure_in_setup.rb deleted file mode 100644 index 2a807a99a..000000000 --- a/vendor/plugins/rspec/failing_examples/failure_in_setup.rb +++ /dev/null @@ -1,10 +0,0 @@ -describe "This example" do - - before(:each) do - NonExistentClass.new - end - - it "should be listed as failing in setup" do - end - -end diff --git a/vendor/plugins/rspec/failing_examples/failure_in_teardown.rb b/vendor/plugins/rspec/failing_examples/failure_in_teardown.rb deleted file mode 100644 index 6458ea2b8..000000000 --- a/vendor/plugins/rspec/failing_examples/failure_in_teardown.rb +++ /dev/null @@ -1,10 +0,0 @@ -describe "This example" do - - it "should be listed as failing in teardown" do - end - - after(:each) do - NonExistentClass.new - end - -end diff --git a/vendor/plugins/rspec/failing_examples/mocking_example.rb b/vendor/plugins/rspec/failing_examples/mocking_example.rb deleted file mode 100644 index caf2db036..000000000 --- a/vendor/plugins/rspec/failing_examples/mocking_example.rb +++ /dev/null @@ -1,40 +0,0 @@ -require File.dirname(__FILE__) + '/spec_helper' - -describe "Mocker" do - - it "should be able to call mock()" do - mock = mock("poke me") - mock.should_receive(:poke) - mock.poke - end - - it "should fail when expected message not received" do - mock = mock("poke me") - mock.should_receive(:poke) - end - - it "should fail when messages are received out of order" do - mock = mock("one two three") - mock.should_receive(:one).ordered - mock.should_receive(:two).ordered - mock.should_receive(:three).ordered - mock.one - mock.three - mock.two - end - - it "should get yelled at when sending unexpected messages" do - mock = mock("don't talk to me") - mock.should_not_receive(:any_message_at_all) - mock.any_message_at_all - end - - it "has a bug we need to fix" do - pending "here is the bug" do - # Actually, no. It's fixed. This will fail because it passes :-) - mock = mock("Bug") - mock.should_receive(:hello) - mock.hello - end - end -end diff --git a/vendor/plugins/rspec/failing_examples/mocking_with_flexmock.rb b/vendor/plugins/rspec/failing_examples/mocking_with_flexmock.rb deleted file mode 100644 index 6e79ece0e..000000000 --- a/vendor/plugins/rspec/failing_examples/mocking_with_flexmock.rb +++ /dev/null @@ -1,26 +0,0 @@ -# stub frameworks like to gum up Object, so this is deliberately -# set NOT to run so that you don't accidentally run it when you -# run this dir. - -# To run it, stand in this directory and say: -# -# RUN_FLEXMOCK_EXAMPLE=true ruby ../bin/spec mocking_with_flexmock.rb - -if ENV['RUN_FLEXMOCK_EXAMPLE'] - Spec::Runner.configure do |config| - config.mock_with :flexmock - end - - describe "Flexmocks" do - it "should fail when the expected message is received with wrong arguments" do - m = flexmock("now flex!") - m.should_receive(:msg).with("arg").once - m.msg("other arg") - end - - it "should fail when the expected message is not received at all" do - m = flexmock("now flex!") - m.should_receive(:msg).with("arg").once - end - end -end diff --git a/vendor/plugins/rspec/failing_examples/mocking_with_mocha.rb b/vendor/plugins/rspec/failing_examples/mocking_with_mocha.rb deleted file mode 100644 index f14a1a3e5..000000000 --- a/vendor/plugins/rspec/failing_examples/mocking_with_mocha.rb +++ /dev/null @@ -1,25 +0,0 @@ -# stub frameworks like to gum up Object, so this is deliberately -# set NOT to run so that you don't accidentally run it when you -# run this dir. - -# To run it, stand in this directory and say: -# -# RUN_MOCHA_EXAMPLE=true ruby ../bin/spec mocking_with_mocha.rb - -if ENV['RUN_MOCHA_EXAMPLE'] - Spec::Runner.configure do |config| - config.mock_with :mocha - end - describe "Mocha framework" do - it "should should be made available by saying config.mock_with :mocha" do - m = mock() - m.expects(:msg).with("arg") - m.msg - end - it "should should be made available by saying config.mock_with :mocha" do - o = Object.new - o.expects(:msg).with("arg") - o.msg - end - end -end diff --git a/vendor/plugins/rspec/failing_examples/mocking_with_rr.rb b/vendor/plugins/rspec/failing_examples/mocking_with_rr.rb deleted file mode 100644 index 0d2b4fe04..000000000 --- a/vendor/plugins/rspec/failing_examples/mocking_with_rr.rb +++ /dev/null @@ -1,27 +0,0 @@ -# stub frameworks like to gum up Object, so this is deliberately -# set NOT to run so that you don't accidentally run it when you -# run this dir. - -# To run it, stand in this directory and say: -# -# RUN_RR_EXAMPLE=true ruby ../bin/spec mocking_with_rr.rb - -if ENV['RUN_RR_EXAMPLE'] - Spec::Runner.configure do |config| - config.mock_with :rr - end - describe "RR framework" do - it "should should be made available by saying config.mock_with :rr" do - o = Object.new - mock(o).msg("arg") - o.msg - end - it "should should be made available by saying config.mock_with :rr" do - o = Object.new - mock(o) do |m| - m.msg("arg") - end - o.msg - end - end -end diff --git a/vendor/plugins/rspec/failing_examples/partial_mock_example.rb b/vendor/plugins/rspec/failing_examples/partial_mock_example.rb deleted file mode 100644 index 6d0554055..000000000 --- a/vendor/plugins/rspec/failing_examples/partial_mock_example.rb +++ /dev/null @@ -1,20 +0,0 @@ -require File.dirname(__FILE__) + '/spec_helper' - -class MockableClass - def self.find id - return :original_return - end -end - -describe "A partial mock" do - - it "should work at the class level (but fail here due to the type mismatch)" do - MockableClass.should_receive(:find).with(1).and_return {:stub_return} - MockableClass.find("1").should equal(:stub_return) - end - - it "should revert to the original after each spec" do - MockableClass.find(1).should equal(:original_return) - end - -end diff --git a/vendor/plugins/rspec/failing_examples/predicate_example.rb b/vendor/plugins/rspec/failing_examples/predicate_example.rb deleted file mode 100644 index 53b6367e2..000000000 --- a/vendor/plugins/rspec/failing_examples/predicate_example.rb +++ /dev/null @@ -1,29 +0,0 @@ -require File.dirname(__FILE__) + '/spec_helper' - -class BddFramework - def intuitive? - true - end - - def adopted_quickly? - #this will cause failures because it reallly SHOULD be adopted quickly - false - end -end - -describe "BDD framework" do - - before(:each) do - @bdd_framework = BddFramework.new - end - - it "should be adopted quickly" do - #this will fail because it reallly SHOULD be adopted quickly - @bdd_framework.should be_adopted_quickly - end - - it "should be intuitive" do - @bdd_framework.should be_intuitive - end - -end diff --git a/vendor/plugins/rspec/failing_examples/raising_example.rb b/vendor/plugins/rspec/failing_examples/raising_example.rb deleted file mode 100644 index e40b51ec8..000000000 --- a/vendor/plugins/rspec/failing_examples/raising_example.rb +++ /dev/null @@ -1,47 +0,0 @@ -describe "This example" do - - it "should show that a NoMethodError is raised but an Exception was expected" do - proc { ''.nonexistent_method }.should raise_error - end - - it "should pass" do - proc { ''.nonexistent_method }.should raise_error(NoMethodError) - end - - it "should show that a NoMethodError is raised but a SyntaxError was expected" do - proc { ''.nonexistent_method }.should raise_error(SyntaxError) - end - - it "should show that nothing is raised when SyntaxError was expected" do - proc { }.should raise_error(SyntaxError) - end - - it "should show that a NoMethodError is raised but a Exception was expected" do - proc { ''.nonexistent_method }.should_not raise_error - end - - it "should show that a NoMethodError is raised" do - proc { ''.nonexistent_method }.should_not raise_error(NoMethodError) - end - - it "should also pass" do - proc { ''.nonexistent_method }.should_not raise_error(SyntaxError) - end - - it "should show that a NoMethodError is raised when nothing expected" do - proc { ''.nonexistent_method }.should_not raise_error(Exception) - end - - it "should show that the wrong message was received" do - proc { raise StandardError.new("what is an enterprise?") }.should raise_error(StandardError, "not this") - end - - it "should show that the unexpected error/message was thrown" do - proc { raise StandardError.new("abc") }.should_not raise_error(StandardError, "abc") - end - - it "should pass too" do - proc { raise StandardError.new("abc") }.should_not raise_error(StandardError, "xyz") - end - -end diff --git a/vendor/plugins/rspec/failing_examples/spec_helper.rb b/vendor/plugins/rspec/failing_examples/spec_helper.rb deleted file mode 100644 index f8d657554..000000000 --- a/vendor/plugins/rspec/failing_examples/spec_helper.rb +++ /dev/null @@ -1,3 +0,0 @@ -lib_path = File.expand_path("#{File.dirname(__FILE__)}/../lib") -$LOAD_PATH.unshift lib_path unless $LOAD_PATH.include?(lib_path) -require "spec" diff --git a/vendor/plugins/rspec/failing_examples/syntax_error_example.rb b/vendor/plugins/rspec/failing_examples/syntax_error_example.rb deleted file mode 100644 index c9bb90774..000000000 --- a/vendor/plugins/rspec/failing_examples/syntax_error_example.rb +++ /dev/null @@ -1,7 +0,0 @@ -describe "when passing a block to a matcher" do - it "you should use {} instead of do/end" do - Object.new.should satisfy do - "this block is being passed to #should instead of #satisfy - use {} instead" - end - end -end diff --git a/vendor/plugins/rspec/failing_examples/team_spec.rb b/vendor/plugins/rspec/failing_examples/team_spec.rb deleted file mode 100644 index 41a44e551..000000000 --- a/vendor/plugins/rspec/failing_examples/team_spec.rb +++ /dev/null @@ -1,44 +0,0 @@ -require File.dirname(__FILE__) + '/spec_helper' - - -class Team - attr_reader :players - def initialize - @players = Players.new - end -end - -class Players - def initialize - @players = [] - end - def size - @players.size - end - def include? player - raise "player must be a string" unless player.is_a?(String) - @players.include? player - end -end - -describe "A new team" do - - before(:each) do - @team = Team.new - end - - it "should have 3 players (failing example)" do - @team.should have(3).players - end - - it "should include some player (failing example)" do - @team.players.should include("Some Player") - end - - it "should include 5 (failing example)" do - @team.players.should include(5) - end - - it "should have no players" - -end diff --git a/vendor/plugins/rspec/failing_examples/timeout_behaviour.rb b/vendor/plugins/rspec/failing_examples/timeout_behaviour.rb deleted file mode 100644 index 18221365f..000000000 --- a/vendor/plugins/rspec/failing_examples/timeout_behaviour.rb +++ /dev/null @@ -1,7 +0,0 @@ -require File.dirname(__FILE__) + '/spec_helper' - -describe "Something really slow" do - it "should be failed by RSpec when it takes longer than --timeout" do - sleep(2) - end -end diff --git a/vendor/plugins/rspec/lib/autotest/discover.rb b/vendor/plugins/rspec/lib/autotest/discover.rb index 81914c3b7..3ac51c135 100644 --- a/vendor/plugins/rspec/lib/autotest/discover.rb +++ b/vendor/plugins/rspec/lib/autotest/discover.rb @@ -1,3 +1,3 @@ Autotest.add_discovery do - "rspec" if File.exist?('spec') + "rspec" if File.directory?('spec') && ENV['RSPEC'] end diff --git a/vendor/plugins/rspec/lib/autotest/rspec.rb b/vendor/plugins/rspec/lib/autotest/rspec.rb index 164f298f5..625e340b5 100644 --- a/vendor/plugins/rspec/lib/autotest/rspec.rb +++ b/vendor/plugins/rspec/lib/autotest/rspec.rb @@ -4,13 +4,13 @@ Autotest.add_hook :initialize do |at| at.clear_mappings # watch out: Ruby bug (1.8.6): # %r(/) != /\// - at.add_mapping(%r%^spec/.*\.rb$%) { |filename, _| - filename + at.add_mapping(%r%^spec/.*_spec.rb$%) { |filename, _| + filename } - at.add_mapping(%r%^lib/(.*)\.rb$%) { |_, m| + at.add_mapping(%r%^lib/(.*)\.rb$%) { |_, m| ["spec/#{m[1]}_spec.rb"] } - at.add_mapping(%r%^spec/(spec_helper|shared/.*)\.rb$%) { + at.add_mapping(%r%^spec/(spec_helper|shared/.*)\.rb$%) { at.files_matching %r%^spec/.*_spec\.rb$% } end @@ -21,14 +21,14 @@ class Autotest::Rspec < Autotest def initialize super - self.failed_results_re = /^\d+\)\n(?:\e\[\d*m)?(?:.*?Error in )?'([^\n]*)'(?: FAILED)?(?:\e\[\d*m)?\n(.*?)\n\n/m + self.failed_results_re = /^\d+\)\n(?:\e\[\d*m)?(?:.*?in )?'([^\n]*)'(?: FAILED)?(?:\e\[\d*m)?\n\n?(.*?(\n\n\(.*?)?)\n\n/m self.completed_re = /\n(?:\e\[\d*m)?\d* examples?/m end - + def consolidate_failures(failed) filters = new_hash_of_arrays failed.each do |spec, trace| - if trace =~ /\n(\.\/)?(.*\.rb):[\d]+:\Z?/ + if trace =~ /\n(\.\/)?(.*spec\.rb):[\d]+:/ filters[$2] << spec end end @@ -36,37 +36,12 @@ class Autotest::Rspec < Autotest end def make_test_cmd(files_to_test) - return "#{ruby} -S #{spec_command} #{add_options_if_present} #{files_to_test.keys.flatten.join(' ')}" + return '' if files_to_test.empty? + spec_program = File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'bin', 'spec')) + return "#{ruby} #{spec_program} --autospec #{files_to_test.keys.flatten.join(' ')} #{add_options_if_present}" end - + def add_options_if_present # :nodoc: File.exist?("spec/spec.opts") ? "-O spec/spec.opts " : "" end - - # Finds the proper spec command to use. Precendence is set in the - # lazily-evaluated method spec_commands. Alias + Override that in - # ~/.autotest to provide a different spec command then the default - # paths provided. - def spec_command(separator=File::ALT_SEPARATOR) - unless defined? @spec_command then - @spec_command = spec_commands.find { |cmd| File.exists? cmd } - - raise RspecCommandError, "No spec command could be found!" unless @spec_command - - @spec_command.gsub! File::SEPARATOR, separator if separator - end - @spec_command - end - - # Autotest will look for spec commands in the following - # locations, in this order: - # - # * bin/spec - # * default spec bin/loader installed in Rubygems - def spec_commands - [ - File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'bin', 'spec')), - File.join(Config::CONFIG['bindir'], 'spec') - ] - end end diff --git a/vendor/plugins/rspec/lib/spec.rb b/vendor/plugins/rspec/lib/spec.rb index c143aa885..879c373e8 100644 --- a/vendor/plugins/rspec/lib/spec.rb +++ b/vendor/plugins/rspec/lib/spec.rb @@ -1,30 +1,8 @@ -require 'spec/version' +require 'spec/deprecation' +require 'spec/ruby' require 'spec/matchers' require 'spec/expectations' require 'spec/example' -require 'spec/extensions' require 'spec/runner' - -if Object.const_defined?(:Test); \ - require 'spec/interop/test'; \ -end - -module Spec - class << self - def run? - @run || rspec_options.examples_run? - end - - def run; \ - return true if run?; \ - result = rspec_options.run_examples; \ - @run = true; \ - result; \ - end - attr_writer :run - - def exit?; \ - !Object.const_defined?(:Test) || Test::Unit.run?; \ - end - end -end
\ No newline at end of file +require 'spec/version' +require 'spec/dsl' diff --git a/vendor/plugins/rspec/lib/spec/example.rb b/vendor/plugins/rspec/lib/spec/example.rb index 16ce12261..afbf41286 100644 --- a/vendor/plugins/rspec/lib/spec/example.rb +++ b/vendor/plugins/rspec/lib/spec/example.rb @@ -1,12 +1,164 @@ +module Spec + # == Example Groups and Code Examples + # + # A Code Example is an executable example of how a bit of code is expected + # to behave. + # + # An Example Group is a group of code examples. + # + # RSpec exposes a DSL to describe groups of examples. + # + # describe Account do + # it "should have a balance of $0" do + # account = Account.new + # account.balance.should == Money.new(0, :dollars) + # end + # end + # + # == Before and After + # + # You can use the <tt>before()</tt> and <tt>after()</tt> methods to extract + # common code within an Example Group. Both methods take an optional scope + # argument so you can run the block before :each example or before :all + # examples + # + # describe "..." do + # before :all do + # ... + # end + # + # before :each do + # ... + # end + # + # it "should do something" do + # ... + # end + # + # it "should do something else" do + # ... + # end + # + # after :each do + # ... + # end + # + # after :all do + # ... + # end + # + # end + # + # The <tt>before :each</tt> block will run before each of the examples, once + # for each example. Likewise, the <tt>after :each</tt> block will run after + # each of the examples. + # + # It is also possible to specify a <tt>before :all</tt> and <tt>after + # :all</tt> block that will run only once for each example group, before the + # first <code>before :each</code> and after the last <code>after + # :each</code> respectively. The use of these is generally discouraged, + # because it introduces dependencies between the examples. Still, it might + # prove useful for very expensive operations if you know what you are doing. + # + # == Local helper methods + # + # You can include local helper methods by simply expressing them within an + # example group: + # + # describe "..." do + # + # it "..." do + # helper_method + # end + # + # def helper_method + # ... + # end + # + # end + # + # == Included helper methods + # + # You can include helper methods in multiple example groups by expressing + # them within a module, and then including that module in your example + # groups: + # + # module AccountExampleHelperMethods + # def helper_method + # ... + # end + # end + # + # describe "A new account" do + # include AccountExampleHelperMethods + # before do + # @account = Account.new + # end + # + # it "should have a balance of $0" do + # helper_method + # @account.balance.should eql(Money.new(0, :dollars)) + # end + # end + # + # == Shared Example Groups + # + # You can define a shared example group, that may be used on other groups + # + # share_examples_for "All Editions" do + # it "all editions behaviour" ... + # end + # + # describe SmallEdition do + # it_should_behave_like "All Editions" + # + # it "should do small edition stuff" do + # ... + # end + # end + # + # You can also assign the shared group to a module and include that + # + # share_as :AllEditions do + # it "should do all editions stuff" ... + # end + # + # describe SmallEdition do + # it_should_behave_like AllEditions + # + # it "should do small edition stuff" do + # ... + # end + # end + # + # And, for those of you who prefer to use something more like Ruby, you can + # just include the module directly + # + # describe SmallEdition do + # include AllEditions + # + # it "should do small edition stuff" do + # ... + # end + # end + module Example + end +end + require 'timeout' +require 'spec/example/args_and_options' +require 'spec/example/predicate_matchers' +require 'spec/example/example_group_proxy' +require 'spec/example/example_proxy' +require 'spec/example/subject' +require 'spec/example/before_and_after_hooks' require 'spec/example/pending' require 'spec/example/module_reopening_fix' -require 'spec/example/module_inclusion_warnings' +require 'spec/example/example_group_hierarchy' require 'spec/example/example_group_methods' require 'spec/example/example_methods' require 'spec/example/example_group' require 'spec/example/shared_example_group' require 'spec/example/example_group_factory' require 'spec/example/errors' -require 'spec/example/configuration' require 'spec/example/example_matcher' diff --git a/vendor/plugins/rspec/lib/spec/example/configuration.rb b/vendor/plugins/rspec/lib/spec/example/configuration.rb deleted file mode 100644 index cd3f46909..000000000 --- a/vendor/plugins/rspec/lib/spec/example/configuration.rb +++ /dev/null @@ -1,158 +0,0 @@ -module Spec - module Example - class Configuration - # Chooses what mock framework to use. Example: - # - # Spec::Runner.configure do |config| - # config.mock_with :rspec, :mocha, :flexmock, or :rr - # end - # - # To use any other mock framework, you'll have to provide your own - # adapter. This is simply a module that responds to the following - # methods: - # - # setup_mocks_for_rspec - # verify_mocks_for_rspec - # teardown_mocks_for_rspec. - # - # These are your hooks into the lifecycle of a given example. RSpec will - # call setup_mocks_for_rspec before running anything else in each - # Example. After executing the #after methods, RSpec will then call - # verify_mocks_for_rspec and teardown_mocks_for_rspec (this is - # guaranteed to run even if there are failures in - # verify_mocks_for_rspec). - # - # Once you've defined this module, you can pass that to mock_with: - # - # Spec::Runner.configure do |config| - # config.mock_with MyMockFrameworkAdapter - # end - # - def mock_with(mock_framework) - @mock_framework = case mock_framework - when Symbol - mock_framework_path(mock_framework.to_s) - else - mock_framework - end - end - - def mock_framework # :nodoc: - @mock_framework ||= mock_framework_path("rspec") - end - - # :call-seq: - # include(Some::Helpers) - # include(Some::Helpers, More::Helpers) - # include(My::Helpers, :type => :key) - # - # Declares modules to be included in multiple example groups - # (<tt>describe</tt> blocks). With no :type, the modules listed will be - # included in all example groups. Use :type to restrict the inclusion to - # a subset of example groups. The value assigned to :type should be a - # key that maps to a class that is either a subclass of - # Spec::Example::ExampleGroup or extends Spec::Example::ExampleGroupMethods - # and includes Spec::Example::ExampleMethods - # - # config.include(My::Pony, My::Horse, :type => :farm) - # - # Only example groups that have that type will get the modules included: - # - # describe "Downtown", :type => :city do - # # Will *not* get My::Pony and My::Horse included - # end - # - # describe "Old Mac Donald", :type => :farm do - # # *Will* get My::Pony and My::Horse included - # end - # - def include(*args) - args << {} unless Hash === args.last - modules, options = args_and_options(*args) - required_example_group = get_type_from_options(options) - required_example_group = required_example_group.to_sym if required_example_group - modules.each do |mod| - ExampleGroupFactory.get(required_example_group).send(:include, mod) - end - end - - # Defines global predicate matchers. Example: - # - # config.predicate_matchers[:swim] = :can_swim? - # - # This makes it possible to say: - # - # person.should swim # passes if person.can_swim? returns true - # - def predicate_matchers - @predicate_matchers ||= {} - end - - # Prepends a global <tt>before</tt> block to all example groups. - # See #append_before for filtering semantics. - def prepend_before(*args, &proc) - scope, options = scope_and_options(*args) - example_group = ExampleGroupFactory.get( - get_type_from_options(options) - ) - example_group.prepend_before(scope, &proc) - end - - # Appends a global <tt>before</tt> block to all example groups. - # - # If you want to restrict the block to a subset of all the example - # groups then specify this in a Hash as the last argument: - # - # config.prepend_before(:all, :type => :farm) - # - # or - # - # config.prepend_before(:type => :farm) - # - def append_before(*args, &proc) - scope, options = scope_and_options(*args) - example_group = ExampleGroupFactory.get( - get_type_from_options(options) - ) - example_group.append_before(scope, &proc) - end - alias_method :before, :append_before - - # Prepends a global <tt>after</tt> block to all example groups. - # See #append_before for filtering semantics. - def prepend_after(*args, &proc) - scope, options = scope_and_options(*args) - example_group = ExampleGroupFactory.get( - get_type_from_options(options) - ) - example_group.prepend_after(scope, &proc) - end - alias_method :after, :prepend_after - - # Appends a global <tt>after</tt> block to all example groups. - # See #append_before for filtering semantics. - def append_after(*args, &proc) - scope, options = scope_and_options(*args) - example_group = ExampleGroupFactory.get( - get_type_from_options(options) - ) - example_group.append_after(scope, &proc) - end - - private - - def scope_and_options(*args) - args, options = args_and_options(*args) - scope = (args[0] || :each), options - end - - def get_type_from_options(options) - options[:type] || options[:behaviour_type] - end - - def mock_framework_path(framework_name) - File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "..", "plugins", "mock_frameworks", framework_name)) - end - end - end -end diff --git a/vendor/plugins/rspec/lib/spec/example/errors.rb b/vendor/plugins/rspec/lib/spec/example/errors.rb index c6cb22453..157b669b0 100644 --- a/vendor/plugins/rspec/lib/spec/example/errors.rb +++ b/vendor/plugins/rspec/lib/spec/example/errors.rb @@ -1,9 +1,25 @@ module Spec module Example - class ExamplePendingError < StandardError + class ExamplePendingError < StandardError; end + + class NotYetImplementedError < ExamplePendingError + MESSAGE = "Not Yet Implemented" + def initialize + super(MESSAGE) + end end - class PendingExampleFixedError < StandardError + class PendingExampleFixedError < StandardError; end + + class NoDescriptionError < ArgumentError + class << self + def message(kind, location) + "No description supplied for #{kind} declared on #{location}" + end + end + def initialize(kind, location) + super(self.class.message(kind, location)) + end end end end diff --git a/vendor/plugins/rspec/lib/spec/example/example_group.rb b/vendor/plugins/rspec/lib/spec/example/example_group.rb index 35997f0c4..983be9a24 100644 --- a/vendor/plugins/rspec/lib/spec/example/example_group.rb +++ b/vendor/plugins/rspec/lib/spec/example/example_group.rb @@ -5,13 +5,6 @@ module Spec class ExampleGroup extend Spec::Example::ExampleGroupMethods include Spec::Example::ExampleMethods - - def initialize(defined_description, &implementation) - @_defined_description = defined_description - @_implementation = implementation - end end end end - -Spec::ExampleGroup = Spec::Example::ExampleGroup diff --git a/vendor/plugins/rspec/lib/spec/example/example_group_factory.rb b/vendor/plugins/rspec/lib/spec/example/example_group_factory.rb index c5caf4c9c..1d662782a 100644 --- a/vendor/plugins/rspec/lib/spec/example/example_group_factory.rb +++ b/vendor/plugins/rspec/lib/spec/example/example_group_factory.rb @@ -1,12 +1,36 @@ module Spec module Example + class ExampleGroupFactory - class << self + module ClassMethods + include Spec::Example::ArgsAndOptions + def reset @example_group_types = nil default(ExampleGroup) end + def example_group_creation_listeners + @example_group_creation_listeners ||= [] + end + + def register_example_group(klass) + example_group_creation_listeners.each do |listener| + listener.register_example_group(klass) + end + end + + def create_shared_example_group(*args, &example_group_block) # :nodoc: + ::Spec::Example::SharedExampleGroup.register(*args, &example_group_block) + end + + def create_example_group(*args, &block) + raise ArgumentError if args.empty? || block.nil? + add_options(args) + superclass = determine_superclass(args.last) + superclass.describe(*args, &block) + end + # Registers an example group class +klass+ with the symbol +type+. For # example: # @@ -22,42 +46,36 @@ module Spec # implicitly use an instance of FarmExampleGroup for any file loaded # from the <tt>./spec/farm</tt> directory. def register(key, example_group_class) - @example_group_types[key] = example_group_class + @example_group_types[key.to_sym] = example_group_class end - + # Sets the default ExampleGroup class def default(example_group_class) + Spec.__send__ :remove_const, :ExampleGroup if Spec.const_defined?(:ExampleGroup) + Spec.const_set(:ExampleGroup, example_group_class) old = @example_group_types @example_group_types = Hash.new(example_group_class) @example_group_types.merge!(old) if old end - def get(key=nil) - if @example_group_types.values.include?(key) - key - else - @example_group_types[key] - end - end - - def create_example_group(*args, &block) - opts = Hash === args.last ? args.last : {} - superclass = determine_superclass(opts) - superclass.describe(*args, &block) + def [](key) + @example_group_types[key] end - protected + protected def determine_superclass(opts) - key = if opts[:type] - opts[:type] - elsif opts[:spec_path] =~ /spec(\\|\/)(#{@example_group_types.keys.join('|')})/ - $2 == '' ? nil : $2.to_sym + if type = opts[:type] + self[type] + elsif opts[:location] =~ /spec(\\|\/)(#{@example_group_types.keys.sort_by{|k| k.to_s.length}.reverse.join('|')})/ + self[$2 == '' ? nil : $2.to_sym] + else + self[nil] end - get(key) end end + extend ClassMethods self.reset end end diff --git a/vendor/plugins/rspec/lib/spec/example/example_group_methods.rb b/vendor/plugins/rspec/lib/spec/example/example_group_methods.rb index 64e90cdb2..3862fdef6 100644 --- a/vendor/plugins/rspec/lib/spec/example/example_group_methods.rb +++ b/vendor/plugins/rspec/lib/spec/example/example_group_methods.rb @@ -3,22 +3,33 @@ module Spec module ExampleGroupMethods class << self - def description_text(*args) - args.inject("") do |result, arg| - result << " " unless (result == "" || arg.to_s =~ /^(\s|\.|#)/) - result << arg.to_s + attr_accessor :matcher_class + + def build_description_from(*args) + text = args.inject("") do |description, arg| + description << " " unless (description == "" || arg.to_s =~ /^(\s|\.|#)/) + description << arg.to_s end + text == "" ? nil : text end end - attr_reader :description_text, :description_args, :description_options, :spec_path, :registration_binding_block + include Spec::Example::BeforeAndAfterHooks + include Spec::Example::Subject::ExampleGroupMethods + include Spec::Example::PredicateMatchers + include Spec::Example::ArgsAndOptions + + attr_reader :location + + def options # :nodoc: + @options ||= {} + end - def inherited(klass) + def inherited(klass) # :nodoc: super - klass.register {} - Spec::Runner.register_at_exit_hook + ExampleGroupFactory.register_example_group(klass) end - + # Makes the describe/it syntax available from a class. For example: # # class StackSpec < Spec::ExampleGroup @@ -34,390 +45,214 @@ module Spec # end # def describe(*args, &example_group_block) - args << {} unless Hash === args.last + raise Spec::Example::NoDescriptionError.new("example group", caller(0)[1]) if args.empty? if example_group_block - params = args.last - params[:spec_path] = eval("caller(0)[1]", example_group_block) unless params[:spec_path] - if params[:shared] - SharedExampleGroup.new(*args, &example_group_block) + options = add_options(args) + set_location(options, caller(0)[1]) + if options[:shared] + ExampleGroupFactory.create_shared_example_group(*args, &example_group_block) else - self.subclass("Subclass") do - describe(*args) - module_eval(&example_group_block) - end + subclass(*args, &example_group_block) end else set_description(*args) - before_eval - self end end alias :context :describe # Use this to pull in examples from shared example groups. - # See Spec::Runner for information about shared example groups. - def it_should_behave_like(shared_example_group) - case shared_example_group - when SharedExampleGroup - include shared_example_group - else - example_group = SharedExampleGroup.find_shared_example_group(shared_example_group) - unless example_group - raise RuntimeError.new("Shared Example Group '#{shared_example_group}' can not be found") - end - include(example_group) + def it_should_behave_like(*shared_example_groups) + shared_example_groups.each do |group| + include_shared_example_group(group) end end - # :call-seq: - # predicate_matchers[matcher_name] = method_on_object - # predicate_matchers[matcher_name] = [method1_on_object, method2_on_object] - # - # Dynamically generates a custom matcher that will match - # a predicate on your class. RSpec provides a couple of these - # out of the box: - # - # exist (or state expectations) - # File.should exist("path/to/file") - # - # an_instance_of (for mock argument constraints) - # mock.should_receive(:message).with(an_instance_of(String)) - # - # == Examples - # - # class Fish - # def can_swim? - # true - # end - # end - # - # describe Fish do - # predicate_matchers[:swim] = :can_swim? - # it "should swim" do - # Fish.new.should swim - # end - # end - def predicate_matchers - @predicate_matchers ||= {:an_instance_of => :is_a?} + # Creates an instance of the current example group class and adds it to + # a collection of examples of the current example group. + def example(description=nil, options={}, backtrace=nil, &implementation) + example_proxy = ExampleProxy.new(description, options, backtrace || caller(0)[1]) + example_proxies << example_proxy + example_implementations[example_proxy] = implementation || pending_implementation + example_proxy end - # Creates an instance of Spec::Example::Example and adds - # it to a collection of examples of the current example group. - def it(description=nil, &implementation) - e = new(description, &implementation) - example_objects << e - e + def pending_implementation + lambda { raise(Spec::Example::NotYetImplementedError) } end - alias_method :specify, :it + alias_method :it, :example + alias_method :specify, :example # Use this to temporarily disable an example. - def xit(description=nil, opts={}, &block) + def xexample(description=nil, opts={}, &block) Kernel.warn("Example disabled: #{description}") end - alias_method :xspecify, :xit - def run - examples = examples_to_run - reporter.add_example_group(self) + alias_method :xit, :xexample + alias_method :xspecify, :xexample + + def run(run_options) + examples = examples_to_run(run_options) + notify(run_options.reporter) unless examples.empty? return true if examples.empty? - return dry_run(examples) if dry_run? + return dry_run(examples, run_options) if run_options.dry_run? - plugin_mock_framework define_methods_from_predicate_matchers - success, before_all_instance_variables = run_before_all - success, after_all_instance_variables = execute_examples(success, before_all_instance_variables, examples) - success = run_after_all(success, after_all_instance_variables) - end - - def description - result = ExampleGroupMethods.description_text(*description_parts) - if result.nil? || result == "" - return to_s - else - result - end - end - - def described_type - description_parts.find {|part| part.is_a?(Module)} - end - - def description_parts #:nodoc: - parts = [] - execute_in_class_hierarchy do |example_group| - parts << example_group.description_args - end - parts.flatten.compact + success, before_all_instance_variables = run_before_all(run_options) + success, after_all_instance_variables = run_examples(success, before_all_instance_variables, examples, run_options) + success = run_after_all(success, after_all_instance_variables, run_options) end def set_description(*args) - args, options = args_and_options(*args) - @description_args = args - @description_options = options - @description_text = ExampleGroupMethods.description_text(*args) - @spec_path = File.expand_path(options[:spec_path]) if options[:spec_path] - if described_type.class == Module - @described_module = described_type - end + @description_args, @options = args_and_options(*args) + @backtrace = caller(1) + @location = File.expand_path(options[:location]) if options[:location] self end - - attr_reader :described_module - - def examples #:nodoc: - examples = example_objects.dup - add_method_examples(examples) - rspec_options.reverse ? examples.reverse : examples - end - - def number_of_examples #:nodoc: - examples.length - end - - # Registers a block to be executed before each example. - # This method prepends +block+ to existing before blocks. - def prepend_before(*args, &block) - scope, options = scope_and_options(*args) - parts = before_parts_from_scope(scope) - parts.unshift(block) - end - # Registers a block to be executed before each example. - # This method appends +block+ to existing before blocks. - def append_before(*args, &block) - scope, options = scope_and_options(*args) - parts = before_parts_from_scope(scope) - parts << block + def notify(reporter) # :nodoc: + reporter.example_group_started(ExampleGroupProxy.new(self)) end - alias_method :before, :append_before - # Registers a block to be executed after each example. - # This method prepends +block+ to existing after blocks. - def prepend_after(*args, &block) - scope, options = scope_and_options(*args) - parts = after_parts_from_scope(scope) - parts.unshift(block) - end - alias_method :after, :prepend_after - - # Registers a block to be executed after each example. - # This method appends +block+ to existing after blocks. - def append_after(*args, &block) - scope, options = scope_and_options(*args) - parts = after_parts_from_scope(scope) - parts << block + def description + @description ||= ExampleGroupMethods.build_description_from(*description_parts) || to_s end - def remove_after(scope, &block) - after_each_parts.delete(block) + def described_type + @described_type ||= description_parts.reverse.find {|part| part.is_a?(Module)} end - # Deprecated. Use before(:each) - def setup(&block) - before(:each, &block) + def described_class + @described_class ||= Class === described_type ? described_type : nil end - # Deprecated. Use after(:each) - def teardown(&block) - after(:each, &block) + def description_args + @description_args ||= [] end - def before_all_parts # :nodoc: - @before_all_parts ||= [] + def description_parts #:nodoc: + @description_parts ||= example_group_hierarchy.inject([]) do |parts, example_group_class| + [parts << example_group_class.description_args].flatten + end end - def after_all_parts # :nodoc: - @after_all_parts ||= [] + def example_proxies # :nodoc: + @example_proxies ||= [] end - def before_each_parts # :nodoc: - @before_each_parts ||= [] + def example_implementations # :nodoc: + @example_implementations ||= {} end - def after_each_parts # :nodoc: - @after_each_parts ||= [] + def examples(run_options=nil) #:nodoc: + (run_options && run_options.reverse) ? example_proxies.reverse : example_proxies end - # Only used from RSpec's own examples - def reset # :nodoc: - @before_all_parts = nil - @after_all_parts = nil - @before_each_parts = nil - @after_each_parts = nil + def number_of_examples #:nodoc: + example_proxies.length end - def register(®istration_binding_block) - @registration_binding_block = registration_binding_block - rspec_options.add_example_group self + def example_group_hierarchy + @example_group_hierarchy ||= ExampleGroupHierarchy.new(self) end - def unregister #:nodoc: - rspec_options.remove_example_group self + def nested_descriptions + example_group_hierarchy.nested_descriptions end - def registration_backtrace - eval("caller", registration_binding_block.binding) + def include_constants_in(mod) + include mod if (Spec::Ruby.version.to_f >= 1.9) & (Module === mod) & !(Class === mod) end - def run_before_each(example) - execute_in_class_hierarchy do |example_group| - example.eval_each_fail_fast(example_group.before_each_parts) + def let(name, &block) + define_method name do + @assignments ||= {} + @assignments[name] ||= instance_eval(&block) end end - def run_after_each(example) - execute_in_class_hierarchy(:superclass_first) do |example_group| - example.eval_each_fail_slow(example_group.after_each_parts) - end + private + + def subclass(*args, &example_group_block) + @class_count ||= 0 + @class_count += 1 + klass = const_set("Subclass_#{@class_count}", Class.new(self)) + klass.set_description(*args) + klass.include_constants_in(args.last[:scope]) + klass.module_eval(&example_group_block) + klass end - private - def dry_run(examples) + def dry_run(examples, run_options) examples.each do |example| - rspec_options.reporter.example_started(example) - rspec_options.reporter.example_finished(example) + run_options.reporter.example_started(example) + run_options.reporter.example_finished(example) end - return true end - def run_before_all - before_all = new("before(:all)") + def run_before_all(run_options) + return [true,{}] if example_group_hierarchy.before_all_parts.empty? + example_proxy = ExampleProxy.new("before(:all)") + before_all = new(example_proxy) begin - execute_in_class_hierarchy do |example_group| - before_all.eval_each_fail_fast(example_group.before_all_parts) - end + example_group_hierarchy.run_before_all(before_all) return [true, before_all.instance_variable_hash] rescue Exception => e - reporter.failure(before_all, e) + run_options.reporter.example_failed(example_proxy, e) return [false, before_all.instance_variable_hash] end end - def execute_examples(success, instance_variables, examples) + def run_examples(success, instance_variables, examples, run_options) return [success, instance_variables] unless success after_all_instance_variables = instance_variables - examples.each do |example_group_instance| - success &= example_group_instance.execute(rspec_options, instance_variables) + + examples.each do |example| + example_group_instance = new(example, &example_implementations[example]) + success &= example_group_instance.execute(run_options, instance_variables) after_all_instance_variables = example_group_instance.instance_variable_hash end + return [success, after_all_instance_variables] end - def run_after_all(success, instance_variables) - after_all = new("after(:all)") + def run_after_all(success, instance_variables, run_options) + return success if example_group_hierarchy.after_all_parts.empty? + example_proxy = ExampleProxy.new("after(:all)") + after_all = new(example_proxy) after_all.set_instance_variables_from_hash(instance_variables) - execute_in_class_hierarchy(:superclass_first) do |example_group| - after_all.eval_each_fail_slow(example_group.after_all_parts) - end - return success + example_group_hierarchy.run_after_all(after_all) + success rescue Exception => e - reporter.failure(after_all, e) - return false - end - - def examples_to_run - all_examples = examples - return all_examples unless specified_examples? - all_examples.reject do |example| - matcher = ExampleMatcher.new(description.to_s, example.description) - !matcher.matches?(specified_examples) - end - end - - def specified_examples? - specified_examples && !specified_examples.empty? - end - - def specified_examples - rspec_options.examples - end - - def reporter - rspec_options.reporter - end - - def dry_run? - rspec_options.dry_run - end - - def example_objects - @example_objects ||= [] - end - - def execute_in_class_hierarchy(superclass_last=false) - classes = [] - current_class = self - while is_example_group?(current_class) - superclass_last ? classes << current_class : classes.unshift(current_class) - current_class = current_class.superclass - end - superclass_last ? classes << ExampleMethods : classes.unshift(ExampleMethods) - - classes.each do |example_group| - yield example_group - end - end - - def is_example_group?(klass) - Module === klass && klass.kind_of?(ExampleGroupMethods) + run_options.reporter.example_failed(example_proxy, e) + false end - def plugin_mock_framework - case mock_framework = Spec::Runner.configuration.mock_framework - when Module - include mock_framework + def examples_to_run(run_options) + return example_proxies unless examples_were_specified?(run_options) + if run_options.line_number_requested? + if location =~ /:#{run_options.example_line}:?/ + example_proxies + else + example_proxies.select {|proxy| proxy.location =~ /:#{run_options.example_line}:?/} + end else - require Spec::Runner.configuration.mock_framework - include Spec::Plugins::MockFramework - end - end - - def define_methods_from_predicate_matchers # :nodoc: - all_predicate_matchers = predicate_matchers.merge( - Spec::Runner.configuration.predicate_matchers - ) - all_predicate_matchers.each_pair do |matcher_method, method_on_object| - define_method matcher_method do |*args| - eval("be_#{method_on_object.to_s.gsub('?','')}(*args)") + example_proxies.reject do |proxy| + matcher = ExampleGroupMethods.matcher_class. + new(description.to_s, proxy.description) + !matcher.matches?(run_options.examples) end end end - def scope_and_options(*args) - args, options = args_and_options(*args) - scope = (args[0] || :each), options - end - - def before_parts_from_scope(scope) - case scope - when :each; before_each_parts - when :all; before_all_parts - when :suite; rspec_options.before_suite_parts - end - end - - def after_parts_from_scope(scope) - case scope - when :each; after_each_parts - when :all; after_all_parts - when :suite; rspec_options.after_suite_parts - end - end - - def before_eval + def examples_were_specified?(run_options) + !run_options.examples.empty? end - def add_method_examples(examples) - instance_methods.sort.each do |method_name| - if example_method?(method_name) - examples << new(method_name) do - __send__(method_name) - end - end - end + def method_added(name) # :nodoc: + example(name.to_s, {}, caller(0)[1]) {__send__ name.to_s} if example_method?(name.to_s) end def example_method?(method_name) @@ -426,10 +261,20 @@ module Spec def should_method?(method_name) !(method_name =~ /^should(_not)?$/) && - method_name =~ /^should/ && ( - instance_method(method_name).arity == 0 || - instance_method(method_name).arity == -1 - ) + method_name =~ /^should/ && + instance_method(method_name).arity < 1 + end + + def include_shared_example_group(shared_example_group) + case shared_example_group + when SharedExampleGroup + include shared_example_group + else + unless example_group = SharedExampleGroup.find(shared_example_group) + raise RuntimeError.new("Shared Example Group '#{shared_example_group}' can not be found") + end + include(example_group) + end end end diff --git a/vendor/plugins/rspec/lib/spec/example/example_matcher.rb b/vendor/plugins/rspec/lib/spec/example/example_matcher.rb index 435eabf52..3acd7e14a 100644 --- a/vendor/plugins/rspec/lib/spec/example/example_matcher.rb +++ b/vendor/plugins/rspec/lib/spec/example/example_matcher.rb @@ -5,14 +5,13 @@ module Spec @example_group_description = example_group_description @example_name = example_name end - + def matches?(specified_examples) - specified_examples.each do |specified_example| - return true if matches_literal_example?(specified_example) || matches_example_not_considering_modules?(specified_example) + specified_examples.any? do |specified_example| + matches_literal_example?(specified_example) || matches_example_not_considering_modules?(specified_example) end - false end - + protected def matches_literal_example?(specified_example) specified_example =~ /(^#{example_group_regex} #{example_regexp}$|^#{example_group_regex}$|^#{example_group_with_before_all_regexp}$|^#{example_regexp}$)/ @@ -35,8 +34,10 @@ module Spec end def example_regexp - Regexp.escape(@example_name) + Regexp.escape(@example_name) if @example_name end end + + ExampleGroupMethods.matcher_class = ExampleMatcher end end diff --git a/vendor/plugins/rspec/lib/spec/example/example_methods.rb b/vendor/plugins/rspec/lib/spec/example/example_methods.rb index d4d716c2d..ca81a9379 100644 --- a/vendor/plugins/rspec/lib/spec/example/example_methods.rb +++ b/vendor/plugins/rspec/lib/spec/example/example_methods.rb @@ -1,60 +1,80 @@ module Spec module Example module ExampleMethods - extend ExampleGroupMethods - extend ModuleReopeningFix - include ModuleInclusionWarnings - - PENDING_EXAMPLE_BLOCK = lambda { - raise Spec::Example::ExamplePendingError.new("Not Yet Implemented") - } + extend Spec::Example::ModuleReopeningFix + include Spec::Example::Subject::ExampleMethods + + def violated(message="") + raise Spec::Expectations::ExpectationNotMetError.new(message) + end + + # Declared description for this example: + # + # describe Account do + # it "should start with a balance of 0" do + # ... + # + # description + # => "should start with a balance of 0" + def description + if description = @_proxy.description || ::Spec::Matchers.generated_description + description + else + Spec.warn Spec::Example::NoDescriptionError.message("example", @_proxy.location) + end + end + + def options # :nodoc: + @_proxy.options + end - def execute(options, instance_variables) - options.reporter.example_started(self) + def execute(run_options, instance_variables) # :nodoc: + run_options.reporter.example_started(@_proxy) set_instance_variables_from_hash(instance_variables) - + execution_error = nil - Timeout.timeout(options.timeout) do + Timeout.timeout(run_options.timeout) do begin - before_example - run_with_description_capturing + before_each_example + instance_eval(&@_implementation) rescue Exception => e execution_error ||= e end begin - after_example + after_each_example rescue Exception => e execution_error ||= e end end - options.reporter.example_finished(self, execution_error) + run_options.reporter.example_finished(@_proxy.update(description), execution_error) success = execution_error.nil? || ExamplePendingError === execution_error end - def instance_variable_hash - instance_variables.inject({}) do |variable_hash, variable_name| - variable_hash[variable_name] = instance_variable_get(variable_name) - variable_hash - end + module BlockAliases + alias_method :to, :should + alias_method :to_not, :should_not end - def violated(message="") - raise Spec::Expectations::ExpectationNotMetError.new(message) + # Extends the submitted block with aliases to and to_not + # for should and should_not. Allows expectations like this: + # + # expect { this_block }.to change{this.expression}.from(old_value).to(new_value) + # expect { this_block }.to raise_error + def expect(&block) + block.extend BlockAliases end - def eval_each_fail_fast(procs) #:nodoc: - procs.each do |proc| - instance_eval(&proc) - end + def eval_each_fail_fast(blocks) # :nodoc: + blocks.each {|block| instance_eval(&block)} end - def eval_each_fail_slow(procs) #:nodoc: + def eval_each_fail_slow(blocks) # :nodoc: first_exception = nil - procs.each do |proc| + blocks.each do |block| begin - instance_eval(&proc) + instance_eval(&block) rescue Exception => e first_exception ||= e end @@ -62,51 +82,67 @@ module Spec raise first_exception if first_exception end - def description - @_defined_description || @_matcher_description || "NO NAME" + def instance_variable_hash # :nodoc: + instance_variables.inject({}) do |variable_hash, variable_name| + variable_hash[variable_name] = instance_variable_get(variable_name) + variable_hash + end end - def __full_description - "#{self.class.description} #{self.description}" - end - - def set_instance_variables_from_hash(ivars) + def set_instance_variables_from_hash(ivars) # :nodoc: ivars.each do |variable_name, value| # Ruby 1.9 requires variable.to_s on the next line - unless ['@_implementation', '@_defined_description', '@_matcher_description', '@method_name'].include?(variable_name.to_s) + unless ['@_proxy', '@_implementation', '@method_name'].include?(variable_name.to_s) instance_variable_set variable_name, value end end end - def run_with_description_capturing - begin - return instance_eval(&(@_implementation || PENDING_EXAMPLE_BLOCK)) - ensure - @_matcher_description = Spec::Matchers.generated_description - Spec::Matchers.clear_generated_description - end + # Run all the before(:each) blocks for this example + def run_before_each + example_group_hierarchy.run_before_each(self) end - def implementation_backtrace - eval("caller", @_implementation) + # Run all the after(:each) blocks for this example + def run_after_each + example_group_hierarchy.run_after_each(self) + end + + def initialize(example_proxy, &implementation) + @_proxy = example_proxy + @_implementation = implementation + @_backtrace = caller end - protected + private + include Matchers include Pending - - def before_example + + def before_each_example setup_mocks_for_rspec - self.class.run_before_each(self) + run_before_each end - def after_example - self.class.run_after_each(self) + def after_each_example + run_after_each verify_mocks_for_rspec ensure teardown_mocks_for_rspec end + + def described_class + self.class.described_class + end + + def description_args + self.class.description_args + end + + def example_group_hierarchy + self.class.example_group_hierarchy + end + end end -end
\ No newline at end of file +end diff --git a/vendor/plugins/rspec/lib/spec/example/module_inclusion_warnings.rb b/vendor/plugins/rspec/lib/spec/example/module_inclusion_warnings.rb deleted file mode 100644 index c65faf2dd..000000000 --- a/vendor/plugins/rspec/lib/spec/example/module_inclusion_warnings.rb +++ /dev/null @@ -1,37 +0,0 @@ -module Spec - module Example - # In the future, modules will no longer be automatically included - # in the Example Group (based on the description name); when that - # time comes, this code should be removed. - module ModuleInclusionWarnings - # Thanks, Francis Hwang. - class MethodDispatcher - def initialize(mod, target=nil) - @mod = mod - @target = target - end - - def respond_to?(sym) - @mod && @mod.instance_methods.include?(sym.to_s) - end - - def call(sym, *args, &blk) - Kernel.warn("Modules will no longer be automatically included in RSpec version 1.1.4. Called from #{caller[2]}") - @target.extend @mod - @target.send(sym, *args, &blk) - end - end - - def respond_to?(sym) - MethodDispatcher.new(self.class.described_module).respond_to?(sym) ? true : super - end - - private - - def method_missing(sym, *args, &blk) - md = MethodDispatcher.new(self.class.described_module, self) - self.respond_to?(sym) ? md.call(sym, *args, &blk) : super - end - end - end -end diff --git a/vendor/plugins/rspec/lib/spec/example/module_reopening_fix.rb b/vendor/plugins/rspec/lib/spec/example/module_reopening_fix.rb index dc01dd666..9ea088a2e 100644 --- a/vendor/plugins/rspec/lib/spec/example/module_reopening_fix.rb +++ b/vendor/plugins/rspec/lib/spec/example/module_reopening_fix.rb @@ -1,6 +1,28 @@ module Spec module Example - # This is a fix for ...Something in Ruby 1.8.6??... (Someone fill in here please - Aslak) + # When you reopen a module that is included in another module that is included in a class, + # the new material you define does not make it to the class. This fixes that. + # + # == Example + # + # module M1; end + # + # module M2 + # def foo; "FOO"; end + # end + # + # class C + # include M1 + # end + # + # module M1 + # include M2 + # end + # + # c = C.new + # c.foo + # NoMethodError: undefined method `foo' for #<C:0x5e89a4> + # from (irb):12 module ModuleReopeningFix def child_modules @child_modules ||= [] @@ -18,4 +40,4 @@ module Spec end end end -end
\ No newline at end of file +end diff --git a/vendor/plugins/rspec/lib/spec/example/pending.rb b/vendor/plugins/rspec/lib/spec/example/pending.rb index b1f27c866..9aad1aab0 100644 --- a/vendor/plugins/rspec/lib/spec/example/pending.rb +++ b/vendor/plugins/rspec/lib/spec/example/pending.rb @@ -1,11 +1,11 @@ module Spec - module Example + module Example module Pending def pending(message = "TODO") if block_given? begin yield - rescue Exception => e + rescue Exception raise Spec::Example::ExamplePendingError.new(message) end raise Spec::Example::PendingExampleFixedError.new("Expected pending '#{message}' to fail. No Error was raised.") diff --git a/vendor/plugins/rspec/lib/spec/example/shared_example_group.rb b/vendor/plugins/rspec/lib/spec/example/shared_example_group.rb index a6fd6211c..336944914 100644 --- a/vendor/plugins/rspec/lib/spec/example/shared_example_group.rb +++ b/vendor/plugins/rspec/lib/spec/example/shared_example_group.rb @@ -1,58 +1,59 @@ module Spec module Example class SharedExampleGroup < Module - class << self - def add_shared_example_group(new_example_group) - guard_against_redefining_existing_example_group(new_example_group) - shared_example_groups << new_example_group + module ClassMethods + def register(*args, &block) + new_example_group = new(*args, &block) + shared_example_groups << new_example_group unless already_registered?(new_example_group) + new_example_group end - def find_shared_example_group(example_group_description) - shared_example_groups.find do |b| - b.description == example_group_description - end + def find(example_group_description) + shared_example_groups.find {|b| b.description == example_group_description} end + def clear + shared_example_groups.clear + end + + def include?(group) + shared_example_groups.include?(group) + end + + def count + shared_example_groups.length + end + + private + def shared_example_groups - # TODO - this needs to be global, or at least accessible from - # from subclasses of Example in a centralized place. I'm not loving - # this as a solution, but it works for now. - $shared_example_groups ||= [] - end - - private - def guard_against_redefining_existing_example_group(new_example_group) - existing_example_group = find_shared_example_group(new_example_group.description) - return unless existing_example_group - return if new_example_group.equal?(existing_example_group) - return if spec_path(new_example_group) == spec_path(existing_example_group) + @shared_example_groups ||= [] + end + + def already_registered?(new_example_group) + existing_example_group = find(new_example_group.description) + return false unless existing_example_group + return true if new_example_group.equal?(existing_example_group) + return true if expanded_path(new_example_group) == expanded_path(existing_example_group) raise ArgumentError.new("Shared Example '#{existing_example_group.description}' already exists") end - def spec_path(example_group) - File.expand_path(example_group.spec_path) + def expanded_path(example_group) + File.expand_path(example_group.location) end end + + extend ClassMethods include ExampleGroupMethods - public :include def initialize(*args, &example_group_block) - describe(*args) + set_description(*args) @example_group_block = example_group_block - self.class.add_shared_example_group(self) end def included(mod) # :nodoc: mod.module_eval(&@example_group_block) end - - def execute_in_class_hierarchy(superclass_last=false) - classes = [self] - superclass_last ? classes << ExampleMethods : classes.unshift(ExampleMethods) - classes.each do |example_group| - yield example_group - end - end end end end diff --git a/vendor/plugins/rspec/lib/spec/expectations.rb b/vendor/plugins/rspec/lib/spec/expectations.rb index 65ea47425..13cf59b26 100644 --- a/vendor/plugins/rspec/lib/spec/expectations.rb +++ b/vendor/plugins/rspec/lib/spec/expectations.rb @@ -1,4 +1,5 @@ require 'spec/matchers' +require 'spec/expectations/fail_with' require 'spec/expectations/errors' require 'spec/expectations/extensions' require 'spec/expectations/handler' @@ -30,27 +31,5 @@ module Spec # RSpec ships with a standard set of useful matchers, and writing your own # matchers is quite simple. See Spec::Matchers for details. module Expectations - class << self - attr_accessor :differ - - # raises a Spec::Expectations::ExpectationNotMetError with message - # - # When a differ has been assigned and fail_with is passed - # <code>expected</code> and <code>target</code>, passes them - # to the differ to append a diff message to the failure message. - def fail_with(message, expected=nil, target=nil) # :nodoc: - if Array === message && message.length == 3 - message, expected, target = message[0], message[1], message[2] - end - unless (differ.nil? || expected.nil? || target.nil?) - if expected.is_a?(String) - message << "\nDiff:" << self.differ.diff_as_string(target.to_s, expected) - elsif !target.is_a?(Proc) - message << "\nDiff:" << self.differ.diff_as_object(target, expected) - end - end - Kernel::raise(Spec::Expectations::ExpectationNotMetError.new(message)) - end - end end end diff --git a/vendor/plugins/rspec/lib/spec/expectations/differs/default.rb b/vendor/plugins/rspec/lib/spec/expectations/differs/default.rb deleted file mode 100644 index 74b59bbe3..000000000 --- a/vendor/plugins/rspec/lib/spec/expectations/differs/default.rb +++ /dev/null @@ -1,66 +0,0 @@ -begin - require 'rubygems' - require 'diff/lcs' #necessary due to loading bug on some machines - not sure why - DaC - require 'diff/lcs/hunk' -rescue LoadError ; raise "You must gem install diff-lcs to use diffing" ; end - -require 'pp' - -module Spec - module Expectations - module Differs - - # TODO add some rdoc - class Default - def initialize(options) - @options = options - end - - # This is snagged from diff/lcs/ldiff.rb (which is a commandline tool) - def diff_as_string(data_new, data_old) - data_old = data_old.split(/\n/).map! { |e| e.chomp } - data_new = data_new.split(/\n/).map! { |e| e.chomp } - output = "" - diffs = Diff::LCS.diff(data_old, data_new) - return output if diffs.empty? - oldhunk = hunk = nil - file_length_difference = 0 - diffs.each do |piece| - begin - hunk = Diff::LCS::Hunk.new(data_old, data_new, piece, context_lines, - file_length_difference) - file_length_difference = hunk.file_length_difference - next unless oldhunk - # Hunks may overlap, which is why we need to be careful when our - # diff includes lines of context. Otherwise, we might print - # redundant lines. - if (context_lines > 0) and hunk.overlaps?(oldhunk) - hunk.unshift(oldhunk) - else - output << oldhunk.diff(format) - end - ensure - oldhunk = hunk - output << "\n" - end - end - #Handle the last remaining hunk - output << oldhunk.diff(format) << "\n" - end - - def diff_as_object(target,expected) - diff_as_string(PP.pp(target,""), PP.pp(expected,"")) - end - - protected - def format - @options.diff_format - end - - def context_lines - @options.context_lines - end - end - end - end -end diff --git a/vendor/plugins/rspec/lib/spec/expectations/extensions.rb b/vendor/plugins/rspec/lib/spec/expectations/extensions.rb index 60c9b9e7d..d68212e42 100644 --- a/vendor/plugins/rspec/lib/spec/expectations/extensions.rb +++ b/vendor/plugins/rspec/lib/spec/expectations/extensions.rb @@ -1,2 +1 @@ -require 'spec/expectations/extensions/object' -require 'spec/expectations/extensions/string_and_symbol' +require 'spec/expectations/extensions/kernel' diff --git a/vendor/plugins/rspec/lib/spec/expectations/extensions/object.rb b/vendor/plugins/rspec/lib/spec/expectations/extensions/object.rb deleted file mode 100644 index 2091c2947..000000000 --- a/vendor/plugins/rspec/lib/spec/expectations/extensions/object.rb +++ /dev/null @@ -1,63 +0,0 @@ -module Spec - module Expectations - # rspec adds #should and #should_not to every Object (and, - # implicitly, every Class). - module ObjectExpectations - # :call-seq: - # should(matcher) - # should == expected - # should === expected - # should =~ expected - # - # receiver.should(matcher) - # => Passes if matcher.matches?(receiver) - # - # receiver.should == expected #any value - # => Passes if (receiver == expected) - # - # receiver.should === expected #any value - # => Passes if (receiver === expected) - # - # receiver.should =~ regexp - # => Passes if (receiver =~ regexp) - # - # See Spec::Matchers for more information about matchers - # - # == Warning - # - # NOTE that this does NOT support receiver.should != expected. - # Instead, use receiver.should_not == expected - def should(matcher=:use_operator_matcher, &block) - ExpectationMatcherHandler.handle_matcher(self, matcher, &block) - end - - # :call-seq: - # should_not(matcher) - # should_not == expected - # should_not === expected - # should_not =~ expected - # - # receiver.should_not(matcher) - # => Passes unless matcher.matches?(receiver) - # - # receiver.should_not == expected - # => Passes unless (receiver == expected) - # - # receiver.should_not === expected - # => Passes unless (receiver === expected) - # - # receiver.should_not =~ regexp - # => Passes unless (receiver =~ regexp) - # - # See Spec::Matchers for more information about matchers - def should_not(matcher=:use_operator_matcher, &block) - NegativeExpectationMatcherHandler.handle_matcher(self, matcher, &block) - end - - end - end -end - -class Object - include Spec::Expectations::ObjectExpectations -end diff --git a/vendor/plugins/rspec/lib/spec/expectations/extensions/string_and_symbol.rb b/vendor/plugins/rspec/lib/spec/expectations/extensions/string_and_symbol.rb deleted file mode 100644 index 29cfbddfa..000000000 --- a/vendor/plugins/rspec/lib/spec/expectations/extensions/string_and_symbol.rb +++ /dev/null @@ -1,17 +0,0 @@ -module Spec - module Expectations - module StringHelpers - def starts_with?(prefix) - to_s[0..(prefix.to_s.length - 1)] == prefix.to_s - end - end - end -end - -class String - include Spec::Expectations::StringHelpers -end - -class Symbol - include Spec::Expectations::StringHelpers -end diff --git a/vendor/plugins/rspec/lib/spec/expectations/handler.rb b/vendor/plugins/rspec/lib/spec/expectations/handler.rb index 2e5f2a621..c059637c7 100644 --- a/vendor/plugins/rspec/lib/spec/expectations/handler.rb +++ b/vendor/plugins/rspec/lib/spec/expectations/handler.rb @@ -2,59 +2,49 @@ module Spec module Expectations class InvalidMatcherError < ArgumentError; end - module MatcherHandlerHelper - def describe_matcher(matcher) - matcher.respond_to?(:description) ? matcher.description : "[#{matcher.class.name} does not provide a description]" - end - end - - class ExpectationMatcherHandler - class << self - include MatcherHandlerHelper - def handle_matcher(actual, matcher, &block) - if :use_operator_matcher == matcher - return Spec::Matchers::PositiveOperatorMatcher.new(actual) - end + class PositiveExpectationHandler + def self.handle_matcher(actual, matcher, message=nil, &block) + ::Spec::Matchers.last_should = :should + ::Spec::Matchers.last_matcher = matcher + return ::Spec::Matchers::PositiveOperatorMatcher.new(actual) if matcher.nil? - unless matcher.respond_to?(:matches?) - raise InvalidMatcherError, "Expected a matcher, got #{matcher.inspect}." - end - - match = matcher.matches?(actual, &block) - ::Spec::Matchers.generated_description = "should #{describe_matcher(matcher)}" - Spec::Expectations.fail_with(matcher.failure_message) unless match + match = matcher.matches?(actual, &block) + return match if match + + message ||= matcher.respond_to?(:failure_message_for_should) ? + matcher.failure_message_for_should : + matcher.failure_message + + if matcher.respond_to?(:diffable?) && matcher.diffable? + ::Spec::Expectations.fail_with message, matcher.expected.first, matcher.actual + else + ::Spec::Expectations.fail_with message end end end - class NegativeExpectationMatcherHandler - class << self - include MatcherHandlerHelper - def handle_matcher(actual, matcher, &block) - if :use_operator_matcher == matcher - return Spec::Matchers::NegativeOperatorMatcher.new(actual) - end - - unless matcher.respond_to?(:matches?) - raise InvalidMatcherError, "Expected a matcher, got #{matcher.inspect}." - end + class NegativeExpectationHandler + def self.handle_matcher(actual, matcher, message=nil, &block) + ::Spec::Matchers.last_should = :should_not + ::Spec::Matchers.last_matcher = matcher + return ::Spec::Matchers::NegativeOperatorMatcher.new(actual) if matcher.nil? + + match = matcher.respond_to?(:does_not_match?) ? + !matcher.does_not_match?(actual, &block) : + matcher.matches?(actual, &block) + return match unless match + + message ||= matcher.respond_to?(:failure_message_for_should_not) ? + matcher.failure_message_for_should_not : + matcher.negative_failure_message - unless matcher.respond_to?(:negative_failure_message) - Spec::Expectations.fail_with( -<<-EOF -Matcher does not support should_not. -See Spec::Matchers for more information -about matchers. -EOF -) - end - match = matcher.matches?(actual, &block) - ::Spec::Matchers.generated_description = "should not #{describe_matcher(matcher)}" - Spec::Expectations.fail_with(matcher.negative_failure_message) if match + if matcher.respond_to?(:diffable?) && matcher.diffable? + ::Spec::Expectations.fail_with message, matcher.expected.first, matcher.actual + else + ::Spec::Expectations.fail_with message end end end - end end diff --git a/vendor/plugins/rspec/lib/spec/extensions.rb b/vendor/plugins/rspec/lib/spec/extensions.rb deleted file mode 100755 index 715bb49f2..000000000 --- a/vendor/plugins/rspec/lib/spec/extensions.rb +++ /dev/null @@ -1,4 +0,0 @@ -require 'spec/extensions/object' -require 'spec/extensions/class' -require 'spec/extensions/main' -require 'spec/extensions/metaclass' diff --git a/vendor/plugins/rspec/lib/spec/extensions/class.rb b/vendor/plugins/rspec/lib/spec/extensions/class.rb deleted file mode 100644 index 30730f87e..000000000 --- a/vendor/plugins/rspec/lib/spec/extensions/class.rb +++ /dev/null @@ -1,24 +0,0 @@ -class Class - # Creates a new subclass of self, with a name "under" our own name. - # Example: - # - # x = Foo::Bar.subclass('Zap'){} - # x.name # => Foo::Bar::Zap_1 - # x.superclass.name # => Foo::Bar - def subclass(base_name, &body) - klass = Class.new(self) - class_name = "#{base_name}_#{class_count!}" - instance_eval do - const_set(class_name, klass) - end - klass.instance_eval(&body) - klass - end - - private - def class_count! - @class_count ||= 0 - @class_count += 1 - @class_count - end -end
\ No newline at end of file diff --git a/vendor/plugins/rspec/lib/spec/extensions/main.rb b/vendor/plugins/rspec/lib/spec/extensions/main.rb deleted file mode 100644 index 281cbf879..000000000 --- a/vendor/plugins/rspec/lib/spec/extensions/main.rb +++ /dev/null @@ -1,102 +0,0 @@ -module Spec - module Extensions - module Main - # Creates and returns a class that includes the ExampleGroupMethods - # module. Which ExampleGroup type is created depends on the directory of the file - # calling this method. For example, Spec::Rails will use different - # classes for specs living in <tt>spec/models</tt>, - # <tt>spec/helpers</tt>, <tt>spec/views</tt> and - # <tt>spec/controllers</tt>. - # - # It is also possible to override autodiscovery of the example group - # type with an options Hash as the last argument: - # - # describe "name", :type => :something_special do ... - # - # The reason for using different behaviour classes is to have different - # matcher methods available from within the <tt>describe</tt> block. - # - # See Spec::Example::ExampleFactory#register for details about how to - # register special implementations. - # - def describe(*args, &block) - raise ArgumentError if args.empty? - raise ArgumentError unless block - args << {} unless Hash === args.last - args.last[:spec_path] = caller(0)[1] - Spec::Example::ExampleGroupFactory.create_example_group(*args, &block) - end - alias :context :describe - - # Creates an example group that can be shared by other example groups - # - # == Examples - # - # share_examples_for "All Editions" do - # it "all editions behaviour" ... - # end - # - # describe SmallEdition do - # it_should_behave_like "All Editions" - # - # it "should do small edition stuff" do - # ... - # end - # end - def share_examples_for(name, &block) - describe(name, :shared => true, &block) - end - - alias :shared_examples_for :share_examples_for - - # Creates a Shared Example Group and assigns it to a constant - # - # share_as :AllEditions do - # it "should do all editions stuff" ... - # end - # - # describe SmallEdition do - # it_should_behave_like AllEditions - # - # it "should do small edition stuff" do - # ... - # end - # end - # - # And, for those of you who prefer to use something more like Ruby, you - # can just include the module directly - # - # describe SmallEdition do - # include AllEditions - # - # it "should do small edition stuff" do - # ... - # end - # end - def share_as(name, &block) - begin - Object.const_set(name, share_examples_for(name, &block)) - rescue NameError => e - raise NameError.new(e.message + "\nThe first argument to share_as must be a legal name for a constant\n") - end - end - - private - - def rspec_options - $rspec_options ||= begin; \ - parser = ::Spec::Runner::OptionParser.new(STDERR, STDOUT); \ - parser.order!(ARGV); \ - $rspec_options = parser.options; \ - end - $rspec_options - end - - def init_rspec_options(options) - $rspec_options = options if $rspec_options.nil? - end - end - end -end - -include Spec::Extensions::Main
\ No newline at end of file diff --git a/vendor/plugins/rspec/lib/spec/extensions/metaclass.rb b/vendor/plugins/rspec/lib/spec/extensions/metaclass.rb deleted file mode 100644 index acf9febea..000000000 --- a/vendor/plugins/rspec/lib/spec/extensions/metaclass.rb +++ /dev/null @@ -1,7 +0,0 @@ -module Spec - module MetaClass - def metaclass - class << self; self; end - end - end -end
\ No newline at end of file diff --git a/vendor/plugins/rspec/lib/spec/extensions/object.rb b/vendor/plugins/rspec/lib/spec/extensions/object.rb deleted file mode 100755 index 0b8c26fa2..000000000 --- a/vendor/plugins/rspec/lib/spec/extensions/object.rb +++ /dev/null @@ -1,6 +0,0 @@ -class Object - def args_and_options(*args) - options = Hash === args.last ? args.pop : {} - return args, options - end -end diff --git a/vendor/plugins/rspec/lib/spec/interop/test.rb b/vendor/plugins/rspec/lib/spec/interop/test.rb index afa16137b..284eb32ce 100644 --- a/vendor/plugins/rspec/lib/spec/interop/test.rb +++ b/vendor/plugins/rspec/lib/spec/interop/test.rb @@ -1,4 +1,36 @@ +require 'spec' + +if Spec::Ruby.version.to_f >= 1.9 + gem 'test-unit','= 1.2.3' +end + require 'test/unit' + +if Spec::Ruby.version.to_f >= 1.9 + require 'test/unit/version' + if Test::Unit::VERSION > '1.2.3' + raise <<-MESSAGE +#{'*' * 50} +Required: test-unit-1.2.3 +Loaded: test-unit-#{Test::Unit::VERSION} + +With ruby-1.9, rspec-#{Spec::VERSION::STRING} requires test-unit-1.2.3, and +tries to force it with "gem 'test-unit', '= 1.2.3'" in: + + #{__FILE__} + +Unfortunately, test-unit-#{Test::Unit::VERSION} was loaded anyway. While we are +aware of this bug we have not been able to track down its source. +Until we do, you have two alternatives: + +* uninstall test-unit-2.0.3 +* use 'script/spec' instead of 'rake spec' +#{'*' * 50} +MESSAGE + end +end + + require 'test/unit/testresult' require 'spec/interop/test/unit/testcase' diff --git a/vendor/plugins/rspec/lib/spec/interop/test/unit/testcase.rb b/vendor/plugins/rspec/lib/spec/interop/test/unit/testcase.rb index b32a820c1..dc10a2a64 100644 --- a/vendor/plugins/rspec/lib/spec/interop/test/unit/testcase.rb +++ b/vendor/plugins/rspec/lib/spec/interop/test/unit/testcase.rb @@ -5,8 +5,7 @@ module Test # This extension of the standard Test::Unit::TestCase makes RSpec # available from within, so that you can do things like: # - # require 'test/unit' - # require 'spec' + # require 'spec/test/unit' # # class MyTest < Test::Unit::TestCase # it "should work with Test::Unit assertions" do @@ -23,39 +22,35 @@ module Test extend Spec::Example::ExampleGroupMethods include Spec::Example::ExampleMethods - before(:each) {setup} - after(:each) {teardown} + def self.suite + Test::Unit::TestSuiteAdapter.new(self) + end - class << self - def suite - Test::Unit::TestSuiteAdapter.new(self) - end - - def example_method?(method_name) - should_method?(method_name) || test_method?(method_name) - end - - def test_method?(method_name) - method_name =~ /^test[_A-Z]./ && ( - instance_method(method_name).arity == 0 || - instance_method(method_name).arity == -1 - ) - end + def self.example_method?(method_name) + should_method?(method_name) || test_method?(method_name) end - def initialize(defined_description, &implementation) - @_defined_description = defined_description - @_implementation = implementation + def self.test_method?(method_name) + method_name =~ /^test./ && ( + instance_method(method_name).arity == 0 || + instance_method(method_name).arity == -1 + ) + end - @_result = ::Test::Unit::TestResult.new - # @method_name is important to set here because it "complies" with Test::Unit's interface. + before(:each) {setup} + after(:each) {teardown} + + def initialize(description, &implementation) + super # Some Test::Unit extensions depend on @method_name being present. - @method_name = @_defined_description + @method_name = description.description + @_result = ::Test::Unit::TestResult.new end def run(ignore_this_argument=nil) super() end + end end end diff --git a/vendor/plugins/rspec/lib/spec/interop/test/unit/testresult.rb b/vendor/plugins/rspec/lib/spec/interop/test/unit/testresult.rb index 1386dc728..dddcfe868 100644 --- a/vendor/plugins/rspec/lib/spec/interop/test/unit/testresult.rb +++ b/vendor/plugins/rspec/lib/spec/interop/test/unit/testresult.rb @@ -1,6 +1,6 @@ class Test::Unit::TestResult alias_method :tu_passed?, :passed? def passed? - return tu_passed? & ::Spec.run + return tu_passed? & ::Spec::Runner.run end end
\ No newline at end of file diff --git a/vendor/plugins/rspec/lib/spec/interop/test/unit/testsuite_adapter.rb b/vendor/plugins/rspec/lib/spec/interop/test/unit/testsuite_adapter.rb index 7c0ed092d..912762f18 100644 --- a/vendor/plugins/rspec/lib/spec/interop/test/unit/testsuite_adapter.rb +++ b/vendor/plugins/rspec/lib/spec/interop/test/unit/testsuite_adapter.rb @@ -14,7 +14,7 @@ module Test def run(*args) return true unless args.empty? - example_group.run + example_group.run(Spec::Runner.options) end def size diff --git a/vendor/plugins/rspec/lib/spec/matchers.rb b/vendor/plugins/rspec/lib/spec/matchers.rb index afae5ae5f..4ef832936 100644 --- a/vendor/plugins/rspec/lib/spec/matchers.rb +++ b/vendor/plugins/rspec/lib/spec/matchers.rb @@ -1,19 +1,31 @@ -require 'spec/matchers/simple_matcher' +require 'spec/matchers/extensions/instance_exec' +require 'spec/matchers/pretty' +require 'spec/matchers/matcher' +require 'spec/matchers/operator_matcher' require 'spec/matchers/be' require 'spec/matchers/be_close' +require 'spec/matchers/be_instance_of' +require 'spec/matchers/be_kind_of' require 'spec/matchers/change' require 'spec/matchers/eql' require 'spec/matchers/equal' +require 'spec/matchers/errors' require 'spec/matchers/exist' +require 'spec/matchers/generated_descriptions' require 'spec/matchers/has' require 'spec/matchers/have' require 'spec/matchers/include' require 'spec/matchers/match' +require 'spec/matchers/match_array' +require 'spec/matchers/method_missing' require 'spec/matchers/raise_error' require 'spec/matchers/respond_to' require 'spec/matchers/satisfy' +require 'spec/matchers/simple_matcher' require 'spec/matchers/throw_symbol' -require 'spec/matchers/operator_matcher' +require 'spec/matchers/wrap_expectation' +require 'spec/matchers/compatibility' +require 'spec/matchers/dsl' module Spec @@ -21,12 +33,21 @@ module Spec # is any object that responds to the following methods: # # matches?(actual) - # failure_message - # negative_failure_message #optional + # failure_message_for_should + # + # These methods are also part of the matcher protocol, but are optional: + # + # does_not_match?(actual) + # failure_message_for_should_not # description #optional # + # These methods are from older versions of the protocol. They are still supported, + # but are not recommended: + # + # failure_message (use failure_message_for_should instead) + # negative_failure_message (use failure_message_for_should_not instead) + # # See Spec::Expectations to learn how to use these as Expectation Matchers. - # See Spec::Mocks to learn how to use them as Mock Argument Constraints. # # == Predicates # @@ -63,14 +84,17 @@ module Spec # You can use this feature to invoke any predicate that begins with "has_", whether it is # part of the Ruby libraries (like +Hash#has_key?+) or a method you wrote on your own class. # - # == Custom Expectation Matchers + # == Custom Matchers # # When you find that none of the stock Expectation Matchers provide a natural - # feeling expectation, you can very easily write your own. + # feeling expectation, you can very easily write your own using RSpec's matcher + # DSL or writing one from scratch. + # + # === Matcher DSL # - # For example, imagine that you are writing a game in which players can - # be in various zones on a virtual board. To specify that bob should - # be in zone 4, you could say: + # Imagine that you are writing a game in which players can be in various + # zones on a virtual board. To specify that bob should be in zone 4, you + # could say: # # bob.current_zone.should eql(Zone.new("4")) # @@ -82,7 +106,42 @@ module Spec # # bob.should_not be_in_zone("3") # - # To do this, you would need to write a class like this: + # You can create such a matcher like so: + # + # Spec::Matchers.define :be_in_zone do |zone| + # match do |player| + # player.in_zone?(zone) + # end + # end + # + # This will generate a <tt>be_in_zone</tt> method that returns a matcher + # with logical default messages for failures. You can override the failure + # messages and the generated description as follows: + # + # Spec::Matchers.define :be_in_zone do |zone| + # match do |player| + # player.in_zone?(zone) + # end + # failure_message_for_should do |player| + # # generate and return the appropriate string. + # end + # failure_message_for_should_not do |player| + # # generate and return the appropriate string. + # end + # description do + # # generate and return the appropriate string. + # end + # end + # + # Each of the message-generation methods has access to the block arguments + # passed to the <tt>create</tt> method (in this case, <tt>zone</tt>). The + # failure message methods (<tt>failure_message_for_should</tt> and + # <tt>failure_message_for_should_not</tt>) are passed the actual value (the + # receiver of <tt>should</tt> or <tt>should_not</tt>). + # + # === Custom Matcher from scratch + # + # You could also write a custom matcher from scratch, as follows: # # class BeInZone # def initialize(expected) @@ -92,10 +151,10 @@ module Spec # @target = target # @target.current_zone.eql?(Zone.new(@expected)) # end - # def failure_message + # def failure_message_for_should # "expected #{@target.inspect} to be in Zone #{@expected}" # end - # def negative_failure_message + # def failure_message_for_should_not # "expected #{@target.inspect} not to be in Zone #{@expected}" # end # end @@ -132,25 +191,5 @@ module Spec # config.include(CustomGameMatchers) # end # - module Matchers - module ModuleMethods - attr_accessor :generated_description - - def clear_generated_description - self.generated_description = nil - end - end - - extend ModuleMethods - - def method_missing(sym, *args, &block) # :nodoc: - return Matchers::Be.new(sym, *args) if sym.starts_with?("be_") - return Matchers::Has.new(sym, *args) if sym.starts_with?("have_") - super - end - - class MatcherError < StandardError - end - - end + module Matchers; end end diff --git a/vendor/plugins/rspec/lib/spec/matchers/be.rb b/vendor/plugins/rspec/lib/spec/matchers/be.rb index 2b25b11f4..242f7c5c9 100644 --- a/vendor/plugins/rspec/lib/spec/matchers/be.rb +++ b/vendor/plugins/rspec/lib/spec/matchers/be.rb @@ -2,142 +2,130 @@ module Spec module Matchers class Be #:nodoc: + include Spec::Matchers::Pretty + def initialize(*args) - if args.empty? - @expected = :satisfy_if - else - @expected = parse_expected(args.shift) - end + @expected = args.empty? ? true : set_expected(args.shift) @args = args - @comparison = "" + @comparison_method = nil end def matches?(actual) @actual = actual - if handling_predicate? - begin - return @result = actual.__send__(predicate, *@args) - rescue => predicate_error - # This clause should be empty, but rcov will not report it as covered - # unless something (anything) is executed within the clause - rcov_error_report = "http://eigenclass.org/hiki.rb?rcov-0.8.0" - end - - # This supports should_exist > target.exists? in the old world. - # We should consider deprecating that ability as in the new world - # you can't write "should exist" unless you have your own custom matcher. - begin - return @result = actual.__send__(present_tense_predicate, *@args) - rescue - raise predicate_error - end - else - return match_or_compare - end - end - - def failure_message - return "expected #{@comparison}#{expected}, got #{@actual.inspect}" unless handling_predicate? - return "expected #{predicate}#{args_to_s} to return true, got #{@result.inspect}" + handling_predicate? ? run_predicate_on(actual) : match_or_compare(actual) end - def negative_failure_message - return "expected not #{expected}, got #{@actual.inspect}" unless handling_predicate? - return "expected #{predicate}#{args_to_s} to return false, got #{@result.inspect}" + def run_predicate_on(actual) + begin + return @result = actual.__send__(predicate, *@args) + rescue NameError => predicate_missing_error + "this needs to be here or rcov will not count this branch even though it's executed in a code example" + end + + begin + return @result = actual.__send__(present_tense_predicate, *@args) + rescue NameError + raise predicate_missing_error + end end - def expected - return "if to be satisfied" if @expected == :satisfy_if - return true if @expected == :true - return false if @expected == :false - return "nil" if @expected == :nil - return @expected.inspect + def failure_message_for_should + if handling_predicate? + if predicate == :nil? + "expected nil, got #{@actual.inspect}" + else + "expected #{predicate}#{args_to_s} to return true, got #{@result.inspect}" + end + else + "expected #{@comparison_method} #{expected}, got #{@actual.inspect}".gsub(' ',' ') + end end - def match_or_compare - return @actual ? true : false if @expected == :satisfy_if - return @actual == true if @expected == :true - return @actual == false if @expected == :false - return @actual.nil? if @expected == :nil - return @actual < @expected if @less_than - return @actual <= @expected if @less_than_or_equal - return @actual >= @expected if @greater_than_or_equal - return @actual > @expected if @greater_than - return @actual == @expected if @double_equal - return @actual === @expected if @triple_equal - return @actual.equal?(@expected) + def failure_message_for_should_not + if handling_predicate? + if predicate == :nil? + "expected not nil, got nil" + else + "expected #{predicate}#{args_to_s} to return false, got #{@result.inspect}" + end + else + message = <<-MESSAGE +'should_not be #{@comparison_method} #{expected}' not only FAILED, +it is a bit confusing. + MESSAGE + + raise message << ([:===,:==].include?(@comparison_method) ? + "It might be more clearly expressed without the \"be\"?" : + "It might be more clearly expressed in the positive?") + end end - def ==(expected) - @prefix = "be " - @double_equal = true - @comparison = "== " - @expected = expected - self - end - - def ===(expected) - @prefix = "be " - @triple_equal = true - @comparison = "=== " - @expected = expected - self - end - - def <(expected) - @prefix = "be " - @less_than = true - @comparison = "< " - @expected = expected - self - end - - def <=(expected) - @prefix = "be " - @less_than_or_equal = true - @comparison = "<= " - @expected = expected - self + def description + "#{prefix_to_sentence}#{comparison} #{expected_to_sentence}#{args_to_sentence}".gsub(/\s+/,' ') end - def >=(expected) - @prefix = "be " - @greater_than_or_equal = true - @comparison = ">= " - @expected = expected - self + [:==, :<, :<=, :>=, :>, :===].each do |method| + define_method method do |expected| + compare_to(expected, :using => method) + self + end end - def >(expected) - @prefix = "be " - @greater_than = true - @comparison = "> " - @expected = expected - self - end + private + def match_or_compare(actual) + TrueClass === @expected ? @actual : @actual.__send__(comparison_method, @expected) + end - def description - "#{prefix_to_sentence}#{comparison}#{expected_to_sentence}#{args_to_sentence}" - end + def comparison_method + @comparison_method || :equal? + end + + def expected + @expected + end - private + def compare_to(expected, opts) + @expected, @comparison_method = expected, opts[:using] + end + + def set_expected(expected) + Symbol === expected ? parse_expected(expected) : expected + end + def parse_expected(expected) - if Symbol === expected - @handling_predicate = true - ["be_an_","be_a_","be_"].each do |prefix| - if expected.starts_with?(prefix) - @prefix = prefix - return "#{expected.to_s.sub(@prefix,"")}".to_sym + ["be_an_","be_a_","be_"].each do |prefix| + handling_predicate! + if expected.to_s =~ /^#{prefix}/ + set_prefix(prefix) + expected = expected.to_s.sub(prefix,"") + [true, false, nil].each do |val| + return val if val.to_s == expected end + return expected.to_sym end end - @prefix = "" - return expected + end + + def set_prefix(prefix) + @prefix = prefix + end + + def prefix + # FIXME - this is a bit goofy - but we get failures + # if just defining @prefix = nil in initialize + @prefix = nil unless defined?(@prefix) + @prefix + end + + def handling_predicate! + @handling_predicate = true end def handling_predicate? - return false if [:true, :false, :nil].include?(@expected) - return @handling_predicate + return false if [true, false, nil].include?(expected) + # FIXME - this is a bit goofy - but we get failures + # if just defining @handling_predicate = nil or false in initialize + return defined?(@handling_predicate) ? @handling_predicate : nil end def predicate @@ -149,50 +137,44 @@ module Spec end def args_to_s - return "" if @args.empty? - inspected_args = @args.collect{|a| a.inspect} - return "(#{inspected_args.join(', ')})" + @args.empty? ? "" : parenthesize(inspected_args.join(', ')) + end + + def parenthesize(string) + return "(#{string})" + end + + def inspected_args + @args.collect{|a| a.inspect} end def comparison - @comparison + @comparison_method.nil? ? " " : "be #{@comparison_method.to_s} " end def expected_to_sentence - split_words(@expected) + split_words(expected) end def prefix_to_sentence - split_words(@prefix) - end - - def split_words(sym) - sym.to_s.gsub(/_/,' ') + split_words(prefix) end def args_to_sentence - case @args.length - when 0 - "" - when 1 - " #{@args[0]}" - else - " #{@args[0...-1].join(', ')} and #{@args[-1]}" - end + to_sentence(@args) end end # :call-seq: - # should be # should be_true # should be_false # should be_nil - # should be_arbitrary_predicate(*args) + # should be_[arbitrary_predicate](*args) # should_not be_nil - # should_not be_arbitrary_predicate(*args) + # should_not be_[arbitrary_predicate](*args) # - # Given true, false, or nil, will pass if actual is + # Given true, false, or nil, will pass if actual value is # true, false or nil (respectively). Given no args means # the caller should satisfy an if condition (to be or not to be). # @@ -206,19 +188,23 @@ module Spec # # == Examples # - # target.should be # target.should be_true # target.should be_false # target.should be_nil # target.should_not be_nil # # collection.should be_empty #passes if target.empty? - # "this string".should be_an_intance_of(String) - # # target.should_not be_empty #passes unless target.empty? # target.should_not be_old_enough(16) #passes unless target.old_enough?(16) def be(*args) Matchers::Be.new(*args) end + + # passes if target.kind_of?(klass) + def be_a(klass) + be_a_kind_of(klass) + end + + alias_method :be_an, :be_a end end diff --git a/vendor/plugins/rspec/lib/spec/matchers/be_close.rb b/vendor/plugins/rspec/lib/spec/matchers/be_close.rb index 7763eb97e..28015f5fb 100644 --- a/vendor/plugins/rspec/lib/spec/matchers/be_close.rb +++ b/vendor/plugins/rspec/lib/spec/matchers/be_close.rb @@ -1,26 +1,5 @@ module Spec module Matchers - - class BeClose #:nodoc: - def initialize(expected, delta) - @expected = expected - @delta = delta - end - - def matches?(actual) - @actual = actual - (@actual - @expected).abs < @delta - end - - def failure_message - "expected #{@expected} +/- (< #{@delta}), got #{@actual}" - end - - def description - "be close to #{@expected} (within +- #{@delta})" - end - end - # :call-seq: # should be_close(expected, delta) # should_not be_close(expected, delta) @@ -31,7 +10,23 @@ module Spec # # result.should be_close(3.0, 0.5) def be_close(expected, delta) - Matchers::BeClose.new(expected, delta) + Matcher.new :be_close, expected, delta do |_expected_, _delta_| + match do |actual| + (actual - _expected_).abs < _delta_ + end + + failure_message_for_should do |actual| + "expected #{_expected_} +/- (< #{_delta_}), got #{actual}" + end + + failure_message_for_should_not do |actual| + "expected #{_expected_} +/- (< #{_delta_}), got #{actual}" + end + + description do + "be close to #{_expected_} (within +- #{_delta_})" + end + end end end end diff --git a/vendor/plugins/rspec/lib/spec/matchers/change.rb b/vendor/plugins/rspec/lib/spec/matchers/change.rb index 8f4ecc187..c8ab9e5cf 100644 --- a/vendor/plugins/rspec/lib/spec/matchers/change.rb +++ b/vendor/plugins/rspec/lib/spec/matchers/change.rb @@ -4,60 +4,59 @@ module Spec #Based on patch from Wilson Bilkovich class Change #:nodoc: def initialize(receiver=nil, message=nil, &block) - @receiver = receiver - @message = message - @block = block + @message = message || "result" + @value_proc = block || lambda {receiver.__send__(message)} + @to = @from = @minimum = @maximum = @amount = nil end - def matches?(target, &block) - if block - raise MatcherError.new(<<-EOF -block passed to should or should_not change must use {} instead of do/end -EOF -) - end - @target = target - execute_change - return false if @from && (@from != @before) - return false if @to && (@to != @after) + def matches?(event_proc) + raise_block_syntax_error if block_given? + + @before = evaluate_value_proc + event_proc.call + @after = evaluate_value_proc + + return (@to = false) if @from unless @from == @before + return false if @to unless @to == @after return (@before + @amount == @after) if @amount return ((@after - @before) >= @minimum) if @minimum return ((@after - @before) <= @maximum) if @maximum return @before != @after end - def execute_change - @before = @block.nil? ? @receiver.send(@message) : @block.call - @target.call - @after = @block.nil? ? @receiver.send(@message) : @block.call + def raise_block_syntax_error + raise MatcherError.new(<<-MESSAGE +block passed to should or should_not change must use {} instead of do/end +MESSAGE + ) + end + + def evaluate_value_proc + @value_proc.call end - def failure_message + def failure_message_for_should if @to - "#{result} should have been changed to #{@to.inspect}, but is now #{@after.inspect}" + "#{@message} should have been changed to #{@to.inspect}, but is now #{@after.inspect}" elsif @from - "#{result} should have initially been #{@from.inspect}, but was #{@before.inspect}" + "#{@message} should have initially been #{@from.inspect}, but was #{@before.inspect}" elsif @amount - "#{result} should have been changed by #{@amount.inspect}, but was changed by #{actual_delta.inspect}" + "#{@message} should have been changed by #{@amount.inspect}, but was changed by #{actual_delta.inspect}" elsif @minimum - "#{result} should have been changed by at least #{@minimum.inspect}, but was changed by #{actual_delta.inspect}" + "#{@message} should have been changed by at least #{@minimum.inspect}, but was changed by #{actual_delta.inspect}" elsif @maximum - "#{result} should have been changed by at most #{@maximum.inspect}, but was changed by #{actual_delta.inspect}" + "#{@message} should have been changed by at most #{@maximum.inspect}, but was changed by #{actual_delta.inspect}" else - "#{result} should have changed, but is still #{@before.inspect}" + "#{@message} should have changed, but is still #{@before.inspect}" end end - def result - @message || "result" - end - def actual_delta @after - @before end - def negative_failure_message - "#{result} should not have changed, but did change from #{@before.inspect} to #{@after.inspect}" + def failure_message_for_should_not + "#{@message} should not have changed, but did change from #{@before.inspect} to #{@after.inspect}" end def by(amount) @@ -84,6 +83,10 @@ EOF @from = from self end + + def description + "change ##{@message}" + end end # :call-seq: @@ -125,20 +128,24 @@ EOF # employee.develop_great_new_social_networking_app # }.should change(employee, :title).from("Mail Clerk").to("CEO") # - # Evaluates +receiver.message+ or +block+ before and - # after it evaluates the c object (generated by the lambdas in the examples above). + # Evaluates <tt>receiver.message</tt> or <tt>block</tt> before and after + # it evaluates the c object (generated by the lambdas in the examples + # above). + # + # Then compares the values before and after the <tt>receiver.message</tt> + # and evaluates the difference compared to the expected difference. # - # Then compares the values before and after the +receiver.message+ and - # evaluates the difference compared to the expected difference. + # == WARNING + # <tt>should_not change</tt> only supports the form with no + # subsequent calls to <tt>by</tt>, <tt>by_at_least</tt>, + # <tt>by_at_most</tt>, <tt>to</tt> or <tt>from</tt>. # - # == Warning - # +should_not+ +change+ only supports the form with no subsequent calls to - # +by+, +by_at_least+, +by_at_most+, +to+ or +from+. + # blocks passed to <tt>should</tt> <tt>change</tt> and <tt>should_not</tt> + # <tt>change</tt> must use the <tt>{}</tt> form (<tt>do/end</tt> is not + # supported). # - # blocks passed to +should+ +change+ and +should_not+ +change+ - # must use the <tt>{}</tt> form (<tt>do/end</tt> is not supported) - def change(target=nil, message=nil, &block) - Matchers::Change.new(target, message, &block) + def change(receiver=nil, message=nil, &block) + Matchers::Change.new(receiver, message, &block) end end end diff --git a/vendor/plugins/rspec/lib/spec/matchers/eql.rb b/vendor/plugins/rspec/lib/spec/matchers/eql.rb index 280ca5454..98ab198d9 100644 --- a/vendor/plugins/rspec/lib/spec/matchers/eql.rb +++ b/vendor/plugins/rspec/lib/spec/matchers/eql.rb @@ -1,29 +1,5 @@ module Spec module Matchers - - class Eql #:nodoc: - def initialize(expected) - @expected = expected - end - - def matches?(actual) - @actual = actual - @actual.eql?(@expected) - end - - def failure_message - return "expected #{@expected.inspect}, got #{@actual.inspect} (using .eql?)", @expected, @actual - end - - def negative_failure_message - return "expected #{@actual.inspect} not to equal #{@expected.inspect} (using .eql?)", @expected, @actual - end - - def description - "eql #{@expected.inspect}" - end - end - # :call-seq: # should eql(expected) # should_not eql(expected) @@ -37,7 +13,30 @@ module Spec # 5.should eql(5) # 5.should_not eql(3) def eql(expected) - Matchers::Eql.new(expected) + Matcher.new :eql, expected do |_expected_| + match do |actual| + actual.eql?(_expected_) + end + + failure_message_for_should do |actual| + <<-MESSAGE + +expected #{_expected_.inspect} + got #{actual.inspect} + +(compared using eql?) +MESSAGE + end + + failure_message_for_should_not do |actual| + <<-MESSAGE + +expected #{actual.inspect} not to equal #{_expected_.inspect} + +(compared using eql?) +MESSAGE + end + end end end end diff --git a/vendor/plugins/rspec/lib/spec/matchers/equal.rb b/vendor/plugins/rspec/lib/spec/matchers/equal.rb index 4bfc74951..3580a95af 100644 --- a/vendor/plugins/rspec/lib/spec/matchers/equal.rb +++ b/vendor/plugins/rspec/lib/spec/matchers/equal.rb @@ -1,29 +1,6 @@ module Spec module Matchers - - class Equal #:nodoc: - def initialize(expected) - @expected = expected - end - - def matches?(actual) - @actual = actual - @actual.equal?(@expected) - end - - def failure_message - return "expected #{@expected.inspect}, got #{@actual.inspect} (using .equal?)", @expected, @actual - end - def negative_failure_message - return "expected #{@actual.inspect} not to equal #{@expected.inspect} (using .equal?)", @expected, @actual - end - - def description - "equal #{@expected.inspect}" - end - end - # :call-seq: # should equal(expected) # should_not equal(expected) @@ -37,7 +14,40 @@ module Spec # 5.should equal(5) #Fixnums are equal # "5".should_not equal("5") #Strings that look the same are not the same object def equal(expected) - Matchers::Equal.new(expected) + Matcher.new :equal, expected do |_expected_| + match do |actual| + actual.equal?(_expected_) + end + + def inspect_object(o) + "#<#{o.class}:#{o.object_id}> => #{o.inspect}" + end + + failure_message_for_should do |actual| + <<-MESSAGE + +expected #{inspect_object(_expected_)} + got #{inspect_object(actual)} + +Compared using equal?, which compares object identity, +but expected and actual are not the same object. Use +'actual.should == expected' if you don't care about +object identity in this example. + +MESSAGE + end + + failure_message_for_should_not do |actual| + <<-MESSAGE + +expected not #{inspect_object(actual)} + got #{inspect_object(_expected_)} + +Compared using equal?, which compares object identity. + +MESSAGE + end + end end end end diff --git a/vendor/plugins/rspec/lib/spec/matchers/exist.rb b/vendor/plugins/rspec/lib/spec/matchers/exist.rb index a5a911132..dc69c683d 100644 --- a/vendor/plugins/rspec/lib/spec/matchers/exist.rb +++ b/vendor/plugins/rspec/lib/spec/matchers/exist.rb @@ -1,17 +1,16 @@ module Spec module Matchers - class Exist - def matches? actual - @actual = actual - @actual.exist? - end - def failure_message - "expected #{@actual.inspect} to exist, but it doesn't." - end - def negative_failure_message - "expected #{@actual.inspect} to not exist, but it does." + # :call-seq: + # should exist + # should_not exist + # + # Passes if actual.exist? + def exist(arg=nil) + Matcher.new :exist do + match do |actual| + arg ? actual.exist?(arg) : actual.exist? + end end end - def exist; Exist.new; end end end diff --git a/vendor/plugins/rspec/lib/spec/matchers/has.rb b/vendor/plugins/rspec/lib/spec/matchers/has.rb index 60199f54d..7073e0a86 100644 --- a/vendor/plugins/rspec/lib/spec/matchers/has.rb +++ b/vendor/plugins/rspec/lib/spec/matchers/has.rb @@ -1,34 +1,35 @@ module Spec module Matchers - class Has #:nodoc: - def initialize(sym, *args) - @sym = sym - @args = args + class Has + + def initialize(expected, *args) + @expected, @args = expected, args end - def matches?(target) - target.send(predicate, *@args) + def matches?(actual) + actual.__send__(predicate(@expected), *@args) end - def failure_message - "expected ##{predicate}(#{@args[0].inspect}) to return true, got false" + def failure_message_for_should + "expected ##{predicate(@expected)}(#{@args[0].inspect}) to return true, got false" end - def negative_failure_message - "expected ##{predicate}(#{@args[0].inspect}) to return false, got true" + def failure_message_for_should_not + "expected ##{predicate(@expected)}(#{@args[0].inspect}) to return false, got true" end def description "have key #{@args[0].inspect}" end + + private + + def predicate(sym) + "#{sym.to_s.sub("have_","has_")}?".to_sym + end - private - def predicate - "#{@sym.to_s.sub("have_","has_")}?".to_sym - end - end - + end end diff --git a/vendor/plugins/rspec/lib/spec/matchers/have.rb b/vendor/plugins/rspec/lib/spec/matchers/have.rb index 47454e3be..2975ee129 100644 --- a/vendor/plugins/rspec/lib/spec/matchers/have.rb +++ b/vendor/plugins/rspec/lib/spec/matchers/have.rb @@ -1,10 +1,10 @@ module Spec module Matchers - class Have #:nodoc: def initialize(expected, relativity=:exactly) @expected = (expected == :no ? 0 : expected) @relativity = relativity + @actual = nil end def relativities @@ -15,23 +15,15 @@ module Spec } end - def method_missing(sym, *args, &block) - @collection_name = sym - @plural_collection_name = Inflector.pluralize(sym.to_s) if Object.const_defined?(:Inflector) - @args = args - @block = block - self - end - def matches?(collection_owner) if collection_owner.respond_to?(@collection_name) - collection = collection_owner.send(@collection_name, *@args, &@block) + collection = collection_owner.__send__(@collection_name, *@args, &@block) elsif (@plural_collection_name && collection_owner.respond_to?(@plural_collection_name)) - collection = collection_owner.send(@plural_collection_name, *@args, &@block) + collection = collection_owner.__send__(@plural_collection_name, *@args, &@block) elsif (collection_owner.respond_to?(:length) || collection_owner.respond_to?(:size)) collection = collection_owner else - collection_owner.send(@collection_name, *@args, &@block) + collection_owner.__send__(@collection_name, *@args, &@block) end @actual = collection.size if collection.respond_to?(:size) @actual = collection.length if collection.respond_to?(:length) @@ -45,11 +37,11 @@ module Spec "expected #{@collection_name} to be a collection but it does not respond to #length or #size" end - def failure_message + def failure_message_for_should "expected #{relative_expectation} #{@collection_name}, got #{@actual}" end - def negative_failure_message + def failure_message_for_should_not if @relativity == :exactly return "expected target not to have #{@expected} #{@collection_name}, got #{@actual}" elsif @relativity == :at_most @@ -75,8 +67,22 @@ EOF "have #{relative_expectation} #{@collection_name}" end + def respond_to?(sym) + @expected.respond_to?(sym) || super + end + private + def method_missing(sym, *args, &block) + @collection_name = sym + if inflector = (defined?(ActiveSupport::Inflector) ? ActiveSupport::Inflector : (defined?(Inflector) ? Inflector : nil)) + @plural_collection_name = inflector.pluralize(sym.to_s) + end + @args = args + @block = block + self + end + def relative_expectation "#{relativities[@relativity]}#{@expected}" end diff --git a/vendor/plugins/rspec/lib/spec/matchers/include.rb b/vendor/plugins/rspec/lib/spec/matchers/include.rb index 5476f97d8..a2a7fe3db 100644 --- a/vendor/plugins/rspec/lib/spec/matchers/include.rb +++ b/vendor/plugins/rspec/lib/spec/matchers/include.rb @@ -1,52 +1,5 @@ module Spec module Matchers - - class Include #:nodoc: - - def initialize(*expecteds) - @expecteds = expecteds - end - - def matches?(actual) - @actual = actual - @expecteds.each do |expected| - return false unless actual.include?(expected) - end - true - end - - def failure_message - _message - end - - def negative_failure_message - _message("not ") - end - - def description - "include #{_pretty_print(@expecteds)}" - end - - private - def _message(maybe_not="") - "expected #{@actual.inspect} #{maybe_not}to include #{_pretty_print(@expecteds)}" - end - - def _pretty_print(array) - result = "" - array.each_with_index do |item, index| - if index < (array.length - 2) - result << "#{item.inspect}, " - elsif index < (array.length - 1) - result << "#{item.inspect} and " - else - result << "#{item.inspect}" - end - end - result - end - end - # :call-seq: # should include(expected) # should_not include(expected) @@ -64,7 +17,28 @@ module Spec # "spread".should include("read") # "spread".should_not include("red") def include(*expected) - Matchers::Include.new(*expected) + Matcher.new :include, *expected do |*_expected_| + match do |actual| + helper(actual, *_expected_) + end + + def helper(actual, *_expected_) + _expected_.each do |expected| + if actual.is_a?(Hash) + if expected.is_a?(Hash) + expected.each_pair do |k,v| + return false unless actual[k] == v + end + else + return false unless actual.has_key?(expected) + end + else + return false unless actual.include?(expected) + end + end + true + end + end end end end diff --git a/vendor/plugins/rspec/lib/spec/matchers/match.rb b/vendor/plugins/rspec/lib/spec/matchers/match.rb index 61ab52429..b4b9ea864 100644 --- a/vendor/plugins/rspec/lib/spec/matchers/match.rb +++ b/vendor/plugins/rspec/lib/spec/matchers/match.rb @@ -1,41 +1,21 @@ module Spec module Matchers - - class Match #:nodoc: - def initialize(expected) - @expected = expected - end - - def matches?(actual) - @actual = actual - return true if actual =~ @expected - return false - end - - def failure_message - return "expected #{@actual.inspect} to match #{@expected.inspect}", @expected, @actual - end - - def negative_failure_message - return "expected #{@actual.inspect} not to match #{@expected.inspect}", @expected, @actual - end - - def description - "match #{@expected.inspect}" - end - end - # :call-seq: - # should match(regexp) - # should_not match(regexp) + # should match(pattern) + # should_not match(pattern) # - # Given a Regexp, passes if actual =~ regexp + # Given a Regexp or String, passes if actual.match(pattern) # # == Examples # - # email.should match(/^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i) - def match(regexp) - Matchers::Match.new(regexp) + # email.should match(/^([^\s]+)((?:[-a-z0-9]+\.)+[a-z]{2,})$/i) + # email.should match("@example.com") + def match(expected) + Matcher.new :match, expected do |_expected_| + match do |actual| + actual.match(_expected_) + end + end end end end diff --git a/vendor/plugins/rspec/lib/spec/matchers/operator_matcher.rb b/vendor/plugins/rspec/lib/spec/matchers/operator_matcher.rb index dd23a0994..30295be01 100755..100644 --- a/vendor/plugins/rspec/lib/spec/matchers/operator_matcher.rb +++ b/vendor/plugins/rspec/lib/spec/matchers/operator_matcher.rb @@ -1,70 +1,75 @@ module Spec module Matchers - class BaseOperatorMatcher - attr_reader :generated_description - - def initialize(target) - @target = target - end - def ==(expected) - @expected = expected - __delegate_method_missing_to_target("==", expected) - end + class OperatorMatcher + class << self + def registry + @registry ||= {} + end - def ===(expected) - @expected = expected - __delegate_method_missing_to_target("===", expected) - end + def register(klass, operator, matcher) + registry[klass] ||= {} + registry[klass][operator] = matcher + end - def =~(expected) - @expected = expected - __delegate_method_missing_to_target("=~", expected) + def get(klass, operator) + registry[klass] && registry[klass][operator] + end end - def >(expected) - @expected = expected - __delegate_method_missing_to_target(">", expected) + def initialize(actual) + @actual = actual end - def >=(expected) - @expected = expected - __delegate_method_missing_to_target(">=", expected) + def self.use_custom_matcher_or_delegate(operator) + define_method(operator) do |expected| + if matcher = OperatorMatcher.get(@actual.class, operator) + @actual.send(::Spec::Matchers.last_should, matcher.new(expected)) + else + eval_match(@actual, operator, expected) + end + end end - def <(expected) - @expected = expected - __delegate_method_missing_to_target("<", expected) + ['==', '===', '=~', '>', '>=', '<', '<='].each do |operator| + use_custom_matcher_or_delegate operator end - def <=(expected) - @expected = expected - __delegate_method_missing_to_target("<=", expected) + def fail_with_message(message) + Spec::Expectations.fail_with(message, @expected, @actual) end - def fail_with_message(message) - Spec::Expectations.fail_with(message, @expected, @target) + def description + "#{@operator} #{@expected.inspect}" + end + + private + + def eval_match(actual, operator, expected) + ::Spec::Matchers.last_matcher = self + @operator, @expected = operator, expected + __delegate_operator(actual, operator, expected) end end - class PositiveOperatorMatcher < BaseOperatorMatcher #:nodoc: - - def __delegate_method_missing_to_target(operator, expected) - ::Spec::Matchers.generated_description = "should #{operator} #{expected.inspect}" - return if @target.send(operator, expected) - return fail_with_message("expected: #{expected.inspect},\n got: #{@target.inspect} (using #{operator})") if ['==','===', '=~'].include?(operator) - return fail_with_message("expected: #{operator} #{expected.inspect},\n got: #{operator.gsub(/./, ' ')} #{@target.inspect}") + class PositiveOperatorMatcher < OperatorMatcher #:nodoc: + def __delegate_operator(actual, operator, expected) + if actual.__send__(operator, expected) + true + elsif ['==','===', '=~'].include?(operator) + fail_with_message("expected: #{expected.inspect},\n got: #{actual.inspect} (using #{operator})") + else + fail_with_message("expected: #{operator} #{expected.inspect},\n got: #{operator.gsub(/./, ' ')} #{actual.inspect}") + end end end - class NegativeOperatorMatcher < BaseOperatorMatcher #:nodoc: - - def __delegate_method_missing_to_target(operator, expected) - ::Spec::Matchers.generated_description = "should not #{operator} #{expected.inspect}" - return unless @target.send(operator, expected) - return fail_with_message("expected not: #{operator} #{expected.inspect},\n got: #{operator.gsub(/./, ' ')} #{@target.inspect}") + class NegativeOperatorMatcher < OperatorMatcher #:nodoc: + def __delegate_operator(actual, operator, expected) + return false unless actual.__send__(operator, expected) + return fail_with_message("expected not: #{operator} #{expected.inspect},\n got: #{operator.gsub(/./, ' ')} #{actual.inspect}") end end diff --git a/vendor/plugins/rspec/lib/spec/matchers/raise_error.rb b/vendor/plugins/rspec/lib/spec/matchers/raise_error.rb index c003849b6..65bdf2370 100644 --- a/vendor/plugins/rspec/lib/spec/matchers/raise_error.rb +++ b/vendor/plugins/rspec/lib/spec/matchers/raise_error.rb @@ -1,23 +1,24 @@ module Spec module Matchers class RaiseError #:nodoc: - def initialize(error_or_message=Exception, message=nil, &block) + def initialize(expected_error_or_message=Exception, expected_message=nil, &block) @block = block - case error_or_message + @actual_error = nil + case expected_error_or_message when String, Regexp - @expected_error, @expected_message = Exception, error_or_message + @expected_error, @expected_message = Exception, expected_error_or_message else - @expected_error, @expected_message = error_or_message, message + @expected_error, @expected_message = expected_error_or_message, expected_message end end - def matches?(proc) + def matches?(given_proc) @raised_expected_error = false @with_expected_message = false @eval_block = false @eval_block_passed = false begin - proc.call + given_proc.call rescue @expected_error => @actual_error @raised_expected_error = true @with_expected_message = verify_message @@ -31,7 +32,7 @@ module Spec eval_block if @raised_expected_error && @with_expected_message && @block end ensure - return (@raised_expected_error && @with_expected_message) ? (@eval_block ? @eval_block_passed : true) : false + return (@raised_expected_error & @with_expected_message) ? (@eval_block ? @eval_block_passed : true) : false end def eval_block @@ -47,24 +48,20 @@ module Spec def verify_message case @expected_message when nil - return true + true when Regexp - return @expected_message =~ @actual_error.message + @expected_message =~ @actual_error.message else - return @expected_message == @actual_error.message + @expected_message == @actual_error.message end end - def failure_message - if @eval_block - return @actual_error.message - else - return "expected #{expected_error}#{actual_error}" - end + def failure_message_for_should + @eval_block ? @actual_error.message : "expected #{expected_error}#{given_error}" end - def negative_failure_message - "expected no #{expected_error}#{actual_error}" + def failure_message_for_should_not + "expected no #{expected_error}#{given_error}" end def description @@ -83,7 +80,7 @@ module Spec end end - def actual_error + def given_error @actual_error.nil? ? " but nothing was raised" : ", got #{@actual_error.inspect}" end diff --git a/vendor/plugins/rspec/lib/spec/matchers/respond_to.rb b/vendor/plugins/rspec/lib/spec/matchers/respond_to.rb index 3d23422aa..9161cb94e 100644 --- a/vendor/plugins/rspec/lib/spec/matchers/respond_to.rb +++ b/vendor/plugins/rspec/lib/spec/matchers/respond_to.rb @@ -4,28 +4,54 @@ module Spec class RespondTo #:nodoc: def initialize(*names) @names = names + @expected_arity = nil @names_not_responded_to = [] end - def matches?(target) + def matches?(actual) + @actual = actual @names.each do |name| - unless target.respond_to?(name) - @names_not_responded_to << name - end + @names_not_responded_to << name unless actual.respond_to?(name) && matches_arity?(actual, name) end return @names_not_responded_to.empty? end - def failure_message - "expected target to respond to #{@names_not_responded_to.collect {|name| name.inspect }.join(', ')}" + def failure_message_for_should + "expected #{@actual.inspect} to respond to #{@names_not_responded_to.collect {|name| name.inspect }.join(', ')}#{with_arity}" end - def negative_failure_message - "expected target not to respond to #{@names.collect {|name| name.inspect }.join(', ')}" + def failure_message_for_should_not + "expected #{@actual.inspect} not to respond to #{@names.collect {|name| name.inspect }.join(', ')}" end def description - "respond to ##{@names.to_s}" + "respond to #{pp_names}#{with_arity}" + end + + def with(n) + @expected_arity = n + self + end + + def argument + self + end + alias :arguments :argument + + private + + def matches_arity?(actual, name) + @expected_arity.nil?? true : @expected_arity == actual.method(name).arity + end + + def with_arity + @expected_arity.nil?? "" : + " with #{@expected_arity} argument#{@expected_arity == 1 ? '' : 's'}" + end + + def pp_names + # Ruby 1.9 returns the same thing for array.to_s as array.inspect, so just use array.inspect here + @names.length == 1 ? "##{@names.first}" : @names.inspect end end diff --git a/vendor/plugins/rspec/lib/spec/matchers/satisfy.rb b/vendor/plugins/rspec/lib/spec/matchers/satisfy.rb index 6c0ca95bc..58e3f56aa 100644 --- a/vendor/plugins/rspec/lib/spec/matchers/satisfy.rb +++ b/vendor/plugins/rspec/lib/spec/matchers/satisfy.rb @@ -12,11 +12,11 @@ module Spec @block.call(actual) end - def failure_message + def failure_message_for_should "expected #{@actual} to satisfy block" end - def negative_failure_message + def failure_message_for_should_not "expected #{@actual} not to satisfy block" end end diff --git a/vendor/plugins/rspec/lib/spec/matchers/simple_matcher.rb b/vendor/plugins/rspec/lib/spec/matchers/simple_matcher.rb index ac547d06a..5ab7f3068 100644 --- a/vendor/plugins/rspec/lib/spec/matchers/simple_matcher.rb +++ b/vendor/plugins/rspec/lib/spec/matchers/simple_matcher.rb @@ -1,29 +1,133 @@ module Spec module Matchers class SimpleMatcher - attr_reader :description + attr_writer :failure_message, :negative_failure_message, :description def initialize(description, &match_block) @description = description @match_block = match_block + @failure_message = @negative_failure_message = nil end - def matches?(actual) - @actual = actual - return @match_block.call(@actual) + def matches?(given) + @given = given + case @match_block.arity + when 2 + @match_block.call(@given, self) + else + @match_block.call(@given) + end + end + + def description + @description || explanation end - def failure_message() - return %[expected #{@description.inspect} but got #{@actual.inspect}] + def failure_message_for_should + @failure_message || (@description.nil? ? explanation : %[expected #{@description.inspect} but got #{@given.inspect}]) end - - def negative_failure_message() - return %[expected not to get #{@description.inspect}, but got #{@actual.inspect}] + + def failure_message_for_should_not + @negative_failure_message || (@description.nil? ? explanation : %[expected not to get #{@description.inspect}, but got #{@given.inspect}]) + end + + def explanation + "No description provided. See RDoc for simple_matcher()" end end - - def simple_matcher(message, &match_block) - SimpleMatcher.new(message, &match_block) + + # simple_matcher makes it easy for you to create your own custom matchers + # in just a few lines of code when you don't need all the power of a + # completely custom matcher object. + # + # The <tt>description</tt> argument will appear as part of any failure + # message, and is also the source for auto-generated descriptions. + # + # The <tt>match_block</tt> can have an arity of 1 or 2. The first block + # argument will be the given value. The second, if the block accepts it + # will be the matcher itself, giving you access to set custom failure + # messages in favor of the defaults. + # + # The <tt>match_block</tt> should return a boolean: <tt>true</tt> + # indicates a match, which will pass if you use <tt>should</tt> and fail + # if you use <tt>should_not</tt>. false (or nil) indicates no match, + # which will do the reverse: fail if you use <tt>should</tt> and pass if + # you use <tt>should_not</tt>. + # + # An error in the <tt>match_block</tt> will bubble up, resulting in a + # failure. + # + # == Example with default messages + # + # def be_even + # simple_matcher("an even number") { |given| given % 2 == 0 } + # end + # + # describe 2 do + # it "should be even" do + # 2.should be_even + # end + # end + # + # Given an odd number, this example would produce an error message stating: + # expected "an even number", got 3. + # + # Unfortunately, if you're a fan of auto-generated descriptions, this will + # produce "should an even number." Not the most desirable result. You can + # control that using custom messages: + # + # == Example with custom messages + # + # def rhyme_with(expected) + # simple_matcher("rhyme with #{expected.inspect}") do |given, matcher| + # matcher.failure_message = "expected #{given.inspect} to rhyme with #{expected.inspect}" + # matcher.negative_failure_message = "expected #{given.inspect} not to rhyme with #{expected.inspect}" + # given.rhymes_with? expected + # end + # end + # + # # OR + # + # def rhyme_with(expected) + # simple_matcher do |given, matcher| + # matcher.description = "rhyme with #{expected.inspect}" + # matcher.failure_message = "expected #{given.inspect} to rhyme with #{expected.inspect}" + # matcher.negative_failure_message = "expected #{given.inspect} not to rhyme with #{expected.inspect}" + # given.rhymes_with? expected + # end + # end + # + # describe "pecan" do + # it "should rhyme with 'be gone'" do + # nut = "pecan" + # nut.extend Rhymer + # nut.should rhyme_with("be gone") + # end + # end + # + # The resulting messages would be: + # description: rhyme with "be gone" + # failure_message: expected "pecan" to rhyme with "be gone" + # negative failure_message: expected "pecan" not to rhyme with "be gone" + # + # == Wrapped Expectations + # + # Because errors will bubble up, it is possible to wrap other expectations + # in a SimpleMatcher. + # + # def be_even + # simple_matcher("an even number") { |given| (given % 2).should == 0 } + # end + # + # BE VERY CAREFUL when you do this. Only use wrapped expectations for + # matchers that will always be used in only the positive + # (<tt>should</tt>) or negative (<tt>should_not</tt>), but not both. + # The reason is that is you wrap a <tt>should</tt> and call the wrapper + # with <tt>should_not</tt>, the correct result (the <tt>should</tt> + # failing), will fail when you want it to pass. + # + def simple_matcher(description=nil, &match_block) + SimpleMatcher.new(description, &match_block) end end end
\ No newline at end of file diff --git a/vendor/plugins/rspec/lib/spec/matchers/throw_symbol.rb b/vendor/plugins/rspec/lib/spec/matchers/throw_symbol.rb index c74d84436..da16bb654 100644 --- a/vendor/plugins/rspec/lib/spec/matchers/throw_symbol.rb +++ b/vendor/plugins/rspec/lib/spec/matchers/throw_symbol.rb @@ -2,39 +2,58 @@ module Spec module Matchers class ThrowSymbol #:nodoc: - def initialize(expected=nil) - @expected = expected - @actual = nil + def initialize(expected_symbol = nil, expected_arg=nil) + @expected_symbol = expected_symbol + @expected_arg = expected_arg + @caught_symbol = @caught_arg = nil end - def matches?(proc) + def matches?(given_proc) begin - proc.call - rescue NameError => e - raise e unless e.message =~ /uncaught throw/ - @actual = e.name.to_sym + if @expected_symbol.nil? + given_proc.call + else + @caught_arg = catch :proc_did_not_throw_anything do + catch @expected_symbol do + given_proc.call + throw :proc_did_not_throw_anything, :nothing_thrown + end + end + @caught_symbol = @expected_symbol unless @caught_arg == :nothing_thrown + end + + # Ruby 1.8 uses NameError with `symbol' + # Ruby 1.9 uses ArgumentError with :symbol + rescue NameError, ArgumentError => e + raise e unless e.message =~ /uncaught throw (`|\:)([a-zA-Z0-9_]*)(')?/ + @caught_symbol = $2.to_sym + ensure - if @expected.nil? - return @actual.nil? ? false : true + if @expected_symbol.nil? + return !@caught_symbol.nil? else - return @actual == @expected + if @expected_arg.nil? + return @caught_symbol == @expected_symbol + else + return (@caught_symbol == @expected_symbol) & (@caught_arg == @expected_arg) + end end end end - def failure_message - if @actual - "expected #{expected}, got #{@actual.inspect}" + def failure_message_for_should + if @caught_symbol + "expected #{expected}, got #{@caught_symbol.inspect}" else "expected #{expected} but nothing was thrown" end end - def negative_failure_message - if @expected + def failure_message_for_should_not + if @expected_symbol "expected #{expected} not to be thrown" else - "expected no Symbol, got :#{@actual}" + "expected no Symbol, got :#{@caught_symbol}" end end @@ -45,7 +64,11 @@ module Spec private def expected - @expected.nil? ? "a Symbol" : @expected.inspect + @expected_symbol.nil? ? "a Symbol" : "#{@expected_symbol.inspect}#{args}" + end + + def args + @expected_arg.nil? ? "" : " with #{@expected_arg.inspect}" end end @@ -53,20 +76,27 @@ module Spec # :call-seq: # should throw_symbol() # should throw_symbol(:sym) + # should throw_symbol(:sym, arg) # should_not throw_symbol() # should_not throw_symbol(:sym) - # - # Given a Symbol argument, matches if a proc throws the specified Symbol. + # should_not throw_symbol(:sym, arg) # # Given no argument, matches if a proc throws any Symbol. # + # Given a Symbol, matches if the given proc throws the specified Symbol. + # + # Given a Symbol and an arg, matches if the given proc throws the + # specified Symbol with the specified arg. + # # == Examples # # lambda { do_something_risky }.should throw_symbol # lambda { do_something_risky }.should throw_symbol(:that_was_risky) + # lambda { do_something_risky }.should throw_symbol(:that_was_risky, culprit) # # lambda { do_something_risky }.should_not throw_symbol # lambda { do_something_risky }.should_not throw_symbol(:that_was_risky) + # lambda { do_something_risky }.should_not throw_symbol(:that_was_risky, culprit) def throw_symbol(sym=nil) Matchers::ThrowSymbol.new(sym) end diff --git a/vendor/plugins/rspec/lib/spec/mocks.rb b/vendor/plugins/rspec/lib/spec/mocks.rb index 678dd6aae..339c0cc50 100644 --- a/vendor/plugins/rspec/lib/spec/mocks.rb +++ b/vendor/plugins/rspec/lib/spec/mocks.rb @@ -1,16 +1,5 @@ require 'spec/mocks/framework' -require 'spec/mocks/methods' -require 'spec/mocks/argument_constraint_matchers' -require 'spec/mocks/spec_methods' -require 'spec/mocks/proxy' -require 'spec/mocks/mock' -require 'spec/mocks/argument_expectation' -require 'spec/mocks/message_expectation' -require 'spec/mocks/order_group' -require 'spec/mocks/errors' -require 'spec/mocks/error_generator' require 'spec/mocks/extensions/object' -require 'spec/mocks/space' module Spec # == Mocks and Stubs @@ -116,11 +105,11 @@ module Spec # my_mock.should_receive(:sym).with(*args) # my_mock.should_not_receive(:sym).with(*args) # - # == Argument Constraints using Expression Matchers + # == Argument Matchers # # Arguments that are passed to #with are compared with actual arguments received # using == by default. In cases in which you want to specify things about the arguments - # rather than the arguments themselves, you can use any of the Expression Matchers. + # rather than the arguments themselves, you can use any of RSpec's Expression Matchers. # They don't all make syntactic sense (they were primarily designed for use with # Spec::Expectations), but you are free to create your own custom Spec::Matchers. # @@ -131,7 +120,7 @@ module Spec # # my_mock.should_receive(:sym).with(no_args()) # my_mock.should_receive(:sym).with(any_args()) - # my_mock.should_receive(:sym).with(1, an_instance_of(Numeric), "b") #2nd argument can any type of Numeric + # my_mock.should_receive(:sym).with(1, kind_of(Numeric), "b") #2nd argument can any kind of Numeric # my_mock.should_receive(:sym).with(1, boolean(), "b") #2nd argument can true or false # my_mock.should_receive(:sym).with(1, /abc/, "b") #2nd argument can be any String matching the submitted Regexp # my_mock.should_receive(:sym).with(1, anything(), "b") #2nd argument can be anything at all diff --git a/vendor/plugins/rspec/lib/spec/mocks/argument_constraint_matchers.rb b/vendor/plugins/rspec/lib/spec/mocks/argument_constraint_matchers.rb deleted file mode 100644 index 96ccf0f4a..000000000 --- a/vendor/plugins/rspec/lib/spec/mocks/argument_constraint_matchers.rb +++ /dev/null @@ -1,31 +0,0 @@ -module Spec - module Mocks - module ArgumentConstraintMatchers - - # Shortcut for creating an instance of Spec::Mocks::DuckTypeArgConstraint - def duck_type(*args) - DuckTypeArgConstraint.new(*args) - end - - def any_args - AnyArgsConstraint.new - end - - def anything - AnyArgConstraint.new(nil) - end - - def boolean - BooleanArgConstraint.new(nil) - end - - def hash_including(expected={}) - HashIncludingConstraint.new(expected) - end - - def no_args - NoArgsConstraint.new - end - end - end -end diff --git a/vendor/plugins/rspec/lib/spec/mocks/argument_expectation.rb b/vendor/plugins/rspec/lib/spec/mocks/argument_expectation.rb index b3fdcc80d..b51b7bae5 100644 --- a/vendor/plugins/rspec/lib/spec/mocks/argument_expectation.rb +++ b/vendor/plugins/rspec/lib/spec/mocks/argument_expectation.rb @@ -1,208 +1,50 @@ module Spec module Mocks - - class MatcherConstraint - def initialize(matcher) - @matcher = matcher - end - - def matches?(value) - @matcher.matches?(value) - end - end - - class LiteralArgConstraint - def initialize(literal) - @literal_value = literal - end - - def matches?(value) - @literal_value == value - end - end - - class RegexpArgConstraint - def initialize(regexp) - @regexp = regexp - end - - def matches?(value) - return value =~ @regexp unless value.is_a?(Regexp) - value == @regexp - end - end - - class AnyArgConstraint - def initialize(ignore) - end - - def ==(other) - true - end - - # TODO - need this? - def matches?(value) - true - end - end - - class AnyArgsConstraint - def description - "any args" - end - end - - class NoArgsConstraint - def description - "no args" - end - - def ==(args) - args == [] - end - end - - class NumericArgConstraint - def initialize(ignore) - end - - def matches?(value) - value.is_a?(Numeric) - end - end - class BooleanArgConstraint - def initialize(ignore) - end - - def ==(value) - matches?(value) - end - - def matches?(value) - return true if value.is_a?(TrueClass) - return true if value.is_a?(FalseClass) - false - end - end - - class StringArgConstraint - def initialize(ignore) - end - - def matches?(value) - value.is_a?(String) - end - end - - class DuckTypeArgConstraint - def initialize(*methods_to_respond_to) - @methods_to_respond_to = methods_to_respond_to - end - - def matches?(value) - @methods_to_respond_to.all? { |sym| value.respond_to?(sym) } - end - - def description - "duck_type" - end - end - - class HashIncludingConstraint - def initialize(expected) - @expected = expected - end - - def ==(actual) - @expected.each do | key, value | - # check key for case that value evaluates to nil - return false unless actual.has_key?(key) && actual[key] == value - end - true - rescue NoMethodError => ex - return false - end - - def matches?(value) - self == value - end - - def description - "hash_including(#{@expected.inspect.sub(/^\{/,"").sub(/\}$/,"")})" - end - - end - - class ArgumentExpectation attr_reader :args - @@constraint_classes = Hash.new { |hash, key| LiteralArgConstraint} - @@constraint_classes[:anything] = AnyArgConstraint - @@constraint_classes[:numeric] = NumericArgConstraint - @@constraint_classes[:boolean] = BooleanArgConstraint - @@constraint_classes[:string] = StringArgConstraint - def initialize(args) + def initialize(args, &block) @args = args - if [:any_args] == args - @expected_params = nil - warn_deprecated(:any_args.inspect, "any_args()") - elsif args.length == 1 && args[0].is_a?(AnyArgsConstraint) then @expected_params = nil - elsif [:no_args] == args - @expected_params = [] - warn_deprecated(:no_args.inspect, "no_args()") - elsif args.length == 1 && args[0].is_a?(NoArgsConstraint) then @expected_params = [] - else @expected_params = process_arg_constraints(args) + @matchers_block = block + @match_any_args = false + @matchers = nil + + if ArgumentMatchers::AnyArgsMatcher === args.first + @match_any_args = true + elsif ArgumentMatchers::NoArgsMatcher === args.first + @matchers = [] + else + @matchers = args.collect {|arg| matcher_for(arg)} end end - def process_arg_constraints(constraints) - constraints.collect do |constraint| - convert_constraint(constraint) - end + def matcher_for(arg) + return ArgumentMatchers::MatcherMatcher.new(arg) if is_matcher?(arg) + return ArgumentMatchers::RegexpMatcher.new(arg) if arg.is_a?(Regexp) + return ArgumentMatchers::EqualityProxy.new(arg) end - def warn_deprecated(deprecated_method, instead) - Kernel.warn "The #{deprecated_method} constraint is deprecated. Use #{instead} instead." + def is_matcher?(obj) + return obj.respond_to?(:matches?) & obj.respond_to?(:description) end - def convert_constraint(constraint) - if [:anything, :numeric, :boolean, :string].include?(constraint) - case constraint - when :anything - instead = "anything()" - when :boolean - instead = "boolean()" - when :numeric - instead = "an_instance_of(Numeric)" - when :string - instead = "an_instance_of(String)" - end - warn_deprecated(constraint.inspect, instead) - return @@constraint_classes[constraint].new(constraint) - end - return MatcherConstraint.new(constraint) if is_matcher?(constraint) - return RegexpArgConstraint.new(constraint) if constraint.is_a?(Regexp) - return LiteralArgConstraint.new(constraint) + def args_match?(given_args) + match_any_args? || matchers_block_matches?(given_args) || matchers_match?(given_args) end - def is_matcher?(obj) - return obj.respond_to?(:matches?) && obj.respond_to?(:description) + def matchers_block_matches?(given_args) + @matchers_block ? @matchers_block.call(*given_args) : nil end - def check_args(args) - return true if @expected_params.nil? - return true if @expected_params == args - return constraints_match?(args) + def matchers_match?(given_args) + @matchers == given_args end - def constraints_match?(args) - return false if args.length != @expected_params.length - @expected_params.each_index { |i| return false unless @expected_params[i].matches?(args[i]) } - return true + def match_any_args? + @match_any_args end - + end end diff --git a/vendor/plugins/rspec/lib/spec/mocks/error_generator.rb b/vendor/plugins/rspec/lib/spec/mocks/error_generator.rb index 01d8f720d..f63811fed 100644 --- a/vendor/plugins/rspec/lib/spec/mocks/error_generator.rb +++ b/vendor/plugins/rspec/lib/spec/mocks/error_generator.rb @@ -3,7 +3,8 @@ module Spec class ErrorGenerator attr_writer :opts - def initialize(target, name) + def initialize(target, name, options={}) + @declared_as = options[:__declared_as] || 'Mock' @target = target @name = name end @@ -19,7 +20,7 @@ module Spec def raise_unexpected_message_args_error(expectation, *args) expected_args = format_args(*expectation.expected_args) actual_args = args.empty? ? "(no args)" : format_args(*args) - __raise "#{intro} expected #{expectation.sym.inspect} with #{expected_args} but received it with #{actual_args}" + __raise "#{intro} received #{expectation.sym.inspect} with unexpected arguments\n expected: #{expected_args}\n got: #{actual_args}" end def raise_expectation_error(sym, expected_received_count, actual_received_count, *args) @@ -42,9 +43,20 @@ module Spec __raise "#{intro} yielded |#{arg_list(*args_to_yield)}| to block with arity of #{arity}" end - private + private + def intro - @name ? "Mock '#{@name}'" : @target.inspect + if @name + "#{@declared_as} #{@name.inspect}" + elsif Mock === @target + @declared_as + elsif Class === @target + "<#{@target.inspect} (class)>" + elsif @target + @target + else + "nil" + end end def __raise(message) @@ -57,15 +69,11 @@ module Spec end def format_args(*args) - return "(no args)" if args.empty? || args == [:no_args] - return "(any args)" if args == [:any_args] - "(" + arg_list(*args) + ")" + args.empty? ? "(no args)" : "(" + arg_list(*args) + ")" end def arg_list(*args) - args.collect do |arg| - arg.respond_to?(:description) ? arg.description : arg.inspect - end.join(", ") + args.collect {|arg| arg.respond_to?(:description) ? arg.description : arg.inspect}.join(", ") end def count_message(count) diff --git a/vendor/plugins/rspec/lib/spec/mocks/errors.rb b/vendor/plugins/rspec/lib/spec/mocks/errors.rb index 68fdfe006..560b66a93 100644 --- a/vendor/plugins/rspec/lib/spec/mocks/errors.rb +++ b/vendor/plugins/rspec/lib/spec/mocks/errors.rb @@ -1,6 +1,6 @@ module Spec module Mocks - class MockExpectationError < StandardError + class MockExpectationError < Exception end class AmbiguousReturnError < StandardError diff --git a/vendor/plugins/rspec/lib/spec/mocks/framework.rb b/vendor/plugins/rspec/lib/spec/mocks/framework.rb index 92089673a..e25778655 100644 --- a/vendor/plugins/rspec/lib/spec/mocks/framework.rb +++ b/vendor/plugins/rspec/lib/spec/mocks/framework.rb @@ -3,8 +3,8 @@ # object in the system. require 'spec/mocks/methods' -require 'spec/mocks/argument_constraint_matchers' -require 'spec/mocks/spec_methods' +require 'spec/mocks/argument_matchers' +require 'spec/mocks/example_methods' require 'spec/mocks/proxy' require 'spec/mocks/mock' require 'spec/mocks/argument_expectation' diff --git a/vendor/plugins/rspec/lib/spec/mocks/message_expectation.rb b/vendor/plugins/rspec/lib/spec/mocks/message_expectation.rb index 0b10290b3..8a8133f69 100644 --- a/vendor/plugins/rspec/lib/spec/mocks/message_expectation.rb +++ b/vendor/plugins/rspec/lib/spec/mocks/message_expectation.rb @@ -3,17 +3,20 @@ module Spec class BaseExpectation attr_reader :sym + attr_writer :expected_received_count, :method_block, :expected_from + protected :expected_received_count=, :method_block=, :expected_from= + attr_accessor :error_generator + protected :error_generator, :error_generator= - def initialize(error_generator, expectation_ordering, expected_from, sym, method_block, expected_received_count=1, opts={}) + def initialize(error_generator, expectation_ordering, expected_from, sym, method_block, expected_received_count=1, opts={}, &implementation) @error_generator = error_generator @error_generator.opts = opts @expected_from = expected_from @sym = sym @method_block = method_block - @return_block = nil @actual_received_count = 0 @expected_received_count = expected_received_count - @args_expectation = ArgumentExpectation.new([AnyArgsConstraint.new]) + @args_expectation = ArgumentExpectation.new([ArgumentMatchers::AnyArgsMatcher.new]) @consecutive = false @exception_to_raise = nil @symbol_to_throw = nil @@ -21,6 +24,22 @@ module Spec @at_least = nil @at_most = nil @args_to_yield = [] + @failed_fast = nil + @args_to_yield_were_cloned = false + @return_block = implementation + end + + def build_child(expected_from, method_block, expected_received_count, opts={}) + child = clone + child.expected_from = expected_from + child.method_block = method_block + child.expected_received_count = expected_received_count + child.clear_actual_received_count! + new_gen = error_generator.clone + new_gen.opts = opts + child.error_generator = new_gen + child.clone_args_to_yield @args_to_yield + child end def expected_args @@ -39,8 +58,6 @@ module Spec @expected_received_count < values.size end @return_block = block_given? ? return_block : lambda { value } - # Ruby 1.9 - see where this is used below - @ignore_args = !block_given? end # :call-seq: @@ -63,16 +80,22 @@ module Spec end def and_yield(*args) + if @args_to_yield_were_cloned + @args_to_yield.clear + @args_to_yield_were_cloned = false + end + @args_to_yield << args self end - + def matches(sym, args) - @sym == sym and @args_expectation.check_args(args) + @sym == sym and @args_expectation.args_match?(args) end - def invoke(args, block) + def invoke(*args, &block) if @expected_received_count == 0 + @failed_fast = true @actual_received_count += 1 @error_generator.raise_expectation_error @sym, @expected_received_count, @actual_received_count, *args end @@ -85,17 +108,17 @@ module Spec if !@method_block.nil? - default_return_val = invoke_method_block(args) + default_return_val = invoke_method_block(*args) elsif @args_to_yield.size > 0 - default_return_val = invoke_with_yield(block) + default_return_val = invoke_with_yield(&block) else default_return_val = nil end if @consecutive - return invoke_consecutive_return_block(args, block) + return invoke_consecutive_return_block(*args, &block) elsif @return_block - return invoke_return_block(args, block) + return invoke_return_block(*args, &block) else return default_return_val end @@ -103,10 +126,23 @@ module Spec @actual_received_count += 1 end end + + def called_max_times? + @expected_received_count != :any && @expected_received_count > 0 && + @actual_received_count >= @expected_received_count + end + + def invoke_return_block(*args, &block) + args << block unless block.nil? + # Ruby 1.9 - when we set @return_block to return values + # regardless of arguments, any arguments will result in + # a "wrong number of arguments" error + @return_block.arity == 0 ? @return_block.call : @return_block.call(*args) + end protected - def invoke_method_block(args) + def invoke_method_block(*args) begin @method_block.call(*args) rescue => detail @@ -114,7 +150,7 @@ module Spec end end - def invoke_with_yield(block) + def invoke_with_yield(&block) if block.nil? @error_generator.raise_missing_block_error @args_to_yield end @@ -128,35 +164,34 @@ module Spec value end - def invoke_consecutive_return_block(args, block) - args << block unless block.nil? - value = @return_block.call(*args) - + def invoke_consecutive_return_block(*args, &block) + value = invoke_return_block(*args, &block) index = [@actual_received_count, value.size-1].min value[index] end - def invoke_return_block(args, block) - args << block unless block.nil? - # Ruby 1.9 - when we set @return_block to return values - # regardless of arguments, any arguments will result in - # a "wrong number of arguments" error - if @ignore_args - @return_block.call() - else - @return_block.call(*args) - end + def clone_args_to_yield(args) + @args_to_yield = args.clone + @args_to_yield_were_cloned = true + end + + def failed_fast? + @failed_fast end end class MessageExpectation < BaseExpectation + + def matches_name?(sym) + @sym == sym + end def matches_name_but_not_args(sym, args) - @sym == sym and not @args_expectation.check_args(args) + matches_name?(sym) and not @args_expectation.args_match?(args) end - def verify_messages_received - return if expected_messages_received? + def verify_messages_received + return if expected_messages_received? || failed_fast? generate_error rescue Spec::Mocks::MockExpectationError => error @@ -197,13 +232,12 @@ module Spec if similar_messages.empty? @error_generator.raise_expectation_error(@sym, @expected_received_count, @actual_received_count, *@args_expectation.args) else - @error_generator.raise_unexpected_message_args_error(self, *@similar_messages.first) + @error_generator.raise_unexpected_message_args_error(self, *@similar_messages) end end def with(*args, &block) - @method_block = block if block - @args_expectation = ArgumentExpectation.new(args) + @args_expectation = ArgumentExpectation.new(args, &block) self end @@ -274,6 +308,10 @@ module Spec 2 end end + + def clear_actual_received_count! + @actual_received_count = 0 + end end diff --git a/vendor/plugins/rspec/lib/spec/mocks/methods.rb b/vendor/plugins/rspec/lib/spec/mocks/methods.rb index d9fa324d3..16dd6e842 100644 --- a/vendor/plugins/rspec/lib/spec/mocks/methods.rb +++ b/vendor/plugins/rspec/lib/spec/mocks/methods.rb @@ -9,8 +9,50 @@ module Spec __mock_proxy.add_negative_message_expectation(caller(1)[0], sym.to_sym, &block) end - def stub!(sym, opts={}) - __mock_proxy.add_stub(caller(1)[0], sym.to_sym, opts) + def stub!(sym_or_hash, opts={}, &block) + if Hash === sym_or_hash + sym_or_hash.each {|method, value| stub!(method).and_return value } + else + __mock_proxy.add_stub(caller(1)[0], sym_or_hash.to_sym, opts, &block) + end + end + + alias_method :stub, :stub! + + def unstub!(message) + __mock_proxy.remove_stub(message) + end + + alias_method :unstub, :unstub! + + # :call-seq: + # object.stub_chain(:first, :second, :third).and_return(:this) + # + # Supports stubbing a chain of methods. Each argument represents + # a method name to stub, and each one returns a proxy object that + # can accept more stubs, until the last, which returns whatever + # is passed to +and_return_. + # + # == Examples + # + # # with this in an example ... + # article = double('article') + # Article.stub_chain(:authored_by, :published, :recent).and_return([article]) + # # then this will return an Array with the article double in it: + # Article.authored_by(params[:author_id]).published.recent + def stub_chain(*methods) + if methods.length > 1 + if matching_stub = __mock_proxy.find_matching_method_stub(methods[0]) + methods.shift + matching_stub.invoke_return_block.stub_chain(*methods) + else + next_in_chain = Object.new + stub!(methods.shift) {next_in_chain} + next_in_chain.stub_chain(*methods) + end + else + stub!(methods.shift) + end end def received_message?(sym, *args, &block) #:nodoc: @@ -24,6 +66,14 @@ module Spec def rspec_reset #:nodoc: __mock_proxy.reset end + + def as_null_object + __mock_proxy.as_null_object + end + + def null_object? + __mock_proxy.null_object? + end private @@ -31,7 +81,7 @@ module Spec if Mock === self @mock_proxy ||= Proxy.new(self, @name, @options) else - @mock_proxy ||= Proxy.new(self, self.class.name) + @mock_proxy ||= Proxy.new(self) end end end diff --git a/vendor/plugins/rspec/lib/spec/mocks/mock.rb b/vendor/plugins/rspec/lib/spec/mocks/mock.rb index d0b5f204d..35a6c798e 100644 --- a/vendor/plugins/rspec/lib/spec/mocks/mock.rb +++ b/vendor/plugins/rspec/lib/spec/mocks/mock.rb @@ -7,23 +7,37 @@ module Spec # only) == Options: # * <tt>:null_object</tt> - if true, the mock object acts as a forgiving # null object allowing any message to be sent to it. - def initialize(name, stubs_and_options={}) - @name = name - @options = parse_options(stubs_and_options) + def initialize(name=nil, stubs_and_options={}) + if name.is_a?(Hash) && stubs_and_options.empty? + stubs_and_options = name + @name = nil + else + @name = name + end + @options = extract_options(stubs_and_options) assign_stubs(stubs_and_options) end - + # This allows for comparing the mock to other objects that proxy such as - # ActiveRecords belongs_to proxy objects By making the other object run - # the comparison, we're sure the call gets delegated to the proxy target - # This is an unfortunate side effect from ActiveRecord, but this should - # be safe unless the RHS redefines == in a nonsensical manner + # ActiveRecords belongs_to proxy objects. By making the other object run + # the comparison, we're sure the call gets delegated to the proxy + # target. def ==(other) other == __mock_proxy end + def inspect + "#<#{self.class}:#{sprintf '0x%x', self.object_id} @name=#{@name.inspect}>" + end + + def to_s + inspect.gsub('<','[').gsub('>',']') + end + + private + def method_missing(sym, *args, &block) - __mock_proxy.instance_eval {@messages_received << [sym, args, block]} + __mock_proxy.record_message_received(sym, args, block) begin return self if __mock_proxy.null_object? super(sym, *args, &block) @@ -31,22 +45,27 @@ module Spec __mock_proxy.raise_unexpected_message_error sym, *args end end - - def inspect - "#<#{self.class}:#{sprintf '0x%x', self.object_id} @name=#{@name.inspect}>" + + def extract_options(stubs_and_options) + options = {} + extract_option(stubs_and_options, options, :null_object) + extract_option(stubs_and_options, options, :__declared_as, 'Mock') + options end - private - - def parse_options(options) - options.has_key?(:null_object) ? {:null_object => options.delete(:null_object)} : {} + def extract_option(source, target, key, default=nil) + if source[key] + target[key] = source.delete(key) + elsif default + target[key] = default end - - def assign_stubs(stubs) - stubs.each_pair do |message, response| - stub!(message).and_return(response) - end + end + + def assign_stubs(stubs) + stubs.each_pair do |message, response| + stub!(message).and_return(response) end + end end end end diff --git a/vendor/plugins/rspec/lib/spec/mocks/proxy.rb b/vendor/plugins/rspec/lib/spec/mocks/proxy.rb index 45b96a30b..acf72e0f3 100644 --- a/vendor/plugins/rspec/lib/spec/mocks/proxy.rb +++ b/vendor/plugins/rspec/lib/spec/mocks/proxy.rb @@ -4,41 +4,75 @@ module Spec DEFAULT_OPTIONS = { :null_object => false, } + + @@warn_about_expectations_on_nil = true + + def self.allow_message_expectations_on_nil + @@warn_about_expectations_on_nil = false + + # ensure nil.rspec_verify is called even if an expectation is not set in the example + # otherwise the allowance would effect subsequent examples + $rspec_mocks.add(nil) unless $rspec_mocks.nil? + end - def initialize(target, name, options={}) + def initialize(target, name=nil, options={}) @target = target @name = name - @error_generator = ErrorGenerator.new target, name + @error_generator = ErrorGenerator.new target, name, options @expectation_ordering = OrderGroup.new @error_generator @expectations = [] @messages_received = [] @stubs = [] @proxied_methods = [] @options = options ? DEFAULT_OPTIONS.dup.merge(options) : DEFAULT_OPTIONS + @already_proxied_respond_to = false end def null_object? @options[:null_object] end + + def as_null_object + @options[:null_object] = true + @target + end - def add_message_expectation(expected_from, sym, opts={}, &block) + def add_message_expectation(expected_from, sym, opts={}, &block) __add sym - @expectations << MessageExpectation.new(@error_generator, @expectation_ordering, expected_from, sym, block_given? ? block : nil, 1, opts) + warn_if_nil_class sym + if existing_stub = @stubs.detect {|s| s.sym == sym } + expectation = existing_stub.build_child(expected_from, block_given?? block : nil, 1, opts) + else + expectation = MessageExpectation.new(@error_generator, @expectation_ordering, expected_from, sym, block_given? ? block : nil, 1, opts) + end + @expectations << expectation @expectations.last end def add_negative_message_expectation(expected_from, sym, &block) __add sym + warn_if_nil_class sym @expectations << NegativeMessageExpectation.new(@error_generator, @expectation_ordering, expected_from, sym, block_given? ? block : nil) @expectations.last end - def add_stub(expected_from, sym, opts={}) + def add_stub(expected_from, sym, opts={}, &implementation) __add sym - @stubs.unshift MessageExpectation.new(@error_generator, @expectation_ordering, expected_from, sym, nil, :any, opts) + @stubs.unshift MessageExpectation.new(@error_generator, @expectation_ordering, expected_from, sym, nil, :any, opts, &implementation) @stubs.first end + def remove_stub(message) + message = message.to_sym + + if stub_to_remove = @stubs.detect { |s| s.matches_name?(message) } + reset_proxied_method(message) + @stubs.delete(stub_to_remove) + else + raise MockExpectationError, "The method `#{message}` was not stubbed or was already unstubbed" + end + end + def verify #:nodoc: verify_expectations ensure @@ -50,6 +84,7 @@ module Spec clear_stubs reset_proxied_methods clear_proxied_methods + reset_nil_expectations_warning end def received_message?(sym, *args, &block) @@ -59,20 +94,27 @@ module Spec def has_negative_expectation?(sym) @expectations.detect {|expectation| expectation.negative_expectation_for?(sym)} end + + def record_message_received(sym, args, block) + @messages_received << [sym, args, block] + end def message_received(sym, *args, &block) - if expectation = find_matching_expectation(sym, *args) - expectation.invoke(args, block) - elsif (stub = find_matching_method_stub(sym, *args)) + expectation = find_matching_expectation(sym, *args) + stub = find_matching_method_stub(sym, *args) + + if (stub && expectation && expectation.called_max_times?) || (stub && !expectation) if expectation = find_almost_matching_expectation(sym, *args) expectation.advise(args, block) unless expectation.expected_messages_received? end - stub.invoke([], block) + stub.invoke(*args, &block) + elsif expectation + expectation.invoke(*args, &block) elsif expectation = find_almost_matching_expectation(sym, *args) expectation.advise(args, block) if null_object? unless expectation.expected_messages_received? raise_unexpected_message_args_error(expectation, *args) unless (has_negative_expectation?(sym) or null_object?) else - @target.send :method_missing, sym, *args, &block + @target.__send__ :method_missing, sym, *args, &block end end @@ -84,6 +126,10 @@ module Spec @error_generator.raise_unexpected_message_error sym, *args end + def find_matching_method_stub(sym, *args) + @stubs.find {|stub| stub.matches(sym, args)} + end + private def __add(sym) @@ -91,28 +137,35 @@ module Spec define_expected_method(sym) end + def warn_if_nil_class(sym) + if proxy_for_nil_class? & @@warn_about_expectations_on_nil + Kernel.warn("An expectation of :#{sym} was set on nil. Called from #{caller[2]}. Use allow_message_expectations_on_nil to disable warnings.") + end + end + def define_expected_method(sym) - visibility_string = "#{visibility(sym)} :#{sym}" - if target_responds_to?(sym) && !target_metaclass.method_defined?(munge(sym)) - munged_sym = munge(sym) - target_metaclass.instance_eval do - alias_method munged_sym, sym if method_defined?(sym.to_s) + unless @proxied_methods.include?(sym) + visibility_string = "#{visibility(sym)} :#{sym}" + if target_responds_to?(sym) + munged_sym = munge(sym) + target_metaclass.instance_eval do + alias_method munged_sym, sym if method_defined?(sym) + end + @proxied_methods << sym end - @proxied_methods << sym + target_metaclass.class_eval(<<-EOF, __FILE__, __LINE__) + def #{sym}(*args, &block) + __mock_proxy.message_received :#{sym}, *args, &block + end + #{visibility_string} + EOF end - - target_metaclass.class_eval(<<-EOF, __FILE__, __LINE__) - def #{sym}(*args, &block) - __mock_proxy.message_received :#{sym}, *args, &block - end - #{visibility_string} - EOF end def target_responds_to?(sym) - return @target.send(munge(:respond_to?),sym) if @already_proxied_respond_to + return @target.__send__(munge(:respond_to?),sym) if @already_proxied_respond_to return @already_proxied_respond_to = true if sym == :respond_to? - return @target.respond_to?(sym) + return @target.respond_to?(sym, true) end def visibility(sym) @@ -128,7 +181,7 @@ module Spec end def munge(sym) - "proxied_by_rspec__#{sym.to_s}".to_sym + "proxied_by_rspec__#{sym}" end def clear_expectations @@ -155,19 +208,31 @@ module Spec def reset_proxied_methods @proxied_methods.each do |sym| - munged_sym = munge(sym) - target_metaclass.instance_eval do - if method_defined?(munged_sym.to_s) - alias_method sym, munged_sym - undef_method munged_sym - else - undef_method sym - end + reset_proxied_method(sym) + end + end + + def reset_proxied_method(sym) + munged_sym = munge(sym) + target_metaclass.instance_eval do + remove_method sym + if method_defined?(munged_sym) + alias_method sym, munged_sym + remove_method munged_sym end end end + + def proxy_for_nil_class? + @target.nil? + end + + def reset_nil_expectations_warning + @@warn_about_expectations_on_nil = true if proxy_for_nil_class? + end def find_matching_expectation(sym, *args) + @expectations.find {|expectation| expectation.matches(sym, args) && !expectation.called_max_times?} || @expectations.find {|expectation| expectation.matches(sym, args)} end @@ -175,10 +240,6 @@ module Spec @expectations.find {|expectation| expectation.matches_name_but_not_args(sym, args)} end - def find_matching_method_stub(sym, *args) - @stubs.find {|stub| stub.matches(sym, args)} - end - end end end diff --git a/vendor/plugins/rspec/lib/spec/mocks/spec_methods.rb b/vendor/plugins/rspec/lib/spec/mocks/spec_methods.rb deleted file mode 100644 index d92a4cedd..000000000 --- a/vendor/plugins/rspec/lib/spec/mocks/spec_methods.rb +++ /dev/null @@ -1,38 +0,0 @@ -module Spec - module Mocks - module ExampleMethods - include Spec::Mocks::ArgumentConstraintMatchers - - # Shortcut for creating an instance of Spec::Mocks::Mock. - # - # +name+ is used for failure reporting, so you should use the - # role that the mock is playing in the example. - # - # +stubs_and_options+ lets you assign options and stub values - # at the same time. The only option available is :null_object. - # Anything else is treated as a stub value. - # - # == Examples - # - # stub_thing = mock("thing", :a => "A") - # stub_thing.a == "A" => true - # - # stub_person = stub("thing", :name => "Joe", :email => "joe@domain.com") - # stub_person.name => "Joe" - # stub_person.email => "joe@domain.com" - def mock(name, stubs_and_options={}) - Spec::Mocks::Mock.new(name, stubs_and_options) - end - - alias :stub :mock - - # Shortcut for creating a mock object that will return itself in response - # to any message it receives that it hasn't been explicitly instructed - # to respond to. - def stub_everything(name = 'stub') - mock(name, :null_object => true) - end - - end - end -end diff --git a/vendor/plugins/rspec/lib/spec/rake/spectask.rb b/vendor/plugins/rspec/lib/spec/rake/spectask.rb index ecf39506d..9049fd08e 100644 --- a/vendor/plugins/rspec/lib/spec/rake/spectask.rb +++ b/vendor/plugins/rspec/lib/spec/rake/spectask.rb @@ -48,7 +48,6 @@ module Spec # This task can also be used to run existing Test::Unit tests and get RSpec # output, for example like this: # - # require 'rubygems' # require 'spec/rake/spectask' # Spec::Rake::SpecTask.new do |t| # t.ruby_opts = ['-rtest/unit'] @@ -56,12 +55,10 @@ module Spec # end # class SpecTask < ::Rake::TaskLib - class << self - def attr_accessor(*names) - super(*names) - names.each do |name| - module_eval "def #{name}() evaluate(@#{name}) end" # Allows use of procs - end + def self.attr_accessor(*names) + super(*names) + names.each do |name| + module_eval "def #{name}() evaluate(@#{name}) end" # Allows use of procs end end @@ -107,7 +104,7 @@ module Spec # A message to print to stderr when there are failures. attr_accessor :failure_message - # Where RSpec's output is written. Defaults to STDOUT. + # Where RSpec's output is written. Defaults to $stdout. # DEPRECATED. Use --format FORMAT:WHERE in spec_opts. attr_accessor :out @@ -122,10 +119,13 @@ module Spec # the executed spec command to stdout. Defaults to false. attr_accessor :verbose + # Explicitly define the path to the ruby binary, or its proxy (e.g. multiruby) + attr_accessor :ruby_cmd + # Defines a new task, using the name +name+. def initialize(name=:spec) @name = name - @libs = [File.expand_path(File.dirname(__FILE__) + '/../../../lib')] + @libs = ['lib'] @pattern = nil @spec_files = nil @spec_opts = [] @@ -142,7 +142,7 @@ module Spec end def define # :nodoc: - spec_script = File.expand_path(File.dirname(__FILE__) + '/../../../bin/spec') + spec_script = File.expand_path(File.join(File.dirname(__FILE__),"..","..","..","bin","spec")) lib_path = libs.join(File::PATH_SEPARATOR) actual_name = Hash === name ? name.keys.first : name @@ -155,30 +155,23 @@ module Spec # ruby [ruby_opts] -Ilib -S rcov [rcov_opts] bin/spec -- examples [spec_opts] # or # ruby [ruby_opts] -Ilib bin/spec examples [spec_opts] - cmd = "#{File.join(Config::CONFIG['bindir'], Config::CONFIG['ruby_install_name'])} " - - rb_opts = ruby_opts.clone - rb_opts << "-I\"#{lib_path}\"" - rb_opts << "-S rcov" if rcov - rb_opts << "-w" if warning - cmd << rb_opts.join(" ") - cmd << " " - cmd << rcov_option_list - cmd << %[ -o "#{rcov_dir}" ] if rcov - cmd << %Q|"#{spec_script}"| - cmd << " " - cmd << "-- " if rcov - cmd << spec_file_list.collect { |fn| %["#{fn}"] }.join(' ') - cmd << " " - cmd << spec_option_list + cmd_parts = [ruby_cmd || RUBY] + cmd_parts += ruby_opts + cmd_parts << %[-I"#{lib_path}"] + cmd_parts << "-S rcov" if rcov + cmd_parts << "-w" if warning + cmd_parts << rcov_option_list + cmd_parts << %[-o "#{rcov_dir}"] if rcov + cmd_parts << %["#{spec_script}"] + cmd_parts << "--" if rcov + cmd_parts += spec_file_list.collect { |fn| %["#{fn}"] } + cmd_parts << spec_option_list if out - cmd << " " - cmd << %Q| > "#{out}"| + cmd_parts << %[> "#{out}"] STDERR.puts "The Spec::Rake::SpecTask#out attribute is DEPRECATED and will be removed in a future version. Use --format FORMAT:WHERE instead." end - if verbose - puts cmd - end + cmd = cmd_parts.join(" ") + puts cmd if verbose unless system(cmd) STDERR.puts failure_message if failure_message raise("Command #{cmd} failed") if fail_on_error @@ -202,8 +195,11 @@ module Spec end def rcov_option_list # :nodoc: - return "" unless rcov - ENV['RCOV_OPTS'] || rcov_opts.join(" ") || "" + if rcov + ENV['RCOV_OPTS'] || rcov_opts.join(" ") || "" + else + "" + end end def spec_option_list # :nodoc: @@ -232,4 +228,3 @@ module Spec end end end - diff --git a/vendor/plugins/rspec/lib/spec/rake/verify_rcov.rb b/vendor/plugins/rspec/lib/spec/rake/verify_rcov.rb index 3328f9e9a..199bd8546 100644 --- a/vendor/plugins/rspec/lib/spec/rake/verify_rcov.rb +++ b/vendor/plugins/rspec/lib/spec/rake/verify_rcov.rb @@ -35,11 +35,11 @@ module RCov def define desc "Verify that rcov coverage is at least #{threshold}%" task @name do - total_coverage = nil + total_coverage = 0 File.open(index_html).each_line do |line| - if line =~ /<tt class='coverage_total'>(\d+\.\d+)%<\/tt>/ - total_coverage = eval($1) + if line =~ /<tt class='coverage_total'>\s*(\d+\.\d+)%\s*<\/tt>/ + total_coverage = $1.to_f break end end diff --git a/vendor/plugins/rspec/lib/spec/runner.rb b/vendor/plugins/rspec/lib/spec/runner.rb index 97ef95bd2..519b536e2 100644 --- a/vendor/plugins/rspec/lib/spec/runner.rb +++ b/vendor/plugins/rspec/lib/spec/runner.rb @@ -1,3 +1,4 @@ +require 'spec/runner/configuration' require 'spec/runner/options' require 'spec/runner/option_parser' require 'spec/runner/example_group_runner' @@ -5,170 +6,26 @@ require 'spec/runner/command_line' require 'spec/runner/drb_command_line' require 'spec/runner/backtrace_tweaker' require 'spec/runner/reporter' -require 'spec/runner/spec_parser' +require 'spec/runner/line_number_query' require 'spec/runner/class_and_arguments_parser' +require 'spec/runner/extensions/kernel' module Spec - # == ExampleGroups and Examples - # - # Rather than expressing examples in classes, RSpec uses a custom DSLL (DSL light) to - # describe groups of examples. - # - # A ExampleGroup is the equivalent of a fixture in xUnit-speak. It is a metaphor for the context - # in which you will run your executable example - a set of known objects in a known starting state. - # We begin be describing - # - # describe Account do - # - # before do - # @account = Account.new - # end - # - # it "should have a balance of $0" do - # @account.balance.should == Money.new(0, :dollars) - # end - # - # end - # - # We use the before block to set up the Example (given), and then the #it method to - # hold the example code that expresses the event (when) and the expected outcome (then). - # - # == Helper Methods - # - # A primary goal of RSpec is to keep the examples clear. We therefore prefer - # less indirection than you might see in xUnit examples and in well factored, DRY production code. We feel - # that duplication is OK if removing it makes it harder to understand an example without - # having to look elsewhere to understand its context. - # - # That said, RSpec does support some level of encapsulating common code in helper - # methods that can exist within a context or within an included module. - # - # == Setup and Teardown - # - # You can use before and after within a Example. Both methods take an optional - # scope argument so you can run the block before :each example or before :all examples - # - # describe "..." do - # before :all do - # ... - # end - # - # before :each do - # ... - # end - # - # it "should do something" do - # ... - # end - # - # it "should do something else" do - # ... - # end - # - # after :each do - # ... - # end - # - # after :all do - # ... - # end - # - # end - # - # The <tt>before :each</tt> block will run before each of the examples, once for each example. Likewise, - # the <tt>after :each</tt> block will run after each of the examples. - # - # It is also possible to specify a <tt>before :all</tt> and <tt>after :all</tt> - # block that will run only once for each behaviour, respectively before the first <code>before :each</code> - # and after the last <code>after :each</code>. The use of these is generally discouraged, because it - # introduces dependencies between the examples. Still, it might prove useful for very expensive operations - # if you know what you are doing. - # - # == Local helper methods - # - # You can include local helper methods by simply expressing them within a context: - # - # describe "..." do - # - # it "..." do - # helper_method - # end - # - # def helper_method - # ... - # end - # - # end - # - # == Included helper methods - # - # You can include helper methods in multiple contexts by expressing them within - # a module, and then including that module in your context: - # - # module AccountExampleHelperMethods - # def helper_method - # ... - # end - # end - # - # describe "A new account" do - # include AccountExampleHelperMethods - # before do - # @account = Account.new - # end - # - # it "should have a balance of $0" do - # helper_method - # @account.balance.should eql(Money.new(0, :dollars)) - # end - # end - # - # == Shared Example Groups - # - # You can define a shared Example Group, that may be used on other groups - # - # share_examples_for "All Editions" do - # it "all editions behaviour" ... - # end - # - # describe SmallEdition do - # it_should_behave_like "All Editions" - # - # it "should do small edition stuff" do - # ... - # end - # end - # - # You can also assign the shared group to a module and include that - # - # share_as :AllEditions do - # it "should do all editions stuff" ... - # end - # - # describe SmallEdition do - # it_should_behave_like AllEditions - # - # it "should do small edition stuff" do - # ... - # end - # end - # - # And, for those of you who prefer to use something more like Ruby, you - # can just include the module directly - # - # describe SmallEdition do - # include AllEditions - # - # it "should do small edition stuff" do - # ... - # end - # end module Runner + + class ExampleGroupCreationListener + def register_example_group(klass) + Spec::Runner.options.add_example_group klass + end + end + + Spec::Example::ExampleGroupFactory.example_group_creation_listeners << ExampleGroupCreationListener.new + class << self def configuration # :nodoc: - @configuration ||= Spec::Example::Configuration.new + @configuration ||= Spec::Runner::Configuration.new end - + # Use this to configure various configurable aspects of # RSpec: # @@ -177,26 +34,33 @@ module Spec # end # # The yielded <tt>configuration</tt> object is a - # Spec::Example::Configuration instance. See its RDoc + # Spec::Runner::Configuration instance. See its RDoc # for details about what you can do with it. # def configure yield configuration end - def register_at_exit_hook # :nodoc: - $spec_runner_at_exit_hook_registered ||= nil - unless $spec_runner_at_exit_hook_registered - at_exit do - unless $! || Spec.run?; \ - success = Spec.run; \ - exit success if Spec.exit?; \ - end - end - $spec_runner_at_exit_hook_registered = true + def autorun # :nodoc: + at_exit {exit run unless $!} + end + + def options # :nodoc: + @options ||= begin + parser = ::Spec::Runner::OptionParser.new($stderr, $stdout) + parser.order!(ARGV) + parser.options end end - + + def use options + @options = options + end + + def run + options.examples_run? || options.run_examples + end + end end -end +end
\ No newline at end of file diff --git a/vendor/plugins/rspec/lib/spec/runner/backtrace_tweaker.rb b/vendor/plugins/rspec/lib/spec/runner/backtrace_tweaker.rb index 587e57d90..a3cb7d9bd 100644 --- a/vendor/plugins/rspec/lib/spec/runner/backtrace_tweaker.rb +++ b/vendor/plugins/rspec/lib/spec/runner/backtrace_tweaker.rb @@ -1,31 +1,53 @@ module Spec module Runner class BacktraceTweaker + def initialize(*patterns) + @ignore_patterns = [] + end + def clean_up_double_slashes(line) line.gsub!('//','/') end - end - class NoisyBacktraceTweaker < BacktraceTweaker + def ignore_patterns(*patterns) + # do nothing. Only QuietBacktraceTweaker ignores patterns. + end + + def ignored_patterns + [] + end + def tweak_backtrace(error) return if error.backtrace.nil? - error.backtrace.each do |line| - clean_up_double_slashes(line) + tweaked = error.backtrace.collect do |message| + clean_up_double_slashes(message) + kept_lines = message.split("\n").select do |line| + ignored_patterns.each do |ignore| + break if line =~ ignore + end + end + kept_lines.empty?? nil : kept_lines.join("\n") end + error.set_backtrace(tweaked.select {|line| line}) end end + class NoisyBacktraceTweaker < BacktraceTweaker + end + # Tweaks raised Exceptions to mask noisy (unneeded) parts of the backtrace class QuietBacktraceTweaker < BacktraceTweaker unless defined?(IGNORE_PATTERNS) - root_dir = File.expand_path(File.join(__FILE__, '..', '..', '..', '..')) - spec_files = Dir["#{root_dir}/lib/*"].map do |path| - subpath = path[root_dir.length..-1] + spec_files = Dir["lib/*"].map do |path| + subpath = path[1..-1] /#{subpath}/ end IGNORE_PATTERNS = spec_files + [ + /\/rspec-[^\/]*\/lib\/spec\//, + /\/spork-[^\/]*\/lib\/spork\//, /\/lib\/ruby\//, /bin\/spec:/, + /bin\/spork:/, /bin\/rcov:/, /lib\/rspec-rails/, /vendor\/rails/, @@ -37,20 +59,18 @@ module Spec /spec_server/ ] end - - def tweak_backtrace(error) - return if error.backtrace.nil? - error.backtrace.collect! do |line| - clean_up_double_slashes(line) - IGNORE_PATTERNS.each do |ignore| - if line =~ ignore - line = nil - break - end - end - line - end - error.backtrace.compact! + + def initialize(*patterns) + super + ignore_patterns(*patterns) + end + + def ignore_patterns(*patterns) + @ignore_patterns += patterns.flatten.map { |pattern| Regexp.new(pattern) } + end + + def ignored_patterns + IGNORE_PATTERNS + @ignore_patterns end end end diff --git a/vendor/plugins/rspec/lib/spec/runner/class_and_arguments_parser.rb b/vendor/plugins/rspec/lib/spec/runner/class_and_arguments_parser.rb index 65dc4519c..a49ade26e 100644 --- a/vendor/plugins/rspec/lib/spec/runner/class_and_arguments_parser.rb +++ b/vendor/plugins/rspec/lib/spec/runner/class_and_arguments_parser.rb @@ -1,16 +1,14 @@ module Spec module Runner class ClassAndArgumentsParser - class << self - def parse(s) - if s =~ /([a-zA-Z_]+(?:::[a-zA-Z_]+)*):?(.*)/ - arg = $2 == "" ? nil : $2 - [$1, arg] - else - raise "Couldn't parse #{s.inspect}" - end + def self.parse(s) + if s =~ /([a-zA-Z_]+(?:::[a-zA-Z_]+)*):?(.*)/ + arg = $2 == "" ? nil : $2 + [$1, arg] + else + raise "Couldn't parse #{s.inspect}" end end end end -end
\ No newline at end of file +end diff --git a/vendor/plugins/rspec/lib/spec/runner/command_line.rb b/vendor/plugins/rspec/lib/spec/runner/command_line.rb index 9849c4853..35a7e3159 100644 --- a/vendor/plugins/rspec/lib/spec/runner/command_line.rb +++ b/vendor/plugins/rspec/lib/spec/runner/command_line.rb @@ -2,26 +2,13 @@ require 'spec/runner/option_parser' module Spec module Runner - # Facade to run specs without having to fork a new ruby process (using `spec ...`) class CommandLine - class << self - # Runs specs. +argv+ is the commandline args as per the spec commandline API, +err+ - # and +out+ are the streams output will be written to. - def run(instance_rspec_options) - # NOTE - this call to init_rspec_options is not spec'd, but neither is any of this - # swapping of $rspec_options. That is all here to enable rspec to run against itself - # and maintain coverage in a single process. Therefore, DO NOT mess with this stuff - # unless you know what you are doing! - init_rspec_options(instance_rspec_options) - orig_rspec_options = rspec_options - begin - $rspec_options = instance_rspec_options - return $rspec_options.run_examples - ensure - ::Spec.run = true - $rspec_options = orig_rspec_options - end - end + def self.run(tmp_options=Spec::Runner.options) + orig_options = Spec::Runner.options + Spec::Runner.use tmp_options + tmp_options.run_examples + ensure + Spec::Runner.use orig_options end end end diff --git a/vendor/plugins/rspec/lib/spec/runner/drb_command_line.rb b/vendor/plugins/rspec/lib/spec/runner/drb_command_line.rb index 6c340cfea..058a8e1df 100644 --- a/vendor/plugins/rspec/lib/spec/runner/drb_command_line.rb +++ b/vendor/plugins/rspec/lib/spec/runner/drb_command_line.rb @@ -8,11 +8,17 @@ module Spec # CommandLine - making it possible for clients to use both interchangeably. def self.run(options) begin - DRb.start_service - spec_server = DRbObject.new_with_uri("druby://localhost:8989") + begin; \ + DRb.start_service("druby://localhost:0"); \ + rescue SocketError; \ + DRb.start_service("druby://:0"); \ + end + spec_server = DRbObject.new_with_uri("druby://127.0.0.1:8989") spec_server.run(options.argv, options.error_stream, options.output_stream) - rescue DRb::DRbConnError => e + true + rescue DRb::DRbConnError options.error_stream.puts "No server is running" + false end end end diff --git a/vendor/plugins/rspec/lib/spec/runner/example_group_runner.rb b/vendor/plugins/rspec/lib/spec/runner/example_group_runner.rb index 7275c6a88..67dc99509 100644 --- a/vendor/plugins/rspec/lib/spec/runner/example_group_runner.rb +++ b/vendor/plugins/rspec/lib/spec/runner/example_group_runner.rb @@ -6,6 +6,7 @@ module Spec end def load_files(files) + $KCODE = 'u' if RUBY_VERSION.to_f < 1.9 # It's important that loading files (or choosing not to) stays the # responsibility of the ExampleGroupRunner. Some implementations (like) # the one using DRb may choose *not* to load files, but instead tell @@ -19,14 +20,15 @@ module Spec prepare success = true example_groups.each do |example_group| - success = success & example_group.run + success = success & example_group.run(@options) end return success ensure finish end - protected + protected + def prepare reporter.start(number_of_examples) example_groups.reverse! if reverse @@ -53,7 +55,5 @@ module Spec @options.number_of_examples end end - # TODO: BT - Deprecate BehaviourRunner? - BehaviourRunner = ExampleGroupRunner end -end
\ No newline at end of file +end diff --git a/vendor/plugins/rspec/lib/spec/runner/formatter/base_formatter.rb b/vendor/plugins/rspec/lib/spec/runner/formatter/base_formatter.rb index a1269b513..0fbc12ce4 100644 --- a/vendor/plugins/rspec/lib/spec/runner/formatter/base_formatter.rb +++ b/vendor/plugins/rspec/lib/spec/runner/formatter/base_formatter.rb @@ -1,12 +1,29 @@ module Spec module Runner module Formatter - # Baseclass for formatters that implements all required methods as no-ops. + # Formatter base-class, which implements all required methods as no-ops, with the exception class BaseFormatter - attr_accessor :example_group, :options, :where - def initialize(options, where) - @options = options - @where = where + # Formatters are initialized with <tt>options</tt> and <tt>output</tt> + # arguments. RSpec's built-in formatters already expect this, and any + # custom formatters should as well. + # + # ==== Parameters + # options:: + # A struct containing boolean values for colour, autospec, + # and dry_run + # output:: + # Used by RSpec's built-in formatters to determine where to + # write the output. Default is <tt>STDOUT</tt>, otherwise a + # filename is expected. + # + # === Example + # If you invoke the <tt>spec</tt> command with: + # + # --format progress:progress_report.txt + # + # ... the value of <tt>output</tt> will be progress_report.txt. If you + # don't identify an output destination, the default is STDOUT. + def initialize(options, output) end # This method is invoked before any examples are run, right after @@ -14,42 +31,77 @@ module Spec # formatters that need to provide progress on feedback (graphical ones) # # This method will only be invoked once, and the next one to be invoked - # is #add_example_group + # is #example_group_started + # + # ==== Parameters + # example_count:: the total number of examples to be run def start(example_count) end - # This method is invoked at the beginning of the execution of each example_group. - # +example_group+ is the example_group. + # This method is invoked at the beginning of the execution of each + # example_group. The next method to be invoked after this is + # #example_started # - # The next method to be invoked after this is #example_failed or #example_finished - def add_example_group(example_group) - @example_group = example_group + # ==== Parameters + # example_group_proxy:: instance of Spec::Example::ExampleGroupProxy + def example_group_started(example_group_proxy) + end + + # Deprecated - use example_group_started instead + def add_example_group(example_group_proxy) + Spec.deprecate("BaseFormatter#add_example_group", "BaseFormatter#example_group_started") + example_group_started(example_group_proxy) end - # This method is invoked when an +example+ starts. - def example_started(example) + # This method is invoked when an +example+ starts. The next method to be + # invoked after this is #example_passed, #example_failed, or + # #example_pending + # + # ==== Parameters + # example_proxy:: instance of Spec::Example::ExampleProxy + def example_started(example_proxy) end # This method is invoked when an +example+ passes. - def example_passed(example) + # +example_proxy+ is the same instance of Spec::Example::ExampleProxy + # that was passed to example_started + # + # ==== Parameters + # example_proxy:: instance of Spec::Example::ExampleProxy + def example_passed(example_proxy) end # This method is invoked when an +example+ fails, i.e. an exception occurred - # inside it (such as a failed should or other exception). +counter+ is the - # sequence number of the failure (starting at 1) and +failure+ is the associated - # Failure object. - def example_failed(example, counter, failure) + # inside it (such as a failed should or other exception). + # + # ==== Parameters + # example_proxy:: + # The same instance of Spec::Example::ExampleProxy that was passed + # to <tt>example_started</tt> + # + # counter:: the sequential number of this failure + # + # failure:: instance of Spec::Runner::Reporter::Failure + def example_failed(example_proxy, counter, failure) end # This method is invoked when an example is not yet implemented (i.e. has not # been provided a block), or when an ExamplePendingError is raised. # +message+ is the message from the ExamplePendingError, if it exists, or the - # default value of "Not Yet Implemented" - def example_pending(example, message) + # default value of "Not Yet Implemented". +deprecated_pending_location+ is + # deprecated - use example_proxy.location instead + # + # ==== Parameters + # example_proxy:: instance of Spec::Example::ExampleProxy + # message:: + # the message passed to the pending message, or an internal + # default + # + def example_pending(example_proxy, message, deprecated_pending_location=nil) end # This method is invoked after all of the examples have executed. The next method - # to be invoked after this one is #dump_failure (once for each failed example), + # to be invoked after this one is #dump_failure (once for each failed example) def start_dump end @@ -57,14 +109,24 @@ module Spec # This method is invoked for each failed example after all examples have run. +counter+ is the sequence number # of the associated example. +failure+ is a Failure object, which contains detailed # information about the failure. + # + # ==== Parameters + # counter:: the sequential number of this failure + # failure:: instance of Spec::Runner::Reporter::Failure def dump_failure(counter, failure) end # This method is invoked after the dumping of examples and failures. + # + # ==== Parameters + # duration:: the total time for the entire run + # example_count:: the number of examples run + # failure_count:: the number of examples that failed + # pending_count:: the number of examples that are pending def dump_summary(duration, example_count, failure_count, pending_count) end - # This gets invoked after the summary if option is set to do so. + # This gets invoked after the summary def dump_pending end diff --git a/vendor/plugins/rspec/lib/spec/runner/formatter/base_text_formatter.rb b/vendor/plugins/rspec/lib/spec/runner/formatter/base_text_formatter.rb index bad023db7..ee8db75a4 100644 --- a/vendor/plugins/rspec/lib/spec/runner/formatter/base_text_formatter.rb +++ b/vendor/plugins/rspec/lib/spec/runner/formatter/base_text_formatter.rb @@ -1,4 +1,5 @@ require 'spec/runner/formatter/base_formatter' +require 'fileutils' module Spec module Runner @@ -7,47 +8,47 @@ module Spec # non-text based ones too - just ignore the +output+ constructor # argument. class BaseTextFormatter < BaseFormatter - attr_reader :output, :pending_examples - # Creates a new instance that will write to +where+. If +where+ is a + attr_reader :output, :example_group + # Creates a new instance that will write to +output+. If +output+ is a # String, output will be written to the File with that name, otherwise - # +where+ is exected to be an IO (or an object that responds to #puts and #write). - def initialize(options, where) - super - if where.is_a?(String) - @output = File.open(where, 'w') - elsif where == STDOUT - @output = Kernel - def @output.flush - STDOUT.flush - end + # +output+ is exected to be an IO (or an object that responds to #puts + # and #write). + def initialize(options, output) + @options = options + if String === output + FileUtils.mkdir_p(File.dirname(output)) + @output = File.open(output, 'w') else - @output = where + @output = output end @pending_examples = [] end + + def example_group_started(example_group_proxy) + @example_group = example_group_proxy + end - def example_pending(example, message) - @pending_examples << [example.__full_description, message] + def example_pending(example, message, deprecated_pending_location=nil) + @pending_examples << ["#{@example_group.description} #{example.description}", message, example.location] end def dump_failure(counter, failure) @output.puts @output.puts "#{counter.to_s})" - @output.puts colourise("#{failure.header}\n#{failure.exception.message}", failure) + @output.puts colorize_failure("#{failure.header}\n#{failure.exception.message}", failure) @output.puts format_backtrace(failure.exception.backtrace) @output.flush end - def colourise(s, failure) - if(failure.expectation_not_met?) - red(s) - elsif(failure.pending_fixed?) - blue(s) - else - magenta(s) - end + def colorize_failure(message, failure) + failure.pending_fixed? ? blue(message) : red(message) end - + + def colourise(message, failure) + Spec::deprecate("BaseTextFormatter#colourise", "colorize_failure") + colorize_failure(message, failure) + end + def dump_summary(duration, example_count, failure_count, pending_count) return if dry_run? @output.puts @@ -74,16 +75,15 @@ module Spec @output.puts @output.puts "Pending:" @pending_examples.each do |pending_example| - @output.puts "#{pending_example[0]} (#{pending_example[1]})" + @output.puts "\n#{pending_example[0]} (#{pending_example[1]})" + @output.puts "#{pending_example[2]}\n" end end @output.flush end def close - if IO === @output - @output.close - end + @output.close if (IO === @output) & (@output != $stdout) end def format_backtrace(backtrace) @@ -94,11 +94,15 @@ module Spec protected def colour? - @options.colour ? true : false + !!@options.colour end def dry_run? - @options.dry_run ? true : false + !!@options.dry_run + end + + def autospec? + !!@options.autospec || ENV.has_key?("AUTOTEST") end def backtrace_line(line) @@ -106,13 +110,18 @@ module Spec end def colour(text, colour_code) - return text unless colour? && output_to_tty? + return text if output_to_file? + return text unless ENV['RSPEC_COLOR'] || (colour? & (autospec? || output_to_tty?)) "#{colour_code}#{text}\e[0m" end + def output_to_file? + File === @output + end + def output_to_tty? begin - @output == Kernel || @output.tty? + @output.tty? rescue NoMethodError false end @@ -120,10 +129,13 @@ module Spec def green(text); colour(text, "\e[32m"); end def red(text); colour(text, "\e[31m"); end - def magenta(text); colour(text, "\e[35m"); end def yellow(text); colour(text, "\e[33m"); end def blue(text); colour(text, "\e[34m"); end + def magenta(text) + Spec::deprecate("BaseTextFormatter#magenta") + red(text) + end end end end diff --git a/vendor/plugins/rspec/lib/spec/runner/formatter/failing_example_groups_formatter.rb b/vendor/plugins/rspec/lib/spec/runner/formatter/failing_example_groups_formatter.rb index 8d39bc572..31729438b 100644 --- a/vendor/plugins/rspec/lib/spec/runner/formatter/failing_example_groups_formatter.rb +++ b/vendor/plugins/rspec/lib/spec/runner/formatter/failing_example_groups_formatter.rb @@ -6,21 +6,19 @@ module Spec class FailingExampleGroupsFormatter < BaseTextFormatter def example_failed(example, counter, failure) if @example_group - description_parts = @example_group.description_parts.collect do |description| - description =~ /(.*) \(druby.*\)$/ ? $1 : description - end - @output.puts ::Spec::Example::ExampleGroupMethods.description_text(*description_parts) + @output.puts @example_group.description.gsub(/ \(druby.*\)/,"") @output.flush @example_group = nil end end - + def dump_failure(counter, failure) end def dump_summary(duration, example_count, failure_count, pending_count) end + end end end diff --git a/vendor/plugins/rspec/lib/spec/runner/formatter/html_formatter.rb b/vendor/plugins/rspec/lib/spec/runner/formatter/html_formatter.rb index e5368f2cb..2d0c65d1b 100644 --- a/vendor/plugins/rspec/lib/spec/runner/formatter/html_formatter.rb +++ b/vendor/plugins/rspec/lib/spec/runner/formatter/html_formatter.rb @@ -1,22 +1,21 @@ require 'erb' require 'spec/runner/formatter/base_text_formatter' +require 'spec/runner/formatter/no_op_method_missing' module Spec module Runner module Formatter class HtmlFormatter < BaseTextFormatter include ERB::Util # for the #h method + include NOOPMethodMissing def initialize(options, output) super @example_group_number = 0 @example_number = 0 + @header_red = nil end - def method_missing(sym, *args) - # no-op - end - # The number of the currently running example_group def example_group_number @example_group_number @@ -35,10 +34,9 @@ module Spec @output.flush end - def add_example_group(example_group) + def example_group_started(example_group) super @example_group_red = false - @example_group_red = false @example_group_number += 1 unless example_group_number == 1 @output.puts " </dl>" @@ -85,7 +83,7 @@ module Spec @output.flush end - def example_pending(example, message) + def example_pending(example, message, deprecated_pending_location=nil) @output.puts " <script type=\"text/javascript\">makeYellow('rspec-header');</script>" unless @header_red @output.puts " <script type=\"text/javascript\">makeYellow('example_group_#{example_group_number}');</script>" unless @example_group_red move_progress @@ -154,14 +152,6 @@ module Spec font-size: 80%; } </style> -</head> -<body> -EOF - end - - def report_header - <<-EOF -<div class="rspec-report"> <script type="text/javascript"> // <![CDATA[ #{global_scripts} @@ -170,9 +160,19 @@ EOF <style type="text/css"> #{global_styles} </style> +</head> +<body> +EOF + end + + def report_header + <<-EOF +<div class="rspec-report"> <div id="rspec-header"> - <h1>RSpec Results</h1> + <div id="label"> + <h1>RSpec Code Examples</h1> + </div> <div id="summary"> <p id="totals"> </p> @@ -212,7 +212,7 @@ EOF def global_styles <<-EOF #rspec-header { - background: #65C400; color: #fff; + background: #65C400; color: #fff; height: 4em; } .rspec-report h1 { @@ -220,15 +220,16 @@ EOF padding: 10px; font-family: "Lucida Grande", Helvetica, sans-serif; font-size: 1.8em; + position: absolute; } #summary { margin: 0; padding: 5px 10px; font-family: "Lucida Grande", Helvetica, sans-serif; text-align: right; - position: absolute; top: 0px; right: 0px; + float:right; } #summary p { diff --git a/vendor/plugins/rspec/lib/spec/runner/formatter/nested_text_formatter.rb b/vendor/plugins/rspec/lib/spec/runner/formatter/nested_text_formatter.rb index f9aa5f67c..5caec5a4d 100644 --- a/vendor/plugins/rspec/lib/spec/runner/formatter/nested_text_formatter.rb +++ b/vendor/plugins/rspec/lib/spec/runner/formatter/nested_text_formatter.rb @@ -4,33 +4,25 @@ module Spec module Runner module Formatter class NestedTextFormatter < BaseTextFormatter - attr_reader :previous_nested_example_groups def initialize(options, where) super - @previous_nested_example_groups = [] + @last_nested_descriptions = [] end - def add_example_group(example_group) + def example_group_started(example_group) super - current_nested_example_groups = described_example_group_chain - current_nested_example_groups.each_with_index do |nested_example_group, i| - unless nested_example_group == previous_nested_example_groups[i] - output.puts "#{' ' * i}#{nested_example_group.description_args}" + example_group.nested_descriptions.each_with_index do |nested_description, i| + unless nested_description == @last_nested_descriptions[i] + output.puts "#{' ' * i}#{nested_description}" end end - @previous_nested_example_groups = described_example_group_chain + @last_nested_descriptions = example_group.nested_descriptions end def example_failed(example, counter, failure) - message = if failure.expectation_not_met? - "#{current_indentation}#{example.description} (FAILED - #{counter})" - else - "#{current_indentation}#{example.description} (ERROR - #{counter})" - end - - output.puts(failure.expectation_not_met? ? red(message) : magenta(message)) + output.puts(red("#{current_indentation}#{example.description} (FAILED - #{counter})")) output.flush end @@ -40,24 +32,14 @@ module Spec output.flush end - def example_pending(example, message) + def example_pending(example, message, deprecated_pending_location=nil) super output.puts yellow("#{current_indentation}#{example.description} (PENDING: #{message})") output.flush end def current_indentation - ' ' * previous_nested_example_groups.length - end - - def described_example_group_chain - example_group_chain = [] - example_group.send(:execute_in_class_hierarchy) do |parent_example_group| - if parent_example_group.description_args && !parent_example_group.description_args.empty? - example_group_chain << parent_example_group - end - end - example_group_chain + ' ' * @last_nested_descriptions.length end end end diff --git a/vendor/plugins/rspec/lib/spec/runner/formatter/profile_formatter.rb b/vendor/plugins/rspec/lib/spec/runner/formatter/profile_formatter.rb index 8671d721e..3784f3ac7 100644 --- a/vendor/plugins/rspec/lib/spec/runner/formatter/profile_formatter.rb +++ b/vendor/plugins/rspec/lib/spec/runner/formatter/profile_formatter.rb @@ -41,10 +41,6 @@ module Spec end @output.flush end - - def method_missing(sym, *args) - # ignore - end end end end diff --git a/vendor/plugins/rspec/lib/spec/runner/formatter/progress_bar_formatter.rb b/vendor/plugins/rspec/lib/spec/runner/formatter/progress_bar_formatter.rb index 032a2872d..862f87a44 100644 --- a/vendor/plugins/rspec/lib/spec/runner/formatter/progress_bar_formatter.rb +++ b/vendor/plugins/rspec/lib/spec/runner/formatter/progress_bar_formatter.rb @@ -1,11 +1,14 @@ require 'spec/runner/formatter/base_text_formatter' +require 'spec/runner/formatter/no_op_method_missing' module Spec module Runner module Formatter class ProgressBarFormatter < BaseTextFormatter + include NOOPMethodMissing + def example_failed(example, counter, failure) - @output.print colourise('F', failure) + @output.print colorize_failure('F', failure) @output.flush end @@ -14,9 +17,9 @@ module Spec @output.flush end - def example_pending(example, message) + def example_pending(example, message, deprecated_pending_location=nil) super - @output.print yellow('P') + @output.print yellow('*') @output.flush end @@ -24,10 +27,6 @@ module Spec @output.puts @output.flush end - - def method_missing(sym, *args) - # ignore - end end end end diff --git a/vendor/plugins/rspec/lib/spec/runner/formatter/snippet_extractor.rb b/vendor/plugins/rspec/lib/spec/runner/formatter/snippet_extractor.rb index 41119fe46..4f34e5fee 100644 --- a/vendor/plugins/rspec/lib/spec/runner/formatter/snippet_extractor.rb +++ b/vendor/plugins/rspec/lib/spec/runner/formatter/snippet_extractor.rb @@ -4,7 +4,7 @@ module Spec # This class extracts code snippets by looking at the backtrace of the passed error class SnippetExtractor #:nodoc: class NullConverter; def convert(code, pre); code; end; end #:nodoc: - begin; require 'rubygems'; require 'syntax/convertors/html'; @@converter = Syntax::Convertors::HTML.for_syntax "ruby"; rescue LoadError => e; @@converter = NullConverter.new; end + begin; require 'syntax/convertors/html'; @@converter = Syntax::Convertors::HTML.for_syntax "ruby"; rescue LoadError => e; @@converter = NullConverter.new; end def snippet(error) raw_code, line = snippet_for(error.backtrace[0]) diff --git a/vendor/plugins/rspec/lib/spec/runner/formatter/specdoc_formatter.rb b/vendor/plugins/rspec/lib/spec/runner/formatter/specdoc_formatter.rb index facf1a65a..7204f2147 100644 --- a/vendor/plugins/rspec/lib/spec/runner/formatter/specdoc_formatter.rb +++ b/vendor/plugins/rspec/lib/spec/runner/formatter/specdoc_formatter.rb @@ -4,7 +4,7 @@ module Spec module Runner module Formatter class SpecdocFormatter < BaseTextFormatter - def add_example_group(example_group) + def example_group_started(example_group) super output.puts output.puts example_group.description @@ -12,13 +12,7 @@ module Spec end def example_failed(example, counter, failure) - message = if failure.expectation_not_met? - "- #{example.description} (FAILED - #{counter})" - else - "- #{example.description} (ERROR - #{counter})" - end - - output.puts(failure.expectation_not_met? ? red(message) : magenta(message)) + output.puts(red("- #{example.description} (FAILED - #{counter})")) output.flush end @@ -28,7 +22,7 @@ module Spec output.flush end - def example_pending(example, message) + def example_pending(example, message, deprecated_pending_location=nil) super output.puts yellow("- #{example.description} (PENDING: #{message})") output.flush diff --git a/vendor/plugins/rspec/lib/spec/runner/formatter/story/html_formatter.rb b/vendor/plugins/rspec/lib/spec/runner/formatter/story/html_formatter.rb deleted file mode 100644 index 5a8134683..000000000 --- a/vendor/plugins/rspec/lib/spec/runner/formatter/story/html_formatter.rb +++ /dev/null @@ -1,128 +0,0 @@ -require 'erb' -require 'spec/runner/formatter/base_text_formatter' - -module Spec - module Runner - module Formatter - module Story - class HtmlFormatter < BaseTextFormatter - include ERB::Util - - def run_started(count) - @output.puts <<-EOF -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html - PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" - "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> - <head> - <title>Stories</title> - <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> - <meta http-equiv="Expires" content="-1" /> - <meta http-equiv="Pragma" content="no-cache" /> - <script src="javascripts/prototype.js" type="text/javascript"></script> - <script src="javascripts/scriptaculous.js" type="text/javascript"></script> - <script src="javascripts/rspec.js" type="text/javascript"></script> - <link href="stylesheets/rspec.css" rel="stylesheet" type="text/css" /> - </head> - <body> - <div id="container"> -EOF - end - - def collected_steps(steps) - unless steps.empty? - @output.puts " <ul id=\"stock_steps\" style=\"display: none;\">" - steps.each do |step| - @output.puts " <li>#{step}</li>" - end - @output.puts " </ul>" - end - end - - def run_ended - @output.puts <<-EOF - </div> - </body> -</head> -EOF - end - - def story_started(title, narrative) - @output.puts <<-EOF - <dl class="story passed"> - <dt>Story: #{h title}</dt> - <dd> - <p> - #{h(narrative).split("\n").join("<br />")} - </p> -EOF - end - - def story_ended(title, narrative) - @output.puts <<-EOF - </dd> - </dl> -EOF - end - - def scenario_started(story_title, scenario_name) - @output.puts <<-EOF - <dl class="passed"> - <dt>Scenario: #{h scenario_name}</dt> - <dd> - <ul class="steps"> -EOF - end - - def scenario_ended - @output.puts <<-EOF - </ul> - </dd> - </dl> -EOF - end - - def found_scenario(type, description) - end - - def scenario_succeeded(story_title, scenario_name) - scenario_ended - end - - def scenario_pending(story_title, scenario_name, reason) - scenario_ended - end - - def scenario_failed(story_title, scenario_name, err) - scenario_ended - end - - def step_upcoming(type, description, *args) - end - - def step_succeeded(type, description, *args) - print_step('passed', type, description, *args) # TODO: uses succeeded CSS class - end - - def step_pending(type, description, *args) - print_step('pending', type, description, *args) - end - - def step_failed(type, description, *args) - print_step('failed', type, description, *args) - end - - def print_step(klass, type, description, *args) - spans = args.map { |arg| "<span class=\"param\">#{arg}</span>" } - desc_string = description.step_name - arg_regexp = description.arg_regexp - i = -1 - inner = type.to_s.capitalize + ' ' + desc_string.gsub(arg_regexp) { |param| spans[i+=1] } - @output.puts " <li class=\"#{klass}\">#{inner}</li>" - end - end - end - end - end -end
\ No newline at end of file diff --git a/vendor/plugins/rspec/lib/spec/runner/formatter/story/plain_text_formatter.rb b/vendor/plugins/rspec/lib/spec/runner/formatter/story/plain_text_formatter.rb deleted file mode 100644 index 31cd614cb..000000000 --- a/vendor/plugins/rspec/lib/spec/runner/formatter/story/plain_text_formatter.rb +++ /dev/null @@ -1,142 +0,0 @@ -require 'spec/runner/formatter/base_text_formatter' - -module Spec - module Runner - module Formatter - module Story - class PlainTextFormatter < BaseTextFormatter - def initialize(options, where) - super - @successful_scenario_count = 0 - @pending_scenario_count = 0 - @failed_scenarios = [] - @pending_steps = [] - @previous_type = nil - end - - def run_started(count) - @count = count - @output.puts "Running #@count scenarios\n\n" - end - - def story_started(title, narrative) - @current_story_title = title - @output.puts "Story: #{title}\n\n" - narrative.each_line do |line| - @output.print " " - @output.print line - end - end - - def story_ended(title, narrative) - @output.puts - @output.puts - end - - def scenario_started(story_title, scenario_name) - @current_scenario_name = scenario_name - @scenario_already_failed = false - @output.print "\n\n Scenario: #{scenario_name}" - @scenario_ok = true - @scenario_pending = false - end - - def scenario_succeeded(story_title, scenario_name) - @successful_scenario_count += 1 - end - - def scenario_failed(story_title, scenario_name, err) - @options.backtrace_tweaker.tweak_backtrace(err) - @failed_scenarios << [story_title, scenario_name, err] unless @scenario_already_failed - @scenario_already_failed = true - end - - def scenario_pending(story_title, scenario_name, msg) - @pending_scenario_count += 1 unless @scenario_already_failed - @scenario_pending = true - @scenario_already_failed = true - end - - def run_ended - @output.puts "#@count scenarios: #@successful_scenario_count succeeded, #{@failed_scenarios.size} failed, #@pending_scenario_count pending" - unless @pending_steps.empty? - @output.puts "\nPending Steps:" - @pending_steps.each_with_index do |pending, i| - story_name, scenario_name, msg = pending - @output.puts "#{i+1}) #{story_name} (#{scenario_name}): #{msg}" - end - end - unless @failed_scenarios.empty? - @output.print "\nFAILURES:" - @failed_scenarios.each_with_index do |failure, i| - title, scenario_name, err = failure - @output.print %[ - #{i+1}) #{title} (#{scenario_name}) FAILED - #{err.class}: #{err.message} - #{err.backtrace.join("\n")} -] - end - end - end - - def step_upcoming(type, description, *args) - end - - def step_succeeded(type, description, *args) - found_step(type, description, false, false, *args) - end - - def step_pending(type, description, *args) - found_step(type, description, false, true, *args) - @pending_steps << [@current_story_title, @current_scenario_name, description] - @output.print yellow(" (PENDING)") - @scenario_pending = true - @scenario_ok = false - end - - def step_failed(type, description, *args) - found_step(type, description, true, @scenario_pending, *args) - if @scenario_pending - @output.print yellow(" (SKIPPED)") - else - @output.print red(@scenario_ok ? " (FAILED)" : " (SKIPPED)") - end - @scenario_ok = false - end - - def collected_steps(steps) - end - - def method_missing(sym, *args, &block) #:nodoc: - # noop - ignore unknown messages - end - - private - - def found_step(type, description, failed, pending, *args) - desc_string = description.step_name - arg_regexp = description.arg_regexp - text = if(type == @previous_type) - "\n And " - else - "\n\n #{type.to_s.capitalize} " - end - i = -1 - text << desc_string.gsub(arg_regexp) { |param| args[i+=1] } - if pending - @output.print yellow(text) - else - @output.print(failed ? red(text) : green(text)) - end - - if type == :'given scenario' - @previous_type = :given - else - @previous_type = type - end - end - end - end - end - end -end diff --git a/vendor/plugins/rspec/lib/spec/runner/heckle_runner.rb b/vendor/plugins/rspec/lib/spec/runner/heckle_runner.rb index 7695fe794..5c81ea846 100644 --- a/vendor/plugins/rspec/lib/spec/runner/heckle_runner.rb +++ b/vendor/plugins/rspec/lib/spec/runner/heckle_runner.rb @@ -1,72 +1,72 @@ -begin - require 'rubygems' - require 'heckle' -rescue LoadError ; raise "You must gem install heckle to use --heckle" ; end +if Spec::Ruby.version.to_f < 1.9 + begin + require 'rubygems' unless ENV['NO_RUBYGEMS'] + require 'heckle' + rescue LoadError ; raise "You must gem install heckle to use --heckle" ; end -module Spec - module Runner - # Creates a new Heckler configured to heckle all methods in the classes - # whose name matches +filter+ - class HeckleRunner - def initialize(filter, heckle_class=Heckler) - @filter = filter - @heckle_class = heckle_class - end - - # Runs all the example groups held by +rspec_options+ once for each of the - # methods in the matched classes. - def heckle_with - if @filter =~ /(.*)[#\.](.*)/ - heckle_method($1, $2) - else - heckle_class_or_module(@filter) + module Spec + module Runner + # Creates a new Heckler configured to heckle all methods in the classes + # whose name matches +filter+ + class HeckleRunner + def initialize(filter, heckle_class=Heckler) + @filter = filter + @heckle_class = heckle_class end - end - def heckle_method(class_name, method_name) - verify_constant(class_name) - heckle = @heckle_class.new(class_name, method_name, rspec_options) - heckle.validate - end + # Runs all the example groups held by +rspec_options+ once for each of the + # methods in the matched classes. + def heckle_with + if @filter =~ /(.*)[#\.](.*)/ + heckle_method($1, $2) + else + heckle_class_or_module(@filter) + end + end - def heckle_class_or_module(class_or_module_name) - verify_constant(class_or_module_name) - pattern = /^#{class_or_module_name}/ - classes = [] - ObjectSpace.each_object(Class) do |klass| - classes << klass if klass.name =~ pattern + def heckle_method(class_name, method_name) + verify_constant(class_name) + heckle = @heckle_class.new(class_name, method_name, Spec::Runner.options) + heckle.validate end + + def heckle_class_or_module(class_or_module_name) + verify_constant(class_or_module_name) + pattern = /^#{class_or_module_name}/ + classes = [] + ObjectSpace.each_object(Class) do |klass| + classes << klass if klass.name =~ pattern + end - classes.each do |klass| - klass.instance_methods(false).each do |method_name| - heckle = @heckle_class.new(klass.name, method_name, rspec_options) - heckle.validate + classes.each do |klass| + klass.instance_methods(false).each do |method_name| + heckle = @heckle_class.new(klass.name, method_name, Spec::Runner.options) + heckle.validate + end end end - end - def verify_constant(name) - begin - # This is defined in Heckle - name.to_class - rescue - raise "Heckling failed - \"#{name}\" is not a known class or module" + def verify_constant(name) + begin + # This is defined in Heckle + name.to_class + rescue + raise "Heckling failed - \"#{name}\" is not a known class or module" + end end end - end - #Supports Heckle 1.2 and prior (earlier versions used Heckle::Base) - class Heckler < (Heckle.const_defined?(:Base) ? Heckle::Base : Heckle) - def initialize(klass_name, method_name, rspec_options) - super(klass_name, method_name) - @rspec_options = rspec_options - end + class Heckler < Heckle + def initialize(klass_name, method_name, rspec_options) + super(klass_name, method_name) + @rspec_options = rspec_options + end - def tests_pass? - success = @rspec_options.run_examples - success - end + def tests_pass? + @rspec_options.run_examples + end + end end end -end +end
\ No newline at end of file diff --git a/vendor/plugins/rspec/lib/spec/runner/heckle_runner_unsupported.rb b/vendor/plugins/rspec/lib/spec/runner/heckle_runner_unsupported.rb index 02aa37953..35ff86e10 100644 --- a/vendor/plugins/rspec/lib/spec/runner/heckle_runner_unsupported.rb +++ b/vendor/plugins/rspec/lib/spec/runner/heckle_runner_unsupported.rb @@ -3,7 +3,7 @@ module Spec # Dummy implementation for Windows that just fails (Heckle is not supported on Windows) class HeckleRunner def initialize(filter) - raise "Heckle not supported on Windows" + raise "Heckle is not supported on Windows or Ruby 1.9" end end end diff --git a/vendor/plugins/rspec/lib/spec/runner/option_parser.rb b/vendor/plugins/rspec/lib/spec/runner/option_parser.rb index 91525e089..fbbf444a9 100644 --- a/vendor/plugins/rspec/lib/spec/runner/option_parser.rb +++ b/vendor/plugins/rspec/lib/spec/runner/option_parser.rb @@ -10,6 +10,10 @@ module Spec parser.parse(args) parser.options end + + def spec_command? + $0.split('/').last == 'spec' + end end attr_reader :options @@ -27,34 +31,30 @@ module Spec :example => ["-e", "--example [NAME|FILE_NAME]", "Execute example(s) with matching name(s). If the argument is", "the path to an existing file (typically generated by a previous", "run using --format failing_examples:file.txt), then the examples", - "on each line of thatfile will be executed. If the file is empty,", + "on each line of that file will be executed. If the file is empty,", "all examples will be run (as if --example was not specified).", " ", "If the argument is not an existing file, then it is treated as", "an example name directly, causing RSpec to run just the example", "matching that name"], :specification => ["-s", "--specification [NAME]", "DEPRECATED - use -e instead", "(This will be removed when autotest works with -e)"], - :line => ["-l", "--line LINE_NUMBER", Integer, "Execute behaviout or specification at given line.", - "(does not work for dynamically generated specs)"], + :line => ["-l", "--line LINE_NUMBER", Integer, "Execute example group or example at given line.", + "(does not work for dynamically generated examples)"], :format => ["-f", "--format FORMAT[:WHERE]","Specifies what format to use for output. Specify WHERE to tell", "the formatter where to write the output. All built-in formats", - "expect WHERE to be a file name, and will write to STDOUT if it's", + "expect WHERE to be a file name, and will write to $stdout if it's", "not specified. The --format option may be specified several times", "if you want several outputs", " ", - "Builtin formats for examples: ", - "progress|p : Text progress", - "profile|o : Text progress with profiling of 10 slowest examples", - "specdoc|s : Example doc as text", - "indented|i : Example doc as indented text", + "Builtin formats:", + "silent|l : No output", "progress|p : Text-based progress bar", + "profile|o : Text-based progress bar with profiling of 10 slowest examples", + "specdoc|s : Code example doc strings", + "nested|n : Code example doc strings with nested groups indented", "html|h : A nice HTML report", "failing_examples|e : Write all failing examples - input for --example", "failing_example_groups|g : Write all failing example groups - input for --example", " ", - "Builtin formats for stories: ", - "plain|p : Plain Text", - "html|h : A nice HTML report", - " ", "FORMAT can also be the name of a custom formatter class", "(in which case you should also specify --require to load it)"], :require => ["-r", "--require FILE", "Require FILE before running specs", @@ -78,6 +78,7 @@ module Spec :options_file => ["-O", "--options PATH", "Read options from a file"], :generate_options => ["-G", "--generate-options PATH", "Generate an options file for --options"], :runner => ["-U", "--runner RUNNER", "Use a custom Runner."], + :debug => ["-u", "--debugger", "Enable ruby-debugging."], :drb => ["-X", "--drb", "Run examples via DRb. (For example against script/spec_server)"], :version => ["-v", "--version", "Show version"], :help => ["-h", "--help", "You're looking at it"] @@ -91,37 +92,49 @@ module Spec @file_factory = File - self.banner = "Usage: spec (FILE|DIRECTORY|GLOB)+ [options]" + self.banner = "Usage: spec (FILE(:LINE)?|DIRECTORY|GLOB)+ [options]" self.separator "" - on(*OPTIONS[:pattern]) {|pattern| @options.filename_pattern = pattern} - on(*OPTIONS[:diff]) {|diff| @options.parse_diff(diff)} - on(*OPTIONS[:colour]) {@options.colour = true} - on(*OPTIONS[:example]) {|example| @options.parse_example(example)} - on(*OPTIONS[:specification]) {|example| @options.parse_example(example)} - on(*OPTIONS[:line]) {|line_number| @options.line_number = line_number.to_i} - on(*OPTIONS[:format]) {|format| @options.parse_format(format)} - on(*OPTIONS[:require]) {|requires| invoke_requires(requires)} - on(*OPTIONS[:backtrace]) {@options.backtrace_tweaker = NoisyBacktraceTweaker.new} - on(*OPTIONS[:loadby]) {|loadby| @options.loadby = loadby} - on(*OPTIONS[:reverse]) {@options.reverse = true} - on(*OPTIONS[:timeout]) {|timeout| @options.timeout = timeout.to_f} - on(*OPTIONS[:heckle]) {|heckle| @options.load_heckle_runner(heckle)} - on(*OPTIONS[:dry_run]) {@options.dry_run = true} - on(*OPTIONS[:options_file]) {|options_file| parse_options_file(options_file)} + on(*OPTIONS[:pattern]) {|pattern| @options.filename_pattern = pattern} + on(*OPTIONS[:diff]) {|diff| @options.parse_diff(diff)} + on(*OPTIONS[:colour]) {@options.colour = true} + on(*OPTIONS[:example]) {|example| @options.parse_example(example)} + on(*OPTIONS[:specification]) {|example| @options.parse_example(example)} + on(*OPTIONS[:line]) {|line_number| @options.line_number = line_number.to_i} + on(*OPTIONS[:format]) {|format| @options.parse_format(format)} + on(*OPTIONS[:require]) {|requires| invoke_requires(requires)} + on(*OPTIONS[:backtrace]) {@options.backtrace_tweaker = NoisyBacktraceTweaker.new} + on(*OPTIONS[:loadby]) {|loadby| @options.loadby = loadby} + on(*OPTIONS[:reverse]) {@options.reverse = true} + on(*OPTIONS[:timeout]) {|timeout| @options.timeout = timeout.to_f} + on(*OPTIONS[:heckle]) {|heckle| @options.load_heckle_runner(heckle)} + on(*OPTIONS[:dry_run]) {@options.dry_run = true} + on(*OPTIONS[:options_file]) {|options_file|} on(*OPTIONS[:generate_options]) {|options_file|} - on(*OPTIONS[:runner]) {|runner| @options.user_input_for_runner = runner} - on(*OPTIONS[:drb]) {} - on(*OPTIONS[:version]) {parse_version} - on_tail(*OPTIONS[:help]) {parse_help} + on(*OPTIONS[:runner]) {|runner| @options.user_input_for_runner = runner} + on(*OPTIONS[:debug]) {@options.debug = true} + on(*OPTIONS[:drb]) {} + on(*OPTIONS[:version]) {parse_version} + on("--autospec") {@options.autospec = true} + on_tail(*OPTIONS[:help]) {parse_help} end def order!(argv, &blk) - @argv = argv + @argv = argv.dup + @argv = (@argv.empty? & self.class.spec_command?) ? ['--help'] : @argv + + # Parse options file first + parse_file_options(:options_file, :parse_options_file) + @options.argv = @argv.dup - return if parse_generate_options + return if parse_file_options(:generate_options, :write_options_file) return if parse_drb - + super(@argv) do |file| + if file =~ /^(.+):(\d+)$/ + file = $1 + @options.line_number = $2.to_i + end + @options.files << file blk.call(file) if blk end @@ -129,41 +142,46 @@ module Spec @options end - protected + protected + def invoke_requires(requires) requires.split(",").each do |file| require file end end - - def parse_options_file(options_file) - option_file_args = IO.readlines(options_file).map {|l| l.chomp.split " "}.flatten - @argv.push(*option_file_args) - # TODO - this is a brute force solution to http://rspec.lighthouseapp.com/projects/5645/tickets/293. - # Let's look for a cleaner way. Might not be one. But let's look. If not, perhaps - # this can be moved to a different method to indicate the special handling for drb? - parse_drb(@argv) - end - def parse_generate_options - # Remove the --generate-options option and the argument before writing to file + def parse_file_options(option_name, action) + # Remove the file option and the argument before handling the file options_file = nil - ['-G', '--generate-options'].each do |option| + options_list = OPTIONS[option_name][0..1] + options_list[1].gsub!(" PATH", "") + options_list.each do |option| if index = @argv.index(option) @argv.delete_at(index) options_file = @argv.delete_at(index) end end + if options_file.nil? && + File.exist?('spec/spec.opts') && + !@argv.any?{|a| a =~ /^\-/ } + options_file = 'spec/spec.opts' + end + if options_file - write_generated_options(options_file) + send(action, options_file) return true else return false end end - - def write_generated_options(options_file) + + def parse_options_file(options_file) + option_file_args = File.readlines(options_file).map {|l| l.chomp.split " "}.flatten + @argv.push(*option_file_args) + end + + def write_options_file(options_file) File.open(options_file, 'w') do |io| io.puts @argv.join("\n") end @@ -172,28 +190,30 @@ module Spec @options.examples_should_not_be_run end - def parse_drb(argv = nil) - argv ||= @options.argv # TODO - see note about about http://rspec.lighthouseapp.com/projects/5645/tickets/293 + def parse_drb + argv = @options.argv is_drb = false is_drb ||= argv.delete(OPTIONS[:drb][0]) is_drb ||= argv.delete(OPTIONS[:drb][1]) return false unless is_drb - @options.examples_should_not_be_run - DrbCommandLine.run( - self.class.parse(argv, @error_stream, @out_stream) - ) - true + if DrbCommandLine.run(self.class.parse(argv, @error_stream, @out_stream)) + @options.examples_should_not_be_run + true + else + @error_stream.puts "Running specs locally:" + false + end end def parse_version - @out_stream.puts ::Spec::VERSION::DESCRIPTION + @out_stream.puts ::Spec::VERSION::SUMMARY exit if stdout? end def parse_help @out_stream.puts self exit if stdout? - end + end def stdout? @out_stream == $stdout diff --git a/vendor/plugins/rspec/lib/spec/runner/options.rb b/vendor/plugins/rspec/lib/spec/runner/options.rb index 6716464af..e0179e80e 100644 --- a/vendor/plugins/rspec/lib/spec/runner/options.rb +++ b/vendor/plugins/rspec/lib/spec/runner/options.rb @@ -1,3 +1,5 @@ +require 'ostruct' + module Spec module Runner class Options @@ -6,9 +8,11 @@ module Spec } EXAMPLE_FORMATTERS = { # Load these lazily for better speed + 'silent' => ['spec/runner/formatter/silent_formatter', 'Formatter::SilentFormatter'], + 'l' => ['spec/runner/formatter/silent_formatter', 'Formatter::SilentFormatter'], 'specdoc' => ['spec/runner/formatter/specdoc_formatter', 'Formatter::SpecdocFormatter'], 's' => ['spec/runner/formatter/specdoc_formatter', 'Formatter::SpecdocFormatter'], - 'nested' => ['spec/runner/formatter/nested_text_formatter', 'Formatter::NestedTextFormatter'], + 'nested' => ['spec/runner/formatter/nested_text_formatter', 'Formatter::NestedTextFormatter'], 'n' => ['spec/runner/formatter/nested_text_formatter', 'Formatter::NestedTextFormatter'], 'html' => ['spec/runner/formatter/html_formatter', 'Formatter::HtmlFormatter'], 'h' => ['spec/runner/formatter/html_formatter', 'Formatter::HtmlFormatter'], @@ -23,22 +27,16 @@ module Spec 'textmate' => ['spec/runner/formatter/text_mate_formatter', 'Formatter::TextMateFormatter'] } - STORY_FORMATTERS = { - 'plain' => ['spec/runner/formatter/story/plain_text_formatter', 'Formatter::Story::PlainTextFormatter'], - 'p' => ['spec/runner/formatter/story/plain_text_formatter', 'Formatter::Story::PlainTextFormatter'], - 'html' => ['spec/runner/formatter/story/html_formatter', 'Formatter::Story::HtmlFormatter'], - 'h' => ['spec/runner/formatter/story/html_formatter', 'Formatter::Story::HtmlFormatter'] - } - attr_accessor( + :autospec, # hack to tell :filename_pattern, :backtrace_tweaker, :context_lines, :diff_format, :dry_run, :profile, - :examples, :heckle_runner, + :debug, :line_number, :loadby, :reporter, @@ -48,12 +46,10 @@ module Spec :user_input_for_runner, :error_stream, :output_stream, - :before_suite_parts, - :after_suite_parts, # TODO: BT - Figure out a better name :argv ) - attr_reader :colour, :differ_class, :files, :example_groups + attr_reader :colour, :differ_class, :files, :examples, :example_groups def initialize(error_stream, output_stream) @error_stream = error_stream @@ -64,6 +60,7 @@ module Spec @colour = false @profile = false @dry_run = false + @debug = false @reporter = Reporter.new(self) @context_lines = 3 @diff_format = :unified @@ -73,32 +70,80 @@ module Spec @examples_run = false @examples_should_be_run = nil @user_input_for_runner = nil - @before_suite_parts = [] @after_suite_parts = [] + @files_loaded = false + @out_used = nil end def add_example_group(example_group) @example_groups << example_group end + def line_number_requested? + !!line_number + end + + def example_line + Spec::Runner::LineNumberQuery.new(self).example_line_for(files.first, line_number) + end + def remove_example_group(example_group) @example_groups.delete(example_group) end + def require_ruby_debug + require 'rubygems' unless ENV['NO_RUBYGEMS'] + require 'ruby-debug' + end + + def project_root # :nodoc: + require 'pathname' + @project_root ||= determine_project_root + end + + def determine_project_root # :nodoc: + # This is borrowed (slightly modified) from Scott Taylors + # project_path project: + # http://github.com/smtlaissezfaire/project_path + Pathname(File.expand_path('.')).ascend do |path| + if File.exists?(File.join(path, "spec")) + return path + end + end + end + + def add_dir_from_project_root_to_load_path(dir, load_path=$LOAD_PATH) # :nodoc: + return if project_root.nil? + full_dir = File.join(project_root, dir) + load_path.unshift full_dir unless load_path.include?(full_dir) + end + def run_examples + require_ruby_debug if debug return true unless examples_should_be_run? success = true begin - before_suite_parts.each do |part| - part.call - end runner = custom_runner || ExampleGroupRunner.new(self) unless @files_loaded + ['spec','lib'].each do |dir| + add_dir_from_project_root_to_load_path(dir) + end runner.load_files(files_to_load) @files_loaded = true end + define_predicate_matchers + plugin_mock_framework + ignore_backtrace_patterns + + # TODO - this has to happen after the files get loaded, + # otherwise the before_suite_parts are not populated + # from the configuration. There is no spec for this + # directly, but features/before_and_after_blocks/before_and_after_blocks.story + # will fail if this happens before the files are loaded. + before_suite_parts.each { |part| part.call } + if example_groups.empty? true else @@ -110,25 +155,40 @@ module Spec end ensure after_suite_parts.each do |part| - part.call(success) + part.arity < 1 ? part.call : part.call(success) end end end + def before_suite_parts + Spec::Example::BeforeAndAfterHooks.before_suite_parts + end + + def after_suite_parts + Spec::Example::BeforeAndAfterHooks.after_suite_parts + end + def examples_run? @examples_run end def examples_should_not_be_run @examples_should_be_run = false - end + end + + def mock_framework + # TODO - don't like this dependency - perhaps store this in here instead? + Spec::Runner.configuration.mock_framework + end def colour=(colour) @colour = colour - if @colour && RUBY_PLATFORM =~ /win32/ ;\ + if @colour && RUBY_PLATFORM =~ /mswin|mingw/ ;\ begin ;\ - require 'rubygems' ;\ + replace_output = @output_stream.equal?($stdout) ;\ + require 'rubygems' unless ENV['NO_RUBYGEMS'] ;\ require 'Win32/Console/ANSI' ;\ + @output_stream = $stdout if replace_output ;\ rescue LoadError ;\ warn "You must 'gem install win32console' to use colour on Windows" ;\ @colour = false ;\ @@ -152,7 +212,7 @@ module Spec def parse_example(example) if(File.file?(example)) - @examples = File.open(example).read.split("\n") + @examples = [File.open(example).read.split("\n")].flatten else @examples = [example] end @@ -168,17 +228,12 @@ module Spec @format_options ||= [] @format_options << [format, where] end - + def formatters @format_options ||= [['progress', @output_stream]] @formatters ||= load_formatters(@format_options, EXAMPLE_FORMATTERS) end - def story_formatters - @format_options ||= [['plain', @output_stream]] - @formatters ||= load_formatters(@format_options, STORY_FORMATTERS) - end - def load_formatters(format_options, formatters) format_options.map do |format, where| formatter_type = if formatters[format] @@ -187,22 +242,31 @@ module Spec else load_class(format, 'formatter', '--format') end - formatter_type.new(self, where) + formatter_type.new(formatter_options, where) end end + def formatter_options + @formatter_options ||= OpenStruct.new( + :colour => colour, + :autospec => autospec, + :dry_run => dry_run + ) + end + + def which_heckle_runner + ([/mswin/, /java/].detect{|p| p =~ RUBY_PLATFORM} || Spec::Ruby.version.to_f == 1.9) ? "spec/runner/heckle_runner_unsupported" : "spec/runner/heckle_runner" + end + def load_heckle_runner(heckle) - suffix = [/mswin/, /java/].detect{|p| p =~ RUBY_PLATFORM} ? '_unsupported' : '' - require "spec/runner/heckle_runner#{suffix}" - @heckle_runner = HeckleRunner.new(heckle) + @format_options ||= [['silent', @output_stream]] + require which_heckle_runner + @heckle_runner = ::Spec::Runner::HeckleRunner.new(heckle) end def number_of_examples - total = 0 - @example_groups.each do |example_group| - total += example_group.number_of_examples - end - total + return examples.size unless examples.empty? + @example_groups.inject(0) {|sum, group| sum + group.number_of_examples} end def files_to_load @@ -220,13 +284,40 @@ module Spec end result end - - protected + + def dry_run? + @dry_run == true + end + + protected + + def define_predicate_matchers + Spec::Runner.configuration.predicate_matchers.each_pair do |matcher_method, method_on_object| + Spec::Example::ExampleMethods::__send__ :define_method, matcher_method do |*args| + eval("be_#{method_on_object.to_s.gsub('?','')}(*args)") + end + end + end + + def plugin_mock_framework + case mock_framework + when Module + Spec::Example::ExampleMethods.__send__ :include, mock_framework + else + require mock_framework + Spec::Example::ExampleMethods.__send__ :include, Spec::Adapters::MockFramework + end + end + + def ignore_backtrace_patterns + @backtrace_tweaker.ignore_patterns Spec::Runner.configuration.ignored_backtrace_patterns + end + def examples_should_be_run? return @examples_should_be_run unless @examples_should_be_run.nil? @examples_should_be_run = true end - + def differ_class=(klass) return unless klass @differ_class = klass @@ -250,24 +341,24 @@ module Spec if $_spec_spec ; raise e ; else exit(1) ; end end end - + def custom_runner return nil unless custom_runner? klass_name, arg = ClassAndArgumentsParser.parse(user_input_for_runner) - runner_type = load_class(klass_name, 'behaviour runner', '--runner') + runner_type = load_class(klass_name, 'example group runner', '--runner') return runner_type.new(self, arg) end def custom_runner? return user_input_for_runner ? true : false end - + def heckle heckle_runner = self.heckle_runner self.heckle_runner = nil heckle_runner.heckle_with end - + def sorted_files return sorter ? files.sort(&sorter) : files end @@ -277,26 +368,26 @@ module Spec end def default_differ - require 'spec/expectations/differs/default' - self.differ_class = Spec::Expectations::Differs::Default + require 'spec/runner/differs/default' + self.differ_class = ::Spec::Expectations::Differs::Default end def set_spec_from_line_number if examples.empty? if files.length == 1 if File.directory?(files[0]) - error_stream.puts "You must specify one file, not a directory when using the --line option" + error_stream.puts "You must specify one file, not a directory when providing a line number" exit(1) if stderr? else - example = SpecParser.new.spec_name_for(files[0], line_number) + example = LineNumberQuery.new(self).spec_name_for(files[0], line_number) @examples = [example] end else - error_stream.puts "Only one file can be specified when using the --line option: #{files.inspect}" + error_stream.puts "Only one file can be specified when providing a line number: #{files.inspect}" exit(3) if stderr? end else - error_stream.puts "You cannot use both --line and --example" + error_stream.puts "You cannot use --example and specify a line number" exit(4) if stderr? end end diff --git a/vendor/plugins/rspec/lib/spec/runner/reporter.rb b/vendor/plugins/rspec/lib/spec/runner/reporter.rb index 66db38406..0fae7d137 100644 --- a/vendor/plugins/rspec/lib/spec/runner/reporter.rb +++ b/vendor/plugins/rspec/lib/spec/runner/reporter.rb @@ -1,19 +1,23 @@ module Spec module Runner class Reporter - attr_reader :options, :example_groups + attr_reader :options def initialize(options) @options = options @options.reporter = self - clear + @failures = [] + @pending_count = 0 + @example_count = 0 + @start_time = nil + @end_time = nil end - def add_example_group(example_group) + def example_group_started(example_group) + @example_group = example_group formatters.each do |f| - f.add_example_group(example_group) + f.example_group_started(example_group) end - example_groups << example_group end def example_started(example) @@ -21,29 +25,27 @@ module Spec end def example_finished(example, error=nil) - @examples << example + @example_count += 1 if error.nil? example_passed(example) elsif Spec::Example::ExamplePendingError === error - example_pending(example, error.message) + example_pending(example, example.location, error.message) else example_failed(example, error) end end - def failure(example, error) + def example_failed(example, error) backtrace_tweaker.tweak_backtrace(error) - failure = Failure.new(example, error) + failure = Failure.new(@example_group.description, example.description, error) @failures << failure formatters.each do |f| f.example_failed(example, @failures.length, failure) end end - alias_method :example_failed, :failure def start(number_of_examples) - clear @start_time = Time.new formatters.each{|f| f.start(number_of_examples)} end @@ -58,12 +60,51 @@ module Spec dump_pending dump_failures formatters.each do |f| - f.dump_summary(duration, @examples.length, @failures.length, @pending_count) + f.dump_summary(duration, @example_count, @failures.length, @pending_count) f.close end @failures.length end + class Failure + def initialize(group_description, example_description, exception) # :nodoc: + @example_name = "#{group_description} #{example_description}" + @exception = exception + end + + # The Exception object raised + attr_reader :exception + + # Header messsage for reporting this failure, including the name of the + # example and an indicator of the type of failure. FAILED indicates a + # failed expectation. FIXED indicates a pending example that passes, and + # no longer needs to be pending. RuntimeError indicates that a + # RuntimeError occured. + # + # == Examples + # + # 'A new account should have a zero balance' FAILED + # 'A new account should have a zero balance' FIXED + # RuntimeError in 'A new account should have a zero balance' + def header + if expectation_not_met? + "'#{@example_name}' FAILED" + elsif pending_fixed? + "'#{@example_name}' FIXED" + else + "#{@exception.class.name} in '#{@example_name}'" + end + end + + def pending_fixed? # :nodoc: + @exception.is_a?(Spec::Example::PendingExampleFixedError) + end + + def expectation_not_met? # :nodoc: + @exception.is_a?(Spec::Expectations::ExpectationNotMetError) + end + end + private def formatters @@ -74,15 +115,6 @@ module Spec @options.backtrace_tweaker end - def clear - @example_groups = [] - @failures = [] - @pending_count = 0 - @examples = [] - @start_time = nil - @end_time = nil - end - def dump_failures return if @failures.empty? @failures.inject(1) do |index, failure| @@ -103,45 +135,37 @@ module Spec def example_passed(example) formatters.each{|f| f.example_passed(example)} end + + EXAMPLE_PENDING_DEPRECATION_WARNING = <<-WARNING + +********************************************************************* +DEPRECATION WARNING: RSpec's formatters have changed example_pending +to accept two arguments instead of three. Please see the rdoc +for Spec::Runner::Formatter::BaseFormatter#example_pending +for more information. + +Please update any custom formatters to accept only two arguments +to example_pending. Support for example_pending with two arguments +and this warning message will be removed after the RSpec 2.0 release. +********************************************************************* +WARNING - def example_pending(example, message="Not Yet Implemented") + def example_pending(example, ignore, message="Not Yet Implemented") @pending_count += 1 - formatters.each do |f| - f.example_pending(example, message) - end - end - - class Failure - attr_reader :example, :exception - - def initialize(example, exception) - @example = example - @exception = exception - end - - def header - if expectation_not_met? - "'#{example_name}' FAILED" - elsif pending_fixed? - "'#{example_name}' FIXED" + formatters.each do |formatter| + if formatter_uses_deprecated_example_pending_method?(formatter) + Spec.warn EXAMPLE_PENDING_DEPRECATION_WARNING + formatter.example_pending(example, message, example.location) else - "#{@exception.class.name} in '#{example_name}'" + formatter.example_pending(example, message) end end - - def pending_fixed? - @exception.is_a?(Spec::Example::PendingExampleFixedError) - end - - def expectation_not_met? - @exception.is_a?(Spec::Expectations::ExpectationNotMetError) - end - - protected - def example_name - @example.__full_description - end end + + def formatter_uses_deprecated_example_pending_method?(formatter) + formatter.method(:example_pending).arity == 3 + end + end end end diff --git a/vendor/plugins/rspec/lib/spec/runner/spec_parser.rb b/vendor/plugins/rspec/lib/spec/runner/spec_parser.rb deleted file mode 100644 index 8beb384e9..000000000 --- a/vendor/plugins/rspec/lib/spec/runner/spec_parser.rb +++ /dev/null @@ -1,71 +0,0 @@ -module Spec - module Runner - # Parses a spec file and finds the nearest example for a given line number. - class SpecParser - attr_reader :best_match - - def initialize - @best_match = {} - end - - def spec_name_for(file, line_number) - best_match.clear - file = File.expand_path(file) - rspec_options.example_groups.each do |example_group| - consider_example_groups_for_best_match example_group, file, line_number - - example_group.examples.each do |example| - consider_example_for_best_match example, example_group, file, line_number - end - end - if best_match[:example_group] - if best_match[:example] - "#{best_match[:example_group].description} #{best_match[:example].description}" - else - best_match[:example_group].description - end - else - nil - end - end - - protected - - def consider_example_groups_for_best_match(example_group, file, line_number) - parsed_backtrace = parse_backtrace(example_group.registration_backtrace) - parsed_backtrace.each do |example_file, example_line| - if is_best_match?(file, line_number, example_file, example_line) - best_match.clear - best_match[:example_group] = example_group - best_match[:line] = example_line - end - end - end - - def consider_example_for_best_match(example, example_group, file, line_number) - parsed_backtrace = parse_backtrace(example.implementation_backtrace) - parsed_backtrace.each do |example_file, example_line| - if is_best_match?(file, line_number, example_file, example_line) - best_match.clear - best_match[:example_group] = example_group - best_match[:example] = example - best_match[:line] = example_line - end - end - end - - def is_best_match?(file, line_number, example_file, example_line) - file == File.expand_path(example_file) && - example_line <= line_number && - example_line > best_match[:line].to_i - end - - def parse_backtrace(backtrace) - backtrace.collect do |trace_line| - split_line = trace_line.split(':') - [split_line[0], Integer(split_line[1])] - end - end - end - end -end diff --git a/vendor/plugins/rspec/lib/spec/story.rb b/vendor/plugins/rspec/lib/spec/story.rb deleted file mode 100644 index bc6960a28..000000000 --- a/vendor/plugins/rspec/lib/spec/story.rb +++ /dev/null @@ -1,10 +0,0 @@ -require 'spec' -require 'spec/story/extensions' -require 'spec/story/given_scenario' -require 'spec/story/runner' -require 'spec/story/scenario' -require 'spec/story/step' -require 'spec/story/step_group' -require 'spec/story/step_mother' -require 'spec/story/story' -require 'spec/story/world' diff --git a/vendor/plugins/rspec/lib/spec/story/extensions.rb b/vendor/plugins/rspec/lib/spec/story/extensions.rb deleted file mode 100644 index dc7dd1140..000000000 --- a/vendor/plugins/rspec/lib/spec/story/extensions.rb +++ /dev/null @@ -1,3 +0,0 @@ -require 'spec/story/extensions/main' -require 'spec/story/extensions/string' -require 'spec/story/extensions/regexp' diff --git a/vendor/plugins/rspec/lib/spec/story/extensions/main.rb b/vendor/plugins/rspec/lib/spec/story/extensions/main.rb deleted file mode 100644 index 6336b630c..000000000 --- a/vendor/plugins/rspec/lib/spec/story/extensions/main.rb +++ /dev/null @@ -1,86 +0,0 @@ -module Spec - module Story - module Extensions - module Main - def Story(title, narrative, params = {}, &body) - ::Spec::Story::Runner.story_runner.Story(title, narrative, params, &body) - end - - # Calling this deprecated is silly, since it hasn't been released yet. But, for - # those who are reading this - this will be deleted before the 1.1 release. - def run_story(*args, &block) - runner = Spec::Story::Runner::PlainTextStoryRunner.new(*args) - runner.instance_eval(&block) if block - runner.run - end - - # Creates (or appends to an existing) a namespaced group of steps for use in Stories - # - # == Examples - # - # # Creating a new group - # steps_for :forms do - # When("user enters $value in the $field field") do ... end - # When("user submits the $form form") do ... end - # end - def steps_for(tag, &block) - steps = rspec_story_steps[tag] - steps.instance_eval(&block) if block - steps - end - - # Creates a context for running a Plain Text Story with specific groups of Steps. - # Also supports adding arbitrary steps that will only be accessible to - # the Story being run. - # - # == Examples - # - # # Run a Story with one group of steps - # with_steps_for :checking_accounts do - # run File.dirname(__FILE__) + "/withdraw_cash" - # end - # - # # Run a Story, adding steps that are only available for this Story - # with_steps_for :accounts do - # Given "user is logged in as account administrator" - # run File.dirname(__FILE__) + "/reconcile_accounts" - # end - # - # # Run a Story with steps from two groups - # with_steps_for :checking_accounts, :savings_accounts do - # run File.dirname(__FILE__) + "/transfer_money" - # end - # - # # Run a Story with a specific Story extension - # with_steps_for :login, :navigation do - # run File.dirname(__FILE__) + "/user_changes_password", :type => RailsStory - # end - def with_steps_for(*tags, &block) - steps = Spec::Story::StepGroup.new do - extend StoryRunnerStepGroupAdapter - end - tags.each {|tag| steps << rspec_story_steps[tag]} - steps.instance_eval(&block) if block - steps - end - - private - - module StoryRunnerStepGroupAdapter - def run(path, options={}) - runner = Spec::Story::Runner::PlainTextStoryRunner.new(path, options) - runner.steps << self - runner.run - end - end - - def rspec_story_steps # :nodoc: - $rspec_story_steps ||= Spec::Story::StepGroupHash.new - end - - end - end - end -end - -include Spec::Story::Extensions::Main
\ No newline at end of file diff --git a/vendor/plugins/rspec/lib/spec/story/extensions/regexp.rb b/vendor/plugins/rspec/lib/spec/story/extensions/regexp.rb deleted file mode 100644 index 8ee338605..000000000 --- a/vendor/plugins/rspec/lib/spec/story/extensions/regexp.rb +++ /dev/null @@ -1,9 +0,0 @@ -class Regexp - def step_name - self.source.gsub '\\$', '$$' - end - - def arg_regexp - ::Spec::Story::Step::PARAM_OR_GROUP_PATTERN - end -end diff --git a/vendor/plugins/rspec/lib/spec/story/extensions/string.rb b/vendor/plugins/rspec/lib/spec/story/extensions/string.rb deleted file mode 100644 index 0e4ec1d68..000000000 --- a/vendor/plugins/rspec/lib/spec/story/extensions/string.rb +++ /dev/null @@ -1,9 +0,0 @@ -class String - def step_name - self - end - - def arg_regexp - ::Spec::Story::Step::PARAM_OR_GROUP_PATTERN - end -end diff --git a/vendor/plugins/rspec/lib/spec/story/given_scenario.rb b/vendor/plugins/rspec/lib/spec/story/given_scenario.rb deleted file mode 100644 index 88c51f981..000000000 --- a/vendor/plugins/rspec/lib/spec/story/given_scenario.rb +++ /dev/null @@ -1,14 +0,0 @@ -module Spec - module Story - class GivenScenario - def initialize(name) - @name = name - end - - def perform(instance, ignore_name) - scenario = Runner::StoryRunner.scenario_from_current_story(@name) - Runner::ScenarioRunner.new.run(scenario, instance) - end - end - end -end diff --git a/vendor/plugins/rspec/lib/spec/story/runner.rb b/vendor/plugins/rspec/lib/spec/story/runner.rb deleted file mode 100644 index 3d7ed59b5..000000000 --- a/vendor/plugins/rspec/lib/spec/story/runner.rb +++ /dev/null @@ -1,60 +0,0 @@ -require 'spec/story/runner/scenario_collector.rb' -require 'spec/story/runner/scenario_runner.rb' -require 'spec/story/runner/story_runner.rb' -require 'spec/story/runner/story_parser.rb' -require 'spec/story/runner/story_mediator.rb' -require 'spec/story/runner/plain_text_story_runner.rb' - -module Spec - module Story - module Runner - class << self - def run_options # :nodoc: - rspec_options - # @run_options ||= ::Spec::Runner::OptionParser.parse(ARGV, $stderr, $stdout) - end - - def story_runner # :nodoc: - unless @story_runner - @story_runner = create_story_runner - run_options.story_formatters.each do |formatter| - register_listener(formatter) - end - self.register_exit_hook - end - @story_runner - end - - def scenario_runner # :nodoc: - @scenario_runner ||= ScenarioRunner.new - end - - def world_creator # :nodoc: - @world_creator ||= World - end - - def create_story_runner - StoryRunner.new(scenario_runner, world_creator) - end - - # Use this to register a customer output formatter. - def register_listener(listener) - story_runner.add_listener(listener) # run_started, story_started, story_ended, #run_ended - world_creator.add_listener(listener) # found_scenario, step_succeeded, step_failed, step_failed - scenario_runner.add_listener(listener) # scenario_started, scenario_succeeded, scenario_pending, scenario_failed - end - - def register_exit_hook # :nodoc: - at_exit do - exit Runner.story_runner.run_stories unless $! - end - end - - def dry_run - run_options.dry_run - end - - end - end - end -end diff --git a/vendor/plugins/rspec/lib/spec/story/runner/plain_text_story_runner.rb b/vendor/plugins/rspec/lib/spec/story/runner/plain_text_story_runner.rb deleted file mode 100644 index a1bfbda4f..000000000 --- a/vendor/plugins/rspec/lib/spec/story/runner/plain_text_story_runner.rb +++ /dev/null @@ -1,48 +0,0 @@ -module Spec - module Story - module Runner - class PlainTextStoryRunner - # You can initialize a PlainTextStoryRunner with the path to the - # story file or a block, in which you can define the path using load. - # - # == Examples - # - # PlainTextStoryRunner.new('path/to/file') - # - # PlainTextStoryRunner.new do |runner| - # runner.load 'path/to/file' - # end - def initialize(*args) - @options = Hash === args.last ? args.pop : {} - @story_file = args.empty? ? nil : args.shift - yield self if block_given? - end - - def []=(key, value) - @options[key] = value - end - - def load(path) - @story_file = path - end - - def run(story_runner=Spec::Story::Runner.story_runner) - raise "You must set a path to the file with the story. See the RDoc." if @story_file.nil? - mediator = Spec::Story::Runner::StoryMediator.new(steps, story_runner, @options) - parser = Spec::Story::Runner::StoryParser.new(mediator) - - story_text = File.read(@story_file) - parser.parse(story_text.split("\n")) - - mediator.run_stories - end - - def steps - @step_group ||= Spec::Story::StepGroup.new - yield @step_group if block_given? - @step_group - end - end - end - end -end diff --git a/vendor/plugins/rspec/lib/spec/story/runner/scenario_collector.rb b/vendor/plugins/rspec/lib/spec/story/runner/scenario_collector.rb deleted file mode 100644 index 78339fd22..000000000 --- a/vendor/plugins/rspec/lib/spec/story/runner/scenario_collector.rb +++ /dev/null @@ -1,18 +0,0 @@ -module Spec - module Story - module Runner - class ScenarioCollector - attr_accessor :scenarios - - def initialize(story) - @story = story - @scenarios = [] - end - - def Scenario(name, &body) - @scenarios << Scenario.new(@story, name, &body) - end - end - end - end -end diff --git a/vendor/plugins/rspec/lib/spec/story/runner/scenario_runner.rb b/vendor/plugins/rspec/lib/spec/story/runner/scenario_runner.rb deleted file mode 100644 index 2d7c58d03..000000000 --- a/vendor/plugins/rspec/lib/spec/story/runner/scenario_runner.rb +++ /dev/null @@ -1,54 +0,0 @@ -module Spec - module Story - module Runner - class ScenarioRunner - def initialize - @listeners = [] - end - - def run(scenario, world) - @listeners.each { |l| l.scenario_started(scenario.story.title, scenario.name) } - run_story_ignoring_scenarios(scenario.story, world) - - world.start_collecting_errors - - unless scenario.body - @listeners.each { |l| l.scenario_pending(scenario.story.title, scenario.name, '') } - return true - end - - world.instance_eval(&scenario.body) - if world.errors.empty? - @listeners.each { |l| l.scenario_succeeded(scenario.story.title, scenario.name) } - else - if Spec::Example::ExamplePendingError === (e = world.errors.first) - @listeners.each { |l| l.scenario_pending(scenario.story.title, scenario.name, e.message) } - else - @listeners.each { |l| l.scenario_failed(scenario.story.title, scenario.name, e) } - return false - end - end - true - end - - def add_listener(listener) - @listeners << listener - end - - private - - def run_story_ignoring_scenarios(story, world) - class << world - def Scenario(name, &block) - # do nothing - end - end - story.run_in(world) - class << world - remove_method(:Scenario) - end - end - end - end - end -end diff --git a/vendor/plugins/rspec/lib/spec/story/runner/story_mediator.rb b/vendor/plugins/rspec/lib/spec/story/runner/story_mediator.rb deleted file mode 100644 index 826f322ee..000000000 --- a/vendor/plugins/rspec/lib/spec/story/runner/story_mediator.rb +++ /dev/null @@ -1,123 +0,0 @@ - module Spec - module Story - module Runner - - class StoryMediator - def initialize(step_group, runner, options={}) - @step_group = step_group - @stories = [] - @runner = runner - @options = options - end - - def stories - @stories.collect { |p| p.to_proc } - end - - def create_story(title, narrative) - @stories << Story.new(title, narrative, @step_group, @options) - end - - def create_scenario(title) - current_story.add_scenario Scenario.new(title) - end - - def create_given(name) - current_scenario.add_step Step.new('Given', name) - end - - def create_given_scenario(name) - current_scenario.add_step Step.new('GivenScenario', name) - end - - def create_when(name) - current_scenario.add_step Step.new('When', name) - end - - def create_then(name) - current_scenario.add_step Step.new('Then', name) - end - - def run_stories - stories.each { |story| @runner.instance_eval(&story) } - end - - private - def current_story - @stories.last - end - - def current_scenario - current_story.current_scenario - end - - class Story - def initialize(title, narrative, step_group, options) - @title = title - @narrative = narrative - @scenarios = [] - @step_group = step_group - @options = options - end - - def to_proc - title = @title - narrative = @narrative - scenarios = @scenarios.collect { |scenario| scenario.to_proc } - options = @options.merge(:steps_for => @step_group) - lambda do - Story title, narrative, options do - scenarios.each { |scenario| instance_eval(&scenario) } - end - end - end - - def add_scenario(scenario) - @scenarios << scenario - end - - def current_scenario - @scenarios.last - end - end - - class Scenario - def initialize(name) - @name = name - @steps = [] - end - - def to_proc - name = @name - steps = @steps.collect { |step| step.to_proc } - lambda do - Scenario name do - steps.each { |step| instance_eval(&step) } - end - end - end - - def add_step(step) - @steps << step - end - end - - class Step - def initialize(type, name) - @type = type - @name = name - end - - def to_proc - type = @type - name = @name - lambda do - send(type, name) - end - end - end - end - - end - end -end diff --git a/vendor/plugins/rspec/lib/spec/story/runner/story_parser.rb b/vendor/plugins/rspec/lib/spec/story/runner/story_parser.rb deleted file mode 100644 index d454df8cb..000000000 --- a/vendor/plugins/rspec/lib/spec/story/runner/story_parser.rb +++ /dev/null @@ -1,227 +0,0 @@ -module Spec - module Story - module Runner - - class IllegalStepError < StandardError - def initialize(state, event) - super("Illegal attempt to create a #{event} after a #{state}") - end - end - - class StoryParser - def initialize(story_mediator) - @story_mediator = story_mediator - @current_story_lines = [] - transition_to(:starting_state) - end - - def parse(lines) - lines.reject! {|line| line == ""} - until lines.empty? - process_line(lines.shift) - end - @state.eof - end - - def process_line(line) - line.strip! - case line - when /^Story: / then @state.story(line) - when /^Scenario: / then @state.scenario(line) - when /^Given:? / then @state.given(line) - when /^GivenScenario:? / then @state.given_scenario(line) - when /^When:? / then @state.event(line) - when /^Then:? / then @state.outcome(line) - when /^And:? / then @state.one_more_of_the_same(line) - else @state.other(line) - end - end - - def init_story(title) - @current_story_lines.clear - add_story_line(title) - end - - def add_story_line(line) - @current_story_lines << line - end - - def create_story() - unless @current_story_lines.empty? - @story_mediator.create_story(@current_story_lines[0].gsub("Story: ",""), @current_story_lines[1..-1].join("\n")) - @current_story_lines.clear - end - end - - def create_scenario(title) - @story_mediator.create_scenario(title.gsub("Scenario: ","")) - end - - def create_given(name) - @story_mediator.create_given(name) - end - - def create_given_scenario(name) - @story_mediator.create_given_scenario(name) - end - - def create_when(name) - @story_mediator.create_when(name) - end - - def create_then(name) - @story_mediator.create_then(name) - end - - def transition_to(key) - @state = states[key] - end - - def states - @states ||= { - :starting_state => StartingState.new(self), - :story_state => StoryState.new(self), - :scenario_state => ScenarioState.new(self), - :given_state => GivenState.new(self), - :when_state => WhenState.new(self), - :then_state => ThenState.new(self) - } - end - - class State - def initialize(parser) - @parser = parser - end - - def story(line) - @parser.init_story(line) - @parser.transition_to(:story_state) - end - - def scenario(line) - @parser.create_scenario(line) - @parser.transition_to(:scenario_state) - end - - def given(line) - @parser.create_given(remove_tag_from(:given, line)) - @parser.transition_to(:given_state) - end - - def given_scenario(line) - @parser.create_given_scenario(remove_tag_from(:givenscenario, line)) - @parser.transition_to(:given_state) - end - - def event(line) - @parser.create_when(remove_tag_from(:when, line)) - @parser.transition_to(:when_state) - end - - def outcome(line) - @parser.create_then(remove_tag_from(:then, line)) - @parser.transition_to(:then_state) - end - - def remove_tag_from(tag, line) - tokens = line.split - # validation of tag can go here - tokens[0].downcase.match(/#{tag.to_s}:?/) ? - (tokens[1..-1].join(' ')) : line - end - - def eof - end - - def other(line) - # no-op - supports header text before the first story in a file - end - end - - class StartingState < State - def initialize(parser) - @parser = parser - end - end - - class StoryState < State - def one_more_of_the_same(line) - other(line) - end - - def story(line) - @parser.create_story - @parser.add_story_line(line) - end - - def scenario(line) - @parser.create_story - @parser.create_scenario(line) - @parser.transition_to(:scenario_state) - end - - def given(line) - other(line) - end - - def event(line) - other(line) - end - - def outcome(line) - other(line) - end - - def other(line) - @parser.add_story_line(line) - end - - def eof - @parser.create_story - end - end - - class ScenarioState < State - def one_more_of_the_same(line) - raise IllegalStepError.new("Scenario", "And") - end - - def scenario(line) - @parser.create_scenario(line) - end - end - - class GivenState < State - def one_more_of_the_same(line) - @parser.create_given(remove_tag_from(:and, line)) - end - - def given(line) - @parser.create_given(remove_tag_from(:given, line)) - end - end - - class WhenState < State - def one_more_of_the_same(line) - @parser.create_when(remove_tag_from(:and ,line)) - end - - def event(line) - @parser.create_when(remove_tag_from(:when ,line)) - end - end - - class ThenState < State - def one_more_of_the_same(line) - @parser.create_then(remove_tag_from(:and ,line)) - end - - def outcome(line) - @parser.create_then(remove_tag_from(:then ,line)) - end - end - - end - end - end -end diff --git a/vendor/plugins/rspec/lib/spec/story/runner/story_runner.rb b/vendor/plugins/rspec/lib/spec/story/runner/story_runner.rb deleted file mode 100644 index a63479783..000000000 --- a/vendor/plugins/rspec/lib/spec/story/runner/story_runner.rb +++ /dev/null @@ -1,70 +0,0 @@ -module Spec - module Story - module Runner - class StoryRunner - class << self - attr_accessor :current_story_runner - - def scenario_from_current_story(scenario_name) - current_story_runner.scenario_from_current_story(scenario_name) - end - end - - attr_accessor :stories, :scenarios, :current_story - - def initialize(scenario_runner, world_creator = World) - StoryRunner.current_story_runner = self - @scenario_runner = scenario_runner - @world_creator = world_creator - @stories = [] - @scenarios_by_story = {} - @scenarios = [] - @listeners = [] - end - - def Story(title, narrative, params = {}, &body) - story = Story.new(title, narrative, params, &body) - @stories << story - - # collect scenarios - collector = ScenarioCollector.new(story) - story.run_in(collector) - @scenarios += collector.scenarios - @scenarios_by_story[story.title] = collector.scenarios - end - - def run_stories - return if @stories.empty? - @listeners.each { |l| l.run_started(scenarios.size) } - success = true - @stories.each do |story| - story.assign_steps_to(World) - @current_story = story - @listeners.each { |l| l.story_started(story.title, story.narrative) } - scenarios = @scenarios_by_story[story.title] - scenarios.each do |scenario| - type = story[:type] || Object - args = story[:args] || [] - world = @world_creator.create(type, *args) - success = success & @scenario_runner.run(scenario, world) - end - @listeners.each { |l| l.story_ended(story.title, story.narrative) } - World.step_mother.clear - end - unique_steps = (World.step_names.collect {|n| Regexp === n ? n.source : n.to_s}).uniq.sort - @listeners.each { |l| l.collected_steps(unique_steps) } - @listeners.each { |l| l.run_ended } - return success - end - - def add_listener(listener) - @listeners << listener - end - - def scenario_from_current_story(scenario_name) - @scenarios_by_story[@current_story.title].find {|s| s.name == scenario_name } - end - end - end - end -end diff --git a/vendor/plugins/rspec/lib/spec/story/scenario.rb b/vendor/plugins/rspec/lib/spec/story/scenario.rb deleted file mode 100644 index d83b3eeb8..000000000 --- a/vendor/plugins/rspec/lib/spec/story/scenario.rb +++ /dev/null @@ -1,14 +0,0 @@ - -module Spec - module Story - class Scenario - attr_accessor :name, :body, :story - - def initialize(story, name, &body) - @story = story - @name = name - @body = body - end - end - end -end diff --git a/vendor/plugins/rspec/lib/spec/story/step.rb b/vendor/plugins/rspec/lib/spec/story/step.rb deleted file mode 100644 index 5cd8765d6..000000000 --- a/vendor/plugins/rspec/lib/spec/story/step.rb +++ /dev/null @@ -1,58 +0,0 @@ -module Spec - module Story - class Step - PARAM_PATTERN = /([^\\]|^)(\$(?!\$)\w*)/ - PARAM_OR_GROUP_PATTERN = /(\$(?!\$)\w*)|\(.*?\)/ - - attr_reader :name - def initialize(name, &block) - @name = name - assign_expression(name) - init_module(name, &block) - end - - def perform(instance, *args) - instance.extend(@mod) - instance.__send__(sanitize(@name), *args) - end - - def init_module(name, &block) - sanitized_name = sanitize(name) - @mod = Module.new do - define_method(sanitized_name, &block) - end - end - - def sanitize(a_string_or_regexp) - return a_string_or_regexp.source if Regexp == a_string_or_regexp - a_string_or_regexp.to_s - end - - - def matches?(name) - !(matches = name.match(@expression)).nil? - end - - def parse_args(name) - name.match(@expression)[1..-1] - end - - private - - def assign_expression(string_or_regexp) - if String === string_or_regexp - expression = string_or_regexp.dup - expression.gsub! '(', '\(' - expression.gsub! ')', '\)' - elsif Regexp === string_or_regexp - expression = string_or_regexp.source - end - while expression =~ PARAM_PATTERN - expression.gsub!($2, "(.*?)") - end - @expression = Regexp.new("^#{expression}$") - end - - end - end -end diff --git a/vendor/plugins/rspec/lib/spec/story/step_group.rb b/vendor/plugins/rspec/lib/spec/story/step_group.rb deleted file mode 100644 index cae558c40..000000000 --- a/vendor/plugins/rspec/lib/spec/story/step_group.rb +++ /dev/null @@ -1,89 +0,0 @@ -module Spec - module Story - - class StepGroupHash < Hash - def initialize - super do |h,k| - h[k] = Spec::Story::StepGroup.new - end - end - end - - class StepGroup - def self.steps(&block) - @step_group ||= StepGroup.new(false) - @step_group.instance_eval(&block) if block - @step_group - end - - def initialize(init_defaults=true, &block) - @hash_of_lists_of_steps = Hash.new {|h, k| h[k] = []} - if init_defaults - self.class.steps.add_to(self) - end - instance_eval(&block) if block - end - - def find(type, name) - @hash_of_lists_of_steps[type].each do |step| - return step if step.matches?(name) - end - return nil - end - - def GivenScenario(name, &block) - create_matcher(:given_scenario, name, &block) - end - - def Given(name, &block) - create_matcher(:given, name, &block) - end - - def When(name, &block) - create_matcher(:when, name, &block) - end - - def Then(name, &block) - create_matcher(:then, name, &block) - end - - alias :given_scenario :GivenScenario - alias :given :Given - alias :when :When - alias :then :Then - - def add(type, steps) - (@hash_of_lists_of_steps[type] << steps).flatten! - end - - def clear - @hash_of_lists_of_steps.clear - end - - def empty? - [:given_scenario, :given, :when, :then].each do |type| - return false unless @hash_of_lists_of_steps[type].empty? - end - return true - end - - def add_to(other_step_matchers) - [:given_scenario, :given, :when, :then].each do |type| - other_step_matchers.add(type, @hash_of_lists_of_steps[type]) - end - end - - def <<(other_step_matchers) - other_step_matchers.add_to(self) if other_step_matchers.respond_to?(:add_to) - end - - # TODO - make me private - def create_matcher(type, name, &block) - matcher = Step.new(name, &block) - @hash_of_lists_of_steps[type] << matcher - matcher - end - - end - end -end diff --git a/vendor/plugins/rspec/lib/spec/story/step_mother.rb b/vendor/plugins/rspec/lib/spec/story/step_mother.rb deleted file mode 100644 index a2e84e310..000000000 --- a/vendor/plugins/rspec/lib/spec/story/step_mother.rb +++ /dev/null @@ -1,37 +0,0 @@ -module Spec - module Story - class StepMother - def initialize - @steps = StepGroup.new - end - - def use(new_step_group) - @steps << new_step_group - end - - def store(type, step) - @steps.add(type, step) - end - - def find(type, name) - if @steps.find(type, name).nil? - @steps.add(type, - Step.new(name) do - raise Spec::Example::ExamplePendingError.new("Unimplemented step: #{name}") - end - ) - end - @steps.find(type, name) - end - - def clear - @steps.clear - end - - def empty? - @steps.empty? - end - - end - end -end diff --git a/vendor/plugins/rspec/lib/spec/story/story.rb b/vendor/plugins/rspec/lib/spec/story/story.rb deleted file mode 100644 index 9cd1a0fec..000000000 --- a/vendor/plugins/rspec/lib/spec/story/story.rb +++ /dev/null @@ -1,39 +0,0 @@ -module Spec - module Story - class Story - attr_reader :title, :narrative - - def initialize(title, narrative, params = {}, &body) - @body = body - @title = title - @narrative = narrative - @params = params - end - - def [](key) - @params[key] - end - - def run_in(obj) - obj.instance_eval(&@body) - end - - def assign_steps_to(assignee) - if steps=@params[:steps_for] - steps = [steps] unless steps.is_a?(Array) - steps.each do |step| - if step.is_a?(StepGroup) - assignee.use(step) - else - assignee.use(steps_for(step)) - end - end - end - end - - def steps_for(key) - $rspec_story_steps[key] - end - end - end -end diff --git a/vendor/plugins/rspec/lib/spec/story/world.rb b/vendor/plugins/rspec/lib/spec/story/world.rb deleted file mode 100644 index a27d3dda9..000000000 --- a/vendor/plugins/rspec/lib/spec/story/world.rb +++ /dev/null @@ -1,124 +0,0 @@ -require 'spec/expectations' -require 'spec/matchers' -require 'spec/example/pending' - -module Spec - module Story -=begin - A World represents the actual instance a scenario will run in. - - The runner ensures any instance variables and methods defined anywhere - in a story block are available to all the scenarios. This includes - variables that are created or referenced inside Given, When and Then - blocks. -=end - module World - include ::Spec::Example::Pending - include ::Spec::Matchers - # store steps and listeners in the singleton metaclass. - # This serves both to keep them out of the way of runtime Worlds - # and to make them available to all instances. - class << self - def create(cls = Object, *args) - cls.new(*args).extend(World) - end - - def listeners - @listeners ||= [] - end - - def add_listener(listener) - listeners() << listener - end - - def step_mother - @step_mother ||= StepMother.new - end - - def use(steps) - step_mother.use(steps) - end - - def step_names - @step_names ||= [] - end - - def run_given_scenario_with_suspended_listeners(world, type, name, scenario) - current_listeners = Array.new(listeners) - begin - listeners.each { |l| l.found_scenario(type, name) } - @listeners.clear - scenario.perform(world, name) unless ::Spec::Story::Runner.dry_run - ensure - @listeners.replace(current_listeners) - end - end - - def store_and_call(world, type, name, *args, &block) - if block_given? - step_mother.store(type, Step.new(name, &block)) - end - step = step_mother.find(type, name) - - step_name = step.name - step_names << step_name - - # It's important to have access to the parsed args here, so - # we can give them to the listeners. The HTML reporter needs - # the args so it can style them. See the generated output in - # story_server/prototype/rspec_stories.html (generated by rake stories) - args = step.parse_args(name) if args.empty? - begin - listeners.each { |l| l.step_upcoming(type, step_name, *args) } - step.perform(world, *args) unless ::Spec::Story::Runner.dry_run - listeners.each { |l| l.step_succeeded(type, step_name, *args) } - rescue Exception => e - case e - when Spec::Example::ExamplePendingError - @listeners.each { |l| l.step_pending(type, step_name, *args) } - else - @listeners.each { |l| l.step_failed(type, step_name, *args) } - end - errors << e - end - end - - def errors - @errors ||= [] - end - end # end of class << self - - def start_collecting_errors - errors.clear - end - - def errors - World.errors - end - - def GivenScenario(name) - World.run_given_scenario_with_suspended_listeners(self, :'given scenario', name, GivenScenario.new(name)) - @__previous_step = :given - end - - def Given(name, *args, &block) - World.store_and_call self, :given, name, *args, &block - @__previous_step = :given - end - - def When(name, *args, &block) - World.store_and_call self, :when, name, *args, &block - @__previous_step = :when - end - - def Then(name, *args, &block) - World.store_and_call self, :then, name, *args, &block - @__previous_step = :then - end - - def And(name, *args, &block) - World.store_and_call self, @__previous_step, name, *args, &block - end - end - end -end diff --git a/vendor/plugins/rspec/lib/spec/translator.rb b/vendor/plugins/rspec/lib/spec/translator.rb deleted file mode 100644 index c1e07eda4..000000000 --- a/vendor/plugins/rspec/lib/spec/translator.rb +++ /dev/null @@ -1,114 +0,0 @@ -require 'fileutils' - -module Spec - class Translator - def translate(from, to) - from = File.expand_path(from) - to = File.expand_path(to) - if File.directory?(from) - translate_dir(from, to) - elsif(from =~ /\.rb$/) - translate_file(from, to) - end - end - - def translate_dir(from, to) - FileUtils.mkdir_p(to) unless File.directory?(to) - Dir["#{from}/*"].each do |sub_from| - path = sub_from[from.length+1..-1] - sub_to = File.join(to, path) - translate(sub_from, sub_to) - end - end - - def translate_file(from, to) - translation = "" - File.open(from) do |io| - io.each_line do |line| - translation << translate_line(line) - end - end - File.open(to, "w") do |io| - io.write(translation) - end - end - - def translate_line(line) - # Translate deprecated mock constraints - line.gsub!(/:any_args/, 'any_args') - line.gsub!(/:anything/, 'anything') - line.gsub!(/:boolean/, 'boolean') - line.gsub!(/:no_args/, 'no_args') - line.gsub!(/:numeric/, 'an_instance_of(Numeric)') - line.gsub!(/:string/, 'an_instance_of(String)') - - return line if line =~ /(should_not|should)_receive/ - - line.gsub!(/(^\s*)context([\s*|\(]['|"|A-Z])/, '\1describe\2') - line.gsub!(/(^\s*)specify([\s*|\(]['|"|A-Z])/, '\1it\2') - line.gsub!(/(^\s*)context_setup(\s*[do|\{])/, '\1before(:all)\2') - line.gsub!(/(^\s*)context_teardown(\s*[do|\{])/, '\1after(:all)\2') - line.gsub!(/(^\s*)setup(\s*[do|\{])/, '\1before(:each)\2') - line.gsub!(/(^\s*)teardown(\s*[do|\{])/, '\1after(:each)\2') - - if line =~ /(.*\.)(should_not|should)(?:_be)(?!_)(.*)/m - pre = $1 - should = $2 - post = $3 - be_or_equal = post =~ /(<|>)/ ? "be" : "equal" - - return "#{pre}#{should} #{be_or_equal}#{post}" - end - - if line =~ /(.*\.)(should_not|should)_(?!not)\s*(.*)/m - pre = $1 - should = $2 - post = $3 - - post.gsub!(/^raise/, 'raise_error') - post.gsub!(/^throw/, 'throw_symbol') - - unless standard_matcher?(post) - post = "be_#{post}" - end - - # Add parenthesis - post.gsub!(/^(\w+)\s+([\w|\.|\,|\(.*\)|\'|\"|\:|@| ]+)(\})/, '\1(\2)\3') # inside a block - post.gsub!(/^(redirect_to)\s+(.*)/, '\1(\2)') # redirect_to, which often has http: - post.gsub!(/^(\w+)\s+([\w|\.|\,|\(.*\)|\{.*\}|\'|\"|\:|@| ]+)/, '\1(\2)') - post.gsub!(/(\s+\))/, ')') - post.gsub!(/\)\}/, ') }') - post.gsub!(/^(\w+)\s+(\/.*\/)/, '\1(\2)') #regexps - line = "#{pre}#{should} #{post}" - end - - line - end - - def standard_matcher?(matcher) - patterns = [ - /^be/, - /^be_close/, - /^eql/, - /^equal/, - /^has/, - /^have/, - /^change/, - /^include/, - /^match/, - /^raise_error/, - /^respond_to/, - /^redirect_to/, - /^satisfy/, - /^throw_symbol/, - # Extra ones that we use in spec_helper - /^pass/, - /^fail/, - /^fail_with/, - ] - matched = patterns.detect{ |p| matcher =~ p } - !matched.nil? - end - - end -end diff --git a/vendor/plugins/rspec/lib/spec/version.rb b/vendor/plugins/rspec/lib/spec/version.rb index 959bf5189..b1088cd69 100644 --- a/vendor/plugins/rspec/lib/spec/version.rb +++ b/vendor/plugins/rspec/lib/spec/version.rb @@ -1,22 +1,14 @@ -module Spec
- module VERSION
- unless defined? MAJOR
- MAJOR = 1
- MINOR = 1
- TINY = 4
- RELEASE_CANDIDATE = nil
-
- BUILD_TIME_UTC = 20080526202855
-
- STRING = [MAJOR, MINOR, TINY].join('.')
- TAG = "REL_#{[MAJOR, MINOR, TINY, RELEASE_CANDIDATE].compact.join('_')}".upcase.gsub(/\.|-/, '_')
- FULL_VERSION = "#{[MAJOR, MINOR, TINY, RELEASE_CANDIDATE].compact.join('.')} (build #{BUILD_TIME_UTC})"
-
- NAME = "RSpec"
- URL = "http://rspec.rubyforge.org/"
-
- DESCRIPTION = "#{NAME}-#{FULL_VERSION} - BDD for Ruby\n#{URL}"
- end
- end
-end
-
+module Spec # :nodoc: + module VERSION # :nodoc: + unless defined? MAJOR + MAJOR = 1 + MINOR = 2 + TINY = 9 + PRE = nil + + STRING = [MAJOR, MINOR, TINY, PRE].compact.join('.') + + SUMMARY = "rspec #{STRING}" + end + end +end diff --git a/vendor/plugins/rspec/plugins/mock_frameworks/flexmock.rb b/vendor/plugins/rspec/plugins/mock_frameworks/flexmock.rb deleted file mode 100644 index 6875a5222..000000000 --- a/vendor/plugins/rspec/plugins/mock_frameworks/flexmock.rb +++ /dev/null @@ -1,23 +0,0 @@ -#!/usr/bin/env ruby -# -# Created by Jim Weirich on 2007-04-10. -# Copyright (c) 2007. All rights reserved. - -require 'flexmock/rspec' - -module Spec - module Plugins - module MockFramework - include FlexMock::MockContainer - def setup_mocks_for_rspec - # No setup required - end - def verify_mocks_for_rspec - flexmock_verify - end - def teardown_mocks_for_rspec - flexmock_close - end - end - end -end diff --git a/vendor/plugins/rspec/plugins/mock_frameworks/mocha.rb b/vendor/plugins/rspec/plugins/mock_frameworks/mocha.rb deleted file mode 100644 index 69d11636c..000000000 --- a/vendor/plugins/rspec/plugins/mock_frameworks/mocha.rb +++ /dev/null @@ -1,19 +0,0 @@ -require 'mocha/standalone' -require 'mocha/object' - -module Spec - module Plugins - module MockFramework - include Mocha::Standalone - def setup_mocks_for_rspec - mocha_setup - end - def verify_mocks_for_rspec - mocha_verify - end - def teardown_mocks_for_rspec - mocha_teardown - end - end - end -end diff --git a/vendor/plugins/rspec/plugins/mock_frameworks/rr.rb b/vendor/plugins/rspec/plugins/mock_frameworks/rr.rb deleted file mode 100644 index c019c18a1..000000000 --- a/vendor/plugins/rspec/plugins/mock_frameworks/rr.rb +++ /dev/null @@ -1,21 +0,0 @@ -require 'rr' - -patterns = ::Spec::Runner::QuietBacktraceTweaker::IGNORE_PATTERNS -patterns.push(RR::Errors::BACKTRACE_IDENTIFIER) - -module Spec - module Plugins - module MockFramework - include RR::Extensions::InstanceMethods - def setup_mocks_for_rspec - RR::Space.instance.reset - end - def verify_mocks_for_rspec - RR::Space.instance.verify_doubles - end - def teardown_mocks_for_rspec - RR::Space.instance.reset - end - end - end -end diff --git a/vendor/plugins/rspec/plugins/mock_frameworks/rspec.rb b/vendor/plugins/rspec/plugins/mock_frameworks/rspec.rb deleted file mode 100644 index f831cb2ba..000000000 --- a/vendor/plugins/rspec/plugins/mock_frameworks/rspec.rb +++ /dev/null @@ -1,20 +0,0 @@ -require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "lib", "spec", "mocks")) -require 'spec/mocks/framework' -require 'spec/mocks/extensions' - -module Spec - module Plugins - module MockFramework - include Spec::Mocks::ExampleMethods - def setup_mocks_for_rspec - $rspec_mocks ||= Spec::Mocks::Space.new - end - def verify_mocks_for_rspec - $rspec_mocks.verify_all - end - def teardown_mocks_for_rspec - $rspec_mocks.reset_all - end - end - end -end diff --git a/vendor/plugins/rspec/rake_tasks/examples.rake b/vendor/plugins/rspec/rake_tasks/examples.rake deleted file mode 100644 index 32d0ad0e6..000000000 --- a/vendor/plugins/rspec/rake_tasks/examples.rake +++ /dev/null @@ -1,7 +0,0 @@ -require 'rake' -require 'spec/rake/spectask' - -desc "Run all examples" -Spec::Rake::SpecTask.new('examples') do |t| - t.spec_files = FileList['examples/**/*.rb'] -end diff --git a/vendor/plugins/rspec/rake_tasks/examples_with_rcov.rake b/vendor/plugins/rspec/rake_tasks/examples_with_rcov.rake deleted file mode 100644 index 4bf35c6b8..000000000 --- a/vendor/plugins/rspec/rake_tasks/examples_with_rcov.rake +++ /dev/null @@ -1,9 +0,0 @@ -require 'rake' -require 'spec/rake/spectask' - -desc "Run all examples with RCov" -Spec::Rake::SpecTask.new('examples_with_rcov') do |t| - t.spec_files = FileList['examples/**/*.rb'] - t.rcov = true - t.rcov_opts = ['--exclude', 'examples'] -end
\ No newline at end of file diff --git a/vendor/plugins/rspec/rake_tasks/failing_examples_with_html.rake b/vendor/plugins/rspec/rake_tasks/failing_examples_with_html.rake deleted file mode 100644 index 34549583d..000000000 --- a/vendor/plugins/rspec/rake_tasks/failing_examples_with_html.rake +++ /dev/null @@ -1,9 +0,0 @@ -require 'rake' -require 'spec/rake/spectask' - -desc "Generate HTML report for failing examples" -Spec::Rake::SpecTask.new('failing_examples_with_html') do |t| - t.spec_files = FileList['failing_examples/**/*.rb'] - t.spec_opts = ["--format", "html:../doc/output/documentation/tools/failing_examples.html", "--diff"] - t.fail_on_error = false -end
\ No newline at end of file diff --git a/vendor/plugins/rspec/rake_tasks/verify_rcov.rake b/vendor/plugins/rspec/rake_tasks/verify_rcov.rake deleted file mode 100644 index a90a266df..000000000 --- a/vendor/plugins/rspec/rake_tasks/verify_rcov.rake +++ /dev/null @@ -1,7 +0,0 @@ -require 'rake' -require 'spec/rake/verify_rcov' - -RCov::VerifyTask.new(:verify_rcov => :spec) do |t| - t.threshold = 100.0 # Make sure you have rcov 0.7 or higher! - t.index_html = '../doc/output/coverage/index.html' -end diff --git a/vendor/plugins/rspec/spec.opts b/vendor/plugins/rspec/spec.opts deleted file mode 100644 index e9b65f0ac..000000000 --- a/vendor/plugins/rspec/spec.opts +++ /dev/null @@ -1,6 +0,0 @@ ---colour ---format -specdoc ---loadby -mtime ---reverse diff --git a/vendor/plugins/rspec/spec/autotest/discover_spec.rb b/vendor/plugins/rspec/spec/autotest/discover_spec.rb index da5cb1445..fc8d483af 100644 --- a/vendor/plugins/rspec/spec/autotest/discover_spec.rb +++ b/vendor/plugins/rspec/spec/autotest/discover_spec.rb @@ -1,19 +1,8 @@ -require File.dirname(__FILE__) + "/../autotest_helper" +require 'spec/autotest/autotest_helper' -module DiscoveryHelper - def load_discovery - require File.dirname(__FILE__) + "/../../lib/autotest/discover" +describe Autotest::Rspec, "discovery" do + it "adds the rspec autotest plugin" do + Autotest.should_receive(:add_discovery) + load File.expand_path(File.dirname(__FILE__) + "/../../lib/autotest/discover.rb") end -end - - -class Autotest - describe Rspec, "discovery" do - include DiscoveryHelper - - it "should add the rspec autotest plugin" do - Autotest.should_receive(:add_discovery).and_yield - load_discovery - end - end -end +end diff --git a/vendor/plugins/rspec/spec/autotest/rspec_spec.rb b/vendor/plugins/rspec/spec/autotest/rspec_spec.rb index 3abe3fdd5..6dea29dd9 100644 --- a/vendor/plugins/rspec/spec/autotest/rspec_spec.rb +++ b/vendor/plugins/rspec/spec/autotest/rspec_spec.rb @@ -1,111 +1,9 @@ -require File.dirname(__FILE__) + "/../autotest_helper" +require 'spec/autotest/autotest_helper' -class Autotest - - module AutotestHelper - def rspec_output - <<-HERE -.............PPF - -1) -'false should be false' FAILED -expected: true, - got: false (using ==) -./spec/autotest/rspec_spec.rb:203: - -Finished in 0.158674 seconds - -16 examples, 1 failure, 2 pending - -Pending: -Autotest::Rspec handling failed results should return an array of failed examples and errors (TODO) -Autotest::Rspec tests/specs for a given file should find all the specs for a given file (TODO) -HERE - end - - - def common_setup - @proc = mock Proc - @kernel = mock Kernel - @kernel.stub!(:proc).and_return @proc - - File.stub!(:exists).and_return true - @windows_alt_separator = "\\" - @posix_separator = '/' - - @rspec_output = rspec_output - end - end - - describe Rspec, "rspec_commands" do - it "should contain the various commands, ordered by preference" do - Rspec.new.spec_commands.should == [ - File.expand_path("#{File.dirname(__FILE__)}/../../bin/spec"), - "#{Config::CONFIG['bindir']}/spec" - ] - end - end - - describe Rspec, "selection of rspec command" do - include AutotestHelper - +describe Autotest::Rspec do + describe "adding spec.opts --options" do before(:each) do - common_setup - @rspec_autotest = Rspec.new - end - - it "should try to find the spec command if it exists in ./bin and use it above everything else" do - File.stub!(:exists?).and_return true - - spec_path = File.expand_path("#{File.dirname(__FILE__)}/../../bin/spec") - File.should_receive(:exists?).with(spec_path).and_return true - @rspec_autotest.spec_command.should == spec_path - end - - it "should otherwise select the default spec command in gem_dir/bin/spec" do - @rspec_autotest.stub!(:spec_commands).and_return ["/foo/spec"] - Config::CONFIG.stub!(:[]).and_return "/foo" - File.should_receive(:exists?).with("/foo/spec").and_return(true) - - @rspec_autotest.spec_command.should == "/foo/spec" - end - - it "should raise an error if no spec command is found at all" do - File.stub!(:exists?).and_return false - - lambda { - @rspec_autotest.spec_command - }.should raise_error(RspecCommandError, "No spec command could be found!") - end - - end - - describe Rspec, "selection of rspec command (windows compatibility issues)" do - include AutotestHelper - - before(:each) do - common_setup - end - - it "should use the ALT_SEPARATOR if it is non-nil" do - @rspec_autotest = Rspec.new - spec_command = File.expand_path("#{File.dirname(__FILE__)}/../../bin/spec") - @rspec_autotest.stub!(:spec_commands).and_return [spec_command] - @rspec_autotest.spec_command(@windows_alt_separator).should == spec_command.gsub('/', @windows_alt_separator) - end - - it "should not use the ALT_SEPATOR if it is nil" do - @windows_alt_separator = nil - @rspec_autotest = Rspec.new - spec_command = File.expand_path("#{File.dirname(__FILE__)}/../../bin/spec") - @rspec_autotest.stub!(:spec_commands).and_return [spec_command] - @rspec_autotest.spec_command.should == spec_command - end - end - - describe Rspec, "adding spec.opts --options" do - before(:each) do - @rspec_autotest = Rspec.new + @rspec_autotest = Autotest::Rspec.new end it "should return the command line option to add spec.opts if the options file exists" do @@ -115,18 +13,18 @@ HERE it "should return an empty string if no spec.opts exists" do File.stub!(:exist?).and_return false - Rspec.new.add_options_if_present.should == "" + Autotest::Rspec.new.add_options_if_present.should == "" end end - - describe Rspec do + + describe "commands" do before(:each) do - @rspec_autotest = Rspec.new + @rspec_autotest = Autotest::Rspec.new @rspec_autotest.stub!(:ruby).and_return "ruby" @rspec_autotest.stub!(:add_options_if_present).and_return "-O spec/spec.opts" - + @ruby = @rspec_autotest.ruby - @spec_command = @rspec_autotest.spec_command + @spec_cmd = File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'bin', 'spec')) @options = @rspec_autotest.add_options_if_present @files_to_test = { :spec => ["file_one", "file_two"] @@ -136,52 +34,57 @@ HERE @files_to_test.stub!(:keys).and_return @files_to_test[:spec] @to_test = @files_to_test.keys.flatten.join ' ' end - - it "should make the apropriate test command" do - @rspec_autotest.make_test_cmd(@files_to_test).should == "#{@ruby} -S #{@spec_command} #{@options} #{@to_test}" + + it "should make the appropriate test command" do + @rspec_autotest.make_test_cmd(@files_to_test).should == "#{@ruby} #{@spec_cmd} --autospec #{@to_test} #{@options}" + end + + it "should return a blank command for no files" do + @rspec_autotest.make_test_cmd({}).should == '' end end + + describe "mappings" do - describe Rspec, "mappings" do - before(:each) do @lib_file = "lib/something.rb" @spec_file = "spec/something_spec.rb" - @rspec_autotest = Rspec.new + @rspec_autotest = Autotest::Rspec.new @rspec_autotest.hook :initialize end - + it "should find the spec file for a given lib file" do @rspec_autotest.should map_specs([@spec_file]).to(@lib_file) end - + it "should find the spec file if given a spec file" do @rspec_autotest.should map_specs([@spec_file]).to(@spec_file) end - - it "should only find the file if the file is being tracked (in @file)" do + + it "should ignore files in spec dir that aren't specs" do + @rspec_autotest.should map_specs([]).to("spec/spec_helper.rb") + end + + it "should ignore untracked files (in @file)" do @rspec_autotest.should map_specs([]).to("lib/untracked_file") end end - - describe Rspec, "consolidating failures" do - include AutotestHelper - + + describe "consolidating failures" do before(:each) do - common_setup - @rspec_autotest = Rspec.new - - @spec_file = "spec/autotest/rspec_spec.rb" + @rspec_autotest = Autotest::Rspec.new + + @spec_file = "spec/autotest/some_spec.rb" @rspec_autotest.instance_variable_set("@files", {@spec_file => Time.now}) @rspec_autotest.stub!(:find_files_to_test).and_return true end - + it "should return no failures if no failures were given in the output" do @rspec_autotest.consolidate_failures([[]]).should == {} end - + it "should return a hash with the spec filename => spec name for each failure or error" do - @rspec_autotest.stub!(:test_files_for).and_return "spec/autotest/rspec_spec.rb" + @rspec_autotest.stub!(:test_files_for).and_return "spec/autotest/some_spec.rb" failures = [ [ "false should be false", @@ -192,6 +95,17 @@ HERE @spec_file => ["false should be false"] } end - + + it "should not include the subject file" do + subject_file = "lib/autotest/some.rb" + @rspec_autotest.stub!(:test_files_for).and_return "spec/autotest/some_spec.rb" + failures = [ + [ + "false should be false", + "expected: true,\n got: false (using ==)\n#{subject_file}:143:\n#{@spec_file}:203:" + ] + ] + @rspec_autotest.consolidate_failures(failures).keys.should_not include(subject_file) + end end end diff --git a/vendor/plugins/rspec/spec/autotest_helper.rb b/vendor/plugins/rspec/spec/autotest_helper.rb deleted file mode 100644 index 1b6c6002b..000000000 --- a/vendor/plugins/rspec/spec/autotest_helper.rb +++ /dev/null @@ -1,6 +0,0 @@ -require "rubygems" -require 'autotest' -dir = File.dirname(__FILE__) -require "#{dir}/spec_helper" -require File.expand_path("#{dir}/../lib/autotest/rspec") -require "#{dir}/autotest_matchers" diff --git a/vendor/plugins/rspec/spec/autotest_matchers.rb b/vendor/plugins/rspec/spec/autotest_matchers.rb deleted file mode 100644 index 5e23452e2..000000000 --- a/vendor/plugins/rspec/spec/autotest_matchers.rb +++ /dev/null @@ -1,47 +0,0 @@ -module Spec - module Matchers - class AutotestMappingMatcher - def initialize(specs) - @specs = specs - end - - def to(file) - @file = file - self - end - - def matches?(autotest) - @autotest = prepare autotest - @actual = autotest.test_files_for(@file) - @actual == @specs - end - - def failure_message - "expected #{@autotest.class} to map #{@specs.inspect} to #{@file.inspect}\ngot #{@actual.inspect}" - end - - private - def prepare autotest - stub_found_files autotest - stub_find_order autotest - autotest - end - - def stub_found_files autotest - found_files = @specs.inject({}){|h,f| h[f] = Time.at(0)} - autotest.stub!(:find_files).and_return(found_files) - end - - def stub_find_order autotest - find_order = @specs.dup << @file - autotest.instance_eval { @find_order = find_order } - end - - end - - def map_specs(specs) - AutotestMappingMatcher.new(specs) - end - - end -end
\ No newline at end of file diff --git a/vendor/plugins/rspec/spec/rspec_suite.rb b/vendor/plugins/rspec/spec/rspec_suite.rb deleted file mode 100644 index abd016a6d..000000000 --- a/vendor/plugins/rspec/spec/rspec_suite.rb +++ /dev/null @@ -1,7 +0,0 @@ -if __FILE__ == $0 - dir = File.dirname(__FILE__) - Dir["#{dir}/**/*_spec.rb"].reverse.each do |file| -# puts "require '#{file}'" - require file - end -end diff --git a/vendor/plugins/rspec/spec/spec/example/configuration_spec.rb b/vendor/plugins/rspec/spec/spec/example/configuration_spec.rb deleted file mode 100644 index 5b4a6049e..000000000 --- a/vendor/plugins/rspec/spec/spec/example/configuration_spec.rb +++ /dev/null @@ -1,282 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' - -module Spec - module Example - - describe Configuration do - before(:each) do - @config = Configuration.new - @example_group = mock("example_group") - end - - describe "#mock_with" do - - it "should default mock framework to rspec" do - @config.mock_framework.should =~ /\/plugins\/mock_frameworks\/rspec$/ - end - - it "should let you set rspec mocking explicitly" do - @config.mock_with(:rspec) - @config.mock_framework.should =~ /\/plugins\/mock_frameworks\/rspec$/ - end - - it "should let you set mocha" do - @config.mock_with(:mocha) - @config.mock_framework.should =~ /\/plugins\/mock_frameworks\/mocha$/ - end - - it "should let you set flexmock" do - @config.mock_with(:flexmock) - @config.mock_framework.should =~ /\/plugins\/mock_frameworks\/flexmock$/ - end - - it "should let you set rr" do - @config.mock_with(:rr) - @config.mock_framework.should =~ /\/plugins\/mock_frameworks\/rr$/ - end - - it "should let you set an arbitrary adapter module" do - adapter = Module.new - @config.mock_with(adapter) - @config.mock_framework.should == adapter - end - end - - describe "#include" do - - before do - @original_configuration = Spec::Runner.configuration - spec_configuration = @config - Spec::Runner.instance_eval {@configuration = spec_configuration} - @example_group_class = Class.new(ExampleGroup) do - class << self - def this_class_has_special_methods - end - end - end - ExampleGroupFactory.register(:foobar, @example_group_class) - end - - after do - original_configuration = @original_configuration - Spec::Runner.instance_eval {@configuration = original_configuration} - ExampleGroupFactory.reset - end - - it "should include the submitted module in ExampleGroup subclasses" do - mod = Module.new - @config.include mod - Class.new(@example_group_class).included_modules.should include(mod) - end - - it "should let you define modules to be included for a specific type" do - mod = Module.new - @config.include mod, :type => :foobar - Class.new(@example_group_class).included_modules.should include(mod) - end - - it "should not include modules in a type they are not intended for" do - mod = Module.new - @other_example_group_class = Class.new(ExampleGroup) - ExampleGroupFactory.register(:baz, @other_example_group_class) - - @config.include mod, :type => :foobar - - Class.new(@other_example_group_class).included_modules.should_not include(mod) - end - - end - - end - - describe Configuration do - - before(:each) do - @config = Configuration.new - @special_example_group = Class.new(ExampleGroup) - @special_child_example_group = Class.new(@special_example_group) - @nonspecial_example_group = Class.new(ExampleGroup) - ExampleGroupFactory.register(:special, @special_example_group) - ExampleGroupFactory.register(:special_child, @special_child_example_group) - ExampleGroupFactory.register(:non_special, @nonspecial_example_group) - @example_group = @special_child_example_group.describe "Special Example Group" - @unselected_example_group = Class.new(@nonspecial_example_group).describe "Non Special Example Group" - end - - after(:each) do - ExampleGroupFactory.reset - end - - describe "#prepend_before" do - it "prepends the before block on all instances of the passed in type" do - order = [] - @config.prepend_before(:all) do - order << :prepend__before_all - end - @config.prepend_before(:all, :type => :special) do - order << :special_prepend__before_all - end - @config.prepend_before(:all, :type => :special_child) do - order << :special_child_prepend__before_all - end - @config.prepend_before(:each) do - order << :prepend__before_each - end - @config.prepend_before(:each, :type => :special) do - order << :special_prepend__before_each - end - @config.prepend_before(:each, :type => :special_child) do - order << :special_child_prepend__before_each - end - @config.prepend_before(:all, :type => :non_special) do - order << :special_prepend__before_all - end - @config.prepend_before(:each, :type => :non_special) do - order << :special_prepend__before_each - end - @example_group.it "calls prepend_before" do - end - - @example_group.run - order.should == [ - :prepend__before_all, - :special_prepend__before_all, - :special_child_prepend__before_all, - :prepend__before_each, - :special_prepend__before_each, - :special_child_prepend__before_each - ] - end - end - - describe "#append_before" do - - it "calls append_before on the type" do - order = [] - @config.append_before(:all) do - order << :append_before_all - end - @config.append_before(:all, :type => :special) do - order << :special_append_before_all - end - @config.append_before(:all, :type => :special_child) do - order << :special_child_append_before_all - end - @config.append_before(:each) do - order << :append_before_each - end - @config.append_before(:each, :type => :special) do - order << :special_append_before_each - end - @config.append_before(:each, :type => :special_child) do - order << :special_child_append_before_each - end - @config.append_before(:all, :type => :non_special) do - order << :special_append_before_all - end - @config.append_before(:each, :type => :non_special) do - order << :special_append_before_each - end - @example_group.it "calls append_before" do - end - - @example_group.run - order.should == [ - :append_before_all, - :special_append_before_all, - :special_child_append_before_all, - :append_before_each, - :special_append_before_each, - :special_child_append_before_each - ] - end - end - - describe "#prepend_after" do - - it "prepends the after block on all instances of the passed in type" do - order = [] - @config.prepend_after(:all) do - order << :prepend__after_all - end - @config.prepend_after(:all, :type => :special) do - order << :special_prepend__after_all - end - @config.prepend_after(:all, :type => :special) do - order << :special_child_prepend__after_all - end - @config.prepend_after(:each) do - order << :prepend__after_each - end - @config.prepend_after(:each, :type => :special) do - order << :special_prepend__after_each - end - @config.prepend_after(:each, :type => :special) do - order << :special_child_prepend__after_each - end - @config.prepend_after(:all, :type => :non_special) do - order << :special_prepend__after_all - end - @config.prepend_after(:each, :type => :non_special) do - order << :special_prepend__after_each - end - @example_group.it "calls prepend_after" do - end - - @example_group.run - order.should == [ - :special_child_prepend__after_each, - :special_prepend__after_each, - :prepend__after_each, - :special_child_prepend__after_all, - :special_prepend__after_all, - :prepend__after_all - ] - end - end - - describe "#append_after" do - - it "calls append_after on the type" do - order = [] - @config.append_after(:all) do - order << :append__after_all - end - @config.append_after(:all, :type => :special) do - order << :special_append__after_all - end - @config.append_after(:all, :type => :special_child) do - order << :special_child_append__after_all - end - @config.append_after(:each) do - order << :append__after_each - end - @config.append_after(:each, :type => :special) do - order << :special_append__after_each - end - @config.append_after(:each, :type => :special_child) do - order << :special_child_append__after_each - end - @config.append_after(:all, :type => :non_special) do - order << :non_special_append_after_all - end - @config.append_after(:each, :type => :non_special) do - order << :non_special_append_after_each - end - @example_group.it "calls append_after" do - end - - @example_group.run - order.should == [ - :special_child_append__after_each, - :special_append__after_each, - :append__after_each, - :special_child_append__after_all, - :special_append__after_all, - :append__after_all - ] - end - end - end - end -end diff --git a/vendor/plugins/rspec/spec/spec/example/example_group/described_module_spec.rb b/vendor/plugins/rspec/spec/spec/example/example_group/described_module_spec.rb deleted file mode 100644 index 55b02f53f..000000000 --- a/vendor/plugins/rspec/spec/spec/example/example_group/described_module_spec.rb +++ /dev/null @@ -1,20 +0,0 @@ -require File.dirname(__FILE__) + "/../../../spec_helper" - -module Spec - module Example - module AModule; end - class AClass; end - - describe "With", AModule do - it "should have the described_type as 'AModule'" do - self.class.described_module.should == AModule - end - end - - describe "With", AClass do - it "should have the described_module as nil" do - self.class.described_module.should be_nil - end - end - end -end diff --git a/vendor/plugins/rspec/spec/spec/example/example_group/warning_messages_spec.rb b/vendor/plugins/rspec/spec/spec/example/example_group/warning_messages_spec.rb deleted file mode 100644 index 79ac3722a..000000000 --- a/vendor/plugins/rspec/spec/spec/example/example_group/warning_messages_spec.rb +++ /dev/null @@ -1,76 +0,0 @@ -require File.dirname(__FILE__) + "/../../../spec_helper" - -module Spec - module Example - module AModuleAutomaticallyIncluded - def call_method - @method_called = true - return "a string" - end - - def method_called? - @method_called ? true : false - end - end - - describe "Including modules in an example group" do - describe AModuleAutomaticallyIncluded do - before :each do - Kernel.stub!(:warn) - end - - it "should return the correct values" do - self.method_called?.should be_false - self.call_method.should eql("a string") - self.method_called?.should be_true - end - - it "should respond_to? the methods from the module" do - self.should respond_to(:method_called?) - self.should respond_to(:call_method) - end - - it "should not respond_to? methods which do not come from the module (or are in Spec::ExampleGroup)" do - self.should_not respond_to(:adsfadfadadf_a_method_which_does_not_exist) - end - - it "should respond_to? a method in Spec::ExampleGroup" do - self.should respond_to(:describe) - end - - it "should issue a warning with Kernel.warn" do - Kernel.should_receive(:warn) - self.call_method - end - - it "should issue a warning when the example calls the method which is automatically included" do - Kernel.should_receive(:warn).with("Modules will no longer be automatically included in RSpec version 1.1.4. Called from #{__FILE__}:#{__LINE__+1}") - self.method_called? - end - - it "should issue a warning with the correct file and line numbers" do - Kernel.should_receive(:warn).with("Modules will no longer be automatically included in RSpec version 1.1.4. Called from #{__FILE__}:#{__LINE__+1}") - self.method_called? - end - end - - describe AModuleAutomaticallyIncluded, "which is also manually included" do - include AModuleAutomaticallyIncluded - - before :each do - Kernel.stub!(:warn) - end - - it "should respond to the methods since it is included" do - self.should respond_to(:method_called?) - self.should respond_to(:call_method) - end - - it "should not issue a warning, since the module is manually included" do - Kernel.should_not_receive(:warn) - self.method_called? - end - end - end - end -end diff --git a/vendor/plugins/rspec/spec/spec/example/example_group_class_definition_spec.rb b/vendor/plugins/rspec/spec/spec/example/example_group_class_definition_spec.rb index 0b00e1397..96bd21110 100644 --- a/vendor/plugins/rspec/spec/spec/example/example_group_class_definition_spec.rb +++ b/vendor/plugins/rspec/spec/spec/example/example_group_class_definition_spec.rb @@ -1,4 +1,4 @@ -require File.dirname(__FILE__) + '/../../spec_helper' +require 'spec_helper' module Spec module Example @@ -7,36 +7,39 @@ module Spec attr_accessor :examples_ran end - @@klass_variable_set = true - CONSTANT = :foobar + @@class_variable = :class_variable + CONSTANT = :constant - before do - @instance_variable = :hello + before(:each) do + @instance_variable = :instance_variable end - - it "should run" do + + after(:all) do self.class.examples_ran = true end - it "should have access to instance variables" do - @instance_variable.should == :hello + def a_method + 22 end - it "should have access to class variables" do - @@klass_variable_set.should == true + it "can access instance variables defined before(:each)" do + @instance_variable.should == :instance_variable end - it "should have access to constants" do - CONSTANT.should == :foobar + it "can access class variables (Ruby 1.8 only)" do + with_ruby 1.8 do + @@class_variable.should == :class_variable + end end - it "should have access to methods defined in the Example Group" do - a_method.should == 22 + it "can access constants" do + CONSTANT.should == :constant end - def a_method - 22 + it "can access methods defined in the Example Group" do + a_method.should == 22 end + end describe ExampleGroupSubclass do diff --git a/vendor/plugins/rspec/spec/spec/example/example_group_factory_spec.rb b/vendor/plugins/rspec/spec/spec/example/example_group_factory_spec.rb index da461cdfc..0819d3a3e 100644 --- a/vendor/plugins/rspec/spec/spec/example/example_group_factory_spec.rb +++ b/vendor/plugins/rspec/spec/spec/example/example_group_factory_spec.rb @@ -1,46 +1,42 @@ -require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper') +require 'spec_helper' module Spec module Example describe ExampleGroupFactory do describe "#get" do attr_reader :example_group - before do - @example_group = Class.new(ExampleGroup) - ExampleGroupFactory.register(:registered_type, @example_group) + before(:each) do + @example_group_class = Class.new(ExampleGroupDouble) + ExampleGroupFactory.register(:registered_type, @example_group_class) end - after do + after(:each) do ExampleGroupFactory.reset end - it "should #get the default ExampleGroup type when passed nil" do - ExampleGroupFactory.get(nil).should == ExampleGroup - end - - it "should #get the default ExampleGroup for unregistered non-nil values" do - ExampleGroupFactory.get(:does_not_exist).should == ExampleGroup + it "should return the default ExampleGroup type for nil" do + ExampleGroupFactory[nil].should == ExampleGroup end - it "should #get custom type for :registered_type" do - ExampleGroupFactory.get(:registered_type).should == @example_group + it "should return the default ExampleGroup for an unregistered non-nil value" do + ExampleGroupFactory[:does_not_exist].should == ExampleGroup end - it "should #get the actual type when that is passed in" do - ExampleGroupFactory.get(@example_group).should == @example_group + it "should return custom type if registered" do + ExampleGroupFactory[:registered_type].should == @example_group_class end it "should get the custom type after setting the default" do - @example_group2 = Class.new(ExampleGroup) - ExampleGroupFactory.default(@example_group2) - ExampleGroupFactory.get(:registered_type).should == @example_group + @alternate_example_group_class = Class.new(ExampleGroupDouble) + ExampleGroupFactory.default(@alternate_example_group_class) + ExampleGroupFactory[:registered_type].should == @example_group_class end end describe "#create_example_group" do attr_reader :parent_example_group before do - @parent_example_group = Class.new(ExampleGroup) do + @parent_example_group = Class.new(ExampleGroupDouble) do def initialize(*args, &block) ; end @@ -57,15 +53,28 @@ module Spec example_group.superclass.should == Spec::Example::ExampleGroup end - describe "when :type => :default" do - it "should create a Spec::Example::Example" do - example_group = Spec::Example::ExampleGroupFactory.create_example_group( - "example_group", :type => :default - ) {} - example_group.superclass.should == Spec::Example::ExampleGroup - end + it "should raise when no description is given" do + lambda { + Spec::Example::ExampleGroupFactory.create_example_group do; end + }.should raise_error(ArgumentError) + end + + it "should raise when no block is given" do + lambda { Spec::Example::ExampleGroupFactory.create_example_group "foo" }.should raise_error(ArgumentError) + end - it "should create a Spec::Example::Example" do + it "should run registered ExampleGroups" do + example_group = Spec::Example::ExampleGroupFactory.create_example_group "The ExampleGroup" do end + Spec::Runner.options.example_groups.should include(example_group) + end + + it "should not run unregistered ExampleGroups" do + example_group = Spec::Example::ExampleGroupFactory.create_example_group "The ExampleGroup" do Spec::Runner.options.remove_example_group self; end + Spec::Runner.options.example_groups.should_not include(example_group) + end + + describe "with :type => :default" do + it "should create a Spec::Example::ExampleGroup" do example_group = Spec::Example::ExampleGroupFactory.create_example_group( "example_group", :type => :default ) {} @@ -73,8 +82,8 @@ module Spec end end - describe "when :type => :something_other_than_default" do - it "should create specified type" do + describe "with :type => :something_other_than_default" do + it "should create the specified type" do Spec::Example::ExampleGroupFactory.register(:something_other_than_default, parent_example_group) non_default_example_group = Spec::Example::ExampleGroupFactory.create_example_group( "example_group", :type => :something_other_than_default @@ -83,41 +92,59 @@ module Spec end end - it "should create a type indicated by :spec_path" do + it "should create a type indicated by :location" do Spec::Example::ExampleGroupFactory.register(:something_other_than_default, parent_example_group) custom_example_group = Spec::Example::ExampleGroupFactory.create_example_group( - "example_group", :spec_path => "./spec/something_other_than_default/some_spec.rb" + "example_group", :location => "./spec/something_other_than_default/some_spec.rb" ) {} custom_example_group.superclass.should == parent_example_group end - it "should create a type indicated by :spec_path (with spec_path generated by caller on windows)" do + it "should create a type indicated by :location (with location generated by caller on windows)" do Spec::Example::ExampleGroupFactory.register(:something_other_than_default, parent_example_group) custom_example_group = Spec::Example::ExampleGroupFactory.create_example_group( "example_group", - :spec_path => "./spec\\something_other_than_default\\some_spec.rb" + :location => "./spec\\something_other_than_default\\some_spec.rb" ) {} custom_example_group.superclass.should == parent_example_group end - describe "when :shared => true" do - attr_reader :shared_example_group - before do - @shared_example_group = Spec::Example::ExampleGroupFactory.create_example_group( - "name", :spec_path => '/blah/spec/models/blah.rb', :type => :controller, :shared => true + it "should create a type indicated by location for a path-like key" do + Spec::Example::ExampleGroupFactory.register('path/to/custom/', parent_example_group) + custom_example_group = Spec::Example::ExampleGroupFactory.create_example_group( + "example_group", :location => "./spec/path/to/custom/some_spec.rb" + ) {} + custom_example_group.superclass.should == parent_example_group + end + + it "should use the longest key that matches when creating a type indicated by location" do + longer = Class.new parent_example_group + Spec::Example::ExampleGroupFactory.register(:longer, longer) + long = Class.new parent_example_group + Spec::Example::ExampleGroupFactory.register(:long, long) + custom_example_group = Spec::Example::ExampleGroupFactory.create_example_group( + "example_group", :location => "./spec/longer/some_spec.rb" + ) {} + custom_example_group.superclass.should == longer + end + + describe "with :shared => true" do + def shared_example_group + @shared_example_group ||= Spec::Example::ExampleGroupFactory.create_example_group( + "name", :location => '/blah/spec/models/blah.rb', :type => :controller, :shared => true ) {} end - it "should create and register a Spec::Example::Example" do + it "should create and register a Spec::Example::SharedExampleGroup" do shared_example_group.should be_an_instance_of(Spec::Example::SharedExampleGroup) - SharedExampleGroup.shared_example_groups.should include(shared_example_group) + SharedExampleGroup.should include(shared_example_group) end end - it "should favor the :type over the :spec_path" do + it "should favor the :type over the :location" do Spec::Example::ExampleGroupFactory.register(:something_other_than_default, parent_example_group) custom_example_group = Spec::Example::ExampleGroupFactory.create_example_group( - "name", :spec_path => '/blah/spec/models/blah.rb', :type => :something_other_than_default + "name", :location => '/blah/spec/models/blah.rb', :type => :something_other_than_default ) {} custom_example_group.superclass.should == parent_example_group end @@ -125,20 +152,29 @@ module Spec it "should register ExampleGroup by default" do example_group = Spec::Example::ExampleGroupFactory.create_example_group("The ExampleGroup") do end - rspec_options.example_groups.should include(example_group) + Spec::Runner.options.example_groups.should include(example_group) end it "should enable unregistering of ExampleGroups" do example_group = Spec::Example::ExampleGroupFactory.create_example_group("The ExampleGroup") do - unregister + Spec::Runner.options.remove_example_group self end - rspec_options.example_groups.should_not include(example_group) + Spec::Runner.options.example_groups.should_not include(example_group) end after(:each) do Spec::Example::ExampleGroupFactory.reset end end + + describe "#create_shared_example_group" do + it "registers a new shared example group" do + shared_example_group = Spec::Example::ExampleGroupFactory.create_shared_example_group("something shared") {} + shared_example_group.should be_an_instance_of(Spec::Example::SharedExampleGroup) + SharedExampleGroup.should include(shared_example_group) + end + end + end end end diff --git a/vendor/plugins/rspec/spec/spec/example/example_group_methods_spec.rb b/vendor/plugins/rspec/spec/spec/example/example_group_methods_spec.rb index 55c746ece..c9f10b8c1 100644 --- a/vendor/plugins/rspec/spec/spec/example/example_group_methods_spec.rb +++ b/vendor/plugins/rspec/spec/spec/example/example_group_methods_spec.rb @@ -1,523 +1,758 @@ -require File.dirname(__FILE__) + '/../../spec_helper' +require 'spec_helper' module Spec module Example describe 'ExampleGroupMethods' do - it_should_behave_like "sandboxed rspec_options" - attr_reader :example_group, :result, :reporter - before(:each) do - options.formatters << mock("formatter", :null_object => true) - options.backtrace_tweaker = mock("backtrace_tweaker", :null_object => true) - @reporter = FakeReporter.new(@options) - options.reporter = reporter - @example_group = Class.new(ExampleGroup) do - describe("ExampleGroup") - it "does nothing" + with_sandboxed_options do + attr_reader :example_group, :result, :reporter + before(:each) do + # See http://rspec.lighthouseapp.com/projects/5645-rspec/tickets/525-arity-changed-on-partial-mocks#ticket-525-2 + method_with_three_args = lambda { |arg1, arg2, arg3| } + options.formatters << mock("formatter", :null_object => true, :example_pending => method_with_three_args) + options.backtrace_tweaker = mock("backtrace_tweaker", :null_object => true) + @reporter = FakeReporter.new(@options) + options.reporter = reporter + @example_group = Class.new(ExampleGroupDouble) do + describe("ExampleGroup") + it "does nothing" + end end - class << example_group - public :include + + after(:each) do + ExampleGroupDouble.reset end - @result = nil - end - after(:each) do - ExampleGroup.reset - end - - ["describe","context"].each do |method| - describe "#{method}" do - describe "when creating an ExampleGroup" do - attr_reader :child_example_group - before do - @child_example_group = @example_group.send method, "Another ExampleGroup" do - it "should pass" do - true.should be_true + ["describe","context"].each do |method| + describe "##{method}" do + describe "when creating an ExampleGroup" do + before(:each) do + @parent_example_group = Class.new(ExampleGroupDouble) do + example "first example" do; end + end + @child_example_group = @parent_example_group.__send__ method, "Child" do + example "second example" do; end end end - end - it "should create a subclass of the ExampleGroup when passed a block" do - child_example_group.superclass.should == @example_group - @options.example_groups.should include(child_example_group) + it "should create a subclass of the ExampleGroup when passed a block" do + @child_example_group.superclass.should == @parent_example_group + options.example_groups.should include(@child_example_group) + end + + it "should not inherit examples" do + @child_example_group.should have(1).examples + end + + it "records the spec path" do + @child_example_group.location.should =~ /#{__FILE__}:#{__LINE__ - 15}/ + end + end + + describe "when creating an example group with no description" do + it "raises an ArgumentError" do + lambda do + Class.new(ExampleGroupDouble).describe + end.should raise_error(Spec::Example::NoDescriptionError, /No description supplied for example group declared on #{__FILE__}:#{__LINE__ - 1}/) + end end - it "should not inherit examples" do - child_example_group.examples.length.should == 1 + describe "when creating a SharedExampleGroup" do + before(:each) do + @shared_example_group = @example_group.__send__ method, "A Shared ExampleGroup", :shared => true do; end + end + + after(:each) do + SharedExampleGroup.instance_eval{@shared_example_groups}.delete @shared_example_group + end + + it "should create a SharedExampleGroup" do + @shared_example_group.should_not be_nil + SharedExampleGroup.find("A Shared ExampleGroup").should == @shared_example_group + end end + end + end + + [:example, :specify, :it].each do |method| + describe "##{method.to_s}" do + it "should add an example" do + lambda { + @example_group.__send__(method, "") + }.should change { @example_group.examples.length }.by(1) + end + + describe "with no location supplied" do + describe "creates an ExampleProxy" do + before(:all) do + @example_group = Class.new(ExampleGroupDouble).describe("bar") + @example_proxy = @example_group.__send__(method, "foo", {:this => :that}) {} + @location = "#{__FILE__}:#{__LINE__ - 1}" + end - describe "when creating a SharedExampleGroup" do - attr_reader :name, :shared_example_group - before do - @name = "A Shared ExampleGroup" - @shared_example_group = @example_group.send method, name, :shared => true do - it "should pass" do - true.should be_true + specify "with a description" do + @example_proxy.description.should == "foo" + end + + specify "with options" do + @example_proxy.options.should == {:this => :that} end - end - end - after do - SharedExampleGroup.shared_example_groups.delete_if do |registered_shared_example_group| - registered_shared_example_group == shared_example_group + specify "with a default backtrace (DEPRECATED)" do + Spec.stub!(:deprecate) + @example_proxy.backtrace.should =~ /#{@location}/ + end + + specify "with a default location" do + @example_proxy.location.should =~ /#{@location}/ + end end end + + describe "with a location supplied" do + describe "creates an ExampleProxy" do + before(:all) do + @example_group = Class.new(ExampleGroupDouble).describe("bar") + @example_proxy = @example_group.__send__(method, "foo", {:this => :that}, "the location") {} + end - it "should create a SharedExampleGroup" do - SharedExampleGroup.find_shared_example_group(name).should == shared_example_group + specify "with the supplied location as #backtrace (DEPRECATED)" do + Spec.stub!(:deprecate) + @example_proxy.backtrace.should == "the location" + end + + specify "with the supplied location as #location" do + @example_proxy.location.should == "the location" + end + end end + + end - end - end - - describe "#it" do - it "should should create an example instance" do - lambda { - @example_group.it("") - }.should change { @example_group.examples.length }.by(1) - end - end + + [:xexample, :xit, :xspecify].each do |method| + describe "##{method.to_s}" do + before(:each) do + Kernel.stub!(:warn) + end - describe "#xit and #xspecify" do - before(:each) do - Kernel.stub!(:warn) + it "should NOT create an example" do + lambda { + @example_group.__send__(method,"") + }.should_not change(@example_group.examples, :length) + end + + it "should warn that the example is disabled" do + Kernel.should_receive(:warn).with("Example disabled: foo") + @example_group.__send__(method,"foo") + end + end end + + describe "#examples" do + it "should have Examples" do + example_group = Class.new(ExampleGroupDouble) do + it "should exist" do; end + end + example_group.examples.length.should == 1 + example_group.examples.first.description.should == "should exist" + end - it "should NOT create an example instance" do - lambda { - @example_group.xit("") - }.should_not change(@example_group.examples, :length) + it "should not include methods that begin with test (only when TU interop is loaded)" do + example_group = Class.new(ExampleGroupDouble) do + def test_any_args(*args) + true.should be_true + end + def test_something + 1.should == 1 + end + def test + raise "This is not a real test" + end + def testify + raise "This is not a real test" + end + def should_something + # forces the run + end + end + + example_group.examples.length.should == 1 + example_group.run(options).should be_true + end - lambda { - @example_group.xspecify("") - }.should_not change(@example_group.examples, :length) - end + it "should include methods that begin with should and has an arity of 0 in suite" do + example_group = Class.new(ExampleGroupDouble) do + def shouldCamelCase + true.should be_true + end + def should_any_args(*args) + true.should be_true + end + def should_something + 1.should == 1 + end + def should_not_something + 1.should_not == 2 + end + def should + raise "This is not a real example" + end + def should_not + raise "This is not a real example" + end + end + example_group.should have(4).examples + descriptions = example_group.examples.collect {|e| e.description} + descriptions.should include( + "shouldCamelCase", + "should_any_args", + "should_something", + "should_not_something") + descriptions.should_not include( + "should", + "should_not" + ) + end + + it "should not include methods that begin with test_ and has an arity > 0 in suite" do + example_group = Class.new(ExampleGroupDouble) do + def test_invalid(foo) + 1.should == 1 + end + def testInvalidCamelCase(foo) + 1.should == 1 + end + end + example_group.should have(:no).examples + end - it "should warn that it is disabled" do - Kernel.should_receive(:warn).with("Example disabled: foo").twice - @example_group.xit("foo") - @example_group.xspecify("foo") - end - end + it "should not include methods that begin with should_ and has an arity > 0 in suite" do + example_group = Class.new(ExampleGroupDouble) do + def should_invalid(foo) + 1.should == 2 + end + def shouldInvalidCamelCase(foo) + 1.should == 3 + end + def should_not_invalid(foo) + 1.should == 4 + end + def should_valid + 1.should == 1 + end + end + example_group.should have(1).examples + example_group.run(options).should be_true + end - describe "#examples" do - it "should have Examples" do - example_group = Class.new(ExampleGroup) do - describe('example') - it "should pass" do - 1.should == 1 + it "should run should_methods" do + example_group = Class.new(ExampleGroupDouble) do + def should_valid + 1.should == 2 + end end + example_group.should have(1).examples + example_group.run(options).should be_false end - example_group.examples.length.should == 1 - example_group.examples.first.description.should == "should pass" end - it "should not include methods that begin with test (only when TU interop is loaded)" do - example_group = Class.new(ExampleGroup) do - describe('example') - def test_any_args(*args) - true.should be_true + describe "#set_description" do + attr_reader :example_group + before do + class << example_group + public :set_description end - def test_something - 1.should == 1 + end + + describe "given a String" do + before(:each) do + example_group.set_description("abc") end - def test - raise "This is not a real test" + + specify ".description should return the String passed into .set_description" do + example_group.description.should == "abc" end - def testify - raise "This is not a real test" + + specify ".described_type should provide nil as its type" do + example_group.described_type.should be_nil end end - example_group.examples.length.should == 0 - example_group.run.should be_true - end - it "should include methods that begin with should and has an arity of 0 in suite" do - example_group = Class.new(ExampleGroup) do - describe('example') - def shouldCamelCase - true.should be_true + describe "given a Class" do + before(:each) do + example_group.set_description(ExampleGroup) end - def should_any_args(*args) - true.should be_true + + specify ".description should return a String representation of that type (fully qualified) as its name" do + example_group.description.should == "Spec::Example::ExampleGroup" end - def should_something - 1.should == 1 + + specify ".described_type should return the passed in type" do + example_group.described_type.should == Spec::Example::ExampleGroup end - def should_not_something - 1.should_not == 2 + end + + describe "given a String and a Class" do + before(:each) do + example_group.set_description("behaving", ExampleGroup) end - def should - raise "This is not a real example" + + specify ".description should return String then space then Type" do + example_group.description.should == "behaving Spec::Example::ExampleGroup" end - def should_not - raise "This is not a real example" + + specify ".described_type should return the passed in type" do + example_group.described_type.should == Spec::Example::ExampleGroup end end - example_group = example_group.dup - example_group.examples.length.should == 4 - descriptions = example_group.examples.collect {|example| example.description}.sort - descriptions.should include("shouldCamelCase") - descriptions.should include("should_any_args") - descriptions.should include("should_something") - descriptions.should include("should_not_something") - end - it "should not include methods that begin with test_ and has an arity > 0 in suite" do - example_group = Class.new(ExampleGroup) do - describe('example') - def test_invalid(foo) - 1.should == 1 + describe "given a Class and a String (starting with an alpha char)" do + before(:each) do + example_group.set_description(ExampleGroup, "behaving") end - def testInvalidCamelCase(foo) - 1.should == 1 + + specify ".description should return the Type then space then String" do + example_group.description.should == "Spec::Example::ExampleGroup behaving" end end - example_group.examples.length.should == 0 - end - it "should not include methods that begin with should_ and has an arity > 0 in suite" do - example_group = Class.new(ExampleGroup) do - describe('example') - def should_invalid(foo) - 1.should == 2 + describe "given a Class and a String (starting with a '.')" do + before(:each) do + example_group.set_description(ExampleGroup, ".behaving") end - def shouldInvalidCamelCase(foo) - 1.should == 3 + + specify ".description should return the Type then String" do + example_group.description.should == "Spec::Example::ExampleGroup.behaving" end - def should_not_invalid(foo) - 1.should == 4 + end + + describe "#set_description(Class, String starting with #)" do + before(:each) do + example_group.set_description(ExampleGroup, "#behaving") end - def should_valid - 1.should == 1 + + specify "should return the Class then String" do + example_group.description.should == "Spec::Example::ExampleGroup#behaving" end end - example_group.examples.length.should == 1 - example_group.run.should be_true - end - it "should run should_methods" do - example_group = Class.new(ExampleGroup) do - def should_valid - 1.should == 2 + describe "#set_description(Class, String containing .)" do + before(:each) do + example_group.set_description(ExampleGroup, "calling a.b") end - end - example_group.examples.length.should == 1 - example_group.run.should be_false - end - end - describe "#set_description" do - attr_reader :example_group - before do - class << example_group - public :set_description + specify ".description should return the Type then space then String" do + example_group.description.should == "Spec::Example::ExampleGroup calling a.b" + end end - end - describe "#set_description(String)" do - before(:each) do - example_group.set_description("abc") - end + describe "#set_description(Class, String containing #)" do + before(:each) do + example_group.set_description(ExampleGroup, "is #1") + end - specify ".description should return the String passed into .set_description" do - example_group.description.should == "abc" + specify ".description should return the Type then space then String" do + example_group.description.should == "Spec::Example::ExampleGroup is #1" + end end - specify ".described_type should provide nil as its type" do - example_group.described_type.should be_nil - end - end + describe "#set_description(String, Type, String)" do + before(:each) do + example_group.set_description("A", Hash, "with one entry") + end - describe "#set_description(Type)" do - before(:each) do - example_group.set_description(ExampleGroup) + specify ".description should return the first String then space then Type then second String" do + example_group.description.should == "A Hash with one entry" + end end - specify ".description should return a String representation of that type (fully qualified) as its name" do - example_group.description.should == "Spec::Example::ExampleGroup" - end + describe "#set_description(Hash representing options)" do + before(:each) do + example_group.set_description(:a => "b", :location => "blah") + end + + it ".location should expand the passed in :location option passed into the constructor" do + example_group.location.should == File.expand_path("blah") + end + + it ".options should return all the options passed in" do + example_group.options.should == {:a => "b", :location => "blah"} + end - specify ".described_type should return the passed in type" do - example_group.described_type.should == Spec::Example::ExampleGroup end end - describe "#set_description(String, Type)" do - before(:each) do - example_group.set_description("behaving", ExampleGroup) + describe "#description" do + it "should return the same description instance for each call" do + example_group.description.should eql(example_group.description) end - specify ".description should return String then space then Type" do - example_group.description.should == "behaving Spec::Example::ExampleGroup" + it "should not add a space when description begins with #" do + child_example_group = Class.new(example_group) do + describe("#foobar", "Does something") + end + child_example_group.description.should == "ExampleGroup#foobar Does something" end - specify ".described_type should return the passed in type" do - example_group.described_type.should == Spec::Example::ExampleGroup + it "should not add a space when description begins with ." do + child_example_group = Class.new(example_group) do + describe(".foobar", "Does something") + end + child_example_group.description.should == "ExampleGroup.foobar Does something" + end + + it "should return the class name if nil" do + example_group.set_description(nil) + example_group.description.should =~ /Class:/ + end + + it "should return the class name if nil" do + example_group.set_description("") + example_group.description.should =~ /Class:/ + end + + it "is cached" do + example_group.set_description("describe me") + example_group.description.should be(example_group.description) end end - describe "#set_description(Type, String not starting with a space)" do - before(:each) do - example_group.set_description(ExampleGroup, "behaving") + describe "#description_parts" do + it "should return an Array of the current class description args" do + example_group.description_parts.should == [example_group.description] end - specify ".description should return the Type then space then String" do - example_group.description.should == "Spec::Example::ExampleGroup behaving" + it "should return an Array of the description args from each class in the hierarchy" do + parent_example_group = Class.new(ExampleGroupDouble) do + describe("Parent") + end + + child_example_group = Class.new(parent_example_group) + child_example_group.describe("Child", ExampleGroup) + child_example_group.description.should_not be_empty + + grand_child_example_group = Class.new(child_example_group) + grand_child_example_group.describe("GrandChild", ExampleGroup) + grand_child_example_group.description.should_not be_empty + + grand_child_example_group.description_parts.should == [ + "Parent", + "Child", + Spec::Example::ExampleGroup, + "GrandChild", + Spec::Example::ExampleGroup + ] + end + + it "caches the description parts" do + example_group.description_parts.should equal(example_group.description_parts) end end - describe "#set_description(Type, String starting with .)" do - before(:each) do - example_group.set_description(ExampleGroup, ".behaving") + describe "#described_type" do + it "should return passed in type" do + child_example_group = Class.new(example_group) do + describe Object + end + child_example_group.described_type.should == Object end - specify ".description should return the Type then String" do - example_group.description.should == "Spec::Example::ExampleGroup.behaving" + it "should return #described_type of superclass when no passed in type" do + parent_example_group = Class.new(ExampleGroupDouble) do + describe Object, "#foobar" + end + child_example_group = Class.new(parent_example_group) do + describe "not a type" + end + child_example_group.described_type.should == Object + end + + it "is cached per example group" do + klass = Class.new + group = Class.new(ExampleGroupDouble) do + describe(klass) + end + group.should_receive(:description_parts).once.and_return([klass]) + group.described_type + group.described_type end end - describe "#set_description(Type, String containing .)" do - before(:each) do - example_group.set_description(ExampleGroup, "calling a.b") - end + describe "#include" do + it "should have accessible class methods from included module" do + mod_method_called = false + mod = Module.new do + class_methods = Module.new do + define_method :mod_method do + mod_method_called = true + end + end + + self.class.class_eval do + define_method(:included) do |receiver| + receiver.extend class_methods + end + end + end + + @example_group.__send__ :include, mod - specify ".description should return the Type then space then String" do - example_group.description.should == "Spec::Example::ExampleGroup calling a.b" + @example_group.mod_method + mod_method_called.should be_true end end - describe "#set_description(Type, String starting with .)" do - before(:each) do - example_group.set_description(ExampleGroup, ".behaving") + describe "#number_of_examples" do + it "should count number of examples" do + proc do + @example_group.it("one") {} + @example_group.it("two") {} + @example_group.it("three") {} + @example_group.it("four") {} + end.should change {@example_group.number_of_examples}.by(4) end + end - specify "should return the Type then String" do - example_group.description.should == "Spec::Example::ExampleGroup.behaving" + describe "#class_eval" do + it "should allow constants to be defined" do + example_group = Class.new(ExampleGroupDouble) do + FOO = 1 + it "should reference FOO" do + FOO.should == 1 + end + end + success = example_group.run(options) + success.should be_true + Object.const_defined?(:FOO).should == false end end - describe "#set_description(Type, String containing .)" do - before(:each) do - example_group.set_description(ExampleGroup, "is #1") + describe '#register' do + after(:each) do + Spec::Runner.options.remove_example_group example_group end - - specify ".description should return the Type then space then String" do - example_group.description.should == "Spec::Example::ExampleGroup is #1" + it "should add ExampleGroup to set of ExampleGroups to be run" do + Spec::Runner.options.add_example_group example_group + options.example_groups.should include(example_group) end end - describe "#set_description(String, Type, String)" do + describe '#remove_example_group' do before(:each) do - example_group.set_description("A", Hash, "with one entry") + Spec::Runner.options.add_example_group example_group end - - specify ".description should return the first String then space then Type then second String" do - example_group.description.should == "A Hash with one entry" + it "should remove ExampleGroup from set of ExampleGroups to be run" do + Spec::Runner.options.remove_example_group example_group + options.example_groups.should_not include(example_group) end end - - describe "#set_description(Hash representing options)" do - before(:each) do - example_group.set_description(:a => "b", :spec_path => "blah") + + describe "#run" do + describe "given an example group with at least one example" do + it "should call add_example_group" do + example_group = Class.new(ExampleGroupDouble) do + example("anything") {} + end + reporter.should_receive(:add_example_group) + example_group.run(options) + end end - it ".spec_path should expand the passed in :spec_path option passed into the constructor" do - example_group.spec_path.should == File.expand_path("blah") + describe "given an example group with no examples" do + it "should NOT call add_example_group" do + example_group = Class.new(ExampleGroupDouble) do end + reporter.should_not_receive(:add_example_group) + example_group.run(options) + end end + end - it ".description_options should return all the options passed in" do - example_group.description_options.should == {:a => "b", :spec_path => "blah"} - end + describe "#matcher_class=" do + it "should call new and matches? on the class used for matching examples" do + example_group = Class.new(ExampleGroupDouble) do + it "should do something" do end + def self.specified_examples + ["something"] + end + def self.to_s + "TestMatcher" + end + end - end - end + matcher = mock("matcher") + matcher.should_receive(:matches?).with(["something"]).any_number_of_times + + matcher_class = Class.new + matcher_class.should_receive(:new).with("TestMatcher", "should do something").and_return(matcher) - describe "#description" do - it "should return the same description instance for each call" do - example_group.description.should eql(example_group.description) - end + begin + ExampleGroupMethods.matcher_class = matcher_class - it "should not add a space when description_text begins with #" do - child_example_group = Class.new(example_group) do - describe("#foobar", "Does something") + example_group.run(options) + ensure + ExampleGroupMethods.matcher_class = ExampleMatcher + end end - child_example_group.description.should == "ExampleGroup#foobar Does something" end - it "should not add a space when description_text begins with ." do - child_example_group = Class.new(example_group) do - describe(".foobar", "Does something") + describe "#options" do + it "should expose the options hash" do + group = describe("group", :this => 'hash') {} + group.options[:this].should == 'hash' end - child_example_group.description.should == "ExampleGroup.foobar Does something" - end - - it "should return the class name if nil" do - example_group.set_description(nil) - example_group.description.should =~ /Class:/ - end - - it "should return the class name if nil" do - example_group.set_description("") - example_group.description.should =~ /Class:/ end - end - describe "#description_parts" do - it "should return an Array of the current class description args" do - example_group.description_parts.should == [example_group.description] - end + describe "#before" do + it "stores before(:each) blocks" do + example_group = Class.new(ExampleGroupDouble) {} + block = lambda {} + example_group.before(:each, &block) + example_group.before_each_parts.should include(block) + end - it "should return an Array of the description args from each class in the hierarchy" do - child_example_group = Class.new(example_group) - child_example_group.describe("Child", ExampleGroup) - child_example_group.description.should_not be_empty - - grand_child_example_group = Class.new(child_example_group) - grand_child_example_group.describe("GrandChild", ExampleGroup) - grand_child_example_group.description.should_not be_empty - - grand_child_example_group.description_parts.should == [ - "ExampleGroup", - "Child", - Spec::Example::ExampleGroup, - "GrandChild", - Spec::Example::ExampleGroup - ] - end - end + it "stores before(:all) blocks" do + example_group = Class.new(ExampleGroupDouble) {} + block = lambda {} + example_group.before(:all, &block) + example_group.before_all_parts.should include(block) + end - describe "#described_type" do - it "should return passed in type" do - child_example_group = Class.new(example_group) do - describe Object + it "stores before(:suite) blocks" do + example_group = Class.new(ExampleGroupDouble) {} + parts = [] + ExampleGroupMethods.stub!(:before_suite_parts).and_return(parts) + block = lambda {} + example_group.before(:suite, &block) + example_group.before_suite_parts.should include(block) end - child_example_group.described_type.should == Object end - it "should return #described_type of superclass when no passed in type" do - parent_example_group = Class.new(ExampleGroup) do - describe Object, "#foobar" + + describe "#after" do + it "stores after(:each) blocks" do + example_group = Class.new(ExampleGroupDouble) {} + block = lambda {} + example_group.after(:each, &block) + example_group.after_each_parts.should include(block) end - child_example_group = Class.new(parent_example_group) do - describe "not a type" + + it "stores after(:all) blocks" do + example_group = Class.new(ExampleGroupDouble) {} + block = lambda {} + example_group.after(:all, &block) + example_group.after_all_parts.should include(block) end - child_example_group.described_type.should == Object - end - end - describe "#remove_after" do - it "should unregister a given after(:each) block" do - after_all_ran = false - @example_group.it("example") {} - proc = Proc.new { after_all_ran = true } - ExampleGroup.after(:each, &proc) - @example_group.run - after_all_ran.should be_true - - after_all_ran = false - ExampleGroup.remove_after(:each, &proc) - @example_group.run - after_all_ran.should be_false + it "stores after(:suite) blocks" do + example_group = Class.new(ExampleGroupDouble) {} + parts = [] + ExampleGroupMethods.stub!(:after_suite_parts).and_return(parts) + block = lambda {} + example_group.after(:suite, &block) + example_group.after_suite_parts.should include(block) + end end - end - - describe "#include" do - it "should have accessible class methods from included module" do - mod1_method_called = false - mod1 = Module.new do - extend Spec::MetaClass - class_methods = Module.new do - define_method :mod1_method do - mod1_method_called = true - end - end - metaclass.class_eval do - define_method(:included) do |receiver| - receiver.extend class_methods + describe "#run_before_all" do + it "does not create an instance if before_all_parts are empty" do + example_group = Class.new(ExampleGroupDouble) { example("one example") {} } + example_group.should_not_receive(:new) + example_group.__send__ :run_before_all, nil + end + end + + describe "#run_after_all" do + it "does not create an instance if after_all_parts are empty" do + example_group = Class.new(ExampleGroupDouble) { example("one example") {} } + example_group.should_not_receive(:new) + example_group.__send__ :run_after_all, true, {}, nil + end + end + + describe "#examples_to_run" do + it "runs only the example identified by a line number" do + example_group = Class.new(ExampleGroupDouble).describe("this") do + it { 3.should == 3 } + it "has another example which raises" do + raise "this shouldn't have run" end end + options.examples << :ignore + options.line_number = __LINE__ - 6 + options.files << __FILE__ + example_group.run(options).should be_true end - mod2_method_called = false - mod2 = Module.new do - extend Spec::MetaClass - class_methods = Module.new do - define_method :mod2_method do - mod2_method_called = true - end - end + it "runs the example identified by a line number even if it's not the example line number" do + example_group = Class.new(ExampleGroupDouble).describe("this") do + + it { raise "foo" } - metaclass.class_eval do - define_method(:included) do |receiver| - receiver.extend class_methods - end end + options.examples << :ignore + options.line_number = __LINE__ - 3 + options.files << __FILE__ + example_group.run(options).should be_false end - @example_group.include mod1, mod2 - - @example_group.mod1_method - @example_group.mod2_method - mod1_method_called.should be_true - mod2_method_called.should be_true - end - end + it "runs all the examples in the group " do + first_example_ran = false + second_example_ran = false + example_group = Class.new(ExampleGroupDouble).describe("this") do - describe "#number_of_examples" do - it "should count number of specs" do - proc do - @example_group.it("one") {} - @example_group.it("two") {} - @example_group.it("three") {} - @example_group.it("four") {} - end.should change {@example_group.number_of_examples}.by(4) - end - end + it { first_example_ran = true } + it { second_example_ran = true } - describe "#class_eval" do - it "should allow constants to be defined" do - example_group = Class.new(ExampleGroup) do - describe('example') - FOO = 1 - it "should reference FOO" do - FOO.should == 1 end + options.line_number = __LINE__ - 6 + options.files << __FILE__ + options.examples << :ignore + example_group.run(options) + first_example_ran.should be_true + second_example_ran.should be_true + end + + it "doesn't run any examples in another group" do + example_ran = false + example_group_1 = Class.new(ExampleGroupDouble).describe("this") do + it "ignore" do + example_ran = true + end + end + example_group_2 = Class.new(ExampleGroupDouble).describe("that") do + end + options.examples << :ignore + options.line_number = __LINE__ - 3 + options.files << __FILE__ + example_group_1.run(options) + example_group_2.run(options) + example_ran.should be_false end - example_group.run - Object.const_defined?(:FOO).should == false end - end - describe '#register' do - it "should add ExampleGroup to set of ExampleGroups to be run" do - options.example_groups.delete(example_group) - options.example_groups.should_not include(example_group) + describe "#define" do + let(:counter) do + Class.new do + def initialize + @count = 0 + end + def count + @count += 1 + end + end.new + end + it "generates an instance method" do + counter.count.should == 1 + end - example_group.register {} - options.example_groups.should include(example_group) - end - end - - describe '#unregister' do - before do - options.example_groups.should include(example_group) - end - - it "should remove ExampleGroup from set of ExampleGroups to be run" do - example_group.unregister - options.example_groups.should_not include(example_group) - end - end - - describe "#registration_backtrace" do - it "returns the backtrace of where the ExampleGroup was registered" do - example_group = Class.new(ExampleGroup) - example_group.registration_backtrace.join("\n").should include("#{__FILE__}:#{__LINE__-1}") + it "caches the value" do + counter.count.should == 1 + counter.count.should == 2 + end end end end end -end
\ No newline at end of file +end diff --git a/vendor/plugins/rspec/spec/spec/example/example_group_spec.rb b/vendor/plugins/rspec/spec/spec/example/example_group_spec.rb index 36e1cdf0d..086c166ca 100644 --- a/vendor/plugins/rspec/spec/spec/example/example_group_spec.rb +++ b/vendor/plugins/rspec/spec/spec/example/example_group_spec.rb @@ -1,4 +1,4 @@ -require File.dirname(__FILE__) + '/../../spec_helper' +require 'spec_helper' module Spec module Example @@ -7,9 +7,7 @@ module Spec module Foo module Bar - def self.loaded? - true - end + def self.loaded?; true; end end end include Foo @@ -18,11 +16,23 @@ module Spec Bar.should be_loaded end - @@foo = 1 + @@class_variable = "a class variable" - it "should allow class variables to be defined" do - @@foo.should == 1 + it "can access class variables in examples in Ruby 1.8" do + with_ruby 1.8 do + @@class_variable.should == "a class variable" + end + end + + it "can NOT access class variables in examples in Ruby 1.9" do + with_ruby 1.9 do + lambda do + @@class_variable.should == "a class variable" + end.should raise_error(NameError) + end end + + end class ExampleClassVariablePollutionSpec < ExampleGroup @@ -30,7 +40,7 @@ module Spec it "should not retain class variables from other Example classes" do proc do - @@foo + @@class_variable end.should raise_error end end @@ -60,663 +70,573 @@ module Spec describe ExampleGroup, "#run with failure in example", :shared => true do it "should add an example failure to the TestResult" do - example_group.run.should be_false + example_group.run(options).should be_false end end describe ExampleGroup, "#run" do - it_should_behave_like "sandboxed rspec_options" - attr_reader :example_group, :formatter, :reporter - before :each do - @formatter = mock("formatter", :null_object => true) - options.formatters << formatter - options.backtrace_tweaker = mock("backtrace_tweaker", :null_object => true) - @reporter = FakeReporter.new(options) - options.reporter = reporter - @example_group = Class.new(ExampleGroup) do - describe("example") - it "does nothing" do - end - end - class << example_group - public :include - end - end - - after :each do - ExampleGroup.reset - end - - it "should not run when there are no examples" do - example_group = Class.new(ExampleGroup) do - describe("Foobar") - end - example_group.examples.should be_empty - - reporter = mock("Reporter") - reporter.should_not_receive(:add_example_group) - example_group.run - end - - describe "when before_each fails" do - before(:each) do - $example_ran = $after_each_ran = false - @example_group = describe("Foobar") do - before(:each) {raise} - it "should not be run" do - $example_ran = true - end - after(:each) do - $after_each_ran = true + with_sandboxed_options do + attr_reader :example_group, :formatter, :reporter + before :each do + method_with_three_args = lambda { |arg1, arg2, arg3| } + @formatter = mock("formatter", :null_object => true, :example_pending => method_with_three_args) + options.formatters << formatter + options.backtrace_tweaker = mock("backtrace_tweaker", :null_object => true) + @reporter = FakeReporter.new(options) + options.reporter = reporter + @example_group = Class.new(ExampleGroupDouble) do + describe("example") + it "does nothing" do end end + class << example_group + public :include + end end - it "should not run example block" do - example_group.run - $example_ran.should be_false - end - - it "should run after_each" do - example_group.run - $after_each_ran.should be_true + after :each do + ExampleGroup.reset end - it "should report failure location when in before_each" do - reporter.should_receive(:example_finished) do |example_group, error| - error.message.should eql("in before_each") + it "should not run when there are no examples" do + example_group = Class.new(ExampleGroupDouble) do + describe("Foobar") end - example_group.run - end - end - - describe ExampleGroup, "#run on dry run" do - before do - @options.dry_run = true - end + example_group.examples.should be_empty - it "should not run before(:all) or after(:all)" do - before_all_ran = false - after_all_ran = false - ExampleGroup.before(:all) { before_all_ran = true } - ExampleGroup.after(:all) { after_all_ran = true } - example_group.it("should") {} - example_group.run - before_all_ran.should be_false - after_all_ran.should be_false + reporter = mock("Reporter") + reporter.should_not_receive(:add_example_group) + example_group.run(options) end - it "should not run example" do - example_ran = false - example_group.it("should") {example_ran = true} - example_group.run - example_ran.should be_false + it "should report the start of an example run" do + reporter.should_receive(:example_started) do |example| + example.should equal(example_group.examples[0]) + end + example_group.run(options) end - end - describe ExampleGroup, "#run with specified examples" do - attr_reader :examples_that_were_run - before do - @examples_that_were_run = [] + it "should report the end of an example run" do + reporter.should_receive(:example_finished) do |example, execution_error| + example.should equal(example_group.examples[0]) + execution_error.should be_nil + end + example_group.run(options) end - - describe "when specified_examples matches entire ExampleGroup" do - before do - examples_that_were_run = @examples_that_were_run - @example_group = Class.new(ExampleGroup) do - describe("the ExampleGroup") - it("should be run") do - examples_that_were_run << 'should be run' + + describe "when before_each fails" do + before(:each) do + $example_ran = $after_each_ran = false + @example_group = describe("Foobar") do + before(:each) {raise} + it "should not be run" do + $example_ran = true end - - it("should also be run") do - examples_that_were_run << 'should also be run' + after(:each) do + $after_each_ran = true end end - options.examples = ["the ExampleGroup"] end - it "should not run the Examples in the ExampleGroup" do - example_group.run - examples_that_were_run.should == ['should be run', 'should also be run'] + it "should not run example block" do + example_group.run(options) + $example_ran.should be_false end - end - - describe ExampleGroup, "#run when specified_examples matches only Example description" do - before do - examples_that_were_run = @examples_that_were_run - @example_group = Class.new(ExampleGroup) do - describe("example") - it("should be run") do - examples_that_were_run << 'should be run' - end - end - options.examples = ["should be run"] + + it "should run after_each" do + example_group.run(options) + $after_each_ran.should be_true end - it "should not run the example" do - example_group.run - examples_that_were_run.should == ['should be run'] - end - end - - describe ExampleGroup, "#run when specified_examples does not match an Example description" do - before do - examples_that_were_run = @examples_that_were_run - @example_group = Class.new(ExampleGroup) do - describe("example") - it("should be something else") do - examples_that_were_run << 'should be something else' - end + it "should report failure location when in before_each" do + reporter.should_receive(:example_finished) do |example_group, error| + error.message.should eql("in before_each") end - options.examples = ["does not match anything"] - end - - it "should not run the example" do - example_group.run - examples_that_were_run.should == [] + example_group.run(options) end end - describe ExampleGroup, "#run when specified_examples matches an Example description" do + describe ExampleGroup, "#run on dry run" do before do - examples_that_were_run = @examples_that_were_run - @example_group = Class.new(ExampleGroup) do - describe("example") - it("should be run") do - examples_that_were_run << 'should be run' - end - it("should not be run") do - examples_that_were_run << 'should not be run' - end - end - options.examples = ["should be run"] + @options.dry_run = true end - it "should run only the example, when there in only one" do - example_group.run - examples_that_were_run.should == ["should be run"] + it "should not run before(:all) or after(:all)" do + before_all_ran = false + after_all_ran = false + ExampleGroup.before(:all) { before_all_ran = true } + ExampleGroup.after(:all) { after_all_ran = true } + example_group.it("should") {} + example_group.run(options) + before_all_ran.should be_false + after_all_ran.should be_false end - it "should run only the one example" do - example_group.run - examples_that_were_run.should == ["should be run"] end + it "should not run example" do + example_ran = false + example_group.it("should") {example_ran = true} + example_group.run(options) + example_ran.should be_false + end end - end - describe ExampleGroup, "#run with success" do - before do - @special_example_group = Class.new(ExampleGroup) - ExampleGroupFactory.register(:special, @special_example_group) - @not_special_example_group = Class.new(ExampleGroup) - ExampleGroupFactory.register(:not_special, @not_special_example_group) - end + describe ExampleGroup, "#run with specified examples" do + attr_reader :examples_that_were_run + before do + @examples_that_were_run = [] + end - after do - ExampleGroupFactory.reset - end + describe "when specified_examples matches entire ExampleGroup" do + before do + examples_that_were_run = @examples_that_were_run + @example_group = Class.new(ExampleGroupDouble) do + describe("the ExampleGroup") + it("should be run") do + examples_that_were_run << 'should be run' + end - it "should send reporter add_example_group" do - example_group.run - reporter.example_groups.should == [example_group] - end + it("should also be run") do + examples_that_were_run << 'should also be run' + end + end + options.parse_example "the ExampleGroup" + end - it "should run example on run" do - example_ran = false - example_group.it("should") {example_ran = true} - example_group.run - example_ran.should be_true - end + it "should not run the Examples in the ExampleGroup" do + example_group.run(options) + examples_that_were_run.should == ['should be run', 'should also be run'] + end + end - it "should run before(:all) block only once" do - before_all_run_count_run_count = 0 - example_group.before(:all) {before_all_run_count_run_count += 1} - example_group.it("test") {true} - example_group.it("test2") {true} - example_group.run - before_all_run_count_run_count.should == 1 - end + describe ExampleGroup, "#run when specified_examples matches only Example description" do + before do + examples_that_were_run = @examples_that_were_run + @example_group = Class.new(ExampleGroupDouble) do + describe("example") + it("should be run") do + examples_that_were_run << 'should be run' + end + end + options.parse_example "should be run" + end - it "should run after(:all) block only once" do - after_all_run_count = 0 - example_group.after(:all) {after_all_run_count += 1} - example_group.it("test") {true} - example_group.it("test2") {true} - example_group.run - after_all_run_count.should == 1 - @reporter.rspec_verify - end + it "should not run the example" do + example_group.run(options) + examples_that_were_run.should == ['should be run'] + end + end - it "after(:all) should have access to all instance variables defined in before(:all)" do - context_instance_value_in = "Hello there" - context_instance_value_out = "" - example_group.before(:all) { @instance_var = context_instance_value_in } - example_group.after(:all) { context_instance_value_out = @instance_var } - example_group.it("test") {true} - example_group.run - context_instance_value_in.should == context_instance_value_out - end + describe ExampleGroup, "#run when specified_examples does not match an Example description" do + before do + examples_that_were_run = @examples_that_were_run + @example_group = Class.new(ExampleGroupDouble) do + describe("example") + it("should be something else") do + examples_that_were_run << 'should be something else' + end + end + options.parse_example "does not match anything" + end - it "should copy instance variables from before(:all)'s execution context into spec's execution context" do - context_instance_value_in = "Hello there" - context_instance_value_out = "" - example_group.before(:all) { @instance_var = context_instance_value_in } - example_group.it("test") {context_instance_value_out = @instance_var} - example_group.run - context_instance_value_in.should == context_instance_value_out - end + it "should not run the example" do + example_group.run(options) + examples_that_were_run.should == [] + end + end - it "should not add global before callbacks for untargetted example_group" do - fiddle = [] - - ExampleGroup.before(:all) { fiddle << "Example.before(:all)" } - ExampleGroup.prepend_before(:all) { fiddle << "Example.prepend_before(:all)" } - @special_example_group.before(:each) { fiddle << "Example.before(:each, :type => :special)" } - @special_example_group.prepend_before(:each) { fiddle << "Example.prepend_before(:each, :type => :special)" } - @special_example_group.before(:all) { fiddle << "Example.before(:all, :type => :special)" } - @special_example_group.prepend_before(:all) { fiddle << "Example.prepend_before(:all, :type => :special)" } - - example_group = Class.new(ExampleGroup) do - describe("I'm not special", :type => :not_special) - it "does nothing" - end - example_group.run - fiddle.should == [ - 'Example.prepend_before(:all)', - 'Example.before(:all)', - ] - end + describe ExampleGroup, "#run when specified_examples matches an Example description" do + before do + examples_that_were_run = @examples_that_were_run + @example_group = Class.new(ExampleGroupDouble) do + describe("example") + it("should be run") do + examples_that_were_run << 'should be run' + end + it("should not be run") do + examples_that_were_run << 'should not be run' + end + end + options.parse_example "should be run" + end - it "should add global before callbacks for targetted example_groups" do - fiddle = [] - - ExampleGroup.before(:all) { fiddle << "Example.before(:all)" } - ExampleGroup.prepend_before(:all) { fiddle << "Example.prepend_before(:all)" } - @special_example_group.before(:each) { fiddle << "special.before(:each, :type => :special)" } - @special_example_group.prepend_before(:each) { fiddle << "special.prepend_before(:each, :type => :special)" } - @special_example_group.before(:all) { fiddle << "special.before(:all, :type => :special)" } - @special_example_group.prepend_before(:all) { fiddle << "special.prepend_before(:all, :type => :special)" } - @special_example_group.append_before(:each) { fiddle << "special.append_before(:each, :type => :special)" } - - example_group = Class.new(@special_example_group).describe("I'm a special example_group") {} - example_group.it("test") {true} - example_group.run - fiddle.should == [ - 'Example.prepend_before(:all)', - 'Example.before(:all)', - 'special.prepend_before(:all, :type => :special)', - 'special.before(:all, :type => :special)', - 'special.prepend_before(:each, :type => :special)', - 'special.before(:each, :type => :special)', - 'special.append_before(:each, :type => :special)', - ] + it "should run only the example" do + example_group.run(options) + examples_that_were_run.should == ["should be run"] + end + end end - it "should order before callbacks from global to local" do - fiddle = [] - ExampleGroup.prepend_before(:all) { fiddle << "Example.prepend_before(:all)" } - ExampleGroup.before(:all) { fiddle << "Example.before(:all)" } - example_group.prepend_before(:all) { fiddle << "prepend_before(:all)" } - example_group.before(:all) { fiddle << "before(:all)" } - example_group.prepend_before(:each) { fiddle << "prepend_before(:each)" } - example_group.before(:each) { fiddle << "before(:each)" } - example_group.run - fiddle.should == [ - 'Example.prepend_before(:all)', - 'Example.before(:all)', - 'prepend_before(:all)', - 'before(:all)', - 'prepend_before(:each)', - 'before(:each)' - ] - end + describe ExampleGroup, "#run with success" do + before do + @special_example_group = Class.new(ExampleGroupDouble) + ExampleGroupFactory.register(:special, @special_example_group) + @not_special_example_group = Class.new(ExampleGroupDouble) + ExampleGroupFactory.register(:not_special, @not_special_example_group) + end - it "should order after callbacks from local to global" do - fiddle = [] - example_group.after(:each) { fiddle << "after(:each)" } - example_group.append_after(:each) { fiddle << "append_after(:each)" } - example_group.after(:all) { fiddle << "after(:all)" } - example_group.append_after(:all) { fiddle << "append_after(:all)" } - ExampleGroup.after(:all) { fiddle << "Example.after(:all)" } - ExampleGroup.append_after(:all) { fiddle << "Example.append_after(:all)" } - example_group.run - fiddle.should == [ - 'after(:each)', - 'append_after(:each)', - 'after(:all)', - 'append_after(:all)', - 'Example.after(:all)', - 'Example.append_after(:all)' - ] - end + after do + ExampleGroupFactory.reset + end - it "should have accessible instance methods from included module" do - mod1_method_called = false - mod1 = Module.new do - define_method :mod1_method do - mod1_method_called = true - end + it "should send reporter example_group_started" do + reporter.should_receive(:example_group_started) + example_group.run(options) end - mod2_method_called = false - mod2 = Module.new do - define_method :mod2_method do - mod2_method_called = true - end + it "should run example on run" do + example_ran = false + example_group.it("should") {example_ran = true} + example_group.run(options) + example_ran.should be_true end - example_group.include mod1, mod2 + it "should run before(:all) block only once" do + before_all_run_count_run_count = 0 + example_group.before(:all) {before_all_run_count_run_count += 1} + example_group.it("test") {true} + example_group.it("test2") {true} + example_group.run(options) + before_all_run_count_run_count.should == 1 + end - example_group.it("test") do - mod1_method - mod2_method + it "should run after(:all) block only once" do + after_all_run_count = 0 + example_group.after(:all) {after_all_run_count += 1} + example_group.it("test") {true} + example_group.it("test2") {true} + example_group.run(options) + after_all_run_count.should == 1 + @reporter.rspec_verify end - example_group.run - mod1_method_called.should be_true - mod2_method_called.should be_true - end - it "should include targetted modules included using configuration" do - mod1 = Module.new - mod2 = Module.new - mod3 = Module.new - Spec::Runner.configuration.include(mod1, mod2) - Spec::Runner.configuration.include(mod3, :type => :not_special) + it "after(:all) should have access to all instance variables defined in before(:all)" do + context_instance_value_in = "Hello there" + context_instance_value_out = "" + example_group.before(:all) { @instance_var = context_instance_value_in } + example_group.after(:all) { context_instance_value_out = @instance_var } + example_group.it("test") {true} + example_group.run(options) + context_instance_value_in.should == context_instance_value_out + end - example_group = Class.new(@special_example_group).describe("I'm special", :type => :special) do - it "does nothing" + it "should copy instance variables from before(:all)'s execution context into spec's execution context" do + context_instance_value_in = "Hello there" + context_instance_value_out = "" + example_group.before(:all) { @instance_var = context_instance_value_in } + example_group.it("test") {context_instance_value_out = @instance_var} + example_group.run(options) + context_instance_value_in.should == context_instance_value_out end - example_group.run - example_group.included_modules.should include(mod1) - example_group.included_modules.should include(mod2) - example_group.included_modules.should_not include(mod3) - end + it "should not add global before callbacks for untargetted example_group" do + fiddle = [] + + ExampleGroup.before(:all) { fiddle << "Example.before(:all)" } + ExampleGroup.prepend_before(:all) { fiddle << "Example.prepend_before(:all)" } + @special_example_group.before(:each) { fiddle << "Example.before(:each, :type => :special)" } + @special_example_group.prepend_before(:each) { fiddle << "Example.prepend_before(:each, :type => :special)" } + @special_example_group.before(:all) { fiddle << "Example.before(:all, :type => :special)" } + @special_example_group.prepend_before(:all) { fiddle << "Example.prepend_before(:all, :type => :special)" } - it "should include any predicate_matchers included using configuration" do - $included_predicate_matcher_found = false - Spec::Runner.configuration.predicate_matchers[:do_something] = :does_something? - example_group = Class.new(ExampleGroup) do - describe('example') - it "should respond to do_something" do - $included_predicate_matcher_found = respond_to?(:do_something) + example_group = Class.new(ExampleGroupDouble) do + describe("I'm not special", :type => :not_special) + it "does nothing" + end + example_group.run(options) + fiddle.should == [ + 'Example.prepend_before(:all)', + 'Example.before(:all)', + ] + end + + it "should add global before callbacks for targetted example_groups" do + fiddle = [] + + ExampleGroup.before(:all) { fiddle << "Example.before(:all)" } + ExampleGroup.prepend_before(:all) { fiddle << "Example.prepend_before(:all)" } + @special_example_group.before(:each) { fiddle << "special.before(:each, :type => :special)" } + @special_example_group.prepend_before(:each) { fiddle << "special.prepend_before(:each, :type => :special)" } + @special_example_group.before(:all) { fiddle << "special.before(:all, :type => :special)" } + @special_example_group.prepend_before(:all) { fiddle << "special.prepend_before(:all, :type => :special)" } + @special_example_group.append_before(:each) { fiddle << "special.append_before(:each, :type => :special)" } + + example_group = Class.new(@special_example_group).describe("I'm a special example_group") {} + example_group.it("test") {true} + example_group.run(options) + fiddle.should == [ + 'Example.prepend_before(:all)', + 'Example.before(:all)', + 'special.prepend_before(:all, :type => :special)', + 'special.before(:all, :type => :special)', + 'special.prepend_before(:each, :type => :special)', + 'special.before(:each, :type => :special)', + 'special.append_before(:each, :type => :special)', + ] + end + + it "should order before callbacks from global to local" do + fiddle = [] + ExampleGroup.prepend_before(:all) { fiddle << "Example.prepend_before(:all)" } + ExampleGroup.before(:all) { fiddle << "Example.before(:all)" } + example_group.prepend_before(:all) { fiddle << "prepend_before(:all)" } + example_group.before(:all) { fiddle << "before(:all)" } + example_group.prepend_before(:each) { fiddle << "prepend_before(:each)" } + example_group.before(:each) { fiddle << "before(:each)" } + example_group.run(options) + fiddle.should == [ + 'Example.prepend_before(:all)', + 'Example.before(:all)', + 'prepend_before(:all)', + 'before(:all)', + 'prepend_before(:each)', + 'before(:each)' + ] + end + + it "should order after callbacks from local to global" do + fiddle = [] + example_group.after(:each) { fiddle << "after(:each)" } + example_group.append_after(:each) { fiddle << "append_after(:each)" } + example_group.after(:all) { fiddle << "after(:all)" } + example_group.append_after(:all) { fiddle << "append_after(:all)" } + ExampleGroup.after(:all) { fiddle << "Example.after(:all)" } + ExampleGroup.append_after(:all) { fiddle << "Example.append_after(:all)" } + example_group.run(options) + fiddle.should == [ + 'after(:each)', + 'append_after(:each)', + 'after(:all)', + 'append_after(:all)', + 'Example.after(:all)', + 'Example.append_after(:all)' + ] + end + + it "should have accessible instance methods from included module" do + mod1_method_called = false + mod1 = Module.new do + define_method :mod1_method do + mod1_method_called = true + end end - end - example_group.run - $included_predicate_matcher_found.should be(true) - end - it "should use a mock framework set up in config" do - mod = Module.new do - class << self - def included(mod) - $included_module = mod + mod2_method_called = false + mod2 = Module.new do + define_method :mod2_method do + mod2_method_called = true end end - def teardown_mocks_for_rspec - $torn_down = true + example_group.include mod1, mod2 + + example_group.it("test") do + mod1_method + mod2_method end + example_group.run(options) + mod1_method_called.should be_true + mod2_method_called.should be_true end - begin - $included_module = nil - $torn_down = true - Spec::Runner.configuration.mock_with mod + it "should include targetted modules included using configuration" do + mod1 = Module.new + mod2 = Module.new + mod3 = Module.new + Spec::Runner.configuration.include(mod1, mod2) + Spec::Runner.configuration.include(mod3, :type => :not_special) - example_group = Class.new(ExampleGroup) do - describe('example') + example_group = Class.new(@special_example_group).describe("I'm special", :type => :special) do it "does nothing" end - example_group.run + example_group.run(options) - $included_module.should_not be_nil - $torn_down.should == true - ensure - Spec::Runner.configuration.mock_with :rspec + example_group.included_modules.should include(mod1) + example_group.included_modules.should include(mod2) + example_group.included_modules.should_not include(mod3) end + end - end - describe ExampleGroup, "#run with pending example that has a failing assertion" do - before do - example_group.it("should be pending") do - pending("Example fails") {false.should be_true} + describe ExampleGroup, "#run with pending example that has a failing assertion" do + before do + example_group.it("should be pending") do + pending("Example fails") {false.should be_true} + end end - end - it "should send example_pending to formatter" do - @formatter.should_receive(:example_pending).with("example", "should be pending", "Example fails") - example_group.run + it "should send example_pending to formatter" do + @formatter.should_receive(:example_pending).with("example", "should be pending", "Example fails") + example_group.run(options) + end end - end - describe ExampleGroup, "#run with pending example that does not have a failing assertion" do - it_should_behave_like "Spec::Example::ExampleGroup#run with failure in example" + describe ExampleGroup, "#run with pending example that does not have a failing assertion" do + it_should_behave_like "Spec::Example::ExampleGroup#run with failure in example" - before do - example_group.it("should be pending") do - pending("Example passes") {true.should be_true} + before do + example_group.it("should be pending") do + pending("Example passes") {true.should be_true} + end end - end - it "should send example_pending to formatter" do - @formatter.should_receive(:example_pending).with("example", "should be pending", "Example passes") - example_group.run + it "should send example_pending to formatter" do + @formatter.should_receive(:example_pending).with("example", "should be pending", "Example passes") + example_group.run(options) + end end - end - describe ExampleGroup, "#run when before(:all) fails" do - it_should_behave_like "Spec::Example::ExampleGroup#run with failure in example" + describe ExampleGroup, "#run when before(:all) fails" do + it_should_behave_like "Spec::Example::ExampleGroup#run with failure in example" - before do - ExampleGroup.before(:all) { raise NonStandardError, "before(:all) failure" } - end - - it "should not run any example" do - spec_ran = false - example_group.it("test") {spec_ran = true} - example_group.run - spec_ran.should be_false - end + before do + ExampleGroup.before(:all) { raise NonStandardError, "before(:all) failure" } + end - it "should run ExampleGroup after(:all)" do - after_all_ran = false - ExampleGroup.after(:all) { after_all_ran = true } - example_group.run - after_all_ran.should be_true - end + it "should not run any example" do + spec_ran = false + example_group.it("test") {spec_ran = true} + example_group.run(options) + spec_ran.should be_false + end - it "should run example_group after(:all)" do - after_all_ran = false - example_group.after(:all) { after_all_ran = true } - example_group.run - after_all_ran.should be_true - end + it "should run ExampleGroup after(:all)" do + after_all_ran = false + ExampleGroup.after(:all) { after_all_ran = true } + example_group.run(options) + after_all_ran.should be_true + end - it "should supply before(:all) as description" do - @reporter.should_receive(:failure) do |example, error| - example.description.should eql("before(:all)") - error.message.should eql("before(:all) failure") + it "should run example_group after(:all)" do + after_all_ran = false + example_group.after(:all) { after_all_ran = true } + example_group.run(options) + after_all_ran.should be_true end - example_group.it("test") {true} - example_group.run + it "should supply before(:all) as description" do + @reporter.should_receive(:example_failed) do |example, error| + example.description.should eql("before(:all)") + error.message.should eql("before(:all) failure") + end + + example_group.it("test") {true} + example_group.run(options) + end end - end - describe ExampleGroup, "#run when before(:each) fails" do - it_should_behave_like "Spec::Example::ExampleGroup#run with failure in example" + describe ExampleGroup, "#run when before(:each) fails" do + it_should_behave_like "Spec::Example::ExampleGroup#run with failure in example" - before do - ExampleGroup.before(:each) { raise NonStandardError } - end + before do + ExampleGroup.before(:each) { raise NonStandardError } + end - it "should run after(:all)" do - after_all_ran = false - ExampleGroup.after(:all) { after_all_ran = true } - example_group.run - after_all_ran.should be_true + it "should run after(:all)" do + after_all_ran = false + ExampleGroup.after(:all) { after_all_ran = true } + example_group.run(options) + after_all_ran.should be_true + end end - end - describe ExampleGroup, "#run when any example fails" do - it_should_behave_like "Spec::Example::ExampleGroup#run with failure in example" + describe ExampleGroup, "#run when any example fails" do + it_should_behave_like "Spec::Example::ExampleGroup#run with failure in example" - before do - example_group.it("should") { raise NonStandardError } - end + before do + example_group.it("should") { raise NonStandardError } + end - it "should run after(:all)" do - after_all_ran = false - ExampleGroup.after(:all) { after_all_ran = true } - example_group.run - after_all_ran.should be_true + it "should run after(:all)" do + after_all_ran = false + ExampleGroup.after(:all) { after_all_ran = true } + example_group.run(options) + after_all_ran.should be_true + end end - end - describe ExampleGroup, "#run when first after(:each) block fails" do - it_should_behave_like "Spec::Example::ExampleGroup#run with failure in example" + describe ExampleGroup, "#run when first after(:each) block fails" do + it_should_behave_like "Spec::Example::ExampleGroup#run with failure in example" - before do - class << example_group - attr_accessor :first_after_ran, :second_after_ran - end - example_group.first_after_ran = false - example_group.second_after_ran = false + before do + class << example_group + attr_accessor :first_after_ran, :second_after_ran + end + example_group.first_after_ran = false + example_group.second_after_ran = false - example_group.after(:each) do - self.class.second_after_ran = true - end - example_group.after(:each) do - self.class.first_after_ran = true - raise "first" + example_group.after(:each) do + self.class.second_after_ran = true + end + example_group.after(:each) do + self.class.first_after_ran = true + raise "first" + end end - end - it "should run second after(:each) block" do - reporter.should_receive(:example_finished) do |example, error| - example.should equal(example) - error.message.should eql("first") + it "should run second after(:each) block" do + reporter.should_receive(:example_finished) do |example, error| + example.should equal(example) + error.message.should eql("first") + end + example_group.run(options) + example_group.first_after_ran.should be_true + example_group.second_after_ran.should be_true end - example_group.run - example_group.first_after_ran.should be_true - example_group.second_after_ran.should be_true end - end - describe ExampleGroup, "#run when first before(:each) block fails" do - it_should_behave_like "Spec::Example::ExampleGroup#run with failure in example" + describe ExampleGroup, "#run when first before(:each) block fails" do + it_should_behave_like "Spec::Example::ExampleGroup#run with failure in example" - before do - class << example_group - attr_accessor :first_before_ran, :second_before_ran - end - example_group.first_before_ran = false - example_group.second_before_ran = false + before do + class << example_group + attr_accessor :first_before_ran, :second_before_ran + end + example_group.first_before_ran = false + example_group.second_before_ran = false - example_group.before(:each) do - self.class.first_before_ran = true - raise "first" - end - example_group.before(:each) do - self.class.second_before_ran = true + example_group.before(:each) do + self.class.first_before_ran = true + raise "first" + end + example_group.before(:each) do + self.class.second_before_ran = true + end end - end - it "should not run second before(:each)" do - reporter.should_receive(:example_finished) do |name, error| - error.message.should eql("first") + it "should not run second before(:each)" do + reporter.should_receive(:example_finished) do |name, error| + error.message.should eql("first") + end + example_group.run(options) + example_group.first_before_ran.should be_true + example_group.second_before_ran.should be_false end - example_group.run - example_group.first_before_ran.should be_true - example_group.second_before_ran.should be_false end - end - describe ExampleGroup, "#run when failure in after(:all)" do - it_should_behave_like "Spec::Example::ExampleGroup#run with failure in example" + describe ExampleGroup, "#run when failure in after(:all)" do + it_should_behave_like "Spec::Example::ExampleGroup#run with failure in example" - before do - ExampleGroup.after(:all) { raise NonStandardError, "in after(:all)" } - end + before do + ExampleGroup.after(:all) { raise NonStandardError, "in after(:all)" } + end - it "should return false" do - example_group.run.should be_false + it "should return false" do + example_group.run(options).should be_false + end end end end - class ExampleSubclass < ExampleGroup - end - describe ExampleGroup, "subclasses" do - after do - ExampleGroupFactory.reset - end - it "should have access to the described_type" do - example_group = Class.new(ExampleSubclass) do - describe(Array) - end - example_group.send(:described_type).should == Array + example_group = Class.new(ExampleGroupDouble).describe(Array) + example_group.__send__(:described_type).should == Array end it "should concat descriptions when nested" do - example_group = Class.new(ExampleSubclass) do - describe(Array) - $nested_group = describe("when empty") do - end - end - $nested_group.description.to_s.should == "Array when empty" - end - end - - describe Enumerable do - before(:each) do - Kernel.stub!(:warn) - end - - def each(&block) - ["4", "2", "1"].each(&block) - end - - it "should be included in examples because it is a module" do - map{|e| e.to_i}.should == [4,2,1] - end - end - - describe "An", Enumerable, "as a second argument" do - before(:each) do - Kernel.stub!(:warn) - end - - def each(&block) - ["4", "2", "1"].each(&block) - end - - it "should be included in examples because it is a module" do - map{|e| e.to_i}.should == [4,2,1] - end - end - - describe Enumerable do - describe "as the parent of nested example groups" do - before(:each) do - Kernel.stub!(:warn) - end - - it "should be included in examples because it is a module" do - pending("need to make sure nested groups know the described type") do - map{|e| e.to_i}.should == [4,2,1] - end - end - end - end - - describe String do - it "should not be included in examples because it is not a module" do - lambda{self.map}.should raise_error(NoMethodError, /undefined method `map' for/) + example_group = Class.new(ExampleGroupDouble).describe(Array) + nested_group = example_group.describe("when empty") do; end + nested_group.description.to_s.should == "Array when empty" end end end diff --git a/vendor/plugins/rspec/spec/spec/example/example_matcher_spec.rb b/vendor/plugins/rspec/spec/spec/example/example_matcher_spec.rb index ea0dfe019..1a7e5da25 100644 --- a/vendor/plugins/rspec/spec/spec/example/example_matcher_spec.rb +++ b/vendor/plugins/rspec/spec/spec/example/example_matcher_spec.rb @@ -1,71 +1,54 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' +require 'spec_helper' module Spec module Example - module ExampleMatcherSpecHelper - class MatchDescription - def initialize(description) - @description = description - end - - def matches?(matcher) - matcher.matches?(@description) - end - - def failure_message - "expected matcher.matches?(#{@description.inspect}) to return true, got false" - end - - def negative_failure_message - "expected matcher.matches?(#{@description.inspect}) to return false, got true" + describe ExampleMatcher, "#matches?" do + def match_examples(examples) + simple_matcher do |actual, matcher| + matcher.failure_message = "expected matcher.matches?(#{description.inspect}) to return true, got false" + matcher.negative_failure_message = "expected matcher.matches?(#{description.inspect}) to return false, got true" + actual.matches?(examples) end end - def match_description(description) - MatchDescription.new(description) - end - end - - describe ExampleMatcher, "#matches?" do - include ExampleMatcherSpecHelper it "should match correct example_group and example" do matcher = ExampleMatcher.new("example_group", "example") - matcher.should match_description("example_group example") + matcher.should match_examples(["example_group example"]) end it "should not match wrong example" do matcher = ExampleMatcher.new("example_group", "other example") - matcher.should_not match_description("example_group example") + matcher.should_not match_examples(["example_group example"]) end it "should not match wrong example_group" do matcher = ExampleMatcher.new("other example_group", "example") - matcher.should_not match_description("example_group example") + matcher.should_not match_examples(["example_group example"]) end it "should match example only" do matcher = ExampleMatcher.new("example_group", "example") - matcher.should match_description("example") + matcher.should match_examples(["example"]) end it "should match example_group only" do matcher = ExampleMatcher.new("example_group", "example") - matcher.should match_description("example_group") + matcher.should match_examples(["example_group"]) end it "should match example_group ending with before(:all)" do matcher = ExampleMatcher.new("example_group", "example") - matcher.should match_description("example_group before(:all)") + matcher.should match_examples(["example_group before(:all)"]) end it "should escape regexp chars" do matcher = ExampleMatcher.new("(con|text)", "[example]") - matcher.should_not match_description("con p") + matcher.should_not match_examples(["con p"]) end it "should match when example_group is modularized" do matcher = ExampleMatcher.new("MyModule::MyClass", "example") - matcher.should match_description("MyClass example") + matcher.should match_examples(["MyClass example"]) end end @@ -92,5 +75,12 @@ module Spec matcher.matches?(["no match1", "no match2"]).should == false end end + + describe ExampleMatcher, "called with nil example" do + it "does not puke" do + matcher = ExampleMatcher.new("Foo::Bar", nil) + matcher.matches?(["anything"]).should == false + end + end end end diff --git a/vendor/plugins/rspec/spec/spec/example/example_methods_spec.rb b/vendor/plugins/rspec/spec/spec/example/example_methods_spec.rb index dd33c57f0..9a6810952 100644 --- a/vendor/plugins/rspec/spec/spec/example/example_methods_spec.rb +++ b/vendor/plugins/rspec/spec/spec/example/example_methods_spec.rb @@ -1,126 +1,162 @@ -require File.dirname(__FILE__) + '/../../spec_helper' +require 'spec_helper' + +class Thing + attr_reader :arg + def initialize(arg=nil) + @arg = arg || :default + end + def ==(other) + @arg == other.arg + end + def eql?(other) + @arg == other.arg + end +end module Spec module Example - module ModuleThatIsReopened - end - - module ExampleMethods - include ModuleThatIsReopened - end + describe ExampleMethods do + module ModuleThatIsReopened; end - module ModuleThatIsReopened - def module_that_is_reopened_method + module Spec::Example::ExampleMethods + include ModuleThatIsReopened end - end - describe ExampleMethods do + module ModuleThatIsReopened + def module_that_is_reopened_method; end + end + describe "with an included module that is reopened" do - it "should have repoened methods" do + it "should have reopened methods" do method(:module_that_is_reopened_method).should_not be_nil end end - describe "lifecycle" do - before do - @original_rspec_options = $rspec_options + describe "#should" do + before(:each) do + @example_group = Class.new(ExampleGroupDouble) @options = ::Spec::Runner::Options.new(StringIO.new, StringIO.new) - $rspec_options = @options - @options.formatters << mock("formatter", :null_object => true) - @options.backtrace_tweaker = mock("backtrace_tweaker", :null_object => true) - @reporter = FakeReporter.new(@options) - @options.reporter = @reporter - - ExampleMethods.before_all_parts.should == [] - ExampleMethods.before_each_parts.should == [] - ExampleMethods.after_each_parts.should == [] - ExampleMethods.after_all_parts.should == [] - def ExampleMethods.count - @count ||= 0 - @count = @count + 1 - @count - end end - - after do - $rspec_options = @original_rspec_options - ExampleMethods.instance_variable_set("@before_all_parts", []) - ExampleMethods.instance_variable_set("@before_each_parts", []) - ExampleMethods.instance_variable_set("@after_each_parts", []) - ExampleMethods.instance_variable_set("@after_all_parts", []) - end - - it "should pass before and after callbacks to all ExampleGroup subclasses" do - ExampleMethods.before(:suite) do - ExampleMethods.count.should == 1 - end - - ExampleMethods.before(:all) do - ExampleMethods.count.should == 2 - end - - ExampleMethods.before(:each) do - ExampleMethods.count.should == 3 + + context "in an ExampleGroup with an implicit subject" do + it "delegates matcher to the implied subject" do + @example_group.describe(::Thing) + @example_group.example { should == ::Thing.new(:default) } + @example_group.example { should eql(::Thing.new(:default)) } + @example_group.run(@options).should be_true end - - ExampleMethods.after(:each) do - ExampleMethods.count.should == 4 - end - - ExampleMethods.after(:all) do - ExampleMethods.count.should == 5 - end - - ExampleMethods.after(:suite) do - ExampleMethods.count.should == 6 + end + + context "in an ExampleGroup using an explicit subject" do + it "delegates matcher to the declared subject" do + @example_group.describe(::Thing) + @example_group.subject { ::Thing.new(:other) } + @example_group.example { should == ::Thing.new(:other) } + @example_group.example { should eql(::Thing.new(:other)) } + @example_group.run(@options).should be_true end - - @example_group = Class.new(ExampleGroup) do - it "should use ExampleMethods callbacks" do + end + + context "in an ExampleGroup using 'self' as an explicit subject" do + it "delegates matcher to the ExampleGroup" do + @example_group.describe(::Thing) + @example_group.subject { self } + @example_group.example { should == self } + @example_group.example { should eql(self) } + @example_group.example do + self.instance_eval("def method_ok?; true end") + should be_method_ok end + @example_group.run(@options).should be_true end - @options.run_examples - ExampleMethods.count.should == 7 end + end - describe "run_with_description_capturing" do - before(:each) do - @example_group = Class.new(ExampleGroup) do end - @example = @example_group.new("foo", &(lambda { 2.should == 2 })) - @example.run_with_description_capturing - end + describe "#should_not" do + before(:each) do + @example_group = Class.new(ExampleGroupDouble) + @options = ::Spec::Runner::Options.new(StringIO.new, StringIO.new) + end - it "should provide the generated description" do - @example.instance_eval { @_matcher_description }.should == "should == 2" + context "in an ExampleGroup with an implicit subject" do + it "delegates matcher to the implied subject" do + @example_group.describe(::Thing) + @example_group.example { should_not == ::Thing.new(:other) } + @example_group.example { should_not eql(::Thing.new(:other)) } + @example_group.run(@options).should be_true end - - it "should clear the global generated_description" do - Spec::Matchers.generated_description.should == nil + end + + context "in an ExampleGroup using an explicit subject" do + it "delegates matcher to the declared subject" do + @example_group.describe(::Thing) + @example_group.subject { ::Thing.new(:other) } + @example_group.example { should_not == ::Thing.new(:default) } + @example_group.example { should_not eql(::Thing.new(:default)) } + @example_group.run(@options).should be_true end end - end - - describe "#implementation_backtrace" do - it "returns the backtrace of where the implementation was defined" do - example_group = Class.new(ExampleGroup) do - it "should use ExampleMethods callbacks" do + + context "in an ExampleGroup using 'self' as an explicit subject" do + it "delegates matcher to the ExampleGroup" do + @example_group.describe(::Thing) + @example_group.subject { self } + @example_group.example { should_not == ::Thing.new(:default) } + @example_group.example { should_not eql(::Thing.new(:default)) } + @example_group.example do + self.instance_eval("def method_ok?; false end") + should_not be_method_ok end + @example_group.run(@options).should be_true end - example = example_group.examples.first - example.implementation_backtrace.join("\n").should include("#{__FILE__}:#{__LINE__-4}") end end + end - describe "#__full_description" do - it "should return the full description of the ExampleGroup and Example" do - example_group = Class.new(ExampleGroup).describe("An ExampleGroup") do - it "should do something" do - end - end - example = example_group.examples.first - example.__full_description.should == "An ExampleGroup should do something" - end + describe "#options" do + it "should expose the options hash" do + example = ExampleGroupDouble.new ExampleProxy.new("name", :this => 'that') do; end + example.options[:this].should == 'that' + end + end + + describe "#set_instance_variables_from_hash" do + it "preserves the options" do + example = ExampleGroupDouble.new ExampleProxy.new("name", :this => 'that') do; end + example.set_instance_variables_from_hash({:@_options => {}}) + example.options[:this].should == 'that' + end + end + + describe "#description" do + it "returns the supplied description" do + example = ExampleGroupDouble.new ExampleProxy.new("name") do; end + example.description.should == "name" + end + it "returns the generated description if there is no description supplied" do + example = ExampleGroupDouble.new ExampleProxy.new do; end + Spec::Matchers.stub!(:generated_description).and_return('this message') + example.description.should == "this message" + end + it "warns if there is no supplied or generated description" do + example = ExampleGroupDouble.new ExampleProxy.new(nil, {}, "this backtrace") do; end + Spec::Matchers.stub!(:generated_description).and_return(nil) + Spec.should_receive(:warn).with("No description supplied for example declared on this backtrace") + example.description + end + end + + describe "#expect" do + it "aliases #should with #to on the proc" do + a = 3 + expect { a += 1 }.to change{a}.from(3).to(4) + end + + it "aliases #should_not with #to_not on the proc" do + a = 3 + expect { nil }.to_not change{a} end end + end -end
\ No newline at end of file +end diff --git a/vendor/plugins/rspec/spec/spec/example/example_runner_spec.rb b/vendor/plugins/rspec/spec/spec/example/example_runner_spec.rb deleted file mode 100644 index 1b5abdf0f..000000000 --- a/vendor/plugins/rspec/spec/spec/example/example_runner_spec.rb +++ /dev/null @@ -1,194 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' - -module Spec - module Example - # describe "Spec::Example::ExampleRunner", "#run", :shared => true do - # before(:each) do - # @options = ::Spec::Runner::Options.new(StringIO.new, StringIO.new) - # @reporter = ::Spec::Runner::Reporter.new(@options) - # @options.reporter = @reporter - # @example_group_class = Class.new(ExampleGroup) do - # plugin_mock_framework - # describe("Some Examples") - # end - # end - # - # def create_runner(example_definition) - # example = @example_group_class.new(example_definition) - # runner = ExampleGroup.new(@options, example) - # runner.stub!(:verify_mocks) - # runner.stub!(:teardown_mocks) - # runner - # end - # end - # - # describe ExampleRunner, "#run with blank passing example" do - # it_should_behave_like "Spec::Example::ExampleRunner#run" - # - # before do - # @e = @example_group_class.it("example") {} - # @runner = create_runner(@e) - # end - # - # it "should send reporter example_started" do - # @reporter.should_receive(:example_started).with(equal(@e)) - # @runner.run - # end - # - # it "should report its name for dry run" do - # @options.dry_run = true - # @reporter.should_receive(:example_finished).with(equal(@e), nil) - # @runner.run - # end - # - # it "should report success" do - # @reporter.should_receive(:example_finished).with(equal(@e), nil) - # @runner.run - # end - # end - # - # describe ExampleRunner, "#run with a failing example" do - # predicate_matchers[:is_a] = [:is_a?] - # it_should_behave_like "Spec::Example::ExampleRunner#run" - # - # before do - # @e = @example_group_class.it("example") do - # (2+2).should == 5 - # end - # @runner = create_runner(@e) - # end - # - # it "should report failure due to failure" do - # @reporter.should_receive(:example_finished).with( - # equal(@e), - # is_a(Spec::Expectations::ExpectationNotMetError) - # ) - # @runner.run - # end - # end - # - # describe ExampleRunner, "#run with a erroring example" do - # it_should_behave_like "Spec::Example::ExampleRunner#run" - # - # before do - # @error = error = NonStandardError.new("in body") - # @example_definition = @example_group_class.it("example") do - # raise(error) - # end - # @runner = create_runner(@example_definition) - # end - # - # it "should report failure due to error" do - # @reporter.should_receive(:example_finished).with( - # equal(@example_definition), - # @error - # ) - # @runner.run - # end - # - # it "should run after_each block" do - # @example_group_class.after(:each) do - # raise("in after_each") - # end - # @reporter.should_receive(:example_finished) do |example_definition, error| - # example_definition.should equal(@example_definition) - # error.message.should eql("in body") - # end - # @runner.run - # end - # end - # - # describe ExampleRunner, "#run where after_each fails" do - # it_should_behave_like "Spec::Example::ExampleRunner#run" - # - # before do - # @example_ran = example_ran = false - # @example_definition = @example_group_class.it("should not run") do - # example_ran = true - # end - # @runner = create_runner(@example_definition) - # @example_group_class.after(:each) { raise(NonStandardError.new("in after_each")) } - # end - # - # it "should report failure location when in after_each" do - # @reporter.should_receive(:example_finished) do |example_definition, error| - # example_definition.should equal(@example_definition) - # error.message.should eql("in after_each") - # end - # @runner.run - # end - # end - # - # describe ExampleRunner, "#run with use cases" do - # predicate_matchers[:is_a] = [:is_a?] - # it_should_behave_like "Spec::Example::ExampleRunner#run" - # - # it "should report NO NAME when told to use generated description with --dry-run" do - # @options.dry_run = true - # example_definition = @example_group_class.it() do - # 5.should == 5 - # end - # runner = create_runner(example_definition) - # - # @reporter.should_receive(:example_finished) do |example_definition, error| - # example_definition.description.should == "NO NAME (Because of --dry-run)" - # end - # runner.run - # end - # - # it "should report given name if present with --dry-run" do - # @options.dry_run = true - # example_definition = @example_group_class.it("example name") do - # 5.should == 5 - # end - # runner = create_runner(example_definition) - # - # @reporter.should_receive(:example_finished) do |example_definition, error| - # example_definition.description.should == "example name" - # end - # runner.run - # end - # - # it "should report NO NAME when told to use generated description with no expectations" do - # example_definition = @example_group_class.it() {} - # runner = create_runner(example_definition) - # @reporter.should_receive(:example_finished) do |example, error| - # example.description.should == "NO NAME (Because there were no expectations)" - # end - # runner.run - # end - # - # it "should report NO NAME when told to use generated description and matcher fails" do - # example_definition = @example_group_class.it() do - # 5.should "" # Has no matches? method.. - # end - # runner = create_runner(example_definition) - # - # @reporter.should_receive(:example_finished) do |example, error| - # example_definition.description.should == "NO NAME (Because of Error raised in matcher)" - # end - # runner.run - # end - # - # it "should report generated description when told to and it is available" do - # example_definition = @example_group_class.it() { - # 5.should == 5 - # } - # runner = create_runner(example_definition) - # - # @reporter.should_receive(:example_finished) do |example_definition, error| - # example_definition.description.should == "should == 5" - # end - # runner.run - # end - # - # it "should unregister description_generated callback (lest a memory leak should build up)" do - # example_definition = @example_group_class.it("something") - # runner = create_runner(example_definition) - # - # Spec::Matchers.should_receive(:example_finished) - # runner.run - # end - # end - end -end diff --git a/vendor/plugins/rspec/spec/spec/example/example_spec.rb b/vendor/plugins/rspec/spec/spec/example/example_spec.rb deleted file mode 100644 index c8125b447..000000000 --- a/vendor/plugins/rspec/spec/spec/example/example_spec.rb +++ /dev/null @@ -1,53 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper' - -module Spec - module Example - # describe Example do - # before(:each) do - # @example = Example.new "example" do - # foo - # end - # end - # - # it "should tell you its docstring" do - # @example.description.should == "example" - # end - # - # it "should execute its block in the context provided" do - # context = Class.new do - # def foo - # "foo" - # end - # end.new - # @example.run_in(context).should == "foo" - # end - # end - # - # describe Example, "#description" do - # it "should default to NO NAME when not passed anything when there are no matchers" do - # example = Example.new {} - # example.run_in(Object.new) - # example.description.should == "NO NAME" - # end - # - # it "should default to NO NAME description (Because of --dry-run) when passed nil and there are no matchers" do - # example = Example.new(nil) {} - # example.run_in(Object.new) - # example.description.should == "NO NAME" - # end - # - # it "should allow description to be overridden" do - # example = Example.new("Test description") - # example.description.should == "Test description" - # end - # - # it "should use description generated from matcher when there is no passed in description" do - # example = Example.new(nil) do - # 1.should == 1 - # end - # example.run_in(Object.new) - # example.description.should == "should == 1" - # end - # end - end -end diff --git a/vendor/plugins/rspec/spec/spec/example/nested_example_group_spec.rb b/vendor/plugins/rspec/spec/spec/example/nested_example_group_spec.rb index 559467d6d..83e4a9d7c 100644 --- a/vendor/plugins/rspec/spec/spec/example/nested_example_group_spec.rb +++ b/vendor/plugins/rspec/spec/spec/example/nested_example_group_spec.rb @@ -1,4 +1,4 @@ -require File.dirname(__FILE__) + '/../../spec_helper' +require 'spec_helper' module Spec module Example @@ -58,12 +58,12 @@ module Spec describe "Nested Example Groups" do describe "description options", :other_options => "other options" do - it "should have a spec_path" do - self.class.description_options[:spec_path].should match(/#{__FILE__}/) + it "includes :location" do + self.class.options[:location].should match(/#{__FILE__}/) end - it "should pass other options" do - self.class.description_options[:other_options].should == "other options" + it "includes any other options" do + self.class.options[:other_options].should == "other options" end end end diff --git a/vendor/plugins/rspec/spec/spec/example/pending_module_spec.rb b/vendor/plugins/rspec/spec/spec/example/pending_module_spec.rb index c3ab0126b..275abc7d6 100644 --- a/vendor/plugins/rspec/spec/spec/example/pending_module_spec.rb +++ b/vendor/plugins/rspec/spec/spec/example/pending_module_spec.rb @@ -2,29 +2,56 @@ module Spec module Example describe Pending do - it 'should raise an ExamplePendingError if no block is supplied' do - lambda { - include Pending - pending "TODO" - }.should raise_error(ExamplePendingError, /TODO/) + context "when no block is supplied" do + it "raises an ExamplePendingError if no block is supplied" do + lambda { + pending "TODO" + }.should raise_error(ExamplePendingError, /TODO/) + end end - it 'should raise an ExamplePendingError if a supplied block fails as expected' do - lambda { - include Pending - pending "TODO" do - raise "oops" - end - }.should raise_error(ExamplePendingError, /TODO/) + context "when the supplied block fails" do + it "raises an ExamplePendingError if a supplied block fails as expected" do + lambda { + pending "TODO" do + raise "oops" + end + }.should raise_error(ExamplePendingError, /TODO/) + end end - it 'should raise a PendingExampleFixedError if a supplied block starts working' do - lambda { - include Pending - pending "TODO" do - # success! - end - }.should raise_error(PendingExampleFixedError, /TODO/) + context "when the supplied block fails with a mock" do + it "raises an ExamplePendingError if a supplied block fails as expected with a mock" do + lambda { + pending "TODO" do + m = mock("thing") + m.should_receive(:foo) + m.rspec_verify + end + }.should raise_error(ExamplePendingError, /TODO/) + end + end + + context "when the supplied block passes" do + it "raises a PendingExampleFixedError" do + lambda { + pending "TODO" do + # success! + end + }.should raise_error(PendingExampleFixedError, /TODO/) + end + end + end + + describe ExamplePendingError do + it "should have the message provided" do + ExamplePendingError.new("a message").message.should == "a message" + end + end + + describe NotYetImplementedError do + it "should have the message 'Not Yet Implemented'" do + NotYetImplementedError.new.message.should == "Not Yet Implemented" end end end diff --git a/vendor/plugins/rspec/spec/spec/example/predicate_matcher_spec.rb b/vendor/plugins/rspec/spec/spec/example/predicate_matcher_spec.rb index 7c4638b4b..a01858502 100644 --- a/vendor/plugins/rspec/spec/spec/example/predicate_matcher_spec.rb +++ b/vendor/plugins/rspec/spec/spec/example/predicate_matcher_spec.rb @@ -1,4 +1,4 @@ -require File.dirname(__FILE__) + '/../../spec_helper' +require 'spec_helper' module Spec module Example @@ -9,12 +9,32 @@ module Spec end describe "predicate_matcher[method_on_object] = matcher_method" do - predicate_matchers[:swim] = :can_swim? + before(:each) do + Spec.stub!(:deprecate) + end + + it "is deprecated" do + Spec.should_receive(:deprecate) + group = ExampleGroupDouble.describe("foo") do + predicate_matchers[:swim] = :can_swim? + end + group.run(Spec::Runner::Options.new(StringIO.new, StringIO.new)) + end + it "should match matcher_method if method_on_object returns true" do - swim(100).matches?(Fish.new).should be_true + group = ExampleGroupDouble.describe(Fish) do + predicate_matchers[:swim] = :can_swim? + it { should swim(100) } + end + group.run(Spec::Runner::Options.new(StringIO.new, StringIO.new)) end + it "should not match matcher_method if method_on_object returns false" do - swim(10000).matches?(Fish.new).should be_false + group = ExampleGroupDouble.describe(Fish) do + predicate_matchers[:swim] = :can_swim? + it { should_not swim(1000) } + end + group.run(Spec::Runner::Options.new(StringIO.new, StringIO.new)) end end end diff --git a/vendor/plugins/rspec/spec/spec/example/shared_example_group_spec.rb b/vendor/plugins/rspec/spec/spec/example/shared_example_group_spec.rb index 803536ab5..bbebbf15c 100644 --- a/vendor/plugins/rspec/spec/spec/example/shared_example_group_spec.rb +++ b/vendor/plugins/rspec/spec/spec/example/shared_example_group_spec.rb @@ -1,264 +1,256 @@ -require File.dirname(__FILE__) + '/../../spec_helper' +require 'spec_helper' module Spec module Example describe ExampleGroup, "with :shared => true" do - it_should_behave_like "sandboxed rspec_options" - attr_reader :formatter, :example_group - before(:each) do - @formatter = Spec::Mocks::Mock.new("formatter", :null_object => true) - options.formatters << formatter - @example_group = Class.new(ExampleGroup).describe("example_group") - class << example_group - public :include + with_sandboxed_options do + attr_reader :formatter, :example_group + before(:each) do + @formatter = Spec::Mocks::Mock.new("formatter", :null_object => true) + options.formatters << formatter + @example_group = Class.new(ExampleGroupDouble).describe("example_group") + class << example_group + public :include + end end - end - - after(:each) do - @formatter.rspec_verify - @example_group = nil - $shared_example_groups.clear unless $shared_example_groups.nil? - end - - def make_shared_example_group(name, opts=nil, &block) - example_group = SharedExampleGroup.new(name, :shared => true, &block) - SharedExampleGroup.add_shared_example_group(example_group) - example_group - end - - def non_shared_example_group() - @non_shared_example_group ||= Class.new(ExampleGroup).describe("example_group") - end - - it "should accept an optional options hash" do - lambda { Class.new(ExampleGroup).describe("context") }.should_not raise_error(Exception) - lambda { Class.new(ExampleGroup).describe("context", :shared => true) }.should_not raise_error(Exception) - end - it "should return all shared example_groups" do - b1 = make_shared_example_group("b1", :shared => true) {} - b2 = make_shared_example_group("b2", :shared => true) {} + after(:each) do + @formatter.rspec_verify + @example_group = nil + Spec::Example::SharedExampleGroup.clear + end + + describe "#register" do + it "creates a new shared example group with the submitted args" do + block = lambda {|a|} + group = SharedExampleGroup.new("shared group") do end + Spec::Example::SharedExampleGroup.should_receive(:new).with("share me", &block).and_return(group) + Spec::Example::SharedExampleGroup.register("share me", &block) + end - b1.should_not be(nil) - b2.should_not be(nil) + it "registers the shared example group" do + lambda do + Spec::Example::SharedExampleGroup.register "share me" do end + end.should change {Spec::Example::SharedExampleGroup.count}.by(1) + end + end - SharedExampleGroup.find_shared_example_group("b1").should equal(b1) - SharedExampleGroup.find_shared_example_group("b2").should equal(b2) - end + it "complains when adding a second shared example_group with the same description" do + describe "shared example_group", :shared => true do + end + lambda do + describe "shared example_group", :shared => true do + end + end.should raise_error(ArgumentError) + end + + it "does NOT add the same group twice" do + lambda do + 2.times do + describe "shared example_group which gets loaded twice", :shared => true do + end + end + end.should change {Spec::Example::SharedExampleGroup.count}.by(1) + end - it "should register as shared example_group" do - example_group = make_shared_example_group("example_group") {} - SharedExampleGroup.shared_example_groups.should include(example_group) - end + it "does NOT complain when adding the same shared example_group again (i.e. file gets reloaded)" do + lambda do + 2.times do + describe "shared example_group which gets loaded twice", :shared => true do + end + end + end.should_not raise_error(ArgumentError) + end - it "should not be shared when not configured as shared" do - example_group = non_shared_example_group - SharedExampleGroup.shared_example_groups.should_not include(example_group) - end + it "does NOT complain when adding the same shared example_group in same file with different absolute path" do + SharedExampleGroup.register( + "shared example_group", + :shared => true, + :location => "/my/spec/a/../shared.rb" + ) + SharedExampleGroup.register( + "shared example_group", + :shared => true, + :location => "/my/spec/b/../shared.rb" + ) + end - it "should complain when adding a second shared example_group with the same description" do - describe "shared example_group", :shared => true do + it "complains when adding a different shared example_group with the same name in a different file with the same basename" do + SharedExampleGroup.register( + "shared example_group", + :shared => true, + :location => "/my/spec/a/shared.rb" + ) + lambda do + SharedExampleGroup.register( + "shared example_group", + :shared => true, + :location => "/my/spec/b/shared.rb" + ) + end.should raise_error(ArgumentError, /already exists/) end - lambda do - describe "shared example_group", :shared => true do + + it "adds examples to current example_group using it_should_behave_like" do + shared_example_group = SharedExampleGroup.register("shared example_group") do + it("shared example") {} + it("shared example 2") {} end - end.should raise_error(ArgumentError) - end - it "should NOT complain when adding the same shared example_group instance again" do - shared_example_group = Class.new(ExampleGroup).describe("shared example_group", :shared => true) - SharedExampleGroup.add_shared_example_group(shared_example_group) - SharedExampleGroup.add_shared_example_group(shared_example_group) - end + example_group.it("example") {} + example_group.number_of_examples.should == 1 + example_group.it_should_behave_like("shared example_group") + example_group.number_of_examples.should == 3 + end - it "should NOT complain when adding the same shared example_group again (i.e. file gets reloaded)" do - lambda do - 2.times do - describe "shared example_group which gets loaded twice", :shared => true do - end + it "adds examples to from two shared groups" do + shared_example_group_1 = SharedExampleGroup.register("shared example_group 1") do + it("shared example 1") {} end - end.should_not raise_error(ArgumentError) - end - - it "should NOT complain when adding the same shared example_group in same file with different absolute path" do - shared_example_group_1 = Class.new(ExampleGroup).describe( - "shared example_group", - :shared => true, - :spec_path => "/my/spec/a/../shared.rb" - ) - shared_example_group_2 = Class.new(ExampleGroup).describe( - "shared example_group", - :shared => true, - :spec_path => "/my/spec/b/../shared.rb" - ) - - SharedExampleGroup.add_shared_example_group(shared_example_group_1) - SharedExampleGroup.add_shared_example_group(shared_example_group_2) - end - it "should complain when adding a different shared example_group with the same name in a different file with the same basename" do - shared_example_group_1 = Class.new(ExampleGroup).describe( - "shared example_group", - :shared => true, - :spec_path => "/my/spec/a/shared.rb" - ) - shared_example_group_2 = Class.new(ExampleGroup).describe( - "shared example_group", - :shared => true, - :spec_path => "/my/spec/b/shared.rb" - ) - - SharedExampleGroup.add_shared_example_group(shared_example_group_1) - lambda do - SharedExampleGroup.add_shared_example_group(shared_example_group_2) - end.should raise_error(ArgumentError, /already exists/) - end + shared_example_group_1 = SharedExampleGroup.register("shared example_group 2") do + it("shared example 2") {} + end - it "should add examples to current example_group using it_should_behave_like" do - shared_example_group = make_shared_example_group("shared example_group") do - it("shared example") {} - it("shared example 2") {} + example_group.it("example") {} + example_group.number_of_examples.should == 1 + example_group.it_should_behave_like("shared example_group 1", "shared example_group 2") + example_group.number_of_examples.should == 3 end - example_group.it("example") {} - example_group.number_of_examples.should == 1 - example_group.it_should_behave_like("shared example_group") - example_group.number_of_examples.should == 3 - end - - it "should add examples to current example_group using include" do - shared_example_group = describe "all things", :shared => true do - it "should do stuff" do end - end + it "adds examples to current example_group using include" do + shared_example_group = describe "all things", :shared => true do + it "should do stuff" do end + end - example_group = describe "one thing" do - include shared_example_group - end + example_group = describe "one thing" do + include shared_example_group + end - example_group.number_of_examples.should == 1 - end - - it "should add examples to current example_group using it_should_behave_like with a module" do - AllThings = describe "all things", :shared => true do - it "should do stuff" do end + example_group.number_of_examples.should == 1 end + + it "adds examples to current example_group using it_should_behave_like with a module" do + ::AllThings = describe "all things", :shared => true do + it "should do stuff" do end + end - example_group = describe "one thing" do - it_should_behave_like AllThings - end + example_group = describe "one thing" do + it_should_behave_like ::AllThings + end - example_group.number_of_examples.should == 1 - end - - it "should run shared examples" do - shared_example_ran = false - shared_example_group = make_shared_example_group("shared example_group") do - it("shared example") { shared_example_ran = true } + example_group.number_of_examples.should == 1 end - example_ran = false + it "runs shared examples" do + shared_example_ran = false + shared_example_group = SharedExampleGroup.register("shared example_group") do + it("shared example") { shared_example_ran = true } + end - example_group.it_should_behave_like("shared example_group") - example_group.it("example") {example_ran = true} - example_group.run - example_ran.should be_true - shared_example_ran.should be_true - end + example_ran = false - it "should run setup and teardown from shared example_group" do - shared_setup_ran = false - shared_teardown_ran = false - shared_example_group = make_shared_example_group("shared example_group") do - before { shared_setup_ran = true } - after { shared_teardown_ran = true } - it("shared example") { shared_example_ran = true } + example_group.it_should_behave_like("shared example_group") + example_group.it("example") {example_ran = true} + example_group.run(options) + example_ran.should be_true + shared_example_ran.should be_true end - example_ran = false + it "runs before(:each) and after(:each) from shared example_group" do + shared_setup_ran = false + shared_teardown_ran = false + shared_example_group = SharedExampleGroup.register("shared example_group") do + before(:each) { shared_setup_ran = true } + after(:each) { shared_teardown_ran = true } + it("shared example") { shared_example_ran = true } + end - example_group.it_should_behave_like("shared example_group") - example_group.it("example") {example_ran = true} - example_group.run - example_ran.should be_true - shared_setup_ran.should be_true - shared_teardown_ran.should be_true - end + example_ran = false - it "should run before(:all) and after(:all) only once from shared example_group" do - shared_before_all_run_count = 0 - shared_after_all_run_count = 0 - shared_example_group = make_shared_example_group("shared example_group") do - before(:all) { shared_before_all_run_count += 1} - after(:all) { shared_after_all_run_count += 1} - it("shared example") { shared_example_ran = true } + example_group.it_should_behave_like("shared example_group") + example_group.it("example") {example_ran = true} + example_group.run(options) + example_ran.should be_true + shared_setup_ran.should be_true + shared_teardown_ran.should be_true end - example_ran = false - - example_group.it_should_behave_like("shared example_group") - example_group.it("example") {example_ran = true} - example_group.run - example_ran.should be_true - shared_before_all_run_count.should == 1 - shared_after_all_run_count.should == 1 - end + it "should run before(:all) and after(:all) only once from shared example_group" do + shared_before_all_run_count = 0 + shared_after_all_run_count = 0 + shared_example_group = SharedExampleGroup.register("shared example_group") do + before(:all) { shared_before_all_run_count += 1} + after(:all) { shared_after_all_run_count += 1} + it("shared example") { shared_example_ran = true } + end - it "should include modules, included into shared example_group, into current example_group" do - @formatter.should_receive(:add_example_group).with(any_args) + example_ran = false - shared_example_group = make_shared_example_group("shared example_group") do - it("shared example") { shared_example_ran = true } + example_group.it_should_behave_like("shared example_group") + example_group.it("example") {example_ran = true} + example_group.run(options) + example_ran.should be_true + shared_before_all_run_count.should == 1 + shared_after_all_run_count.should == 1 end - mod1_method_called = false - mod1 = Module.new do - define_method :mod1_method do - mod1_method_called = true + it "should include modules, included into shared example_group, into current example_group" do + @formatter.should_receive(:add_example_group).with(any_args) + + shared_example_group = SharedExampleGroup.register("shared example_group") do + it("shared example") { shared_example_ran = true } end - end - mod2_method_called = false - mod2 = Module.new do - define_method :mod2_method do - mod2_method_called = true + mod1_method_called = false + mod1 = Module.new do + define_method :mod1_method do + mod1_method_called = true + end + end + + mod2_method_called = false + mod2 = Module.new do + define_method :mod2_method do + mod2_method_called = true + end end - end - shared_example_group.include mod2 + shared_example_group.__send__ :include, mod2 - example_group.it_should_behave_like("shared example_group") - example_group.include mod1 + example_group.it_should_behave_like("shared example_group") + example_group.include mod1 - example_group.it("test") do - mod1_method - mod2_method + example_group.it("test") do + mod1_method + mod2_method + end + example_group.run(options) + mod1_method_called.should be_true + mod2_method_called.should be_true end - example_group.run - mod1_method_called.should be_true - mod2_method_called.should be_true - end - it "should make methods defined in the shared example_group available in consuming example_group" do - shared_example_group = make_shared_example_group("shared example_group xyz") do - def a_shared_helper_method - "this got defined in a shared example_group" + it "should make methods defined in the shared example_group available in consuming example_group" do + shared_example_group = SharedExampleGroup.register("shared example_group xyz") do + def a_shared_helper_method + "this got defined in a shared example_group" + end end + example_group.it_should_behave_like("shared example_group xyz") + success = false + example_group.it("should access a_shared_helper_method") do + a_shared_helper_method + success = true + end + example_group.run(options) + success.should be_true end - example_group.it_should_behave_like("shared example_group xyz") - success = false - example_group.it("should access a_shared_helper_method") do - a_shared_helper_method - success = true - end - example_group.run - success.should be_true - end - it "should raise when named shared example_group can not be found" do - lambda { - example_group.it_should_behave_like("non-existent shared example group") - violated - }.should raise_error("Shared Example Group 'non-existent shared example group' can not be found") + it "should raise when named shared example_group can not be found" do + lambda { + example_group.it_should_behave_like("non-existent shared example group") + violated + }.should raise_error("Shared Example Group 'non-existent shared example group' can not be found") + end end end end diff --git a/vendor/plugins/rspec/spec/spec/example/subclassing_example_group_spec.rb b/vendor/plugins/rspec/spec/spec/example/subclassing_example_group_spec.rb index 888f2ceb3..969014a73 100644 --- a/vendor/plugins/rspec/spec/spec/example/subclassing_example_group_spec.rb +++ b/vendor/plugins/rspec/spec/spec/example/subclassing_example_group_spec.rb @@ -1,4 +1,4 @@ -require File.dirname(__FILE__) + '/../../spec_helper' +require 'spec_helper' module Spec module Example diff --git a/vendor/plugins/rspec/spec/spec/expectations/differs/default_spec.rb b/vendor/plugins/rspec/spec/spec/expectations/differs/default_spec.rb index ba76cbd47..3bc3c45ab 100644 --- a/vendor/plugins/rspec/spec/spec/expectations/differs/default_spec.rb +++ b/vendor/plugins/rspec/spec/spec/expectations/differs/default_spec.rb @@ -1,4 +1,4 @@ -require File.dirname(__FILE__) + '/../../../spec_helper.rb' +require 'spec_helper' module Spec module Fixtures @@ -73,6 +73,73 @@ EOD diff = @differ.diff_as_object(expected,actual) diff.should == expected_diff end + + it "should output a friendly message if comparing simple hashes" do + expected = { "foo" => "bar" } + actual = { "foo" => "baz" } + + expected_diff = <<'EOD' + +Expected the key "foo" to be "bar", but was "baz" + +EOD + + + diff = @differ.diff_as_hash(actual, expected) + diff.should == expected_diff + end + + + it "should output a friendly message if comparing simple hashes that contain different keys" do + expected = { "bar" => "foo" } + actual = { "foo" => "baz" } + + expected_diff = <<'EOD' + +Expected hash contains keys that target hash does not: ["bar"] +Target hash contains keys that expected hash does not: ["foo"] +Expected the key "bar" to be "foo", but was nil + +EOD + + + diff = @differ.diff_as_hash(actual, expected) + diff.should == expected_diff + end + + it "should output diff message if the hash is complex (containing Array or Hash)" do + expected = { "foo" => "bar", "fizz" => [1, 2, 3] } + actual = { "foo" => "baz", "fizz" => [1, 2] } + + # UGH - 1.8.7 seems to order hash keys differently than the others + if RUBY_VERSION =~ /^1.8.7/ + expected_diff = <<'EOD' + +Expected the key "fizz" to be [1, 2, 3], but was [1, 2] +Expected the key "foo" to be "bar", but was "baz" + + +@@ -1,2 +1,2 @@ +-{"fizz"=>[1, 2, 3], "foo"=>"bar"} ++{"fizz"=>[1, 2], "foo"=>"baz"} +EOD + else + expected_diff = <<'EOD' + +Expected the key "fizz" to be [1, 2, 3], but was [1, 2] +Expected the key "foo" to be "bar", but was "baz" + + +@@ -1,2 +1,2 @@ +-{"foo"=>"bar", "fizz"=>[1, 2, 3]} ++{"foo"=>"baz", "fizz"=>[1, 2]} +EOD + end + + diff = @differ.diff_as_hash(actual, expected) + diff.should == expected_diff + end + it "should output unified diff message of two objects" do expected = Spec::Fixtures::Animal.new "bob", "giraffe" diff --git a/vendor/plugins/rspec/spec/spec/expectations/extensions/object_spec.rb b/vendor/plugins/rspec/spec/spec/expectations/extensions/object_spec.rb deleted file mode 100644 index 0d9335bdb..000000000 --- a/vendor/plugins/rspec/spec/spec/expectations/extensions/object_spec.rb +++ /dev/null @@ -1,107 +0,0 @@ -require File.dirname(__FILE__) + '/../../../spec_helper.rb' - -describe Object, "#should" do - before(:each) do - @target = "target" - @matcher = mock("matcher") - @matcher.stub!(:matches?).and_return(true) - @matcher.stub!(:failure_message) - end - - it "should accept and interact with a matcher" do - @matcher.should_receive(:matches?).with(@target).and_return(true) - @target.should @matcher - end - - it "should ask for a failure_message when matches? returns false" do - @matcher.should_receive(:matches?).with(@target).and_return(false) - @matcher.should_receive(:failure_message).and_return("the failure message") - lambda { - @target.should @matcher - }.should fail_with("the failure message") - end - - it "should raise error if it receives false directly" do - lambda { - @target.should false - }.should raise_error(Spec::Expectations::InvalidMatcherError) - end - - it "should raise error if it receives false (evaluated)" do - lambda { - @target.should eql?("foo") - }.should raise_error(Spec::Expectations::InvalidMatcherError) - end - - it "should raise error if it receives true" do - lambda { - @target.should true - }.should raise_error(Spec::Expectations::InvalidMatcherError) - end - - it "should raise error if it receives nil" do - lambda { - @target.should nil - }.should raise_error(Spec::Expectations::InvalidMatcherError) - end - - it "should raise error if it receives no argument and it is not used as a left side of an operator" do - pending "Is it even possible to catch this?" - lambda { - @target.should - }.should raise_error(Spec::Expectations::InvalidMatcherError) - end -end - -describe Object, "#should_not" do - before(:each) do - @target = "target" - @matcher = mock("matcher") - end - - it "should accept and interact with a matcher" do - @matcher.should_receive(:matches?).with(@target).and_return(false) - @matcher.stub!(:negative_failure_message) - - @target.should_not @matcher - end - - it "should ask for a negative_failure_message when matches? returns true" do - @matcher.should_receive(:matches?).with(@target).and_return(true) - @matcher.should_receive(:negative_failure_message).and_return("the negative failure message") - lambda { - @target.should_not @matcher - }.should fail_with("the negative failure message") - end - - it "should raise error if it receives false directly" do - lambda { - @target.should_not false - }.should raise_error(Spec::Expectations::InvalidMatcherError) - end - - it "should raise error if it receives false (evaluated)" do - lambda { - @target.should_not eql?("foo") - }.should raise_error(Spec::Expectations::InvalidMatcherError) - end - - it "should raise error if it receives true" do - lambda { - @target.should_not true - }.should raise_error(Spec::Expectations::InvalidMatcherError) - end - - it "should raise error if it receives nil" do - lambda { - @target.should_not nil - }.should raise_error(Spec::Expectations::InvalidMatcherError) - end - - it "should raise error if it receives no argument and it is not used as a left side of an operator" do - pending "Is it even possible to catch this?" - lambda { - @target.should_not - }.should raise_error(Spec::Expectations::InvalidMatcherError) - end -end diff --git a/vendor/plugins/rspec/spec/spec/expectations/fail_with_spec.rb b/vendor/plugins/rspec/spec/spec/expectations/fail_with_spec.rb index 4c369ce3a..639b7f950 100644 --- a/vendor/plugins/rspec/spec/spec/expectations/fail_with_spec.rb +++ b/vendor/plugins/rspec/spec/spec/expectations/fail_with_spec.rb @@ -1,4 +1,4 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' +require 'spec_helper' describe Spec::Expectations, "#fail_with with no diff" do before(:each) do @@ -12,17 +12,24 @@ describe Spec::Expectations, "#fail_with with no diff" do }.should fail_with("the message") end - it "should handle an Array" do - lambda { - Spec::Expectations.fail_with ["the message","expected","actual"] - }.should fail_with("the message") - end - after(:each) do Spec::Expectations.differ = @old_differ end end +describe Spec::Expectations, "#fail_with with Array" do + before(:each) do + Spec.stub!(:warn) + end + + it "is deprecated" do + Spec.should_receive(:warn) + lambda { + Spec::Expectations.fail_with ["message", "expected", "actual"] + }.should raise_error + end +end + describe Spec::Expectations, "#fail_with with diff" do before(:each) do @old_differ = Spec::Expectations.differ @@ -40,31 +47,49 @@ describe Spec::Expectations, "#fail_with with diff" do @differ.should_receive(:diff_as_string).and_return("diff") lambda { Spec::Expectations.fail_with "the message", "expected", "actual" - }.should fail_with("the message\nDiff:diff") + }.should fail_with("the message\n\n Diff:diff") end it "should call differ if expected/actual are not strings" do @differ.should_receive(:diff_as_object).and_return("diff") lambda { Spec::Expectations.fail_with "the message", :expected, :actual - }.should fail_with("the message\nDiff:diff") + }.should fail_with("the message\n\n Diff:diff") + end + + it "should call differ if expected/actual are both hashes" do + @differ.should_receive(:diff_as_hash).and_return("diff") + lambda { + Spec::Expectations.fail_with "the message", {:a => :b}, {:a => 'b'} + }.should fail_with("the message\n\n Diff:diff") end it "should not call differ if expected or actual are procs" do @differ.should_not_receive(:diff_as_string) @differ.should_not_receive(:diff_as_object) + @differ.should_not_receive(:diff_as_hash) lambda { Spec::Expectations.fail_with "the message", lambda {}, lambda {} }.should fail_with("the message") end - - it "should call differ if expected/actual are presented in an Array with message" do - @differ.should_receive(:diff_as_string).with("actual","expected").and_return("diff") + + after(:each) do + Spec::Expectations.differ = @old_differ + end +end + +describe Spec::Expectations, "#fail_with with a nil message" do + before(:each) do + @old_differ = Spec::Expectations.differ + Spec::Expectations.differ = nil + end + + it "should handle just a message" do lambda { - Spec::Expectations.fail_with(["the message", "expected", "actual"]) - }.should fail_with(/the message\nDiff:diff/) + Spec::Expectations.fail_with nil + }.should raise_error(ArgumentError, /Failure message is nil\. Does your matcher define the appropriate failure_message_for_\* method to return a string\?/) end - + after(:each) do Spec::Expectations.differ = @old_differ end diff --git a/vendor/plugins/rspec/spec/spec/extensions/main_spec.rb b/vendor/plugins/rspec/spec/spec/extensions/main_spec.rb deleted file mode 100644 index aabb616e9..000000000 --- a/vendor/plugins/rspec/spec/spec/extensions/main_spec.rb +++ /dev/null @@ -1,76 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' - -module Spec - module Extensions - describe Main do - it_should_behave_like "sandboxed rspec_options" - before(:each) do - @main = Class.new do; include Main; end - end - - after(:each) do - $rspec_story_steps = @original_rspec_story_steps - end - - it "should create an Options object" do - @main.send(:rspec_options).should be_instance_of(Spec::Runner::Options) - @main.send(:rspec_options).should === $rspec_options - end - - specify {@main.should respond_to(:describe)} - specify {@main.should respond_to(:context)} - - it "should raise when no block given to describe" do - lambda { @main.describe "foo" }.should raise_error(ArgumentError) - end - - it "should raise when no description given to describe" do - lambda { @main.describe do; end }.should raise_error(ArgumentError) - end - - it "should registered ExampleGroups by default" do - example_group = @main.describe("The ExampleGroup") do end - rspec_options.example_groups.should include(example_group) - end - - it "should not run unregistered ExampleGroups" do - example_group = @main.describe("The ExampleGroup") do - unregister - end - - rspec_options.example_groups.should_not include(example_group) - end - - it "should create a shared ExampleGroup with share_examples_for" do - group = @main.share_examples_for "all things" do end - group.should be_an_instance_of(Spec::Example::SharedExampleGroup) - end - - describe "#share_as" do - before(:each) do - $share_as_examples_example_module_number ||= 1 - $share_as_examples_example_module_number += 1 - t = Time.new.to_i - @group_name = "Group#{$share_as_examples_example_module_number}" - end - - it "should create a shared ExampleGroup" do - group = @main.share_as @group_name do end - group.should be_an_instance_of(Spec::Example::SharedExampleGroup) - end - - it "should create a constant that points to a Module" do - group = @main.share_as @group_name do end - Object.const_get(@group_name).should equal(group) - end - - it "should bark if you pass it something not-constantizable" do - lambda do - @group = @main.share_as "Non Constant" do end - end.should raise_error(NameError, /The first argument to share_as must be a legal name for a constant/) - end - - end - end - end -end
\ No newline at end of file diff --git a/vendor/plugins/rspec/spec/spec/interop/test/unit/resources/spec_that_fails.rb b/vendor/plugins/rspec/spec/spec/interop/test/unit/resources/spec_that_fails.rb index d6f5564bf..b2c484109 100644 --- a/vendor/plugins/rspec/spec/spec/interop/test/unit/resources/spec_that_fails.rb +++ b/vendor/plugins/rspec/spec/spec/interop/test/unit/resources/spec_that_fails.rb @@ -1,7 +1,7 @@ rspec_lib = File.dirname(__FILE__) + "/../../../../../../lib" $:.unshift rspec_lib unless $:.include?(rspec_lib) -require 'test/unit' -require 'spec' +require 'spec/autorun' +require 'spec/test/unit' describe "example group with failures" do it "should fail" do diff --git a/vendor/plugins/rspec/spec/spec/interop/test/unit/resources/spec_that_passes.rb b/vendor/plugins/rspec/spec/spec/interop/test/unit/resources/spec_that_passes.rb index ccd2488bc..4203af3a5 100644 --- a/vendor/plugins/rspec/spec/spec/interop/test/unit/resources/spec_that_passes.rb +++ b/vendor/plugins/rspec/spec/spec/interop/test/unit/resources/spec_that_passes.rb @@ -1,7 +1,7 @@ rspec_lib = File.dirname(__FILE__) + "/../../../../../../lib" $:.unshift rspec_lib unless $:.include?(rspec_lib) -require 'test/unit' -require 'spec' +require 'spec/autorun' +require 'spec/test/unit' describe "example group with passing examples" do it "should pass" do diff --git a/vendor/plugins/rspec/spec/spec/interop/test/unit/resources/spec_with_errors.rb b/vendor/plugins/rspec/spec/spec/interop/test/unit/resources/spec_with_errors.rb index 71427dbaa..a18ce72f7 100644 --- a/vendor/plugins/rspec/spec/spec/interop/test/unit/resources/spec_with_errors.rb +++ b/vendor/plugins/rspec/spec/spec/interop/test/unit/resources/spec_with_errors.rb @@ -1,7 +1,7 @@ rspec_lib = File.dirname(__FILE__) + "/../../../../../../lib" $:.unshift rspec_lib unless $:.include?(rspec_lib) -require 'test/unit' -require 'spec' +require 'spec/autorun' +require 'spec/test/unit' describe "example group with errors" do it "should raise errors" do diff --git a/vendor/plugins/rspec/spec/spec/interop/test/unit/resources/test_case_that_fails.rb b/vendor/plugins/rspec/spec/spec/interop/test/unit/resources/test_case_that_fails.rb index 3fb6515a8..0a977cb15 100644 --- a/vendor/plugins/rspec/spec/spec/interop/test/unit/resources/test_case_that_fails.rb +++ b/vendor/plugins/rspec/spec/spec/interop/test/unit/resources/test_case_that_fails.rb @@ -1,7 +1,7 @@ rspec_lib = File.dirname(__FILE__) + "/../../../../../../lib" $:.unshift rspec_lib unless $:.include?(rspec_lib) -require 'test/unit' -require 'spec' +require 'spec/autorun' +require 'spec/test/unit' class TestCaseThatFails < Test::Unit::TestCase def test_that_fails diff --git a/vendor/plugins/rspec/spec/spec/interop/test/unit/resources/test_case_that_passes.rb b/vendor/plugins/rspec/spec/spec/interop/test/unit/resources/test_case_that_passes.rb index 69239c0b5..078a5f778 100644 --- a/vendor/plugins/rspec/spec/spec/interop/test/unit/resources/test_case_that_passes.rb +++ b/vendor/plugins/rspec/spec/spec/interop/test/unit/resources/test_case_that_passes.rb @@ -1,7 +1,7 @@ rspec_lib = File.dirname(__FILE__) + "/../../../../../../lib" $:.unshift rspec_lib unless $:.include?(rspec_lib) -require 'test/unit' -require 'spec' +require 'spec/autorun' +require 'spec/test/unit' class TestCaseThatPasses < Test::Unit::TestCase def test_that_passes diff --git a/vendor/plugins/rspec/spec/spec/interop/test/unit/resources/test_case_with_errors.rb b/vendor/plugins/rspec/spec/spec/interop/test/unit/resources/test_case_with_errors.rb index 35dcb6b2e..dc5f52e47 100644 --- a/vendor/plugins/rspec/spec/spec/interop/test/unit/resources/test_case_with_errors.rb +++ b/vendor/plugins/rspec/spec/spec/interop/test/unit/resources/test_case_with_errors.rb @@ -1,7 +1,7 @@ rspec_lib = File.dirname(__FILE__) + "/../../../../../../lib" $:.unshift rspec_lib unless $:.include?(rspec_lib) -require 'test/unit' -require 'spec' +require 'spec/autorun' +require 'spec/test/unit' class TestCaseWithErrors < Test::Unit::TestCase def test_with_error diff --git a/vendor/plugins/rspec/spec/spec/interop/test/unit/resources/testsuite_adapter_spec_with_test_unit.rb b/vendor/plugins/rspec/spec/spec/interop/test/unit/resources/testsuite_adapter_spec_with_test_unit.rb index 0c2167a99..5182b8203 100644 --- a/vendor/plugins/rspec/spec/spec/interop/test/unit/resources/testsuite_adapter_spec_with_test_unit.rb +++ b/vendor/plugins/rspec/spec/spec/interop/test/unit/resources/testsuite_adapter_spec_with_test_unit.rb @@ -1,7 +1,7 @@ rspec_lib = File.dirname(__FILE__) + "/../../../../../../lib" $:.unshift rspec_lib unless $:.include?(rspec_lib) -require "test/unit" -require "spec" +require 'spec/autorun' +require 'spec/test/unit' module Test module Unit diff --git a/vendor/plugins/rspec/spec/spec/interop/test/unit/spec_spec.rb b/vendor/plugins/rspec/spec/spec/interop/test/unit/spec_spec.rb index 8a1e1300c..83ff52264 100644 --- a/vendor/plugins/rspec/spec/spec/interop/test/unit/spec_spec.rb +++ b/vendor/plugins/rspec/spec/spec/interop/test/unit/spec_spec.rb @@ -1,45 +1,48 @@ -require File.dirname(__FILE__) + '/test_unit_spec_helper' +require 'spec/interop/test/unit/test_unit_spec_helper' describe "ExampleGroup with test/unit/interop" do include TestUnitSpecHelper - - before(:each) do - @dir = File.dirname(__FILE__) + "/resources" - end - + describe "with passing examples" do it "should output 0 failures" do - output = ruby("#{@dir}/spec_that_passes.rb") + output = ruby("#{resources}/spec_that_passes.rb") output.should include("1 example, 0 failures") end it "should return an exit code of 0" do - ruby("#{@dir}/spec_that_passes.rb") + ruby("#{resources}/spec_that_passes.rb") $?.should == 0 end end describe "with failing examples" do it "should output 1 failure" do - output = ruby("#{@dir}/spec_that_fails.rb") + output = ruby("#{resources}/spec_that_fails.rb") output.should include("1 example, 1 failure") end it "should return an exit code of 256" do - ruby("#{@dir}/spec_that_fails.rb") + ruby("#{resources}/spec_that_fails.rb") $?.should == 256 end end describe "with example that raises an error" do it "should output 1 failure" do - output = ruby("#{@dir}/spec_with_errors.rb") + output = ruby("#{resources}/spec_with_errors.rb") output.should include("1 example, 1 failure") end it "should return an exit code of 256" do - ruby("#{@dir}/spec_with_errors.rb") + ruby("#{resources}/spec_with_errors.rb") $?.should == 256 end end + + describe "options hash" do + it "should be exposed" do + output = ruby("#{resources}/spec_with_options_hash.rb") + output.should include("1 example, 0 failures") + end + end end
\ No newline at end of file diff --git a/vendor/plugins/rspec/spec/spec/interop/test/unit/test_unit_spec_helper.rb b/vendor/plugins/rspec/spec/spec/interop/test/unit/test_unit_spec_helper.rb index 04d5d2713..1f6c223eb 100644 --- a/vendor/plugins/rspec/spec/spec/interop/test/unit/test_unit_spec_helper.rb +++ b/vendor/plugins/rspec/spec/spec/interop/test/unit/test_unit_spec_helper.rb @@ -1,8 +1,12 @@ -require File.dirname(__FILE__) + '/../../../../spec_helper' -require File.dirname(__FILE__) + '/../../../../ruby_forker' +require 'spec_helper' +require 'ruby_forker' module TestUnitSpecHelper include RubyForker + + def resources + File.dirname(__FILE__) + "/resources" + end def run_script(file_name) output = ruby(file_name) diff --git a/vendor/plugins/rspec/spec/spec/interop/test/unit/testcase_spec.rb b/vendor/plugins/rspec/spec/spec/interop/test/unit/testcase_spec.rb index f40111a58..c1b252609 100644 --- a/vendor/plugins/rspec/spec/spec/interop/test/unit/testcase_spec.rb +++ b/vendor/plugins/rspec/spec/spec/interop/test/unit/testcase_spec.rb @@ -1,4 +1,4 @@ -require File.dirname(__FILE__) + '/test_unit_spec_helper' +require 'spec/interop/test/unit/test_unit_spec_helper' describe "Test::Unit::TestCase" do include TestUnitSpecHelper @@ -42,4 +42,9 @@ describe "Test::Unit::TestCase" do $?.should == 256 end end -end
\ No newline at end of file + + it "should find all Test::Unit test methods" do + output = ruby("#{@dir}/test_case_with_various_names.rb") + output.should include("4 examples, 0 failures") + end +end diff --git a/vendor/plugins/rspec/spec/spec/interop/test/unit/testsuite_adapter_spec.rb b/vendor/plugins/rspec/spec/spec/interop/test/unit/testsuite_adapter_spec.rb index 722126bc9..59743039a 100644 --- a/vendor/plugins/rspec/spec/spec/interop/test/unit/testsuite_adapter_spec.rb +++ b/vendor/plugins/rspec/spec/spec/interop/test/unit/testsuite_adapter_spec.rb @@ -1,4 +1,4 @@ -require File.dirname(__FILE__) + '/test_unit_spec_helper' +require 'spec/interop/test/unit/test_unit_spec_helper' describe "TestSuiteAdapter" do include TestUnitSpecHelper diff --git a/vendor/plugins/rspec/spec/spec/matchers/be_close_spec.rb b/vendor/plugins/rspec/spec/spec/matchers/be_close_spec.rb index d8452d408..cc0e5bd44 100644 --- a/vendor/plugins/rspec/spec/spec/matchers/be_close_spec.rb +++ b/vendor/plugins/rspec/spec/spec/matchers/be_close_spec.rb @@ -1,38 +1,49 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' +require 'spec_helper' module Spec module Matchers - describe BeClose do - it "should match when value == target" do - BeClose.new(5.0, 0.5).matches?(5.0).should be_true + describe "[actual.should] be_close(expected, delta)" do + it "matches when actual == expected" do + be_close(5.0, 0.5).matches?(5.0).should be_true end - it "should match when value < (target + delta)" do - BeClose.new(5.0, 0.5).matches?(5.49).should be_true + it "matches when actual < (expected + delta)" do + be_close(5.0, 0.5).matches?(5.49).should be_true end - it "should match when value > (target - delta)" do - BeClose.new(5.0, 0.5).matches?(4.51).should be_true + it "matches when actual > (expected - delta)" do + be_close(5.0, 0.5).matches?(4.51).should be_true end - it "should not match when value == (target - delta)" do - BeClose.new(5.0, 0.5).matches?(4.5).should be_false + it "does not match when actual == (expected - delta)" do + be_close(5.0, 0.5).matches?(4.5).should be_false end - it "should not match when value < (target - delta)" do - BeClose.new(5.0, 0.5).matches?(4.49).should be_false + it "does not match when actual < (expected - delta)" do + be_close(5.0, 0.5).matches?(4.49).should be_false end - it "should not match when value == (target + delta)" do - BeClose.new(5.0, 0.5).matches?(5.5).should be_false + it "does not match when actual == (expected + delta)" do + be_close(5.0, 0.5).matches?(5.5).should be_false end - it "should not match when value > (target + delta)" do - BeClose.new(5.0, 0.5).matches?(5.51).should be_false + it "does not match when actual > (expected + delta)" do + be_close(5.0, 0.5).matches?(5.51).should be_false end - it "should provide a useful failure message" do + it "provides a failure message for should" do #given - matcher = BeClose.new(5.0, 0.5) + matcher = be_close(5.0, 0.5) #when matcher.matches?(5.51) #then - matcher.failure_message.should == "expected 5.0 +/- (< 0.5), got 5.51" + matcher.failure_message_for_should.should == "expected 5.0 +/- (< 0.5), got 5.51" end - it "should describe itself" do - BeClose.new(5.0, 0.5).description.should == "be close to 5.0 (within +- 0.5)" + + it "provides a failure message for should tno" do + #given + matcher = be_close(5.0, 0.5) + #when + matcher.matches?(5.49) + #then + matcher.failure_message_for_should_not.should == "expected 5.0 +/- (< 0.5), got 5.49" + end + it "provides a description" do + matcher = be_close(5.0, 0.5) + matcher.matches?(5.1) + matcher.description.should == "be close to 5.0 (within +- 0.5)" end end end diff --git a/vendor/plugins/rspec/spec/spec/matchers/be_spec.rb b/vendor/plugins/rspec/spec/spec/matchers/be_spec.rb index ba2a0f165..db6258abf 100644 --- a/vendor/plugins/rspec/spec/spec/matchers/be_spec.rb +++ b/vendor/plugins/rspec/spec/spec/matchers/be_spec.rb @@ -1,4 +1,4 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' +require 'spec_helper' describe "should be_predicate" do it "should pass when actual returns true for :predicate?" do @@ -7,7 +7,7 @@ describe "should be_predicate" do end it "should pass when actual returns true for :predicates? (present tense)" do - actual = stub("actual", :exists? => true) + actual = stub("actual", :exists? => true, :exist? => true) actual.should be_exist end @@ -18,10 +18,33 @@ describe "should be_predicate" do }.should fail_with("expected happy? to return true, got false") end + it "should fail when actual returns false for :predicate?" do + actual = stub("actual", :happy? => nil) + lambda { + actual.should be_happy + }.should fail_with("expected happy? to return true, got nil") + end + it "should fail when actual does not respond to :predicate?" do lambda { Object.new.should be_happy - }.should raise_error(NameError) + }.should raise_error(NameError, /happy\?/) + end + + it "should fail on error other than NameError" do + actual = stub("actual") + actual.should_receive(:foo?).and_raise("aaaah") + lambda { + actual.should be_foo + }.should raise_error(/aaaah/) + end + + it "should fail on error other than NameError (with the present tense predicate)" do + actual = Object.new + actual.should_receive(:foos?).and_raise("aaaah") + lambda { + actual.should be_foo + }.should raise_error(/aaaah/) end end @@ -31,6 +54,11 @@ describe "should_not be_predicate" do actual.should_not be_happy end + it "should pass when actual returns nil for :sym?" do + actual = stub("actual", :happy? => nil) + actual.should_not be_happy + end + it "should fail when actual returns true for :sym?" do actual = stub("actual", :happy? => true) lambda { @@ -195,7 +223,15 @@ describe "should be ===" do end it "should fail when === operator returns false" do - lambda { Hash.should be === "not a hash" }.should fail_with(%[expected === "not a hash", got Hash]) + lambda { Hash.should be === "not a hash" }.should fail_with(%[expected === not a hash, got Hash]) + end +end + +describe "should_not with operators" do + it "should coach user to stop using operators with should_not" do + lambda { + 5.should_not be < 6 + }.should raise_error(/not only FAILED,\nit is a bit confusing./m) end end @@ -206,11 +242,11 @@ describe "should be" do end it "should fail if actual is false" do - lambda {false.should be}.should fail_with("expected if to be satisfied, got false") + lambda {false.should be}.should fail_with("expected true, got false") end it "should fail if actual is nil" do - lambda {nil.should be}.should fail_with("expected if to be satisfied, got nil") + lambda {nil.should be}.should fail_with("expected true, got nil") end end @@ -223,13 +259,18 @@ describe "should be(value)" do end end +describe "'should be' with operator" do + it "should include 'be' in the description" do + (be > 6).description.should =~ /be > 6/ + (be >= 6).description.should =~ /be >= 6/ + (be <= 6).description.should =~ /be <= 6/ + (be < 6).description.should =~ /be < 6/ + end +end + describe "arbitrary predicate with DelegateClass" do it "should access methods defined in the delegating class (LH[#48])" do - pending(%{ - Looks like DelegateClass is delegating #should to the - delegate. Not sure how to fix this one. Or if we even should." - }) require 'delegate' class ArrayDelegate < DelegateClass(Array) def initialize(array) @@ -246,3 +287,25 @@ describe "arbitrary predicate with DelegateClass" do delegate.should be_large end end + +describe "be_a, be_an" do + it "should pass when class matches" do + "foobar".should be_a(String) + [1,2,3].should be_an(Array) + end + + it "should fail when class does not match" do + "foobar".should_not be_a(Hash) + [1,2,3].should_not be_an(Integer) + end +end + +describe "be_an_instance_of" do + it "passes when direct class matches" do + 5.should be_an_instance_of(Fixnum) + end + + it "fails when class is higher up hierarchy" do + 5.should_not be_an_instance_of(Numeric) + end +end
\ No newline at end of file diff --git a/vendor/plugins/rspec/spec/spec/matchers/change_spec.rb b/vendor/plugins/rspec/spec/spec/matchers/change_spec.rb index d95aa6da4..e70daf37d 100644 --- a/vendor/plugins/rspec/spec/spec/matchers/change_spec.rb +++ b/vendor/plugins/rspec/spec/spec/matchers/change_spec.rb @@ -1,6 +1,6 @@ #Based on patch from Wilson Bilkovich -require File.dirname(__FILE__) + '/../../spec_helper.rb' +require 'spec_helper' class SomethingExpected attr_accessor :some_value end @@ -12,13 +12,17 @@ describe "should change(actual, message)" do end it "should pass when actual is modified by the block" do - lambda {@instance.some_value = 6}.should change(@instance, :some_value) + expect {@instance.some_value = 6}.to change(@instance, :some_value) end it "should fail when actual is not modified by the block" do - lambda do - lambda {}.should change(@instance, :some_value) - end.should fail_with("some_value should have changed, but is still 5") + expect do + expect {}.to change(@instance, :some_value) + end.to fail_with("some_value should have changed, but is still 5") + end + + it "provides a #description" do + change(@instance, :some_value).description.should == "change #some_value" end end @@ -29,13 +33,13 @@ describe "should_not change(actual, message)" do end it "should pass when actual is not modified by the block" do - lambda { }.should_not change(@instance, :some_value) + expect { }.to_not change(@instance, :some_value) end it "should fail when actual is not modified by the block" do - lambda do - lambda {@instance.some_value = 6}.should_not change(@instance, :some_value) - end.should fail_with("some_value should not have changed, but did change from 5 to 6") + expect do + expect {@instance.some_value = 6}.to_not change(@instance, :some_value) + end.to fail_with("some_value should not have changed, but did change from 5 to 6") end end @@ -46,20 +50,23 @@ describe "should change { block }" do end it "should pass when actual is modified by the block" do - lambda {@instance.some_value = 6}.should change { @instance.some_value } + expect {@instance.some_value = 6}.to change { @instance.some_value } end it "should fail when actual is not modified by the block" do - lambda do - lambda {}.should change{ @instance.some_value } - end.should fail_with("result should have changed, but is still 5") + expect do + expect {}.to change{ @instance.some_value } + end.to fail_with("result should have changed, but is still 5") + end + + it "should warn if passed a block using do/end instead of {}" do + expect do + expect {}.to change do; end + end.to raise_error(Spec::Matchers::MatcherError, /block passed to should or should_not/) end - it "should warn if passed a block using do/end" do - lambda do - lambda {}.should change do - end - end.should raise_error(Spec::Matchers::MatcherError, /block passed to should or should_not/) + it "provides a #description" do + change { @instance.some_value }.description.should == "change #result" end end @@ -70,20 +77,19 @@ describe "should_not change { block }" do end it "should pass when actual is modified by the block" do - lambda {}.should_not change{ @instance.some_value } + expect {}.to_not change{ @instance.some_value } end it "should fail when actual is not modified by the block" do - lambda do - lambda {@instance.some_value = 6}.should_not change { @instance.some_value } - end.should fail_with("result should not have changed, but did change from 5 to 6") + expect do + expect {@instance.some_value = 6}.to_not change { @instance.some_value } + end.to fail_with("result should not have changed, but did change from 5 to 6") end - it "should warn if passed a block using do/end" do - lambda do - lambda {}.should_not change do - end - end.should raise_error(Spec::Matchers::MatcherError, /block passed to should or should_not/) + it "should warn if passed a block using do/end instead of {}" do + expect do + expect {}.to_not change do; end + end.to raise_error(Spec::Matchers::MatcherError, /block passed to should or should_not/) end end @@ -94,19 +100,19 @@ describe "should change(actual, message).by(expected)" do end it "should pass when attribute is changed by expected amount" do - lambda { @instance.some_value += 1 }.should change(@instance, :some_value).by(1) + expect { @instance.some_value += 1 }.to change(@instance, :some_value).by(1) end it "should fail when the attribute is changed by unexpected amount" do - lambda do - lambda { @instance.some_value += 2 }.should change(@instance, :some_value).by(1) - end.should fail_with("some_value should have been changed by 1, but was changed by 2") + expect do + expect { @instance.some_value += 2 }.to change(@instance, :some_value).by(1) + end.to fail_with("some_value should have been changed by 1, but was changed by 2") end it "should fail when the attribute is changed by unexpected amount in the opposite direction" do - lambda do - lambda { @instance.some_value -= 1 }.should change(@instance, :some_value).by(1) - end.should fail_with("some_value should have been changed by 1, but was changed by -1") + expect do + expect { @instance.some_value -= 1 }.to change(@instance, :some_value).by(1) + end.to fail_with("some_value should have been changed by 1, but was changed by -1") end end @@ -117,19 +123,19 @@ describe "should change{ block }.by(expected)" do end it "should pass when attribute is changed by expected amount" do - lambda { @instance.some_value += 1 }.should change{@instance.some_value}.by(1) + expect { @instance.some_value += 1 }.to change{@instance.some_value}.by(1) end it "should fail when the attribute is changed by unexpected amount" do - lambda do - lambda { @instance.some_value += 2 }.should change{@instance.some_value}.by(1) - end.should fail_with("result should have been changed by 1, but was changed by 2") + expect do + expect { @instance.some_value += 2 }.to change{@instance.some_value}.by(1) + end.to fail_with("result should have been changed by 1, but was changed by 2") end it "should fail when the attribute is changed by unexpected amount in the opposite direction" do - lambda do - lambda { @instance.some_value -= 1 }.should change{@instance.some_value}.by(1) - end.should fail_with("result should have been changed by 1, but was changed by -1") + expect do + expect { @instance.some_value -= 1 }.to change{@instance.some_value}.by(1) + end.to fail_with("result should have been changed by 1, but was changed by -1") end end @@ -140,17 +146,17 @@ describe "should change(actual, message).by_at_least(expected)" do end it "should pass when attribute is changed by greater than the expected amount" do - lambda { @instance.some_value += 2 }.should change(@instance, :some_value).by_at_least(1) + expect { @instance.some_value += 2 }.to change(@instance, :some_value).by_at_least(1) end it "should pass when attribute is changed by the expected amount" do - lambda { @instance.some_value += 2 }.should change(@instance, :some_value).by_at_least(2) + expect { @instance.some_value += 2 }.to change(@instance, :some_value).by_at_least(2) end it "should fail when the attribute is changed by less than the expected amount" do - lambda do - lambda { @instance.some_value += 1 }.should change(@instance, :some_value).by_at_least(2) - end.should fail_with("some_value should have been changed by at least 2, but was changed by 1") + expect do + expect { @instance.some_value += 1 }.to change(@instance, :some_value).by_at_least(2) + end.to fail_with("some_value should have been changed by at least 2, but was changed by 1") end end @@ -162,17 +168,17 @@ describe "should change{ block }.by_at_least(expected)" do end it "should pass when attribute is changed by greater than expected amount" do - lambda { @instance.some_value += 2 }.should change{@instance.some_value}.by_at_least(1) + expect { @instance.some_value += 2 }.to change{@instance.some_value}.by_at_least(1) end it "should pass when attribute is changed by the expected amount" do - lambda { @instance.some_value += 2 }.should change{@instance.some_value}.by_at_least(2) + expect { @instance.some_value += 2 }.to change{@instance.some_value}.by_at_least(2) end it "should fail when the attribute is changed by less than the unexpected amount" do - lambda do - lambda { @instance.some_value += 1 }.should change{@instance.some_value}.by_at_least(2) - end.should fail_with("result should have been changed by at least 2, but was changed by 1") + expect do + expect { @instance.some_value += 1 }.to change{@instance.some_value}.by_at_least(2) + end.to fail_with("result should have been changed by at least 2, but was changed by 1") end end @@ -184,17 +190,17 @@ describe "should change(actual, message).by_at_most(expected)" do end it "should pass when attribute is changed by less than the expected amount" do - lambda { @instance.some_value += 2 }.should change(@instance, :some_value).by_at_most(3) + expect { @instance.some_value += 2 }.to change(@instance, :some_value).by_at_most(3) end it "should pass when attribute is changed by the expected amount" do - lambda { @instance.some_value += 2 }.should change(@instance, :some_value).by_at_most(2) + expect { @instance.some_value += 2 }.to change(@instance, :some_value).by_at_most(2) end it "should fail when the attribute is changed by greater than the expected amount" do - lambda do - lambda { @instance.some_value += 2 }.should change(@instance, :some_value).by_at_most(1) - end.should fail_with("some_value should have been changed by at most 1, but was changed by 2") + expect do + expect { @instance.some_value += 2 }.to change(@instance, :some_value).by_at_most(1) + end.to fail_with("some_value should have been changed by at most 1, but was changed by 2") end end @@ -206,17 +212,17 @@ describe "should change{ block }.by_at_most(expected)" do end it "should pass when attribute is changed by less than expected amount" do - lambda { @instance.some_value += 2 }.should change{@instance.some_value}.by_at_most(3) + expect { @instance.some_value += 2 }.to change{@instance.some_value}.by_at_most(3) end it "should pass when attribute is changed by the expected amount" do - lambda { @instance.some_value += 2 }.should change{@instance.some_value}.by_at_most(2) + expect { @instance.some_value += 2 }.to change{@instance.some_value}.by_at_most(2) end it "should fail when the attribute is changed by greater than the unexpected amount" do - lambda do - lambda { @instance.some_value += 2 }.should change{@instance.some_value}.by_at_most(1) - end.should fail_with("result should have been changed by at most 1, but was changed by 2") + expect do + expect { @instance.some_value += 2 }.to change{@instance.some_value}.by_at_most(1) + end.to fail_with("result should have been changed by at most 1, but was changed by 2") end end @@ -227,13 +233,13 @@ describe "should change(actual, message).from(old)" do end it "should pass when attribute is == to expected value before executing block" do - lambda { @instance.some_value = "astring" }.should change(@instance, :some_value).from("string") + expect { @instance.some_value = "astring" }.to change(@instance, :some_value).from("string") end it "should fail when attribute is not == to expected value before executing block" do - lambda do - lambda { @instance.some_value = "knot" }.should change(@instance, :some_value).from("cat") - end.should fail_with("some_value should have initially been \"cat\", but was \"string\"") + expect do + expect { @instance.some_value = "knot" }.to change(@instance, :some_value).from("cat") + end.to fail_with("some_value should have initially been \"cat\", but was \"string\"") end end @@ -244,13 +250,13 @@ describe "should change{ block }.from(old)" do end it "should pass when attribute is == to expected value before executing block" do - lambda { @instance.some_value = "astring" }.should change{@instance.some_value}.from("string") + expect { @instance.some_value = "astring" }.to change{@instance.some_value}.from("string") end it "should fail when attribute is not == to expected value before executing block" do - lambda do - lambda { @instance.some_value = "knot" }.should change{@instance.some_value}.from("cat") - end.should fail_with("result should have initially been \"cat\", but was \"string\"") + expect do + expect { @instance.some_value = "knot" }.to change{@instance.some_value}.from("cat") + end.to fail_with("result should have initially been \"cat\", but was \"string\"") end end @@ -261,13 +267,13 @@ describe "should change(actual, message).to(new)" do end it "should pass when attribute is == to expected value after executing block" do - lambda { @instance.some_value = "cat" }.should change(@instance, :some_value).to("cat") + expect { @instance.some_value = "cat" }.to change(@instance, :some_value).to("cat") end it "should fail when attribute is not == to expected value after executing block" do - lambda do - lambda { @instance.some_value = "cat" }.should change(@instance, :some_value).from("string").to("dog") - end.should fail_with("some_value should have been changed to \"dog\", but is now \"cat\"") + expect do + expect { @instance.some_value = "cat" }.to change(@instance, :some_value).from("string").to("dog") + end.to fail_with("some_value should have been changed to \"dog\", but is now \"cat\"") end end @@ -278,13 +284,13 @@ describe "should change{ block }.to(new)" do end it "should pass when attribute is == to expected value after executing block" do - lambda { @instance.some_value = "cat" }.should change{@instance.some_value}.to("cat") + expect { @instance.some_value = "cat" }.to change{@instance.some_value}.to("cat") end it "should fail when attribute is not == to expected value after executing block" do - lambda do - lambda { @instance.some_value = "cat" }.should change{@instance.some_value}.from("string").to("dog") - end.should fail_with("result should have been changed to \"dog\", but is now \"cat\"") + expect do + expect { @instance.some_value = "cat" }.to change{@instance.some_value}.from("string").to("dog") + end.to fail_with("result should have been changed to \"dog\", but is now \"cat\"") end end @@ -295,11 +301,23 @@ describe "should change(actual, message).from(old).to(new)" do end it "should pass when #to comes before #from" do - lambda { @instance.some_value = "cat" }.should change(@instance, :some_value).to("cat").from("string") + expect { @instance.some_value = "cat" }.to change(@instance, :some_value).to("cat").from("string") end it "should pass when #from comes before #to" do - lambda { @instance.some_value = "cat" }.should change(@instance, :some_value).from("string").to("cat") + expect { @instance.some_value = "cat" }.to change(@instance, :some_value).from("string").to("cat") + end + + it "should show the correct messaging when #after and #to are different" do + expect do + expect { @instance.some_value = "cat" }.to change(@instance, :some_value).from("string").to("dog") + end.to fail_with("some_value should have been changed to \"dog\", but is now \"cat\"") + end + + it "should show the correct messaging when #before and #from are different" do + expect do + expect { @instance.some_value = "cat" }.to change(@instance, :some_value).from("not_string").to("cat") + end.to fail_with("some_value should have initially been \"not_string\", but was \"string\"") end end @@ -310,10 +328,22 @@ describe "should change{ block }.from(old).to(new)" do end it "should pass when #to comes before #from" do - lambda { @instance.some_value = "cat" }.should change{@instance.some_value}.to("cat").from("string") + expect { @instance.some_value = "cat" }.to change{@instance.some_value}.to("cat").from("string") end it "should pass when #from comes before #to" do - lambda { @instance.some_value = "cat" }.should change{@instance.some_value}.from("string").to("cat") + expect { @instance.some_value = "cat" }.to change{@instance.some_value}.from("string").to("cat") + end +end + +describe Spec::Matchers::Change do + it "should work when the receiver has implemented #send" do + @instance = SomethingExpected.new + @instance.some_value = "string" + def @instance.send(*args); raise "DOH! Library developers shouldn't use #send!" end + + expect { + expect { @instance.some_value = "cat" }.to change(@instance, :some_value) + }.to_not raise_error end end diff --git a/vendor/plugins/rspec/spec/spec/matchers/description_generation_spec.rb b/vendor/plugins/rspec/spec/spec/matchers/description_generation_spec.rb index c494e2165..51b483c74 100644 --- a/vendor/plugins/rspec/spec/spec/matchers/description_generation_spec.rb +++ b/vendor/plugins/rspec/spec/spec/matchers/description_generation_spec.rb @@ -1,4 +1,4 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' +require 'spec_helper' describe "Matchers should be able to generate their own descriptions" do after(:each) do @@ -50,18 +50,6 @@ describe "Matchers should be able to generate their own descriptions" do Spec::Matchers.generated_description.should == "should be between 0 and 10" end - it "should be_few_words predicate should be transformed to 'be few words'" do - 5.should be_kind_of(Fixnum) - Spec::Matchers.generated_description.should == "should be kind of Fixnum" - end - - it "should preserve a proper prefix for be predicate" do - 5.should be_a_kind_of(Fixnum) - Spec::Matchers.generated_description.should == "should be a kind of Fixnum" - 5.should be_an_instance_of(Fixnum) - Spec::Matchers.generated_description.should == "should be an instance of Fixnum" - end - it "should equal" do expected = "expected" expected.should equal(expected) @@ -107,6 +95,11 @@ describe "Matchers should be able to generate their own descriptions" do [1,2,3].should include(3) Spec::Matchers.generated_description.should == "should include 3" end + + it "array.should =~ [1,2,3]" do + [1,2,3].should =~ [1,2,3] + Spec::Matchers.generated_description.should == "should contain exactly 1, 2 and 3" + end it "should match" do "this string".should match(/this string/) @@ -151,3 +144,17 @@ describe "Matchers should be able to generate their own descriptions" do end.new end end + +describe "a Matcher with no description" do + def matcher + Class.new do + def matches?(ignore); true; end + def failure_message; ""; end + end.new + end + + it "should provide a helpful message when used in a string-less example block" do + 5.should matcher + Spec::Matchers.generated_description.should =~ /When you call.*description method/m + end +end diff --git a/vendor/plugins/rspec/spec/spec/matchers/eql_spec.rb b/vendor/plugins/rspec/spec/spec/matchers/eql_spec.rb index 3f265d700..5cdf541eb 100644 --- a/vendor/plugins/rspec/spec/spec/matchers/eql_spec.rb +++ b/vendor/plugins/rspec/spec/spec/matchers/eql_spec.rb @@ -1,27 +1,32 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' +require 'spec_helper' module Spec module Matchers - describe Eql do + describe "eql" do it "should match when actual.eql?(expected)" do - Eql.new(1).matches?(1).should be_true + 1.should eql(1) end + it "should not match when !actual.eql?(expected)" do - Eql.new(1).matches?(2).should be_false + 1.should_not eql(2) end + it "should describe itself" do - matcher = Eql.new(1) + matcher = eql(1) + matcher.matches?(1) matcher.description.should == "eql 1" end + it "should provide message, expected and actual on #failure_message" do - matcher = Eql.new("1") + matcher = eql("1") matcher.matches?(1) - matcher.failure_message.should == ["expected \"1\", got 1 (using .eql?)", "1", 1] + matcher.failure_message_for_should.should == "\nexpected \"1\"\n got 1\n\n(compared using eql?)\n" end + it "should provide message, expected and actual on #negative_failure_message" do - matcher = Eql.new(1) + matcher = eql(1) matcher.matches?(1) - matcher.negative_failure_message.should == ["expected 1 not to equal 1 (using .eql?)", 1, 1] + matcher.failure_message_for_should_not.should == "\nexpected 1 not to equal 1\n\n(compared using eql?)\n" end end end diff --git a/vendor/plugins/rspec/spec/spec/matchers/equal_spec.rb b/vendor/plugins/rspec/spec/spec/matchers/equal_spec.rb index 7667bdc38..cb2fc1e51 100644 --- a/vendor/plugins/rspec/spec/spec/matchers/equal_spec.rb +++ b/vendor/plugins/rspec/spec/spec/matchers/equal_spec.rb @@ -1,27 +1,56 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' - +require 'spec_helper' module Spec module Matchers - describe Equal do + describe "equal" do + + def inspect_object(o) + "#<#{o.class}:#{o.object_id}> => #{o.inspect}" + end + it "should match when actual.equal?(expected)" do - Equal.new(1).matches?(1).should be_true + 1.should equal(1) end + it "should not match when !actual.equal?(expected)" do - Equal.new("1").matches?("1").should be_false + 1.should_not equal("1") end + it "should describe itself" do - matcher = Equal.new(1) + matcher = equal(1) + matcher.matches?(1) matcher.description.should == "equal 1" end - it "should provide message, expected and actual on #failure_message" do - matcher = Equal.new("1") - matcher.matches?(1) - matcher.failure_message.should == ["expected \"1\", got 1 (using .equal?)", "1", 1] + + it "should provide message on #failure_message" do + expected, actual = "1", "1" + matcher = equal(expected) + matcher.matches?(actual) + + matcher.failure_message_for_should.should == <<-MESSAGE + +expected #{inspect_object(expected)} + got #{inspect_object(actual)} + +Compared using equal?, which compares object identity, +but expected and actual are not the same object. Use +'actual.should == expected' if you don't care about +object identity in this example. + +MESSAGE end - it "should provide message, expected and actual on #negative_failure_message" do - matcher = Equal.new(1) - matcher.matches?(1) - matcher.negative_failure_message.should == ["expected 1 not to equal 1 (using .equal?)", 1, 1] + + it "should provide message on #negative_failure_message" do + expected = actual = "1" + matcher = equal(expected) + matcher.matches?(actual) + matcher.failure_message_for_should_not.should == <<-MESSAGE + +expected not #{inspect_object(expected)} + got #{inspect_object(actual)} + +Compared using equal?, which compares object identity. + +MESSAGE end end end diff --git a/vendor/plugins/rspec/spec/spec/matchers/exist_spec.rb b/vendor/plugins/rspec/spec/spec/matchers/exist_spec.rb index 0a509726e..f95c86ff8 100644 --- a/vendor/plugins/rspec/spec/spec/matchers/exist_spec.rb +++ b/vendor/plugins/rspec/spec/spec/matchers/exist_spec.rb @@ -1,11 +1,11 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' +require 'spec_helper' class Substance def initialize exists, description @exists = exists @description = description end - def exist? + def exist?(arg=nil) @exists end def inspect @@ -23,7 +23,7 @@ class SubstanceTester end end -describe "should exist," do +describe "should exist" do before(:each) do @real = Substance.new true, 'something real' @@ -32,15 +32,23 @@ describe "should exist," do describe "within an example group" do - it "should pass if target exists" do + it "passes if target exists" do @real.should exist end - it "should fail if target does not exist" do + it "passes if target exists with args" do + @real.should exist('this arg') + end + + it "fails if target does not exist" do lambda { @imaginary.should exist }.should fail end - it "should pass if target doesn't exist" do + it "describes itself" do + exist.description.should == "exist" + end + + it "passes should_not exist if target doesn't exist" do lambda { @real.should_not exist }.should fail end end diff --git a/vendor/plugins/rspec/spec/spec/matchers/handler_spec.rb b/vendor/plugins/rspec/spec/spec/matchers/handler_spec.rb deleted file mode 100644 index ad4fe6f85..000000000 --- a/vendor/plugins/rspec/spec/spec/matchers/handler_spec.rb +++ /dev/null @@ -1,129 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' - -module ExampleExpectations - - class ArbitraryMatcher - def initialize(*args, &block) - if args.last.is_a? Hash - @expected = args.last[:expected] - end - if block_given? - @expected = block.call - end - @block = block - end - - def matches?(target) - @target = target - return @expected == target - end - - def with(new_value) - @expected = new_value - self - end - - def failure_message - "expected #{@expected}, got #{@target}" - end - - def negative_failure_message - "expected not #{@expected}, got #{@target}" - end - end - - class PositiveOnlyMatcher < ArbitraryMatcher - undef negative_failure_message rescue nil - end - - def arbitrary_matcher(*args, &block) - ArbitraryMatcher.new(*args, &block) - end - - def positive_only_matcher(*args, &block) - PositiveOnlyMatcher.new(*args, &block) - end - -end - -module Spec - module Expectations - describe ExpectationMatcherHandler, ".handle_matcher" do - it "should ask the matcher if it matches" do - matcher = mock("matcher") - actual = Object.new - matcher.should_receive(:matches?).with(actual).and_return(true) - ExpectationMatcherHandler.handle_matcher(actual, matcher) - end - - it "should explain when the matcher parameter is not a matcher" do - begin - nonmatcher = mock("nonmatcher") - actual = Object.new - ExpectationMatcherHandler.handle_matcher(actual, nonmatcher) - rescue Spec::Expectations::InvalidMatcherError => e - end - - e.message.should =~ /^Expected a matcher, got / - end - end - - describe NegativeExpectationMatcherHandler, ".handle_matcher" do - it "should explain when matcher does not support should_not" do - matcher = mock("matcher") - matcher.stub!(:matches?) - actual = Object.new - lambda { - NegativeExpectationMatcherHandler.handle_matcher(actual, matcher) - }.should fail_with(/Matcher does not support should_not.\n/) - end - - it "should ask the matcher if it matches" do - matcher = mock("matcher") - actual = Object.new - matcher.stub!(:negative_failure_message) - matcher.should_receive(:matches?).with(actual).and_return(false) - NegativeExpectationMatcherHandler.handle_matcher(actual, matcher) - end - - it "should explain when the matcher parameter is not a matcher" do - begin - nonmatcher = mock("nonmatcher") - actual = Object.new - NegativeExpectationMatcherHandler.handle_matcher(actual, nonmatcher) - rescue Spec::Expectations::InvalidMatcherError => e - end - - e.message.should =~ /^Expected a matcher, got / - end - end - - describe ExpectationMatcherHandler do - include ExampleExpectations - - it "should handle submitted args" do - 5.should arbitrary_matcher(:expected => 5) - 5.should arbitrary_matcher(:expected => "wrong").with(5) - lambda { 5.should arbitrary_matcher(:expected => 4) }.should fail_with("expected 4, got 5") - lambda { 5.should arbitrary_matcher(:expected => 5).with(4) }.should fail_with("expected 4, got 5") - 5.should_not arbitrary_matcher(:expected => 4) - 5.should_not arbitrary_matcher(:expected => 5).with(4) - lambda { 5.should_not arbitrary_matcher(:expected => 5) }.should fail_with("expected not 5, got 5") - lambda { 5.should_not arbitrary_matcher(:expected => 4).with(5) }.should fail_with("expected not 5, got 5") - end - - it "should handle the submitted block" do - 5.should arbitrary_matcher { 5 } - 5.should arbitrary_matcher(:expected => 4) { 5 } - 5.should arbitrary_matcher(:expected => 4).with(5) { 3 } - end - - it "should explain when matcher does not support should_not" do - lambda { - 5.should_not positive_only_matcher(:expected => 5) - }.should fail_with(/Matcher does not support should_not.\n/) - end - - end - end -end diff --git a/vendor/plugins/rspec/spec/spec/matchers/has_spec.rb b/vendor/plugins/rspec/spec/spec/matchers/has_spec.rb index 648ad8653..b6f259913 100644 --- a/vendor/plugins/rspec/spec/spec/matchers/has_spec.rb +++ b/vendor/plugins/rspec/spec/spec/matchers/has_spec.rb @@ -1,4 +1,4 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' +require 'spec_helper' describe "should have_sym(*args)" do it "should pass if #has_sym?(*args) returns true" do @@ -11,6 +11,16 @@ describe "should have_sym(*args)" do }.should fail_with("expected #has_key?(:a) to return true, got false") end + it "should fail if #has_sym?(*args) returns nil" do + klass = Class.new do + def has_foo? + end + end + lambda { + klass.new.should have_foo + }.should fail_with("expected #has_foo?(nil) to return true, got false") + end + it "should fail if target does not respond to #has_sym?" do lambda { Object.new.should have_key(:a) @@ -31,6 +41,14 @@ describe "should_not have_sym(*args)" do {:a => "A"}.should_not have_key(:b) end + it "should pass if #has_sym?(*args) returns nil" do + klass = Class.new do + def has_foo? + end + end + klass.new.should_not have_foo + end + it "should fail if #has_sym?(*args) returns true" do lambda { {:a => "A"}.should_not have_key(:a) @@ -51,3 +69,13 @@ describe "should_not have_sym(*args)" do lambda { o.should_not have_sym(:foo) }.should raise_error("Funky exception") end end + +describe "has" do + it "should work when the target implements #send" do + o = {:a => "A"} + def o.send(*args); raise "DOH! Library developers shouldn't use #send!" end + lambda { + o.should have_key(:a) + }.should_not raise_error + end +end diff --git a/vendor/plugins/rspec/spec/spec/matchers/have_spec.rb b/vendor/plugins/rspec/spec/spec/matchers/have_spec.rb index 27083c294..07c294976 100644 --- a/vendor/plugins/rspec/spec/spec/matchers/have_spec.rb +++ b/vendor/plugins/rspec/spec/spec/matchers/have_spec.rb @@ -1,16 +1,31 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' +require 'spec_helper' -module HaveSpecHelper +share_as :HaveSpecHelper do def create_collection_owner_with(n) owner = Spec::Expectations::Helper::CollectionOwner.new - (1..n).each do |n| - owner.add_to_collection_with_length_method(n) - owner.add_to_collection_with_size_method(n) + (1..n).each do |number| + owner.add_to_collection_with_length_method(number) + owner.add_to_collection_with_size_method(number) end owner end + before(:each) do + if defined?(::ActiveSupport::Inflector) + @active_support_was_defined = true + else + @active_support_was_defined = false + module ::ActiveSupport + class Inflector + def self.pluralize(string) + string.to_s + 's' + end + end + end + end + end end + describe "should have(n).items" do include HaveSpecHelper @@ -47,12 +62,30 @@ describe "should have(n).items" do end end +describe 'should have(1).item when ActiveSupport::Inflector is defined' do + include HaveSpecHelper + + it 'should pluralize the collection name' do + owner = create_collection_owner_with(1) + owner.should have(1).item + end + + after(:each) do + unless @active_support_was_defined + Object.__send__ :remove_const, :ActiveSupport + end + end +end + describe 'should have(1).item when Inflector is defined' do include HaveSpecHelper - before do - unless Object.const_defined?(:Inflector) - class Inflector + before(:each) do + if defined?(Inflector) + @inflector_was_defined = true + else + @inflector_was_defined = false + class ::Inflector def self.pluralize(string) string.to_s + 's' end @@ -64,6 +97,12 @@ describe 'should have(1).item when Inflector is defined' do owner = create_collection_owner_with(1) owner.should have(1).item end + + after(:each) do + unless @inflector_was_defined + Object.__send__ :remove_const, :Inflector + end + end end describe "should have(n).items where result responds to items but returns something other than a collection" do @@ -177,7 +216,7 @@ describe "should have_at_least(n).items" do size_matcher.matches?(owner) #then - length_matcher.negative_failure_message.should == <<-EOF + length_matcher.failure_message_for_should_not.should == <<-EOF Isn't life confusing enough? Instead of having to figure out the meaning of this: should_not have_at_least(3).items_in_collection_with_length_method @@ -185,7 +224,7 @@ We recommend that you use this instead: should have_at_most(2).items_in_collection_with_length_method EOF - size_matcher.negative_failure_message.should == <<-EOF + size_matcher.failure_message_for_should_not.should == <<-EOF Isn't life confusing enough? Instead of having to figure out the meaning of this: should_not have_at_least(3).items_in_collection_with_size_method @@ -231,7 +270,7 @@ describe "should have_at_most(n).items" do size_matcher.matches?(owner) #then - length_matcher.negative_failure_message.should == <<-EOF + length_matcher.failure_message_for_should_not.should == <<-EOF Isn't life confusing enough? Instead of having to figure out the meaning of this: should_not have_at_most(3).items_in_collection_with_length_method @@ -239,7 +278,7 @@ We recommend that you use this instead: should have_at_least(4).items_in_collection_with_length_method EOF - size_matcher.negative_failure_message.should == <<-EOF + size_matcher.failure_message_for_should_not.should == <<-EOF Isn't life confusing enough? Instead of having to figure out the meaning of this: should_not have_at_most(3).items_in_collection_with_size_method @@ -289,3 +328,69 @@ describe "have(n).things on an object which is not a collection nor contains one lambda { Object.new.should have(2).things }.should raise_error(NoMethodError, /undefined method `things' for #<Object:/) end end + +describe Spec::Matchers::Have, "for a collection owner that implements #send" do + include HaveSpecHelper + + before(:each) do + @collection = Object.new + def @collection.floozles; [1,2] end + def @collection.send(*args); raise "DOH! Library developers shouldn't use #send!" end + end + + it "should work in the straightforward case" do + lambda { + @collection.should have(2).floozles + }.should_not raise_error + end + + it "should work when doing automatic pluralization" do + lambda { + @collection.should have_at_least(1).floozle + }.should_not raise_error + end + + it "should blow up when the owner doesn't respond to that method" do + lambda { + @collection.should have(99).problems + }.should raise_error(NoMethodError, /problems/) + end +end + +module Spec + module Matchers + describe Have do + treats_method_missing_as_private :noop => false + + describe "respond_to?" do + before :each do + @have = Have.new(:foo) + @a_method_which_have_defines = Have.instance_methods.first + @a_method_which_object_defines = Object.instance_methods.first + end + + it "should be true for a method which Have defines" do + @have.should respond_to(@a_method_which_have_defines) + end + + it "should be true for a method that it's superclass (Object) defines" do + @have.should respond_to(@a_method_which_object_defines) + end + + it "should be false for a method which neither Object nor nor Have defines" do + @have.should_not respond_to(:foo_bar_baz) + end + + it "should be false if the owner doesn't respond to the method" do + have = Have.new(99) + have.should_not respond_to(:problems) + end + + it "should be true if the owner responds to the method" do + have = Have.new(:a_symbol) + have.should respond_to(:to_sym) + end + end + end + end +end diff --git a/vendor/plugins/rspec/spec/spec/matchers/include_spec.rb b/vendor/plugins/rspec/spec/spec/matchers/include_spec.rb index f1057f3fd..2b959b589 100644 --- a/vendor/plugins/rspec/spec/spec/matchers/include_spec.rb +++ b/vendor/plugins/rspec/spec/spec/matchers/include_spec.rb @@ -1,10 +1,14 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' +require 'spec_helper' describe "should include(expected)" do it "should pass if target includes expected" do [1,2,3].should include(3) "abc".should include("a") end + + it 'should pass if target is a Hash and has the expected as a key' do + {:key => 'value'}.should include(:key) + end it "should fail if target does not include expected" do lambda { @@ -13,6 +17,9 @@ describe "should include(expected)" do lambda { "abc".should include("d") }.should fail_with("expected \"abc\" to include \"d\"") + lambda { + {:key => 'value'}.should include(:other) + }.should fail_with(%Q|expected {:key=>"value"} to include :other|) end end @@ -20,11 +27,21 @@ describe "should include(with, multiple, args)" do it "should pass if target includes all items" do [1,2,3].should include(1,2,3) end + + it 'should pass if target is a Hash including all items as keys' do + {:key => 'value', :other => 'value'}.should include(:key, :other) + end it "should fail if target does not include any one of the items" do lambda { [1,2,3].should include(1,2,4) - }.should fail_with("expected [1, 2, 3] to include 1, 2 and 4") + }.should fail_with("expected [1, 2, 3] to include 1, 2, and 4") + end + + it 'should pass if target is a Hash missing any item as a key' do + lambda { + {:key => 'value'}.should include(:key, :other) + }.should fail_with(%Q|expected {:key=>"value"} to include :key and :other|) end end @@ -33,6 +50,10 @@ describe "should_not include(expected)" do [1,2,3].should_not include(4) "abc".should_not include("d") end + + it 'should pass if target is a Hash and does not have the expected as a key' do + {:other => 'value'}.should_not include(:key) + end it "should fail if target includes expected" do lambda { @@ -41,5 +62,27 @@ describe "should_not include(expected)" do lambda { "abc".should_not include("c") }.should fail_with("expected \"abc\" not to include \"c\"") + lambda { + {:key => 'value'}.should_not include(:key) + }.should fail_with(%Q|expected {:key=>"value"} not to include :key|) + end +end + +describe "should include(:key => value)" do + it "should pass if target is a Hash and includes the key/value pair" do + {:key => 'value'}.should include(:key => 'value') + end + it "should pass if target is a Hash and includes the key/value pair among others" do + {:key => 'value', :other => 'different'}.should include(:key => 'value') + end + it "should fail if target is a Hash and has a different value for key" do + lambda { + {:key => 'different'}.should include(:key => 'value') + }.should fail_with(%Q|expected {:key=>"different"} to include {:key=>"value"}|) + end + it "should fail if target is a Hash and has a different key" do + lambda { + {:other => 'value'}.should include(:key => 'value') + }.should fail_with(%Q|expected {:other=>"value"} to include {:key=>"value"}|) end end diff --git a/vendor/plugins/rspec/spec/spec/matchers/match_spec.rb b/vendor/plugins/rspec/spec/spec/matchers/match_spec.rb index f69f7efad..e5dc800a6 100644 --- a/vendor/plugins/rspec/spec/spec/matchers/match_spec.rb +++ b/vendor/plugins/rspec/spec/spec/matchers/match_spec.rb @@ -1,20 +1,30 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' +require 'spec_helper' describe "should match(expected)" do it "should pass when target (String) matches expected (Regexp)" do "string".should match(/tri/) end + it "should pass when target (String) matches expected (String)" do + "string".should match("tri") + end + it "should fail when target (String) does not match expected (Regexp)" do lambda { "string".should match(/rings/) }.should fail end + + it "should fail when target (String) does not match expected (String)" do + lambda { + "string".should match("rings") + }.should fail + end it "should provide message, expected and actual on failure" do matcher = match(/rings/) matcher.matches?("string") - matcher.failure_message.should == ["expected \"string\" to match /rings/", /rings/, "string"] + matcher.failure_message_for_should.should == "expected \"string\" to match /rings/" end end @@ -23,15 +33,25 @@ describe "should_not match(expected)" do "string".should_not match(/rings/) end + it "should pass when target (String) matches does not match (String)" do + "string".should_not match("rings") + end + it "should fail when target (String) matches expected (Regexp)" do lambda { "string".should_not match(/tri/) }.should fail end + it "should fail when target (String) matches expected (String)" do + lambda { + "string".should_not match("tri") + }.should fail + end + it "should provide message, expected and actual on failure" do matcher = match(/tri/) matcher.matches?("string") - matcher.negative_failure_message.should == ["expected \"string\" not to match /tri/", /tri/, "string"] + matcher.failure_message_for_should_not.should == "expected \"string\" not to match /tri/" end end diff --git a/vendor/plugins/rspec/spec/spec/matchers/matcher_methods_spec.rb b/vendor/plugins/rspec/spec/spec/matchers/matcher_methods_spec.rb index 80cc9855a..291a2afa4 100644 --- a/vendor/plugins/rspec/spec/spec/matchers/matcher_methods_spec.rb +++ b/vendor/plugins/rspec/spec/spec/matchers/matcher_methods_spec.rb @@ -1,4 +1,4 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' +require 'spec_helper' module Spec module Matchers @@ -16,18 +16,9 @@ This module should provide the following methods, each of which returns a Matche it "be_arbitrary_predicate" do be_arbitrary_predicate.should be_an_instance_of(Be) end - it "be_close" do - be_close(1,2).should be_an_instance_of(BeClose) - end it "change" do change("target", :message).should be_an_instance_of(Change) end - it "eql" do - eql(:expected).should be_an_instance_of(Eql) - end - it "equal" do - equal(:expected).should be_an_instance_of(Equal) - end it "have" do have(0).should be_an_instance_of(Have) end @@ -40,12 +31,6 @@ This module should provide the following methods, each of which returns a Matche it "have_at_most" do have_at_most(0).should be_an_instance_of(Have) end - it "include" do - include(:value).should be_an_instance_of(Include) - end - it "match" do - match(:value).should be_an_instance_of(Match) - end it "raise_error" do raise_error.should be_an_instance_of(RaiseError) raise_error(NoMethodError).should be_an_instance_of(RaiseError) diff --git a/vendor/plugins/rspec/spec/spec/matchers/mock_constraint_matchers_spec.rb b/vendor/plugins/rspec/spec/spec/matchers/mock_constraint_matchers_spec.rb deleted file mode 100644 index 1292918c7..000000000 --- a/vendor/plugins/rspec/spec/spec/matchers/mock_constraint_matchers_spec.rb +++ /dev/null @@ -1,24 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' - -describe "The anything() mock argument constraint matcher" do - specify { anything.should == Object.new } - specify { anything.should == Class } - specify { anything.should == 1 } - specify { anything.should == "a string" } - specify { anything.should == :a_symbol } -end - -describe "The boolean() mock argument constraint matcher" do - specify { boolean.should == true } - specify { boolean.should == false } - specify { boolean.should_not == Object.new } - specify { boolean.should_not == Class } - specify { boolean.should_not == 1 } - specify { boolean.should_not == "a string" } - specify { boolean.should_not == :a_symbol } -end - -describe "The an_instance_of() mock argument constraint matcher" do - # NOTE - this is implemented as a predicate_matcher - see example_group_methods.rb - specify { an_instance_of(String).should == "string" } -end diff --git a/vendor/plugins/rspec/spec/spec/matchers/operator_matcher_spec.rb b/vendor/plugins/rspec/spec/spec/matchers/operator_matcher_spec.rb index 1985df0d9..86e637e0f 100644 --- a/vendor/plugins/rspec/spec/spec/matchers/operator_matcher_spec.rb +++ b/vendor/plugins/rspec/spec/spec/matchers/operator_matcher_spec.rb @@ -1,6 +1,6 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' +require 'spec_helper' -require 'spec/expectations/differs/default' +require 'spec/runner/differs/default' describe "should ==" do @@ -10,12 +10,17 @@ describe "should ==" do subject.should == "apple" end + it "should return true on success" do + subject = "apple" + (subject.should == "apple").should be_true + end + it "should fail when target.==(actual) returns false" do subject = "apple" Spec::Expectations.should_receive(:fail_with).with(%[expected: "orange",\n got: "apple" (using ==)], "orange", "apple") subject.should == "orange" end - + end describe "should_not ==" do @@ -26,12 +31,17 @@ describe "should_not ==" do subject.should_not == "apple" end + it "should return true on success" do + subject = "apple" + (subject.should_not == "orange").should be_false + end + it "should fail when target.==(actual) returns false" do subject = "apple" Spec::Expectations.should_receive(:fail_with).with(%[expected not: == "apple",\n got: "apple"], "apple", "apple") subject.should_not == "apple" end - + end describe "should ===" do @@ -156,3 +166,26 @@ describe "should <=" do end +describe Spec::Matchers::PositiveOperatorMatcher do + + it "should work when the target has implemented #send" do + o = Object.new + def o.send(*args); raise "DOH! Library developers shouldn't use #send!" end + lambda { + o.should == o + }.should_not raise_error + end + +end + +describe Spec::Matchers::NegativeOperatorMatcher do + + it "should work when the target has implemented #send" do + o = Object.new + def o.send(*args); raise "DOH! Library developers shouldn't use #send!" end + lambda { + o.should_not == :foo + }.should_not raise_error + end + +end diff --git a/vendor/plugins/rspec/spec/spec/matchers/raise_error_spec.rb b/vendor/plugins/rspec/spec/spec/matchers/raise_error_spec.rb index a500d3b50..785065adc 100644 --- a/vendor/plugins/rspec/spec/spec/matchers/raise_error_spec.rb +++ b/vendor/plugins/rspec/spec/spec/matchers/raise_error_spec.rb @@ -1,4 +1,4 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' +require 'spec_helper' describe "should raise_error" do it "should pass if anything is raised" do @@ -12,6 +12,24 @@ describe "should raise_error" do end end +describe "should raise_error {|err| ... }" do + it "passes if there is an error" do + ran = false + lambda { non_existent_method }.should raise_error {|e| + ran = true + } + ran.should be_true + end + + it "passes the error to the block" do + error = nil + lambda { non_existent_method }.should raise_error {|e| + error = e + } + error.should be_kind_of(NameError) + end +end + describe "should_not raise_error" do it "should pass if nothing is raised" do lambda {}.should_not raise_error @@ -100,8 +118,8 @@ describe "should_not raise_error(NamedError)" do it "should fail if named error is raised" do lambda { - lambda { non_existent_method }.should_not raise_error(NameError) - }.should fail_with(/expected no NameError, got #<NameError: undefined/) + lambda { 1 + 'b' }.should_not raise_error(TypeError) + }.should fail_with(/expected no TypeError, got #<TypeError: String can't be/) end end diff --git a/vendor/plugins/rspec/spec/spec/matchers/respond_to_spec.rb b/vendor/plugins/rspec/spec/spec/matchers/respond_to_spec.rb index 2cdbbcd63..8d8f3c1ac 100644 --- a/vendor/plugins/rspec/spec/spec/matchers/respond_to_spec.rb +++ b/vendor/plugins/rspec/spec/spec/matchers/respond_to_spec.rb @@ -1,54 +1,116 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' +require 'spec_helper' describe "should respond_to(:sym)" do - it "should pass if target responds to :sym" do + it "passes if target responds to :sym" do Object.new.should respond_to(:methods) end - it "should fail target does not respond to :sym" do + it "fails if target does not respond to :sym" do lambda { - Object.new.should respond_to(:some_method) - }.should fail_with("expected target to respond to :some_method") + "this string".should respond_to(:some_method) + }.should fail_with(%q|expected "this string" to respond to :some_method|) end end +describe "should respond_to(:sym).with(1).argument" do + it "passes if target responds to :sym with 1 arg" do + obj = Object.new + def obj.foo(arg); end + obj.should respond_to(:foo).with(1).argument + end + + it "fails if target does not respond to :sym" do + obj = Object.new + lambda { + obj.should respond_to(:some_method).with(1).argument + }.should fail_with(/expected .* to respond to :some_method/) + end + + it "fails if :sym expects 0 args" do + obj = Object.new + def obj.foo; end + lambda { + obj.should respond_to(:foo).with(1).argument + }.should fail_with(/expected #<Object.*> to respond to :foo with 1 argument/) + end + + it "fails if :sym expects 2 args" do + obj = Object.new + def obj.foo(arg, arg2); end + lambda { + obj.should respond_to(:foo).with(1).argument + }.should fail_with(/expected #<Object.*> to respond to :foo with 1 argument/) + end +end + describe "should respond_to(message1, message2)" do - it "should pass if target responds to both messages" do + it "passes if target responds to both messages" do Object.new.should respond_to('methods', 'inspect') end - it "should fail target does not respond to first message" do + it "fails if target does not respond to first message" do lambda { Object.new.should respond_to('method_one', 'inspect') - }.should fail_with('expected target to respond to "method_one"') + }.should fail_with(/expected #<Object:.*> to respond to "method_one"/) end - it "should fail target does not respond to second message" do + it "fails if target does not respond to second message" do lambda { Object.new.should respond_to('inspect', 'method_one') - }.should fail_with('expected target to respond to "method_one"') + }.should fail_with(/expected #<Object:.*> to respond to "method_one"/) end - it "should fail target does not respond to either message" do + it "fails if target does not respond to either message" do lambda { Object.new.should respond_to('method_one', 'method_two') - }.should fail_with('expected target to respond to "method_one", "method_two"') + }.should fail_with(/expected #<Object:.*> to respond to "method_one", "method_two"/) + end +end + +describe "should respond_to(:sym).with(2).arguments" do + it "passes if target responds to :sym with 2 args" do + obj = Object.new + def obj.foo(a1, a2); end + obj.should respond_to(:foo).with(2).arguments + end + + it "fails if target does not respond to :sym" do + obj = Object.new + lambda { + obj.should respond_to(:some_method).with(2).arguments + }.should fail_with(/expected .* to respond to :some_method/) + end + + it "fails if :sym expects 0 args" do + obj = Object.new + def obj.foo; end + lambda { + obj.should respond_to(:foo).with(2).arguments + }.should fail_with(/expected #<Object.*> to respond to :foo with 2 arguments/) + end + + it "fails if :sym expects 2 args" do + obj = Object.new + def obj.foo(arg); end + lambda { + obj.should respond_to(:foo).with(2).arguments + }.should fail_with(/expected #<Object.*> to respond to :foo with 2 arguments/) end end describe "should_not respond_to(:sym)" do - it "should pass if target does not respond to :sym" do + it "passes if target does not respond to :sym" do Object.new.should_not respond_to(:some_method) end - it "should fail target responds to :sym" do + it "fails if target responds to :sym" do lambda { Object.new.should_not respond_to(:methods) - }.should fail_with("expected target not to respond to :methods") + }.should fail_with(/expected #<Object:.*> not to respond to :methods/) end end diff --git a/vendor/plugins/rspec/spec/spec/matchers/satisfy_spec.rb b/vendor/plugins/rspec/spec/spec/matchers/satisfy_spec.rb index 7e8d6f972..e50c395a6 100644 --- a/vendor/plugins/rspec/spec/spec/matchers/satisfy_spec.rb +++ b/vendor/plugins/rspec/spec/spec/matchers/satisfy_spec.rb @@ -1,4 +1,4 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' +require 'spec_helper' describe "should satisfy { block }" do it "should pass if block returns true" do diff --git a/vendor/plugins/rspec/spec/spec/matchers/simple_matcher_spec.rb b/vendor/plugins/rspec/spec/spec/matchers/simple_matcher_spec.rb index b731af92d..8071a9f31 100644 --- a/vendor/plugins/rspec/spec/spec/matchers/simple_matcher_spec.rb +++ b/vendor/plugins/rspec/spec/spec/matchers/simple_matcher_spec.rb @@ -1,9 +1,9 @@ -require File.dirname(__FILE__) + '/../../spec_helper' +require 'spec_helper' module Spec module Matchers describe SimpleMatcher do - it "should match pass match arg to block" do + it "should pass match arg to block" do actual = nil matcher = simple_matcher("message") do |given| actual = given end matcher.matches?("foo") @@ -22,10 +22,72 @@ module Spec matcher.negative_failure_message.should =~ /expected not to get \"thing\", but got \"other\"/ end - it "should provide a description" do + it "should provide the given description" do matcher = simple_matcher("thing") do end matcher.description.should =="thing" end + + it "should fail if a wrapped 'should' fails" do + matcher = simple_matcher("should fail") do + 2.should == 3 + end + lambda do + matcher.matches?("anything").should be_true + end.should fail_with(/expected: 3/) + end + end + + describe "with arity of 2" do + it "should provide the matcher so you can access its messages" do + provided_matcher = nil + matcher = simple_matcher("thing") do |given, matcher| + provided_matcher = matcher + end + matcher.matches?("anything") + provided_matcher.should equal(matcher) + end + + it "should support a custom failure message" do + matcher = simple_matcher("thing") do |given, matcher| + matcher.failure_message = "custom message" + end + matcher.matches?("other") + matcher.failure_message.should == "custom message" + end + + it "should complain when asked for a failure message if you don't give it a description or a message" do + matcher = simple_matcher do |given, matcher| end + matcher.matches?("other") + matcher.failure_message.should =~ /No description provided/ + end + + it "should support a custom negative failure message" do + matcher = simple_matcher("thing") do |given, matcher| + matcher.negative_failure_message = "custom message" + end + matcher.matches?("other") + matcher.negative_failure_message.should == "custom message" + end + + it "should complain when asked for a negative failure message if you don't give it a description or a message" do + matcher = simple_matcher do |given, matcher| end + matcher.matches?("other") + matcher.negative_failure_message.should =~ /No description provided/ + end + + it "should support a custom description" do + matcher = simple_matcher("thing") do |given, matcher| + matcher.description = "custom message" + end + matcher.matches?("description") + matcher.description.should == "custom message" + end + + it "should tell you no description was provided when it doesn't receive one" do + matcher = simple_matcher do end + matcher.description.should =~ /No description provided/ + end end + end end
\ No newline at end of file diff --git a/vendor/plugins/rspec/spec/spec/matchers/throw_symbol_spec.rb b/vendor/plugins/rspec/spec/spec/matchers/throw_symbol_spec.rb index 74595659a..402f812fc 100644 --- a/vendor/plugins/rspec/spec/spec/matchers/throw_symbol_spec.rb +++ b/vendor/plugins/rspec/spec/spec/matchers/throw_symbol_spec.rb @@ -1,53 +1,95 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' +require 'spec_helper' module Spec module Matchers - describe ThrowSymbol, "(constructed with no Symbol)" do - before(:each) { @matcher = ThrowSymbol.new } - - it "should match if any Symbol is thrown" do - @matcher.matches?(lambda{ throw :sym }).should be_true - end - it "should not match if no Symbol is thrown" do - @matcher.matches?(lambda{ }).should be_false - end - it "should provide a failure message" do - @matcher.matches?(lambda{}) - @matcher.failure_message.should == "expected a Symbol but nothing was thrown" - end - it "should provide a negative failure message" do - @matcher.matches?(lambda{ throw :sym}) - @matcher.negative_failure_message.should == "expected no Symbol, got :sym" - end - end - - describe ThrowSymbol, "(constructed with a Symbol)" do - before(:each) { @matcher = ThrowSymbol.new(:sym) } + describe ThrowSymbol do + describe "with no args" do + before(:each) { @matcher = ThrowSymbol.new } - it "should match if correct Symbol is thrown" do - @matcher.matches?(lambda{ throw :sym }).should be_true + it "should match if any Symbol is thrown" do + @matcher.matches?(lambda{ throw :sym }).should be_true + end + it "should match if any Symbol is thrown with an arg" do + @matcher.matches?(lambda{ throw :sym, "argument" }).should be_true + end + it "should not match if no Symbol is thrown" do + @matcher.matches?(lambda{ }).should be_false + end + it "should provide a failure message" do + @matcher.matches?(lambda{}) + @matcher.failure_message_for_should.should == "expected a Symbol but nothing was thrown" + end + it "should provide a negative failure message" do + @matcher.matches?(lambda{ throw :sym}) + @matcher.failure_message_for_should_not.should == "expected no Symbol, got :sym" + end end - it "should not match if no Symbol is thrown" do - @matcher.matches?(lambda{ }).should be_false - end - it "should not match if correct Symbol is thrown" do - @matcher.matches?(lambda{ throw :other_sym }).should be_false - @matcher.failure_message.should == "expected :sym, got :other_sym" - end - it "should provide a failure message when no Symbol is thrown" do - @matcher.matches?(lambda{}) - @matcher.failure_message.should == "expected :sym but nothing was thrown" - end - it "should provide a failure message when wrong Symbol is thrown" do - @matcher.matches?(lambda{ throw :other_sym }) - @matcher.failure_message.should == "expected :sym, got :other_sym" - end - it "should provide a negative failure message" do - @matcher.matches?(lambda{ throw :sym }) - @matcher.negative_failure_message.should == "expected :sym not to be thrown" + + describe "with a symbol" do + before(:each) { @matcher = ThrowSymbol.new(:sym) } + + it "should match if correct Symbol is thrown" do + @matcher.matches?(lambda{ throw :sym }).should be_true + end + it "should match if correct Symbol is thrown with an arg" do + @matcher.matches?(lambda{ throw :sym, "argument" }).should be_true + end + it "should not match if no Symbol is thrown" do + @matcher.matches?(lambda{ }).should be_false + end + it "should not match if correct Symbol is thrown" do + @matcher.matches?(lambda{ throw :other_sym }).should be_false + end + it "should provide a failure message when no Symbol is thrown" do + @matcher.matches?(lambda{}) + @matcher.failure_message_for_should.should == "expected :sym but nothing was thrown" + end + it "should provide a failure message when wrong Symbol is thrown" do + @matcher.matches?(lambda{ throw :other_sym }) + @matcher.failure_message_for_should.should == "expected :sym, got :other_sym" + end + it "should provide a negative failure message" do + @matcher.matches?(lambda{ throw :sym }) + @matcher.failure_message_for_should_not.should == "expected :sym not to be thrown" + end + it "should only match NameErrors raised by uncaught throws" do + @matcher.matches?(lambda{ sym }).should be_false + end end - it "should only match NameErrors raised by uncaught throws" do - @matcher.matches?(lambda{ sym }).should be_false + + describe "with a symbol and an arg" do + before(:each) { @matcher = ThrowSymbol.new(:sym, "a") } + + it "should match if correct Symbol and args are thrown" do + @matcher.matches?(lambda{ throw :sym, "a" }).should be_true + end + it "should not match if nothing is thrown" do + @matcher.matches?(lambda{ }).should be_false + end + it "should not match if other Symbol is thrown" do + @matcher.matches?(lambda{ throw :other_sym, "a" }).should be_false + end + it "should not match if no arg is thrown" do + @matcher.matches?(lambda{ throw :sym }).should be_false + end + it "should not match if wrong arg is thrown" do + @matcher.matches?(lambda{ throw :sym, "b" }).should be_false + end + it "should provide a failure message when no Symbol is thrown" do + @matcher.matches?(lambda{}) + @matcher.failure_message_for_should.should == %q[expected :sym with "a" but nothing was thrown] + end + it "should provide a failure message when wrong Symbol is thrown" do + @matcher.matches?(lambda{ throw :other_sym }) + @matcher.failure_message_for_should.should == %q[expected :sym with "a", got :other_sym] + end + it "should provide a negative failure message" do + @matcher.matches?(lambda{ throw :sym }) + @matcher.failure_message_for_should_not.should == %q[expected :sym with "a" not to be thrown] + end + it "should only match NameErrors raised by uncaught throws" do + @matcher.matches?(lambda{ sym }).should be_false + end end end end diff --git a/vendor/plugins/rspec/spec/spec/mocks/any_number_of_times_spec.rb b/vendor/plugins/rspec/spec/spec/mocks/any_number_of_times_spec.rb index 3f50dcfc5..9a3f6edaf 100644 --- a/vendor/plugins/rspec/spec/spec/mocks/any_number_of_times_spec.rb +++ b/vendor/plugins/rspec/spec/spec/mocks/any_number_of_times_spec.rb @@ -1,4 +1,4 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' +require 'spec_helper' module Spec module Mocks @@ -23,6 +23,13 @@ module Spec it "should pass if any number of times method is not called" do @mock.should_receive(:random_call).any_number_of_times end + + it "should return the mocked value when called after a similar stub" do + @mock.stub!(:message).and_return :stub_value + @mock.should_receive(:message).any_number_of_times.and_return(:mock_value) + @mock.message.should == :mock_value + @mock.message.should == :mock_value + end end end diff --git a/vendor/plugins/rspec/spec/spec/mocks/argument_expectation_spec.rb b/vendor/plugins/rspec/spec/spec/mocks/argument_expectation_spec.rb index 2bebbdd4f..496f7507c 100644 --- a/vendor/plugins/rspec/spec/spec/mocks/argument_expectation_spec.rb +++ b/vendor/plugins/rspec/spec/spec/mocks/argument_expectation_spec.rb @@ -1,4 +1,4 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' +require 'spec_helper' module Spec module Mocks diff --git a/vendor/plugins/rspec/spec/spec/mocks/at_least_spec.rb b/vendor/plugins/rspec/spec/spec/mocks/at_least_spec.rb index 01b133dc3..0b76d3213 100644 --- a/vendor/plugins/rspec/spec/spec/mocks/at_least_spec.rb +++ b/vendor/plugins/rspec/spec/spec/mocks/at_least_spec.rb @@ -1,4 +1,4 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' +require 'spec_helper' module Spec module Mocks diff --git a/vendor/plugins/rspec/spec/spec/mocks/at_most_spec.rb b/vendor/plugins/rspec/spec/spec/mocks/at_most_spec.rb index f3c5e2150..744c9ff1b 100644 --- a/vendor/plugins/rspec/spec/spec/mocks/at_most_spec.rb +++ b/vendor/plugins/rspec/spec/spec/mocks/at_most_spec.rb @@ -1,4 +1,4 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' +require 'spec_helper' module Spec module Mocks diff --git a/vendor/plugins/rspec/spec/spec/mocks/bug_report_10260_spec.rb b/vendor/plugins/rspec/spec/spec/mocks/bug_report_10260_spec.rb index 2f7b5803d..783782f64 100644 --- a/vendor/plugins/rspec/spec/spec/mocks/bug_report_10260_spec.rb +++ b/vendor/plugins/rspec/spec/spec/mocks/bug_report_10260_spec.rb @@ -1,4 +1,4 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' +require 'spec_helper' describe "An RSpec Mock" do it "should hide internals in its inspect representation" do diff --git a/vendor/plugins/rspec/spec/spec/mocks/bug_report_10263_spec.rb b/vendor/plugins/rspec/spec/spec/mocks/bug_report_10263_spec.rb index e32192257..8a0bc505f 100644 --- a/vendor/plugins/rspec/spec/spec/mocks/bug_report_10263_spec.rb +++ b/vendor/plugins/rspec/spec/spec/mocks/bug_report_10263_spec.rb @@ -7,7 +7,10 @@ describe "Mock" do @mock.should_receive(:msg) do |b| b.should be_true #this call exposes the problem end - @mock.msg(false) rescue nil + begin + @mock.msg(false) + rescue Exception + end end specify "then the next example should behave as expected instead of saying" do @@ -17,7 +20,7 @@ describe "Mock" do begin @mock.foobar rescue Exception => e - e.message.should == "Mock 'test mock' received unexpected message :foobar with (no args)" + e.message.should == "Mock \"test mock\" received unexpected message :foobar with (no args)" end end end diff --git a/vendor/plugins/rspec/spec/spec/mocks/bug_report_11545_spec.rb b/vendor/plugins/rspec/spec/spec/mocks/bug_report_11545_spec.rb index 212a50e9f..7eb7c6e45 100644 --- a/vendor/plugins/rspec/spec/spec/mocks/bug_report_11545_spec.rb +++ b/vendor/plugins/rspec/spec/spec/mocks/bug_report_11545_spec.rb @@ -1,13 +1,11 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' +require 'spec_helper' class LiarLiarPantsOnFire - include Spec::MetaClass - extend Spec::MetaClass - def respond_to?(sym) + def respond_to?(sym, incl_private=false) true end - def self.respond_to?(sym) + def self.respond_to?(sym, incl_private=false) true end end @@ -28,6 +26,7 @@ describe 'should_receive' do end it 'should cleanup after itself' do - LiarLiarPantsOnFire.metaclass.instance_methods.should_not include("something") + (class << LiarLiarPantsOnFire; self; end).instance_methods.should_not include("something") end end + diff --git a/vendor/plugins/rspec/spec/spec/mocks/bug_report_15719_spec.rb b/vendor/plugins/rspec/spec/spec/mocks/bug_report_15719_spec.rb index 82d49ea97..efd7a7824 100644 --- a/vendor/plugins/rspec/spec/spec/mocks/bug_report_15719_spec.rb +++ b/vendor/plugins/rspec/spec/spec/mocks/bug_report_15719_spec.rb @@ -1,4 +1,4 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' +require 'spec_helper' module Spec module Mocks @@ -9,7 +9,7 @@ module Spec m.should_receive(:bar).with("message") lambda { m.bar("different message") - }.should raise_error(Spec::Mocks::MockExpectationError, %Q{Mock 'foo' expected :bar with ("message") but received it with ("different message")}) + }.should raise_error(Spec::Mocks::MockExpectationError, %Q{Mock "foo" received :bar with unexpected arguments\n expected: ("message")\n got: ("different message")}) m.bar("message") # allows the spec to pass end @@ -22,7 +22,7 @@ module Spec m.should_receive(:bar).with("message") lambda { m.bar("different message") - }.should raise_error(Spec::Mocks::MockExpectationError, %Q{Mock 'foo' expected :bar with ("message") but received it with ("different message")}) + }.should raise_error(Spec::Mocks::MockExpectationError, %Q{Mock "foo" received :bar with unexpected arguments\n expected: ("message")\n got: ("different message")}) m.bar("message") # allows the spec to pass end end diff --git a/vendor/plugins/rspec/spec/spec/mocks/bug_report_7611_spec.rb b/vendor/plugins/rspec/spec/spec/mocks/bug_report_7611_spec.rb index 6c9705bcc..ff1ef8795 100644 --- a/vendor/plugins/rspec/spec/spec/mocks/bug_report_7611_spec.rb +++ b/vendor/plugins/rspec/spec/spec/mocks/bug_report_7611_spec.rb @@ -1,4 +1,4 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' +require 'spec_helper' module Bug7611 class Foo diff --git a/vendor/plugins/rspec/spec/spec/mocks/bug_report_7805_spec.rb b/vendor/plugins/rspec/spec/spec/mocks/bug_report_7805_spec.rb index f7edfac17..9a3d493d9 100644 --- a/vendor/plugins/rspec/spec/spec/mocks/bug_report_7805_spec.rb +++ b/vendor/plugins/rspec/spec/spec/mocks/bug_report_7805_spec.rb @@ -1,4 +1,4 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' +require 'spec_helper' module Bug7805 #This is really a duplicate of 8302 diff --git a/vendor/plugins/rspec/spec/spec/mocks/bug_report_8165_spec.rb b/vendor/plugins/rspec/spec/spec/mocks/bug_report_8165_spec.rb index 7edc3c076..8d8d01772 100644 --- a/vendor/plugins/rspec/spec/spec/mocks/bug_report_8165_spec.rb +++ b/vendor/plugins/rspec/spec/spec/mocks/bug_report_8165_spec.rb @@ -1,4 +1,4 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' +require 'spec_helper' describe "An object where respond_to? is true and does not have method" do # When should_receive(:sym) is sent to any object, the Proxy sends diff --git a/vendor/plugins/rspec/spec/spec/mocks/bug_report_8302_spec.rb b/vendor/plugins/rspec/spec/spec/mocks/bug_report_8302_spec.rb index a41df43d8..55d8d3acd 100644 --- a/vendor/plugins/rspec/spec/spec/mocks/bug_report_8302_spec.rb +++ b/vendor/plugins/rspec/spec/spec/mocks/bug_report_8302_spec.rb @@ -1,4 +1,4 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' +require 'spec_helper' module Bug8302 class Foo diff --git a/vendor/plugins/rspec/spec/spec/mocks/failing_mock_argument_constraints_spec.rb b/vendor/plugins/rspec/spec/spec/mocks/failing_mock_argument_constraints_spec.rb deleted file mode 100644 index 3993cbfc6..000000000 --- a/vendor/plugins/rspec/spec/spec/mocks/failing_mock_argument_constraints_spec.rb +++ /dev/null @@ -1,123 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' - -module Spec - module Mocks - describe "failing MockArgumentConstraints" do - before(:each) do - @mock = mock("test mock") - @reporter = Mock.new("reporter", :null_object => true) - end - - after(:each) do - @mock.rspec_reset - end - - it "should reject non boolean" do - @mock.should_receive(:random_call).with(boolean()) - lambda do - @mock.random_call("false") - end.should raise_error(MockExpectationError) - end - - it "should reject non numeric" do - @mock.should_receive(:random_call).with(an_instance_of(Numeric)) - lambda do - @mock.random_call("1") - end.should raise_error(MockExpectationError) - end - - it "should reject non string" do - @mock.should_receive(:random_call).with(an_instance_of(String)) - lambda do - @mock.random_call(123) - end.should raise_error(MockExpectationError) - end - - it "should reject goose when expecting a duck" do - @mock.should_receive(:random_call).with(duck_type(:abs, :div)) - lambda { @mock.random_call("I don't respond to :abs or :div") }.should raise_error(MockExpectationError) - end - - it "should fail if regexp does not match submitted string" do - @mock.should_receive(:random_call).with(/bcd/) - lambda { @mock.random_call("abc") }.should raise_error(MockExpectationError) - end - - it "should fail if regexp does not match submitted regexp" do - @mock.should_receive(:random_call).with(/bcd/) - lambda { @mock.random_call(/bcde/) }.should raise_error(MockExpectationError) - end - - it "should fail for a hash w/ wrong values" do - @mock.should_receive(:random_call).with(:a => "b", :c => "d") - lambda do - @mock.random_call(:a => "b", :c => "e") - end.should raise_error(MockExpectationError, /Mock 'test mock' expected :random_call with \(\{(:a=>\"b\", :c=>\"d\"|:c=>\"d\", :a=>\"b\")\}\) but received it with \(\{(:a=>\"b\", :c=>\"e\"|:c=>\"e\", :a=>\"b\")\}\)/) - end - - it "should fail for a hash w/ wrong keys" do - @mock.should_receive(:random_call).with(:a => "b", :c => "d") - lambda do - @mock.random_call("a" => "b", "c" => "d") - end.should raise_error(MockExpectationError, /Mock 'test mock' expected :random_call with \(\{(:a=>\"b\", :c=>\"d\"|:c=>\"d\", :a=>\"b\")\}\) but received it with \(\{(\"a\"=>\"b\", \"c\"=>\"d\"|\"c\"=>\"d\", \"a\"=>\"b\")\}\)/) - end - - it "should match against a Matcher" do - lambda do - @mock.should_receive(:msg).with(equal(3)) - @mock.msg(37) - end.should raise_error(MockExpectationError, "Mock 'test mock' expected :msg with (equal 3) but received it with (37)") - end - - it "should fail no_args with one arg" do - lambda do - @mock.should_receive(:msg).with(no_args) - @mock.msg(37) - end.should raise_error(MockExpectationError, "Mock 'test mock' expected :msg with (no args) but received it with (37)") - end - - it "should fail hash_including with missing key" do - lambda do - @mock.should_receive(:msg).with(hash_including(:a => 1)) - @mock.msg({}) - end.should raise_error(MockExpectationError, "Mock 'test mock' expected :msg with (hash_including(:a=>1)) but received it with ({})") - end - - end - - describe "failing deprecated MockArgumentConstraints" do - before(:each) do - @mock = mock("test mock") - @reporter = Mock.new("reporter", :null_object => true) - Kernel.stub!(:warn) - end - - after(:each) do - @mock.rspec_reset - end - - it "should reject non boolean" do - @mock.should_receive(:random_call).with(:boolean) - lambda do - @mock.random_call("false") - end.should raise_error(MockExpectationError) - end - - it "should reject non numeric" do - @mock.should_receive(:random_call).with(:numeric) - lambda do - @mock.random_call("1") - end.should raise_error(MockExpectationError) - end - - it "should reject non string" do - @mock.should_receive(:random_call).with(:string) - lambda do - @mock.random_call(123) - end.should raise_error(MockExpectationError) - end - - - end - end -end diff --git a/vendor/plugins/rspec/spec/spec/mocks/hash_including_matcher_spec.rb b/vendor/plugins/rspec/spec/spec/mocks/hash_including_matcher_spec.rb index 29fae3101..d757f619a 100644 --- a/vendor/plugins/rspec/spec/spec/mocks/hash_including_matcher_spec.rb +++ b/vendor/plugins/rspec/spec/spec/mocks/hash_including_matcher_spec.rb @@ -1,32 +1,90 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' +require 'spec_helper' module Spec module Mocks - describe HashIncludingConstraint do - - it "should match the same hash" do - hash_including(:a => 1).matches?(:a => 1).should be_true - end - - it "should not match a non-hash" do - hash_including(:a => 1).matches?(1).should_not be_true - end + module ArgumentMatchers + describe HashIncludingMatcher do + + it "should describe itself properly" do + HashIncludingMatcher.new(:a => 1).description.should == "hash_including(:a=>1)" + end - it "should match a hash with extra stuff" do - hash_including(:a => 1).matches?(:a => 1, :b => 2).should be_true - end - - it "should not match a hash with a missing key" do - hash_including(:a => 1).matches?(:b => 2).should_not be_true - end + describe "passing" do + it "should match the same hash" do + hash_including(:a => 1).should == {:a => 1} + end - it "should not match a hash with an incorrect value" do - hash_including(:a => 1, :b => 2).matches?(:a => 1, :b => 3).should_not be_true - end + it "should match a hash with extra stuff" do + hash_including(:a => 1).should == {:a => 1, :b => 2} + end + + describe "when matching against other matchers" do + it "should match an int against anything()" do + hash_including(:a => anything, :b => 2).should == {:a => 1, :b => 2} + end - it "should describe itself properly" do - HashIncludingConstraint.new(:a => 1).description.should == "hash_including(:a=>1)" - end + it "should match a string against anything()" do + hash_including(:a => anything, :b => 2).should == {:a => "1", :b => 2} + end + end + + describe "when passed only keys or keys mixed with key/value pairs" do + it "should match if the key is present" do + hash_including(:a).should == {:a => 1, :b => 2} + end + + it "should match if more keys are present" do + hash_including(:a, :b).should == {:a => 1, :b => 2, :c => 3} + end + + it "should match a string against a given key" do + hash_including(:a).should == {:a => "1", :b => 2} + end + + it "should match if passed one key and one key/value pair" do + hash_including(:a, :b => 2).should == {:a => 1, :b => 2} + end + + it "should match if passed many keys and one key/value pair" do + hash_including(:a, :b, :c => 3).should == {:a => 1, :b => 2, :c => 3, :d => 4} + end + + it "should match if passed many keys and many key/value pairs" do + hash_including(:a, :b, :c => 3, :e => 5).should == {:a => 1, :b => 2, :c => 3, :d => 4, :e => 5} + end + end + end + + describe "failing" do + it "should not match a non-hash" do + hash_including(:a => 1).should_not == 1 + end + + it "should not match a hash with a missing key" do + hash_including(:a => 1).should_not == {:b => 2} + end + + it "should not match a hash with a missing key" do + hash_including(:a).should_not == {:b => 2} + end + + it "should not match an empty hash with a given key" do + hash_including(:a).should_not == {} + end + + it "should not match a hash with a missing key when one pair is matching" do + hash_including(:a, :b => 2).should_not == {:b => 2} + end + + it "should not match a hash with an incorrect value" do + hash_including(:a => 1, :b => 2).should_not == {:a => 1, :b => 3} + end + + it "should not match when values are nil but keys are different" do + hash_including(:a => nil).should_not == {:b => nil} + end + end + end end - end -end
\ No newline at end of file + end +end diff --git a/vendor/plugins/rspec/spec/spec/mocks/mock_ordering_spec.rb b/vendor/plugins/rspec/spec/spec/mocks/mock_ordering_spec.rb index 919da2970..4bd15478f 100644 --- a/vendor/plugins/rspec/spec/spec/mocks/mock_ordering_spec.rb +++ b/vendor/plugins/rspec/spec/spec/mocks/mock_ordering_spec.rb @@ -1,4 +1,4 @@ -require File.dirname(__FILE__) + '/../../spec_helper' +require 'spec_helper' module Spec module Mocks @@ -36,7 +36,7 @@ module Spec @mock.should_receive(:two).ordered lambda do @mock.two - end.should raise_error(MockExpectationError, "Mock 'test mock' received :two out of order") + end.should raise_error(MockExpectationError, "Mock \"test mock\" received :two out of order") end it "should fail if third call comes first" do @@ -46,7 +46,7 @@ module Spec @mock.one lambda do @mock.three - end.should raise_error(MockExpectationError, "Mock 'test mock' received :three out of order") + end.should raise_error(MockExpectationError, "Mock \"test mock\" received :three out of order") end it "should fail if third call comes second" do @@ -56,7 +56,7 @@ module Spec @mock.one lambda do @mock.three - end.should raise_error(MockExpectationError, "Mock 'test mock' received :three out of order") + end.should raise_error(MockExpectationError, "Mock \"test mock\" received :three out of order") end it "should ignore order of non ordered calls" do @@ -78,6 +78,16 @@ module Spec @mock.ignored_1 @mock.rspec_verify end + + it "should pass when duplicates exist" do + @mock.should_receive(:a).ordered + @mock.should_receive(:b).ordered + @mock.should_receive(:a).ordered + + @mock.a + @mock.b + @mock.a + end end end diff --git a/vendor/plugins/rspec/spec/spec/mocks/mock_space_spec.rb b/vendor/plugins/rspec/spec/spec/mocks/mock_space_spec.rb index 23ffd01bc..878239307 100644 --- a/vendor/plugins/rspec/spec/spec/mocks/mock_space_spec.rb +++ b/vendor/plugins/rspec/spec/spec/mocks/mock_space_spec.rb @@ -1,4 +1,4 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' +require 'spec_helper' require 'spec/mocks' module Spec diff --git a/vendor/plugins/rspec/spec/spec/mocks/mock_spec.rb b/vendor/plugins/rspec/spec/spec/mocks/mock_spec.rb index f6d377f7d..9c636a338 100644 --- a/vendor/plugins/rspec/spec/spec/mocks/mock_spec.rb +++ b/vendor/plugins/rspec/spec/spec/mocks/mock_spec.rb @@ -1,17 +1,33 @@ -require File.dirname(__FILE__) + '/../../spec_helper' +require 'spec_helper' module Spec module Mocks describe Mock do - + treats_method_missing_as_private :subject => Mock.new, :noop => false + before(:each) do @mock = mock("test mock") end - + after(:each) do @mock.rspec_reset end - + + describe "deprecated #stub_everything method" do + before(:each) do + Kernel.stub!(:warn) + end + + it "creates a mock that behaves as a null object" do + stub_everything.should be_null_object + end + + it "provides deprecation warning" do + Kernel.should_receive(:warn).with(/DEPRECATION: stub_everything.* is deprecated./) + stub_everything + end + end + it "should report line number of expectation of unreceived message" do expected_error_line = __LINE__; @mock.should_receive(:wont_happen).with("x", 3) begin @@ -22,92 +38,104 @@ module Spec e.backtrace[0].should match(/#{File.basename(__FILE__)}:#{expected_error_line}/) end end - + + it "should report line number of expectation of unreceived message after #should_receive after similar stub" do + @mock.stub!(:wont_happen) + expected_error_line = __LINE__; @mock.should_receive(:wont_happen).with("x", 3) + begin + @mock.rspec_verify + violated + rescue MockExpectationError => e + # NOTE - this regexp ended w/ $, but jruby adds extra info at the end of the line + e.backtrace[0].should match(/#{File.basename(__FILE__)}:#{expected_error_line}/) + end + end + it "should pass when not receiving message specified as not to be received" do @mock.should_not_receive(:not_expected) @mock.rspec_verify end - + it "should pass when receiving message specified as not to be received with different args" do @mock.should_not_receive(:message).with("unwanted text") @mock.should_receive(:message).with("other text") @mock.message "other text" @mock.rspec_verify end - + it "should fail when receiving message specified as not to be received" do @mock.should_not_receive(:not_expected) lambda { @mock.not_expected violated - }.should raise_error(MockExpectationError, "Mock 'test mock' expected :not_expected with (no args) 0 times, but received it once") + }.should raise_error(MockExpectationError, "Mock \"test mock\" expected :not_expected with (no args) 0 times, but received it once") end - + it "should fail when receiving message specified as not to be received with args" do @mock.should_not_receive(:not_expected).with("unexpected text") lambda { @mock.not_expected("unexpected text") violated - }.should raise_error(MockExpectationError, "Mock 'test mock' expected :not_expected with (\"unexpected text\") 0 times, but received it once") + }.should raise_error(MockExpectationError, "Mock \"test mock\" expected :not_expected with (\"unexpected text\") 0 times, but received it once") end - + it "should pass when receiving message specified as not to be received with wrong args" do @mock.should_not_receive(:not_expected).with("unexpected text") @mock.not_expected "really unexpected text" @mock.rspec_verify end - + it "should allow block to calculate return values" do @mock.should_receive(:something).with("a","b","c").and_return { |a,b,c| c+b+a } @mock.something("a","b","c").should == "cba" @mock.rspec_verify end - + it "should allow parameter as return value" do @mock.should_receive(:something).with("a","b","c").and_return("booh") @mock.something("a","b","c").should == "booh" @mock.rspec_verify end - + it "should return nil if no return value set" do @mock.should_receive(:something).with("a","b","c") @mock.something("a","b","c").should be_nil @mock.rspec_verify end - + it "should raise exception if args don't match when method called" do @mock.should_receive(:something).with("a","b","c").and_return("booh") lambda { @mock.something("a","d","c") violated - }.should raise_error(MockExpectationError, "Mock 'test mock' expected :something with (\"a\", \"b\", \"c\") but received it with (\"a\", \"d\", \"c\")") + }.should raise_error(MockExpectationError, "Mock \"test mock\" received :something with unexpected arguments\n expected: (\"a\", \"b\", \"c\")\n got: (\"a\", \"d\", \"c\")") end - + it "should raise exception if args don't match when method called even when the method is stubbed" do @mock.stub!(:something) @mock.should_receive(:something).with("a","b","c") lambda { @mock.something("a","d","c") @mock.rspec_verify - }.should raise_error(MockExpectationError, "Mock 'test mock' expected :something with (\"a\", \"b\", \"c\") but received it with (\"a\", \"d\", \"c\")") + }.should raise_error(MockExpectationError, "Mock \"test mock\" received :something with unexpected arguments\n expected: (\"a\", \"b\", \"c\")\n got: ([\"a\", \"d\", \"c\"])") end - + it "should raise exception if args don't match when method called even when using null_object" do @mock = mock("test mock", :null_object => true) @mock.should_receive(:something).with("a","b","c") lambda { @mock.something("a","d","c") @mock.rspec_verify - }.should raise_error(MockExpectationError, "Mock 'test mock' expected :something with (\"a\", \"b\", \"c\") but received it with (\"a\", \"d\", \"c\")") + }.should raise_error(MockExpectationError, "Mock \"test mock\" received :something with unexpected arguments\n expected: (\"a\", \"b\", \"c\")\n got: ([\"a\", \"d\", \"c\"])") end - + it "should fail if unexpected method called" do lambda { @mock.something("a","b","c") violated - }.should raise_error(MockExpectationError, "Mock 'test mock' received unexpected message :something with (\"a\", \"b\", \"c\")") + }.should raise_error(MockExpectationError, "Mock \"test mock\" received unexpected message :something with (\"a\", \"b\", \"c\")") end - + it "should use block for expectation if provided" do @mock.should_receive(:something) do | a, b | a.should == "a" @@ -117,35 +145,35 @@ module Spec @mock.something("a", "b").should == "booh" @mock.rspec_verify end - + it "should fail if expectation block fails" do @mock.should_receive(:something) {| bool | bool.should be_true} lambda { @mock.something false - }.should raise_error(MockExpectationError, /Mock 'test mock' received :something but passed block failed with: expected true, got false/) + }.should raise_error(MockExpectationError, /Mock "test mock" received :something but passed block failed with: expected true, got false/) end - + it "should fail right away when method defined as never is received" do @mock.should_receive(:not_expected).never lambda { @mock.not_expected - }.should raise_error(MockExpectationError, "Mock 'test mock' expected :not_expected with (no args) 0 times, but received it once") + }.should raise_error(MockExpectationError, "Mock \"test mock\" expected :not_expected with (no args) 0 times, but received it once") end - + it "should eventually fail when method defined as never is received" do @mock.should_receive(:not_expected).never lambda { @mock.not_expected - }.should raise_error(MockExpectationError, "Mock 'test mock' expected :not_expected with (no args) 0 times, but received it once") + }.should raise_error(MockExpectationError, "Mock \"test mock\" expected :not_expected with (no args) 0 times, but received it once") end - + it "should raise when told to" do @mock.should_receive(:something).and_raise(RuntimeError) lambda do @mock.something end.should raise_error(RuntimeError) end - + it "should raise passed an Exception instance" do error = RuntimeError.new("error message") @mock.should_receive(:something).and_raise(error) @@ -153,28 +181,28 @@ module Spec @mock.something }.should raise_error(RuntimeError, "error message") end - + it "should raise RuntimeError with passed message" do @mock.should_receive(:something).and_raise("error message") lambda { @mock.something }.should raise_error(RuntimeError, "error message") end - + it "should not raise when told to if args dont match" do @mock.should_receive(:something).with(2).and_raise(RuntimeError) lambda { @mock.something 1 }.should raise_error(MockExpectationError) end - + it "should throw when told to" do @mock.should_receive(:something).and_throw(:blech) lambda { @mock.something }.should throw_symbol(:blech) end - + it "should raise when explicit return and block constrained" do lambda { @mock.should_receive(:fruit) do |colour| @@ -182,7 +210,7 @@ module Spec end.and_return :apple }.should raise_error(AmbiguousReturnError) end - + it "should ignore args on any args" do @mock.should_receive(:something).at_least(:once).with(any_args) @mock.something @@ -191,35 +219,35 @@ module Spec @mock.something [], {}, "joe", 7 @mock.rspec_verify end - + it "should fail on no args if any args received" do @mock.should_receive(:something).with(no_args()) lambda { @mock.something 1 - }.should raise_error(MockExpectationError, "Mock 'test mock' expected :something with (no args) but received it with (1)") + }.should raise_error(MockExpectationError, "Mock \"test mock\" received :something with unexpected arguments\n expected: (no args)\n got: (1)") end - + it "should fail when args are expected but none are received" do @mock.should_receive(:something).with(1) lambda { @mock.something - }.should raise_error(MockExpectationError, "Mock 'test mock' expected :something with (1) but received it with (no args)") + }.should raise_error(MockExpectationError, "Mock \"test mock\" received :something with unexpected arguments\n expected: (1)\n got: (no args)") end - + it "should return value from block by default" do @mock.stub!(:method_that_yields).and_yield @mock.method_that_yields { :returned_obj }.should == :returned_obj @mock.rspec_verify end - + it "should yield 0 args to blocks that take a variable number of arguments" do @mock.should_receive(:yield_back).with(no_args()).once.and_yield a = nil - @mock.yield_back {|*a|} + @mock.yield_back {|*x| a = x} a.should == [] @mock.rspec_verify end - + it "should yield 0 args multiple times to blocks that take a variable number of arguments" do @mock.should_receive(:yield_back).once.with(no_args()).once.and_yield. and_yield @@ -229,15 +257,15 @@ module Spec b.should == [ [], [] ] @mock.rspec_verify end - + it "should yield one arg to blocks that take a variable number of arguments" do @mock.should_receive(:yield_back).with(no_args()).once.and_yield(99) a = nil - @mock.yield_back {|*a|} + @mock.yield_back {|*x| a = x} a.should == [99] @mock.rspec_verify end - + it "should yield one arg 3 times consecutively to blocks that take a variable number of arguments" do @mock.should_receive(:yield_back).once.with(no_args()).once.and_yield(99). and_yield(43). @@ -248,15 +276,15 @@ module Spec b.should == [[99], [43], ["something fruity"]] @mock.rspec_verify end - + it "should yield many args to blocks that take a variable number of arguments" do @mock.should_receive(:yield_back).with(no_args()).once.and_yield(99, 27, "go") a = nil - @mock.yield_back {|*a|} + @mock.yield_back {|*x| a = x} a.should == [99, 27, "go"] @mock.rspec_verify end - + it "should yield many args 3 times consecutively to blocks that take a variable number of arguments" do @mock.should_receive(:yield_back).once.with(no_args()).once.and_yield(99, :green, "go"). and_yield("wait", :amber). @@ -267,15 +295,15 @@ module Spec b.should == [[99, :green, "go"], ["wait", :amber], ["stop", 12, :red]] @mock.rspec_verify end - + it "should yield single value" do @mock.should_receive(:yield_back).with(no_args()).once.and_yield(99) a = nil - @mock.yield_back {|a|} + @mock.yield_back {|x| a = x} a.should == 99 @mock.rspec_verify end - + it "should yield single value 3 times consecutively" do @mock.should_receive(:yield_back).once.with(no_args()).once.and_yield(99). and_yield(43). @@ -286,16 +314,16 @@ module Spec b.should == [99, 43, "something fruity"] @mock.rspec_verify end - + it "should yield two values" do @mock.should_receive(:yield_back).with(no_args()).once.and_yield('wha', 'zup') a, b = nil - @mock.yield_back {|a,b|} + @mock.yield_back {|x,y| a=x; b=y} a.should == 'wha' b.should == 'zup' @mock.rspec_verify end - + it "should yield two values 3 times consecutively" do @mock.should_receive(:yield_back).once.with(no_args()).once.and_yield('wha', 'zup'). and_yield('not', 'down'). @@ -306,14 +334,14 @@ module Spec c.should == [['wha', 'zup'], ['not', 'down'], [14, 65]] @mock.rspec_verify end - + it "should fail when calling yielding method with wrong arity" do @mock.should_receive(:yield_back).with(no_args()).once.and_yield('wha', 'zup') lambda { @mock.yield_back {|a|} - }.should raise_error(MockExpectationError, "Mock 'test mock' yielded |\"wha\", \"zup\"| to block with arity of 1") + }.should raise_error(MockExpectationError, "Mock \"test mock\" yielded |\"wha\", \"zup\"| to block with arity of 1") end - + it "should fail when calling yielding method consecutively with wrong arity" do @mock.should_receive(:yield_back).once.with(no_args()).once.and_yield('wha', 'zup'). and_yield('down'). @@ -322,79 +350,79 @@ module Spec a, b = nil c = [] @mock.yield_back {|a,b| c << [a, b]} - }.should raise_error(MockExpectationError, "Mock 'test mock' yielded |\"down\"| to block with arity of 2") + }.should raise_error(MockExpectationError, "Mock \"test mock\" yielded |\"down\"| to block with arity of 2") end - + it "should fail when calling yielding method without block" do @mock.should_receive(:yield_back).with(no_args()).once.and_yield('wha', 'zup') lambda { @mock.yield_back - }.should raise_error(MockExpectationError, "Mock 'test mock' asked to yield |[\"wha\", \"zup\"]| but no block was passed") + }.should raise_error(MockExpectationError, "Mock \"test mock\" asked to yield |[\"wha\", \"zup\"]| but no block was passed") end - + it "should be able to mock send" do @mock.should_receive(:send).with(any_args) @mock.send 'hi' @mock.rspec_verify end - + it "should be able to raise from method calling yielding mock" do @mock.should_receive(:yield_me).and_yield 44 - + lambda { @mock.yield_me do |x| raise "Bang" end }.should raise_error(StandardError, "Bang") - + @mock.rspec_verify end - + it "should clear expectations after verify" do @mock.should_receive(:foobar) @mock.foobar @mock.rspec_verify lambda { @mock.foobar - }.should raise_error(MockExpectationError, "Mock 'test mock' received unexpected message :foobar with (no args)") + }.should raise_error(MockExpectationError, "Mock \"test mock\" received unexpected message :foobar with (no args)") end - + it "should restore objects to their original state on rspec_reset" do mock = mock("this is a mock") mock.should_receive(:blah) mock.rspec_reset mock.rspec_verify #should throw if reset didn't work end - + it "should work even after method_missing starts raising NameErrors instead of NoMethodErrors" do # Object#method_missing throws either NameErrors or NoMethodErrors. # - # On a fresh ruby program Object#method_missing: + # On a fresh ruby program Object#method_missing: # * raises a NoMethodError when called directly # * raises a NameError when called indirectly # # Once Object#method_missing has been called at least once (on any object) - # it starts behaving differently: + # it starts behaving differently: # * raises a NameError when called directly # * raises a NameError when called indirectly # # There was a bug in Mock#method_missing that relied on the fact # that calling Object#method_missing directly raises a NoMethodError. # This example tests that the bug doesn't exist anymore. - - + + # Ensures that method_missing always raises NameErrors. a_method_that_doesnt_exist rescue - - + + @mock.should_receive(:foobar) @mock.foobar @mock.rspec_verify - + lambda { @mock.foobar }.should_not raise_error(NameError) lambda { @mock.foobar }.should raise_error(MockExpectationError) end - + it "should temporarily replace a method stub on a mock" do @mock.stub!(:msg).and_return(:stub_value) @mock.should_receive(:msg).with(:arg).and_return(:mock_value) @@ -403,7 +431,22 @@ module Spec @mock.msg.should equal(:stub_value) @mock.rspec_verify end - + + it "should not require a different signature to replace a method stub" do + @mock.stub!(:msg).and_return(:stub_value) + @mock.should_receive(:msg).and_return(:mock_value) + @mock.msg(:arg).should equal(:mock_value) + @mock.msg.should equal(:stub_value) + @mock.msg.should equal(:stub_value) + @mock.rspec_verify + end + + it "should raise an error when a previously stubbed method has a negative expectation" do + @mock.stub!(:msg).and_return(:stub_value) + @mock.should_not_receive(:msg).and_return(:mock_value) + lambda {@mock.msg(:arg)}.should raise_error(MockExpectationError) + end + it "should temporarily replace a method stub on a non-mock" do non_mock = Object.new non_mock.stub!(:msg).and_return(:stub_value) @@ -413,82 +456,139 @@ module Spec non_mock.msg.should equal(:stub_value) non_mock.rspec_verify end - + + it "should return the stubbed value when no new value specified" do + @mock.stub!(:msg).and_return(:stub_value) + @mock.should_receive(:msg) + @mock.msg.should equal(:stub_value) + @mock.rspec_verify + end + + it "should not mess with the stub's yielded values when also mocked" do + @mock.stub!(:yield_back).and_yield(:stub_value) + @mock.should_receive(:yield_back).and_yield(:mock_value) + @mock.yield_back{|v| v.should == :mock_value } + @mock.yield_back{|v| v.should == :stub_value } + @mock.rspec_verify + end + + it "should yield multiple values after a similar stub" do + File.stub!(:open).and_yield(:stub_value) + File.should_receive(:open).and_yield(:first_call).and_yield(:second_call) + yielded_args = [] + File.open {|v| yielded_args << v } + yielded_args.should == [:first_call, :second_call] + File.open {|v| v.should == :stub_value } + File.rspec_verify + end + it "should assign stub return values" do mock = Mock.new('name', :message => :response) mock.message.should == :response end - + end - + describe "a mock message receiving a block" do before(:each) do @mock = mock("mock") @calls = 0 end - + def add_call @calls = @calls + 1 end - + it "should call the block after #should_receive" do @mock.should_receive(:foo) { add_call } - + + @mock.foo + + @calls.should == 1 + end + + it "should call the block after #should_receive after a similar stub" do + @mock.stub!(:foo).and_return(:bar) + @mock.should_receive(:foo) { add_call } + @mock.foo - + @calls.should == 1 end - + it "should call the block after #once" do @mock.should_receive(:foo).once { add_call } - + @mock.foo - + @calls.should == 1 end - + it "should call the block after #twice" do @mock.should_receive(:foo).twice { add_call } - + @mock.foo @mock.foo - + @calls.should == 2 end - + it "should call the block after #times" do @mock.should_receive(:foo).exactly(10).times { add_call } - + (1..10).each { @mock.foo } - + @calls.should == 10 end - + it "should call the block after #any_number_of_times" do @mock.should_receive(:foo).any_number_of_times { add_call } - + (1..7).each { @mock.foo } - + @calls.should == 7 end - - it "should call the block after #with" do - @mock.should_receive(:foo).with(:arg) { add_call } - - @mock.foo(:arg) - - @calls.should == 1 - end - + it "should call the block after #ordered" do @mock.should_receive(:foo).ordered { add_call } @mock.should_receive(:bar).ordered { add_call } - + @mock.foo @mock.bar - + @calls.should == 2 end end + + describe 'string representation generated by #to_s' do + it 'should not contain < because that might lead to invalid HTML in some situations' do + mock = mock("Dog") + valid_html_str = "#{mock}" + valid_html_str.should_not include('<') + end + end + + describe "mock created with no name" do + it "should not use a name in a failure message" do + mock = mock() + expect {mock.foo}.to raise_error(/Mock received/) + end + + it "should respond to initially stubbed methods" do + mock = mock(:foo => "woo", :bar => "car") + mock.foo.should == "woo" + mock.bar.should == "car" + end + end + + describe "==" do + it "sends '== self' to the comparison object" do + first = mock('first') + second = mock('second') + + first.should_receive(:==).with(second) + second == first + end + end end end diff --git a/vendor/plugins/rspec/spec/spec/mocks/multiple_return_value_spec.rb b/vendor/plugins/rspec/spec/spec/mocks/multiple_return_value_spec.rb index 3e26b73f4..08a6b066c 100644 --- a/vendor/plugins/rspec/spec/spec/mocks/multiple_return_value_spec.rb +++ b/vendor/plugins/rspec/spec/spec/mocks/multiple_return_value_spec.rb @@ -1,4 +1,4 @@ -require File.dirname(__FILE__) + '/../../spec_helper' +require 'spec_helper' module Spec module Mocks @@ -20,7 +20,7 @@ module Spec third = Object.new @mock.message.should == @return_values[0] @mock.message.should == @return_values[1] - lambda { @mock.rspec_verify }.should raise_error(MockExpectationError, "Mock 'mock' expected :message with (any args) 3 times, but received it twice") + lambda { @mock.rspec_verify }.should raise_error(MockExpectationError, "Mock \"mock\" expected :message with (any args) 3 times, but received it twice") end it "should complain when there are too many calls" do @@ -29,7 +29,7 @@ module Spec @mock.message.should == @return_values[1] @mock.message.should == @return_values[2] @mock.message.should == @return_values[2] - lambda { @mock.rspec_verify }.should raise_error(MockExpectationError, "Mock 'mock' expected :message with (any args) 3 times, but received it 4 times") + lambda { @mock.rspec_verify }.should raise_error(MockExpectationError, "Mock \"mock\" expected :message with (any args) 3 times, but received it 4 times") end end @@ -51,7 +51,7 @@ module Spec third = Object.new @mock.message.should == @return_values[0] @mock.message.should == @return_values[1] - lambda { @mock.rspec_verify }.should raise_error(MockExpectationError, "Mock 'mock' expected :message with (any args) 3 times, but received it twice") + lambda { @mock.rspec_verify }.should raise_error(MockExpectationError, "Mock \"mock\" expected :message with (any args) 3 times, but received it twice") end it "should complain when there are too many calls" do @@ -60,7 +60,7 @@ module Spec @mock.message.should == @return_values[1] @mock.message.should == @return_values[2] @mock.message.should == @return_values[2] - lambda { @mock.rspec_verify }.should raise_error(MockExpectationError, "Mock 'mock' expected :message with (any args) 3 times, but received it 4 times") + lambda { @mock.rspec_verify }.should raise_error(MockExpectationError, "Mock \"mock\" expected :message with (any args) 3 times, but received it 4 times") end end @@ -79,7 +79,7 @@ module Spec it "should fail when called less than the specified number" do @mock.message.should equal(11) - lambda { @mock.rspec_verify }.should raise_error(MockExpectationError, "Mock 'mock' expected :message with (no args) twice, but received it once") + lambda { @mock.rspec_verify }.should raise_error(MockExpectationError, "Mock \"mock\" expected :message with (no args) twice, but received it once") end end describe "a Mock expectation with multiple return values with a specified count larger than the number of values" do @@ -97,7 +97,7 @@ module Spec it "should fail when called less than the specified number" do @mock.message.should equal(11) - lambda { @mock.rspec_verify }.should raise_error(MockExpectationError, "Mock 'mock' expected :message with (any args) 3 times, but received it once") + lambda { @mock.rspec_verify }.should raise_error(MockExpectationError, "Mock \"mock\" expected :message with (any args) 3 times, but received it once") end it "should fail when called greater than the specified number" do @@ -105,7 +105,7 @@ module Spec @mock.message.should equal(22) @mock.message.should equal(22) @mock.message.should equal(22) - lambda { @mock.rspec_verify }.should raise_error(MockExpectationError, "Mock 'mock' expected :message with (any args) 3 times, but received it 4 times") + lambda { @mock.rspec_verify }.should raise_error(MockExpectationError, "Mock \"mock\" expected :message with (any args) 3 times, but received it 4 times") end end end diff --git a/vendor/plugins/rspec/spec/spec/mocks/null_object_mock_spec.rb b/vendor/plugins/rspec/spec/spec/mocks/null_object_mock_spec.rb index 57e8ca31c..8af6b49d7 100644 --- a/vendor/plugins/rspec/spec/spec/mocks/null_object_mock_spec.rb +++ b/vendor/plugins/rspec/spec/spec/mocks/null_object_mock_spec.rb @@ -1,4 +1,4 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' +require 'spec_helper' module Spec module Mocks @@ -36,5 +36,19 @@ module Spec @mock.message(:unexpected_arg) end end + + describe "#null_object?" do + it "should default to false" do + obj = mock('anything') + obj.should_not be_null_object + end + end + + describe "#as_null_object" do + it "should set the object to null_object" do + obj = mock('anything').as_null_object + obj.should be_null_object + end + end end end diff --git a/vendor/plugins/rspec/spec/spec/mocks/once_counts_spec.rb b/vendor/plugins/rspec/spec/spec/mocks/once_counts_spec.rb index 2c15d5c2e..951298321 100644 --- a/vendor/plugins/rspec/spec/spec/mocks/once_counts_spec.rb +++ b/vendor/plugins/rspec/spec/spec/mocks/once_counts_spec.rb @@ -1,4 +1,4 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' +require 'spec_helper' module Spec module Mocks diff --git a/vendor/plugins/rspec/spec/spec/mocks/options_hash_spec.rb b/vendor/plugins/rspec/spec/spec/mocks/options_hash_spec.rb index 0bfab26d7..f82757827 100644 --- a/vendor/plugins/rspec/spec/spec/mocks/options_hash_spec.rb +++ b/vendor/plugins/rspec/spec/spec/mocks/options_hash_spec.rb @@ -1,44 +1,34 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' +require 'spec_helper' module Spec module Mocks describe "calling :should_receive with an options hash" do - it_should_behave_like "sandboxed rspec_options" - attr_reader :reporter, :example_group - before do - @reporter = ::Spec::Runner::Reporter.new(options) - @example_group = Class.new(::Spec::Example::ExampleGroup) do - plugin_mock_framework - describe("Some Examples") - end - reporter.add_example_group example_group - end - it "should report the file and line submitted with :expected_from" do - example_definition = example_group.it "spec" do + begin mock = Spec::Mocks::Mock.new("a mock") mock.should_receive(:message, :expected_from => "/path/to/blah.ext:37") mock.rspec_verify + rescue Exception => e + ensure + e.backtrace.to_s.should =~ /\/path\/to\/blah.ext:37/m end - example = example_group.new(example_definition) - - reporter.should_receive(:example_finished) do |spec, error| - error.backtrace.detect {|line| line =~ /\/path\/to\/blah.ext:37/}.should_not be_nil - end - example.execute(options, {}) end it "should use the message supplied with :message" do - example_definition = @example_group.it "spec" do - mock = Spec::Mocks::Mock.new("a mock") - mock.should_receive(:message, :message => "recebi nada") - mock.rspec_verify - end - example = @example_group.new(example_definition) - @reporter.should_receive(:example_finished) do |spec, error| - error.message.should == "recebi nada" - end - example.execute(@options, {}) + lambda { + m = Spec::Mocks::Mock.new("a mock") + m.should_receive(:message, :message => "recebi nada") + m.rspec_verify + }.should raise_error("recebi nada") + end + + it "should use the message supplied with :message after a similar stub" do + lambda { + m = Spec::Mocks::Mock.new("a mock") + m.stub!(:message) + m.should_receive(:message, :message => "from mock") + m.rspec_verify + }.should raise_error("from mock") end end end diff --git a/vendor/plugins/rspec/spec/spec/mocks/partial_mock_spec.rb b/vendor/plugins/rspec/spec/spec/mocks/partial_mock_spec.rb index 25472557f..c19ecd304 100644 --- a/vendor/plugins/rspec/spec/spec/mocks/partial_mock_spec.rb +++ b/vendor/plugins/rspec/spec/spec/mocks/partial_mock_spec.rb @@ -1,4 +1,4 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' +require 'spec_helper' module Spec module Mocks @@ -11,7 +11,14 @@ module Spec @object.should_receive(:foo) lambda do @object.rspec_verify - end.should raise_error(Spec::Mocks::MockExpectationError, /Object/) + end.should raise_error(Spec::Mocks::MockExpectationError, /<Object:.*> expected/) + end + + it "should name the class in the failure message when expectation is on class" do + Object.should_receive(:foo) + lambda do + Object.rspec_verify + end.should raise_error(Spec::Mocks::MockExpectationError, /<Object \(class\)>/) end it "should not conflict with @options in the object" do @@ -21,11 +28,10 @@ module Spec end it "should_not_receive should mock out the method" do - pending("example raises the expected error, yet fails") @object.should_not_receive(:fuhbar) lambda do @object.fuhbar - end.should raise_error(MockExpectationError, "Mock 'Object' expected :fuhbar with (no args) 0 times, but received it once") + end.should raise_error(MockExpectationError, /<Object:.*> expected :fuhbar with \(no args\) 0 times/) end it "should_not_receive should return a negative message expectation" do @@ -66,7 +72,6 @@ module Spec end it "should_not_receive should also take a String argument" do - pending("example raises the expected error, yet fails") @object.should_not_receive('foobar') lambda do @object.foobar @@ -74,10 +79,12 @@ module Spec end it "should use report nil in the error message" do + allow_message_expectations_on_nil + @this_will_resolve_to_nil.should_receive(:foobar) lambda do @this_will_resolve_to_nil.rspec_verify - end.should raise_error(Spec::Mocks::MockExpectationError, /NilClass.*expected :foobar with/) + end.should raise_error(Spec::Mocks::MockExpectationError, /nil expected :foobar with/) end end @@ -121,19 +128,34 @@ module Spec it 'should keep public methods public' do @object.should_receive(:public_method) - @object.public_methods.should include('public_method') + with_ruby('1.9') do + @object.public_methods.should include(:public_method) + end + with_ruby('1.8') do + @object.public_methods.should include('public_method') + end @object.public_method end it 'should keep private methods private' do @object.should_receive(:private_method) - @object.private_methods.should include('private_method') + with_ruby('1.9') do + @object.private_methods.should include(:private_method) + end + with_ruby('1.8') do + @object.private_methods.should include('private_method') + end @object.public_method end it 'should keep protected methods protected' do @object.should_receive(:protected_method) - @object.protected_methods.should include('protected_method') + with_ruby('1.9') do + @object.protected_methods.should include(:protected_method) + end + with_ruby('1.8') do + @object.protected_methods.should include('protected_method') + end @object.public_method end diff --git a/vendor/plugins/rspec/spec/spec/mocks/partial_mock_using_mocks_directly_spec.rb b/vendor/plugins/rspec/spec/spec/mocks/partial_mock_using_mocks_directly_spec.rb index c857d8380..a69aa6ac0 100644 --- a/vendor/plugins/rspec/spec/spec/mocks/partial_mock_using_mocks_directly_spec.rb +++ b/vendor/plugins/rspec/spec/spec/mocks/partial_mock_using_mocks_directly_spec.rb @@ -1,4 +1,4 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' +require 'spec_helper' module Spec module Mocks diff --git a/vendor/plugins/rspec/spec/spec/mocks/passing_mock_argument_constraints_spec.rb b/vendor/plugins/rspec/spec/spec/mocks/passing_mock_argument_constraints_spec.rb deleted file mode 100644 index 057af44fa..000000000 --- a/vendor/plugins/rspec/spec/spec/mocks/passing_mock_argument_constraints_spec.rb +++ /dev/null @@ -1,160 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' - -module Spec - module Mocks - describe "mock argument constraints", :shared => true do - before(:each) do - @mock = Mock.new("test mock") - Kernel.stub!(:warn) - end - - after(:each) do - @mock.rspec_verify - end - end - - describe Methods, "handling argument constraints with DEPRECATED symbols" do - it_should_behave_like "mock argument constraints" - - it "should accept true as boolean" do - @mock.should_receive(:random_call).with(:boolean) - @mock.random_call(true) - end - - it "should accept false as boolean" do - @mock.should_receive(:random_call).with(:boolean) - @mock.random_call(false) - end - - it "should accept fixnum as numeric" do - @mock.should_receive(:random_call).with(:numeric) - @mock.random_call(1) - end - - it "should accept float as numeric" do - @mock.should_receive(:random_call).with(:numeric) - @mock.random_call(1.5) - end - - it "should accept string as anything" do - @mock.should_receive(:random_call).with("a", :anything, "c") - @mock.random_call("a", "whatever", "c") - end - - it "should match string" do - @mock.should_receive(:random_call).with(:string) - @mock.random_call("a string") - end - - it "should match no args against any_args" do - @mock.should_receive(:random_call).with(:any_args) - @mock.random_call("a string") - end - - it "should match no args against no_args" do - @mock.should_receive(:random_call).with(:no_args) - @mock.random_call - end - end - - describe Methods, "handling argument constraints" do - it_should_behave_like "mock argument constraints" - - it "should accept true as boolean()" do - @mock.should_receive(:random_call).with(boolean()) - @mock.random_call(true) - end - - it "should accept false as boolean()" do - @mock.should_receive(:random_call).with(boolean()) - @mock.random_call(false) - end - - it "should accept fixnum as an_instance_of(Numeric)" do - @mock.should_receive(:random_call).with(an_instance_of(Numeric)) - @mock.random_call(1) - end - - it "should accept float as an_instance_of(Numeric)" do - @mock.should_receive(:random_call).with(an_instance_of(Numeric)) - @mock.random_call(1.5) - end - - it "should accept string as anything()" do - @mock.should_receive(:random_call).with("a", anything(), "c") - @mock.random_call("a", "whatever", "c") - end - - it "should match duck type with one method" do - @mock.should_receive(:random_call).with(duck_type(:length)) - @mock.random_call([]) - end - - it "should match duck type with two methods" do - @mock.should_receive(:random_call).with(duck_type(:abs, :div)) - @mock.random_call(1) - end - - it "should match no args against any_args()" do - @mock.should_receive(:random_call).with(any_args) - @mock.random_call() - end - - it "should match one arg against any_args()" do - @mock.should_receive(:random_call).with(any_args) - @mock.random_call("a string") - end - - it "should match no args against no_args()" do - @mock.should_receive(:random_call).with(no_args) - @mock.random_call() - end - - it "should match hash with hash_including same hash" do - @mock.should_receive(:random_call).with(hash_including(:a => 1)) - @mock.random_call(:a => 1) - end - - end - - describe Methods, "handling non-constraint arguments" do - - it "should match non special symbol (can be removed when deprecated symbols are removed)" do - @mock.should_receive(:random_call).with(:some_symbol) - @mock.random_call(:some_symbol) - end - - it "should match string against regexp" do - @mock.should_receive(:random_call).with(/bcd/) - @mock.random_call("abcde") - end - - it "should match regexp against regexp" do - @mock.should_receive(:random_call).with(/bcd/) - @mock.random_call(/bcd/) - end - - it "should match against a hash submitted and received by value" do - @mock.should_receive(:random_call).with(:a => "a", :b => "b") - @mock.random_call(:a => "a", :b => "b") - end - - it "should match against a hash submitted by reference and received by value" do - opts = {:a => "a", :b => "b"} - @mock.should_receive(:random_call).with(opts) - @mock.random_call(:a => "a", :b => "b") - end - - it "should match against a hash submitted by value and received by reference" do - opts = {:a => "a", :b => "b"} - @mock.should_receive(:random_call).with(:a => "a", :b => "b") - @mock.random_call(opts) - end - - it "should match against a Matcher" do - @mock.should_receive(:msg).with(equal(37)) - @mock.msg(37) - end - end - end -end diff --git a/vendor/plugins/rspec/spec/spec/mocks/precise_counts_spec.rb b/vendor/plugins/rspec/spec/spec/mocks/precise_counts_spec.rb index ba3898943..5b64ef281 100644 --- a/vendor/plugins/rspec/spec/spec/mocks/precise_counts_spec.rb +++ b/vendor/plugins/rspec/spec/spec/mocks/precise_counts_spec.rb @@ -1,4 +1,4 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' +require 'spec_helper' module Spec module Mocks diff --git a/vendor/plugins/rspec/spec/spec/mocks/record_messages_spec.rb b/vendor/plugins/rspec/spec/spec/mocks/record_messages_spec.rb index ec247726d..bed2fbff6 100644 --- a/vendor/plugins/rspec/spec/spec/mocks/record_messages_spec.rb +++ b/vendor/plugins/rspec/spec/spec/mocks/record_messages_spec.rb @@ -1,4 +1,4 @@ -require File.dirname(__FILE__) + '/../../spec_helper' +require 'spec_helper' module Spec module Mocks diff --git a/vendor/plugins/rspec/spec/spec/mocks/stub_spec.rb b/vendor/plugins/rspec/spec/spec/mocks/stub_spec.rb index d6e23d71e..e0b7b2640 100644 --- a/vendor/plugins/rspec/spec/spec/mocks/stub_spec.rb +++ b/vendor/plugins/rspec/spec/spec/mocks/stub_spec.rb @@ -1,4 +1,4 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' +require 'spec_helper' module Spec module Mocks @@ -14,12 +14,17 @@ module Spec end end @instance = @class.new + @stub = Object.new end - it "should return expected value when expected message is received" do - @instance.stub!(:msg).and_return(:return_value) - @instance.msg.should equal(:return_value) - @instance.rspec_verify + [:stub!, :stub].each do |method| + context "using #{method}" do + it "should return expected value when expected message is received" do + @instance.send(method, :msg).and_return(:return_value) + @instance.msg.should equal(:return_value) + @instance.rspec_verify + end + end end it "should ignore when expected message is received" do @@ -44,7 +49,13 @@ module Spec @instance.rspec_verify end.should_not raise_error end - + + it "should handle multiple stubbed methods" do + @instance.stub!(:msg1 => 1, :msg2 => 2) + @instance.msg1.should == 1 + @instance.msg2.should == 2 + end + it "should clear itself when verified" do @instance.stub!(:this_should_go).and_return(:blah) @instance.this_should_go.should == :blah @@ -79,7 +90,7 @@ module Spec @instance.rspec_verify @instance.existing_instance_method.should equal(:original_value) end - + it "should revert to original class method if there is one" do @class.existing_class_method.should equal(:original_value) @class.stub!(:existing_class_method).and_return(:mock_value) @@ -104,7 +115,7 @@ module Spec current_value.should == [:yielded_value, :another_value] @instance.rspec_verify end - + it "should yield a specified object and return another specified object" do yielded_obj = mock("my mock") yielded_obj.should_receive(:foo).with(:bar) @@ -118,20 +129,26 @@ module Spec @mock.something end.should throw_symbol(:up) end - + it "should override a pre-existing stub" do @stub.stub!(:existing_instance_method).and_return(:updated_stub_value) @stub.existing_instance_method.should == :updated_stub_value end - + it "should limit " do @stub.stub!(:foo).with("bar") @stub.should_receive(:foo).with("baz") @stub.foo("bar") @stub.foo("baz") end + + it "calculates return value by executing block passed to #and_return" do + @mock.stub!(:something).with("a","b","c").and_return { |a,b,c| c+b+a } + @mock.something("a","b","c").should == "cba" + @mock.rspec_verify + end end - + describe "A method stub with args" do before(:each) do @stub = Object.new @@ -171,10 +188,15 @@ module Spec @stub.foo("other") end.should raise_error end - + it "should support options" do @stub.stub!(:foo, :expected_from => "bar") end + + it "should use 'Stub' in the failure message" do + stub = stub('name') + expect {stub.foo}.to raise_error(/Stub "name" received/) + end end end diff --git a/vendor/plugins/rspec/spec/spec/mocks/twice_counts_spec.rb b/vendor/plugins/rspec/spec/spec/mocks/twice_counts_spec.rb index d07e45736..4538eb8f9 100644 --- a/vendor/plugins/rspec/spec/spec/mocks/twice_counts_spec.rb +++ b/vendor/plugins/rspec/spec/spec/mocks/twice_counts_spec.rb @@ -1,4 +1,4 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' +require 'spec_helper' module Spec module Mocks diff --git a/vendor/plugins/rspec/spec/spec/package/bin_spec_spec.rb b/vendor/plugins/rspec/spec/spec/package/bin_spec_spec.rb index 44bfd96a0..6628fad72 100644 --- a/vendor/plugins/rspec/spec/spec/package/bin_spec_spec.rb +++ b/vendor/plugins/rspec/spec/spec/package/bin_spec_spec.rb @@ -1,14 +1,16 @@ -require File.dirname(__FILE__) + '/../../spec_helper' -require File.dirname(__FILE__) + '/../../ruby_forker' +require 'spec_helper' +require 'ruby_forker' describe "The bin/spec script" do include RubyForker it "should have no warnings" do - pending "Hangs on JRuby" if PLATFORM =~ /java/ - spec_path = "#{File.dirname(__FILE__)}/../../../bin/spec" - - output = ruby "-w #{spec_path} --help 2>&1" + output = ruby "-w -Ilib bin/spec --help" output.should_not =~ /warning/n end + + it "should show the help w/ no args" do + output = ruby "-w -Ilib bin/spec" + output.should =~ /^Usage: spec/ + end end diff --git a/vendor/plugins/rspec/spec/spec/runner/class_and_argument_parser_spec.rb b/vendor/plugins/rspec/spec/spec/runner/class_and_argument_parser_spec.rb index b4e9e7f53..1168818f0 100644 --- a/vendor/plugins/rspec/spec/spec/runner/class_and_argument_parser_spec.rb +++ b/vendor/plugins/rspec/spec/spec/runner/class_and_argument_parser_spec.rb @@ -1,4 +1,4 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' +require 'spec_helper' module Spec module Runner diff --git a/vendor/plugins/rspec/spec/spec/runner/command_line_spec.rb b/vendor/plugins/rspec/spec/spec/runner/command_line_spec.rb index 3c3be8cea..c22b30668 100644 --- a/vendor/plugins/rspec/spec/spec/runner/command_line_spec.rb +++ b/vendor/plugins/rspec/spec/spec/runner/command_line_spec.rb @@ -1,146 +1,140 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' +require 'spec_helper' module Spec module Runner describe CommandLine, ".run" do - it_should_behave_like "sandboxed rspec_options" - attr_reader :options, :err, :out - before do - @err = options.error_stream - @out = options.output_stream - end - - it "should run directory" do - file = File.dirname(__FILE__) + '/../../../examples/pure' - Spec::Runner::CommandLine.run(OptionParser.parse([file,"-p","**/*.rb"], @err, @out)) + with_sandboxed_options do + attr_reader :err, :out + before do + @err = options.error_stream + @out = options.output_stream + end + + it "should run directory" do + file = File.dirname(__FILE__) + '/../../../examples/passing' + run_with(OptionParser.parse([file,"-p","**/*_spec.rb,**/*_example.rb"], @err, @out)) - @out.rewind - @out.read.should =~ /\d+ examples, 0 failures, 3 pending/n - end + @out.rewind + @out.read.should =~ /\d+ examples, 0 failures, 3 pending/n + end - it "should run file" do - file = File.dirname(__FILE__) + '/../../../failing_examples/predicate_example.rb' - Spec::Runner::CommandLine.run(OptionParser.parse([file], @err, @out)) + it "should run file" do + file = File.dirname(__FILE__) + '/../../../examples/failing/predicate_example.rb' + run_with(OptionParser.parse([file], @err, @out)) - @out.rewind - @out.read.should =~ /2 examples, 1 failure/n - end + @out.rewind + @out.read.should =~ /3 examples, 2 failures/n + end - it "should raise when file does not exist" do - file = File.dirname(__FILE__) + '/doesntexist' + it "should raise when file does not exist" do + file = File.dirname(__FILE__) + '/doesntexist' - lambda { - Spec::Runner::CommandLine.run(OptionParser.parse([file], @err, @out)) - }.should raise_error - end + lambda { + Spec::Runner::CommandLine.run(OptionParser.parse([file], @err, @out)) + }.should raise_error + end - it "should return true when in --generate-options mode" do - # NOTE - this used to say /dev/null but jruby hangs on that for some reason - Spec::Runner::CommandLine.run( - OptionParser.parse(['--generate-options', '/tmp/foo'], @err, @out) - ).should be_true - end + it "should return true when in --generate-options mode" do + # NOTE - this used to say /dev/null but jruby hangs on that for some reason + Spec::Runner::CommandLine.run( + OptionParser.parse(['--generate-options', '/tmp/foo'], @err, @out) + ).should be_true + end - it "should dump even if Interrupt exception is occurred" do - example_group = Class.new(::Spec::Example::ExampleGroup) do - describe("example_group") - it "no error" do - end + it "should dump even if Interrupt exception is occurred" do + example_group = Class.new(::Spec::Example::ExampleGroup) do + describe("example_group") + it "no error" do + end - it "should interrupt" do - raise Interrupt, "I'm interrupting" + it "should interrupt" do + raise Interrupt, "I'm interrupting" + end end - end - options = ::Spec::Runner::Options.new(@err, @out) - ::Spec::Runner::Options.should_receive(:new).with(@err, @out).and_return(options) - options.reporter.should_receive(:dump) - options.add_example_group(example_group) + options = ::Spec::Runner::Options.new(@err, @out) + ::Spec::Runner::Options.should_receive(:new).with(@err, @out).and_return(options) + options.reporter.should_receive(:dump) + options.add_example_group(example_group) - Spec::Runner::CommandLine.run(OptionParser.parse([], @err, @out)) - end + Spec::Runner::CommandLine.run(OptionParser.parse([], @err, @out)) + end - it "should heckle when options have heckle_runner" do - example_group = Class.new(::Spec::Example::ExampleGroup).describe("example_group") do - it "no error" do + it "should heckle when options have heckle_runner" do + example_group = Class.new(::Spec::Example::ExampleGroup).describe("example_group") do + it "no error" do + end end - end - options = ::Spec::Runner::Options.new(@err, @out) - ::Spec::Runner::Options.should_receive(:new).with(@err, @out).and_return(options) - options.add_example_group example_group + options = ::Spec::Runner::Options.new(@err, @out) + ::Spec::Runner::Options.should_receive(:new).with(@err, @out).and_return(options) + options.add_example_group example_group - heckle_runner = mock("heckle_runner") - heckle_runner.should_receive(:heckle_with) - $rspec_mocks.__send__(:mocks).delete(heckle_runner) + heckle_runner = mock("heckle_runner") + heckle_runner.should_receive(:heckle_with) + $rspec_mocks.__send__(:mocks).delete(heckle_runner) - options.heckle_runner = heckle_runner - options.add_example_group(example_group) + options.heckle_runner = heckle_runner + options.add_example_group(example_group) - Spec::Runner::CommandLine.run(OptionParser.parse([], @err, @out)) - heckle_runner.rspec_verify - end + Spec::Runner::CommandLine.run(OptionParser.parse([], @err, @out)) + heckle_runner.rspec_verify + end - it "should run examples backwards if options.reverse is true" do - options = ::Spec::Runner::Options.new(@err, @out) - ::Spec::Runner::Options.should_receive(:new).with(@err, @out).and_return(options) - options.reverse = true + it "should run examples backwards if options.reverse is true" do + options = ::Spec::Runner::Options.new(@err, @out) + ::Spec::Runner::Options.should_receive(:new).with(@err, @out).and_return(options) + options.reverse = true - b1 = Class.new(Spec::Example::ExampleGroup) - b2 = Class.new(Spec::Example::ExampleGroup) + b1 = Class.new(Spec::Example::ExampleGroup) + b2 = Class.new(Spec::Example::ExampleGroup) - b2.should_receive(:run).ordered - b1.should_receive(:run).ordered + b2.should_receive(:run).ordered + b1.should_receive(:run).ordered - options.add_example_group(b1) - options.add_example_group(b2) + options.add_example_group(b1) + options.add_example_group(b2) - Spec::Runner::CommandLine.run(OptionParser.parse([], @err, @out)) - end + Spec::Runner::CommandLine.run(OptionParser.parse([], @err, @out)) + end - it "should pass its ExampleGroup to the reporter" do - example_group = Class.new(::Spec::Example::ExampleGroup).describe("example_group") do - it "should" do + it "should pass its ExampleGroup to the reporter" do + example_group = describe("example_group") do + it "should" do + end end - end - options = ::Spec::Runner::Options.new(@err, @out) - options.add_example_group(example_group) + options = ::Spec::Runner::Options.new(@err, @out) + options.add_example_group(example_group) - ::Spec::Runner::Options.should_receive(:new).with(@err, @out).and_return(options) - options.reporter.should_receive(:add_example_group).with(example_group) + ::Spec::Runner::Options.should_receive(:new).with(@err, @out).and_return(options) + options.reporter.should_receive(:add_example_group).with(Spec::Example::ExampleGroupProxy.new(example_group)) - Spec::Runner::CommandLine.run(OptionParser.parse([], @err, @out)) - end - - it "runs only selected Examples when options.examples is set" do - options = ::Spec::Runner::Options.new(@err, @out) - ::Spec::Runner::Options.should_receive(:new).with(@err, @out).and_return(options) - - options.examples << "example_group should" - should_has_run = false - should_not_has_run = false - example_group = Class.new(::Spec::Example::ExampleGroup).describe("example_group") do - it "should" do - should_has_run = true - end - it "should not" do - should_not_has_run = true - end + Spec::Runner::CommandLine.run(OptionParser.parse([], @err, @out)) end - options.reporter.should_receive(:add_example_group).with(example_group) + it "runs only selected Examples when options.examples is set" do + options = ::Spec::Runner::Options.new(@err, @out) + ::Spec::Runner::Options.should_receive(:new).with(@err, @out).and_return(options) + + options.examples << "example group expected example" + expected_example_was_run = false + unexpected_example_was_run = false + example_group = describe("example group") do + it "expected example" do + expected_example_was_run = true + end + it "unexpected example" do + unexpected_example_was_run = true + end + end - options.add_example_group example_group - Spec::Runner::CommandLine.run(OptionParser.parse([], @err, @out)) + options.reporter.should_receive(:add_example_group).with(Spec::Example::ExampleGroupProxy.new(example_group)) - should_has_run.should be_true - should_not_has_run.should be_false - end + options.add_example_group example_group + run_with(options) - it "sets Spec.run to true" do - ::Spec.run = false - ::Spec.should_not be_run - Spec::Runner::CommandLine.run(OptionParser.parse([], @err, @out)) - ::Spec.should be_run + expected_example_was_run.should be_true + unexpected_example_was_run.should be_false + end end end end diff --git a/vendor/plugins/rspec/spec/spec/runner/drb_command_line_spec.rb b/vendor/plugins/rspec/spec/spec/runner/drb_command_line_spec.rb index 760ec37a9..0c17a7f68 100644 --- a/vendor/plugins/rspec/spec/spec/runner/drb_command_line_spec.rb +++ b/vendor/plugins/rspec/spec/spec/runner/drb_command_line_spec.rb @@ -1,92 +1,107 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' +require 'spec_helper' module Spec module Runner - describe DrbCommandLine, "without running local server" do - unless Config::CONFIG['ruby_install_name'] == 'jruby' - it "should print error when there is no running local server" do - err = StringIO.new - out = StringIO.new - DrbCommandLine.run(OptionParser.parse(['--version'], err, out)) - - err.rewind - err.read.should =~ /No server is running/ - end - end - end + unless jruby? + describe DrbCommandLine do - class DrbCommandLineSpec < ::Spec::Example::ExampleGroup - describe DrbCommandLine, "with local server" + context "without server running" do + it "prints error" do + err = out = StringIO.new + DrbCommandLine.run(OptionParser.parse(['--version'], err, out)) - class CommandLineForSpec - def self.run(argv, stderr, stdout) - exit Spec::Runner::CommandLine.run(OptionParser.parse(argv, stderr, stdout)) - end - end - - unless Config::CONFIG['ruby_install_name'] == 'jruby' - before(:all) do - DRb.start_service("druby://localhost:8989", CommandLineForSpec) - @@drb_example_file_counter = 0 - end + err.rewind + err.read.should =~ /No server is running/ + end + + it "returns nil" do + err = out = StringIO.new + result = DrbCommandLine.run(OptionParser.parse(['--version'], err, out)) + result.should be_false + end + end - before(:each) do - create_dummy_spec_file - @@drb_example_file_counter = @@drb_example_file_counter + 1 - end + context "with server running" do + class ::CommandLineForDrbSpec + def self.run(argv, stderr, stdout) + orig_options = Spec::Runner.options + tmp_options = Spec::Runner::OptionParser.parse(argv, stderr, stdout) + Spec::Runner.use tmp_options + Spec::Runner::CommandLine.run(tmp_options) + ensure + Spec::Runner.use orig_options + end + end - after(:each) do - File.delete(@dummy_spec_filename) - end + before(:all) do + DRb.start_service("druby://127.0.0.1:8989", ::CommandLineForDrbSpec) + @@drb_example_file_counter = 0 + end - after(:all) do - DRb.stop_service - end + before(:each) do + create_dummy_spec_file + @@drb_example_file_counter = @@drb_example_file_counter + 1 + end - it "should run against local server" do - out = run_spec_via_druby(['--version']) - out.should =~ /RSpec/n - end + after(:each) do + File.delete(@dummy_spec_filename) + end - it "should output green colorized text when running with --colour option" do - out = run_spec_via_druby(["--colour", @dummy_spec_filename]) - out.should =~ /\e\[32m/n - end + after(:all) do + DRb.stop_service + end - it "should output red colorized text when running with -c option" do - out = run_spec_via_druby(["-c", @dummy_spec_filename]) - out.should =~ /\e\[31m/n - end + it "returns true" do + err = out = StringIO.new + result = DrbCommandLine.run(OptionParser.parse(['--version'], err, out)) + result.should be_true + end - def create_dummy_spec_file - @dummy_spec_filename = File.expand_path(File.dirname(__FILE__)) + "/_dummy_spec#{@@drb_example_file_counter}.rb" - File.open(@dummy_spec_filename, 'w') do |f| - f.write %{ - describe "DUMMY CONTEXT for 'DrbCommandLine with -c option'" do - it "should be output with green bar" do - true.should be_true - end + it "should run against local server" do + out = run_spec_via_druby(['--version']) + out.should =~ /rspec \d+\.\d+\.\d+.*/n + end + + it "should output green colorized text when running with --colour option" do + out = run_spec_via_druby(["--colour", @dummy_spec_filename]) + out.should =~ /\e\[32m/n + end + + it "should output red colorized text when running with -c option" do + out = run_spec_via_druby(["-c", @dummy_spec_filename]) + out.should =~ /\e\[31m/n + end + + def create_dummy_spec_file + @dummy_spec_filename = File.expand_path(File.dirname(__FILE__)) + "/_dummy_spec#{@@drb_example_file_counter}.rb" + File.open(@dummy_spec_filename, 'w') do |f| + f.write %{ + describe "DUMMY CONTEXT for 'DrbCommandLine with -c option'" do + it "should be output with green bar" do + true.should be_true + end - it "should be output with red bar" do - violated("I want to see a red bar!") + it "should be output with red bar" do + violated("I want to see a red bar!") + end end - end - } + } + end end - end - def run_spec_via_druby(argv) - err, out = StringIO.new, StringIO.new - out.instance_eval do - def tty?; true end + def run_spec_via_druby(argv) + err, out = StringIO.new, StringIO.new + out.instance_eval do + def tty?; true end + end + options = ::Spec::Runner::Options.new(err, out) + options.argv = argv + Spec::Runner::DrbCommandLine.run(options) + out.rewind; out.read end - options = ::Spec::Runner::Options.new(err, out) - options.argv = argv - Spec::Runner::DrbCommandLine.run(options) - out.rewind; out.read end - end + end end end end diff --git a/vendor/plugins/rspec/spec/spec/runner/execution_context_spec.rb b/vendor/plugins/rspec/spec/spec/runner/execution_context_spec.rb deleted file mode 100644 index 2c8c23f18..000000000 --- a/vendor/plugins/rspec/spec/spec/runner/execution_context_spec.rb +++ /dev/null @@ -1,37 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' - -describe "ExecutionContext" do - - it "should provide duck_type()" do - dt = duck_type(:length) - dt.should be_an_instance_of(Spec::Mocks::DuckTypeArgConstraint) - dt.matches?([]).should be_true - end - - it "should provide hash_including" do - hi = hash_including(:a => 1) - hi.should be_an_instance_of(Spec::Mocks::HashIncludingConstraint) - hi.matches?(:a => 1).should be_true - end - - it "should violate when violated()" do - lambda do - violated - end.should raise_error(Spec::Expectations::ExpectationNotMetError) - end - - it "should provide mock()" do - mock("thing").should be_an_instance_of(Spec::Mocks::Mock) - end - - it "should provide stub()" do - thing_stub = stub("thing").should be_an_instance_of(Spec::Mocks::Mock) - end - - it "should add method stubs to stub()" do - thing_stub = stub("thing", :a => "A", :b => "B") - thing_stub.a.should == "A" - thing_stub.b.should == "B" - end - -end diff --git a/vendor/plugins/rspec/spec/spec/runner/formatter/failing_example_groups_formatter_spec.rb b/vendor/plugins/rspec/spec/spec/runner/formatter/failing_example_groups_formatter_spec.rb index e54cdb09f..b390131ad 100644 --- a/vendor/plugins/rspec/spec/spec/runner/formatter/failing_example_groups_formatter_spec.rb +++ b/vendor/plugins/rspec/spec/spec/runner/formatter/failing_example_groups_formatter_spec.rb @@ -1,4 +1,4 @@ -require File.dirname(__FILE__) + '/../../../spec_helper' +require 'spec_helper' require 'spec/runner/formatter/failing_example_groups_formatter' module Spec @@ -15,11 +15,11 @@ module Spec end it "should add example name for each failure" do - formatter.add_example_group(Class.new(ExampleGroup).describe("b 1")) - formatter.example_failed("e 1", nil, Reporter::Failure.new(nil, RuntimeError.new)) - formatter.add_example_group(Class.new(ExampleGroup).describe("b 2")) - formatter.example_failed("e 2", nil, Reporter::Failure.new(nil, RuntimeError.new)) - formatter.example_failed("e 3", nil, Reporter::Failure.new(nil, RuntimeError.new)) + formatter.example_group_started(Spec::Example::ExampleGroupProxy.new(Class.new(::Spec::Example::ExampleGroupDouble).describe("b 1"))) + formatter.example_failed("e 1", nil, Spec::Runner::Reporter::Failure.new("g", nil, RuntimeError.new)) + formatter.example_group_started(Spec::Example::ExampleGroupProxy.new(Class.new(::Spec::Example::ExampleGroupDouble).describe("b 2"))) + formatter.example_failed("e 2", nil, Spec::Runner::Reporter::Failure.new("g", nil, RuntimeError.new)) + formatter.example_failed("e 3", nil, Spec::Runner::Reporter::Failure.new("g", nil, RuntimeError.new)) io.string.should include("b 1") io.string.should include("b 2") end @@ -29,14 +29,14 @@ module Spec child_example_group = Class.new(parent_example_group).describe("#child_method") grand_child_example_group = Class.new(child_example_group).describe("GrandChild") - formatter.add_example_group(grand_child_example_group) - formatter.example_failed("failure", nil, Reporter::Failure.new(nil, RuntimeError.new)) + formatter.example_group_started(Spec::Example::ExampleGroupProxy.new(grand_child_example_group)) + formatter.example_failed("failure", nil, ::Spec::Runner::Reporter::Failure.new("g", nil, RuntimeError.new)) io.string.should == "Parent#child_method GrandChild\n" end it "should remove druby url, which is used by Spec::Distributed" do - @formatter.add_example_group(Class.new(ExampleGroup).describe("something something (druby://99.99.99.99:99)")) - @formatter.example_failed("e 1", nil, Reporter::Failure.new(nil, RuntimeError.new)) + @formatter.example_group_started(Spec::Example::ExampleGroupProxy.new(Class.new(::Spec::Example::ExampleGroupDouble).describe("something something (druby://99.99.99.99:99)"))) + @formatter.example_failed("e 1", nil, ::Spec::Runner::Reporter::Failure.new("g", nil, RuntimeError.new)) io.string.should == "something something\n" end end diff --git a/vendor/plugins/rspec/spec/spec/runner/formatter/failing_examples_formatter_spec.rb b/vendor/plugins/rspec/spec/spec/runner/formatter/failing_examples_formatter_spec.rb index fda64f95f..76d03fa39 100644 --- a/vendor/plugins/rspec/spec/spec/runner/formatter/failing_examples_formatter_spec.rb +++ b/vendor/plugins/rspec/spec/spec/runner/formatter/failing_examples_formatter_spec.rb @@ -1,4 +1,4 @@ -require File.dirname(__FILE__) + '/../../../spec_helper' +require 'spec_helper' require 'spec/runner/formatter/failing_examples_formatter' module Spec @@ -12,14 +12,14 @@ module Spec end it "should add example name for each failure" do - example_group_1 = Class.new(ExampleGroup).describe("A") + example_group_1 = Class.new(::Spec::Example::ExampleGroupDouble).describe("A") example_group_2 = Class.new(example_group_1).describe("B") - @formatter.add_example_group(example_group_1) - @formatter.example_failed(example_group_1.it("a1"){}, nil, Reporter::Failure.new(nil, RuntimeError.new)) - @formatter.add_example_group(example_group_2) - @formatter.example_failed(example_group_2.it("b2"){}, nil, Reporter::Failure.new(nil, RuntimeError.new)) - @formatter.example_failed(example_group_2.it("b3"){}, nil, Reporter::Failure.new(nil, RuntimeError.new)) + @formatter.example_group_started(Spec::Example::ExampleGroupProxy.new(example_group_1)) + @formatter.example_failed(example_group_1.it("a1"){}, nil, ::Spec::Runner::Reporter::Failure.new("g", nil, RuntimeError.new)) + @formatter.example_group_started(Spec::Example::ExampleGroupProxy.new(example_group_2)) + @formatter.example_failed(example_group_2.it("b2"){}, nil, ::Spec::Runner::Reporter::Failure.new("g", nil, RuntimeError.new)) + @formatter.example_failed(example_group_2.it("b3"){}, nil, ::Spec::Runner::Reporter::Failure.new("g", nil, RuntimeError.new)) @io.string.should eql(<<-EOF A a1 A B b2 diff --git a/vendor/plugins/rspec/spec/spec/runner/formatter/html_formatted-1.8.4.html b/vendor/plugins/rspec/spec/spec/runner/formatter/html_formatted-1.8.4.html deleted file mode 100644 index 9cc458fdb..000000000 --- a/vendor/plugins/rspec/spec/spec/runner/formatter/html_formatted-1.8.4.html +++ /dev/null @@ -1,365 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html - PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" - "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head> - <title>RSpec results</title> - <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> - <meta http-equiv="Expires" content="-1" /> - <meta http-equiv="Pragma" content="no-cache" /> - <style type="text/css"> - body { - margin: 0; - padding: 0; - background: #fff; - font-size: 80%; - } - </style> -</head> -<body> -<div class="rspec-report"> - <script type="text/javascript"> - // <![CDATA[ -function moveProgressBar(percentDone) { - document.getElementById("rspec-header").style.width = percentDone +"%"; -} -function makeRed(element_id) { - document.getElementById(element_id).style.background = '#C40D0D'; - document.getElementById(element_id).style.color = '#FFFFFF'; -} - -function makeYellow(element_id) { - if (element_id == "rspec-header" && document.getElementById(element_id).style.background != '#C40D0D') - { - document.getElementById(element_id).style.background = '#FAF834'; - document.getElementById(element_id).style.color = '#000000'; - } - else - { - document.getElementById(element_id).style.background = '#FAF834'; - document.getElementById(element_id).style.color = '#000000'; - } -} - - // ]]> - </script> - <style type="text/css"> -#rspec-header { - background: #65C400; color: #fff; -} - -.rspec-report h1 { - margin: 0px 10px 0px 10px; - padding: 10px; - font-family: "Lucida Grande", Helvetica, sans-serif; - font-size: 1.8em; -} - -#summary { - margin: 0; padding: 5px 10px; - font-family: "Lucida Grande", Helvetica, sans-serif; - text-align: right; - position: absolute; - top: 0px; - right: 0px; -} - -#summary p { - margin: 0 0 0 2px; -} - -#summary #totals { - font-size: 1.2em; -} - -.example_group { - margin: 0 10px 5px; - background: #fff; -} - -dl { - margin: 0; padding: 0 0 5px; - font: normal 11px "Lucida Grande", Helvetica, sans-serif; -} - -dt { - padding: 3px; - background: #65C400; - color: #fff; - font-weight: bold; -} - -dd { - margin: 5px 0 5px 5px; - padding: 3px 3px 3px 18px; -} - -dd.spec.passed { - border-left: 5px solid #65C400; - border-bottom: 1px solid #65C400; - background: #DBFFB4; color: #3D7700; -} - -dd.spec.failed { - border-left: 5px solid #C20000; - border-bottom: 1px solid #C20000; - color: #C20000; background: #FFFBD3; -} - -dd.spec.not_implemented { - border-left: 5px solid #FAF834; - border-bottom: 1px solid #FAF834; - background: #FCFB98; color: #131313; -} - -dd.spec.pending_fixed { - border-left: 5px solid #0000C2; - border-bottom: 1px solid #0000C2; - color: #0000C2; background: #D3FBFF; -} - -.backtrace { - color: #000; - font-size: 12px; -} - -a { - color: #BE5C00; -} - -/* Ruby code, style similar to vibrant ink */ -.ruby { - font-size: 12px; - font-family: monospace; - color: white; - background-color: black; - padding: 0.1em 0 0.2em 0; -} - -.ruby .keyword { color: #FF6600; } -.ruby .constant { color: #339999; } -.ruby .attribute { color: white; } -.ruby .global { color: white; } -.ruby .module { color: white; } -.ruby .class { color: white; } -.ruby .string { color: #66FF00; } -.ruby .ident { color: white; } -.ruby .method { color: #FFCC00; } -.ruby .number { color: white; } -.ruby .char { color: white; } -.ruby .comment { color: #9933CC; } -.ruby .symbol { color: white; } -.ruby .regex { color: #44B4CC; } -.ruby .punct { color: white; } -.ruby .escape { color: white; } -.ruby .interp { color: white; } -.ruby .expr { color: white; } - -.ruby .offending { background-color: gray; } -.ruby .linenum { - width: 75px; - padding: 0.1em 1em 0.2em 0; - color: #000000; - background-color: #FFFBD3; -} - - </style> - -<div id="rspec-header"> - <h1>RSpec Results</h1> - - <div id="summary"> - <p id="totals"> </p> - <p id="duration"> </p> - </div> -</div> - -<div class="results"> -<div class="example_group"> - <dl> - <dt id="example_group_1">Mocker</dt> - <script type="text/javascript">moveProgressBar('5.8');</script> - <dd class="spec passed"><span class="passed_spec_name">should be able to call mock()</span></dd> - <script type="text/javascript">makeRed('rspec-header');</script> - <script type="text/javascript">makeRed('example_group_1');</script> - <script type="text/javascript">moveProgressBar('11.7');</script> - <dd class="spec failed"> - <span class="failed_spec_name">should fail when expected message not received</span> - <div class="failure" id="failure_1"> - <div class="message"><pre>Mock 'poke me' expected :poke with (any args) once, but received it 0 times</pre></div> - <div class="backtrace"><pre>./failing_examples/mocking_example.rb:13: -./spec/spec/runner/formatter/html_formatter_spec.rb:24: -./spec/spec/runner/formatter/html_formatter_spec.rb:20:</pre></div> - <pre class="ruby"><code><span class="linenum">11</span> <span class="ident">it</span> <span class="punct">"</span><span class="string">should fail when expected message not received</span><span class="punct">"</span> <span class="keyword">do</span> -<span class="linenum">12</span> <span class="ident">mock</span> <span class="punct">=</span> <span class="ident">mock</span><span class="punct">("</span><span class="string">poke me</span><span class="punct">")</span> -<span class="offending"><span class="linenum">13</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">should_receive</span><span class="punct">(</span><span class="symbol">:poke</span><span class="punct">)</span></span> -<span class="linenum">14</span> <span class="keyword">end</span> -<span class="linenum">15</span> </code></pre> - </div> - </dd> - <script type="text/javascript">moveProgressBar('17.6');</script> - <dd class="spec failed"> - <span class="failed_spec_name">should fail when messages are received out of order</span> - <div class="failure" id="failure_2"> - <div class="message"><pre>Mock 'one two three' received :three out of order</pre></div> - <div class="backtrace"><pre>./failing_examples/mocking_example.rb:22: -./spec/spec/runner/formatter/html_formatter_spec.rb:24: -./spec/spec/runner/formatter/html_formatter_spec.rb:20:</pre></div> - <pre class="ruby"><code><span class="linenum">20</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">should_receive</span><span class="punct">(</span><span class="symbol">:three</span><span class="punct">).</span><span class="ident">ordered</span> -<span class="linenum">21</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">one</span> -<span class="offending"><span class="linenum">22</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">three</span></span> -<span class="linenum">23</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">two</span> -<span class="linenum">24</span> <span class="keyword">end</span></code></pre> - </div> - </dd> - <script type="text/javascript">moveProgressBar('23.5');</script> - <dd class="spec failed"> - <span class="failed_spec_name">should get yelled at when sending unexpected messages</span> - <div class="failure" id="failure_3"> - <div class="message"><pre>Mock 'don't talk to me' expected :any_message_at_all with (any args) 0 times, but received it once</pre></div> - <div class="backtrace"><pre>./failing_examples/mocking_example.rb:28: -./spec/spec/runner/formatter/html_formatter_spec.rb:24: -./spec/spec/runner/formatter/html_formatter_spec.rb:20:</pre></div> - <pre class="ruby"><code><span class="linenum">26</span> <span class="ident">it</span> <span class="punct">"</span><span class="string">should get yelled at when sending unexpected messages</span><span class="punct">"</span> <span class="keyword">do</span> -<span class="linenum">27</span> <span class="ident">mock</span> <span class="punct">=</span> <span class="ident">mock</span><span class="punct">("</span><span class="string">don't talk to me</span><span class="punct">")</span> -<span class="offending"><span class="linenum">28</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">should_not_receive</span><span class="punct">(</span><span class="symbol">:any_message_at_all</span><span class="punct">)</span></span> -<span class="linenum">29</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">any_message_at_all</span> -<span class="linenum">30</span> <span class="keyword">end</span></code></pre> - </div> - </dd> - <script type="text/javascript">moveProgressBar('29.4');</script> - <dd class="spec pending_fixed"> - <span class="failed_spec_name">has a bug we need to fix</span> - <div class="failure" id="failure_4"> - <div class="message"><pre>Expected pending 'here is the bug' to fail. No Error was raised.</pre></div> - <div class="backtrace"><pre>./failing_examples/mocking_example.rb:33: -./spec/spec/runner/formatter/html_formatter_spec.rb:24: -./spec/spec/runner/formatter/html_formatter_spec.rb:20:</pre></div> - <pre class="ruby"><code><span class="linenum">31</span> -<span class="linenum">32</span> <span class="ident">it</span> <span class="punct">"</span><span class="string">has a bug we need to fix</span><span class="punct">"</span> <span class="keyword">do</span> -<span class="offending"><span class="linenum">33</span> <span class="ident">pending</span> <span class="punct">"</span><span class="string">here is the bug</span><span class="punct">"</span> <span class="keyword">do</span></span> -<span class="linenum">34</span> <span class="comment"># Actually, no. It's fixed. This will fail because it passes :-)</span> -<span class="linenum">35</span> <span class="ident">mock</span> <span class="punct">=</span> <span class="ident">mock</span><span class="punct">("</span><span class="string">Bug</span><span class="punct">")</span></code></pre> - </div> - </dd> - </dl> -</div> -<div class="example_group"> - <dl> - <dt id="example_group_2">Running specs with --diff</dt> - <script type="text/javascript">makeRed('example_group_2');</script> - <script type="text/javascript">moveProgressBar('35.2');</script> - <dd class="spec failed"> - <span class="failed_spec_name">should print diff of different strings</span> - <div class="failure" id="failure_5"> - <div class="message"><pre>expected: "RSpec is a\nbehaviour driven development\nframework for Ruby\n", - got: "RSpec is a\nbehavior driven development\nframework for Ruby\n" (using ==) -Diff: -@@ -1,4 +1,4 @@ - RSpec is a --behavior driven development -+behaviour driven development - framework for Ruby -</pre></div> - <div class="backtrace"><pre>./failing_examples/diffing_spec.rb:13: -./spec/spec/runner/formatter/html_formatter_spec.rb:24: -./spec/spec/runner/formatter/html_formatter_spec.rb:20:</pre></div> - <pre class="ruby"><code><span class="linenum">11</span><span class="ident">framework</span> <span class="keyword">for</span> <span class="constant">Ruby</span> -<span class="linenum">12</span><span class="constant">EOF</span> -<span class="offending"><span class="linenum">13</span> <span class="ident">usa</span><span class="punct">.</span><span class="ident">should</span> <span class="punct">==</span> <span class="ident">uk</span></span> -<span class="linenum">14</span> <span class="keyword">end</span></code></pre> - </div> - </dd> - <script type="text/javascript">moveProgressBar('41.1');</script> - <dd class="spec failed"> - <span class="failed_spec_name">should print diff of different objects' pretty representation</span> - <div class="failure" id="failure_6"> - <div class="message"><pre>expected <Animal -name=bob, -species=tortoise -> -, got <Animal -name=bob, -species=giraffe -> - (using .eql?) -Diff: -@@ -1,5 +1,5 @@ - <Animal - name=bob, --species=giraffe -+species=tortoise - > -</pre></div> - <div class="backtrace"><pre>./failing_examples/diffing_spec.rb:34: -./spec/spec/runner/formatter/html_formatter_spec.rb:24: -./spec/spec/runner/formatter/html_formatter_spec.rb:20:</pre></div> - <pre class="ruby"><code><span class="linenum">32</span> <span class="ident">expected</span> <span class="punct">=</span> <span class="constant">Animal</span><span class="punct">.</span><span class="ident">new</span> <span class="punct">"</span><span class="string">bob</span><span class="punct">",</span> <span class="punct">"</span><span class="string">giraffe</span><span class="punct">"</span> -<span class="linenum">33</span> <span class="ident">actual</span> <span class="punct">=</span> <span class="constant">Animal</span><span class="punct">.</span><span class="ident">new</span> <span class="punct">"</span><span class="string">bob</span><span class="punct">",</span> <span class="punct">"</span><span class="string">tortoise</span><span class="punct">"</span> -<span class="offending"><span class="linenum">34</span> <span class="ident">expected</span><span class="punct">.</span><span class="ident">should</span> <span class="ident">eql</span><span class="punct">(</span><span class="ident">actual</span><span class="punct">)</span></span> -<span class="linenum">35</span> <span class="keyword">end</span> -<span class="linenum">36</span><span class="keyword">end</span></code></pre> - </div> - </dd> - </dl> -</div> -<div class="example_group"> - <dl> - <dt id="example_group_3">A consumer of a stub</dt> - <script type="text/javascript">moveProgressBar('47.0');</script> - <dd class="spec passed"><span class="passed_spec_name">should be able to stub methods on any Object</span></dd> - </dl> -</div> -<div class="example_group"> - <dl> - <dt id="example_group_4">A stubbed method on a class</dt> - <script type="text/javascript">moveProgressBar('52.9');</script> - <dd class="spec passed"><span class="passed_spec_name">should return the stubbed value</span></dd> - <script type="text/javascript">moveProgressBar('58.8');</script> - <dd class="spec passed"><span class="passed_spec_name">should revert to the original method after each spec</span></dd> - <script type="text/javascript">moveProgressBar('64.7');</script> - <dd class="spec passed"><span class="passed_spec_name">can stub! and mock the same message</span></dd> - </dl> -</div> -<div class="example_group"> - <dl> - <dt id="example_group_5">A mock</dt> - <script type="text/javascript">moveProgressBar('70.5');</script> - <dd class="spec passed"><span class="passed_spec_name">can stub!</span></dd> - <script type="text/javascript">moveProgressBar('76.4');</script> - <dd class="spec passed"><span class="passed_spec_name">can stub! and mock</span></dd> - <script type="text/javascript">moveProgressBar('82.3');</script> - <dd class="spec passed"><span class="passed_spec_name">can stub! and mock the same message</span></dd> - </dl> -</div> -<div class="example_group"> - <dl> - <dt id="example_group_6">pending example (using pending method)</dt> - <script type="text/javascript">makeYellow('example_group_6');</script> - <script type="text/javascript">moveProgressBar('88.2');</script> - <dd class="spec not_implemented"><span class="not_implemented_spec_name">should be reported as "PENDING: for some reason" (PENDING: for some reason)</span></dd> - </dl> -</div> -<div class="example_group"> - <dl> - <dt id="example_group_7">pending example (with no block)</dt> - <script type="text/javascript">makeYellow('example_group_7');</script> - <script type="text/javascript">moveProgressBar('94.1');</script> - <dd class="spec not_implemented"><span class="not_implemented_spec_name">should be reported as "PENDING: Not Yet Implemented" (PENDING: Not Yet Implemented)</span></dd> - </dl> -</div> -<div class="example_group"> - <dl> - <dt id="example_group_8">pending example (with block for pending)</dt> - <script type="text/javascript">makeYellow('example_group_8');</script> - <script type="text/javascript">moveProgressBar('100.0');</script> - <dd class="spec not_implemented"><span class="not_implemented_spec_name">should have a failing block, passed to pending, reported as "PENDING: for some reason" (PENDING: for some reason)</span></dd> - </dl> -</div> -<script type="text/javascript">document.getElementById('duration').innerHTML = "Finished in <strong>x seconds</strong>";</script> -<script type="text/javascript">document.getElementById('totals').innerHTML = "17 examples, 6 failures, 3 pending";</script> -</div> -</div> -</body> -</html> diff --git a/vendor/plugins/rspec/spec/spec/runner/formatter/html_formatted-1.8.5-jruby.html b/vendor/plugins/rspec/spec/spec/runner/formatter/html_formatted-1.8.5-jruby.html deleted file mode 100644 index 8bf1ed9cd..000000000 --- a/vendor/plugins/rspec/spec/spec/runner/formatter/html_formatted-1.8.5-jruby.html +++ /dev/null @@ -1,387 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html - PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" - "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head> - <title>RSpec results</title> - <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> - <meta http-equiv="Expires" content="-1" /> - <meta http-equiv="Pragma" content="no-cache" /> - <style type="text/css"> - body { - margin: 0; - padding: 0; - background: #fff; - font-size: 80%; - } - </style> -</head> -<body> -<div class="rspec-report"> - <script type="text/javascript"> - // <![CDATA[ -function moveProgressBar(percentDone) { - document.getElementById("rspec-header").style.width = percentDone +"%"; -} -function makeRed(element_id) { - document.getElementById(element_id).style.background = '#C40D0D'; - document.getElementById(element_id).style.color = '#FFFFFF'; -} - -function makeYellow(element_id) { - if (element_id == "rspec-header" && document.getElementById(element_id).style.background != '#C40D0D') - { - document.getElementById(element_id).style.background = '#FAF834'; - document.getElementById(element_id).style.color = '#000000'; - } - else - { - document.getElementById(element_id).style.background = '#FAF834'; - document.getElementById(element_id).style.color = '#000000'; - } -} - - // ]]> - </script> - <style type="text/css"> -#rspec-header { - background: #65C400; color: #fff; -} - -.rspec-report h1 { - margin: 0px 10px 0px 10px; - padding: 10px; - font-family: "Lucida Grande", Helvetica, sans-serif; - font-size: 1.8em; -} - -#summary { - margin: 0; padding: 5px 10px; - font-family: "Lucida Grande", Helvetica, sans-serif; - text-align: right; - position: absolute; - top: 0px; - right: 0px; -} - -#summary p { - margin: 0 0 0 2px; -} - -#summary #totals { - font-size: 1.2em; -} - -.example_group { - margin: 0 10px 5px; - background: #fff; -} - -dl { - margin: 0; padding: 0 0 5px; - font: normal 11px "Lucida Grande", Helvetica, sans-serif; -} - -dt { - padding: 3px; - background: #65C400; - color: #fff; - font-weight: bold; -} - -dd { - margin: 5px 0 5px 5px; - padding: 3px 3px 3px 18px; -} - -dd.spec.passed { - border-left: 5px solid #65C400; - border-bottom: 1px solid #65C400; - background: #DBFFB4; color: #3D7700; -} - -dd.spec.failed { - border-left: 5px solid #C20000; - border-bottom: 1px solid #C20000; - color: #C20000; background: #FFFBD3; -} - -dd.spec.not_implemented { - border-left: 5px solid #FAF834; - border-bottom: 1px solid #FAF834; - background: #FCFB98; color: #131313; -} - -dd.spec.pending_fixed { - border-left: 5px solid #0000C2; - border-bottom: 1px solid #0000C2; - color: #0000C2; background: #D3FBFF; -} - -.backtrace { - color: #000; - font-size: 12px; -} - -a { - color: #BE5C00; -} - -/* Ruby code, style similar to vibrant ink */ -.ruby { - font-size: 12px; - font-family: monospace; - color: white; - background-color: black; - padding: 0.1em 0 0.2em 0; -} - -.ruby .keyword { color: #FF6600; } -.ruby .constant { color: #339999; } -.ruby .attribute { color: white; } -.ruby .global { color: white; } -.ruby .module { color: white; } -.ruby .class { color: white; } -.ruby .string { color: #66FF00; } -.ruby .ident { color: white; } -.ruby .method { color: #FFCC00; } -.ruby .number { color: white; } -.ruby .char { color: white; } -.ruby .comment { color: #9933CC; } -.ruby .symbol { color: white; } -.ruby .regex { color: #44B4CC; } -.ruby .punct { color: white; } -.ruby .escape { color: white; } -.ruby .interp { color: white; } -.ruby .expr { color: white; } - -.ruby .offending { background-color: gray; } -.ruby .linenum { - width: 75px; - padding: 0.1em 1em 0.2em 0; - color: #000000; - background-color: #FFFBD3; -} - - </style> - -<div id="rspec-header"> - <h1>RSpec Results</h1> - - <div id="summary"> - <p id="totals"> </p> - <p id="duration"> </p> - </div> -</div> - -<div class="results"> -<div class="example_group"> - <dl> - <dt id="example_group_1">Mocker</dt> - <script type="text/javascript">moveProgressBar('5.8');</script> - <dd class="spec passed"><span class="passed_spec_name">should be able to call mock()</span></dd> - <script type="text/javascript">makeRed('rspec-header');</script> - <script type="text/javascript">makeRed('example_group_1');</script> - <script type="text/javascript">moveProgressBar('11.7');</script> - <dd class="spec failed"> - <span class="failed_spec_name">should fail when expected message not received</span> - <div class="failure" id="failure_1"> - <div class="message"><pre>Mock 'poke me' expected :poke with (any args) once, but received it 0 times</pre></div> - <div class="backtrace"><pre>/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/./failing_examples/mocking_example.rb:13:in `should_receive' -/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:24:in `run' -/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:20:in `chdir' -/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:20:in `chdir' -/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:20:in `instance_eval'</pre></div> - <pre class="ruby"><code><span class="linenum">11</span> it "should fail when expected message not received" do -<span class="linenum">12</span> mock = mock("poke me") -<span class="offending"><span class="linenum">13</span> mock.should_receive(:poke)</span> -<span class="linenum">14</span> end -<span class="linenum">15</span> -<span class="linenum">16</span><span class="comment"># gem install syntax to get syntax highlighting</span></code></pre> - </div> - </dd> - <script type="text/javascript">moveProgressBar('17.6');</script> - <dd class="spec failed"> - <span class="failed_spec_name">should fail when messages are received out of order</span> - <div class="failure" id="failure_2"> - <div class="message"><pre>Mock 'one two three' received :three out of order</pre></div> - <div class="backtrace"><pre>/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/./failing_examples/mocking_example.rb:22:in `three' -/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/./failing_examples/mocking_example.rb:16:in `instance_eval' -/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:24:in `run' -/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:20:in `chdir' -/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:20:in `chdir' -/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:20:in `instance_eval'</pre></div> - <pre class="ruby"><code><span class="linenum">20</span> mock.should_receive(:three).ordered -<span class="linenum">21</span> mock.one -<span class="offending"><span class="linenum">22</span> mock.three</span> -<span class="linenum">23</span> mock.two -<span class="linenum">24</span> end -<span class="linenum">25</span><span class="comment"># gem install syntax to get syntax highlighting</span></code></pre> - </div> - </dd> - <script type="text/javascript">moveProgressBar('23.5');</script> - <dd class="spec failed"> - <span class="failed_spec_name">should get yelled at when sending unexpected messages</span> - <div class="failure" id="failure_3"> - <div class="message"><pre>Mock 'don't talk to me' expected :any_message_at_all with (any args) 0 times, but received it once</pre></div> - <div class="backtrace"><pre>/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/./failing_examples/mocking_example.rb:28:in `should_not_receive' -/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:24:in `run' -/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:20:in `chdir' -/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:20:in `chdir' -/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:20:in `instance_eval'</pre></div> - <pre class="ruby"><code><span class="linenum">26</span> it "should get yelled at when sending unexpected messages" do -<span class="linenum">27</span> mock = mock("don't talk to me") -<span class="offending"><span class="linenum">28</span> mock.should_not_receive(:any_message_at_all)</span> -<span class="linenum">29</span> mock.any_message_at_all -<span class="linenum">30</span> end -<span class="linenum">31</span><span class="comment"># gem install syntax to get syntax highlighting</span></code></pre> - </div> - </dd> - <script type="text/javascript">moveProgressBar('29.4');</script> - <dd class="spec pending_fixed"> - <span class="failed_spec_name">has a bug we need to fix</span> - <div class="failure" id="failure_4"> - <div class="message"><pre>Expected pending 'here is the bug' to fail. No Error was raised.</pre></div> - <div class="backtrace"><pre>/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/./failing_examples/mocking_example.rb:33:in `pending' -/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/./failing_examples/mocking_example.rb:33:in `instance_eval' -/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:24:in `run' -/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:20:in `chdir' -/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:20:in `chdir' -/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:20:in `instance_eval'</pre></div> - <pre class="ruby"><code><span class="linenum">31</span> -<span class="linenum">32</span> it "has a bug we need to fix" do -<span class="offending"><span class="linenum">33</span> pending "here is the bug" do</span> -<span class="linenum">34</span> # Actually, no. It's fixed. This will fail because it passes :-) -<span class="linenum">35</span> mock = mock("Bug") -<span class="linenum">36</span><span class="comment"># gem install syntax to get syntax highlighting</span></code></pre> - </div> - </dd> - </dl> -</div> -<div class="example_group"> - <dl> - <dt id="example_group_2">Running specs with --diff</dt> - <script type="text/javascript">makeRed('example_group_2');</script> - <script type="text/javascript">moveProgressBar('35.2');</script> - <dd class="spec failed"> - <span class="failed_spec_name">should print diff of different strings</span> - <div class="failure" id="failure_5"> - <div class="message"><pre>expected: "RSpec is a\nbehaviour driven development\nframework for Ruby\n", - got: "RSpec is a\nbehavior driven development\nframework for Ruby\n" (using ==) -Diff: -@@ -1,4 +1,4 @@ - RSpec is a --behavior driven development -+behaviour driven development - framework for Ruby -</pre></div> - <div class="backtrace"><pre>/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/./failing_examples/diffing_spec.rb:13:in `==' -/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:24:in `run' -/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:20:in `chdir' -/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:20:in `chdir' -/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:20:in `instance_eval'</pre></div> - <pre class="ruby"><code><span class="linenum">11</span>framework for Ruby -<span class="linenum">12</span>EOF -<span class="offending"><span class="linenum">13</span> usa.should == uk</span> -<span class="linenum">14</span> end -<span class="linenum">15</span> -<span class="linenum">16</span><span class="comment"># gem install syntax to get syntax highlighting</span></code></pre> - </div> - </dd> - <script type="text/javascript">moveProgressBar('41.1');</script> - <dd class="spec failed"> - <span class="failed_spec_name">should print diff of different objects' pretty representation</span> - <div class="failure" id="failure_6"> - <div class="message"><pre>expected <Animal -name=bob, -species=tortoise -> -, got <Animal -name=bob, -species=giraffe -> - (using .eql?) -Diff: -@@ -1,5 +1,5 @@ - <Animal - name=bob, --species=giraffe -+species=tortoise - > -</pre></div> - <div class="backtrace"><pre>/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/./failing_examples/diffing_spec.rb:34:in `should' -/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/./failing_examples/diffing_spec.rb:31:in `instance_eval' -/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:24:in `run' -/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:20:in `chdir' -/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:20:in `chdir' -/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:20:in `instance_eval'</pre></div> - <pre class="ruby"><code><span class="linenum">32</span> expected = Animal.new "bob", "giraffe" -<span class="linenum">33</span> actual = Animal.new "bob", "tortoise" -<span class="offending"><span class="linenum">34</span> expected.should eql(actual)</span> -<span class="linenum">35</span> end -<span class="linenum">36</span>end -<span class="linenum">37</span><span class="comment"># gem install syntax to get syntax highlighting</span></code></pre> - </div> - </dd> - </dl> -</div> -<div class="example_group"> - <dl> - <dt id="example_group_3">A consumer of a stub</dt> - <script type="text/javascript">moveProgressBar('47.0');</script> - <dd class="spec passed"><span class="passed_spec_name">should be able to stub methods on any Object</span></dd> - </dl> -</div> -<div class="example_group"> - <dl> - <dt id="example_group_4">A stubbed method on a class</dt> - <script type="text/javascript">moveProgressBar('52.9');</script> - <dd class="spec passed"><span class="passed_spec_name">should return the stubbed value</span></dd> - <script type="text/javascript">moveProgressBar('58.8');</script> - <dd class="spec passed"><span class="passed_spec_name">should revert to the original method after each spec</span></dd> - <script type="text/javascript">moveProgressBar('64.7');</script> - <dd class="spec passed"><span class="passed_spec_name">can stub! and mock the same message</span></dd> - </dl> -</div> -<div class="example_group"> - <dl> - <dt id="example_group_5">A mock</dt> - <script type="text/javascript">moveProgressBar('70.5');</script> - <dd class="spec passed"><span class="passed_spec_name">can stub!</span></dd> - <script type="text/javascript">moveProgressBar('76.4');</script> - <dd class="spec passed"><span class="passed_spec_name">can stub! and mock</span></dd> - <script type="text/javascript">moveProgressBar('82.3');</script> - <dd class="spec passed"><span class="passed_spec_name">can stub! and mock the same message</span></dd> - </dl> -</div> -<div class="example_group"> - <dl> - <dt id="example_group_6">pending example (using pending method)</dt> - <script type="text/javascript">makeYellow('example_group_6');</script> - <script type="text/javascript">moveProgressBar('88.2');</script> - <dd class="spec not_implemented"><span class="not_implemented_spec_name">should be reported as "PENDING: for some reason" (PENDING: for some reason)</span></dd> - </dl> -</div> -<div class="example_group"> - <dl> - <dt id="example_group_7">pending example (with no block)</dt> - <script type="text/javascript">makeYellow('example_group_7');</script> - <script type="text/javascript">moveProgressBar('94.1');</script> - <dd class="spec not_implemented"><span class="not_implemented_spec_name">should be reported as "PENDING: Not Yet Implemented" (PENDING: Not Yet Implemented)</span></dd> - </dl> -</div> -<div class="example_group"> - <dl> - <dt id="example_group_8">pending example (with block for pending)</dt> - <script type="text/javascript">makeYellow('example_group_8');</script> - <script type="text/javascript">moveProgressBar('100.0');</script> - <dd class="spec not_implemented"><span class="not_implemented_spec_name">should have a failing block, passed to pending, reported as "PENDING: for some reason" (PENDING: for some reason)</span></dd> - </dl> -</div> -<script type="text/javascript">document.getElementById('duration').innerHTML = "Finished in <strong>x seconds</strong>";</script> -<script type="text/javascript">document.getElementById('totals').innerHTML = "17 examples, 6 failures, 3 pending";</script> -</div> -</div> -</body> -</html> diff --git a/vendor/plugins/rspec/spec/spec/runner/formatter/html_formatted-1.8.5.html b/vendor/plugins/rspec/spec/spec/runner/formatter/html_formatted-1.8.5.html deleted file mode 100644 index cda7226bf..000000000 --- a/vendor/plugins/rspec/spec/spec/runner/formatter/html_formatted-1.8.5.html +++ /dev/null @@ -1,371 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html - PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" - "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head> - <title>RSpec results</title> - <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> - <meta http-equiv="Expires" content="-1" /> - <meta http-equiv="Pragma" content="no-cache" /> - <style type="text/css"> - body { - margin: 0; - padding: 0; - background: #fff; - font-size: 80%; - } - </style> -</head> -<body> -<div class="rspec-report"> - <script type="text/javascript"> - // <![CDATA[ -function moveProgressBar(percentDone) { - document.getElementById("rspec-header").style.width = percentDone +"%"; -} -function makeRed(element_id) { - document.getElementById(element_id).style.background = '#C40D0D'; - document.getElementById(element_id).style.color = '#FFFFFF'; -} - -function makeYellow(element_id) { - if (element_id == "rspec-header" && document.getElementById(element_id).style.background != '#C40D0D') - { - document.getElementById(element_id).style.background = '#FAF834'; - document.getElementById(element_id).style.color = '#000000'; - } - else - { - document.getElementById(element_id).style.background = '#FAF834'; - document.getElementById(element_id).style.color = '#000000'; - } -} - - // ]]> - </script> - <style type="text/css"> -#rspec-header { - background: #65C400; color: #fff; -} - -.rspec-report h1 { - margin: 0px 10px 0px 10px; - padding: 10px; - font-family: "Lucida Grande", Helvetica, sans-serif; - font-size: 1.8em; -} - -#summary { - margin: 0; padding: 5px 10px; - font-family: "Lucida Grande", Helvetica, sans-serif; - text-align: right; - position: absolute; - top: 0px; - right: 0px; -} - -#summary p { - margin: 0 0 0 2px; -} - -#summary #totals { - font-size: 1.2em; -} - -.example_group { - margin: 0 10px 5px; - background: #fff; -} - -dl { - margin: 0; padding: 0 0 5px; - font: normal 11px "Lucida Grande", Helvetica, sans-serif; -} - -dt { - padding: 3px; - background: #65C400; - color: #fff; - font-weight: bold; -} - -dd { - margin: 5px 0 5px 5px; - padding: 3px 3px 3px 18px; -} - -dd.spec.passed { - border-left: 5px solid #65C400; - border-bottom: 1px solid #65C400; - background: #DBFFB4; color: #3D7700; -} - -dd.spec.failed { - border-left: 5px solid #C20000; - border-bottom: 1px solid #C20000; - color: #C20000; background: #FFFBD3; -} - -dd.spec.not_implemented { - border-left: 5px solid #FAF834; - border-bottom: 1px solid #FAF834; - background: #FCFB98; color: #131313; -} - -dd.spec.pending_fixed { - border-left: 5px solid #0000C2; - border-bottom: 1px solid #0000C2; - color: #0000C2; background: #D3FBFF; -} - -.backtrace { - color: #000; - font-size: 12px; -} - -a { - color: #BE5C00; -} - -/* Ruby code, style similar to vibrant ink */ -.ruby { - font-size: 12px; - font-family: monospace; - color: white; - background-color: black; - padding: 0.1em 0 0.2em 0; -} - -.ruby .keyword { color: #FF6600; } -.ruby .constant { color: #339999; } -.ruby .attribute { color: white; } -.ruby .global { color: white; } -.ruby .module { color: white; } -.ruby .class { color: white; } -.ruby .string { color: #66FF00; } -.ruby .ident { color: white; } -.ruby .method { color: #FFCC00; } -.ruby .number { color: white; } -.ruby .char { color: white; } -.ruby .comment { color: #9933CC; } -.ruby .symbol { color: white; } -.ruby .regex { color: #44B4CC; } -.ruby .punct { color: white; } -.ruby .escape { color: white; } -.ruby .interp { color: white; } -.ruby .expr { color: white; } - -.ruby .offending { background-color: gray; } -.ruby .linenum { - width: 75px; - padding: 0.1em 1em 0.2em 0; - color: #000000; - background-color: #FFFBD3; -} - - </style> - -<div id="rspec-header"> - <h1>RSpec Results</h1> - - <div id="summary"> - <p id="totals"> </p> - <p id="duration"> </p> - </div> -</div> - -<div class="results"> -<div class="example_group"> - <dl> - <dt id="example_group_1">Mocker</dt> - <script type="text/javascript">moveProgressBar('5.8');</script> - <dd class="spec passed"><span class="passed_spec_name">should be able to call mock()</span></dd> - <script type="text/javascript">makeRed('rspec-header');</script> - <script type="text/javascript">makeRed('example_group_1');</script> - <script type="text/javascript">moveProgressBar('11.7');</script> - <dd class="spec failed"> - <span class="failed_spec_name">should fail when expected message not received</span> - <div class="failure" id="failure_1"> - <div class="message"><pre>Mock 'poke me' expected :poke with (any args) once, but received it 0 times</pre></div> - <div class="backtrace"><pre>./failing_examples/mocking_example.rb:13: -./spec/spec/runner/formatter/html_formatter_spec.rb:17: -./spec/spec/runner/formatter/html_formatter_spec.rb:13:in `chdir' -./spec/spec/runner/formatter/html_formatter_spec.rb:13:</pre></div> - <pre class="ruby"><code><span class="linenum">11</span> <span class="ident">it</span> <span class="punct">"</span><span class="string">should fail when expected message not received</span><span class="punct">"</span> <span class="keyword">do</span> -<span class="linenum">12</span> <span class="ident">mock</span> <span class="punct">=</span> <span class="ident">mock</span><span class="punct">("</span><span class="string">poke me</span><span class="punct">")</span> -<span class="offending"><span class="linenum">13</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">should_receive</span><span class="punct">(</span><span class="symbol">:poke</span><span class="punct">)</span></span> -<span class="linenum">14</span> <span class="keyword">end</span> -<span class="linenum">15</span> </code></pre> - </div> - </dd> - <script type="text/javascript">moveProgressBar('17.6');</script> - <dd class="spec failed"> - <span class="failed_spec_name">should fail when messages are received out of order</span> - <div class="failure" id="failure_2"> - <div class="message"><pre>Mock 'one two three' received :three out of order</pre></div> - <div class="backtrace"><pre>./failing_examples/mocking_example.rb:22: -./spec/spec/runner/formatter/html_formatter_spec.rb:17: -./spec/spec/runner/formatter/html_formatter_spec.rb:13:in `chdir' -./spec/spec/runner/formatter/html_formatter_spec.rb:13:</pre></div> - <pre class="ruby"><code><span class="linenum">20</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">should_receive</span><span class="punct">(</span><span class="symbol">:three</span><span class="punct">).</span><span class="ident">ordered</span> -<span class="linenum">21</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">one</span> -<span class="offending"><span class="linenum">22</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">three</span></span> -<span class="linenum">23</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">two</span> -<span class="linenum">24</span> <span class="keyword">end</span></code></pre> - </div> - </dd> - <script type="text/javascript">moveProgressBar('23.5');</script> - <dd class="spec failed"> - <span class="failed_spec_name">should get yelled at when sending unexpected messages</span> - <div class="failure" id="failure_3"> - <div class="message"><pre>Mock 'don't talk to me' expected :any_message_at_all with (any args) 0 times, but received it once</pre></div> - <div class="backtrace"><pre>./failing_examples/mocking_example.rb:28: -./spec/spec/runner/formatter/html_formatter_spec.rb:17: -./spec/spec/runner/formatter/html_formatter_spec.rb:13:in `chdir' -./spec/spec/runner/formatter/html_formatter_spec.rb:13:</pre></div> - <pre class="ruby"><code><span class="linenum">26</span> <span class="ident">it</span> <span class="punct">"</span><span class="string">should get yelled at when sending unexpected messages</span><span class="punct">"</span> <span class="keyword">do</span> -<span class="linenum">27</span> <span class="ident">mock</span> <span class="punct">=</span> <span class="ident">mock</span><span class="punct">("</span><span class="string">don't talk to me</span><span class="punct">")</span> -<span class="offending"><span class="linenum">28</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">should_not_receive</span><span class="punct">(</span><span class="symbol">:any_message_at_all</span><span class="punct">)</span></span> -<span class="linenum">29</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">any_message_at_all</span> -<span class="linenum">30</span> <span class="keyword">end</span></code></pre> - </div> - </dd> - <script type="text/javascript">moveProgressBar('29.4');</script> - <dd class="spec pending_fixed"> - <span class="failed_spec_name">has a bug we need to fix</span> - <div class="failure" id="failure_4"> - <div class="message"><pre>Expected pending 'here is the bug' to fail. No Error was raised.</pre></div> - <div class="backtrace"><pre>./failing_examples/mocking_example.rb:33: -./spec/spec/runner/formatter/html_formatter_spec.rb:17: -./spec/spec/runner/formatter/html_formatter_spec.rb:13:in `chdir' -./spec/spec/runner/formatter/html_formatter_spec.rb:13:</pre></div> - <pre class="ruby"><code><span class="linenum">31</span> -<span class="linenum">32</span> <span class="ident">it</span> <span class="punct">"</span><span class="string">has a bug we need to fix</span><span class="punct">"</span> <span class="keyword">do</span> -<span class="offending"><span class="linenum">33</span> <span class="ident">pending</span> <span class="punct">"</span><span class="string">here is the bug</span><span class="punct">"</span> <span class="keyword">do</span></span> -<span class="linenum">34</span> <span class="comment"># Actually, no. It's fixed. This will fail because it passes :-)</span> -<span class="linenum">35</span> <span class="ident">mock</span> <span class="punct">=</span> <span class="ident">mock</span><span class="punct">("</span><span class="string">Bug</span><span class="punct">")</span></code></pre> - </div> - </dd> - </dl> -</div> -<div class="example_group"> - <dl> - <dt id="example_group_2">Running specs with --diff</dt> - <script type="text/javascript">makeRed('example_group_2');</script> - <script type="text/javascript">moveProgressBar('35.2');</script> - <dd class="spec failed"> - <span class="failed_spec_name">should print diff of different strings</span> - <div class="failure" id="failure_5"> - <div class="message"><pre>expected: "RSpec is a\nbehaviour driven development\nframework for Ruby\n", - got: "RSpec is a\nbehavior driven development\nframework for Ruby\n" (using ==) -Diff: -@@ -1,4 +1,4 @@ - RSpec is a --behavior driven development -+behaviour driven development - framework for Ruby -</pre></div> - <div class="backtrace"><pre>./failing_examples/diffing_spec.rb:13: -./spec/spec/runner/formatter/html_formatter_spec.rb:17: -./spec/spec/runner/formatter/html_formatter_spec.rb:13:in `chdir' -./spec/spec/runner/formatter/html_formatter_spec.rb:13:</pre></div> - <pre class="ruby"><code><span class="linenum">11</span><span class="ident">framework</span> <span class="keyword">for</span> <span class="constant">Ruby</span> -<span class="linenum">12</span><span class="constant">EOF</span> -<span class="offending"><span class="linenum">13</span> <span class="ident">usa</span><span class="punct">.</span><span class="ident">should</span> <span class="punct">==</span> <span class="ident">uk</span></span> -<span class="linenum">14</span> <span class="keyword">end</span></code></pre> - </div> - </dd> - <script type="text/javascript">moveProgressBar('41.1');</script> - <dd class="spec failed"> - <span class="failed_spec_name">should print diff of different objects' pretty representation</span> - <div class="failure" id="failure_6"> - <div class="message"><pre>expected <Animal -name=bob, -species=tortoise -> -, got <Animal -name=bob, -species=giraffe -> - (using .eql?) -Diff: -@@ -1,5 +1,5 @@ - <Animal - name=bob, --species=giraffe -+species=tortoise - > -</pre></div> - <div class="backtrace"><pre>./failing_examples/diffing_spec.rb:34: -./spec/spec/runner/formatter/html_formatter_spec.rb:17: -./spec/spec/runner/formatter/html_formatter_spec.rb:13:in `chdir' -./spec/spec/runner/formatter/html_formatter_spec.rb:13:</pre></div> - <pre class="ruby"><code><span class="linenum">32</span> <span class="ident">expected</span> <span class="punct">=</span> <span class="constant">Animal</span><span class="punct">.</span><span class="ident">new</span> <span class="punct">"</span><span class="string">bob</span><span class="punct">",</span> <span class="punct">"</span><span class="string">giraffe</span><span class="punct">"</span> -<span class="linenum">33</span> <span class="ident">actual</span> <span class="punct">=</span> <span class="constant">Animal</span><span class="punct">.</span><span class="ident">new</span> <span class="punct">"</span><span class="string">bob</span><span class="punct">",</span> <span class="punct">"</span><span class="string">tortoise</span><span class="punct">"</span> -<span class="offending"><span class="linenum">34</span> <span class="ident">expected</span><span class="punct">.</span><span class="ident">should</span> <span class="ident">eql</span><span class="punct">(</span><span class="ident">actual</span><span class="punct">)</span></span> -<span class="linenum">35</span> <span class="keyword">end</span> -<span class="linenum">36</span><span class="keyword">end</span></code></pre> - </div> - </dd> - </dl> -</div> -<div class="example_group"> - <dl> - <dt id="example_group_3">A consumer of a stub</dt> - <script type="text/javascript">moveProgressBar('47.0');</script> - <dd class="spec passed"><span class="passed_spec_name">should be able to stub methods on any Object</span></dd> - </dl> -</div> -<div class="example_group"> - <dl> - <dt id="example_group_4">A stubbed method on a class</dt> - <script type="text/javascript">moveProgressBar('52.9');</script> - <dd class="spec passed"><span class="passed_spec_name">should return the stubbed value</span></dd> - <script type="text/javascript">moveProgressBar('58.8');</script> - <dd class="spec passed"><span class="passed_spec_name">should revert to the original method after each spec</span></dd> - <script type="text/javascript">moveProgressBar('64.7');</script> - <dd class="spec passed"><span class="passed_spec_name">can stub! and mock the same message</span></dd> - </dl> -</div> -<div class="example_group"> - <dl> - <dt id="example_group_5">A mock</dt> - <script type="text/javascript">moveProgressBar('70.5');</script> - <dd class="spec passed"><span class="passed_spec_name">can stub!</span></dd> - <script type="text/javascript">moveProgressBar('76.4');</script> - <dd class="spec passed"><span class="passed_spec_name">can stub! and mock</span></dd> - <script type="text/javascript">moveProgressBar('82.3');</script> - <dd class="spec passed"><span class="passed_spec_name">can stub! and mock the same message</span></dd> - </dl> -</div> -<div class="example_group"> - <dl> - <dt id="example_group_6">pending example (using pending method)</dt> - <script type="text/javascript">makeYellow('example_group_6');</script> - <script type="text/javascript">moveProgressBar('88.2');</script> - <dd class="spec not_implemented"><span class="not_implemented_spec_name">should be reported as "PENDING: for some reason" (PENDING: for some reason)</span></dd> - </dl> -</div> -<div class="example_group"> - <dl> - <dt id="example_group_7">pending example (with no block)</dt> - <script type="text/javascript">makeYellow('example_group_7');</script> - <script type="text/javascript">moveProgressBar('94.1');</script> - <dd class="spec not_implemented"><span class="not_implemented_spec_name">should be reported as "PENDING: Not Yet Implemented" (PENDING: Not Yet Implemented)</span></dd> - </dl> -</div> -<div class="example_group"> - <dl> - <dt id="example_group_8">pending example (with block for pending)</dt> - <script type="text/javascript">makeYellow('example_group_8');</script> - <script type="text/javascript">moveProgressBar('100.0');</script> - <dd class="spec not_implemented"><span class="not_implemented_spec_name">should have a failing block, passed to pending, reported as "PENDING: for some reason" (PENDING: for some reason)</span></dd> - </dl> -</div> -<script type="text/javascript">document.getElementById('duration').innerHTML = "Finished in <strong>x seconds</strong>";</script> -<script type="text/javascript">document.getElementById('totals').innerHTML = "17 examples, 6 failures, 3 pending";</script> -</div> -</div> -</body> -</html> diff --git a/vendor/plugins/rspec/spec/spec/runner/formatter/html_formatted-1.8.6-jruby.html b/vendor/plugins/rspec/spec/spec/runner/formatter/html_formatted-1.8.6-jruby.html index 466621865..029cee62e 100644 --- a/vendor/plugins/rspec/spec/spec/runner/formatter/html_formatted-1.8.6-jruby.html +++ b/vendor/plugins/rspec/spec/spec/runner/formatter/html_formatted-1.8.6-jruby.html @@ -16,9 +16,6 @@ font-size: 80%; } </style> -</head> -<body> -<div class="rspec-report"> <script type="text/javascript"> // <![CDATA[ function moveProgressBar(percentDone) { @@ -46,7 +43,7 @@ function makeYellow(element_id) { </script> <style type="text/css"> #rspec-header { - background: #65C400; color: #fff; + background: #65C400; color: #fff; height: 4em; } .rspec-report h1 { @@ -54,15 +51,16 @@ function makeYellow(element_id) { padding: 10px; font-family: "Lucida Grande", Helvetica, sans-serif; font-size: 1.8em; + position: absolute; } #summary { margin: 0; padding: 5px 10px; font-family: "Lucida Grande", Helvetica, sans-serif; text-align: right; - position: absolute; top: 0px; right: 0px; + float:right; } #summary p { @@ -165,9 +163,14 @@ a { } </style> +</head> +<body> +<div class="rspec-report"> <div id="rspec-header"> - <h1>RSpec Results</h1> + <div id="label"> + <h1>RSpec Code Examples</h1> + </div> <div id="summary"> <p id="totals"> </p> @@ -187,52 +190,50 @@ a { <dd class="spec failed"> <span class="failed_spec_name">should fail when expected message not received</span> <div class="failure" id="failure_1"> - <div class="message"><pre>Mock 'poke me' expected :poke with (any args) once, but received it 0 times</pre></div> - <div class="backtrace"><pre>/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/./failing_examples/mocking_example.rb:13: -/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/./spec/spec/runner/formatter/html_formatter_spec.rb:28: -/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/./spec/spec/runner/formatter/html_formatter_spec.rb:24:in `chdir' -/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/./spec/spec/runner/formatter/html_formatter_spec.rb:24: -/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/./spec/spec/runner/formatter/html_formatter_spec.rb:24:in `instance_eval'</pre></div> - <pre class="ruby"><code><span class="linenum">11</span> <span class="ident">it</span> <span class="punct">"</span><span class="string">should fail when expected message not received</span><span class="punct">"</span> <span class="keyword">do</span> -<span class="linenum">12</span> <span class="ident">mock</span> <span class="punct">=</span> <span class="ident">mock</span><span class="punct">("</span><span class="string">poke me</span><span class="punct">")</span> -<span class="offending"><span class="linenum">13</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">should_receive</span><span class="punct">(</span><span class="symbol">:poke</span><span class="punct">)</span></span> -<span class="linenum">14</span> <span class="keyword">end</span> -<span class="linenum">15</span> </code></pre> + <div class="message"><pre>Mock "poke me" expected :poke with (any args) once, but received it 0 times</pre></div> + <div class="backtrace"><pre>examples/failing/mocking_example.rb:11: +spec/spec_helper.rb:42:in `run_with' +./spec/spec/runner/formatter/html_formatter_spec.rb:41: +./spec/spec/runner/formatter/html_formatter_spec.rb:29:in `chdir' +./spec/spec/runner/formatter/html_formatter_spec.rb:29:</pre></div> + <pre class="ruby"><code><span class="linenum">9</span> <span class="ident">it</span> <span class="punct">"</span><span class="string">should fail when expected message not received</span><span class="punct">"</span> <span class="keyword">do</span> +<span class="linenum">10</span> <span class="ident">mock</span> <span class="punct">=</span> <span class="ident">mock</span><span class="punct">("</span><span class="string">poke me</span><span class="punct">")</span> +<span class="offending"><span class="linenum">11</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">should_receive</span><span class="punct">(</span><span class="symbol">:poke</span><span class="punct">)</span></span> +<span class="linenum">12</span> <span class="keyword">end</span> +<span class="linenum">13</span> </code></pre> </div> </dd> <script type="text/javascript">moveProgressBar('17.6');</script> <dd class="spec failed"> <span class="failed_spec_name">should fail when messages are received out of order</span> <div class="failure" id="failure_2"> - <div class="message"><pre>Mock 'one two three' received :three out of order</pre></div> - <div class="backtrace"><pre>/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/./failing_examples/mocking_example.rb:22: -/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/./failing_examples/mocking_example.rb:16:in `instance_eval' -/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/./spec/spec/runner/formatter/html_formatter_spec.rb:28: -/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/./spec/spec/runner/formatter/html_formatter_spec.rb:24:in `chdir' -/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/./spec/spec/runner/formatter/html_formatter_spec.rb:24: -/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/./spec/spec/runner/formatter/html_formatter_spec.rb:24:in `instance_eval'</pre></div> - <pre class="ruby"><code><span class="linenum">20</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">should_receive</span><span class="punct">(</span><span class="symbol">:three</span><span class="punct">).</span><span class="ident">ordered</span> -<span class="linenum">21</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">one</span> -<span class="offending"><span class="linenum">22</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">three</span></span> -<span class="linenum">23</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">two</span> -<span class="linenum">24</span> <span class="keyword">end</span></code></pre> + <div class="message"><pre>Mock "one two three" received :three out of order</pre></div> + <div class="backtrace"><pre>examples/failing/mocking_example.rb:20: +spec/spec_helper.rb:42:in `run_with' +./spec/spec/runner/formatter/html_formatter_spec.rb:41: +./spec/spec/runner/formatter/html_formatter_spec.rb:29:in `chdir' +./spec/spec/runner/formatter/html_formatter_spec.rb:29:</pre></div> + <pre class="ruby"><code><span class="linenum">18</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">should_receive</span><span class="punct">(</span><span class="symbol">:three</span><span class="punct">).</span><span class="ident">ordered</span> +<span class="linenum">19</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">one</span> +<span class="offending"><span class="linenum">20</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">three</span></span> +<span class="linenum">21</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">two</span> +<span class="linenum">22</span> <span class="keyword">end</span></code></pre> </div> </dd> <script type="text/javascript">moveProgressBar('23.5');</script> <dd class="spec failed"> <span class="failed_spec_name">should get yelled at when sending unexpected messages</span> <div class="failure" id="failure_3"> - <div class="message"><pre>Mock 'don't talk to me' expected :any_message_at_all with (any args) 0 times, but received it once</pre></div> - <div class="backtrace"><pre>/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/./failing_examples/mocking_example.rb:28: -/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/./spec/spec/runner/formatter/html_formatter_spec.rb:28: -/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/./spec/spec/runner/formatter/html_formatter_spec.rb:24:in `chdir' -/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/./spec/spec/runner/formatter/html_formatter_spec.rb:24: -/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/./spec/spec/runner/formatter/html_formatter_spec.rb:24:in `instance_eval'</pre></div> - <pre class="ruby"><code><span class="linenum">26</span> <span class="ident">it</span> <span class="punct">"</span><span class="string">should get yelled at when sending unexpected messages</span><span class="punct">"</span> <span class="keyword">do</span> -<span class="linenum">27</span> <span class="ident">mock</span> <span class="punct">=</span> <span class="ident">mock</span><span class="punct">("</span><span class="string">don't talk to me</span><span class="punct">")</span> -<span class="offending"><span class="linenum">28</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">should_not_receive</span><span class="punct">(</span><span class="symbol">:any_message_at_all</span><span class="punct">)</span></span> -<span class="linenum">29</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">any_message_at_all</span> -<span class="linenum">30</span> <span class="keyword">end</span></code></pre> + <div class="message"><pre>Mock "don't talk to me" expected :any_message_at_all with (no args) 0 times, but received it once</pre></div> + <div class="backtrace"><pre>examples/failing/mocking_example.rb:27: +spec/spec_helper.rb:42:in `run_with' +./spec/spec/runner/formatter/html_formatter_spec.rb:41: +./spec/spec/runner/formatter/html_formatter_spec.rb:29:in `chdir' +./spec/spec/runner/formatter/html_formatter_spec.rb:29:</pre></div> + <pre class="ruby"><code><span class="linenum">25</span> <span class="ident">mock</span> <span class="punct">=</span> <span class="ident">mock</span><span class="punct">("</span><span class="string">don't talk to me</span><span class="punct">")</span> +<span class="linenum">26</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">should_not_receive</span><span class="punct">(</span><span class="symbol">:any_message_at_all</span><span class="punct">)</span> +<span class="offending"><span class="linenum">27</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">any_message_at_all</span></span> +<span class="linenum">28</span> <span class="keyword">end</span></code></pre> </div> </dd> <script type="text/javascript">moveProgressBar('29.4');</script> @@ -240,17 +241,16 @@ a { <span class="failed_spec_name">has a bug we need to fix</span> <div class="failure" id="failure_4"> <div class="message"><pre>Expected pending 'here is the bug' to fail. No Error was raised.</pre></div> - <div class="backtrace"><pre>/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/./failing_examples/mocking_example.rb:33: -/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/./failing_examples/mocking_example.rb:33:in `instance_eval' -/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/./spec/spec/runner/formatter/html_formatter_spec.rb:28: -/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/./spec/spec/runner/formatter/html_formatter_spec.rb:24:in `chdir' -/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/./spec/spec/runner/formatter/html_formatter_spec.rb:24: -/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/./spec/spec/runner/formatter/html_formatter_spec.rb:24:in `instance_eval'</pre></div> - <pre class="ruby"><code><span class="linenum">31</span> -<span class="linenum">32</span> <span class="ident">it</span> <span class="punct">"</span><span class="string">has a bug we need to fix</span><span class="punct">"</span> <span class="keyword">do</span> -<span class="offending"><span class="linenum">33</span> <span class="ident">pending</span> <span class="punct">"</span><span class="string">here is the bug</span><span class="punct">"</span> <span class="keyword">do</span></span> -<span class="linenum">34</span> <span class="comment"># Actually, no. It's fixed. This will fail because it passes :-)</span> -<span class="linenum">35</span> <span class="ident">mock</span> <span class="punct">=</span> <span class="ident">mock</span><span class="punct">("</span><span class="string">Bug</span><span class="punct">")</span></code></pre> + <div class="backtrace"><pre>examples/failing/mocking_example.rb:31: +spec/spec_helper.rb:42:in `run_with' +./spec/spec/runner/formatter/html_formatter_spec.rb:41: +./spec/spec/runner/formatter/html_formatter_spec.rb:29:in `chdir' +./spec/spec/runner/formatter/html_formatter_spec.rb:29:</pre></div> + <pre class="ruby"><code><span class="linenum">29</span> +<span class="linenum">30</span> <span class="ident">it</span> <span class="punct">"</span><span class="string">has a bug we need to fix</span><span class="punct">"</span> <span class="keyword">do</span> +<span class="offending"><span class="linenum">31</span> <span class="ident">pending</span> <span class="punct">"</span><span class="string">here is the bug</span><span class="punct">"</span> <span class="keyword">do</span></span> +<span class="linenum">32</span> <span class="comment"># Actually, no. It's fixed. This will fail because it passes :-)</span> +<span class="linenum">33</span> <span class="ident">mock</span> <span class="punct">=</span> <span class="ident">mock</span><span class="punct">("</span><span class="string">Bug</span><span class="punct">")</span></code></pre> </div> </dd> </dl> @@ -265,19 +265,19 @@ a { <div class="failure" id="failure_5"> <div class="message"><pre>expected: "RSpec is a\nbehaviour driven development\nframework for Ruby\n", got: "RSpec is a\nbehavior driven development\nframework for Ruby\n" (using ==) -Diff: + + Diff: @@ -1,4 +1,4 @@ RSpec is a --behavior driven development -+behaviour driven development +-behaviour driven development ++behavior driven development framework for Ruby </pre></div> - <div class="backtrace"><pre>/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/./failing_examples/diffing_spec.rb:13: -/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/./failing_examples/diffing_spec.rb:2:in `instance_eval' -/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/./spec/spec/runner/formatter/html_formatter_spec.rb:28: -/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/./spec/spec/runner/formatter/html_formatter_spec.rb:24:in `chdir' -/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/./spec/spec/runner/formatter/html_formatter_spec.rb:24: -/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/./spec/spec/runner/formatter/html_formatter_spec.rb:24:in `instance_eval'</pre></div> + <div class="backtrace"><pre>examples/failing/diffing_spec.rb:13: +spec/spec_helper.rb:42:in `run_with' +./spec/spec/runner/formatter/html_formatter_spec.rb:41: +./spec/spec/runner/formatter/html_formatter_spec.rb:29:in `chdir' +./spec/spec/runner/formatter/html_formatter_spec.rb:29:</pre></div> <pre class="ruby"><code><span class="linenum">11</span><span class="ident">framework</span> <span class="keyword">for</span> <span class="constant">Ruby</span> <span class="linenum">12</span><span class="constant">EOF</span> <span class="offending"><span class="linenum">13</span> <span class="ident">usa</span><span class="punct">.</span><span class="ident">should</span> <span class="punct">==</span> <span class="ident">uk</span></span> @@ -288,29 +288,25 @@ Diff: <dd class="spec failed"> <span class="failed_spec_name">should print diff of different objects' pretty representation</span> <div class="failure" id="failure_6"> - <div class="message"><pre>expected <Animal + <div class="message"><pre> +expected <Animal name=bob, species=tortoise > -, got <Animal + + got <Animal name=bob, species=giraffe > - (using .eql?) -Diff: -@@ -1,5 +1,5 @@ - <Animal - name=bob, --species=giraffe -+species=tortoise - > + + +(compared using eql?) </pre></div> - <div class="backtrace"><pre>/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/./failing_examples/diffing_spec.rb:34: -/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/./failing_examples/diffing_spec.rb:31:in `instance_eval' -/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/./spec/spec/runner/formatter/html_formatter_spec.rb:28: -/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/./spec/spec/runner/formatter/html_formatter_spec.rb:24:in `chdir' -/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/./spec/spec/runner/formatter/html_formatter_spec.rb:24: -/Users/david/projects/ruby/jruby/testsuites/rspec/target/rspec/./spec/spec/runner/formatter/html_formatter_spec.rb:24:in `instance_eval'</pre></div> + <div class="backtrace"><pre>examples/failing/diffing_spec.rb:34: +spec/spec_helper.rb:42:in `run_with' +./spec/spec/runner/formatter/html_formatter_spec.rb:41: +./spec/spec/runner/formatter/html_formatter_spec.rb:29:in `chdir' +./spec/spec/runner/formatter/html_formatter_spec.rb:29:</pre></div> <pre class="ruby"><code><span class="linenum">32</span> <span class="ident">expected</span> <span class="punct">=</span> <span class="constant">Animal</span><span class="punct">.</span><span class="ident">new</span> <span class="punct">"</span><span class="string">bob</span><span class="punct">",</span> <span class="punct">"</span><span class="string">giraffe</span><span class="punct">"</span> <span class="linenum">33</span> <span class="ident">actual</span> <span class="punct">=</span> <span class="constant">Animal</span><span class="punct">.</span><span class="ident">new</span> <span class="punct">"</span><span class="string">bob</span><span class="punct">",</span> <span class="punct">"</span><span class="string">tortoise</span><span class="punct">"</span> <span class="offending"><span class="linenum">34</span> <span class="ident">expected</span><span class="punct">.</span><span class="ident">should</span> <span class="ident">eql</span><span class="punct">(</span><span class="ident">actual</span><span class="punct">)</span></span> diff --git a/vendor/plugins/rspec/spec/spec/runner/formatter/html_formatted-1.8.6.html b/vendor/plugins/rspec/spec/spec/runner/formatter/html_formatted-1.8.6.html index bc6637583..1461d03e4 100644 --- a/vendor/plugins/rspec/spec/spec/runner/formatter/html_formatted-1.8.6.html +++ b/vendor/plugins/rspec/spec/spec/runner/formatter/html_formatted-1.8.6.html @@ -16,9 +16,6 @@ font-size: 80%; } </style> -</head> -<body> -<div class="rspec-report"> <script type="text/javascript"> // <![CDATA[ function moveProgressBar(percentDone) { @@ -46,7 +43,7 @@ function makeYellow(element_id) { </script> <style type="text/css"> #rspec-header { - background: #65C400; color: #fff; + background: #65C400; color: #fff; height: 4em; } .rspec-report h1 { @@ -54,15 +51,16 @@ function makeYellow(element_id) { padding: 10px; font-family: "Lucida Grande", Helvetica, sans-serif; font-size: 1.8em; + position: absolute; } #summary { margin: 0; padding: 5px 10px; font-family: "Lucida Grande", Helvetica, sans-serif; text-align: right; - position: absolute; top: 0px; right: 0px; + float:right; } #summary p { @@ -165,9 +163,14 @@ a { } </style> +</head> +<body> +<div class="rspec-report"> <div id="rspec-header"> - <h1>RSpec Results</h1> + <div id="label"> + <h1>RSpec Code Examples</h1> + </div> <div id="summary"> <p id="totals"> </p> @@ -187,47 +190,50 @@ a { <dd class="spec failed"> <span class="failed_spec_name">should fail when expected message not received</span> <div class="failure" id="failure_1"> - <div class="message"><pre>Mock 'poke me' expected :poke with (any args) once, but received it 0 times</pre></div> - <div class="backtrace"><pre>./failing_examples/mocking_example.rb:13: -/Users/david/projects/ruby/rspec/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:25: -/Users/david/projects/ruby/rspec/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:21:in `chdir' -/Users/david/projects/ruby/rspec/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:21:</pre></div> - <pre class="ruby"><code><span class="linenum">11</span> <span class="ident">it</span> <span class="punct">"</span><span class="string">should fail when expected message not received</span><span class="punct">"</span> <span class="keyword">do</span> -<span class="linenum">12</span> <span class="ident">mock</span> <span class="punct">=</span> <span class="ident">mock</span><span class="punct">("</span><span class="string">poke me</span><span class="punct">")</span> -<span class="offending"><span class="linenum">13</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">should_receive</span><span class="punct">(</span><span class="symbol">:poke</span><span class="punct">)</span></span> -<span class="linenum">14</span> <span class="keyword">end</span> -<span class="linenum">15</span> </code></pre> + <div class="message"><pre>Mock "poke me" expected :poke with (any args) once, but received it 0 times</pre></div> + <div class="backtrace"><pre>./examples/failing/mocking_example.rb:11: +./spec/spec_helper.rb:44:in `run_with' +./spec/spec/runner/formatter/html_formatter_spec.rb:41: +./spec/spec/runner/formatter/html_formatter_spec.rb:29:in `chdir' +./spec/spec/runner/formatter/html_formatter_spec.rb:29:</pre></div> + <pre class="ruby"><code><span class="linenum">9</span> <span class="ident">it</span> <span class="punct">"</span><span class="string">should fail when expected message not received</span><span class="punct">"</span> <span class="keyword">do</span> +<span class="linenum">10</span> <span class="ident">mock</span> <span class="punct">=</span> <span class="ident">mock</span><span class="punct">("</span><span class="string">poke me</span><span class="punct">")</span> +<span class="offending"><span class="linenum">11</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">should_receive</span><span class="punct">(</span><span class="symbol">:poke</span><span class="punct">)</span></span> +<span class="linenum">12</span> <span class="keyword">end</span> +<span class="linenum">13</span> </code></pre> </div> </dd> <script type="text/javascript">moveProgressBar('17.6');</script> <dd class="spec failed"> <span class="failed_spec_name">should fail when messages are received out of order</span> <div class="failure" id="failure_2"> - <div class="message"><pre>Mock 'one two three' received :three out of order</pre></div> - <div class="backtrace"><pre>./failing_examples/mocking_example.rb:22: -/Users/david/projects/ruby/rspec/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:25: -/Users/david/projects/ruby/rspec/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:21:in `chdir' -/Users/david/projects/ruby/rspec/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:21:</pre></div> - <pre class="ruby"><code><span class="linenum">20</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">should_receive</span><span class="punct">(</span><span class="symbol">:three</span><span class="punct">).</span><span class="ident">ordered</span> -<span class="linenum">21</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">one</span> -<span class="offending"><span class="linenum">22</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">three</span></span> -<span class="linenum">23</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">two</span> -<span class="linenum">24</span> <span class="keyword">end</span></code></pre> + <div class="message"><pre>Mock "one two three" received :three out of order</pre></div> + <div class="backtrace"><pre>./examples/failing/mocking_example.rb:20: +./spec/spec_helper.rb:44:in `run_with' +./spec/spec/runner/formatter/html_formatter_spec.rb:41: +./spec/spec/runner/formatter/html_formatter_spec.rb:29:in `chdir' +./spec/spec/runner/formatter/html_formatter_spec.rb:29:</pre></div> + <pre class="ruby"><code><span class="linenum">18</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">should_receive</span><span class="punct">(</span><span class="symbol">:three</span><span class="punct">).</span><span class="ident">ordered</span> +<span class="linenum">19</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">one</span> +<span class="offending"><span class="linenum">20</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">three</span></span> +<span class="linenum">21</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">two</span> +<span class="linenum">22</span> <span class="keyword">end</span></code></pre> </div> </dd> <script type="text/javascript">moveProgressBar('23.5');</script> <dd class="spec failed"> <span class="failed_spec_name">should get yelled at when sending unexpected messages</span> <div class="failure" id="failure_3"> - <div class="message"><pre>Mock 'don't talk to me' expected :any_message_at_all with (no args) 0 times, but received it once</pre></div> - <div class="backtrace"><pre>./failing_examples/mocking_example.rb:29: -/Users/david/projects/ruby/rspec/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:25: -/Users/david/projects/ruby/rspec/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:21:in `chdir' -/Users/david/projects/ruby/rspec/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:21:</pre></div> - <pre class="ruby"><code><span class="linenum">27</span> <span class="ident">mock</span> <span class="punct">=</span> <span class="ident">mock</span><span class="punct">("</span><span class="string">don't talk to me</span><span class="punct">")</span> -<span class="linenum">28</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">should_not_receive</span><span class="punct">(</span><span class="symbol">:any_message_at_all</span><span class="punct">)</span> -<span class="offending"><span class="linenum">29</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">any_message_at_all</span></span> -<span class="linenum">30</span> <span class="keyword">end</span></code></pre> + <div class="message"><pre>Mock "don't talk to me" expected :any_message_at_all with (no args) 0 times, but received it once</pre></div> + <div class="backtrace"><pre>./examples/failing/mocking_example.rb:27: +./spec/spec_helper.rb:44:in `run_with' +./spec/spec/runner/formatter/html_formatter_spec.rb:41: +./spec/spec/runner/formatter/html_formatter_spec.rb:29:in `chdir' +./spec/spec/runner/formatter/html_formatter_spec.rb:29:</pre></div> + <pre class="ruby"><code><span class="linenum">25</span> <span class="ident">mock</span> <span class="punct">=</span> <span class="ident">mock</span><span class="punct">("</span><span class="string">don't talk to me</span><span class="punct">")</span> +<span class="linenum">26</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">should_not_receive</span><span class="punct">(</span><span class="symbol">:any_message_at_all</span><span class="punct">)</span> +<span class="offending"><span class="linenum">27</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">any_message_at_all</span></span> +<span class="linenum">28</span> <span class="keyword">end</span></code></pre> </div> </dd> <script type="text/javascript">moveProgressBar('29.4');</script> @@ -235,15 +241,16 @@ a { <span class="failed_spec_name">has a bug we need to fix</span> <div class="failure" id="failure_4"> <div class="message"><pre>Expected pending 'here is the bug' to fail. No Error was raised.</pre></div> - <div class="backtrace"><pre>./failing_examples/mocking_example.rb:33: -/Users/david/projects/ruby/rspec/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:25: -/Users/david/projects/ruby/rspec/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:21:in `chdir' -/Users/david/projects/ruby/rspec/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:21:</pre></div> - <pre class="ruby"><code><span class="linenum">31</span> -<span class="linenum">32</span> <span class="ident">it</span> <span class="punct">"</span><span class="string">has a bug we need to fix</span><span class="punct">"</span> <span class="keyword">do</span> -<span class="offending"><span class="linenum">33</span> <span class="ident">pending</span> <span class="punct">"</span><span class="string">here is the bug</span><span class="punct">"</span> <span class="keyword">do</span></span> -<span class="linenum">34</span> <span class="comment"># Actually, no. It's fixed. This will fail because it passes :-)</span> -<span class="linenum">35</span> <span class="ident">mock</span> <span class="punct">=</span> <span class="ident">mock</span><span class="punct">("</span><span class="string">Bug</span><span class="punct">")</span></code></pre> + <div class="backtrace"><pre>./examples/failing/mocking_example.rb:31: +./spec/spec_helper.rb:44:in `run_with' +./spec/spec/runner/formatter/html_formatter_spec.rb:41: +./spec/spec/runner/formatter/html_formatter_spec.rb:29:in `chdir' +./spec/spec/runner/formatter/html_formatter_spec.rb:29:</pre></div> + <pre class="ruby"><code><span class="linenum">29</span> +<span class="linenum">30</span> <span class="ident">it</span> <span class="punct">"</span><span class="string">has a bug we need to fix</span><span class="punct">"</span> <span class="keyword">do</span> +<span class="offending"><span class="linenum">31</span> <span class="ident">pending</span> <span class="punct">"</span><span class="string">here is the bug</span><span class="punct">"</span> <span class="keyword">do</span></span> +<span class="linenum">32</span> <span class="comment"># Actually, no. It's fixed. This will fail because it passes :-)</span> +<span class="linenum">33</span> <span class="ident">mock</span> <span class="punct">=</span> <span class="ident">mock</span><span class="punct">("</span><span class="string">Bug</span><span class="punct">")</span></code></pre> </div> </dd> </dl> @@ -258,17 +265,19 @@ a { <div class="failure" id="failure_5"> <div class="message"><pre>expected: "RSpec is a\nbehaviour driven development\nframework for Ruby\n", got: "RSpec is a\nbehavior driven development\nframework for Ruby\n" (using ==) -Diff: + + Diff: @@ -1,4 +1,4 @@ RSpec is a -behaviour driven development +behavior driven development framework for Ruby </pre></div> - <div class="backtrace"><pre>./failing_examples/diffing_spec.rb:13: -/Users/david/projects/ruby/rspec/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:25: -/Users/david/projects/ruby/rspec/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:21:in `chdir' -/Users/david/projects/ruby/rspec/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:21:</pre></div> + <div class="backtrace"><pre>./examples/failing/diffing_spec.rb:13: +./spec/spec_helper.rb:44:in `run_with' +./spec/spec/runner/formatter/html_formatter_spec.rb:41: +./spec/spec/runner/formatter/html_formatter_spec.rb:29:in `chdir' +./spec/spec/runner/formatter/html_formatter_spec.rb:29:</pre></div> <pre class="ruby"><code><span class="linenum">11</span><span class="ident">framework</span> <span class="keyword">for</span> <span class="constant">Ruby</span> <span class="linenum">12</span><span class="constant">EOF</span> <span class="offending"><span class="linenum">13</span> <span class="ident">usa</span><span class="punct">.</span><span class="ident">should</span> <span class="punct">==</span> <span class="ident">uk</span></span> @@ -279,27 +288,25 @@ Diff: <dd class="spec failed"> <span class="failed_spec_name">should print diff of different objects' pretty representation</span> <div class="failure" id="failure_6"> - <div class="message"><pre>expected <Animal + <div class="message"><pre> +expected <Animal name=bob, species=tortoise > -, got <Animal + + got <Animal name=bob, species=giraffe > - (using .eql?) -Diff: -@@ -1,5 +1,5 @@ - <Animal - name=bob, --species=tortoise -+species=giraffe - > + + +(compared using eql?) </pre></div> - <div class="backtrace"><pre>./failing_examples/diffing_spec.rb:34: -/Users/david/projects/ruby/rspec/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:25: -/Users/david/projects/ruby/rspec/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:21:in `chdir' -/Users/david/projects/ruby/rspec/rspec/spec/spec/runner/formatter/html_formatter_spec.rb:21:</pre></div> + <div class="backtrace"><pre>./examples/failing/diffing_spec.rb:34: +./spec/spec_helper.rb:44:in `run_with' +./spec/spec/runner/formatter/html_formatter_spec.rb:41: +./spec/spec/runner/formatter/html_formatter_spec.rb:29:in `chdir' +./spec/spec/runner/formatter/html_formatter_spec.rb:29:</pre></div> <pre class="ruby"><code><span class="linenum">32</span> <span class="ident">expected</span> <span class="punct">=</span> <span class="constant">Animal</span><span class="punct">.</span><span class="ident">new</span> <span class="punct">"</span><span class="string">bob</span><span class="punct">",</span> <span class="punct">"</span><span class="string">giraffe</span><span class="punct">"</span> <span class="linenum">33</span> <span class="ident">actual</span> <span class="punct">=</span> <span class="constant">Animal</span><span class="punct">.</span><span class="ident">new</span> <span class="punct">"</span><span class="string">bob</span><span class="punct">",</span> <span class="punct">"</span><span class="string">tortoise</span><span class="punct">"</span> <span class="offending"><span class="linenum">34</span> <span class="ident">expected</span><span class="punct">.</span><span class="ident">should</span> <span class="ident">eql</span><span class="punct">(</span><span class="ident">actual</span><span class="punct">)</span></span> diff --git a/vendor/plugins/rspec/spec/spec/runner/formatter/html_formatter_spec.rb b/vendor/plugins/rspec/spec/spec/runner/formatter/html_formatter_spec.rb index f6388267f..bbff1ef42 100644 --- a/vendor/plugins/rspec/spec/spec/runner/formatter/html_formatter_spec.rb +++ b/vendor/plugins/rspec/spec/spec/runner/formatter/html_formatter_spec.rb @@ -1,63 +1,118 @@ -require File.dirname(__FILE__) + '/../../../spec_helper' -require 'hpricot' # Needed to compare generated with wanted HTML +# require 'spec_helper' + +begin # See rescue all the way at the bottom + +require 'nokogiri' # Needed to compare generated with wanted HTML require 'spec/runner/formatter/html_formatter' module Spec module Runner module Formatter describe HtmlFormatter do - ['--diff', '--dry-run'].each do |opt| - def jruby? - PLATFORM == 'java' - end - - it "should produce HTML identical to the one we designed manually with #{opt}" do - root = File.expand_path(File.dirname(__FILE__) + '/../../../..') - suffix = jruby? ? '-jruby' : '' - expected_file = File.dirname(__FILE__) + "/html_formatted-#{::VERSION}#{suffix}.html" - raise "There is no HTML file with expected content for this platform: #{expected_file}" unless File.file?(expected_file) - expected_html = File.read(expected_file) - - Dir.chdir(root) do - args = ['failing_examples/mocking_example.rb', 'failing_examples/diffing_spec.rb', 'examples/pure/stubbing_example.rb', 'examples/pure/pending_example.rb', '--format', 'html', opt] - err = StringIO.new - out = StringIO.new - CommandLine.run( - OptionParser.parse(args, err, out) - ) - - seconds = /\d+\.\d+ seconds/ - html = out.string.gsub seconds, 'x seconds' - expected_html.gsub! seconds, 'x seconds' - - if opt == '--diff' - # Uncomment this line temporarily in order to overwrite the expected with actual. - # Use with care!!! - # File.open(expected_file, 'w') {|io| io.write(html)} - - doc = Hpricot(html) - backtraces = doc.search("div.backtrace").collect {|e| e.at("/pre").inner_html} - doc.search("div.backtrace").remove - - expected_doc = Hpricot(expected_html) - expected_backtraces = expected_doc.search("div.backtrace").collect {|e| e.at("/pre").inner_html} - expected_doc.search("div.backtrace").remove - - doc.inner_html.should == expected_doc.inner_html - - expected_backtraces.each_with_index do |expected_line, i| - expected_path, expected_line_number, expected_suffix = expected_line.split(':') - actual_path, actual_line_number, actual_suffix = backtraces[i].split(':') - File.expand_path(actual_path).should == File.expand_path(expected_path) - actual_line_number.should == expected_line_number - end - else - html.should =~ /This was a dry-run/m - end + + treats_method_missing_as_private + + attr_reader :root, :expected_file, :expected_html + + before do + @root = File.expand_path("#{File.dirname(__FILE__)}/../../../..") + suffix = jruby? ? '-jruby' : '' + @expected_file = "#{File.dirname(__FILE__)}/html_formatted-#{::RUBY_VERSION}#{suffix}.html" + raise "There is no HTML file with expected content for this platform: #{expected_file}" unless File.file?(expected_file) + @expected_html = File.read(expected_file) + end + + # Uncomment this line temporarily in order to overwrite the expected with actual. + # Use with care!!! + # describe "file generator" do + # it "generates a new comparison file" do + # Dir.chdir(root) do + # args = [ + # 'examples/failing/mocking_example.rb', + # 'examples/failing/diffing_spec.rb', + # 'examples/passing/stubbing_example.rb', + # 'examples/passing/pending_example.rb', + # '--format', + # 'html', + # "--diff" + # ] + # err = StringIO.new + # out = StringIO.new + # run_with ::Spec::Runner::OptionParser.parse(args, err, out) + # + # seconds = /\d+\.\d+ seconds/ + # html = out.string.gsub seconds, 'x seconds' + # + # File.open(expected_file, 'w') {|io| io.write(html)} + # end + # end + # end + + it "should produce HTML identical to the one we designed manually with --diff" do + Dir.chdir(root) do + args = [ + 'examples/failing/mocking_example.rb', + 'examples/failing/diffing_spec.rb', + 'examples/passing/stubbing_example.rb', + 'examples/passing/pending_example.rb', + '--format', + 'html', + "--diff" + ] + err = StringIO.new + out = StringIO.new + run_with ::Spec::Runner::OptionParser.parse(args, err, out) + + seconds = /\d+\.\d+ seconds/ + html = out.string.gsub seconds, 'x seconds' + expected_html.gsub! seconds, 'x seconds' + + doc = Nokogiri::HTML(html) + backtraces = doc.search("div.backtrace").collect {|e| e.at("pre").inner_html} + doc.css("div.backtrace").remove + + expected_doc = Nokogiri::HTML(expected_html) + expected_backtraces = expected_doc.search("div.backtrace").collect {|e| e.at("pre").inner_html} + expected_doc.search("div.backtrace").remove + + doc.inner_html.should == expected_doc.inner_html + + expected_backtraces.each_with_index do |expected_line, i| + expected_path, expected_line_number, expected_suffix = expected_line.split(':') + actual_path, actual_line_number, actual_suffix = backtraces[i].split(':') + File.expand_path(actual_path).should == File.expand_path(expected_path) + actual_line_number.should == expected_line_number end end end + + it "should produce HTML identical to the one we designed manually with --dry-run" do + Dir.chdir(root) do + args = [ + 'examples/failing/mocking_example.rb', + 'examples/failing/diffing_spec.rb', + 'examples/passing/stubbing_example.rb', + 'examples/passing/pending_example.rb', + '--format', + 'html', + "--dry-run" + ] + err = StringIO.new + out = StringIO.new + run_with ::Spec::Runner::OptionParser.parse(args, err, out) + + seconds = /\d+\.\d+ seconds/ + html = out.string.gsub seconds, 'x seconds' + expected_html.gsub! seconds, 'x seconds' + + html.should =~ /This was a dry-run/m + end + end end end end end + +rescue LoadError + warn "nokogiri not loaded -- skipping HtmlFormatter specs" +end diff --git a/vendor/plugins/rspec/spec/spec/runner/formatter/nested_text_formatter_spec.rb b/vendor/plugins/rspec/spec/spec/runner/formatter/nested_text_formatter_spec.rb index 3a627451e..29e96ff52 100644 --- a/vendor/plugins/rspec/spec/spec/runner/formatter/nested_text_formatter_spec.rb +++ b/vendor/plugins/rspec/spec/spec/runner/formatter/nested_text_formatter_spec.rb @@ -1,177 +1,169 @@ -require File.dirname(__FILE__) + '/../../../spec_helper.rb' +require 'spec_helper' require 'spec/runner/formatter/nested_text_formatter' module Spec module Runner module Formatter describe NestedTextFormatter do - it_should_behave_like "sandboxed rspec_options" - attr_reader :io, :options, :formatter, :example_group - before(:each) do - @io = StringIO.new - options.stub!(:dry_run).and_return(false) - options.stub!(:colour).and_return(false) - @formatter = NestedTextFormatter.new(options, io) - @example_group = ::Spec::Example::ExampleGroup.describe("ExampleGroup") do - specify "example" do - end + with_sandboxed_options do + attr_reader :io, :options, :formatter, :example_group + before(:each) do + @io = StringIO.new + options.stub!(:dry_run).and_return(false) + options.stub!(:colour).and_return(false) + @formatter = NestedTextFormatter.new(options, io) + @example_group = Class.new(::Spec::Example::ExampleGroupDouble).describe("ExampleGroup") + @example_group.example("example") {} end - end - - describe "where ExampleGroup has no superclasss with a description" do - before do - add_example_group - end - - def add_example_group - formatter.add_example_group(example_group) - end - - describe "#dump_summary" do - it "should produce standard summary without pending when pending has a 0 count" do - formatter.dump_summary(3, 2, 1, 0) - expected_output = <<-OUT - ExampleGroup - - Finished in 3 seconds - - 2 examples, 1 failure - OUT - io.string.should == expected_output.gsub(/^ /, '') + describe "where ExampleGroup has no superclass with a description" do + def example_group_started + formatter.example_group_started(Spec::Example::ExampleGroupProxy.new(example_group)) end - it "should produce standard summary" do - formatter.dump_summary(3, 2, 1, 4) - expected_output = <<-OUT - ExampleGroup + before do + example_group_started + end - Finished in 3 seconds + describe "#dump_summary" do + it "should produce standard summary without pending when pending has a 0 count" do + formatter.dump_summary(3, 2, 1, 0) + io.string.should == <<-OUT +ExampleGroup - 2 examples, 1 failure, 4 pending - OUT - io.string.should == expected_output.gsub(/^ /, '') - end - end +Finished in 3 seconds - describe "#add_example_group" do - describe "when ExampleGroup has description_args" do - before do - example_group.description_args.should_not be_nil +2 examples, 1 failure +OUT end - describe "when ExampleGroup has no parents with description args" do - before do - example_group.superclass.description_args.should be_nil - end + it "should produce standard summary" do + formatter.dump_summary(3, 2, 1, 4) + io.string.should == <<-OUT +ExampleGroup - it "should push ExampleGroup name" do - io.string.should eql("ExampleGroup\n") - end +Finished in 3 seconds + +2 examples, 1 failure, 4 pending +OUT end + end - describe "when ExampleGroup has one parent with description args" do - attr_reader :child_example_group - def add_example_group - example_group.description_args.should_not be_nil - @child_example_group = Class.new(example_group).describe("Child ExampleGroup") + describe "#example_group_started" do + describe "when ExampleGroup has a nested description" do + + describe "when ExampleGroup has no parents with nested description" do + it "should push ExampleGroup name" do + io.string.should eql("ExampleGroup\n") + end end - describe "and parent ExampleGroups have not been printed" do - before do - formatter.add_example_group(child_example_group) + describe "when ExampleGroup has one parent with nested description" do + attr_reader :child_example_group + def example_group_started + @child_example_group = Class.new(example_group).describe("Child ExampleGroup") + end + + describe "and parent ExampleGroups have not been printed" do + before do + formatter.example_group_started(Spec::Example::ExampleGroupProxy.new(child_example_group)) + end + + it "should push ExampleGroup name with two spaces of indentation" do + io.string.should == <<-OUT +ExampleGroup + Child ExampleGroup +OUT + end end - it "should push ExampleGroup name with two spaces of indentation" do - expected_output = <<-OUT - ExampleGroup - Child ExampleGroup - OUT - io.string.should == expected_output.gsub(/^ /, '') + describe "and parent ExampleGroups have been printed" do + before do + formatter.example_group_started(Spec::Example::ExampleGroupProxy.new(example_group)) + io.string = "" + formatter.example_group_started(Spec::Example::ExampleGroupProxy.new(child_example_group)) + end + + it "should print only the indented ExampleGroup" do + io.string.should == <<-OUT + Child ExampleGroup +OUT + end end end - describe "and parent ExampleGroups have been printed" do - before do - formatter.add_example_group(example_group) - io.string = "" - formatter.add_example_group(child_example_group) + describe "when ExampleGroup has two parents with nested description" do + attr_reader :child_example_group, :grand_child_example_group + def example_group_started + @child_example_group = Class.new(example_group).describe("Child ExampleGroup") + @grand_child_example_group = Class.new(child_example_group).describe("GrandChild ExampleGroup") + end + + describe "and parent ExampleGroups have not been printed" do + before do + formatter.example_group_started(Spec::Example::ExampleGroupProxy.new(grand_child_example_group)) + + end + + it "should print the entire nested ExampleGroup heirarchy" do + io.string.should == <<-OUT +ExampleGroup + Child ExampleGroup + GrandChild ExampleGroup +OUT + end end - it "should print only the indented ExampleGroup" do - expected_output = <<-OUT - Child ExampleGroup - OUT - io.string.should == expected_output.gsub(/^ /, '') + describe "and parent ExampleGroups have been printed" do + before do + formatter.example_group_started(Spec::Example::ExampleGroupProxy.new(child_example_group)) + io.string = "" + formatter.example_group_started(Spec::Example::ExampleGroupProxy.new(grand_child_example_group)) + end + + it "should print only the indented ExampleGroup" do + io.string.should == <<-OUT + GrandChild ExampleGroup +OUT + end end end end - describe "when ExampleGroup has two parents with description args" do - attr_reader :child_example_group, :grand_child_example_group - def add_example_group - example_group.description_args.should_not be_nil - @child_example_group = Class.new(example_group).describe("Child ExampleGroup") - @grand_child_example_group = Class.new(child_example_group).describe("GrandChild ExampleGroup") - end + describe "when ExampleGroup nested description is blank" do + attr_reader :child_example_group describe "and parent ExampleGroups have not been printed" do - before do - formatter.add_example_group(grand_child_example_group) + def example_group_started + @child_example_group = Class.new(example_group) + formatter.example_group_started(Spec::Example::ExampleGroupProxy.new(child_example_group)) end - it "should print the entire nested ExampleGroup heirarchy" do - expected_output = <<-OUT - ExampleGroup - Child ExampleGroup - GrandChild ExampleGroup - OUT - io.string.should == expected_output.gsub(/^ /, '') + it "should render only the parent ExampleGroup" do + io.string.should == <<-OUT +ExampleGroup +OUT end end describe "and parent ExampleGroups have been printed" do - before do - formatter.add_example_group(child_example_group) + def example_group_started + @child_example_group = Class.new(example_group) + formatter.example_group_started(Spec::Example::ExampleGroupProxy.new(example_group)) io.string = "" - formatter.add_example_group(grand_child_example_group) + formatter.example_group_started(Spec::Example::ExampleGroupProxy.new(child_example_group)) end - it "should print only the indented ExampleGroup" do - expected_output = <<-OUT - GrandChild ExampleGroup - OUT - io.string.should == expected_output.gsub(/^ /, '') + it "should not render anything" do + io.string.should == "" end end end - end - - describe "when ExampleGroup description_args is nil" do - attr_reader :child_example_group - - describe "and parent ExampleGroups have not been printed" do - def add_example_group - @child_example_group = Class.new(example_group) - child_example_group.description_args.should be_nil - formatter.add_example_group(child_example_group) - end - - it "should render only the parent ExampleGroup" do - expected_output = <<-OUT - ExampleGroup - OUT - io.string.should == expected_output.gsub(/^ /, '') - end - end - describe "and parent ExampleGroups have been printed" do - def add_example_group - @child_example_group = Class.new(example_group) - child_example_group.description_args.should be_nil - formatter.add_example_group(example_group) - io.string = "" - formatter.add_example_group(child_example_group) + describe "when ExampleGroup nested description is blank" do + def example_group_started + example_group.set_description + super end it "should not render anything" do @@ -180,154 +172,134 @@ module Spec end end - describe "when ExampleGroup description_args is empty" do - def add_example_group - example_group.set_description - example_group.description_args.should be_empty - super - end - - it "should not render anything" do - io.string.should == "" - end - end - end - - describe "#example_failed" do - describe "where ExampleGroup has no superclasss with a description" do - describe "when having an error" do - it "should push failing spec name and failure number" do - formatter.example_failed( - example_group.it("spec"), - 98, - Reporter::Failure.new("c s", RuntimeError.new) - ) - expected_output = <<-OUT - ExampleGroup - spec (ERROR - 98) - OUT - io.string.should == expected_output.gsub(/^ /, '') + describe "#example_failed" do + describe "where ExampleGroup has no superclasss with a description" do + describe "when having an error" do + it "should push failing spec name and failure number" do + formatter.example_failed( + example_group.it("spec"), + 98, + ::Spec::Runner::Reporter::Failure.new("g", "c s", RuntimeError.new) + ) + io.string.should == <<-OUT +ExampleGroup + spec (FAILED - 98) +OUT + end end - end - describe "when having an expectation failure" do - it "should push failing spec name and failure number" do - formatter.example_failed( - example_group.it("spec"), - 98, - Reporter::Failure.new("c s", Spec::Expectations::ExpectationNotMetError.new) - ) - expected_output = <<-OUT - ExampleGroup - spec (FAILED - 98) - OUT - io.string.should == expected_output.gsub(/^ /, '') + describe "when having an expectation failure" do + it "should push failing spec name and failure number" do + formatter.example_failed( + example_group.it("spec"), + 98, + ::Spec::Runner::Reporter::Failure.new("g", "c s", Spec::Expectations::ExpectationNotMetError.new) + ) + io.string.should == <<-OUT +ExampleGroup + spec (FAILED - 98) +OUT + end end end - end - describe "where ExampleGroup has two superclasses with a description" do - attr_reader :child_example_group, :grand_child_example_group + describe "where ExampleGroup has two superclasses with a description" do + attr_reader :child_example_group, :grand_child_example_group - def add_example_group - @child_example_group = Class.new(example_group).describe("Child ExampleGroup") - @grand_child_example_group = Class.new(child_example_group).describe("GrandChild ExampleGroup") - formatter.add_example_group(grand_child_example_group) - end + def example_group_started + @child_example_group = Class.new(example_group).describe("Child ExampleGroup") + @grand_child_example_group = Class.new(child_example_group).describe("GrandChild ExampleGroup") + formatter.example_group_started(Spec::Example::ExampleGroupProxy.new(grand_child_example_group)) + end - describe "when having an error" do - it "should push failing spec name and failure number" do - formatter.example_failed( - grand_child_example_group.it("spec"), - 98, - Reporter::Failure.new("c s", RuntimeError.new) - ) - expected_output = <<-OUT - ExampleGroup - Child ExampleGroup - GrandChild ExampleGroup - spec (ERROR - 98) - OUT - io.string.should == expected_output.gsub(/^ /, '') + describe "when having an error" do + it "should push failing spec name and failure number" do + formatter.example_failed( + grand_child_example_group.it("spec"), + 98, + ::Spec::Runner::Reporter::Failure.new("g", "c s", RuntimeError.new) + ) + io.string.should == <<-OUT +ExampleGroup + Child ExampleGroup + GrandChild ExampleGroup + spec (FAILED - 98) +OUT + end end - end - describe "when having an expectation" do - it "should push failing spec name and failure number" do - formatter.example_failed( - grand_child_example_group.it("spec"), - 98, - Reporter::Failure.new("c s", Spec::Expectations::ExpectationNotMetError.new) - ) - expected_output = <<-OUT - ExampleGroup - Child ExampleGroup - GrandChild ExampleGroup - spec (FAILED - 98) - OUT - io.string.should == expected_output.gsub(/^ /, '') + describe "when having an expectation" do + it "should push failing spec name and failure number" do + formatter.example_failed( + grand_child_example_group.it("spec"), + 98, + ::Spec::Runner::Reporter::Failure.new("g", "c s", Spec::Expectations::ExpectationNotMetError.new) + ) + io.string.should == <<-OUT +ExampleGroup + Child ExampleGroup + GrandChild ExampleGroup + spec (FAILED - 98) +OUT + end end end end - end - describe "#start" do - it "should push nothing on start" do - formatter.start(5) - expected_output = <<-OUT - ExampleGroup - OUT - io.string.should == expected_output.gsub(/^ /, '') + describe "#start" do + it "should push nothing on start" do + formatter.start(5) + io.string.should == <<-OUT +ExampleGroup +OUT + end end - end - describe "#start_dump" do - it "should push nothing on start dump" do - formatter.start_dump - expected_output = <<-OUT - ExampleGroup - OUT - io.string.should == expected_output.gsub(/^ /, '') + describe "#start_dump" do + it "should push nothing on start dump" do + formatter.start_dump + io.string.should == <<-OUT +ExampleGroup +OUT + end end - end - describe "#example_passed" do - it "should push passing spec name" do - formatter.example_passed(example_group.it("spec")) - expected_output = <<-OUT - ExampleGroup - spec - OUT - io.string.should == expected_output.gsub(/^ /, '') + describe "#example_passed" do + it "should push passing spec name" do + formatter.example_passed(example_group.it("spec")) + io.string.should == <<-OUT +ExampleGroup + spec +OUT + end end - end - describe "#example_pending" do - it "should push pending example name and message" do - formatter.example_pending(example_group.examples.first, 'reason') - expected_output = <<-OUT - ExampleGroup - example (PENDING: reason) - OUT - io.string.should == expected_output.gsub(/^ /, '') - end + describe "#example_pending" do + it "should push pending example name and message" do + formatter.example_pending(example_group.examples.first, 'reason', "#{__FILE__}:#{__LINE__}") + io.string.should == <<-OUT +ExampleGroup + example (PENDING: reason) +OUT + end - it "should dump pending" do - formatter.example_pending(example_group.examples.first, 'reason') - io.rewind - formatter.dump_pending - io.string.should =~ /Pending\:\nExampleGroup example \(reason\)\n/ + it "should dump pending" do + formatter.example_pending(example_group.examples.first, 'reason', "#{__FILE__}:#{__LINE__}") + io.rewind + formatter.dump_pending + io.string.should =~ /Pending\:\n\nExampleGroup example \(reason\)\n/ + end end - end - def have_single_level_example_group_output(expected_output) - expected = "ExampleGroup\n #{expected_output}" - ::Spec::Matchers::SimpleMatcher.new(expected) do |actual| - actual == expected + def have_single_level_example_group_output(expected_output) + expected = "ExampleGroup\n #{expected_output}" + ::Spec::Matchers::SimpleMatcher.new(expected) do |actual| + actual == expected + end end end end end end end -end +end
\ No newline at end of file diff --git a/vendor/plugins/rspec/spec/spec/runner/formatter/profile_formatter_spec.rb b/vendor/plugins/rspec/spec/spec/runner/formatter/profile_formatter_spec.rb index 981805411..338df7089 100644 --- a/vendor/plugins/rspec/spec/spec/runner/formatter/profile_formatter_spec.rb +++ b/vendor/plugins/rspec/spec/spec/runner/formatter/profile_formatter_spec.rb @@ -1,15 +1,19 @@ -require File.dirname(__FILE__) + '/../../../spec_helper.rb' +require 'spec_helper' require 'spec/runner/formatter/profile_formatter' module Spec module Runner module Formatter describe ProfileFormatter do + + treats_method_missing_as_private + attr_reader :io, :formatter before(:each) do @io = StringIO.new options = mock('options') options.stub!(:colour).and_return(true) + options.stub!(:autospec).and_return(true) @formatter = ProfileFormatter.new(options, io) end @@ -28,10 +32,10 @@ module Spec it "should correctly record a passed example" do now = Time.now Time.stub!(:now).and_return(now) - parent_example_group = Class.new(ExampleGroup).describe('Parent') + parent_example_group = Class.new(::Spec::Example::ExampleGroupDouble).describe('Parent') child_example_group = Class.new(parent_example_group).describe('Child') - formatter.add_example_group(child_example_group) + formatter.example_group_started(Spec::Example::ExampleGroupProxy.new(child_example_group)) formatter.example_started('when foo') Time.stub!(:now).and_return(now+1) @@ -49,7 +53,7 @@ module Spec it "should print the top 10 results" do example_group = Class.new(::Spec::Example::ExampleGroup).describe("ExampleGroup") - formatter.add_example_group(example_group) + formatter.example_group_started(Spec::Example::ExampleGroupProxy.new(example_group)) formatter.instance_variable_set("@time", Time.now) 15.times do @@ -59,7 +63,8 @@ module Spec io.should_receive(:print).exactly(10) formatter.start_dump end + end end end -end
\ No newline at end of file +end diff --git a/vendor/plugins/rspec/spec/spec/runner/formatter/progress_bar_formatter_spec.rb b/vendor/plugins/rspec/spec/spec/runner/formatter/progress_bar_formatter_spec.rb index 64e11b1a5..ea96ca6c4 100644 --- a/vendor/plugins/rspec/spec/spec/runner/formatter/progress_bar_formatter_spec.rb +++ b/vendor/plugins/rspec/spec/spec/runner/formatter/progress_bar_formatter_spec.rb @@ -1,15 +1,19 @@ -require File.dirname(__FILE__) + '/../../../spec_helper.rb' +require 'spec_helper' require 'spec/runner/formatter/progress_bar_formatter' module Spec module Runner module Formatter describe ProgressBarFormatter do + + treats_method_missing_as_private + before(:each) do @io = StringIO.new @options = mock('options') @options.stub!(:dry_run).and_return(false) @options.stub!(:colour).and_return(false) + @options.stub!(:autospec).and_return(false) @formatter = ProgressBarFormatter.new(@options, @io) end @@ -29,7 +33,8 @@ module Spec end end example = example_group.examples.first - @formatter.example_pending(example, "message") + @formatter.example_group_started(Spec::Example::ExampleGroupProxy.new(example_group)) + @formatter.example_pending(example, "message", "#{__FILE__}:#{__LINE__}") @io.rewind @formatter.dump_summary(3, 2, 1, 1) @io.string.should eql(%Q| @@ -40,30 +45,34 @@ Finished in 3 seconds end it "should push green dot for passing spec" do - @io.should_receive(:tty?).and_return(true) - @options.should_receive(:colour).and_return(true) + @formatter.stub(:output_to_file?) {false} + @io.stub(:tty?) {true} + @options.stub(:colour) {true} @formatter.example_passed("spec") @io.string.should == "\e[32m.\e[0m" end it "should push red F for failure spec" do - @io.should_receive(:tty?).and_return(true) - @options.should_receive(:colour).and_return(true) - @formatter.example_failed("spec", 98, Reporter::Failure.new("c s", Spec::Expectations::ExpectationNotMetError.new)) + @formatter.stub(:output_to_file?) {false} + @io.stub(:tty?) {true} + @options.stub(:colour) {true} + @formatter.example_failed("spec", 98, Spec::Runner::Reporter::Failure.new("g", "c s", Spec::Expectations::ExpectationNotMetError.new)) @io.string.should eql("\e[31mF\e[0m") end - it "should push magenta F for error spec" do - @io.should_receive(:tty?).and_return(true) - @options.should_receive(:colour).and_return(true) - @formatter.example_failed("spec", 98, Reporter::Failure.new("c s", RuntimeError.new)) - @io.string.should eql("\e[35mF\e[0m") + it "should push red F for error spec" do + @formatter.stub(:output_to_file?) {false} + @io.stub(:tty?) {true} + @options.stub(:colour) {true} + @formatter.example_failed("spec", 98, Spec::Runner::Reporter::Failure.new("g", "c s", RuntimeError.new)) + @io.string.should eql("\e[31mF\e[0m") end it "should push blue F for fixed pending spec" do - @io.should_receive(:tty?).and_return(true) - @options.should_receive(:colour).and_return(true) - @formatter.example_failed("spec", 98, Reporter::Failure.new("c s", Spec::Example::PendingExampleFixedError.new)) + @formatter.stub(:output_to_file?) {false} + @io.stub(:tty?) {true} + @options.stub(:colour) {true} + @formatter.example_failed("spec", 98, Spec::Runner::Reporter::Failure.new("g", "c s", Spec::Example::PendingExampleFixedError.new)) @io.string.should eql("\e[34mF\e[0m") end @@ -88,15 +97,18 @@ EOE EOE end - it "should dump pending" do + it "should dump pending with file and line number" do example_group = ExampleGroup.describe("example_group") do specify "example" do end end example = example_group.examples.first - @formatter.example_pending(example, "message") + file = __FILE__ + line = __LINE__ - 5 + @formatter.example_group_started(Spec::Example::ExampleGroupProxy.new(example_group)) + @formatter.example_pending(example, "message", "#{__FILE__}:#{__LINE__}") @formatter.dump_pending - @io.string.should =~ /Pending\:\nexample_group example \(message\)\n/ + @io.string.should =~ /Pending:\n\nexample_group example \(message\)\n#{file}:#{line}/m end end @@ -106,11 +118,11 @@ EOE @options = mock('options') @out.stub!(:puts) @formatter = ProgressBarFormatter.new(@options, @out) - @formatter.class.send :public, :output_to_tty? + @formatter.class.__send__ :public, :output_to_tty? end after(:each) do - @formatter.class.send :protected, :output_to_tty? + @formatter.class.__send__ :protected, :output_to_tty? end it "should not throw NoMethodError on output_to_tty?" do diff --git a/vendor/plugins/rspec/spec/spec/runner/formatter/snippet_extractor_spec.rb b/vendor/plugins/rspec/spec/spec/runner/formatter/snippet_extractor_spec.rb index 4bb2f1585..c683c39a8 100644 --- a/vendor/plugins/rspec/spec/spec/runner/formatter/snippet_extractor_spec.rb +++ b/vendor/plugins/rspec/spec/spec/runner/formatter/snippet_extractor_spec.rb @@ -1,4 +1,4 @@ -require File.dirname(__FILE__) + '/../../../spec_helper.rb' +require 'spec_helper' require 'spec/runner/formatter/snippet_extractor' module Spec diff --git a/vendor/plugins/rspec/spec/spec/runner/formatter/spec_mate_formatter_spec.rb b/vendor/plugins/rspec/spec/spec/runner/formatter/spec_mate_formatter_spec.rb deleted file mode 100644 index da1b69f79..000000000 --- a/vendor/plugins/rspec/spec/spec/runner/formatter/spec_mate_formatter_spec.rb +++ /dev/null @@ -1,103 +0,0 @@ -require File.dirname(__FILE__) + '/../../../spec_helper' -require 'hpricot' # Needed to compare generated with wanted HTML -require 'spec/runner/formatter/text_mate_formatter' - -module Spec - module Runner - module Formatter - describe TextMateFormatter do - attr_reader :root, :suffix, :expected_file - before do - @root = File.expand_path(File.dirname(__FILE__) + '/../../../..') - @suffix = jruby? ? '-jruby' : '' - @expected_file = File.dirname(__FILE__) + "/text_mate_formatted-#{::VERSION}#{suffix}.html" - end - - def jruby? - PLATFORM == 'java' - end - - def produces_html_identical_to_manually_designed_document(opt) - root = File.expand_path(File.dirname(__FILE__) + '/../../../..') - - Dir.chdir(root) do - args = [ - 'failing_examples/mocking_example.rb', - 'failing_examples/diffing_spec.rb', - 'examples/pure/stubbing_example.rb', - 'examples/pure/pending_example.rb', - '--format', - 'textmate', - opt - ] - err = StringIO.new - out = StringIO.new - options = ::Spec::Runner::OptionParser.parse(args, err, out) - Spec::Runner::CommandLine.run(options) - - yield(out.string) - end - end - - # # Uncomment this spec temporarily in order to overwrite the expected with actual. - # # Use with care!!! - # describe TextMateFormatter, "functional spec file generator" do - # it "generates a new comparison file" do - # Dir.chdir(root) do - # args = ['failing_examples/mocking_example.rb', 'failing_examples/diffing_spec.rb', 'examples/pure/stubbing_example.rb', 'examples/pure/pending_example.rb', '--format', 'textmate', '--diff'] - # err = StringIO.new - # out = StringIO.new - # Spec::Runner::CommandLine.run( - # ::Spec::Runner::OptionParser.parse(args, err, out) - # ) - # - # seconds = /\d+\.\d+ seconds/ - # html = out.string.gsub seconds, 'x seconds' - # - # File.open(expected_file, 'w') {|io| io.write(html)} - # end - # end - # end - - describe "functional spec using --diff" do - it "should produce HTML identical to the one we designed manually with --diff" do - produces_html_identical_to_manually_designed_document("--diff") do |html| - suffix = jruby? ? '-jruby' : '' - expected_file = File.dirname(__FILE__) + "/text_mate_formatted-#{::VERSION}#{suffix}.html" - unless File.file?(expected_file) - raise "There is no HTML file with expected content for this platform: #{expected_file}" - end - expected_html = File.read(expected_file) - - seconds = /\d+\.\d+ seconds/ - html.gsub! seconds, 'x seconds' - expected_html.gsub! seconds, 'x seconds' - - doc = Hpricot(html) - backtraces = doc.search("div.backtrace/a") - doc.search("div.backtrace").remove - - expected_doc = Hpricot(expected_html) - expected_doc.search("div.backtrace").remove - - doc.inner_html.should == expected_doc.inner_html - - backtraces.each do |backtrace_link| - backtrace_link[:href].should include("txmt://open?url=") - end - end - end - - end - - describe "functional spec using --dry-run" do - it "should produce HTML identical to the one we designed manually with --dry-run" do - produces_html_identical_to_manually_designed_document("--dry-run") do |html, expected_html| - html.should =~ /This was a dry-run/m - end - end - end - end - end - end -end
\ No newline at end of file diff --git a/vendor/plugins/rspec/spec/spec/runner/formatter/specdoc_formatter_spec.rb b/vendor/plugins/rspec/spec/spec/runner/formatter/specdoc_formatter_spec.rb index 3974f9533..ac4e0eeea 100644 --- a/vendor/plugins/rspec/spec/spec/runner/formatter/specdoc_formatter_spec.rb +++ b/vendor/plugins/rspec/spec/spec/runner/formatter/specdoc_formatter_spec.rb @@ -1,154 +1,155 @@ -require File.dirname(__FILE__) + '/../../../spec_helper.rb' +require 'spec_helper' require 'spec/runner/formatter/specdoc_formatter' module Spec module Runner module Formatter describe SpecdocFormatter do - it_should_behave_like "sandboxed rspec_options" - attr_reader :io, :options, :formatter, :example_group - before(:each) do - @io = StringIO.new - options.stub!(:dry_run).and_return(false) - options.stub!(:colour).and_return(false) - @formatter = SpecdocFormatter.new(options, io) - @example_group = ::Spec::Example::ExampleGroup.describe("ExampleGroup") do - specify "example" do + with_sandboxed_options do + attr_reader :io, :formatter, :example_group + before(:each) do + @io = StringIO.new + options.stub!(:dry_run).and_return(false) + options.stub!(:colour).and_return(false) + @formatter = SpecdocFormatter.new(options, io) + @example_group = ::Spec::Example::ExampleGroup.describe("ExampleGroup") do + specify "example" do + end end end - end - describe "where ExampleGroup has no superclasss with a description" do - before do - add_example_group - end - - def add_example_group - formatter.add_example_group(example_group) - end + describe "where ExampleGroup has no superclasss with a description" do + before do + example_group_started + end - describe "#dump_summary" do - it "should produce standard summary without pending when pending has a 0 count" do - formatter.dump_summary(3, 2, 1, 0) - io.string.should have_example_group_output("\nFinished in 3 seconds\n\n2 examples, 1 failure\n") + def example_group_started + formatter.example_group_started(Spec::Example::ExampleGroupProxy.new(example_group)) end - it "should produce standard summary" do - formatter.dump_summary(3, 2, 1, 4) - io.string.should have_example_group_output("\nFinished in 3 seconds\n\n2 examples, 1 failure, 4 pending\n") + describe "#dump_summary" do + it "should produce standard summary without pending when pending has a 0 count" do + formatter.dump_summary(3, 2, 1, 0) + io.string.should have_example_group_output("\nFinished in 3 seconds\n\n2 examples, 1 failure\n") + end + + it "should produce standard summary" do + formatter.dump_summary(3, 2, 1, 4) + io.string.should have_example_group_output("\nFinished in 3 seconds\n\n2 examples, 1 failure, 4 pending\n") + end end - end - describe "#add_example_group" do - it "should push ExampleGroup name" do - io.string.should eql("\nExampleGroup\n") + describe "#example_group_started" do + it "should push ExampleGroup name" do + io.string.should eql("\nExampleGroup\n") + end end - end - describe "#example_failed" do - describe "where ExampleGroup has no superclasss with a description" do - describe "when having an error" do - it "should push failing spec name and failure number" do - formatter.example_failed( - example_group.it("spec"), - 98, - Reporter::Failure.new("c s", RuntimeError.new) - ) - io.string.should have_example_group_output("- spec (ERROR - 98)\n") + describe "#example_failed" do + describe "where ExampleGroup has no superclasss with a description" do + describe "when having an error" do + it "should push failing spec name and failure number" do + formatter.example_failed( + example_group.it("spec"), + 98, + Spec::Runner::Reporter::Failure.new("g", "c s", RuntimeError.new) + ) + io.string.should have_example_group_output("- spec (FAILED - 98)\n") + end end - end - describe "when having an expectation failure" do - it "should push failing spec name and failure number" do - formatter.example_failed( - example_group.it("spec"), - 98, - Reporter::Failure.new("c s", Spec::Expectations::ExpectationNotMetError.new) - ) - io.string.should have_example_group_output("- spec (FAILED - 98)\n") + describe "when having an expectation failure" do + it "should push failing spec name and failure number" do + formatter.example_failed( + example_group.it("spec"), + 98, + Spec::Runner::Reporter::Failure.new("g", "c s", Spec::Expectations::ExpectationNotMetError.new) + ) + io.string.should have_example_group_output("- spec (FAILED - 98)\n") + end end end - end - describe "where ExampleGroup has two superclasses with a description" do - attr_reader :child_example_group, :grand_child_example_group + describe "where ExampleGroup has two superclasses with a description" do + attr_reader :child_example_group, :grand_child_example_group - def add_example_group - @child_example_group = Class.new(example_group).describe("Child ExampleGroup") - @grand_child_example_group = Class.new(child_example_group).describe("GrandChild ExampleGroup") - formatter.add_example_group(grand_child_example_group) - end - - describe "when having an error" do - it "should push failing spec name and failure number" do - formatter.example_failed( - example_group.it("spec"), - 98, - Reporter::Failure.new("c s", RuntimeError.new) - ) - io.string.should have_nested_example_group_output("- spec (ERROR - 98)\n") + def example_group_started + @child_example_group = Class.new(example_group).describe("Child ExampleGroup") + @grand_child_example_group = Class.new(child_example_group).describe("GrandChild ExampleGroup") + formatter.example_group_started(Spec::Example::ExampleGroupProxy.new(grand_child_example_group)) end - end - describe "when having an expectation" do - it "should push failing spec name and failure number" do - formatter.example_failed( + describe "when having an error" do + it "should push failing spec name and failure number" do + formatter.example_failed( example_group.it("spec"), 98, - Reporter::Failure.new("c s", Spec::Expectations::ExpectationNotMetError.new) - ) - io.string.should have_nested_example_group_output("- spec (FAILED - 98)\n") + Spec::Runner::Reporter::Failure.new("g", "c s", RuntimeError.new) + ) + io.string.should have_nested_example_group_output("- spec (FAILED - 98)\n") + end end - end - def have_nested_example_group_output(expected_output) - expected_full_output = "\nExampleGroup Child ExampleGroup GrandChild ExampleGroup\n#{expected_output}" - ::Spec::Matchers::SimpleMatcher.new(expected_full_output) do |actual| - actual == expected_full_output + describe "when having an expectation" do + it "should push failing spec name and failure number" do + formatter.example_failed( + example_group.it("spec"), + 98, + Spec::Runner::Reporter::Failure.new("g", "c s", Spec::Expectations::ExpectationNotMetError.new) + ) + io.string.should have_nested_example_group_output("- spec (FAILED - 98)\n") + end + end + + def have_nested_example_group_output(expected_output) + expected_full_output = "\nExampleGroup Child ExampleGroup GrandChild ExampleGroup\n#{expected_output}" + ::Spec::Matchers::SimpleMatcher.new(expected_full_output) do |actual| + actual == expected_full_output + end end end end - end - describe "#start" do - it "should push nothing on start" do - formatter.start(5) - io.string.should have_example_group_output("") + describe "#start" do + it "should push nothing on start" do + formatter.start(5) + io.string.should have_example_group_output("") + end end - end - describe "#start_dump" do - it "should push nothing on start dump" do - formatter.start_dump - io.string.should have_example_group_output("") + describe "#start_dump" do + it "should push nothing on start dump" do + formatter.start_dump + io.string.should have_example_group_output("") + end end - end - describe "#example_passed" do - it "should push passing spec name" do - formatter.example_passed(example_group.it("spec")) - io.string.should have_example_group_output("- spec\n") + describe "#example_passed" do + it "should push passing spec name" do + formatter.example_passed(example_group.it("spec")) + io.string.should have_example_group_output("- spec\n") + end end - end - describe "#example_pending" do - it "should push pending example name and message" do - formatter.example_pending(example_group.examples.first, 'reason') - io.string.should have_example_group_output("- example (PENDING: reason)\n") - end + describe "#example_pending" do + it "should push pending example name and message" do + formatter.example_pending(example_group.examples.first, 'reason', "#{__FILE__}:#{__LINE__}") + io.string.should have_example_group_output("- example (PENDING: reason)\n") + end - it "should dump pending" do - formatter.example_pending(example_group.examples.first, 'reason') - io.rewind - formatter.dump_pending - io.string.should =~ /Pending\:\nExampleGroup example \(reason\)\n/ + it "should dump pending" do + formatter.example_pending(example_group.examples.first, 'reason', "#{__FILE__}:#{__LINE__}") + io.rewind + formatter.dump_pending + io.string.should =~ /Pending\:\n\nExampleGroup example \(reason\)\n/ + end end - end - def have_example_group_output(expected_output) - expected = "\nExampleGroup\n#{expected_output}" - ::Spec::Matchers::SimpleMatcher.new(expected) do |actual| - actual == expected + def have_example_group_output(expected_output) + expected = "\nExampleGroup\n#{expected_output}" + ::Spec::Matchers::SimpleMatcher.new(expected) do |actual| + actual == expected + end end end end diff --git a/vendor/plugins/rspec/spec/spec/runner/formatter/story/html_formatter_spec.rb b/vendor/plugins/rspec/spec/spec/runner/formatter/story/html_formatter_spec.rb deleted file mode 100644 index 37fb7c670..000000000 --- a/vendor/plugins/rspec/spec/spec/runner/formatter/story/html_formatter_spec.rb +++ /dev/null @@ -1,61 +0,0 @@ -require File.dirname(__FILE__) + '/../../../../spec_helper.rb' -require 'spec/runner/formatter/story/html_formatter' - -module Spec - module Runner - module Formatter - module Story - describe HtmlFormatter do - before :each do - @out = StringIO.new - @options = mock('options') - @reporter = HtmlFormatter.new(@options, @out) - end - - it "should just be poked at" do - @reporter.run_started(1) - @reporter.story_started('story_title', 'narrative') - - @reporter.scenario_started('story_title', 'succeeded_scenario_name') - @reporter.step_succeeded('given', 'succeded_step', 'one', 'two') - @reporter.scenario_succeeded('story_title', 'succeeded_scenario_name') - - @reporter.scenario_started('story_title', 'pending_scenario_name') - @reporter.step_pending('when', 'pending_step', 'un', 'deux') - @reporter.scenario_pending('story_title', 'pending_scenario_name', 'not done') - - @reporter.scenario_started('story_title', 'failed_scenario_name') - @reporter.step_failed('then', 'failed_step', 'en', 'to') - @reporter.scenario_failed('story_title', 'failed_scenario_name', NameError.new('sup')) - - @reporter.scenario_started('story_title', 'scenario_with_given_scenario_name') - @reporter.found_scenario('given scenario', 'succeeded_scenario_name') - - @reporter.story_ended('story_title', 'narrative') - @reporter.run_ended - end - - it "should create spans for params" do - @reporter.step_succeeded('given', 'a $coloured $animal', 'brown', 'dog') - @out.string.should == " <li class=\"passed\">Given a <span class=\"param\">brown</span> <span class=\"param\">dog</span></li>\n" - end - - it 'should create spanes for params in regexp steps' do - @reporter.step_succeeded :given, /a (pink|blue) (.*)/, 'brown', 'dog' - @out.string.should == " <li class=\"passed\">Given a <span class=\"param\">brown</span> <span class=\"param\">dog</span></li>\n" - end - - it "should create a ul for collected_steps" do - @reporter.collected_steps(['Given a $coloured $animal', 'Given a $n legged eel']) - @out.string.should == (<<-EOF) - <ul id="stock_steps" style="display: none;"> - <li>Given a $coloured $animal</li> - <li>Given a $n legged eel</li> - </ul> -EOF - end - end - end - end - end -end
\ No newline at end of file diff --git a/vendor/plugins/rspec/spec/spec/runner/formatter/story/plain_text_formatter_spec.rb b/vendor/plugins/rspec/spec/spec/runner/formatter/story/plain_text_formatter_spec.rb deleted file mode 100644 index 626ec4628..000000000 --- a/vendor/plugins/rspec/spec/spec/runner/formatter/story/plain_text_formatter_spec.rb +++ /dev/null @@ -1,439 +0,0 @@ -require File.dirname(__FILE__) + '/../../../../spec_helper.rb' -require 'spec/runner/formatter/story/plain_text_formatter' - -module Spec - module Runner - module Formatter - module Story - describe PlainTextFormatter do - before :each do - # given - @out = StringIO.new - @tweaker = mock('tweaker') - @tweaker.stub!(:tweak_backtrace) - @options = mock('options') - @options.stub!(:colour).and_return(false) - @options.stub!(:backtrace_tweaker).and_return(@tweaker) - @formatter = PlainTextFormatter.new(@options, @out) - end - - it 'should summarize the number of scenarios when the run ends' do - # when - @formatter.run_started(3) - @formatter.scenario_started(nil, nil) - @formatter.scenario_succeeded('story', 'scenario1') - @formatter.scenario_started(nil, nil) - @formatter.scenario_succeeded('story', 'scenario2') - @formatter.scenario_started(nil, nil) - @formatter.scenario_succeeded('story', 'scenario3') - @formatter.run_ended - - # then - @out.string.should include('3 scenarios') - end - - it 'should summarize the number of successful scenarios when the run ends' do - # when - @formatter.run_started(3) - @formatter.scenario_started(nil, nil) - @formatter.scenario_succeeded('story', 'scenario1') - @formatter.scenario_started(nil, nil) - @formatter.scenario_succeeded('story', 'scenario2') - @formatter.scenario_started(nil, nil) - @formatter.scenario_succeeded('story', 'scenario3') - @formatter.run_ended - - # then - @out.string.should include('3 scenarios: 3 succeeded') - end - - it 'should summarize the number of failed scenarios when the run ends' do - # when - @formatter.run_started(3) - @formatter.scenario_started(nil, nil) - @formatter.scenario_succeeded('story', 'scenario1') - @formatter.scenario_started(nil, nil) - @formatter.scenario_failed('story', 'scenario2', exception_from { raise RuntimeError, 'oops' }) - @formatter.scenario_started(nil, nil) - @formatter.scenario_failed('story', 'scenario3', exception_from { raise RuntimeError, 'oops' }) - @formatter.run_ended - - # then - @out.string.should include("3 scenarios: 1 succeeded, 2 failed") - end - - it 'should end cleanly (no characters on the last line) with successes' do - # when - @formatter.run_started(1) - @formatter.scenario_started(nil, nil) - @formatter.scenario_succeeded('story', 'scenario') - @formatter.run_ended - - # then - @out.string.should =~ /\n\z/ - end - - it 'should end cleanly (no characters on the last line) with failures' do - # when - @formatter.run_started(1) - @formatter.scenario_started(nil, nil) - @formatter.scenario_failed('story', 'scenario', exception_from { raise RuntimeError, 'oops' }) - @formatter.run_ended - - # then - @out.string.should =~ /\n\z/ - end - - it 'should end cleanly (no characters on the last line) with pending steps' do - # when - @formatter.run_started(1) - @formatter.scenario_started(nil, nil) - @formatter.step_pending(:then, 'do pend') - @formatter.scenario_pending('story', 'scenario', exception_from { raise RuntimeError, 'oops' }) - @formatter.run_ended - - # then - @out.string.should =~ /\n\z/ - end - - it 'should summarize the number of pending scenarios when the run ends' do - # when - @formatter.run_started(3) - @formatter.scenario_started(nil, nil) - @formatter.scenario_succeeded('story', 'scenario1') - @formatter.scenario_started(nil, nil) - @formatter.scenario_pending('story', 'scenario2', 'message') - @formatter.scenario_started(nil, nil) - @formatter.scenario_pending('story', 'scenario3', 'message') - @formatter.run_ended - - # then - @out.string.should include("3 scenarios: 1 succeeded, 0 failed, 2 pending") - end - - it "should only count the first failure in one scenario" do - # when - @formatter.run_started(3) - @formatter.scenario_started(nil, nil) - @formatter.scenario_succeeded('story', 'scenario1') - @formatter.scenario_started(nil, nil) - @formatter.scenario_failed('story', 'scenario2', exception_from { raise RuntimeError, 'oops' }) - @formatter.scenario_failed('story', 'scenario2', exception_from { raise RuntimeError, 'oops again' }) - @formatter.scenario_started(nil, nil) - @formatter.scenario_failed('story', 'scenario3', exception_from { raise RuntimeError, 'oops' }) - @formatter.run_ended - - # then - @out.string.should include("3 scenarios: 1 succeeded, 2 failed") - end - - it "should only count the first pending in one scenario" do - # when - @formatter.run_started(3) - @formatter.scenario_started(nil, nil) - @formatter.scenario_succeeded('story', 'scenario1') - @formatter.scenario_started(nil, nil) - @formatter.scenario_pending('story', 'scenario2', 'because ...') - @formatter.scenario_pending('story', 'scenario2', 'because ...') - @formatter.scenario_started(nil, nil) - @formatter.scenario_pending('story', 'scenario3', 'because ...') - @formatter.run_ended - - # then - @out.string.should include("3 scenarios: 1 succeeded, 0 failed, 2 pending") - end - - it "should only count a failure before the first pending in one scenario" do - # when - @formatter.run_started(3) - @formatter.scenario_started(nil, nil) - @formatter.scenario_succeeded('story', 'scenario1') - @formatter.scenario_started(nil, nil) - @formatter.scenario_pending('story', 'scenario2', exception_from { raise RuntimeError, 'oops' }) - @formatter.scenario_failed('story', 'scenario2', exception_from { raise RuntimeError, 'oops again' }) - @formatter.scenario_started(nil, nil) - @formatter.scenario_failed('story', 'scenario3', exception_from { raise RuntimeError, 'oops' }) - @formatter.run_ended - - # then - @out.string.should include("3 scenarios: 1 succeeded, 1 failed, 1 pending") - end - - it 'should produce details of the first failure each failed scenario when the run ends' do - # when - @formatter.run_started(3) - @formatter.scenario_started(nil, nil) - @formatter.scenario_succeeded('story', 'scenario1') - @formatter.scenario_started(nil, nil) - @formatter.scenario_failed('story', 'scenario2', exception_from { raise RuntimeError, 'oops2' }) - @formatter.scenario_failed('story', 'scenario2', exception_from { raise RuntimeError, 'oops2 - this one should not appear' }) - @formatter.scenario_started(nil, nil) - @formatter.scenario_failed('story', 'scenario3', exception_from { raise RuntimeError, 'oops3' }) - @formatter.run_ended - - # then - @out.string.should include("FAILURES:\n") - @out.string.should include("1) story (scenario2) FAILED") - @out.string.should include("RuntimeError: oops2") - @out.string.should_not include("RuntimeError: oops2 - this one should not appear") - @out.string.should include("2) story (scenario3) FAILED") - @out.string.should include("RuntimeError: oops3") - end - - it 'should produce details of each pending step when the run ends' do - # when - @formatter.run_started(2) - @formatter.story_started('story 1', 'narrative') - @formatter.scenario_started('story 1', 'scenario 1') - @formatter.step_pending(:given, 'todo 1', []) - @formatter.story_started('story 2', 'narrative') - @formatter.scenario_started('story 2', 'scenario 2') - @formatter.step_pending(:given, 'todo 2', []) - @formatter.run_ended - - # then - @out.string.should include("Pending Steps:\n") - @out.string.should include("1) story 1 (scenario 1): todo 1") - @out.string.should include("2) story 2 (scenario 2): todo 2") - end - - it 'should document a story title and narrative' do - # when - @formatter.story_started 'story', 'narrative' - - # then - @out.string.should include("Story: story\n\n narrative") - end - - it 'should document a scenario name' do - # when - @formatter.scenario_started 'story', 'scenario' - - # then - @out.string.should include("\n\n Scenario: scenario") - end - - it 'should document a step by sentence-casing its name' do - # when - @formatter.step_succeeded :given, 'a context' - @formatter.step_succeeded :when, 'an event' - @formatter.step_succeeded :then, 'an outcome' - - # then - @out.string.should include("\n\n Given a context\n\n When an event\n\n Then an outcome") - end - - it 'should document additional givens using And' do - # when - @formatter.step_succeeded :given, 'step 1' - @formatter.step_succeeded :given, 'step 2' - @formatter.step_succeeded :given, 'step 3' - - # then - @out.string.should include(" Given step 1\n And step 2\n And step 3") - end - - it 'should document additional events using And' do - # when - @formatter.step_succeeded :when, 'step 1' - @formatter.step_succeeded :when, 'step 2' - @formatter.step_succeeded :when, 'step 3' - - # then - @out.string.should include(" When step 1\n And step 2\n And step 3") - end - - it 'should document additional outcomes using And' do - # when - @formatter.step_succeeded :then, 'step 1' - @formatter.step_succeeded :then, 'step 2' - @formatter.step_succeeded :then, 'step 3' - - # then - @out.string.should include(" Then step 1\n And step 2\n And step 3") - end - - it 'should document a GivenScenario followed by a Given using And' do - # when - @formatter.step_succeeded :'given scenario', 'a scenario' - @formatter.step_succeeded :given, 'a context' - - # then - @out.string.should include(" Given scenario a scenario\n And a context") - end - - it 'should document steps with replaced params' do - @formatter.step_succeeded :given, 'a $coloured dog with $n legs', 'pink', 21 - @out.string.should include(" Given a pink dog with 21 legs") - end - - it 'should document steps that include dollar signs ($)' do - @formatter.step_succeeded :given, 'kicks that cost $$amount', 50 - @out.string.should include("Given kicks that cost $50") - end - - it 'should document regexp steps with replaced params' do - @formatter.step_succeeded :given, /a (pink|blue) dog with (.*) legs/, 'pink', 21 - @out.string.should include(" Given a pink dog with 21 legs") - end - - it 'should document regex steps that include dollar signs ($)' do - @formatter.step_succeeded :given, /kicks that cost \$(\d+)/, 50 - @out.string.should include("Given kicks that cost $50") - end - - it "should append PENDING for the first pending step" do - @formatter.scenario_started('','') - @formatter.step_pending(:given, 'a context') - - @out.string.should include('Given a context (PENDING)') - end - - it "should append PENDING for pending after already pending" do - @formatter.scenario_started('','') - @formatter.step_pending(:given, 'a context') - @formatter.step_pending(:when, 'I say hey') - - @out.string.should include('When I say hey (PENDING)') - end - - it "should append FAILED for the first failiure" do - @formatter.scenario_started('','') - @formatter.step_failed(:given, 'a context') - - @out.string.should include('Given a context (FAILED)') - end - - it "should append SKIPPED for the second failiure" do - @formatter.scenario_started('','') - @formatter.step_failed(:given, 'a context') - @formatter.step_failed(:when, 'I say hey') - - @out.string.should include('When I say hey (SKIPPED)') - end - - it "should append SKIPPED for a failure after PENDING" do - @formatter.scenario_started('','') - @formatter.step_pending(:given, 'a context') - @formatter.step_failed(:when, 'I say hey') - - @out.string.should include('When I say hey (SKIPPED)') - end - - it "should print steps which succeeded in green" do - @out.stub!(:tty?).and_return(true) - @options.stub!(:colour).and_return(true) - - @formatter.scenario_started('','') - @formatter.step_succeeded(:given, 'a context') - - @out.string.should =~ /\e\[32m[\n\s]+Given a context\e\[0m/m - end - - it "should print failed steps in red" do - @out.stub!(:tty?).and_return(true) - @options.stub!(:colour).and_return(true) - - @formatter.scenario_started('','') - @formatter.step_failed(:given, 'a context') - - @out.string.should =~ /\e\[31m[\n\s]+Given a context\e\[0m/m - end - - it "should print ' (FAILED)' in red" do - @out.stub!(:tty?).and_return(true) - @options.stub!(:colour).and_return(true) - - @formatter.scenario_started('','') - @formatter.step_failed(:given, 'a context') - - @out.string.should =~ /\e\[31m \(FAILED\)\e\[0m/ - end - - it "should print pending steps in yellow" do - @out.stub!(:tty?).and_return(true) - @options.stub!(:colour).and_return(true) - - @formatter.scenario_started('','') - @formatter.step_pending(:given, 'a context') - - @out.string.should =~ /\e\[33m[\n\s]+Given a context\e\[0m/m - end - - it "should print ' (PENDING)' in yellow" do - @out.stub!(:tty?).and_return(true) - @options.stub!(:colour).and_return(true) - - @formatter.scenario_started('','') - @formatter.step_pending(:given, 'a context') - - @out.string.should =~ /\e\[33m \(PENDING\)\e\[0m/ - end - - it "should print skipped steps in yellow if the scenario is already pending" do - @out.stub!(:tty?).and_return(true) - @options.stub!(:colour).and_return(true) - - @formatter.scenario_started('','') - @formatter.step_pending(:given, 'a context') - @formatter.step_failed(:when, 'I say hey') - - @out.string.should =~ /\e\[33m[\n\s]+When I say hey\e\[0m/m - end - - it "should print ' (SKIPPED)' in yellow if the scenario is already pending" do - @out.stub!(:tty?).and_return(true) - @options.stub!(:colour).and_return(true) - - @formatter.scenario_started('','') - @formatter.step_pending(:given, 'a context') - @formatter.step_failed(:when, 'I say hey') - - @out.string.should =~ /\e\[33m \(SKIPPED\)\e\[0m/ - end - - it "should print skipped steps in red if the scenario has already failed" do - @out.stub!(:tty?).and_return(true) - @options.stub!(:colour).and_return(true) - - @formatter.scenario_started('','') - @formatter.step_failed(:given, 'a context') - @formatter.step_failed(:when, 'I say hey') - - @out.string.should =~ /\e\[31m[\n\s]+When I say hey\e\[0m/m - end - - it "should print ' (SKIPPED)' in red if the scenario has already failed" do - @out.stub!(:tty?).and_return(true) - @options.stub!(:colour).and_return(true) - - @formatter.scenario_started('','') - @formatter.step_failed(:given, 'a context') - @formatter.step_failed(:when, 'I say hey') - - @out.string.should =~ /\e\[31m \(SKIPPED\)\e\[0m/m - end - - it 'should print some white space after each story' do - # when - @formatter.story_ended 'title', 'narrative' - - # then - @out.string.should include("\n\n") - end - - it "should print nothing for collected_steps" do - @formatter.collected_steps(['Given a $coloured $animal', 'Given a $n legged eel']) - @out.string.should == ("") - end - - it "should ignore messages it doesn't care about" do - lambda { - @formatter.this_method_does_not_exist - }.should_not raise_error - end - end - end - end - end -end diff --git a/vendor/plugins/rspec/spec/spec/runner/formatter/text_mate_formatted-1.8.4.html b/vendor/plugins/rspec/spec/spec/runner/formatter/text_mate_formatted-1.8.4.html deleted file mode 100644 index 3f263747a..000000000 --- a/vendor/plugins/rspec/spec/spec/runner/formatter/text_mate_formatted-1.8.4.html +++ /dev/null @@ -1,365 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html - PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" - "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head> - <title>RSpec results</title> - <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> - <meta http-equiv="Expires" content="-1" /> - <meta http-equiv="Pragma" content="no-cache" /> - <style type="text/css"> - body { - margin: 0; - padding: 0; - background: #fff; - font-size: 80%; - } - </style> -</head> -<body> -<div class="rspec-report"> - <script type="text/javascript"> - // <![CDATA[ -function moveProgressBar(percentDone) { - document.getElementById("rspec-header").style.width = percentDone +"%"; -} -function makeRed(element_id) { - document.getElementById(element_id).style.background = '#C40D0D'; - document.getElementById(element_id).style.color = '#FFFFFF'; -} - -function makeYellow(element_id) { - if (element_id == "rspec-header" && document.getElementById(element_id).style.background != '#C40D0D') - { - document.getElementById(element_id).style.background = '#FAF834'; - document.getElementById(element_id).style.color = '#000000'; - } - else - { - document.getElementById(element_id).style.background = '#FAF834'; - document.getElementById(element_id).style.color = '#000000'; - } -} - - // ]]> - </script> - <style type="text/css"> -#rspec-header { - background: #65C400; color: #fff; -} - -.rspec-report h1 { - margin: 0px 10px 0px 10px; - padding: 10px; - font-family: "Lucida Grande", Helvetica, sans-serif; - font-size: 1.8em; -} - -#summary { - margin: 0; padding: 5px 10px; - font-family: "Lucida Grande", Helvetica, sans-serif; - text-align: right; - position: absolute; - top: 0px; - right: 0px; -} - -#summary p { - margin: 0 0 0 2px; -} - -#summary #totals { - font-size: 1.2em; -} - -.example_group { - margin: 0 10px 5px; - background: #fff; -} - -dl { - margin: 0; padding: 0 0 5px; - font: normal 11px "Lucida Grande", Helvetica, sans-serif; -} - -dt { - padding: 3px; - background: #65C400; - color: #fff; - font-weight: bold; -} - -dd { - margin: 5px 0 5px 5px; - padding: 3px 3px 3px 18px; -} - -dd.spec.passed { - border-left: 5px solid #65C400; - border-bottom: 1px solid #65C400; - background: #DBFFB4; color: #3D7700; -} - -dd.spec.failed { - border-left: 5px solid #C20000; - border-bottom: 1px solid #C20000; - color: #C20000; background: #FFFBD3; -} - -dd.spec.not_implemented { - border-left: 5px solid #FAF834; - border-bottom: 1px solid #FAF834; - background: #FCFB98; color: #131313; -} - -dd.spec.pending_fixed { - border-left: 5px solid #0000C2; - border-bottom: 1px solid #0000C2; - color: #0000C2; background: #D3FBFF; -} - -.backtrace { - color: #000; - font-size: 12px; -} - -a { - color: #BE5C00; -} - -/* Ruby code, style similar to vibrant ink */ -.ruby { - font-size: 12px; - font-family: monospace; - color: white; - background-color: black; - padding: 0.1em 0 0.2em 0; -} - -.ruby .keyword { color: #FF6600; } -.ruby .constant { color: #339999; } -.ruby .attribute { color: white; } -.ruby .global { color: white; } -.ruby .module { color: white; } -.ruby .class { color: white; } -.ruby .string { color: #66FF00; } -.ruby .ident { color: white; } -.ruby .method { color: #FFCC00; } -.ruby .number { color: white; } -.ruby .char { color: white; } -.ruby .comment { color: #9933CC; } -.ruby .symbol { color: white; } -.ruby .regex { color: #44B4CC; } -.ruby .punct { color: white; } -.ruby .escape { color: white; } -.ruby .interp { color: white; } -.ruby .expr { color: white; } - -.ruby .offending { background-color: gray; } -.ruby .linenum { - width: 75px; - padding: 0.1em 1em 0.2em 0; - color: #000000; - background-color: #FFFBD3; -} - - </style> - -<div id="rspec-header"> - <h1>RSpec Results</h1> - - <div id="summary"> - <p id="totals"> </p> - <p id="duration"> </p> - </div> -</div> - -<div class="results"> -<div class="example_group"> - <dl> - <dt id="example_group_1">Mocker</dt> - <script type="text/javascript">moveProgressBar('5.8');</script> - <dd class="spec passed"><span class="passed_spec_name">should be able to call mock()</span></dd> - <script type="text/javascript">makeRed('rspec-header');</script> - <script type="text/javascript">makeRed('example_group_1');</script> - <script type="text/javascript">moveProgressBar('11.7');</script> - <dd class="spec failed"> - <span class="failed_spec_name">should fail when expected message not received</span> - <div class="failure" id="failure_1"> - <div class="message"><pre>Mock 'poke me' expected :poke with (any args) once, but received it 0 times</pre></div> - <div class="backtrace"><pre><a href="txmt://open?url=file:///Users/aslakhellesoy/scm/rspec/trunk/rspec/failing_examples/mocking_example.rb&line=13">./failing_examples/mocking_example.rb:13</a> -<a href="txmt://open?url=file:///Users/aslakhellesoy/scm/rspec/trunk/rspec/spec/spec/runner/formatter/spec_mate_formatter_spec.rb&line=52">./spec/spec/runner/formatter/spec_mate_formatter_spec.rb:52</a> -<a href="txmt://open?url=file:///Users/aslakhellesoy/scm/rspec/trunk/rspec/spec/spec/runner/formatter/spec_mate_formatter_spec.rb&line=48">./spec/spec/runner/formatter/spec_mate_formatter_spec.rb:48</a> </pre></div> - <pre class="ruby"><code><span class="linenum">11</span> <span class="ident">it</span> <span class="punct">"</span><span class="string">should fail when expected message not received</span><span class="punct">"</span> <span class="keyword">do</span> -<span class="linenum">12</span> <span class="ident">mock</span> <span class="punct">=</span> <span class="ident">mock</span><span class="punct">("</span><span class="string">poke me</span><span class="punct">")</span> -<span class="offending"><span class="linenum">13</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">should_receive</span><span class="punct">(</span><span class="symbol">:poke</span><span class="punct">)</span></span> -<span class="linenum">14</span> <span class="keyword">end</span> -<span class="linenum">15</span> </code></pre> - </div> - </dd> - <script type="text/javascript">moveProgressBar('17.6');</script> - <dd class="spec failed"> - <span class="failed_spec_name">should fail when messages are received out of order</span> - <div class="failure" id="failure_2"> - <div class="message"><pre>Mock 'one two three' received :three out of order</pre></div> - <div class="backtrace"><pre><a href="txmt://open?url=file:///Users/aslakhellesoy/scm/rspec/trunk/rspec/failing_examples/mocking_example.rb&line=22">./failing_examples/mocking_example.rb:22</a> -<a href="txmt://open?url=file:///Users/aslakhellesoy/scm/rspec/trunk/rspec/spec/spec/runner/formatter/spec_mate_formatter_spec.rb&line=52">./spec/spec/runner/formatter/spec_mate_formatter_spec.rb:52</a> -<a href="txmt://open?url=file:///Users/aslakhellesoy/scm/rspec/trunk/rspec/spec/spec/runner/formatter/spec_mate_formatter_spec.rb&line=48">./spec/spec/runner/formatter/spec_mate_formatter_spec.rb:48</a> </pre></div> - <pre class="ruby"><code><span class="linenum">20</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">should_receive</span><span class="punct">(</span><span class="symbol">:three</span><span class="punct">).</span><span class="ident">ordered</span> -<span class="linenum">21</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">one</span> -<span class="offending"><span class="linenum">22</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">three</span></span> -<span class="linenum">23</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">two</span> -<span class="linenum">24</span> <span class="keyword">end</span></code></pre> - </div> - </dd> - <script type="text/javascript">moveProgressBar('23.5');</script> - <dd class="spec failed"> - <span class="failed_spec_name">should get yelled at when sending unexpected messages</span> - <div class="failure" id="failure_3"> - <div class="message"><pre>Mock 'don't talk to me' expected :any_message_at_all with (any args) 0 times, but received it once</pre></div> - <div class="backtrace"><pre><a href="txmt://open?url=file:///Users/aslakhellesoy/scm/rspec/trunk/rspec/failing_examples/mocking_example.rb&line=28">./failing_examples/mocking_example.rb:28</a> -<a href="txmt://open?url=file:///Users/aslakhellesoy/scm/rspec/trunk/rspec/spec/spec/runner/formatter/spec_mate_formatter_spec.rb&line=52">./spec/spec/runner/formatter/spec_mate_formatter_spec.rb:52</a> -<a href="txmt://open?url=file:///Users/aslakhellesoy/scm/rspec/trunk/rspec/spec/spec/runner/formatter/spec_mate_formatter_spec.rb&line=48">./spec/spec/runner/formatter/spec_mate_formatter_spec.rb:48</a> </pre></div> - <pre class="ruby"><code><span class="linenum">26</span> <span class="ident">it</span> <span class="punct">"</span><span class="string">should get yelled at when sending unexpected messages</span><span class="punct">"</span> <span class="keyword">do</span> -<span class="linenum">27</span> <span class="ident">mock</span> <span class="punct">=</span> <span class="ident">mock</span><span class="punct">("</span><span class="string">don't talk to me</span><span class="punct">")</span> -<span class="offending"><span class="linenum">28</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">should_not_receive</span><span class="punct">(</span><span class="symbol">:any_message_at_all</span><span class="punct">)</span></span> -<span class="linenum">29</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">any_message_at_all</span> -<span class="linenum">30</span> <span class="keyword">end</span></code></pre> - </div> - </dd> - <script type="text/javascript">moveProgressBar('29.4');</script> - <dd class="spec pending_fixed"> - <span class="failed_spec_name">has a bug we need to fix</span> - <div class="failure" id="failure_4"> - <div class="message"><pre>Expected pending 'here is the bug' to fail. No Error was raised.</pre></div> - <div class="backtrace"><pre><a href="txmt://open?url=file:///Users/aslakhellesoy/scm/rspec/trunk/rspec/failing_examples/mocking_example.rb&line=33">./failing_examples/mocking_example.rb:33</a> -<a href="txmt://open?url=file:///Users/aslakhellesoy/scm/rspec/trunk/rspec/spec/spec/runner/formatter/spec_mate_formatter_spec.rb&line=52">./spec/spec/runner/formatter/spec_mate_formatter_spec.rb:52</a> -<a href="txmt://open?url=file:///Users/aslakhellesoy/scm/rspec/trunk/rspec/spec/spec/runner/formatter/spec_mate_formatter_spec.rb&line=48">./spec/spec/runner/formatter/spec_mate_formatter_spec.rb:48</a> </pre></div> - <pre class="ruby"><code><span class="linenum">31</span> -<span class="linenum">32</span> <span class="ident">it</span> <span class="punct">"</span><span class="string">has a bug we need to fix</span><span class="punct">"</span> <span class="keyword">do</span> -<span class="offending"><span class="linenum">33</span> <span class="ident">pending</span> <span class="punct">"</span><span class="string">here is the bug</span><span class="punct">"</span> <span class="keyword">do</span></span> -<span class="linenum">34</span> <span class="comment"># Actually, no. It's fixed. This will fail because it passes :-)</span> -<span class="linenum">35</span> <span class="ident">mock</span> <span class="punct">=</span> <span class="ident">mock</span><span class="punct">("</span><span class="string">Bug</span><span class="punct">")</span></code></pre> - </div> - </dd> - </dl> -</div> -<div class="example_group"> - <dl> - <dt id="example_group_2">Running specs with --diff</dt> - <script type="text/javascript">makeRed('example_group_2');</script> - <script type="text/javascript">moveProgressBar('35.2');</script> - <dd class="spec failed"> - <span class="failed_spec_name">should print diff of different strings</span> - <div class="failure" id="failure_5"> - <div class="message"><pre>expected: "RSpec is a\nbehaviour driven development\nframework for Ruby\n", - got: "RSpec is a\nbehavior driven development\nframework for Ruby\n" (using ==) -Diff: -@@ -1,4 +1,4 @@ - RSpec is a --behavior driven development -+behaviour driven development - framework for Ruby -</pre></div> - <div class="backtrace"><pre><a href="txmt://open?url=file:///Users/aslakhellesoy/scm/rspec/trunk/rspec/failing_examples/diffing_spec.rb&line=13">./failing_examples/diffing_spec.rb:13</a> -<a href="txmt://open?url=file:///Users/aslakhellesoy/scm/rspec/trunk/rspec/spec/spec/runner/formatter/spec_mate_formatter_spec.rb&line=52">./spec/spec/runner/formatter/spec_mate_formatter_spec.rb:52</a> -<a href="txmt://open?url=file:///Users/aslakhellesoy/scm/rspec/trunk/rspec/spec/spec/runner/formatter/spec_mate_formatter_spec.rb&line=48">./spec/spec/runner/formatter/spec_mate_formatter_spec.rb:48</a> </pre></div> - <pre class="ruby"><code><span class="linenum">11</span><span class="ident">framework</span> <span class="keyword">for</span> <span class="constant">Ruby</span> -<span class="linenum">12</span><span class="constant">EOF</span> -<span class="offending"><span class="linenum">13</span> <span class="ident">usa</span><span class="punct">.</span><span class="ident">should</span> <span class="punct">==</span> <span class="ident">uk</span></span> -<span class="linenum">14</span> <span class="keyword">end</span></code></pre> - </div> - </dd> - <script type="text/javascript">moveProgressBar('41.1');</script> - <dd class="spec failed"> - <span class="failed_spec_name">should print diff of different objects' pretty representation</span> - <div class="failure" id="failure_6"> - <div class="message"><pre>expected <Animal -name=bob, -species=tortoise -> -, got <Animal -name=bob, -species=giraffe -> - (using .eql?) -Diff: -@@ -1,5 +1,5 @@ - <Animal - name=bob, --species=giraffe -+species=tortoise - > -</pre></div> - <div class="backtrace"><pre><a href="txmt://open?url=file:///Users/aslakhellesoy/scm/rspec/trunk/rspec/failing_examples/diffing_spec.rb&line=34">./failing_examples/diffing_spec.rb:34</a> -<a href="txmt://open?url=file:///Users/aslakhellesoy/scm/rspec/trunk/rspec/spec/spec/runner/formatter/spec_mate_formatter_spec.rb&line=52">./spec/spec/runner/formatter/spec_mate_formatter_spec.rb:52</a> -<a href="txmt://open?url=file:///Users/aslakhellesoy/scm/rspec/trunk/rspec/spec/spec/runner/formatter/spec_mate_formatter_spec.rb&line=48">./spec/spec/runner/formatter/spec_mate_formatter_spec.rb:48</a> </pre></div> - <pre class="ruby"><code><span class="linenum">32</span> <span class="ident">expected</span> <span class="punct">=</span> <span class="constant">Animal</span><span class="punct">.</span><span class="ident">new</span> <span class="punct">"</span><span class="string">bob</span><span class="punct">",</span> <span class="punct">"</span><span class="string">giraffe</span><span class="punct">"</span> -<span class="linenum">33</span> <span class="ident">actual</span> <span class="punct">=</span> <span class="constant">Animal</span><span class="punct">.</span><span class="ident">new</span> <span class="punct">"</span><span class="string">bob</span><span class="punct">",</span> <span class="punct">"</span><span class="string">tortoise</span><span class="punct">"</span> -<span class="offending"><span class="linenum">34</span> <span class="ident">expected</span><span class="punct">.</span><span class="ident">should</span> <span class="ident">eql</span><span class="punct">(</span><span class="ident">actual</span><span class="punct">)</span></span> -<span class="linenum">35</span> <span class="keyword">end</span> -<span class="linenum">36</span><span class="keyword">end</span></code></pre> - </div> - </dd> - </dl> -</div> -<div class="example_group"> - <dl> - <dt id="example_group_3">A consumer of a stub</dt> - <script type="text/javascript">moveProgressBar('47.0');</script> - <dd class="spec passed"><span class="passed_spec_name">should be able to stub methods on any Object</span></dd> - </dl> -</div> -<div class="example_group"> - <dl> - <dt id="example_group_4">A stubbed method on a class</dt> - <script type="text/javascript">moveProgressBar('52.9');</script> - <dd class="spec passed"><span class="passed_spec_name">should return the stubbed value</span></dd> - <script type="text/javascript">moveProgressBar('58.8');</script> - <dd class="spec passed"><span class="passed_spec_name">should revert to the original method after each spec</span></dd> - <script type="text/javascript">moveProgressBar('64.7');</script> - <dd class="spec passed"><span class="passed_spec_name">can stub! and mock the same message</span></dd> - </dl> -</div> -<div class="example_group"> - <dl> - <dt id="example_group_5">A mock</dt> - <script type="text/javascript">moveProgressBar('70.5');</script> - <dd class="spec passed"><span class="passed_spec_name">can stub!</span></dd> - <script type="text/javascript">moveProgressBar('76.4');</script> - <dd class="spec passed"><span class="passed_spec_name">can stub! and mock</span></dd> - <script type="text/javascript">moveProgressBar('82.3');</script> - <dd class="spec passed"><span class="passed_spec_name">can stub! and mock the same message</span></dd> - </dl> -</div> -<div class="example_group"> - <dl> - <dt id="example_group_6">pending example (using pending method)</dt> - <script type="text/javascript">makeYellow('example_group_6');</script> - <script type="text/javascript">moveProgressBar('88.2');</script> - <dd class="spec not_implemented"><span class="not_implemented_spec_name">should be reported as "PENDING: for some reason" (PENDING: for some reason)</span></dd> - </dl> -</div> -<div class="example_group"> - <dl> - <dt id="example_group_7">pending example (with no block)</dt> - <script type="text/javascript">makeYellow('example_group_7');</script> - <script type="text/javascript">moveProgressBar('94.1');</script> - <dd class="spec not_implemented"><span class="not_implemented_spec_name">should be reported as "PENDING: Not Yet Implemented" (PENDING: Not Yet Implemented)</span></dd> - </dl> -</div> -<div class="example_group"> - <dl> - <dt id="example_group_8">pending example (with block for pending)</dt> - <script type="text/javascript">makeYellow('example_group_8');</script> - <script type="text/javascript">moveProgressBar('100.0');</script> - <dd class="spec not_implemented"><span class="not_implemented_spec_name">should have a failing block, passed to pending, reported as "PENDING: for some reason" (PENDING: for some reason)</span></dd> - </dl> -</div> -<script type="text/javascript">document.getElementById('duration').innerHTML = "Finished in <strong>x seconds</strong>";</script> -<script type="text/javascript">document.getElementById('totals').innerHTML = "17 examples, 6 failures, 3 pending";</script> -</div> -</div> -</body> -</html> diff --git a/vendor/plugins/rspec/spec/spec/runner/formatter/text_mate_formatted-1.8.6.html b/vendor/plugins/rspec/spec/spec/runner/formatter/text_mate_formatted-1.8.6.html index 60f8d1e2e..54d761901 100644 --- a/vendor/plugins/rspec/spec/spec/runner/formatter/text_mate_formatted-1.8.6.html +++ b/vendor/plugins/rspec/spec/spec/runner/formatter/text_mate_formatted-1.8.6.html @@ -16,9 +16,6 @@ font-size: 80%; } </style> -</head> -<body> -<div class="rspec-report"> <script type="text/javascript"> // <![CDATA[ function moveProgressBar(percentDone) { @@ -46,7 +43,7 @@ function makeYellow(element_id) { </script> <style type="text/css"> #rspec-header { - background: #65C400; color: #fff; + background: #65C400; color: #fff; height: 4em; } .rspec-report h1 { @@ -54,15 +51,16 @@ function makeYellow(element_id) { padding: 10px; font-family: "Lucida Grande", Helvetica, sans-serif; font-size: 1.8em; + position: absolute; } #summary { margin: 0; padding: 5px 10px; font-family: "Lucida Grande", Helvetica, sans-serif; text-align: right; - position: absolute; top: 0px; right: 0px; + float:right; } #summary p { @@ -165,9 +163,14 @@ a { } </style> +</head> +<body> +<div class="rspec-report"> <div id="rspec-header"> - <h1>RSpec Results</h1> + <div id="label"> + <h1>RSpec Code Examples</h1> + </div> <div id="summary"> <p id="totals"> </p> @@ -187,47 +190,47 @@ a { <dd class="spec failed"> <span class="failed_spec_name">should fail when expected message not received</span> <div class="failure" id="failure_1"> - <div class="message"><pre>Mock 'poke me' expected :poke with (any args) once, but received it 0 times</pre></div> - <div class="backtrace"><pre><a href="txmt://open?url=file:///Users/david/projects/ruby/rspec/rspec/failing_examples/mocking_example.rb&line=13">./failing_examples/mocking_example.rb:13</a> -<a href="txmt://open?url=file:///Users/david/projects/ruby/rspec/rspec/spec/spec/runner/formatter/spec_mate_formatter_spec.rb&line=50">/Users/david/projects/ruby/rspec/rspec/spec/spec/runner/formatter/spec_mate_formatter_spec.rb:50</a> -<a href="txmt://open?url=file:///Users/david/projects/ruby/rspec/rspec/spec/spec/runner/formatter/spec_mate_formatter_spec.rb&line=46">/Users/david/projects/ruby/rspec/rspec/spec/spec/runner/formatter/spec_mate_formatter_spec.rb:46</a> :in `chdir' -<a href="txmt://open?url=file:///Users/david/projects/ruby/rspec/rspec/spec/spec/runner/formatter/spec_mate_formatter_spec.rb&line=46">/Users/david/projects/ruby/rspec/rspec/spec/spec/runner/formatter/spec_mate_formatter_spec.rb:46</a> </pre></div> - <pre class="ruby"><code><span class="linenum">11</span> <span class="ident">it</span> <span class="punct">"</span><span class="string">should fail when expected message not received</span><span class="punct">"</span> <span class="keyword">do</span> -<span class="linenum">12</span> <span class="ident">mock</span> <span class="punct">=</span> <span class="ident">mock</span><span class="punct">("</span><span class="string">poke me</span><span class="punct">")</span> -<span class="offending"><span class="linenum">13</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">should_receive</span><span class="punct">(</span><span class="symbol">:poke</span><span class="punct">)</span></span> -<span class="linenum">14</span> <span class="keyword">end</span> -<span class="linenum">15</span> </code></pre> + <div class="message"><pre>Mock "poke me" expected :poke with (any args) once, but received it 0 times</pre></div> + <div class="backtrace"><pre><a href="txmt://open?url=file://./examples/failing/mocking_example.rb&line=11">./examples/failing/mocking_example.rb:11</a> +<a href="txmt://open?url=file://./spec/spec/runner/formatter/text_mate_formatter_spec.rb&line=49">./spec/spec/runner/formatter/text_mate_formatter_spec.rb:49</a> +<a href="txmt://open?url=file://./spec/spec/runner/formatter/text_mate_formatter_spec.rb&line=45">./spec/spec/runner/formatter/text_mate_formatter_spec.rb:45</a> :in `chdir' +<a href="txmt://open?url=file://./spec/spec/runner/formatter/text_mate_formatter_spec.rb&line=45">./spec/spec/runner/formatter/text_mate_formatter_spec.rb:45</a> </pre></div> + <pre class="ruby"><code><span class="linenum">9</span> <span class="ident">it</span> <span class="punct">"</span><span class="string">should fail when expected message not received</span><span class="punct">"</span> <span class="keyword">do</span> +<span class="linenum">10</span> <span class="ident">mock</span> <span class="punct">=</span> <span class="ident">mock</span><span class="punct">("</span><span class="string">poke me</span><span class="punct">")</span> +<span class="offending"><span class="linenum">11</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">should_receive</span><span class="punct">(</span><span class="symbol">:poke</span><span class="punct">)</span></span> +<span class="linenum">12</span> <span class="keyword">end</span> +<span class="linenum">13</span> </code></pre> </div> </dd> <script type="text/javascript">moveProgressBar('17.6');</script> <dd class="spec failed"> <span class="failed_spec_name">should fail when messages are received out of order</span> <div class="failure" id="failure_2"> - <div class="message"><pre>Mock 'one two three' received :three out of order</pre></div> - <div class="backtrace"><pre><a href="txmt://open?url=file:///Users/david/projects/ruby/rspec/rspec/failing_examples/mocking_example.rb&line=22">./failing_examples/mocking_example.rb:22</a> -<a href="txmt://open?url=file:///Users/david/projects/ruby/rspec/rspec/spec/spec/runner/formatter/spec_mate_formatter_spec.rb&line=50">/Users/david/projects/ruby/rspec/rspec/spec/spec/runner/formatter/spec_mate_formatter_spec.rb:50</a> -<a href="txmt://open?url=file:///Users/david/projects/ruby/rspec/rspec/spec/spec/runner/formatter/spec_mate_formatter_spec.rb&line=46">/Users/david/projects/ruby/rspec/rspec/spec/spec/runner/formatter/spec_mate_formatter_spec.rb:46</a> :in `chdir' -<a href="txmt://open?url=file:///Users/david/projects/ruby/rspec/rspec/spec/spec/runner/formatter/spec_mate_formatter_spec.rb&line=46">/Users/david/projects/ruby/rspec/rspec/spec/spec/runner/formatter/spec_mate_formatter_spec.rb:46</a> </pre></div> - <pre class="ruby"><code><span class="linenum">20</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">should_receive</span><span class="punct">(</span><span class="symbol">:three</span><span class="punct">).</span><span class="ident">ordered</span> -<span class="linenum">21</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">one</span> -<span class="offending"><span class="linenum">22</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">three</span></span> -<span class="linenum">23</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">two</span> -<span class="linenum">24</span> <span class="keyword">end</span></code></pre> + <div class="message"><pre>Mock "one two three" received :three out of order</pre></div> + <div class="backtrace"><pre><a href="txmt://open?url=file://./examples/failing/mocking_example.rb&line=20">./examples/failing/mocking_example.rb:20</a> +<a href="txmt://open?url=file://./spec/spec/runner/formatter/text_mate_formatter_spec.rb&line=49">./spec/spec/runner/formatter/text_mate_formatter_spec.rb:49</a> +<a href="txmt://open?url=file://./spec/spec/runner/formatter/text_mate_formatter_spec.rb&line=45">./spec/spec/runner/formatter/text_mate_formatter_spec.rb:45</a> :in `chdir' +<a href="txmt://open?url=file://./spec/spec/runner/formatter/text_mate_formatter_spec.rb&line=45">./spec/spec/runner/formatter/text_mate_formatter_spec.rb:45</a> </pre></div> + <pre class="ruby"><code><span class="linenum">18</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">should_receive</span><span class="punct">(</span><span class="symbol">:three</span><span class="punct">).</span><span class="ident">ordered</span> +<span class="linenum">19</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">one</span> +<span class="offending"><span class="linenum">20</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">three</span></span> +<span class="linenum">21</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">two</span> +<span class="linenum">22</span> <span class="keyword">end</span></code></pre> </div> </dd> <script type="text/javascript">moveProgressBar('23.5');</script> <dd class="spec failed"> <span class="failed_spec_name">should get yelled at when sending unexpected messages</span> <div class="failure" id="failure_3"> - <div class="message"><pre>Mock 'don't talk to me' expected :any_message_at_all with (no args) 0 times, but received it once</pre></div> - <div class="backtrace"><pre><a href="txmt://open?url=file:///Users/david/projects/ruby/rspec/rspec/failing_examples/mocking_example.rb&line=29">./failing_examples/mocking_example.rb:29</a> -<a href="txmt://open?url=file:///Users/david/projects/ruby/rspec/rspec/spec/spec/runner/formatter/spec_mate_formatter_spec.rb&line=50">/Users/david/projects/ruby/rspec/rspec/spec/spec/runner/formatter/spec_mate_formatter_spec.rb:50</a> -<a href="txmt://open?url=file:///Users/david/projects/ruby/rspec/rspec/spec/spec/runner/formatter/spec_mate_formatter_spec.rb&line=46">/Users/david/projects/ruby/rspec/rspec/spec/spec/runner/formatter/spec_mate_formatter_spec.rb:46</a> :in `chdir' -<a href="txmt://open?url=file:///Users/david/projects/ruby/rspec/rspec/spec/spec/runner/formatter/spec_mate_formatter_spec.rb&line=46">/Users/david/projects/ruby/rspec/rspec/spec/spec/runner/formatter/spec_mate_formatter_spec.rb:46</a> </pre></div> - <pre class="ruby"><code><span class="linenum">27</span> <span class="ident">mock</span> <span class="punct">=</span> <span class="ident">mock</span><span class="punct">("</span><span class="string">don't talk to me</span><span class="punct">")</span> -<span class="linenum">28</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">should_not_receive</span><span class="punct">(</span><span class="symbol">:any_message_at_all</span><span class="punct">)</span> -<span class="offending"><span class="linenum">29</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">any_message_at_all</span></span> -<span class="linenum">30</span> <span class="keyword">end</span></code></pre> + <div class="message"><pre>Mock "don't talk to me" expected :any_message_at_all with (no args) 0 times, but received it once</pre></div> + <div class="backtrace"><pre><a href="txmt://open?url=file://./examples/failing/mocking_example.rb&line=27">./examples/failing/mocking_example.rb:27</a> +<a href="txmt://open?url=file://./spec/spec/runner/formatter/text_mate_formatter_spec.rb&line=49">./spec/spec/runner/formatter/text_mate_formatter_spec.rb:49</a> +<a href="txmt://open?url=file://./spec/spec/runner/formatter/text_mate_formatter_spec.rb&line=45">./spec/spec/runner/formatter/text_mate_formatter_spec.rb:45</a> :in `chdir' +<a href="txmt://open?url=file://./spec/spec/runner/formatter/text_mate_formatter_spec.rb&line=45">./spec/spec/runner/formatter/text_mate_formatter_spec.rb:45</a> </pre></div> + <pre class="ruby"><code><span class="linenum">25</span> <span class="ident">mock</span> <span class="punct">=</span> <span class="ident">mock</span><span class="punct">("</span><span class="string">don't talk to me</span><span class="punct">")</span> +<span class="linenum">26</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">should_not_receive</span><span class="punct">(</span><span class="symbol">:any_message_at_all</span><span class="punct">)</span> +<span class="offending"><span class="linenum">27</span> <span class="ident">mock</span><span class="punct">.</span><span class="ident">any_message_at_all</span></span> +<span class="linenum">28</span> <span class="keyword">end</span></code></pre> </div> </dd> <script type="text/javascript">moveProgressBar('29.4');</script> @@ -235,15 +238,15 @@ a { <span class="failed_spec_name">has a bug we need to fix</span> <div class="failure" id="failure_4"> <div class="message"><pre>Expected pending 'here is the bug' to fail. No Error was raised.</pre></div> - <div class="backtrace"><pre><a href="txmt://open?url=file:///Users/david/projects/ruby/rspec/rspec/failing_examples/mocking_example.rb&line=33">./failing_examples/mocking_example.rb:33</a> -<a href="txmt://open?url=file:///Users/david/projects/ruby/rspec/rspec/spec/spec/runner/formatter/spec_mate_formatter_spec.rb&line=50">/Users/david/projects/ruby/rspec/rspec/spec/spec/runner/formatter/spec_mate_formatter_spec.rb:50</a> -<a href="txmt://open?url=file:///Users/david/projects/ruby/rspec/rspec/spec/spec/runner/formatter/spec_mate_formatter_spec.rb&line=46">/Users/david/projects/ruby/rspec/rspec/spec/spec/runner/formatter/spec_mate_formatter_spec.rb:46</a> :in `chdir' -<a href="txmt://open?url=file:///Users/david/projects/ruby/rspec/rspec/spec/spec/runner/formatter/spec_mate_formatter_spec.rb&line=46">/Users/david/projects/ruby/rspec/rspec/spec/spec/runner/formatter/spec_mate_formatter_spec.rb:46</a> </pre></div> - <pre class="ruby"><code><span class="linenum">31</span> -<span class="linenum">32</span> <span class="ident">it</span> <span class="punct">"</span><span class="string">has a bug we need to fix</span><span class="punct">"</span> <span class="keyword">do</span> -<span class="offending"><span class="linenum">33</span> <span class="ident">pending</span> <span class="punct">"</span><span class="string">here is the bug</span><span class="punct">"</span> <span class="keyword">do</span></span> -<span class="linenum">34</span> <span class="comment"># Actually, no. It's fixed. This will fail because it passes :-)</span> -<span class="linenum">35</span> <span class="ident">mock</span> <span class="punct">=</span> <span class="ident">mock</span><span class="punct">("</span><span class="string">Bug</span><span class="punct">")</span></code></pre> + <div class="backtrace"><pre><a href="txmt://open?url=file://./examples/failing/mocking_example.rb&line=31">./examples/failing/mocking_example.rb:31</a> +<a href="txmt://open?url=file://./spec/spec/runner/formatter/text_mate_formatter_spec.rb&line=49">./spec/spec/runner/formatter/text_mate_formatter_spec.rb:49</a> +<a href="txmt://open?url=file://./spec/spec/runner/formatter/text_mate_formatter_spec.rb&line=45">./spec/spec/runner/formatter/text_mate_formatter_spec.rb:45</a> :in `chdir' +<a href="txmt://open?url=file://./spec/spec/runner/formatter/text_mate_formatter_spec.rb&line=45">./spec/spec/runner/formatter/text_mate_formatter_spec.rb:45</a> </pre></div> + <pre class="ruby"><code><span class="linenum">29</span> +<span class="linenum">30</span> <span class="ident">it</span> <span class="punct">"</span><span class="string">has a bug we need to fix</span><span class="punct">"</span> <span class="keyword">do</span> +<span class="offending"><span class="linenum">31</span> <span class="ident">pending</span> <span class="punct">"</span><span class="string">here is the bug</span><span class="punct">"</span> <span class="keyword">do</span></span> +<span class="linenum">32</span> <span class="comment"># Actually, no. It's fixed. This will fail because it passes :-)</span> +<span class="linenum">33</span> <span class="ident">mock</span> <span class="punct">=</span> <span class="ident">mock</span><span class="punct">("</span><span class="string">Bug</span><span class="punct">")</span></code></pre> </div> </dd> </dl> @@ -258,17 +261,18 @@ a { <div class="failure" id="failure_5"> <div class="message"><pre>expected: "RSpec is a\nbehaviour driven development\nframework for Ruby\n", got: "RSpec is a\nbehavior driven development\nframework for Ruby\n" (using ==) -Diff: + + Diff: @@ -1,4 +1,4 @@ RSpec is a -behaviour driven development +behavior driven development framework for Ruby </pre></div> - <div class="backtrace"><pre><a href="txmt://open?url=file:///Users/david/projects/ruby/rspec/rspec/failing_examples/diffing_spec.rb&line=13">./failing_examples/diffing_spec.rb:13</a> -<a href="txmt://open?url=file:///Users/david/projects/ruby/rspec/rspec/spec/spec/runner/formatter/spec_mate_formatter_spec.rb&line=50">/Users/david/projects/ruby/rspec/rspec/spec/spec/runner/formatter/spec_mate_formatter_spec.rb:50</a> -<a href="txmt://open?url=file:///Users/david/projects/ruby/rspec/rspec/spec/spec/runner/formatter/spec_mate_formatter_spec.rb&line=46">/Users/david/projects/ruby/rspec/rspec/spec/spec/runner/formatter/spec_mate_formatter_spec.rb:46</a> :in `chdir' -<a href="txmt://open?url=file:///Users/david/projects/ruby/rspec/rspec/spec/spec/runner/formatter/spec_mate_formatter_spec.rb&line=46">/Users/david/projects/ruby/rspec/rspec/spec/spec/runner/formatter/spec_mate_formatter_spec.rb:46</a> </pre></div> + <div class="backtrace"><pre><a href="txmt://open?url=file://./examples/failing/diffing_spec.rb&line=13">./examples/failing/diffing_spec.rb:13</a> +<a href="txmt://open?url=file://./spec/spec/runner/formatter/text_mate_formatter_spec.rb&line=49">./spec/spec/runner/formatter/text_mate_formatter_spec.rb:49</a> +<a href="txmt://open?url=file://./spec/spec/runner/formatter/text_mate_formatter_spec.rb&line=45">./spec/spec/runner/formatter/text_mate_formatter_spec.rb:45</a> :in `chdir' +<a href="txmt://open?url=file://./spec/spec/runner/formatter/text_mate_formatter_spec.rb&line=45">./spec/spec/runner/formatter/text_mate_formatter_spec.rb:45</a> </pre></div> <pre class="ruby"><code><span class="linenum">11</span><span class="ident">framework</span> <span class="keyword">for</span> <span class="constant">Ruby</span> <span class="linenum">12</span><span class="constant">EOF</span> <span class="offending"><span class="linenum">13</span> <span class="ident">usa</span><span class="punct">.</span><span class="ident">should</span> <span class="punct">==</span> <span class="ident">uk</span></span> @@ -279,27 +283,24 @@ Diff: <dd class="spec failed"> <span class="failed_spec_name">should print diff of different objects' pretty representation</span> <div class="failure" id="failure_6"> - <div class="message"><pre>expected <Animal + <div class="message"><pre> +expected <Animal name=bob, species=tortoise > -, got <Animal + + got <Animal name=bob, species=giraffe > - (using .eql?) -Diff: -@@ -1,5 +1,5 @@ - <Animal - name=bob, --species=tortoise -+species=giraffe - > + + +(compared using eql?) </pre></div> - <div class="backtrace"><pre><a href="txmt://open?url=file:///Users/david/projects/ruby/rspec/rspec/failing_examples/diffing_spec.rb&line=34">./failing_examples/diffing_spec.rb:34</a> -<a href="txmt://open?url=file:///Users/david/projects/ruby/rspec/rspec/spec/spec/runner/formatter/spec_mate_formatter_spec.rb&line=50">/Users/david/projects/ruby/rspec/rspec/spec/spec/runner/formatter/spec_mate_formatter_spec.rb:50</a> -<a href="txmt://open?url=file:///Users/david/projects/ruby/rspec/rspec/spec/spec/runner/formatter/spec_mate_formatter_spec.rb&line=46">/Users/david/projects/ruby/rspec/rspec/spec/spec/runner/formatter/spec_mate_formatter_spec.rb:46</a> :in `chdir' -<a href="txmt://open?url=file:///Users/david/projects/ruby/rspec/rspec/spec/spec/runner/formatter/spec_mate_formatter_spec.rb&line=46">/Users/david/projects/ruby/rspec/rspec/spec/spec/runner/formatter/spec_mate_formatter_spec.rb:46</a> </pre></div> + <div class="backtrace"><pre><a href="txmt://open?url=file://./examples/failing/diffing_spec.rb&line=34">./examples/failing/diffing_spec.rb:34</a> +<a href="txmt://open?url=file://./spec/spec/runner/formatter/text_mate_formatter_spec.rb&line=49">./spec/spec/runner/formatter/text_mate_formatter_spec.rb:49</a> +<a href="txmt://open?url=file://./spec/spec/runner/formatter/text_mate_formatter_spec.rb&line=45">./spec/spec/runner/formatter/text_mate_formatter_spec.rb:45</a> :in `chdir' +<a href="txmt://open?url=file://./spec/spec/runner/formatter/text_mate_formatter_spec.rb&line=45">./spec/spec/runner/formatter/text_mate_formatter_spec.rb:45</a> </pre></div> <pre class="ruby"><code><span class="linenum">32</span> <span class="ident">expected</span> <span class="punct">=</span> <span class="constant">Animal</span><span class="punct">.</span><span class="ident">new</span> <span class="punct">"</span><span class="string">bob</span><span class="punct">",</span> <span class="punct">"</span><span class="string">giraffe</span><span class="punct">"</span> <span class="linenum">33</span> <span class="ident">actual</span> <span class="punct">=</span> <span class="constant">Animal</span><span class="punct">.</span><span class="ident">new</span> <span class="punct">"</span><span class="string">bob</span><span class="punct">",</span> <span class="punct">"</span><span class="string">tortoise</span><span class="punct">"</span> <span class="offending"><span class="linenum">34</span> <span class="ident">expected</span><span class="punct">.</span><span class="ident">should</span> <span class="ident">eql</span><span class="punct">(</span><span class="ident">actual</span><span class="punct">)</span></span> diff --git a/vendor/plugins/rspec/spec/spec/runner/heckle_runner_spec.rb b/vendor/plugins/rspec/spec/spec/runner/heckle_runner_spec.rb index 539d908c2..287ff856a 100644 --- a/vendor/plugins/rspec/spec/spec/runner/heckle_runner_spec.rb +++ b/vendor/plugins/rspec/spec/spec/runner/heckle_runner_spec.rb @@ -1,5 +1,5 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' -unless [/mswin/, /java/].detect{|p| p =~ RUBY_PLATFORM} +require 'spec_helper' +unless [/mswin/, /java/].detect{|p| p =~ RUBY_PLATFORM} || Spec::Ruby.version.to_f == 1.9 require 'spec/runner/heckle_runner' module Foo @@ -21,18 +21,18 @@ unless [/mswin/, /java/].detect{|p| p =~ RUBY_PLATFORM} end it "should heckle all methods in all classes in a module" do - @heckle_class.should_receive(:new).with("Foo::Bar", "one", rspec_options).and_return(@heckle) - @heckle_class.should_receive(:new).with("Foo::Bar", "two", rspec_options).and_return(@heckle) - @heckle_class.should_receive(:new).with("Foo::Zap", "three", rspec_options).and_return(@heckle) - @heckle_class.should_receive(:new).with("Foo::Zap", "four", rspec_options).and_return(@heckle) + @heckle_class.should_receive(:new).with("Foo::Bar", "one", Spec::Runner.options).and_return(@heckle) + @heckle_class.should_receive(:new).with("Foo::Bar", "two", Spec::Runner.options).and_return(@heckle) + @heckle_class.should_receive(:new).with("Foo::Zap", "three", Spec::Runner.options).and_return(@heckle) + @heckle_class.should_receive(:new).with("Foo::Zap", "four", Spec::Runner.options).and_return(@heckle) heckle_runner = Spec::Runner::HeckleRunner.new("Foo", @heckle_class) heckle_runner.heckle_with end it "should heckle all methods in a class" do - @heckle_class.should_receive(:new).with("Foo::Bar", "one", rspec_options).and_return(@heckle) - @heckle_class.should_receive(:new).with("Foo::Bar", "two", rspec_options).and_return(@heckle) + @heckle_class.should_receive(:new).with("Foo::Bar", "one", Spec::Runner.options).and_return(@heckle) + @heckle_class.should_receive(:new).with("Foo::Bar", "two", Spec::Runner.options).and_return(@heckle) heckle_runner = Spec::Runner::HeckleRunner.new("Foo::Bar", @heckle_class) heckle_runner.heckle_with @@ -46,14 +46,14 @@ unless [/mswin/, /java/].detect{|p| p =~ RUBY_PLATFORM} end it "should heckle specific method in a class (with #)" do - @heckle_class.should_receive(:new).with("Foo::Bar", "two", rspec_options).and_return(@heckle) + @heckle_class.should_receive(:new).with("Foo::Bar", "two", Spec::Runner.options).and_return(@heckle) heckle_runner = Spec::Runner::HeckleRunner.new("Foo::Bar#two", @heckle_class) heckle_runner.heckle_with end it "should heckle specific method in a class (with .)" do - @heckle_class.should_receive(:new).with("Foo::Bar", "two", rspec_options).and_return(@heckle) + @heckle_class.should_receive(:new).with("Foo::Bar", "two", Spec::Runner.options).and_return(@heckle) heckle_runner = Spec::Runner::HeckleRunner.new("Foo::Bar.two", @heckle_class) heckle_runner.heckle_with diff --git a/vendor/plugins/rspec/spec/spec/runner/heckler_spec.rb b/vendor/plugins/rspec/spec/spec/runner/heckler_spec.rb index 7cf6606ec..00869df6e 100644 --- a/vendor/plugins/rspec/spec/spec/runner/heckler_spec.rb +++ b/vendor/plugins/rspec/spec/spec/runner/heckler_spec.rb @@ -1,13 +1,20 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' -unless [/mswin/, /java/].detect{|p| p =~ RUBY_PLATFORM} - require 'spec/runner/heckle_runner' +if Spec::Ruby.version.to_f < 1.9 + require 'spec_helper' + unless [/mswin/, /java/].detect{|p| p =~ RUBY_PLATFORM} + require 'spec/runner/heckle_runner' - describe "Heckler" do - it "should run examples on tests_pass?" do - options = Spec::Runner::Options.new(StringIO.new, StringIO.new) - options.should_receive(:run_examples).with().and_return(&options.method(:run_examples)) - heckler = Spec::Runner::Heckler.new('Array', 'push', options) - heckler.tests_pass? + describe "Heckler" do + it "should run examples on tests_pass?" do + sub = Class.new(Spec::Runner::Heckler) do + def initialize(klass_name, method_name, rspec_options) + @rspec_options = rspec_options + end + end + opts = mock('options') + opts.should_receive(:run_examples).and_return(true) + heckler = sub.new('klass','method',opts) + heckler.tests_pass? + end end end end diff --git a/vendor/plugins/rspec/spec/spec/runner/noisy_backtrace_tweaker_spec.rb b/vendor/plugins/rspec/spec/spec/runner/noisy_backtrace_tweaker_spec.rb index e097f2ec0..13b79432c 100644 --- a/vendor/plugins/rspec/spec/spec/runner/noisy_backtrace_tweaker_spec.rb +++ b/vendor/plugins/rspec/spec/spec/runner/noisy_backtrace_tweaker_spec.rb @@ -1,14 +1,26 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' +require 'spec_helper' module Spec module Runner - describe "NoisyBacktraceTweaker" do + describe NoisyBacktraceTweaker do before(:each) do @error = RuntimeError.new @tweaker = NoisyBacktraceTweaker.new end - - it "should leave anything in lib spec dir" do + + it "gracefully handles nil backtrace" do + lambda do + @tweaker.tweak_backtrace(@error) + end.should_not raise_error + end + + it "cleans up double slashes" do + @error.set_backtrace(["/a//b/c//d.rb"]) + @tweaker.tweak_backtrace(@error) + @error.backtrace.should include("/a/b/c/d.rb") + end + + it "preserves lines in lib/spec" do ["expectations", "mocks", "runner", "stubs"].each do |child| @error.set_backtrace(["/lib/spec/#{child}/anything.rb"]) @tweaker.tweak_backtrace(@error) @@ -16,30 +28,24 @@ module Spec end end - it "should leave anything in spec dir" do + it "preserves lines in spec/" do @error.set_backtrace(["/lib/spec/expectations/anything.rb"]) @tweaker.tweak_backtrace(@error) @error.backtrace.should_not be_empty end - it "should leave bin spec" do + it "preserves lines in bin/spec" do @error.set_backtrace(["bin/spec:"]) @tweaker.tweak_backtrace(@error) @error.backtrace.should_not be_empty end - it "should not barf on nil backtrace" do - lambda do - @tweaker.tweak_backtrace(@error) - end.should_not raise_error - end - - it "should clean up double slashes" do - @error.set_backtrace(["/a//b/c//d.rb"]) + it "ignores custom patterns" do + @tweaker.ignore_patterns(/custom_pattern/) + @error.set_backtrace(["custom_pattern"]) @tweaker.tweak_backtrace(@error) - @error.backtrace.should include("/a/b/c/d.rb") + @error.backtrace.should_not be_empty end - end end end diff --git a/vendor/plugins/rspec/spec/spec/runner/option_parser_spec.rb b/vendor/plugins/rspec/spec/spec/runner/option_parser_spec.rb index 69212ff1b..a516bc686 100644 --- a/vendor/plugins/rspec/spec/spec/runner/option_parser_spec.rb +++ b/vendor/plugins/rspec/spec/spec/runner/option_parser_spec.rb @@ -1,7 +1,9 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' -require 'fileutils' +require 'spec_helper' +require 'spec/runner/resources/custom_example_group_runner' +require 'fakefs/safe' +require 'fakefs/spec_helpers' -describe "OptionParser" do +describe "OptionParser" do before(:each) do @out = StringIO.new @err = StringIO.new @@ -13,11 +15,55 @@ describe "OptionParser" do @parser.options end + # FIXME - this entire file should run w/ fakefs + describe "with fakefs" do + extend FakeFS::SpecHelpers + use_fakefs + + it "should not use colour by default" do + options = parse([]) + options.colour.should == false + end + + it "should use progress bar formatter by default" do + options = parse([]) + options.formatters[0].class.should equal(Spec::Runner::Formatter::ProgressBarFormatter) + end + end + + it "should leave the submitted argv alone" do + args = ["--pattern", "foo"] + @parser.order!(args) + args.should == ["--pattern", "foo"] + end + it "should accept files to include" do options = parse(["--pattern", "foo"]) options.filename_pattern.should == "foo" end + it "should accept debugger option" do + options = parse(["--debugger"]) + options.debug.should be_true + end + + it "should accept -u form of debugger option" do + options = parse(["-u"]) + options.debug.should be_true + end + + it "should turn off the debugger option if drb is specified later" do + @parser.stub!(:parse_drb).with(no_args).and_return(true) + options = parse(["-u", "--drb"]) + options.debug.should be_false + end + + it "should turn off the debugger option if drb is specified first" do + @parser.stub!(:parse_drb).with(no_args).and_return(true) + options = parse(["--drb", "-u"]) + options.debug.should be_false + end + it "should accept dry run option" do options = parse(["--dry-run"]) options.dry_run.should be_true @@ -46,23 +92,24 @@ describe "OptionParser" do options.verbose.should be_nil end - it "should not use colour by default" do + it "should print help to stdout if no args and spec_comand?" do + Spec::Runner::OptionParser.stub!(:spec_command?).and_return(true) options = parse([]) - options.colour.should == false + @out.rewind + @out.read.should match(/Usage: spec \(FILE\(:LINE\)\?\|DIRECTORY\|GLOB\)\+ \[options\]/m) end - - it "should print help to stdout if no args" do - pending 'A regression since 1.0.8' do - options = parse([]) - @out.rewind - @out.read.should match(/Usage: spec \(FILE\|DIRECTORY\|GLOB\)\+ \[options\]/m) - end + + it "should not print help to stdout if no args and NOT spec_command?" do + Spec::Runner::OptionParser.stub!(:spec_command?).and_return(false) + options = parse([]) + @out.rewind + @out.read.should == "" end it "should print help to stdout" do options = parse(["--help"]) @out.rewind - @out.read.should match(/Usage: spec \(FILE\|DIRECTORY\|GLOB\)\+ \[options\]/m) + @out.read.should match(/Usage: spec \(FILE\(:LINE\)\?\|DIRECTORY\|GLOB\)\+ \[options\]/m) end it "should print instructions about how to require missing formatter" do @@ -76,7 +123,7 @@ describe "OptionParser" do it "should print version to stdout" do options = parse(["--version"]) @out.rewind - @out.read.should match(/RSpec-\d+\.\d+\.\d+.*\(build \d+\) - BDD for Ruby\nhttp:\/\/rspec.rubyforge.org\/\n/n) + @out.read.should match(/rspec \d+\.\d+\.\d+/n) end it "should require file when require specified" do @@ -132,26 +179,26 @@ describe "OptionParser" do options.formatters[0].class.should equal(Spec::Runner::Formatter::HtmlFormatter) end - it "should use html story formatter when format is h" do - options = parse(["--format", "h"]) - options.story_formatters[0].class.should equal(Spec::Runner::Formatter::Story::HtmlFormatter) - end - it "should use html formatter when format is html" do options = parse(["--format", "html"]) options.formatters[0].class.should equal(Spec::Runner::Formatter::HtmlFormatter) end - it "should use html story formatter when format is html" do - options = parse(["--format", "html"]) - options.story_formatters[0].class.should equal(Spec::Runner::Formatter::Story::HtmlFormatter) + it "should use silent formatter when format is s" do + options = parse(["--format", "l"]) + options.formatters[0].class.should equal(Spec::Runner::Formatter::SilentFormatter) + end + + it "should use silent formatter when format is silent" do + options = parse(["--format", "silent"]) + options.formatters[0].class.should equal(Spec::Runner::Formatter::SilentFormatter) end it "should use html formatter with explicit output when format is html:test.html" do FileUtils.rm 'test.html' if File.exist?('test.html') options = parse(["--format", "html:test.html"]) options.formatters # creates the file - File.should be_exist('test.html') + File.should exist('test.html') options.formatters[0].class.should equal(Spec::Runner::Formatter::HtmlFormatter) options.formatters[0].close FileUtils.rm 'test.html' @@ -172,11 +219,6 @@ describe "OptionParser" do options.backtrace_tweaker.should be_instance_of(Spec::Runner::QuietBacktraceTweaker) end - it "should use progress bar formatter by default" do - options = parse([]) - options.formatters[0].class.should equal(Spec::Runner::Formatter::ProgressBarFormatter) - end - it "should use specdoc formatter when format is s" do options = parse(["--format", "s"]) options.formatters[0].class.should equal(Spec::Runner::Formatter::SpecdocFormatter) @@ -231,63 +273,116 @@ describe "OptionParser" do describe "when attempting a focussed spec" do attr_reader :file, :dir - before do - @original_rspec_options = $rspec_options - @file = "#{File.dirname(__FILE__)}/spec_parser/spec_parser_fixture.rb" + before(:each) do + @original_rspec_options = Spec::Runner.options + @file = "#{File.dirname(__FILE__)}/line_number_query/line_number_query_fixture.rb" @dir = File.dirname(file) end - after do - $rspec_options = @original_rspec_options + after(:each) do + Spec::Runner.use @original_rspec_options end def parse(args) options = super - $rspec_options = options + Spec::Runner.use options options.filename_pattern = "*_fixture.rb" options end - - it "should support --line to identify spec" do - options = parse([file, "--line", "13"]) - options.line_number.should == 13 - options.examples.should be_empty - options.run_examples - options.examples.should eql(["d"]) - end - - it "should fail with error message if file is dir along with --line" do - options = parse([dir, "--line", "169"]) - options.line_number.should == 169 - options.run_examples - @err.string.should match(/You must specify one file, not a directory when using the --line option/n) - end - - it "should fail with error message if file does not exist along with --line" do - options = parse(["some file", "--line", "169"]) - proc do + + describe 'with the --line flag' do + it "should correctly identify the spec" do + options = parse([file, "--line", "13"]) + options.line_number.should == 13 + options.examples.should be_empty options.run_examples - end.should raise_error - end - - it "should fail with error message if more than one files are specified along with --line" do - options = parse([file, file, "--line", "169"]) - options.run_examples - @err.string.should match(/Only one file can be specified when using the --line option/n) + options.examples.should eql(["d"]) + end + + it "should fail with error message if specified file is a dir" do + options = parse([dir, "--line", "169"]) + options.line_number.should == 169 + options.run_examples + @err.string.should match(/You must specify one file, not a directory when providing a line number/n) + end + + + it "should fail with error message if file does not exist" do + options = parse(["some file", "--line", "169"]) + proc do + options.run_examples + end.should raise_error + end + + it "should fail with error message if more than one files are specified" do + options = parse([file, file, "--line", "169"]) + options.run_examples + @err.string.should match(/Only one file can be specified when providing a line number/n) + end + + it "should fail with error message if using simultaneously with --example" do + options = parse([file, "--example", "some example", "--line", "169"]) + options.run_examples + @err.string.should match(/You cannot use --example and specify a line number/n) + end end - - it "should fail with error message if --example and --line are used simultaneously" do - options = parse([file, "--example", "some example", "--line", "169"]) - options.run_examples - @err.string.should match(/You cannot use both --line and --example/n) + + describe 'with the colon syntax (filename:LINE_NUMBER)' do + + it "should strip the line number from the file name" do + options = parse(["#{file}:13"]) + options.files.should include(file) + end + + it "should correctly identify the spec" do + options = parse(["#{file}:13"]) + options.line_number.should == 13 + options.examples.should be_empty + options.run_examples + options.examples.should eql(["d"]) + end + + it "should fail with error message if specified file is a dir" do + options = parse(["#{dir}:169"]) + options.line_number.should == 169 + options.run_examples + @err.string.should match(/You must specify one file, not a directory when providing a line number/n) + end + + + it "should fail with error message if file does not exist" do + options = parse(["some file:169"]) + proc do + options.run_examples + end.should raise_error + end + + it "should fail with error message if more than one files are specified" do + options = parse([file, "#{file}:169"]) + options.run_examples + @err.string.should match(/Only one file can be specified when providing a line number/n) + end + + it "should fail with error message if using simultaneously with --example" do + options = parse(["#{file}:169", "--example", "some example"]) + options.run_examples + @err.string.should match(/You cannot use --example and specify a line number/n) + end end + end if [/mswin/, /java/].detect{|p| p =~ RUBY_PLATFORM} it "should barf when --heckle is specified (and platform is windows)" do lambda do options = parse(["--heckle", "Spec"]) - end.should raise_error(StandardError, "Heckle not supported on Windows") + end.should raise_error(StandardError, /Heckle is not supported/) + end + elsif Spec::Ruby.version.to_f == 1.9 + it "should barf when --heckle is specified (and platform is Ruby 1.9)" do + lambda do + options = parse(["--heckle", "Spec"]) + end.should raise_error(StandardError, /Heckle is not supported/) end else it "should heckle when --heckle is specified (and platform is not windows)" do @@ -308,11 +403,36 @@ describe "OptionParser" do end it "should run parse drb after parsing options" do - @parser.stub!(:parse_drb) - @parser.should_receive(:parse_drb).with(["--drb"]).and_return(true) + @parser.should_receive(:parse_drb).with(no_args).and_return(true) options = parse(["--options", File.dirname(__FILE__) + "/spec_drb.opts"]) end + it "should send all the arguments other than --drb back to the parser after parsing options" do + Spec::Runner::DrbCommandLine.should_receive(:run).and_return do |options| + options.argv.should == ["example_file.rb", "--colour"] + end + options = parse(["example_file.rb", "--options", File.dirname(__FILE__) + "/spec_drb.opts"]) + end + + it "runs specs locally if no drb is running when --drb is specified" do + Spec::Runner::DrbCommandLine.should_receive(:run).and_return(false) + options = parse(["example_file.rb", "--options", File.dirname(__FILE__) + "/spec_drb.opts"]) + options.__send__(:examples_should_be_run?).should be_true + end + + it "says its running specs locally if no drb is running when --drb is specified" do + Spec::Runner::DrbCommandLine.should_receive(:run).and_return(false) + options = parse(["example_file.rb", "--options", File.dirname(__FILE__) + "/spec_drb.opts"]) + options.error_stream.rewind + options.error_stream.string.should =~ /Running specs locally/ + end + + it "does not run specs locally if drb is running when --drb is specified" do + Spec::Runner::DrbCommandLine.should_receive(:run).and_return(true) + options = parse(["example_file.rb", "--options", File.dirname(__FILE__) + "/spec_drb.opts"]) + options.__send__(:examples_should_be_run?).should be_false + end + it "should read spaced and multi-line options from file when --options is specified" do options = parse(["--options", File.dirname(__FILE__) + "/spec_spaced.opts"]) options.diff_format.should_not be_nil @@ -391,4 +511,35 @@ describe "OptionParser" do options = parse(["--runner", "Custom::ExampleGroupRunner:something"]) options.run_examples end + + it "sets options.autospec to true with --autospec" do + options = parse(["--autospec"]) + options.autospec.should be(true) + end + + describe "implicitly loading spec/spec.opts" do + extend FakeFS::SpecHelpers + use_fakefs + it "uses spec/spec.opts if present" do + File.open('spec/spec.opts', 'w') { |f| f.write "--colour" } + options = parse(['ignore.rb']) + options.colour.should be(true) + end + + it "does not try to load spec/spec.opts if not present" do + FileUtils.rm 'spec/spec.opts' + options = parse(['ignore.rb']) + options.colour.should be(false) + end + + it "uses specified opts if supplied" do + options = nil + File.open("spec/spec.opts",'w') { |f| f.write "" } + File.open("spec/alternate.opts",'w') { |f| f.write "--colour" } + options = parse(['-O','spec/alternate.opts']) + options.colour.should be(true) + end + end + + end diff --git a/vendor/plugins/rspec/spec/spec/runner/options_spec.rb b/vendor/plugins/rspec/spec/spec/runner/options_spec.rb index a64356b8c..bb1e0e8c3 100644 --- a/vendor/plugins/rspec/spec/spec/runner/options_spec.rb +++ b/vendor/plugins/rspec/spec/spec/runner/options_spec.rb @@ -1,4 +1,5 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' +require 'spec_helper' +require 'spec/runner/resources/custom_example_group_runner' module Spec module Runner @@ -7,32 +8,45 @@ module Spec @err = StringIO.new('') @out = StringIO.new('') @options = Options.new(@err, @out) + + before_suite_parts = [] + after_suite_parts = [] + @options.stub!(:before_suite_parts).and_return(before_suite_parts) + @options.stub!(:after_suite_parts).and_return(after_suite_parts) end after(:each) do Spec::Expectations.differ = nil end + + describe "#require_ruby_debug" do + it "should require ruby-debug" do + @options.stub!(:require) + @options.should_receive(:require).with("ruby-debug") + @options.require_ruby_debug + end + end describe "#examples" do it "should default to empty array" do @options.examples.should == [] end end - + describe "#include_pattern" do it "should default to '**/*_spec.rb'" do @options.filename_pattern.should == "**/*_spec.rb" end end - + describe "#files_to_load" do - + it "should load files not following pattern if named explicitly" do file = File.expand_path(File.dirname(__FILE__) + "/resources/a_bar.rb") @options.files << file @options.files_to_load.should include(file) end - + describe "with default --pattern" do it "should load files named _spec.rb" do dir = File.expand_path(File.dirname(__FILE__) + "/resources/") @@ -40,33 +54,33 @@ module Spec @options.files_to_load.should == ["#{dir}/a_spec.rb"] end end - + describe "with explicit pattern (single)" do before(:each) do @options.filename_pattern = "**/*_foo.rb" end - + it "should load files following pattern" do file = File.expand_path(File.dirname(__FILE__) + "/resources/a_foo.rb") @options.files << file @options.files_to_load.should include(file) end - + it "should load files in directories following pattern" do dir = File.expand_path(File.dirname(__FILE__) + "/resources") @options.files << dir @options.files_to_load.should include("#{dir}/a_foo.rb") end - + it "should not load files in directories not following pattern" do dir = File.expand_path(File.dirname(__FILE__) + "/resources") @options.files << dir @options.files_to_load.should_not include("#{dir}/a_bar.rb") end end - + describe "with explicit pattern (comma,separated,values)" do - + before(:each) do @options.filename_pattern = "**/*_foo.rb,**/*_bar.rb" end @@ -77,22 +91,28 @@ module Spec @options.files_to_load.should include("#{dir}/a_foo.rb") @options.files_to_load.should include("#{dir}/a_bar.rb") end - + it "should support comma separated values with spaces" do dir = File.expand_path(File.dirname(__FILE__) + "/resources") @options.files << dir @options.files_to_load.should include("#{dir}/a_foo.rb") @options.files_to_load.should include("#{dir}/a_bar.rb") end - + end - + end describe "#backtrace_tweaker" do it "should default to QuietBacktraceTweaker" do @options.backtrace_tweaker.class.should == QuietBacktraceTweaker end + + it "adds custom ignored backtrace patterns" do + Spec::Runner.configuration.stub!(:ignored_backtrace_patterns).and_return([/custom_pattern/]) + @options.run_examples + @options.backtrace_tweaker.ignored_patterns.should include(/custom_pattern/) + end end describe "#dry_run" do @@ -101,6 +121,12 @@ module Spec end end + describe "#debug" do + it "should default to false" do + @options.debug.should == false + end + end + describe "#context_lines" do it "should default to 3" do @options.context_lines.should == 3 @@ -209,10 +235,26 @@ module Spec end end + describe "debug option specified" do + it "should cause ruby_debug to be required and do nothing" do + @options.debug = true + @options.should_receive(:require_ruby_debug) + @options.run_examples.should be_true + end + end + + describe "debug option not specified" do + it "should not cause ruby_debug to be required" do + @options.debug = false + @options.should_not_receive(:require_ruby_debug) + @options.run_examples.should be_true + end + end + describe "#load_class" do it "should raise error when not class name" do lambda do - @options.send(:load_class, 'foo', 'fruit', '--food') + @options.__send__(:load_class, 'foo', 'fruit', '--food') end.should raise_error('"foo" is not a valid class name') end end @@ -224,8 +266,23 @@ module Spec end end + describe "#number_of_examples" do + context "when --example is parsed" do + it "provides the number of examples parsed instead of the total number of examples collected" do + @example_group = Class.new(::Spec::Example::ExampleGroup).describe("Some Examples") do + it "uses this example_group 1" do; end + it "uses this example_group 2" do; end + it "uses this example_group 3" do; end + end + @options.add_example_group @example_group + @options.parse_example("an example") + @options.number_of_examples.should == 1 + end + end + end + describe "#add_example_group affecting passed in example_group" do - it "runs all examples when options.examples is nil" do + it "runs all examples when options.examples is empty" do example_1_has_run = false example_2_has_run = false @example_group = Class.new(::Spec::Example::ExampleGroup).describe("Some Examples") do @@ -237,7 +294,7 @@ module Spec end end - @options.examples = nil + @options.examples.clear @options.add_example_group @example_group @options.run_examples @@ -257,8 +314,6 @@ module Spec end end - @options.examples = [] - @options.add_example_group @example_group @options.run_examples example_1_has_run.should be_true @@ -293,6 +348,40 @@ module Spec end describe "#run_examples" do + describe "with global predicate matchers" do + it "defines global predicate matcher methods on ExampleMethods" do + Spec::Runner.configuration.stub!(:predicate_matchers).and_return({:this => :that?}) + group = Class.new(::Spec::Example::ExampleGroupDouble).describe("Some Examples") + example = group.new(::Spec::Example::ExampleProxy.new) + + @options.run_examples + example.this + end + + after(:each) do + Spec::Example::ExampleMethods.class_eval "undef :this" + end + end + + describe "with a mock framework defined as a Symbol" do + it "includes Spec::Adapters::MockFramework" do + Spec::Runner.configuration.stub!(:mock_framework).and_return('spec/adapters/mock_frameworks/rspec') + + Spec::Example::ExampleMethods.should_receive(:include).with(Spec::Adapters::MockFramework) + + @options.run_examples + end + end + + describe "with a mock framework defined as a Module" do + it "includes the module in ExampleMethods" do + mod = Module.new + Spec::Runner.configuration.stub!(:mock_framework).and_return(mod) + Spec::Example::ExampleMethods.should_receive(:include).with(mod) + @options.run_examples + end + end + describe "when not given a custom runner" do it "should use the standard" do runner = ::Spec::Runner::ExampleGroupRunner.new(@options) @@ -355,14 +444,14 @@ module Spec @options.after_suite_parts << lambda do |success| success_result = success end - + @options.run_examples success_result.should be_true end end describe "and the suite fails" do - before do + before(:each) do @example_group.should_receive(:run).and_return(false) end @@ -382,12 +471,12 @@ module Spec @heckle_runner_mock = mock("HeckleRunner") @options.heckle_runner = @heckle_runner_mock end - + it "should heckle" do @heckle_runner_mock.should_receive(:heckle_with) @options.run_examples end - + it "shouldn't heckle recursively" do heckled = false @heckle_runner_mock.should_receive(:heckle_with) { @@ -445,6 +534,14 @@ module Spec end end end + + describe "#add_dir_from_project_root_to_load_path" do + it "handles nil gracefully" do + load_path = double().as_null_object + @options.stub(:project_root).and_return(nil) + @options.add_dir_from_project_root_to_load_path(nil,load_path) + end + end end end end diff --git a/vendor/plugins/rspec/spec/spec/runner/output_one_time_fixture.rb b/vendor/plugins/rspec/spec/spec/runner/output_one_time_fixture.rb index 444730dc3..8a3a9fc72 100644 --- a/vendor/plugins/rspec/spec/spec/runner/output_one_time_fixture.rb +++ b/vendor/plugins/rspec/spec/spec/runner/output_one_time_fixture.rb @@ -1,4 +1,4 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' +require 'spec_helper' describe "Running an Example" do it "should not output twice" do diff --git a/vendor/plugins/rspec/spec/spec/runner/output_one_time_fixture_runner.rb b/vendor/plugins/rspec/spec/spec/runner/output_one_time_fixture_runner.rb index a0e61316e..b6b3761e4 100644 --- a/vendor/plugins/rspec/spec/spec/runner/output_one_time_fixture_runner.rb +++ b/vendor/plugins/rspec/spec/spec/runner/output_one_time_fixture_runner.rb @@ -1,8 +1,7 @@ -dir = File.dirname(__FILE__) -require "#{dir}/../../spec_helper" +require "spec_helper" -triggering_double_output = rspec_options +triggering_double_output = Spec::Runner.options options = Spec::Runner::OptionParser.parse( - ["#{dir}/output_one_time_fixture.rb"], $stderr, $stdout + [File.dirname(__FILE__) + "/output_one_time_fixture.rb"], $stderr, $stdout ) Spec::Runner::CommandLine.run(options) diff --git a/vendor/plugins/rspec/spec/spec/runner/output_one_time_spec.rb b/vendor/plugins/rspec/spec/spec/runner/output_one_time_spec.rb index 8f67a380a..c91bb0ffb 100644 --- a/vendor/plugins/rspec/spec/spec/runner/output_one_time_spec.rb +++ b/vendor/plugins/rspec/spec/spec/runner/output_one_time_spec.rb @@ -1,15 +1,14 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' +require 'spec_helper' +require 'ruby_forker' module Spec module Runner describe CommandLine do + include RubyForker it "should not output twice" do - dir = File.dirname(__FILE__) - Dir.chdir("#{dir}/../../..") do - output =`ruby #{dir}/output_one_time_fixture_runner.rb` - output.should include("1 example, 0 failures") - output.should_not include("0 examples, 0 failures") - end + output = ruby "-Ilib bin/spec spec/spec/runner/output_one_time_fixture_runner.rb" + output.should include("1 example, 0 failures") + output.should_not include("0 examples, 0 failures") end end end diff --git a/vendor/plugins/rspec/spec/spec/runner/quiet_backtrace_tweaker_spec.rb b/vendor/plugins/rspec/spec/spec/runner/quiet_backtrace_tweaker_spec.rb index e47b6c735..30eaa7363 100644 --- a/vendor/plugins/rspec/spec/spec/runner/quiet_backtrace_tweaker_spec.rb +++ b/vendor/plugins/rspec/spec/spec/runner/quiet_backtrace_tweaker_spec.rb @@ -1,55 +1,104 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' +require 'spec_helper' module Spec module Runner - describe "QuietBacktraceTweaker" do + describe QuietBacktraceTweaker do before(:each) do @error = RuntimeError.new @tweaker = QuietBacktraceTweaker.new end - it "should not barf on nil backtrace" do + it "gracefully handles nil backtrace" do lambda do @tweaker.tweak_backtrace(@error) end.should_not raise_error end - it "should remove anything from textmate ruby bundle" do + it "gracefully handle backtraces with newlines" do + @error.set_backtrace(["we like\nbin/spec:\nnewlines"]) + @tweaker.tweak_backtrace(@error) + @error.backtrace.should include("we like\nnewlines") + end + + it "cleans up double slashes" do + @error.set_backtrace(["/a//b/c//d.rb"]) + @tweaker.tweak_backtrace(@error) + @error.backtrace.should include("/a/b/c/d.rb") + end + + it "preserves lines from textmate ruby bundle" do @error.set_backtrace(["/Applications/TextMate.app/Contents/SharedSupport/Bundles/Ruby.tmbundle/Support/tmruby.rb:147"]) @tweaker.tweak_backtrace(@error) @error.backtrace.should be_empty end - it "should remove anything in lib spec dir" do + it "removes lines in lib/spec" do ["expectations", "mocks", "runner"].each do |child| element="/lib/spec/#{child}/anything.rb" @error.set_backtrace([element]) @tweaker.tweak_backtrace(@error) - unless (@error.backtrace.empty?) - raise("Should have tweaked away '#{element}'") - end + @error.backtrace.should be_empty, "Should have removed line with '#{element}'" end end - it "should remove mock_frameworks/rspec" do + it "removes lines in bin/spec" do + @error.set_backtrace(["bin/spec:"]) + @tweaker.tweak_backtrace(@error) + @error.backtrace.should be_empty + end + + it "removes lines in mock_frameworks/rspec" do element = "mock_frameworks/rspec" @error.set_backtrace([element]) @tweaker.tweak_backtrace(@error) - unless (@error.backtrace.empty?) - raise("Should have tweaked away '#{element}'") - end + @error.backtrace.should be_empty, "Should have removed line with '#{element}'" end - it "should remove bin spec" do - @error.set_backtrace(["bin/spec:"]) + it "removes custom patterns" do + element = "/vendor/lib/custom_pattern/" + @tweaker.ignore_patterns /custom_pattern/ + @error.set_backtrace([element]) @tweaker.tweak_backtrace(@error) - @error.backtrace.should be_empty + @error.backtrace.should be_empty, "Should have removed line with '#{element}'" end - - it "should clean up double slashes" do - @error.set_backtrace(["/a//b/c//d.rb"]) + + it "removes custom patterns added as a string" do + element = "/vendor/lib/custom_pattern/" + @tweaker.ignore_patterns "custom_pattern" + @error.set_backtrace([element]) @tweaker.tweak_backtrace(@error) - @error.backtrace.should include("/a/b/c/d.rb") + @error.backtrace.should be_empty, "Should have removed line with '#{element}'" + end + + it "removes lines in mock_frameworks/rspec" do + element = "mock_frameworks/rspec" + @error.set_backtrace([element]) + @tweaker.tweak_backtrace(@error) + @error.backtrace.should be_empty, "Should have removed line with '#{element}'" + end + + it "removes lines in rspec gem" do + ["/rspec-1.2.3/lib/spec.rb","/rspec-1.2.3/lib/spec/anything.rb","bin/spec:123"].each do |element| + @error.set_backtrace([element]) + @tweaker.tweak_backtrace(@error) + @error.backtrace.should be_empty, "Should have removed line with '#{element}'" + end + end + + it "removes lines in pre-release rspec gems" do + ["/rspec-1.2.3.a1.gem/lib/spec.rb","/rspec-1.2.3.b1.gem/lib/spec.rb","/rspec-1.2.3.rc1.gem/lib/spec.rb"].each do |element| + @error.set_backtrace([element]) + @tweaker.tweak_backtrace(@error) + @error.backtrace.should be_empty, "Should have removed line with '#{element}'" + end + end + + it "removes lines in spork gem" do + ["/spork-1.2.3/lib/spec.rb","/spork-1.2.3/lib/spec/anything.rb","bin/spork:123"].each do |element| + @error.set_backtrace([element]) + @tweaker.tweak_backtrace(@error) + @error.backtrace.should be_empty, "Should have removed line with '#{element}'" + end end end end diff --git a/vendor/plugins/rspec/spec/spec/runner/reporter_spec.rb b/vendor/plugins/rspec/spec/spec/runner/reporter_spec.rb index b02a4cf6f..556387dc7 100644 --- a/vendor/plugins/rspec/spec/spec/runner/reporter_spec.rb +++ b/vendor/plugins/rspec/spec/spec/runner/reporter_spec.rb @@ -1,9 +1,9 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' +require 'spec_helper' module Spec module Runner describe Reporter do - attr_reader :formatter_output, :options, :backtrace_tweaker, :formatter, :reporter, :example_group + attr_reader :formatter_output, :options, :backtrace_tweaker, :formatter, :reporter, :example_group, :example_group_proxy, :example_proxy before(:each) do @formatter_output = StringIO.new @options = Options.new(StringIO.new, StringIO.new) @@ -13,15 +13,17 @@ module Spec options.formatters << formatter @reporter = Reporter.new(options) @example_group = create_example_group("example_group") - reporter.add_example_group example_group + @example_group_proxy = Spec::Example::ExampleGroupProxy.new(@example_group) + @example_proxy = Spec::Example::ExampleProxy.new + example_group.notify(reporter) end def failure - Mocks::DuckTypeArgConstraint.new(:header, :exception) + Mocks::ArgumentMatchers::DuckTypeMatcher.new(:header, :exception) end - def create_example_group(description_text) - example_group = Spec::Example::ExampleGroup.describe(description_text) do + def create_example_group(text) + example_group = Spec::Example::ExampleGroup.describe(text) do it "should do something" do end end @@ -31,55 +33,59 @@ module Spec it "should assign itself as the reporter to options" do options.reporter.should equal(@reporter) end - + it "should tell formatter when example_group is added" do - formatter.should_receive(:add_example_group).with(example_group) - reporter.add_example_group(example_group) + formatter.should_receive(:example_group_started).with(example_group_proxy) + example_group.notify(reporter) end - + it "should handle multiple example_groups with same name" do - formatter.should_receive(:add_example_group).exactly(3).times + formatter.should_receive(:example_group_started).exactly(3).times formatter.should_receive(:example_started).exactly(3).times formatter.should_receive(:example_passed).exactly(3).times formatter.should_receive(:start_dump) formatter.should_receive(:dump_pending) formatter.should_receive(:close).with(no_args) formatter.should_receive(:dump_summary).with(anything(), 3, 0, 0) - reporter.add_example_group(create_example_group("example_group")) - reporter.example_started("spec 1") - reporter.example_finished("spec 1") - reporter.add_example_group(create_example_group("example_group")) - reporter.example_started("spec 2") - reporter.example_finished("spec 2") - reporter.add_example_group(create_example_group("example_group")) - reporter.example_started("spec 3") - reporter.example_finished("spec 3") + create_example_group("example_group").notify(reporter) + reporter.example_started(description_of("spec 1")) + reporter.example_finished(description_of("spec 1")) + create_example_group("example_group").notify(reporter) + reporter.example_started(description_of("spec 2")) + reporter.example_finished(description_of("spec 2")) + create_example_group("example_group").notify(reporter) + reporter.example_started(description_of("spec 3")) + reporter.example_finished(description_of("spec 3")) reporter.dump end + + def description_of(example) + ::Spec::Example::ExampleProxy.new(String === example ? example : example.description) + end it "should handle multiple examples with the same name" do error=RuntimeError.new - passing = ExampleGroup.new("example") - failing = ExampleGroup.new("example") - - formatter.should_receive(:add_example_group).exactly(2).times - formatter.should_receive(:example_passed).with(passing).exactly(2).times - formatter.should_receive(:example_failed).with(failing, 1, failure) - formatter.should_receive(:example_failed).with(failing, 2, failure) - formatter.should_receive(:dump_failure).exactly(2).times + passing = ::Spec::Example::ExampleGroupDouble.new(example_proxy) + failing = ::Spec::Example::ExampleGroupDouble.new(example_proxy) + + formatter.should_receive(:example_group_started).exactly(2).times + formatter.should_receive(:example_passed).with(description_of(passing)).exactly(2).times + formatter.should_receive(:example_failed).with(description_of(failing), 1, failure) + formatter.should_receive(:example_failed).with(description_of(failing), 2, failure) + formatter.should_receive(:dump_failure).exactly(2).times formatter.should_receive(:start_dump) formatter.should_receive(:dump_pending) formatter.should_receive(:close).with(no_args) formatter.should_receive(:dump_summary).with(anything(), 4, 2, 0) backtrace_tweaker.should_receive(:tweak_backtrace).twice - reporter.add_example_group(create_example_group("example_group")) - reporter.example_finished(passing) - reporter.example_finished(failing, error) + create_example_group("example_group").notify(reporter) + reporter.example_finished(description_of(passing)) + reporter.example_finished(description_of(failing), error) - reporter.add_example_group(create_example_group("example_group")) - reporter.example_finished(passing) - reporter.example_finished(failing, error) + create_example_group("example_group").notify(reporter) + reporter.example_finished(description_of(passing)) + reporter.example_finished(description_of(failing), error) reporter.dump end @@ -90,7 +96,7 @@ module Spec formatter.should_receive(:close).with(no_args) reporter.dump end - + it "should push time to formatter" do formatter.should_receive(:start).with(5) formatter.should_receive(:start_dump) @@ -103,88 +109,134 @@ module Spec reporter.end reporter.dump end - - describe Reporter, "reporting one passing example" do + + describe "reporting one passing example" do it "should tell formatter example passed" do formatter.should_receive(:example_passed) - reporter.example_finished("example") + reporter.example_finished(description_of("example")) end - + it "should not delegate to backtrace tweaker" do formatter.should_receive(:example_passed) backtrace_tweaker.should_not_receive(:tweak_backtrace) - reporter.example_finished("example") + reporter.example_finished(description_of("example")) end - + it "should account for passing example in stats" do formatter.should_receive(:example_passed) formatter.should_receive(:start_dump) formatter.should_receive(:dump_pending) formatter.should_receive(:dump_summary).with(anything(), 1, 0, 0) formatter.should_receive(:close).with(no_args) - reporter.example_finished("example") + reporter.example_finished(description_of("example")) reporter.dump end end - - describe Reporter, "reporting one failing example" do + + describe "reporting one failing example" do it "should tell formatter that example failed" do example = example_group.it("should do something") {} formatter.should_receive(:example_failed) - reporter.example_finished(example, RuntimeError.new) + reporter.example_finished(description_of(example), RuntimeError.new) end - + it "should delegate to backtrace tweaker" do formatter.should_receive(:example_failed) backtrace_tweaker.should_receive(:tweak_backtrace) - reporter.example_finished(ExampleGroup.new("example"), RuntimeError.new) + reporter.example_finished(example_proxy, RuntimeError.new) end - + it "should account for failing example in stats" do - example = ExampleGroup.new("example") - formatter.should_receive(:example_failed).with(example, 1, failure) + example = ::Spec::Example::ExampleGroupDouble.new(example_proxy) + formatter.should_receive(:example_failed).with(description_of(example), 1, failure) formatter.should_receive(:start_dump) formatter.should_receive(:dump_pending) formatter.should_receive(:dump_failure).with(1, anything()) formatter.should_receive(:dump_summary).with(anything(), 1, 1, 0) formatter.should_receive(:close).with(no_args) - reporter.example_finished(example, RuntimeError.new) + reporter.example_finished(description_of(example), RuntimeError.new) reporter.dump end - + end - - describe Reporter, "reporting one pending example (ExamplePendingError)" do + + describe "reporting one pending example (ExamplePendingError)" do + before :each do + @pending_error = Spec::Example::ExamplePendingError.new("reason") + end + it "should tell formatter example is pending" do - example = ExampleGroup.new("example") - formatter.should_receive(:example_pending).with(example, "reason") - formatter.should_receive(:add_example_group).with(example_group) - reporter.add_example_group(example_group) - reporter.example_finished(example, Spec::Example::ExamplePendingError.new("reason")) + example = ExampleGroup.new(example_proxy) + formatter.should_receive(:example_pending).with(description_of(example), "reason") + formatter.should_receive(:example_group_started).with(example_group_proxy) + example_group.notify(reporter) + reporter.example_finished(description_of(example), @pending_error) end - + it "should account for pending example in stats" do - example = ExampleGroup.new("example") - formatter.should_receive(:example_pending).with(example, "reason") + example = ExampleGroup.new(example_proxy) + formatter.should_receive(:example_pending).with(description_of(example), "reason") formatter.should_receive(:start_dump) formatter.should_receive(:dump_pending) formatter.should_receive(:dump_summary).with(anything(), 1, 0, 1) formatter.should_receive(:close).with(no_args) - formatter.should_receive(:add_example_group).with(example_group) - reporter.add_example_group(example_group) - reporter.example_finished(example, Spec::Example::ExamplePendingError.new("reason")) + formatter.should_receive(:example_group_started).with(example_group_proxy) + example_group.notify(reporter) + reporter.example_finished(description_of(example), @pending_error) reporter.dump end + + describe "to formatters which have example_pending's arity of 3 (which is now deprecated)" do + before :each do + Spec.stub!(:warn) + + @deprecated_formatter = Class.new(@formatter.class) do + attr_reader :example_passed_to_method, :message_passed_to_method + + def example_pending(example_passed_to_method, message_passed_to_method, deprecated_pending_location) + @example_passed_to_method = example_passed_to_method + @message_passed_to_method = message_passed_to_method + end + end.new(options, formatter_output) + + options.formatters << @deprecated_formatter + end + + it "should pass the correct example description to the formatter" do + proxy = Spec::Example::ExampleProxy.new("name") + example = ExampleGroup.new(proxy) + example_group.notify(reporter) + reporter.example_finished(description_of(example), @pending_error) + + @deprecated_formatter.example_passed_to_method.should == proxy + end + + it "should pass the correct pending error message to the formatter" do + example = ExampleGroup.new(example_proxy) + example_group.notify(reporter) + reporter.example_finished(description_of(example), @pending_error) + + @deprecated_formatter.message_passed_to_method.should == @pending_error.message + end + + it "should raise a deprecation warning" do + Spec.should_receive(:warn) + + example = ExampleGroup.new(example_proxy) + example_group.notify(reporter) + reporter.example_finished(description_of(example), @pending_error) + end + end end - - describe Reporter, "reporting one pending example (PendingExampleFixedError)" do + + describe "reporting one pending example (PendingExampleFixedError)" do it "should tell formatter pending example is fixed" do formatter.should_receive(:example_failed) do |name, counter, failure| failure.header.should == "'example_group should do something' FIXED" end - formatter.should_receive(:add_example_group).with(example_group) - reporter.add_example_group(example_group) - reporter.example_finished(example_group.examples.first, Spec::Example::PendingExampleFixedError.new("reason")) + formatter.should_receive(:example_group_started).with(example_group_proxy) + example_group.notify(reporter) + reporter.example_finished(description_of(example_group.examples.first), Spec::Example::PendingExampleFixedError.new("reason")) end end end diff --git a/vendor/plugins/rspec/spec/spec/runner/spec_drb.opts b/vendor/plugins/rspec/spec/spec/runner/spec_drb.opts index 091e4c222..61f260b71 100644 --- a/vendor/plugins/rspec/spec/spec/runner/spec_drb.opts +++ b/vendor/plugins/rspec/spec/spec/runner/spec_drb.opts @@ -1 +1,2 @@ +--colour --drb diff --git a/vendor/plugins/rspec/spec/spec/runner/spec_parser/spec_parser_fixture.rb b/vendor/plugins/rspec/spec/spec/runner/spec_parser/spec_parser_fixture.rb deleted file mode 100644 index 14602d934..000000000 --- a/vendor/plugins/rspec/spec/spec/runner/spec_parser/spec_parser_fixture.rb +++ /dev/null @@ -1,70 +0,0 @@ -require File.dirname(__FILE__) + '/../../../spec_helper.rb' - -describe "c" do - - it "1" do - end - - it "2" do - end - -end - -describe "d" do - - it "3" do - end - - it "4" do - end - -end - -class SpecParserSubject -end - -describe SpecParserSubject do - - it "5" do - end - -end - -describe SpecParserSubject, "described" do - - it "6" do - end - -end - -describe SpecParserSubject, "described", :something => :something_else do - - it "7" do - end - -end - -describe "described", :something => :something_else do - - it "8" do - end - -end - -describe "e" do - - it "9" do - end - - it "10" do - end - - describe "f" do - it "11" do - end - - it "12" do - end - end - -end diff --git a/vendor/plugins/rspec/spec/spec/runner/spec_parser_spec.rb b/vendor/plugins/rspec/spec/spec/runner/spec_parser_spec.rb deleted file mode 100644 index 7204ba3e6..000000000 --- a/vendor/plugins/rspec/spec/spec/runner/spec_parser_spec.rb +++ /dev/null @@ -1,85 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper.rb' - -describe "SpecParser" do - attr_reader :parser, :file - before(:each) do - @original_rspec_options = $rspec_options - $rspec_options = ::Spec::Runner::Options.new(StringIO.new, StringIO.new) - @parser = Spec::Runner::SpecParser.new - @file = "#{File.dirname(__FILE__)}/spec_parser/spec_parser_fixture.rb" - load file - end - - after do - $rspec_options = @original_rspec_options - end - - it "should find spec name for 'specify' at same line" do - parser.spec_name_for(file, 5).should == "c 1" - end - - it "should find spec name for 'specify' at end of spec line" do - parser.spec_name_for(file, 6).should == "c 1" - end - - it "should find context for 'context' above all specs" do - parser.spec_name_for(file, 4).should == "c" - end - - it "should find spec name for 'it' at same line" do - parser.spec_name_for(file, 15).should == "d 3" - end - - it "should find spec name for 'it' at end of spec line" do - parser.spec_name_for(file, 16).should == "d 3" - end - - it "should find context for 'describe' above all specs" do - parser.spec_name_for(file, 14).should == "d" - end - - it "should find nearest example name between examples" do - parser.spec_name_for(file, 7).should == "c 1" - end - - it "should find nothing outside a context" do - parser.spec_name_for(file, 2).should be_nil - end - - it "should find context name for type" do - parser.spec_name_for(file, 26).should == "SpecParserSubject" - end - - it "should find context and spec name for type" do - parser.spec_name_for(file, 28).should == "SpecParserSubject 5" - end - - it "should find context and description for type" do - parser.spec_name_for(file, 33).should == "SpecParserSubject described" - end - - it "should find context and description and example for type" do - parser.spec_name_for(file, 36).should == "SpecParserSubject described 6" - end - - it "should find context and description for type with modifications" do - parser.spec_name_for(file, 40).should == "SpecParserSubject described" - end - - it "should find context and described and example for type with modifications" do - parser.spec_name_for(file, 43).should == "SpecParserSubject described 7" - end - - it "should find example group" do - parser.spec_name_for(file, 47).should == "described" - end - - it "should find example" do - parser.spec_name_for(file, 50).should == "described 8" - end - - it "should find nested example" do - parser.spec_name_for(file, 63).should == "e f 11" - end - -end diff --git a/vendor/plugins/rspec/spec/spec/runner_spec.rb b/vendor/plugins/rspec/spec/spec/runner_spec.rb index d75e66111..3b55be7a7 100644 --- a/vendor/plugins/rspec/spec/spec/runner_spec.rb +++ b/vendor/plugins/rspec/spec/spec/runner_spec.rb @@ -1,11 +1,13 @@ -require File.dirname(__FILE__) + '/../spec_helper.rb' +require 'spec_helper' module Spec - describe Runner, ".configure" do - it "should yield global configuration" do - Spec::Runner.configure do |config| - config.should equal(Spec::Runner.configuration) + describe Runner do + describe ".configure" do + it "should yield global configuration" do + Spec::Runner.configure do |config| + config.should equal(Spec::Runner.configuration) + end end end end -end
\ No newline at end of file +end diff --git a/vendor/plugins/rspec/spec/spec/spec_classes.rb b/vendor/plugins/rspec/spec/spec/spec_classes.rb deleted file mode 100644 index c8900a789..000000000 --- a/vendor/plugins/rspec/spec/spec/spec_classes.rb +++ /dev/null @@ -1,133 +0,0 @@ -# This file contains various classes used by the specs. -module Spec - module Expectations - class Person - attr_reader :name - def initialize name - @name = name - end - def == other - return @name == other.name - end - end - - class ClassWithMultiWordPredicate - def multi_word_predicate? - true - end - end - - module Helper - class CollectionWithSizeMethod - def initialize; @list = []; end - def size; @list.size; end - def push(item); @list.push(item); end - end - - class CollectionWithLengthMethod - def initialize; @list = []; end - def length; @list.size; end - def push(item); @list.push(item); end - end - - class CollectionOwner - attr_reader :items_in_collection_with_size_method, :items_in_collection_with_length_method - - def initialize - @items_in_collection_with_size_method = CollectionWithSizeMethod.new - @items_in_collection_with_length_method = CollectionWithLengthMethod.new - end - - def add_to_collection_with_size_method(item) - @items_in_collection_with_size_method.push(item) - end - - def add_to_collection_with_length_method(item) - @items_in_collection_with_length_method.push(item) - end - - def items_for(arg) - return [1, 2, 3] if arg == 'a' - [1] - end - - def items - @items_in_collection_with_size_method - end - end - - class HandCodedMock - include Spec::Matchers - def initialize(return_val) - @return_val = return_val - @funny_called = false - end - - def funny? - @funny_called = true - @return_val - end - - def hungry?(a, b, c) - a.should equal(1) - b.should equal(2) - c.should equal(3) - @funny_called = true - @return_val - end - - def exists? - @return_val - end - - def multi_word_predicate? - @return_val - end - - def rspec_verify - @funny_called.should be_true - end - end - class ClassWithUnqueriedPredicate - attr_accessor :foo - def initialize(foo) - @foo = foo - end - end - end - end -end - -module Custom - require 'spec/runner/formatter/base_text_formatter' - class Formatter < Spec::Runner::Formatter::BaseTextFormatter - attr_reader :options, :where - - def initialize(options, where) - @options = options - @where = where - end - end - - class BadFormatter < Spec::Runner::Formatter::BaseTextFormatter - attr_reader :where - - def initialize(options, where) - bad_method - end - end - - class Differ - attr_reader :options - def initialize(options) - @options = options - end - - def diff_as_object(target, expected) - "" - end - end -end - -class FakeReporter < Spec::Runner::Reporter -end diff --git a/vendor/plugins/rspec/spec/spec/story/builders.rb b/vendor/plugins/rspec/spec/spec/story/builders.rb deleted file mode 100644 index 77d50d53e..000000000 --- a/vendor/plugins/rspec/spec/spec/story/builders.rb +++ /dev/null @@ -1,46 +0,0 @@ -module Spec - module Story - class StoryBuilder - def initialize - @title = 'a story' - @narrative = 'narrative' - end - - def title(value) - @title = value - self - end - - def narrative(value) - @narrative = value - self - end - - def to_story(&block) - block = lambda {} unless block_given? - Story.new @title, @narrative, &block - end - end - - class ScenarioBuilder - def initialize - @name = 'a scenario' - @story = StoryBuilder.new.to_story - end - - def name(value) - @name = value - self - end - - def story(value) - @story = value - self - end - - def to_scenario(&block) - Scenario.new @story, @name, &block - end - end - end -end diff --git a/vendor/plugins/rspec/spec/spec/story/extensions/main_spec.rb b/vendor/plugins/rspec/spec/spec/story/extensions/main_spec.rb deleted file mode 100644 index acdc341ce..000000000 --- a/vendor/plugins/rspec/spec/spec/story/extensions/main_spec.rb +++ /dev/null @@ -1,161 +0,0 @@ -require File.dirname(__FILE__) + '/../../../spec_helper' - -module Spec - module Story - module Extensions - describe "the main object extended with Main", :shared => true do - before(:each) do - @main = Class.new do; include Main; end - @original_rspec_story_steps, $rspec_story_steps = $rspec_story_steps, nil - end - - after(:each) do - $rspec_story_steps = @original_rspec_story_steps - end - - def have_step(type, name) - return simple_matcher(%[step group containing a #{type} named #{name.inspect}]) do |actual| - Spec::Story::Step === actual.find(type, name) - end - end - end - - describe Main, "#run_story" do - it_should_behave_like "the main object extended with Main" - - it "should create a PlainTextStoryRunner with run_story" do - Spec::Story::Runner::PlainTextStoryRunner.should_receive(:new).and_return(mock("runner", :null_object => true)) - @main.run_story - end - - it "should yield the runner if arity == 1" do - File.should_receive(:read).with("some/path").and_return("Story: foo") - $main_spec_runner = nil - @main.run_story("some/path") do |runner| - $main_spec_runner = runner - end - $main_spec_runner.should be_an_instance_of(Spec::Story::Runner::PlainTextStoryRunner) - end - - it "should run in the runner if arity == 0" do - File.should_receive(:read).with("some/path").and_return("Story: foo") - $main_spec_runner = nil - @main.run_story("some/path") do - $main_spec_runner = self - end - $main_spec_runner.should be_an_instance_of(Spec::Story::Runner::PlainTextStoryRunner) - end - - it "should tell the PlainTextStoryRunner to run with run_story" do - runner = mock("runner") - Spec::Story::Runner::PlainTextStoryRunner.should_receive(:new).and_return(runner) - runner.should_receive(:run) - @main.run_story - end - end - - describe Main, "#steps_for" do - it_should_behave_like "the main object extended with Main" - - it "should have no steps for a non existent key" do - @main.steps_for(:key).find(:given, "foo").should be_nil - end - - it "should create steps for a key" do - $main_spec_invoked = false - @main.steps_for(:key) do - Given("foo") { - $main_spec_invoked = true - } - end - @main.steps_for(:key).find(:given, "foo").perform(Object.new, "foo") - $main_spec_invoked.should be_true - end - - it "should append steps to steps_for a given key" do - @main.steps_for(:key) do - Given("first") {} - end - @main.steps_for(:key) do - Given("second") {} - end - @main.steps_for(:key).should have_step(:given, "first") - @main.steps_for(:key).should have_step(:given, "second") - end - end - - describe Main, "#with_steps_for adding new steps" do - it_should_behave_like "the main object extended with Main" - - it "should result in a group containing pre-existing steps and newly defined steps" do - first_group = @main.steps_for(:key) do - Given("first") {} - end - second_group = @main.with_steps_for(:key) do - Given("second") {} - end - - second_group.should have_step(:given, "first") - second_group.should have_step(:given, "second") - end - - it "should not add its steps to the existing group" do - first_group = @main.steps_for(:key) do - Given("first") {} - end - second_group = @main.with_steps_for(:key) do - Given("second") {} - end - - first_group.should have_step(:given, "first") - first_group.should_not have_step(:given, "second") - end - end - - describe Main, "#with_steps_for running a story" do - it_should_behave_like "the main object extended with Main" - - before(:each) do - @runner = mock("runner") - @runner_step_group = StepGroup.new - @runner.stub!(:steps).and_return(@runner_step_group) - @runner.stub!(:run) - Spec::Story::Runner::PlainTextStoryRunner.stub!(:new).and_return(@runner) - end - - it "should create a PlainTextStoryRunner with a path" do - Spec::Story::Runner::PlainTextStoryRunner.should_receive(:new).with('path/to/file',{}).and_return(@runner) - @main.with_steps_for(:foo) do - run 'path/to/file' - end - end - - it "should create a PlainTextStoryRunner with a path and options" do - Spec::Story::Runner::PlainTextStoryRunner.should_receive(:new).with(anything,{:bar => :baz}).and_return(@runner) - @main.with_steps_for(:foo) do - run 'path/to/file', :bar => :baz - end - end - - it "should pass the group it creates to the runner's steps" do - steps = @main.steps_for(:ice_cream) do - Given("vanilla") {} - end - @main.with_steps_for(:ice_cream) do - run 'foo' - end - @runner_step_group.should have_step(:given, "vanilla") - end - - it "should run a story" do - @runner.should_receive(:run) - Spec::Story::Runner::PlainTextStoryRunner.should_receive(:new).and_return(@runner) - @main.with_steps_for(:foo) do - run 'path/to/file' - end - end - - end - end - end -end
\ No newline at end of file diff --git a/vendor/plugins/rspec/spec/spec/story/extensions_spec.rb b/vendor/plugins/rspec/spec/spec/story/extensions_spec.rb deleted file mode 100644 index 612ddc72f..000000000 --- a/vendor/plugins/rspec/spec/spec/story/extensions_spec.rb +++ /dev/null @@ -1,14 +0,0 @@ -require File.dirname(__FILE__) + '/story_helper' - -require 'spec/story' - -describe Kernel, "#Story" do - before(:each) do - Kernel.stub!(:at_exit) - end - - it "should delegate to ::Spec::Story::Runner.story_runner" do - ::Spec::Story::Runner.story_runner.should_receive(:Story) - story = Story("title","narrative"){} - end -end diff --git a/vendor/plugins/rspec/spec/spec/story/given_scenario_spec.rb b/vendor/plugins/rspec/spec/spec/story/given_scenario_spec.rb deleted file mode 100644 index a688f88d5..000000000 --- a/vendor/plugins/rspec/spec/spec/story/given_scenario_spec.rb +++ /dev/null @@ -1,27 +0,0 @@ -require File.dirname(__FILE__) + '/story_helper' - -module Spec - module Story - describe GivenScenario do - it 'should execute a scenario from the current story in its world' do - # given - class MyWorld - attr :scenario_ran - end - instance = World.create(MyWorld) - scenario = ScenarioBuilder.new.to_scenario do - @scenario_ran = true - end - Runner::StoryRunner.should_receive(:scenario_from_current_story).with('scenario name').and_return(scenario) - - step = GivenScenario.new 'scenario name' - - # when - step.perform(instance, nil) - - # then - instance.scenario_ran.should be_true - end - end - end -end diff --git a/vendor/plugins/rspec/spec/spec/story/runner/plain_text_story_runner_spec.rb b/vendor/plugins/rspec/spec/spec/story/runner/plain_text_story_runner_spec.rb deleted file mode 100644 index 91f5f9e9b..000000000 --- a/vendor/plugins/rspec/spec/spec/story/runner/plain_text_story_runner_spec.rb +++ /dev/null @@ -1,93 +0,0 @@ -require File.dirname(__FILE__) + '/../story_helper' - -module Spec - module Story - module Runner - describe PlainTextStoryRunner do - before(:each) do - StoryParser.stub!(:new).and_return(@parser = mock("parser")) - @parser.stub!(:parse).and_return([]) - File.stub!(:read).with("path").and_return("this\nand that") - end - - it "should provide access to steps" do - runner = PlainTextStoryRunner.new("path") - - runner.steps do |add| - add.given("baz") {} - end - - runner.steps.find(:given, "baz").should_not be_nil - end - - it "should parse a story file" do - runner = PlainTextStoryRunner.new("path") - during { - runner.run(mock('runner')) - }.expect { - @parser.should_receive(:parse).with(["this", "and that"]) - } - end - - it "should build up a mediator with its own steps and the singleton story_runner" do - @story_runner = mock('story runner', :null_object => true) - - runner = PlainTextStoryRunner.new("path") - - Spec::Story::Runner::StoryMediator.should_receive(:new).with( - runner.steps, @story_runner, {} - ).and_return(mediator = stub("mediator", :run_stories => nil)) - runner.run(@story_runner) - end - - it "should build up a parser with the mediator" do - runner = PlainTextStoryRunner.new("path") - Spec::Story::Runner::StoryMediator.should_receive(:new).and_return(mediator = stub("mediator", :run_stories => nil)) - Spec::Story::Runner::StoryParser.should_receive(:new).with(mediator).and_return(@parser) - runner.run(stub("story_runner")) - end - - it "should tell the mediator to run the stories" do - runner = PlainTextStoryRunner.new("path") - mediator = mock("mediator") - Spec::Story::Runner::StoryMediator.should_receive(:new).and_return(mediator) - mediator.should_receive(:run_stories) - runner.run(mock('runner')) - end - - it "should accept a block instead of a path" do - runner = PlainTextStoryRunner.new do |runner| - runner.load("path/to/story") - end - File.should_receive(:read).with("path/to/story").and_return("this\nand that") - runner.run(mock('runner')) - end - - it "should tell you if you try to run with no path set" do - runner = PlainTextStoryRunner.new - lambda { - runner.run(mock('runner')) - }.should raise_error(RuntimeError, "You must set a path to the file with the story. See the RDoc.") - end - - it "should pass options to the mediator" do - runner = PlainTextStoryRunner.new("path", :foo => :bar) - Spec::Story::Runner::StoryMediator.should_receive(:new). - with(anything, anything, :foo => :bar). - and_return(mediator = stub("mediator", :run_stories => nil)) - runner.run(mock('runner')) - end - - it "should provide access to its options" do - runner = PlainTextStoryRunner.new("path") - runner[:foo] = :bar - Spec::Story::Runner::StoryMediator.should_receive(:new). - with(anything, anything, :foo => :bar). - and_return(mediator = stub("mediator", :run_stories => nil)) - runner.run mock('runner') - end - - end - end - end -end
\ No newline at end of file diff --git a/vendor/plugins/rspec/spec/spec/story/runner/scenario_collector_spec.rb b/vendor/plugins/rspec/spec/spec/story/runner/scenario_collector_spec.rb deleted file mode 100644 index 042c41e8d..000000000 --- a/vendor/plugins/rspec/spec/spec/story/runner/scenario_collector_spec.rb +++ /dev/null @@ -1,27 +0,0 @@ -require File.dirname(__FILE__) + '/../story_helper' - -module Spec - module Story - module Runner - describe ScenarioCollector do - it 'should construct scenarios with the supplied story' do - # given - story = stub_everything('story') - scenario_collector = ScenarioCollector.new(story) - - # when - scenario_collector.Scenario 'scenario1' do end - scenario_collector.Scenario 'scenario2' do end - scenarios = scenario_collector.scenarios - - # then - scenario_collector.should have(2).scenarios - scenarios.first.name.should == 'scenario1' - scenarios.first.story.should equal(story) - scenarios.last.name.should == 'scenario2' - scenarios.last.story.should equal(story) - end - end - end - end -end diff --git a/vendor/plugins/rspec/spec/spec/story/runner/scenario_runner_spec.rb b/vendor/plugins/rspec/spec/spec/story/runner/scenario_runner_spec.rb deleted file mode 100644 index c13c3d7f8..000000000 --- a/vendor/plugins/rspec/spec/spec/story/runner/scenario_runner_spec.rb +++ /dev/null @@ -1,214 +0,0 @@ -require File.dirname(__FILE__) + '/../story_helper' - -module Spec - module Story - module Runner - describe ScenarioRunner do - it 'should run a scenario in its story' do - # given - world = stub_everything - scenario_runner = ScenarioRunner.new - $answer = nil - story = Story.new 'story', 'narrative' do - @answer = 42 # this should be available to the scenario - end - scenario = Scenario.new story, 'scenario' do - $answer = @answer - end - - # when - scenario_runner.run(scenario, world) - - # then - $answer.should == 42 - end - - it 'should allow scenarios to share methods' do - # given - world = stub_everything - $shared_invoked = 0 - story = Story.new 'story', 'narrative' do - def shared - $shared_invoked += 1 - end - end - scenario1 = Scenario.new story, 'scenario1' do - shared() - end - scenario2 = Scenario.new story, 'scenario2' do - shared() - end - scenario_runner = ScenarioRunner.new - - # when - scenario_runner.run(scenario1, world) - scenario_runner.run(scenario2, world) - - # then - $shared_invoked.should == 2 - end - - it 'should notify listeners when a scenario starts' do - # given - world = stub_everything - story = Story.new 'story', 'narrative' do end - scenario = Scenario.new story, 'scenario1' do - # succeeds - end - scenario_runner = ScenarioRunner.new - mock_listener1 = stub_everything('listener1') - mock_listener2 = stub_everything('listener2') - scenario_runner.add_listener(mock_listener1) - scenario_runner.add_listener(mock_listener2) - - # expect - mock_listener1.should_receive(:scenario_started).with('story', 'scenario1') - mock_listener2.should_receive(:scenario_started).with('story', 'scenario1') - - # when - scenario_runner.run(scenario, world) - - # then - end - describe "when a scenario succeeds" do - before(:each) do - # given - @world = stub_everything('world') - @story = Story.new 'story', 'narrative' do end - @scenario = Scenario.new @story, 'scenario1' do - # succeeds - end - @scenario_runner = ScenarioRunner.new - end - - it 'should notify listeners' do - #given - mock_listener1 = stub_everything('listener1') - mock_listener2 = stub_everything('listener2') - @scenario_runner.add_listener(mock_listener1) - @scenario_runner.add_listener(mock_listener2) - - # expect - mock_listener1.should_receive(:scenario_succeeded).with('story', 'scenario1') - mock_listener2.should_receive(:scenario_succeeded).with('story', 'scenario1') - - # when - @scenario_runner.run(@scenario, @world) - - # then - end - - it "should return true" do - #when - success = @scenario_runner.run(@scenario, @world) - - #then - success.should == true - end - end - - describe "when a scenario raises an error (other than a pending error)" do - before(:each) do - # given - @error = RuntimeError.new('oops') - @story = Story.new 'title', 'narrative' do end - @scenario = Scenario.new @story, 'scenario1' do - end - @scenario_runner = ScenarioRunner.new - @world = stub_everything - - # expect - @world.should_receive(:errors).twice.and_return([@error, @error]) - end - - it 'should notify listeners ONCE' do - #given - mock_listener = stub_everything('listener') - @scenario_runner.add_listener(mock_listener) - - #expect - mock_listener.should_receive(:scenario_failed).with('title', 'scenario1', @error).once - - # when - @scenario_runner.run @scenario, @world - - # then - end - - it "should return false" do - # when - success = @scenario_runner.run @scenario, @world - - # then - success.should == false - end - - - end - - describe "when a scenario is pending" do - before(:each) do - # given - @pending_error = Spec::Example::ExamplePendingError.new('todo') - @story = Story.new 'title', 'narrative' do end - @scenario = Scenario.new @story, 'scenario1' do - end - @scenario_runner = ScenarioRunner.new - @world = stub_everything - - # expect - @world.should_receive(:errors).twice.and_return([@pending_error, @pending_error]) - end - - it 'should notify listeners' do - #given - mock_listener = mock('listener') - @scenario_runner.add_listener(mock_listener) - - # expect - mock_listener.should_receive(:scenario_started).with('title', 'scenario1') - mock_listener.should_receive(:scenario_pending).with('title', 'scenario1', 'todo').once - - # when - @scenario_runner.run @scenario, @world - - # then - end - - it "should return true" do - # when - success = @scenario_runner.run @scenario, @world - - # then - success.should == true - end - end - - describe "when a scenario has an empty body" do - before(:each) do - @story = Story.new 'title', 'narrative' do end - @scenario = Scenario.new @story, 'scenario' - @scenario_runner = ScenarioRunner.new - @world = stub_everything - end - - it "should mark the scenario as pending" do - mock_listener = stub('listener', :scenario_started => true) - @scenario_runner.add_listener mock_listener - - mock_listener.should_receive(:scenario_pending).with('title', 'scenario', '') - @scenario_runner.run @scenario, @world - end - - it "should return true" do - # when - success = @scenario_runner.run @scenario, @world - - # then - success.should == true - end - end - end - end - end -end diff --git a/vendor/plugins/rspec/spec/spec/story/runner/story_mediator_spec.rb b/vendor/plugins/rspec/spec/spec/story/runner/story_mediator_spec.rb deleted file mode 100644 index 32abe5e05..000000000 --- a/vendor/plugins/rspec/spec/spec/story/runner/story_mediator_spec.rb +++ /dev/null @@ -1,133 +0,0 @@ -require File.dirname(__FILE__) + '/../story_helper' - -module Spec - module Story - module Runner - - describe StoryMediator do - before(:each) do - $story_mediator_spec_value = nil - @step_group = StepGroup.new - @step_group.create_matcher(:given, "given") { $story_mediator_spec_value = "given matched" } - @step_group.create_matcher(:when, "when") { $story_mediator_spec_value = "when matched" } - @step_group.create_matcher(:then, "then") { $story_mediator_spec_value = "then matched" } - - @scenario_runner = ScenarioRunner.new - @runner = StoryRunner.new @scenario_runner - @mediator = StoryMediator.new @step_group, @runner - end - - def run_stories - @mediator.run_stories - @runner.run_stories - end - - it "should have no stories" do - @mediator.stories.should be_empty - end - - it "should create two stories" do - @mediator.create_story "story title", "story narrative" - @mediator.create_story "story title 2", "story narrative 2" - run_stories - - @runner.should have(2).stories - @runner.stories.first.title.should == "story title" - @runner.stories.first.narrative.should == "story narrative" - @runner.stories.last.title.should == "story title 2" - @runner.stories.last.narrative.should == "story narrative 2" - end - - it "should create a scenario" do - @mediator.create_story "title", "narrative" - @mediator.create_scenario "scenario name" - run_stories - - @runner.should have(1).scenarios - @runner.scenarios.first.name.should == "scenario name" - @runner.scenarios.first.story.should == @runner.stories.first - end - - it "should create a given scenario step if one matches" do - pending("need to untangle the dark mysteries of the story runner - something needs to get stubbed here") do - story = @mediator.create_story "title", "narrative" - @mediator.create_scenario "previous scenario" - @mediator.create_scenario "current scenario" - @mediator.create_given_scenario "previous scenario" - run_stories - - $story_mediator_spec_value.should == "previous scenario matched" - end - end - - it "should create a given step if one matches" do - @mediator.create_story "title", "narrative" - @mediator.create_scenario "scenario" - @mediator.create_given "given" - run_stories - - $story_mediator_spec_value.should == "given matched" - end - - it "should create a pending step if no given step matches" do - @mediator.create_story "title", "narrative" - @mediator.create_scenario "scenario" - @mediator.create_given "no match" - mock_listener = stub_everything("listener") - mock_listener.should_receive(:scenario_pending).with("title", "scenario", "Unimplemented step: no match") - @scenario_runner.add_listener mock_listener - run_stories - end - - it "should create a when step if one matches" do - @mediator.create_story "title", "narrative" - @mediator.create_scenario "scenario" - @mediator.create_when "when" - run_stories - - $story_mediator_spec_value.should == "when matched" - end - - it "should create a pending step if no when step matches" do - @mediator.create_story "title", "narrative" - @mediator.create_scenario "scenario" - @mediator.create_when "no match" - mock_listener = stub_everything("listener") - mock_listener.should_receive(:scenario_pending).with("title", "scenario", "Unimplemented step: no match") - @scenario_runner.add_listener mock_listener - run_stories - end - - it "should create a then step if one matches" do - @mediator.create_story "title", "narrative" - @mediator.create_scenario "scenario" - @mediator.create_then "then" - run_stories - - $story_mediator_spec_value.should == "then matched" - end - - it "should create a pending step if no 'then' step matches" do - @mediator.create_story "title", "narrative" - @mediator.create_scenario "scenario" - @mediator.create_then "no match" - mock_listener = stub_everything("listener") - mock_listener.should_receive(:scenario_pending).with("title", "scenario", "Unimplemented step: no match") - @scenario_runner.add_listener mock_listener - run_stories - end - - it "should pass options to the stories it creates" do - @mediator = StoryMediator.new @step_group, @runner, :foo => :bar - @mediator.create_story "story title", "story narrative" - - run_stories - - @runner.stories.first[:foo].should == :bar - end - - end - - end - end -end
\ No newline at end of file diff --git a/vendor/plugins/rspec/spec/spec/story/runner/story_parser_spec.rb b/vendor/plugins/rspec/spec/spec/story/runner/story_parser_spec.rb deleted file mode 100644 index 5efc8fd18..000000000 --- a/vendor/plugins/rspec/spec/spec/story/runner/story_parser_spec.rb +++ /dev/null @@ -1,384 +0,0 @@ -require File.dirname(__FILE__) + '/../story_helper' - -module Spec - module Story - module Runner - - describe StoryParser do - before(:each) do - @story_mediator = mock("story_mediator") - @parser = StoryParser.new(@story_mediator) - end - - it "should parse no lines" do - @parser.parse([]) - end - - it "should ignore text before the first Story: begins" do - @story_mediator.should_not_receive(:create_scenario) - @story_mediator.should_not_receive(:create_given) - @story_mediator.should_not_receive(:create_when) - @story_mediator.should_not_receive(:create_then) - @story_mediator.should_receive(:create_story).with("simple addition", "") - @parser.parse(["Here is a bunch of text", "about a calculator and all the things", "that it will do", "Story: simple addition"]) - end - - it "should create a story" do - @story_mediator.should_receive(:create_story).with("simple addition", "") - @parser.parse(["Story: simple addition"]) - end - - it "should create a story when line has leading spaces" do - @story_mediator.should_receive(:create_story).with("simple addition", "") - @parser.parse([" Story: simple addition"]) - end - - it "should add a one line narrative to the story" do - @story_mediator.should_receive(:create_story).with("simple addition","narrative") - @parser.parse(["Story: simple addition","narrative"]) - end - - it "should add a multi line narrative to the story" do - @story_mediator.should_receive(:create_story).with("simple addition","narrative line 1\nline 2\nline 3") - @parser.parse(["Story: simple addition","narrative line 1", "line 2", "line 3"]) - end - - it "should exclude blank lines from the narrative" do - @story_mediator.should_receive(:create_story).with("simple addition","narrative line 1\nline 2") - @parser.parse(["Story: simple addition","narrative line 1", "", "line 2"]) - end - - it "should exclude Scenario from the narrative" do - @story_mediator.should_receive(:create_story).with("simple addition","narrative line 1\nline 2") - @story_mediator.should_receive(:create_scenario) - @parser.parse(["Story: simple addition","narrative line 1", "line 2", "Scenario: add one plus one"]) - end - - end - - describe StoryParser, "in Story state" do - before(:each) do - @story_mediator = mock("story_mediator") - @parser = StoryParser.new(@story_mediator) - @story_mediator.stub!(:create_story) - end - - it "should create a second Story for Story" do - @story_mediator.should_receive(:create_story).with("number two","") - @parser.parse(["Story: s", "Story: number two"]) - end - - it "should include And in the narrative" do - @story_mediator.should_receive(:create_story).with("s","And foo") - @story_mediator.should_receive(:create_scenario).with("bar") - @parser.parse(["Story: s", "And foo", "Scenario: bar"]) - end - - it "should create a Scenario for Scenario" do - @story_mediator.should_receive(:create_scenario).with("number two") - @parser.parse(["Story: s", "Scenario: number two"]) - end - - it "should include Given in the narrative" do - @story_mediator.should_receive(:create_story).with("s","Given foo") - @story_mediator.should_receive(:create_scenario).with("bar") - @parser.parse(["Story: s", "Given foo", "Scenario: bar"]) - end - - it "should include Given: in the narrative" do - @story_mediator.should_receive(:create_story).with("s","Given: foo") - @story_mediator.should_receive(:create_scenario).with("bar") - @parser.parse(["Story: s", "Given: foo", "Scenario: bar"]) - end - - it "should include When in the narrative" do - @story_mediator.should_receive(:create_story).with("s","When foo") - @story_mediator.should_receive(:create_scenario).with("bar") - @parser.parse(["Story: s", "When foo", "Scenario: bar"]) - end - - it "should include Then in the narrative" do - @story_mediator.should_receive(:create_story).with("s","Then foo") - @story_mediator.should_receive(:create_scenario).with("bar") - @parser.parse(["Story: s", "Then foo", "Scenario: bar"]) - end - - it "should include other in the story" do - @story_mediator.should_receive(:create_story).with("s","narrative") - @parser.parse(["Story: s", "narrative"]) - end - end - - describe StoryParser, "in Scenario state" do - before(:each) do - @story_mediator = mock("story_mediator") - @parser = StoryParser.new(@story_mediator) - @story_mediator.stub!(:create_story) - @story_mediator.stub!(:create_scenario) - end - - it "should create a Story for Story" do - @story_mediator.should_receive(:create_story).with("number two","") - @parser.parse(["Story: s", "Scenario: s", "Story: number two"]) - end - - it "should create a Scenario for Scenario" do - @story_mediator.should_receive(:create_scenario).with("number two") - @parser.parse(["Story: s", "Scenario: s", "Scenario: number two"]) - end - - it "should raise for And" do - lambda { - @parser.parse(["Story: s", "Scenario: s", "And second"]) - }.should raise_error(IllegalStepError, /^Illegal attempt to create a And after a Scenario/) - end - - it "should create a Given for Given" do - @story_mediator.should_receive(:create_given).with("gift") - @parser.parse(["Story: s", "Scenario: s", "Given gift"]) - end - - it "should create a Given for Given:" do - @story_mediator.should_receive(:create_given).with("gift") - @parser.parse(["Story: s", "Scenario: s", "Given: gift"]) - end - - it "should create a GivenScenario for GivenScenario" do - @story_mediator.should_receive(:create_given_scenario).with("previous") - @parser.parse(["Story: s", "Scenario: s", "GivenScenario previous"]) - end - - it "should create a GivenScenario for GivenScenario:" do - @story_mediator.should_receive(:create_given_scenario).with("previous") - @parser.parse(["Story: s", "Scenario: s", "GivenScenario: previous"]) - end - - it "should transition to Given state after GivenScenario" do - @story_mediator.stub!(:create_given_scenario) - @parser.parse(["Story: s", "Scenario: s", "GivenScenario previous"]) - @parser.instance_eval{@state}.should be_an_instance_of(StoryParser::GivenState) - end - - it "should transition to Given state after GivenScenario:" do - @story_mediator.stub!(:create_given_scenario) - @parser.parse(["Story: s", "Scenario: s", "GivenScenario: previous"]) - @parser.instance_eval{@state}.should be_an_instance_of(StoryParser::GivenState) - end - - it "should create a When for When" do - @story_mediator.should_receive(:create_when).with("ever") - @parser.parse(["Story: s", "Scenario: s", "When ever"]) - end - - it "should create a When for When:" do - @story_mediator.should_receive(:create_when).with("ever") - @parser.parse(["Story: s", "Scenario: s", "When: ever"]) - end - - it "should create a Then for Then" do - @story_mediator.should_receive(:create_then).with("and there") - @parser.parse(["Story: s", "Scenario: s", "Then and there"]) - end - - it "should create a Then for Then:" do - @story_mediator.should_receive(:create_then).with("and there") - @parser.parse(["Story: s", "Scenario: s", "Then: and there"]) - end - - it "should ignore other" do - @parser.parse(["Story: s", "Scenario: s", "this is ignored"]) - end - end - - describe StoryParser, "in Given state" do - before(:each) do - @story_mediator = mock("story_mediator") - @parser = StoryParser.new(@story_mediator) - @story_mediator.stub!(:create_story) - @story_mediator.stub!(:create_scenario) - @story_mediator.should_receive(:create_given).with("first") - end - - it "should create a Story for Story" do - @story_mediator.should_receive(:create_story).with("number two","") - @parser.parse(["Story: s", "Scenario: s", "Given first", "Story: number two"]) - end - - it "should create a Scenario for Scenario" do - @story_mediator.should_receive(:create_scenario).with("number two") - @parser.parse(["Story: s", "Scenario: s", "Given first", "Scenario: number two"]) - end - - it "should create a second Given for Given" do - @story_mediator.should_receive(:create_given).with("second") - @parser.parse(["Story: s", "Scenario: s", "Given first", "Given second"]) - end - - it "should create a second Given for And" do - @story_mediator.should_receive(:create_given).with("second") - @parser.parse(["Story: s", "Scenario: s", "Given: first", "And second"]) - end - - it "should create a second Given for And:" do - @story_mediator.should_receive(:create_given).with("second") - @parser.parse(["Story: s", "Scenario: s", "Given first", "And: second"]) - end - - it "should create a When for When" do - @story_mediator.should_receive(:create_when).with("ever") - @parser.parse(["Story: s", "Scenario: s", "Given first", "When ever"]) - end - - it "should create a When for When:" do - @story_mediator.should_receive(:create_when).with("ever") - @parser.parse(["Story: s", "Scenario: s", "Given first", "When: ever"]) - end - - it "should create a Then for Then" do - @story_mediator.should_receive(:create_then).with("and there") - @parser.parse(["Story: s", "Scenario: s", "Given first", "Then and there"]) - end - - it "should create a Then for Then:" do - @story_mediator.should_receive(:create_then).with("and there") - @parser.parse(["Story: s", "Scenario: s", "Given first", "Then: and there"]) - end - - it "should ignore other" do - @parser.parse(["Story: s", "Scenario: s", "Given first", "this is ignored"]) - end - end - - describe StoryParser, "in When state" do - before(:each) do - @story_mediator = mock("story_mediator") - @parser = StoryParser.new(@story_mediator) - @story_mediator.stub!(:create_story) - @story_mediator.stub!(:create_scenario) - @story_mediator.should_receive(:create_given).with("first") - @story_mediator.should_receive(:create_when).with("else") - end - - it "should create a Story for Story" do - @story_mediator.should_receive(:create_story).with("number two","") - @parser.parse(["Story: s", "Scenario: s", "Given first", "When: else", "Story: number two"]) - end - - it "should create a Scenario for Scenario" do - @story_mediator.should_receive(:create_scenario).with("number two") - @parser.parse(["Story: s", "Scenario: s", "Given first", "When else", "Scenario: number two"]) - end - - it "should create Given for Given" do - @story_mediator.should_receive(:create_given).with("second") - @parser.parse(["Story: s", "Scenario: s", "Given first", "When else", "Given second"]) - end - - it "should create Given for Given:" do - @story_mediator.should_receive(:create_given).with("second") - @parser.parse(["Story: s", "Scenario: s", "Given first", "When else", "Given: second"]) - end - - it "should create a second When for When" do - @story_mediator.should_receive(:create_when).with("ever") - @parser.parse(["Story: s", "Scenario: s", "Given first", "When else", "When ever"]) - end - - it "should create a second When for When:" do - @story_mediator.should_receive(:create_when).with("ever") - @parser.parse(["Story: s", "Scenario: s", "Given: first", "When: else", "When: ever"]) - end - - it "should create a second When for And" do - @story_mediator.should_receive(:create_when).with("ever") - @parser.parse(["Story: s", "Scenario: s", "Given first", "When else", "And ever"]) - end - - it "should create a second When for And:" do - @story_mediator.should_receive(:create_when).with("ever") - @parser.parse(["Story: s", "Scenario: s", "Given: first", "When: else", "And: ever"]) - end - - it "should create a Then for Then" do - @story_mediator.should_receive(:create_then).with("and there") - @parser.parse(["Story: s", "Scenario: s", "Given first", "When else", "Then and there"]) - end - - it "should create a Then for Then:" do - @story_mediator.should_receive(:create_then).with("and there") - @parser.parse(["Story: s", "Scenario: s", "Given: first", "When: else", "Then: and there"]) - end - - it "should ignore other" do - @parser.parse(["Story: s", "Scenario: s", "Given first", "When else", "this is ignored"]) - end - end - - describe StoryParser, "in Then state" do - before(:each) do - @story_mediator = mock("story_mediator") - @parser = StoryParser.new(@story_mediator) - @story_mediator.stub!(:create_story) - @story_mediator.stub!(:create_scenario) - @story_mediator.should_receive(:create_given).with("first") - @story_mediator.should_receive(:create_when).with("else") - @story_mediator.should_receive(:create_then).with("what") - end - - it "should create a Story for Story" do - @story_mediator.should_receive(:create_story).with("number two","") - @parser.parse(["Story: s", "Scenario: s", "Given first", "When else", "Then what", "Story: number two"]) - end - - it "should create a Scenario for Scenario" do - @story_mediator.should_receive(:create_scenario).with("number two") - @parser.parse(["Story: s", "Scenario: s", "Given first", "When else", "Then what", "Scenario: number two"]) - end - - it "should create Given for Given" do - @story_mediator.should_receive(:create_given).with("second") - @parser.parse(["Story: s", "Scenario: s", "Given first", "When else", "Then what", "Given second"]) - end - - it "should create Given for Given:" do - @story_mediator.should_receive(:create_given).with("second") - @parser.parse(["Story: s", "Scenario: s", "Given: first", "When: else", "Then: what", "Given: second"]) - end - - it "should create When for When" do - @story_mediator.should_receive(:create_when).with("ever") - @parser.parse(["Story: s", "Scenario: s", "Given first", "When else", "Then what", "When ever"]) - end - - it "should create When for When:" do - @story_mediator.should_receive(:create_when).with("ever") - @parser.parse(["Story: s", "Scenario: s", "Given: first", "When: else", "Then: what", "When: ever"]) - end - - it "should create a Then for Then" do - @story_mediator.should_receive(:create_then).with("and there") - @parser.parse(["Story: s", "Scenario: s", "Given first", "When else", "Then what", "Then and there"]) - end - - it "should create a Then for Then:" do - @story_mediator.should_receive(:create_then).with("and there") - @parser.parse(["Story: s", "Scenario: s", "Given: first", "When: else", "Then: what", "Then: and there"]) - end - - it "should create a second Then for And" do - @story_mediator.should_receive(:create_then).with("ever") - @parser.parse(["Story: s", "Scenario: s", "Given first", "When else", "Then what", "And ever"]) - end - - it "should create a second Then for And:" do - @story_mediator.should_receive(:create_then).with("ever") - @parser.parse(["Story: s", "Scenario: s", "Given: first", "When: else", "Then: what", "And: ever"]) - end - - it "should ignore other" do - @parser.parse(["Story: s", "Scenario: s", "Given first", "When else", "Then what", "this is ignored"]) - end - end - end - end -end
\ No newline at end of file diff --git a/vendor/plugins/rspec/spec/spec/story/runner/story_runner_spec.rb b/vendor/plugins/rspec/spec/spec/story/runner/story_runner_spec.rb deleted file mode 100644 index 5bed6c562..000000000 --- a/vendor/plugins/rspec/spec/spec/story/runner/story_runner_spec.rb +++ /dev/null @@ -1,294 +0,0 @@ -require File.dirname(__FILE__) + '/../story_helper' - -module Spec - module Story - module Runner - describe StoryRunner do - it 'should collect all the stories' do - # given - story_runner = StoryRunner.new(stub('scenario_runner')) - - # when - story_runner.Story 'title1', 'narrative1' do end - story_runner.Story 'title2', 'narrative2' do end - stories = story_runner.stories - - # then - story_runner.should have(2).stories - stories.first.title.should == 'title1' - stories.first.narrative.should == 'narrative1' - stories.last.title.should == 'title2' - stories.last.narrative.should == 'narrative2' - end - - it 'should gather all the scenarios in the stories' do - # given - story_runner = StoryRunner.new(stub('scenario_runner')) - - # when - story_runner.Story "story1", "narrative1" do - Scenario "scenario1" do end - Scenario "scenario2" do end - end - story_runner.Story "story2", "narrative2" do - Scenario "scenario3" do end - end - scenarios = story_runner.scenarios - - # then - story_runner.should have(3).scenarios - scenarios[0].name.should == 'scenario1' - scenarios[1].name.should == 'scenario2' - scenarios[2].name.should == 'scenario3' - end - - # captures worlds passed into a ScenarioRunner - class ScenarioWorldCatcher - attr_accessor :worlds - def run(scenario, world) - (@worlds ||= []) << world - end - end - - it 'should run each scenario in a separate object' do - # given - scenario_world_catcher = ScenarioWorldCatcher.new - story_runner = StoryRunner.new(scenario_world_catcher) - story_runner.Story 'story', 'narrative' do - Scenario 'scenario1' do end - Scenario 'scenario2' do end - end - - # when - story_runner.run_stories - - # then - worlds = scenario_world_catcher.worlds - scenario_world_catcher.should have(2).worlds - worlds[0].should_not == worlds[1] - end - - it "should return false if the scenario runner returns false ever" do - #given - stub_scenario_runner = stub_everything - story_runner = StoryRunner.new(stub_scenario_runner) - story_runner.Story 'story', 'narrative' do - Scenario 'scenario1' do end - Scenario 'scenario2' do end - end - - # expect - stub_scenario_runner.should_receive(:run).once.and_return(false,true) - - # when - success = story_runner.run_stories - - #then - success.should == false - end - - it "should return true if the scenario runner returns true for all scenarios" do - #given - stub_scenario_runner = stub_everything - story_runner = StoryRunner.new(stub_scenario_runner) - story_runner.Story 'story', 'narrative' do - Scenario 'scenario1' do end - Scenario 'scenario2' do end - end - - # expect - stub_scenario_runner.should_receive(:run).once.and_return(true,true) - - # when - success = story_runner.run_stories - - #then - success.should == true - end - - it 'should use the provided world creator to create worlds' do - # given - stub_scenario_runner = stub_everything - mock_world_creator = mock('world creator') - story_runner = StoryRunner.new(stub_scenario_runner, mock_world_creator) - story_runner.Story 'story', 'narrative' do - Scenario 'scenario1' do end - Scenario 'scenario2' do end - end - - # expect - mock_world_creator.should_receive(:create).twice - - # when - story_runner.run_stories - - # then - end - - it 'should notify listeners of the scenario count when the run starts' do - # given - story_runner = StoryRunner.new(stub_everything) - mock_listener1 = stub_everything('listener1') - mock_listener2 = stub_everything('listener2') - story_runner.add_listener(mock_listener1) - story_runner.add_listener(mock_listener2) - - story_runner.Story 'story1', 'narrative1' do - Scenario 'scenario1' do end - end - story_runner.Story 'story2', 'narrative2' do - Scenario 'scenario2' do end - Scenario 'scenario3' do end - end - - # expect - mock_listener1.should_receive(:run_started).with(3) - mock_listener2.should_receive(:run_started).with(3) - - # when - story_runner.run_stories - - # then - end - - it 'should notify listeners when a story starts' do - # given - story_runner = StoryRunner.new(stub_everything) - mock_listener1 = stub_everything('listener1') - mock_listener2 = stub_everything('listener2') - story_runner.add_listener(mock_listener1) - story_runner.add_listener(mock_listener2) - - story_runner.Story 'story1', 'narrative1' do - Scenario 'scenario1' do end - end - story_runner.Story 'story2', 'narrative2' do - Scenario 'scenario2' do end - Scenario 'scenario3' do end - end - - # expect - mock_listener1.should_receive(:story_started).with('story1', 'narrative1') - mock_listener1.should_receive(:story_ended).with('story1', 'narrative1') - mock_listener2.should_receive(:story_started).with('story2', 'narrative2') - mock_listener2.should_receive(:story_ended).with('story2', 'narrative2') - - # when - story_runner.run_stories - - # then - end - - it 'should notify listeners when the run ends' do - # given - story_runner = StoryRunner.new(stub_everything) - mock_listener1 = stub_everything('listener1') - mock_listener2 = stub_everything('listener2') - story_runner.add_listener mock_listener1 - story_runner.add_listener mock_listener2 - story_runner.Story 'story1', 'narrative1' do - Scenario 'scenario1' do end - end - - # expect - mock_listener1.should_receive(:run_ended) - mock_listener2.should_receive(:run_ended) - - # when - story_runner.run_stories - - # then - end - - it 'should run a story in an instance of a specified class' do - # given - scenario_world_catcher = ScenarioWorldCatcher.new - story_runner = StoryRunner.new(scenario_world_catcher) - story_runner.Story 'title', 'narrative', :type => String do - Scenario 'scenario' do end - end - - # when - story_runner.run_stories - - # then - scenario_world_catcher.worlds[0].should be_kind_of(String) - scenario_world_catcher.worlds[0].should be_kind_of(World) - end - - it 'should pass initialization params through to the constructed instance' do - # given - scenario_world_catcher = ScenarioWorldCatcher.new - story_runner = StoryRunner.new(scenario_world_catcher) - story_runner.Story 'title', 'narrative', :type => Array, :args => [3] do - Scenario 'scenario' do end - end - - # when - story_runner.run_stories - - # then - scenario_world_catcher.worlds[0].should be_kind_of(Array) - scenario_world_catcher.worlds[0].size.should == 3 - end - - it 'should find a scenario in the current story by name' do - # given - story_runner = StoryRunner.new(ScenarioRunner.new) - $scenario = nil - - story_runner.Story 'title', 'narrative' do - Scenario 'first scenario' do - end - Scenario 'second scenario' do - $scenario = StoryRunner.scenario_from_current_story 'first scenario' - end - end - - # when - story_runner.run_stories - - # then - $scenario.name.should == 'first scenario' - end - - it "should clean the steps between stories" do - #given - story_runner = StoryRunner.new(ScenarioRunner.new) - result = mock 'result' - - step1 = Step.new('step') do - result.one - end - steps1 = StepGroup.new - steps1.add :when, step1 - - story_runner.Story 'title', 'narrative', :steps_for => steps1 do - Scenario 'first scenario' do - When 'step' - end - end - - step2 = Step.new('step') do - result.two - end - steps2 = StepGroup.new - steps2.add :when, step2 - - story_runner.Story 'title2', 'narrative', :steps_for => steps2 do - Scenario 'second scenario' do - When 'step' - end - end - - #then - result.should_receive(:one) - result.should_receive(:two) - - #when - story_runner.run_stories - end - end - end - end -end diff --git a/vendor/plugins/rspec/spec/spec/story/runner_spec.rb b/vendor/plugins/rspec/spec/spec/story/runner_spec.rb deleted file mode 100644 index db1c40de5..000000000 --- a/vendor/plugins/rspec/spec/spec/story/runner_spec.rb +++ /dev/null @@ -1,93 +0,0 @@ -require File.dirname(__FILE__) + '/story_helper' -require 'spec/runner/formatter/story/plain_text_formatter' -require 'spec/runner/formatter/story/html_formatter' - -module Spec - module Story - describe Runner, "module" do - before(:each) do - @world_creator = World.dup - @runner_module = Runner.dup - @runner_module.instance_eval {@story_runner = nil} - @runner_module.stub!(:register_exit_hook) - end - - def create_options(args=[]) - Spec::Runner::OptionParser.parse(args, StringIO.new, StringIO.new) - end - - it 'should wire up a singleton StoryRunner' do - @runner_module.story_runner.should_not be_nil - end - - it 'should set its options based on ARGV' do - # given - @runner_module.should_receive(:run_options).and_return( - create_options(['--dry-run']) - ) - - # when - options = @runner_module.run_options - - # then - options.dry_run.should be_true - end - - describe "initialization" do - - before(:each) do - # given - @story_runner = mock('story runner', :null_object => true) - @scenario_runner = mock('scenario runner', :null_object => true) - @world_creator = mock('world', :null_object => true) - - @runner_module.stub!(:world_creator).and_return(@world_creator) - @runner_module.stub!(:create_story_runner).and_return(@story_runner) - @runner_module.stub!(:scenario_runner).and_return(@scenario_runner) - end - - it 'should add a reporter to the runner classes' do - @runner_module.should_receive(:run_options).and_return( - create_options - ) - - # expect - @world_creator.should_receive(:add_listener).with(an_instance_of(Spec::Runner::Formatter::Story::PlainTextFormatter)) - @story_runner.should_receive(:add_listener).with(an_instance_of(Spec::Runner::Formatter::Story::PlainTextFormatter)) - @scenario_runner.should_receive(:add_listener).with(an_instance_of(Spec::Runner::Formatter::Story::PlainTextFormatter)) - - # when - @runner_module.story_runner - end - - it 'should add a documenter to the runner classes if one is specified' do - - @runner_module.should_receive(:run_options).and_return( - create_options(["--format","html"]) - ) - - # expect - @world_creator.should_receive(:add_listener).with(an_instance_of(Spec::Runner::Formatter::Story::HtmlFormatter)) - @story_runner.should_receive(:add_listener).with(an_instance_of(Spec::Runner::Formatter::Story::HtmlFormatter)) - @scenario_runner.should_receive(:add_listener).with(an_instance_of(Spec::Runner::Formatter::Story::HtmlFormatter)) - - # when - @runner_module.story_runner - end - - it 'should add any registered listener to the runner classes' do - # given - listener = Object.new - - # expect - @world_creator.should_receive(:add_listener).with(listener) - @story_runner.should_receive(:add_listener).with(listener) - @scenario_runner.should_receive(:add_listener).with(listener) - - # when - @runner_module.register_listener listener - end - end - end - end -end diff --git a/vendor/plugins/rspec/spec/spec/story/scenario_spec.rb b/vendor/plugins/rspec/spec/spec/story/scenario_spec.rb deleted file mode 100644 index 0cf7aff30..000000000 --- a/vendor/plugins/rspec/spec/spec/story/scenario_spec.rb +++ /dev/null @@ -1,20 +0,0 @@ -require File.dirname(__FILE__) + '/story_helper' - -module Spec - module Story - describe Scenario do - it 'should not raise an error if no body is supplied' do - # given - story = StoryBuilder.new.to_story - - # when - error = exception_from do - Scenario.new story, 'name' - end - - # then - error.should be_nil - end - end - end -end diff --git a/vendor/plugins/rspec/spec/spec/story/step_group_spec.rb b/vendor/plugins/rspec/spec/spec/story/step_group_spec.rb deleted file mode 100644 index dd28bfa26..000000000 --- a/vendor/plugins/rspec/spec/spec/story/step_group_spec.rb +++ /dev/null @@ -1,157 +0,0 @@ -require File.dirname(__FILE__) + '/story_helper' - -module Spec - module Story - describe StepGroup do - before(:each) do - @step_group = StepGroup.new - end - - it "should not find a matcher if empty" do - @step_group.find(:given, "this and that").should be_nil - end - - it "should create a given_scenario matcher" do - step = @step_group.given_scenario("this and that") {} - @step_group.find(:given_scenario, "this and that").should_not be_nil - @step_group.find(:given_scenario, "this and that").should equal(step) - end - - it "should create a given matcher" do - step = @step_group.given("this and that") {} - @step_group.find(:given, "this and that").should equal(step) - end - - it "should create a when matcher" do - step = @step_group.when("this and that") {} - @step_group.find(:when, "this and that").should equal(step) - end - - it "should create a them matcher" do - step = @step_group.then("this and that") {} - @step_group.find(:then, "this and that").should equal(step) - end - - it "should add a matcher object" do - step = Step.new("this and that") {} - @step_group.add(:given, step) - @step_group.find(:given, "this and that").should equal(step) - end - - it "should add it matchers to another StepGroup (with one given)" do - source = StepGroup.new - target = StepGroup.new - step = source.given("this and that") {} - source.add_to target - target.find(:given, "this and that").should equal(step) - end - - it "should add it matchers to another StepGroup (with some of each type)" do - source = StepGroup.new - target = StepGroup.new - given_scenario = source.given_scenario("1") {} - given = source.given("1") {} - when1 = source.when("1") {} - when2 = source.when("2") {} - then1 = source.then("1") {} - then2 = source.then("2") {} - then3 = source.then("3") {} - source.add_to target - target.find(:given_scenario, "1").should equal(given_scenario) - target.find(:given, "1").should equal(given) - target.find(:when, "1").should equal(when1) - target.find(:when, "2").should equal(when2) - target.find(:then, "1").should equal(then1) - target.find(:then, "2").should equal(then2) - target.find(:then, "3").should equal(then3) - end - - it "should append another collection" do - matchers_to_append = StepGroup.new - step = matchers_to_append.given("this and that") {} - @step_group << matchers_to_append - @step_group.find(:given, "this and that").should equal(step) - end - - it "should append several other collections" do - matchers_to_append = StepGroup.new - more_matchers_to_append = StepGroup.new - first_matcher = matchers_to_append.given("this and that") {} - second_matcher = more_matchers_to_append.given("and the other") {} - @step_group << matchers_to_append - @step_group << more_matchers_to_append - @step_group.find(:given, "this and that").should equal(first_matcher) - @step_group.find(:given, "and the other").should equal(second_matcher) - end - - it "should yield itself on initialization" do - begin - $step_group_spec_step = nil - matchers = StepGroup.new do |matchers| - $step_group_spec_step = matchers.given("foo") {} - end - $step_group_spec_step.matches?("foo").should be_true - ensure - $step_group_spec_step = nil - end - end - - it "should support defaults" do - class StepGroupSubclass < StepGroup - steps do |add| - add.given("foo") {} - end - end - StepGroupSubclass.new.find(:given, "foo").should_not be_nil - end - - it "should create a Given" do - sub = Class.new(StepGroup).new - step = sub.Given("foo") {} - sub.find(:given, "foo").should == step - end - - it "should create a When" do - sub = Class.new(StepGroup).new - step = sub.When("foo") {} - sub.find(:when, "foo").should == step - end - - it "should create a Then" do - sub = Class.new(StepGroup).new - step = sub.Then("foo") {} - sub.find(:then, "foo").should == step - end - - it "should create steps in a block" do - sub = Class.new(StepGroup).new do - Given("a given") {} - When("a when") {} - Then("a then") {} - end - sub.find(:given, "a given").should_not be_nil - sub.find(:when, "a when").should_not be_nil - sub.find(:then, "a then").should_not be_nil - end - - it "should clear itself" do - step = @step_group.given("this and that") {} - @step_group.clear - @step_group.find(:given, "this and that").should be_nil - end - - it "should tell you when it is empty" do - @step_group.should be_empty - end - - it "should tell you when it is not empty" do - @step_group.given("this and that") {} - @step_group.should_not be_empty - end - - it "should handle << nil" do - @step_group << nil - end - end - end -end diff --git a/vendor/plugins/rspec/spec/spec/story/step_mother_spec.rb b/vendor/plugins/rspec/spec/spec/story/step_mother_spec.rb deleted file mode 100644 index 64efd7a6a..000000000 --- a/vendor/plugins/rspec/spec/spec/story/step_mother_spec.rb +++ /dev/null @@ -1,72 +0,0 @@ -require File.dirname(__FILE__) + '/story_helper' - -module Spec - module Story - describe StepMother do - it 'should store a step by name and type' do - # given - step_mother = StepMother.new - step = Step.new("a given", &lambda {}) - step_mother.store(:given, step) - - # when - found = step_mother.find(:given, "a given") - - # then - found.should == step - end - - it 'should NOT raise an error if a step is missing' do - # given - step_mother = StepMother.new - - # then - lambda do - # when - step_mother.find(:given, "doesn't exist") - end.should_not raise_error - end - - it "should create a default step which raises a pending error" do - # given - step_mother = StepMother.new - - # when - step = step_mother.find(:given, "doesn't exist") - - # then - step.should be_an_instance_of(Step) - - lambda do - step.perform(Object.new, "doesn't exist") - end.should raise_error(Spec::Example::ExamplePendingError, /Unimplemented/) - end - - it 'should clear itself' do - # given - step_mother = StepMother.new - step = Step.new("a given") do end - step_mother.store(:given, step) - - # when - step_mother.clear - - # then - step_mother.should be_empty - end - - it "should use assigned steps" do - step_mother = StepMother.new - - step = Step.new('step') {} - step_group = StepGroup.new - step_group.add(:given, step) - - step_mother.use(step_group) - - step_mother.find(:given, "step").should equal(step) - end - - end - end -end diff --git a/vendor/plugins/rspec/spec/spec/story/step_spec.rb b/vendor/plugins/rspec/spec/spec/story/step_spec.rb deleted file mode 100644 index 2b523607a..000000000 --- a/vendor/plugins/rspec/spec/spec/story/step_spec.rb +++ /dev/null @@ -1,219 +0,0 @@ -require File.dirname(__FILE__) + '/story_helper' - -module Spec - module Story - describe Step, "matching" do - it "should match a text string" do - step = Step.new("this text") {} - step.matches?("this text").should be_true - end - - it "should not match a text string that does not start the same" do - step = Step.new("this text") {} - step.matches?("Xthis text").should be_false - end - - it "should not match a text string that does not end the same" do - step = Step.new("this text") {} - step.matches?("this textX").should be_false - end - - it "should match a text string with a param" do - step = Step.new("this $param text") {} - step.matches?("this anything text").should be_true - end - - it "should not be greedy" do - step = Step.new("enter $value for $key") {} - step.parse_args("enter 3 for keys for a piano").should == ['3','keys for a piano'] - end - - it "should match a text string with 3 params" do - step = Step.new("1 $one 2 $two 3 $three 4") {} - step.matches?("1 a 2 b 3 c 4").should be_true - end - - it "should match a text string with a param at the beginning" do - step = Step.new("$one 2 3") {} - step.matches?("a 2 3").should be_true - end - - it "should match a text string with a param at the end" do - step = Step.new("1 2 $three") {} - step.matches?("1 2 c").should be_true - end - - it "should match a text string with a dollar sign ($)" do - step = Step.new("show me the $$money") {} - step.matches?("show me the $kwan").should be_true - end - - it "should match a string with an escaped dollar sign" do - step = Step.new("show me the \$money") {} - step.matches?("show me the $kwan").should be_true - end - - it "should not match a different string" do - step = Step.new("this text") {} - step.matches?("other text").should be_false - end - - it "should match a regexp" do - step = Step.new(/this text/) {} - step.matches?("this text").should be_true - end - - it "should match a regexp with a match group" do - step = Step.new(/this (.*) text/) {} - step.matches?("this anything text").should be_true - end - - it "should match a regexp with a named variable" do - step = Step.new(/this $variable text/) {} - step.matches?("this anything text").should be_true - end - - it "should not match a non matching regexp" do - step = Step.new(/this (.*) text/) {} - step.matches?("other anything text").should be_false - end - - it "should not match a non matching regexp with a named variable" do - step = Step.new(/this $variable text/) {} - step.matches?("other anything text").should be_false - end - - it "should not get bogged down by parens in strings" do - step = Step.new("before () after") {} - step.matches?("before () after").should be_true - end - - it "should match any option of an alteration" do - step = Step.new(/(he|she) is cool/) {} - step.matches?("he is cool").should be_true - step.matches?("she is cool").should be_true - end - - it "should match alteration as well as a variable" do - step = Step.new(/(he|she) is (.*)/) {} - step.matches?("he is cool").should be_true - step.parse_args("he is cool").should == ['he', 'cool'] - end - - it "should match alteration as well as a named variable" do - step = Step.new(/(he|she) is $adjective/) {} - step.matches?("he is cool").should be_true - step.parse_args("he is cool").should == ['he', 'cool'] - end - - it "should match alteration as well as a anonymous and named variable" do - step = Step.new(/(he|she) is (.*?) $adjective/) {} - step.matches?("he is very cool").should be_true - step.parse_args("he is very cool").should == ['he', 'very', 'cool'] - end - - it "should match a regex with a dollar sign ($)" do - step = Step.new(/show me the \$\d+/) {} - step.matches?("show me the $123").should be_true - end - - it "should match a regex with a dollar sign and named variable" do - step = Step.new(/show me the \$$money/) {} - step.matches?("show me the $123").should be_true - end - end - - describe Step do - it "should make complain with no block" do - lambda { - step = Step.new("foo") - }.should raise_error - end - - it "should perform itself on an object" do - # given - $instance = nil - step = Step.new 'step' do - $instance = self - end - instance = Object.new - - # when - step.perform(instance, "step") - - # then - $instance.should == instance - end - - it "should perform itself with one parameter with match expression" do - # given - $result = nil - step = Step.new 'an account with $count dollars' do |count| - $result = count - end - instance = Object.new - - # when - args = step.parse_args("an account with 3 dollars") - step.perform(instance, *args) - - # then - $result.should == "3" - end - - it "should perform itself with one parameter without a match expression" do - # given - $result = nil - step = Step.new 'an account with a balance of' do |amount| - $result = amount - end - instance = Object.new - - # when - step.perform(instance, 20) - - # then - $result.should == 20 - end - - it "should perform itself with 2 parameters" do - # given - $account_type = nil - $amount = nil - step = Step.new 'a $account_type account with $amount dollars' do |account_type, amount| - $account_type = account_type - $amount = amount - end - instance = Object.new - - # when - args = step.parse_args("a savings account with 3 dollars") - step.perform(instance, *args) - - # then - $account_type.should == "savings" - $amount.should == "3" - end - - it "should perform itself when defined with a regexp with 2 parameters" do - # given - $pronoun = nil - $adjective = nil - step = Step.new /(he|she) is (.*)/ do |pronoun, adjective| - $pronoun = pronoun - $adjective = adjective - end - instance = Object.new - - # when - args = step.parse_args("he is cool") - step.perform(instance, *args) - - # then - $pronoun.should == "he" - $adjective.should == "cool" - end - - end - end -end diff --git a/vendor/plugins/rspec/spec/spec/story/story_helper.rb b/vendor/plugins/rspec/spec/spec/story/story_helper.rb deleted file mode 100644 index bb906f255..000000000 --- a/vendor/plugins/rspec/spec/spec/story/story_helper.rb +++ /dev/null @@ -1,2 +0,0 @@ -require File.dirname(__FILE__) + '/../../spec_helper' -require File.dirname(__FILE__) + '/builders' diff --git a/vendor/plugins/rspec/spec/spec/story/story_spec.rb b/vendor/plugins/rspec/spec/spec/story/story_spec.rb deleted file mode 100644 index f6bce544f..000000000 --- a/vendor/plugins/rspec/spec/spec/story/story_spec.rb +++ /dev/null @@ -1,86 +0,0 @@ -require File.dirname(__FILE__) + '/story_helper' - -module Spec - module Story - describe Story do - it 'should run itself in a given object' do - # given - $instance = nil - story = Story.new 'title', 'narrative' do - $instance = self - end - object = Object.new - - # when - story.run_in(object) - - # then - $instance.should be(object) - end - - it 'should not raise an error if no block is supplied' do - # when - error = exception_from do - Story.new 'title', 'narrative' - end - - # then - error.should be_nil - end - - it "should raise an error when an error is raised running in another object" do - #given - story = Story.new 'title', 'narrative' do - raise "this is raised in the story" - end - object = Object.new - - # when/then - lambda do - story.run_in(object) - end.should raise_error - end - - it "should use the steps it is told to using a StepGroup" do - story = Story.new("title", "narrative", :steps_for => steps = StepGroup.new) do end - assignee = mock("assignee") - assignee.should_receive(:use).with(steps) - story.assign_steps_to(assignee) - end - - it "should use the steps it is told to using a key" do - begin - orig_rspec_story_steps = $rspec_story_steps - $rspec_story_steps = StepGroupHash.new - $rspec_story_steps[:foo] = steps = Object.new - - story = Story.new("title", "narrative", :steps_for => :foo) do end - assignee = mock("assignee") - - assignee.should_receive(:use).with(steps) - story.assign_steps_to(assignee) - ensure - $rspec_story_steps = orig_rspec_story_steps - end - end - - it "should use the steps it is told to using multiple keys" do - begin - orig_rspec_story_steps = $rspec_story_steps - $rspec_story_steps = StepGroupHash.new - $rspec_story_steps[:foo] = foo_steps = Object.new - $rspec_story_steps[:bar] = bar_steps = Object.new - - story = Story.new("title", "narrative", :steps_for => [:foo, :bar]) do end - assignee = mock("assignee") - - assignee.should_receive(:use).with(foo_steps) - assignee.should_receive(:use).with(bar_steps) - story.assign_steps_to(assignee) - ensure - $rspec_story_steps = orig_rspec_story_steps - end - end - end - end -end diff --git a/vendor/plugins/rspec/spec/spec/story/world_spec.rb b/vendor/plugins/rspec/spec/spec/story/world_spec.rb deleted file mode 100644 index f5113dc42..000000000 --- a/vendor/plugins/rspec/spec/spec/story/world_spec.rb +++ /dev/null @@ -1,423 +0,0 @@ -require File.dirname(__FILE__) + '/story_helper' - -require 'spec/story' - -module Spec - module Story - describe World do - before :each do - World.listeners.clear - end - - after :each do - World.listeners.clear - World.step_mother.clear - end - - it 'should create an object that mixes in a World' do - # when - obj = World::create - - # then - obj.should be_kind_of(World) - end - - it 'should create a World from any object type' do - # when - obj = World::create String - - # then - obj.should be_kind_of(String) - obj.should be_kind_of(World) - end - - it 'should pass arguments to #new when creating an object of a specified type that mixes in a world' do - # given - Thing = Struct.new(:name, :age) - - # when - obj = World::create Thing, "David", "I'm not telling" - - # then - obj.should be_an_instance_of(Thing) - obj.name.should == "David" - obj.age.should == "I'm not telling" - obj.should be_kind_of(World) - end - - def ensure_world_executes_step(&block) - # given - obj = World::create - $step_ran = false - - # when - obj.instance_eval(&block) - - # then - $step_ran.should be_true - end - - it 'should execute a Given, When or Then step' do - ensure_world_executes_step do - Given 'a given' do - $step_ran = true - end - end - - ensure_world_executes_step do - When 'an event' do - $step_ran = true - end - end - - ensure_world_executes_step do - Then 'an outcome' do - $step_ran = true - end - end - end - - it 'should interpret Given... And... as multiple givens' do - # given - world = World.create - $steps = [] - - # when - world.instance_eval do - Given 'step 1' do - $steps << 1 - end - And 'step 2' do - $steps << 2 - end - end - - # then - $steps.should == [1,2] - World.step_mother.find(:given, 'step 1').should_not be_nil - World.step_mother.find(:given, 'step 2').should_not be_nil - end - - it 'should interpret When... And... as multiple events' do - # given - world = World.create - $steps = [] - - # when - world.instance_eval do - When 'step 1' do - $steps << 1 - end - And 'step 2' do - $steps << 2 - end - end - - # then - $steps.should == [1,2] - World.step_mother.find(:when, 'step 1').should_not be_nil - World.step_mother.find(:when, 'step 2').should_not be_nil - end - - it 'should interpret Then... And... as multiple outcomes' do - # given - world = World.create - $steps = [] - - # when - world.instance_eval do - Then 'step 1' do - $steps << 1 - end - And 'step 2' do - $steps << 2 - end - end - - # then - $steps.should == [1,2] - World.step_mother.find(:then, 'step 1').should_not be_nil - World.step_mother.find(:then, 'step 2').should_not be_nil - end - - it 'should reuse a given across scenarios' do - # given - $num_invoked = 0 - a_world = World::create - a_world.instance_eval do - Given 'a given' do - $num_invoked += 1 - end - end - another_world = World::create - - # when - another_world.instance_eval do - Given 'a given' # without a body - end - - # then - $num_invoked.should == 2 - end - - it 'should reuse an event across scenarios' do - # given - $num_invoked = 0 - a_world = World::create - a_world.instance_eval do - When 'an event' do - $num_invoked += 1 - end - end - - another_world = World::create - - # when - another_world.instance_eval do - When 'an event' # without a body - end - - # then - $num_invoked.should == 2 - end - - it 'should reuse an outcome across scenarios' do - # given - $num_invoked = 0 - a_world = World::create - a_world.instance_eval do - Then 'an outcome' do - $num_invoked += 1 - end - end - - another_world = World::create - - # when - another_world.instance_eval do - Then 'an outcome' # without a body - end - - # then - $num_invoked.should == 2 - end - - it 'should preserve instance variables between steps within a scenario' do - # given - world = World::create - $first = nil - $second = nil - - # when - world.instance_eval do - Given 'given' do - @first = 'first' - end - When 'event' do - @second = @first # from given - end - Then 'outcome' do - $first = @first # from given - $second = @second # from event - end - end - - # then - $first.should == 'first' - $second.should == 'first' - end - - it 'should invoke a reused step in the new object instance' do - # given - $instances = [] - $debug = true - world1 = World.create - world1.instance_eval do - Given 'a given' do - $instances << self.__id__ - end - end - world2 = World.create - - # when - world2.instance_eval do - Given 'a given' # reused - Then 'an outcome' do - $instances << __id__ - end - end - $debug = false - # then - $instances.should == [ world1.__id__, world2.__id__, world2.__id__ ] - end - - def ensure_world_collects_error(expected_error, &block) - # given - world = World.create - # $error = nil - - # when - world.start_collecting_errors - world.instance_eval(&block) - - # then - world.should have(1).errors - world.errors[0].should be_kind_of(expected_error) - end - - it 'should collect a failure from a Given step' do - ensure_world_collects_error RuntimeError do - Given 'a given' do - raise RuntimeError, "oops" - end - end - end - - it 'should collect a failure from a When step' do - ensure_world_collects_error RuntimeError do - When 'an event' do - raise RuntimeError, "oops" - end - end - end - - it 'should collect a failure from a Then step' do - ensure_world_collects_error RuntimeError do - Then 'an outcome' do - raise RuntimeError, "oops" - end - end - end - - it 'should inform listeners when it runs a Given, When or Then step' do - # given - world = World.create - mock_listener1 = mock('listener1') - mock_listener2 = mock('listener2') - World.add_listener(mock_listener1) - World.add_listener(mock_listener2) - - # expect - mock_listener1.should_receive(:step_upcoming).with(:given, 'a context') - mock_listener1.should_receive(:step_succeeded).with(:given, 'a context') - mock_listener1.should_receive(:step_upcoming).with(:when, 'an event') - mock_listener1.should_receive(:step_succeeded).with(:when, 'an event') - mock_listener1.should_receive(:step_upcoming).with(:then, 'an outcome') - mock_listener1.should_receive(:step_succeeded).with(:then, 'an outcome') - - mock_listener2.should_receive(:step_upcoming).with(:given, 'a context') - mock_listener2.should_receive(:step_succeeded).with(:given, 'a context') - mock_listener2.should_receive(:step_upcoming).with(:when, 'an event') - mock_listener2.should_receive(:step_succeeded).with(:when, 'an event') - mock_listener2.should_receive(:step_upcoming).with(:then, 'an outcome') - mock_listener2.should_receive(:step_succeeded).with(:then, 'an outcome') - - # when - world.instance_eval do - Given 'a context' do end - When 'an event' do end - Then 'an outcome' do end - end - - # then - end - - it 'should tell listeners but not execute the step in dry-run mode' do - # given - Runner.stub!(:dry_run).and_return(true) - mock_listener = mock('listener') - World.add_listener(mock_listener) - $step_invoked = false - world = World.create - - # expect - mock_listener.should_receive(:step_upcoming).with(:given, 'a context') - mock_listener.should_receive(:step_succeeded).with(:given, 'a context') - - # when - world.instance_eval do - Given 'a context' do - $step_invoked = true - end - end - - # then - $step_invoked.should be(false) - end - - it 'should suppress listeners while it runs a GivenScenario' do - # given - $scenario_ran = false - - scenario = ScenarioBuilder.new.name('a scenario').to_scenario do - $scenario_ran = true - Given 'given' do end - When 'event' do end - Then 'outcome' do end - end - - given_scenario = GivenScenario.new('a scenario') - Runner::StoryRunner.should_receive(:scenario_from_current_story). - with('a scenario').and_return(scenario) - - world = World.create - listener = mock('listener') - World.add_listener(listener) - - # expect - listener.should_receive(:found_scenario).with(:'given scenario', 'a scenario') - listener.should_receive(:step_succeeded).never.with(:given, 'given') - listener.should_receive(:step_succeeded).never.with(:when, 'event') - listener.should_receive(:step_succeeded).never.with(:then, 'outcome') - - # when - world.GivenScenario 'a scenario' - - # then - $scenario_ran.should be_true - end - - it 'should interpret GivenScenario... And... as multiple givens' do - # given - world = World.create - $steps = [] - - scenario = ScenarioBuilder.new.name('a scenario').to_scenario do - $steps << 1 - end - Runner::StoryRunner.should_receive(:scenario_from_current_story). - with('a scenario').and_return(scenario) - - # when - world.instance_eval do - GivenScenario 'a scenario' - And 'step 2' do - $steps << 2 - end - end - - # then - $steps.should == [1,2] - World.step_mother.find(:given, 'step 2').should_not be_nil - end - - it 'should provide rspec matchers' do - # given - world = World.create - - # then - world.instance_eval do - 'hello'.should match(/^hello$/) - end - end - - it "should use assigned matchers" do - world = World.create - - World.should_receive(:use).with(steps = Object.new) - - World.use(steps) - end - end - end -end diff --git a/vendor/plugins/rspec/spec/spec/translator_spec.rb b/vendor/plugins/rspec/spec/spec/translator_spec.rb deleted file mode 100644 index 01293d9ee..000000000 --- a/vendor/plugins/rspec/spec/spec/translator_spec.rb +++ /dev/null @@ -1,265 +0,0 @@ -require File.dirname(__FILE__) + '/../spec_helper.rb' -require 'spec/translator' - -describe "Translator" do - before do - @t = Spec::Translator.new - end - - it "should translate files" do - from = File.dirname(__FILE__) + '/..' - to = "#{Dir.tmpdir}/translated_specs" - @t.translate_dir(from, to) - end - - it "should translate context_setup do" do - @t.translate_line( - "context_setup do\n" - ).should eql( - "before(:all) do\n" - ) - end - - it "should translate context_setup {foo}" do - @t.translate_line( - "context_setup {foo}\n" - ).should eql( - "before(:all) {foo}\n" - ) - end - - it "should translate context ' to describe '" do - @t.translate_line( - "context 'Translator' do\n" - ).should eql( - "describe 'Translator' do\n" - ) - end - - it 'should translate context " to describe "' do - @t.translate_line( - 'context "Translator"' - ).should eql( - 'describe "Translator"' - ) - end - - it 'should translate spaces then context " to describe "' do - @t.translate_line( - ' context "Translator"' - ).should eql( - ' describe "Translator"' - ) - end - - it "should not translate context=foo" do - @t.translate_line(' context=foo').should eql(' context=foo') - end - - it "should not translate context = foo" do - @t.translate_line(' context = foo').should eql(' context = foo') - end - - it "should not translate context = foo" do - @t.translate_line(' context = foo').should eql(' context = foo') - end - - it "should translate should_be_close" do - @t.translate_line('5.0.should_be_close(5.0, 0.5)').should eql('5.0.should be_close(5.0, 0.5)') - end - - it "should translate should_not_raise" do - @t.translate_line('lambda { self.call }.should_not_raise').should eql('lambda { self.call }.should_not raise_error') - end - - it "should translate should_throw" do - @t.translate_line('lambda { self.call }.should_throw').should eql('lambda { self.call }.should throw_symbol') - end - - it "should not translate 0.9 should_not" do - @t.translate_line('@target.should_not @matcher').should eql('@target.should_not @matcher') - end - - it "should leave should_not_receive" do - @t.translate_line('@mock.should_not_receive(:not_expected).with("unexpected text")').should eql('@mock.should_not_receive(:not_expected).with("unexpected text")') - end - - it "should leave should_receive" do - @t.translate_line('@mock.should_receive(:not_expected).with("unexpected text")').should eql('@mock.should_receive(:not_expected).with("unexpected text")') - end - - it "should translate multi word predicates" do - @t.translate_line('foo.should_multi_word_predicate').should eql('foo.should be_multi_word_predicate') - end - - it "should translate multi word predicates prefixed with be" do - @t.translate_line('foo.should_be_multi_word_predicate').should eql('foo.should be_multi_word_predicate') - end - - it "should translate be(expected) to equal(expected)" do - @t.translate_line('foo.should_be :cool').should eql('foo.should equal :cool') - end - - it "should translate instance_of" do - @t.translate_line('5.should_be_an_instance_of(Integer)').should eql('5.should be_an_instance_of(Integer)') - end - - it "should translate should_be <" do - @t.translate_line('3.should_be < 4').should eql('3.should be < 4') - end - - it "should translate should_be <=" do - @t.translate_line('3.should_be <= 4').should eql('3.should be <= 4') - end - - it "should translate should_be >=" do - @t.translate_line('4.should_be >= 3').should eql('4.should be >= 3') - end - - it "should translate should_be >" do - @t.translate_line('4.should_be > 3').should eql('4.should be > 3') - end - - it "should translate should_be_happy" do - @t.translate_line("4.should_be_happy").should eql("4.should be_happy") - end - - it "should translate custom method taking regexp with parenthesis" do - @t.translate_line("@browser.should_contain_text(/Sn.rrunger og annet rusk/)").should eql("@browser.should be_contain_text(/Sn.rrunger og annet rusk/)") - end - - it "should translate custom method taking regexp without parenthesis" do - @t.translate_line("@browser.should_contain_text /Sn.rrunger og annet rusk/\n").should eql("@browser.should be_contain_text(/Sn.rrunger og annet rusk/)\n") - end - - it "should translate should_not_be_nil" do - @t.translate_line("foo.should_not_be_nil\n").should eql("foo.should_not be_nil\n") - end - - it "should translate kind of" do - @t.translate_line('@object.should_be_kind_of(MessageExpectation)').should( - eql('@object.should be_kind_of(MessageExpectation)')) - end - - it "should translate should_be_true" do - @t.translate_line("foo.should_be_true\n").should eql("foo.should be_true\n") - end - - # [#9674] spec_translate incorrectly handling shoud_match, when regexp in a var, in a block - # http://rubyforge.org/tracker/?func=detail&atid=3149&aid=9674&group_id=797 - it "should translate should_match on a regexp, in a var, in a block" do - @t.translate_line("collection.each { |c| c.should_match a_regexp_in_a_var }\n").should eql("collection.each { |c| c.should match(a_regexp_in_a_var) }\n") - @t.translate_line("collection.each{|c| c.should_match a_regexp_in_a_var}\n").should eql("collection.each{|c| c.should match(a_regexp_in_a_var) }\n") - end - - # From Rubinius specs - it "should translate close_to without parens" do - @t.translate_line("end.should_be_close 3.14159_26535_89793_23846, TOLERANCE\n").should eql("end.should be_close(3.14159_26535_89793_23846, TOLERANCE)\n") - end - - # [#9882] 0.9 Beta 1 - translator bugs - # http://rubyforge.org/tracker/index.php?func=detail&aid=9882&group_id=797&atid=3149 - it "should support symbol arguments" do - @t.translate_line( - "lambda { sequence.parse('bar') }.should_throw :ZeroWidthParseSuccess\n" - ).should eql( - "lambda { sequence.parse('bar') }.should throw_symbol(:ZeroWidthParseSuccess)\n" - ) - end - - # [#9882] 0.9 Beta 1 - translator bugs - # http://rubyforge.org/tracker/index.php?func=detail&aid=9882&group_id=797&atid=3149 - it "should support instance var arguments" do - @t.translate_line( - "a.should_eql @local" - ).should eql( - "a.should eql(@local)" - ) - end - - # [#9882] 0.9 Beta 1 - translator bugs - # http://rubyforge.org/tracker/index.php?func=detail&aid=9882&group_id=797&atid=3149 - it "should support lambdas as expecteds" do - @t.translate_line( - "@parslet.should_not_eql lambda { nil }.to_parseable" - ).should eql( - "@parslet.should_not eql(lambda { nil }.to_parseable)" - ) - end - - # [#9882] 0.9 Beta 1 - translator bugs - # http://rubyforge.org/tracker/index.php?func=detail&aid=9882&group_id=797&atid=3149 - it "should support fully qualified names" do - @t.translate_line( - "results.should_be_kind_of SimpleASTLanguage::Identifier" - ).should eql( - "results.should be_kind_of(SimpleASTLanguage::Identifier)" - ) - end - - # [#9882] 0.9 Beta 1 - translator bugs - # http://rubyforge.org/tracker/index.php?func=detail&aid=9882&group_id=797&atid=3149 - # it "should leave whitespace between expression and comments" do - # @t.translate_line( - # "lambda { @instance.foo = foo }.should_raise NoMethodError # no writer defined" - # ).should eql( - # "lambda { @instance.foo = foo }.should raise_error(NoMethodError) # no writer defined" - # ) - # end - - it "should translate redirects" do - @t.translate_line( - "controller.should_redirect_to 'http://not_existing_domain_for_novalis.test.host/404.html'" - ).should eql( - "controller.should redirect_to('http://not_existing_domain_for_novalis.test.host/404.html')" - ) - end - - it "should translate :any_args" do - @t.translate_line( - "mock.should_receive(:foo).with(:any_args)" - ).should eql( - "mock.should_receive(:foo).with(any_args)" - ) - end - - it "should translate :anything" do - @t.translate_line( - "mock.should_receive(:foo).with(:anything)" - ).should eql( - "mock.should_receive(:foo).with(anything)" - ) - end - - it "should translate :boolean" do - @t.translate_line( - "mock.should_receive(:foo).with(:boolean)" - ).should eql( - "mock.should_receive(:foo).with(boolean)" - ) - end - - it "should translate :no_args" do - @t.translate_line( - "mock.should_receive(:foo).with(:no_args)" - ).should eql( - "mock.should_receive(:foo).with(no_args)" - ) - end - - it "should translate :numeric" do - @t.translate_line( - "mock.should_receive(:foo).with(:numeric)" - ).should eql( - "mock.should_receive(:foo).with(an_instance_of(Numeric))" - ) - end - - it "should translate :string" do - @t.translate_line( - "mock.should_receive(:foo).with(:string)" - ).should eql( - "mock.should_receive(:foo).with(an_instance_of(String))" - ) - end -end diff --git a/vendor/plugins/rspec/spec/spec_helper.rb b/vendor/plugins/rspec/spec/spec_helper.rb index 1318176d5..3cffe875d 100644 --- a/vendor/plugins/rspec/spec/spec_helper.rb +++ b/vendor/plugins/rspec/spec/spec_helper.rb @@ -1,18 +1,24 @@ require 'stringio' -dir = File.dirname(__FILE__) -lib_path = File.expand_path("#{dir}/../lib") -$LOAD_PATH.unshift lib_path unless $LOAD_PATH.include?(lib_path) $_spec_spec = true # Prevents Kernel.exit in various places require 'spec' require 'spec/mocks' -require 'spec/story' -spec_classes_path = File.expand_path("#{dir}/../spec/spec/spec_classes") -require spec_classes_path unless $LOAD_PATH.include?(spec_classes_path) -require File.dirname(__FILE__) + '/../lib/spec/expectations/differs/default' +require 'spec/runner/differs/default' +require 'spec/autorun' + +require 'support/spec_classes' +require 'support/macros' + +def jruby? + ::RUBY_PLATFORM == 'java' +end + +module Spec + module Example + class NonStandardError < Exception; end + end -module Spec module Matchers def fail raise_error(Spec::Expectations::ExpectationNotMetError) @@ -22,82 +28,85 @@ module Spec raise_error(Spec::Expectations::ExpectationNotMetError, message) end - class Pass - def matches?(proc, &block) - begin - proc.call - true - rescue Exception => @error - false - end - end - - def failure_message - @error.message + "\n" + @error.backtrace.join("\n") + def exception_from(&block) + exception = nil + begin + yield + rescue StandardError => e + exception = e end - end - - def pass - Pass.new + exception end - class CorrectlyOrderedMockExpectation - def initialize(&event) - @event = event - end - - def expect(&expectations) - expectations.call - @event.call - end - end - - def during(&block) - CorrectlyOrderedMockExpectation.new(&block) - end - end -end - -class NonStandardError < Exception; end - -module Custom - class ExampleGroupRunner - attr_reader :options, :arg - def initialize(options, arg) - @options, @arg = options, arg + def run_with(options) + ::Spec::Runner::CommandLine.run(options) end - def load_files(files) + def with_ruby(version) + yield if RUBY_VERSION =~ Regexp.compile("^#{version.to_s}") end - - def run - end - end -end - -def exception_from(&block) - exception = nil - begin - yield - rescue StandardError => e - exception = e end - exception end -describe "sandboxed rspec_options", :shared => true do +def with_sandboxed_options attr_reader :options + + before(:each) do + @original_rspec_options = ::Spec::Runner.options + ::Spec::Runner.use(@options = ::Spec::Runner::Options.new(StringIO.new, StringIO.new)) + end - before(:all) do - @original_rspec_options = $rspec_options + after(:each) do + ::Spec::Runner.use(@original_rspec_options) end + + yield +end +def with_sandboxed_config + attr_reader :config + before(:each) do - @options = ::Spec::Runner::Options.new(StringIO.new, StringIO.new) - $rspec_options = options + @config = ::Spec::Runner::Configuration.new + @original_configuration = ::Spec::Runner.configuration + spec_configuration = @config + ::Spec::Runner.instance_eval {@configuration = spec_configuration} end + + after(:each) do + original_configuration = @original_configuration + ::Spec::Runner.instance_eval {@configuration = original_configuration} + ::Spec::Example::ExampleGroupFactory.reset + end + + yield +end - after do - $rspec_options = @original_rspec_options +module Spec + module Example + module Resettable + def reset # :nodoc: + @before_all_parts = nil + @after_all_parts = nil + @before_each_parts = nil + @after_each_parts = nil + end + end + class ExampleGroup + extend Resettable + end + class ExampleGroupDouble < ExampleGroup + ::Spec::Runner.options.remove_example_group self + def register_example_group(klass) + #ignore + end + def initialize(proxy=nil, &block) + super(proxy || ExampleProxy.new, &block) + end + end end +end + +Spec::Runner.configure do |config| + config.extend(Macros) end
\ No newline at end of file diff --git a/vendor/plugins/rspec/stories/all.rb b/vendor/plugins/rspec/stories/all.rb deleted file mode 100644 index 83f557032..000000000 --- a/vendor/plugins/rspec/stories/all.rb +++ /dev/null @@ -1,5 +0,0 @@ -require File.join(File.dirname(__FILE__), *%w[helper]) - -%w[example_groups interop mock_framework_integration].each do |dir| - require File.join(File.dirname(__FILE__), "#{dir}/stories") -end diff --git a/vendor/plugins/rspec/stories/example_groups/autogenerated_docstrings b/vendor/plugins/rspec/stories/example_groups/autogenerated_docstrings deleted file mode 100644 index b3ff68998..000000000 --- a/vendor/plugins/rspec/stories/example_groups/autogenerated_docstrings +++ /dev/null @@ -1,45 +0,0 @@ -Story: autogenerated docstrings - - As an RSpec user - I want examples to generate their own names - So that I can reduce duplication between example names and example code - - Scenario: run passing examples with ruby - Given the file ../../examples/pure/autogenerated_docstrings_example.rb - - When I run it with the ruby interpreter -fs - - Then the stdout should match /should equal 5/ - And the stdout should match /should be < 5/ - And the stdout should match /should include "a"/ - And the stdout should match /should respond to #size/ - - Scenario: run failing examples with ruby - Given the file ../../failing_examples/failing_autogenerated_docstrings_example.rb - - When I run it with the ruby interpreter -fs - - Then the stdout should match /should equal 2/ - And the stdout should match /should be > 5/ - And the stdout should match /should include "b"/ - And the stdout should match /should not respond to #size/ - - Scenario: run passing examples with spec - Given the file ../../examples/pure/autogenerated_docstrings_example.rb - - When I run it with the spec script -fs - - Then the stdout should match /should equal 5/ - And the stdout should match /should be < 5/ - And the stdout should match /should include "a"/ - And the stdout should match /should respond to #size/ - - Scenario: run failing examples with spec - Given the file ../../failing_examples/failing_autogenerated_docstrings_example.rb - - When I run it with the spec script -fs - - Then the stdout should match /should equal 2/ - And the stdout should match /should be > 5/ - And the stdout should match /should include "b"/ - And the stdout should match /should not respond to #size/ diff --git a/vendor/plugins/rspec/stories/example_groups/example_group_with_should_methods b/vendor/plugins/rspec/stories/example_groups/example_group_with_should_methods deleted file mode 100644 index 3d2bc61eb..000000000 --- a/vendor/plugins/rspec/stories/example_groups/example_group_with_should_methods +++ /dev/null @@ -1,17 +0,0 @@ -Story: Spec::ExampleGroup with should methods - - As an RSpec adopter accustomed to classes and methods - I want to use should_* methods in an ExampleGroup - So that I use RSpec with classes and methods that look more like RSpec examples - - Scenario: Run with ruby - Given the file spec/example_group_with_should_methods.rb - When I run it with the ruby interpreter - Then the exit code should be 256 - And the stdout should match "2 examples, 1 failure" - - Scenario: Run with spec - Given the file spec/example_group_with_should_methods.rb - When I run it with the spec script - Then the exit code should be 256 - And the stdout should match "2 examples, 1 failure" diff --git a/vendor/plugins/rspec/stories/example_groups/nested_groups b/vendor/plugins/rspec/stories/example_groups/nested_groups deleted file mode 100644 index ede978563..000000000 --- a/vendor/plugins/rspec/stories/example_groups/nested_groups +++ /dev/null @@ -1,17 +0,0 @@ -Story: Nested example groups - - As an RSpec user - I want to nest examples groups - So that I can better organize my examples - - Scenario: Run with ruby - Given the file ../../examples/pure/stack_spec_with_nested_example_groups.rb - When I run it with the ruby interpreter -fs - Then the stdout should match /Stack \(empty\)/ - And the stdout should match /Stack \(full\)/ - - Scenario: Run with ruby - Given the file ../../examples/pure/stack_spec_with_nested_example_groups.rb - When I run it with the spec script -fs - Then the stdout should match /Stack \(empty\)/ - And the stdout should match /Stack \(full\)/ diff --git a/vendor/plugins/rspec/stories/example_groups/output b/vendor/plugins/rspec/stories/example_groups/output deleted file mode 100644 index 4947bdcaf..000000000 --- a/vendor/plugins/rspec/stories/example_groups/output +++ /dev/null @@ -1,25 +0,0 @@ -Story: Getting correct output - - As an RSpec user - I want to see output only once - So that I don't get confused - - Scenario: Run with ruby - Given the file spec/simple_spec.rb - When I run it with the ruby interpreter - Then the exit code should be 0 - And the stdout should not match /\d+ tests, \d+ assertions, \d+ failures, \d+ errors/m - And the stdout should match "1 example, 0 failures" - - Scenario: Run with CommandLine object - Given the file spec/simple_spec.rb - When I run it with the CommandLine object - Then the exit code should be 0 - And the stdout should not match "Loaded suite" - And the stdout should not match /\d+ tests, \d+ assertions, \d+ failures, \d+ errors/m - And the stdout should match "1 example, 0 failures" - - Scenario: Tweak backtrace - Given the file stories/failing_story.rb - When I run it with the ruby interpreter - Then the stdout should not match /\/lib\/spec\// diff --git a/vendor/plugins/rspec/stories/example_groups/stories.rb b/vendor/plugins/rspec/stories/example_groups/stories.rb deleted file mode 100644 index 2def16b86..000000000 --- a/vendor/plugins/rspec/stories/example_groups/stories.rb +++ /dev/null @@ -1,8 +0,0 @@ -require File.join(File.dirname(__FILE__), *%w[.. helper]) - -with_steps_for :running_rspec do - run File.dirname(__FILE__) + "/nested_groups" - # Dir["#{File.dirname(__FILE__)}/*"].each do |file| - # run file if File.file?(file) && !(file =~ /\.rb$/) - # end -end
\ No newline at end of file diff --git a/vendor/plugins/rspec/stories/helper.rb b/vendor/plugins/rspec/stories/helper.rb deleted file mode 100644 index d9a105e76..000000000 --- a/vendor/plugins/rspec/stories/helper.rb +++ /dev/null @@ -1,6 +0,0 @@ -$LOAD_PATH.unshift File.expand_path("#{File.dirname(__FILE__)}/../lib") -require 'spec' -require 'tempfile' -require File.join(File.dirname(__FILE__), *%w[resources matchers smart_match]) -require File.join(File.dirname(__FILE__), *%w[resources helpers story_helper]) -require File.join(File.dirname(__FILE__), *%w[resources steps running_rspec]) diff --git a/vendor/plugins/rspec/stories/interop/examples_and_tests_together b/vendor/plugins/rspec/stories/interop/examples_and_tests_together deleted file mode 100644 index 6583f89c6..000000000 --- a/vendor/plugins/rspec/stories/interop/examples_and_tests_together +++ /dev/null @@ -1,30 +0,0 @@ -Story: Spec and test together - - As an RSpec adopter with existing Test::Unit tests - I want to run a few specs alongside my existing Test::Unit tests - So that I can experience a smooth, gradual migration path - - Scenario: Run with ruby - Given the file test/spec_and_test_together.rb - - When I run it with the ruby interpreter -fs - - Then the exit code should be 256 - And the stdout should match "ATest" - And the stdout should match "Test::Unit::AssertionFailedError in 'An Example should fail with assert'" - And the stdout should match "'An Example should fail with should' FAILED" - And the stdout should match "10 examples, 6 failures" - And the stdout should match /expected: 40,\s*got: 4/m - And the stdout should match /expected: 50,\s*got: 5/m - Scenario: Run with spec - Given the file test/spec_and_test_together.rb - - When I run it with the spec script -fs - - Then the exit code should be 256 - Ands the stdout should match "ATest" - And the stdout should match "Test::Unit::AssertionFailedError in 'An Example should fail with assert'" - And the stdout should match "'An Example should fail with should' FAILED" - And the stdout should match "10 examples, 6 failures" - And the stdout should match /expected: 40,\s*got: 4/m - And the stdout should match /expected: 50,\s*got: 5/m diff --git a/vendor/plugins/rspec/stories/interop/stories.rb b/vendor/plugins/rspec/stories/interop/stories.rb deleted file mode 100644 index e45882a93..000000000 --- a/vendor/plugins/rspec/stories/interop/stories.rb +++ /dev/null @@ -1,7 +0,0 @@ -require File.join(File.dirname(__FILE__), *%w[.. helper]) - -with_steps_for :running_rspec do - Dir["#{File.dirname(__FILE__)}/*"].each do |file| - run file if File.file?(file) && !(file =~ /\.rb$/) - end -end
\ No newline at end of file diff --git a/vendor/plugins/rspec/stories/interop/test_case_with_should_methods b/vendor/plugins/rspec/stories/interop/test_case_with_should_methods deleted file mode 100644 index d618c50e2..000000000 --- a/vendor/plugins/rspec/stories/interop/test_case_with_should_methods +++ /dev/null @@ -1,17 +0,0 @@ -Story: Test::Unit::TestCase extended by rspec with should methods - - As an RSpec adopter with existing Test::Unit tests - I want to use should_* methods in a Test::Unit::TestCase - So that I use RSpec with classes and methods that look more like RSpec examples - - Scenario: Run with ruby - Given the file test/test_case_with_should_methods.rb - When I run it with the ruby interpreter - Then the exit code should be 256 - And the stdout should match "5 examples, 3 failures" - - Scenario: Run with spec - Given the file test/test_case_with_should_methods.rb - When I run it with the spec script - Then the exit code should be 256 - And the stdout should match "5 examples, 3 failures" diff --git a/vendor/plugins/rspec/stories/mock_framework_integration/stories.rb b/vendor/plugins/rspec/stories/mock_framework_integration/stories.rb deleted file mode 100644 index e45882a93..000000000 --- a/vendor/plugins/rspec/stories/mock_framework_integration/stories.rb +++ /dev/null @@ -1,7 +0,0 @@ -require File.join(File.dirname(__FILE__), *%w[.. helper]) - -with_steps_for :running_rspec do - Dir["#{File.dirname(__FILE__)}/*"].each do |file| - run file if File.file?(file) && !(file =~ /\.rb$/) - end -end
\ No newline at end of file diff --git a/vendor/plugins/rspec/stories/mock_framework_integration/use_flexmock.story b/vendor/plugins/rspec/stories/mock_framework_integration/use_flexmock.story deleted file mode 100644 index 083531067..000000000 --- a/vendor/plugins/rspec/stories/mock_framework_integration/use_flexmock.story +++ /dev/null @@ -1,9 +0,0 @@ -Story: Getting correct output - - As an RSpec user who prefers flexmock - I want to be able to use flexmock without rspec mocks interfering - - Scenario: Mock with flexmock - Given the file spec/spec_with_flexmock.rb - When I run it with the ruby interpreter - Then the exit code should be 0
\ No newline at end of file diff --git a/vendor/plugins/rspec/stories/pending_stories/README b/vendor/plugins/rspec/stories/pending_stories/README deleted file mode 100644 index 2f9b44314..000000000 --- a/vendor/plugins/rspec/stories/pending_stories/README +++ /dev/null @@ -1,3 +0,0 @@ -This directory contains stories that are currently not passing -because they are new or they represent regressions. - diff --git a/vendor/plugins/rspec/stories/resources/helpers/cmdline.rb b/vendor/plugins/rspec/stories/resources/helpers/cmdline.rb deleted file mode 100644 index ab86bd3e1..000000000 --- a/vendor/plugins/rspec/stories/resources/helpers/cmdline.rb +++ /dev/null @@ -1,9 +0,0 @@ -$:.push File.join(File.dirname(__FILE__), *%w[.. .. .. lib]) -require 'spec' - -# Uncommenting next line will break the output story (no output!!) -# rspec_options -options = Spec::Runner::OptionParser.parse( - ARGV, $stderr, $stdout -) -Spec::Runner::CommandLine.run(options) diff --git a/vendor/plugins/rspec/stories/resources/helpers/story_helper.rb b/vendor/plugins/rspec/stories/resources/helpers/story_helper.rb deleted file mode 100644 index e0aef5b45..000000000 --- a/vendor/plugins/rspec/stories/resources/helpers/story_helper.rb +++ /dev/null @@ -1,16 +0,0 @@ -require 'spec/story' -require File.dirname(__FILE__) + '/../../../spec/ruby_forker' - -module StoryHelper - include RubyForker - - def spec(args, stderr) - ruby("#{File.dirname(__FILE__) + '/../../../bin/spec'} #{args}", stderr) - end - - def cmdline(args, stderr) - ruby("#{File.dirname(__FILE__) + '/../../resources/helpers/cmdline.rb'} #{args}", stderr) - end - - Spec::Story::World.send :include, self -end diff --git a/vendor/plugins/rspec/stories/resources/matchers/smart_match.rb b/vendor/plugins/rspec/stories/resources/matchers/smart_match.rb deleted file mode 100644 index 7b1672bc0..000000000 --- a/vendor/plugins/rspec/stories/resources/matchers/smart_match.rb +++ /dev/null @@ -1,37 +0,0 @@ -module Spec - module Matchers - class SmartMatch - def initialize(expected) - @expected = expected - end - - def matches?(actual) - @actual = actual - # Satisfy expectation here. Return false or raise an error if it's not met. - - if @expected =~ /^\/.*\/?$/ || @expected =~ /^".*"$/ - regex_or_string = eval(@expected) - if Regexp === regex_or_string - (@actual =~ regex_or_string) ? true : false - else - @actual.index(regex_or_string) != nil - end - else - false - end - end - - def failure_message - "expected #{@actual.inspect} to smart_match #{@expected.inspect}, but it didn't" - end - - def negative_failure_message - "expected #{@actual.inspect} not to smart_match #{@expected.inspect}, but it did" - end - end - - def smart_match(expected) - SmartMatch.new(expected) - end - end -end
\ No newline at end of file diff --git a/vendor/plugins/rspec/stories/resources/spec/example_group_with_should_methods.rb b/vendor/plugins/rspec/stories/resources/spec/example_group_with_should_methods.rb deleted file mode 100644 index 4c0505d2a..000000000 --- a/vendor/plugins/rspec/stories/resources/spec/example_group_with_should_methods.rb +++ /dev/null @@ -1,12 +0,0 @@ -$:.push File.join(File.dirname(__FILE__), *%w[.. .. .. lib]) -require 'spec' - -class MySpec < Spec::ExampleGroup - def should_pass_with_should - 1.should == 1 - end - - def should_fail_with_should - 1.should == 2 - end -end
\ No newline at end of file diff --git a/vendor/plugins/rspec/stories/resources/spec/simple_spec.rb b/vendor/plugins/rspec/stories/resources/spec/simple_spec.rb deleted file mode 100644 index 2fb67ba49..000000000 --- a/vendor/plugins/rspec/stories/resources/spec/simple_spec.rb +++ /dev/null @@ -1,8 +0,0 @@ -$:.push File.join(File.dirname(__FILE__), *%w[.. .. .. lib]) -require 'spec' - -describe "Running an Example" do - it "should not output twice" do - true.should be_true - end -end
\ No newline at end of file diff --git a/vendor/plugins/rspec/stories/resources/spec/spec_with_flexmock.rb b/vendor/plugins/rspec/stories/resources/spec/spec_with_flexmock.rb deleted file mode 100644 index 629bef212..000000000 --- a/vendor/plugins/rspec/stories/resources/spec/spec_with_flexmock.rb +++ /dev/null @@ -1,18 +0,0 @@ -$:.push File.join(File.dirname(__FILE__), *%w[.. .. .. lib]) -require "rubygems" -require 'spec' - -Spec::Runner.configure do |config| - config.mock_with :flexmock -end - -# This is to ensure that requiring spec/mocks/framework doesn't interfere w/ flexmock -require 'spec/mocks/framework' - -describe "something" do - it "should receive some message" do - target = Object.new - flexmock(target).should_receive(:foo).once - lambda {flexmock_verify}.should raise_error - end -end
\ No newline at end of file diff --git a/vendor/plugins/rspec/stories/resources/steps/running_rspec.rb b/vendor/plugins/rspec/stories/resources/steps/running_rspec.rb deleted file mode 100644 index 496847fe4..000000000 --- a/vendor/plugins/rspec/stories/resources/steps/running_rspec.rb +++ /dev/null @@ -1,50 +0,0 @@ -steps_for :running_rspec do - - Given("the file $relative_path") do |relative_path| - @path = File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "resources", relative_path)) - unless File.exist?(@path) - raise "could not find file at #{@path}" - end - end - - When("I run it with the $interpreter") do |interpreter| - stderr_file = Tempfile.new('rspec') - stderr_file.close - @stdout = case(interpreter) - when /^ruby interpreter/ - args = interpreter.gsub('ruby interpreter','') - ruby("#{@path}#{args}", stderr_file.path) - when /^spec script/ - args = interpreter.gsub('spec script','') - spec("#{@path}#{args}", stderr_file.path) - when 'CommandLine object' then cmdline(@path, stderr_file.path) - else raise "Unknown interpreter: #{interpreter}" - end - @stderr = IO.read(stderr_file.path) - @exit_code = $?.to_i - end - - Then("the exit code should be $exit_code") do |exit_code| - if @exit_code != exit_code.to_i - raise "Did not exit with #{exit_code}, but with #{@exit_code}. Standard error:\n#{@stderr}" - end - end - - Then("the $stream should match $regex") do |stream, string_or_regex| - written = case(stream) - when 'stdout' then @stdout - when 'stderr' then @stderr - else raise "Unknown stream: #{stream}" - end - written.should smart_match(string_or_regex) - end - - Then("the $stream should not match $regex") do |stream, string_or_regex| - written = case(stream) - when 'stdout' then @stdout - when 'stderr' then @stderr - else raise "Unknown stream: #{stream}" - end - written.should_not smart_match(string_or_regex) - end -end diff --git a/vendor/plugins/rspec/stories/resources/stories/failing_story.rb b/vendor/plugins/rspec/stories/resources/stories/failing_story.rb deleted file mode 100644 index cc9506c66..000000000 --- a/vendor/plugins/rspec/stories/resources/stories/failing_story.rb +++ /dev/null @@ -1,15 +0,0 @@ -$:.push File.join(File.dirname(__FILE__), *%w[.. .. .. lib]) - -require 'spec/story' - -Story "Failing story", -%(As an RSpec user - I want a failing test - So that I can observe the output) do - - Scenario "Failing scenario" do - Then "true should be false" do - true.should == false - end - end -end diff --git a/vendor/plugins/rspec/stories/resources/test/spec_and_test_together.rb b/vendor/plugins/rspec/stories/resources/test/spec_and_test_together.rb deleted file mode 100644 index eb2b4e074..000000000 --- a/vendor/plugins/rspec/stories/resources/test/spec_and_test_together.rb +++ /dev/null @@ -1,57 +0,0 @@ -$:.push File.join(File.dirname(__FILE__), *%w[.. .. .. lib]) -require 'spec' -# TODO - this should not be necessary, ay? -require 'spec/interop/test' - -describe "An Example" do - it "should pass with assert" do - assert true - end - - it "should fail with assert" do - assert false - end - - it "should pass with should" do - 1.should == 1 - end - - it "should fail with should" do - 1.should == 2 - end -end - -class ATest < Test::Unit::TestCase - def test_should_pass_with_assert - assert true - end - - def test_should_fail_with_assert - assert false - end - - def test_should_pass_with_should - 1.should == 1 - end - - def test_should_fail_with_should - 1.should == 2 - end - - def setup - @from_setup ||= 3 - @from_setup += 1 - end - - def test_should_fail_with_setup_method_variable - @from_setup.should == 40 - end - - before do - @from_before = @from_setup + 1 - end - - def test_should_fail_with_before_block_variable - @from_before.should == 50 - end -end
\ No newline at end of file diff --git a/vendor/plugins/rspec/stories/resources/test/test_case_with_should_methods.rb b/vendor/plugins/rspec/stories/resources/test/test_case_with_should_methods.rb deleted file mode 100644 index 3912429e3..000000000 --- a/vendor/plugins/rspec/stories/resources/test/test_case_with_should_methods.rb +++ /dev/null @@ -1,30 +0,0 @@ -$:.push File.join(File.dirname(__FILE__), *%w[.. .. .. lib]) -require 'test/unit' -require 'spec' -require 'spec/interop/test' - -class MySpec < Test::Unit::TestCase - def should_pass_with_should - 1.should == 1 - end - - def should_fail_with_should - 1.should == 2 - end - - def should_pass_with_assert - assert true - end - - def should_fail_with_assert - assert false - end - - def test - raise "This is not a real test" - end - - def test_ify - raise "This is a real test" - end -end
\ No newline at end of file diff --git a/vendor/plugins/rspec/story_server/prototype/javascripts/builder.js b/vendor/plugins/rspec/story_server/prototype/javascripts/builder.js deleted file mode 100644 index 301087d14..000000000 --- a/vendor/plugins/rspec/story_server/prototype/javascripts/builder.js +++ /dev/null @@ -1,136 +0,0 @@ -// script.aculo.us builder.js v1.8.0_pre1, Fri Oct 12 21:34:51 +0200 2007 - -// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) -// -// script.aculo.us is freely distributable under the terms of an MIT-style license. -// For details, see the script.aculo.us web site: http://script.aculo.us/ - -var Builder = { - NODEMAP: { - AREA: 'map', - CAPTION: 'table', - COL: 'table', - COLGROUP: 'table', - LEGEND: 'fieldset', - OPTGROUP: 'select', - OPTION: 'select', - PARAM: 'object', - TBODY: 'table', - TD: 'table', - TFOOT: 'table', - TH: 'table', - THEAD: 'table', - TR: 'table' - }, - // note: For Firefox < 1.5, OPTION and OPTGROUP tags are currently broken, - // due to a Firefox bug - node: function(elementName) { - elementName = elementName.toUpperCase(); - - // try innerHTML approach - var parentTag = this.NODEMAP[elementName] || 'div'; - var parentElement = document.createElement(parentTag); - try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707 - parentElement.innerHTML = "<" + elementName + "></" + elementName + ">"; - } catch(e) {} - var element = parentElement.firstChild || null; - - // see if browser added wrapping tags - if(element && (element.tagName.toUpperCase() != elementName)) - element = element.getElementsByTagName(elementName)[0]; - - // fallback to createElement approach - if(!element) element = document.createElement(elementName); - - // abort if nothing could be created - if(!element) return; - - // attributes (or text) - if(arguments[1]) - if(this._isStringOrNumber(arguments[1]) || - (arguments[1] instanceof Array) || - arguments[1].tagName) { - this._children(element, arguments[1]); - } else { - var attrs = this._attributes(arguments[1]); - if(attrs.length) { - try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707 - parentElement.innerHTML = "<" +elementName + " " + - attrs + "></" + elementName + ">"; - } catch(e) {} - element = parentElement.firstChild || null; - // workaround firefox 1.0.X bug - if(!element) { - element = document.createElement(elementName); - for(attr in arguments[1]) - element[attr == 'class' ? 'className' : attr] = arguments[1][attr]; - } - if(element.tagName.toUpperCase() != elementName) - element = parentElement.getElementsByTagName(elementName)[0]; - } - } - - // text, or array of children - if(arguments[2]) - this._children(element, arguments[2]); - - return element; - }, - _text: function(text) { - return document.createTextNode(text); - }, - - ATTR_MAP: { - 'className': 'class', - 'htmlFor': 'for' - }, - - _attributes: function(attributes) { - var attrs = []; - for(attribute in attributes) - attrs.push((attribute in this.ATTR_MAP ? this.ATTR_MAP[attribute] : attribute) + - '="' + attributes[attribute].toString().escapeHTML().gsub(/"/,'"') + '"'); - return attrs.join(" "); - }, - _children: function(element, children) { - if(children.tagName) { - element.appendChild(children); - return; - } - if(typeof children=='object') { // array can hold nodes and text - children.flatten().each( function(e) { - if(typeof e=='object') - element.appendChild(e) - else - if(Builder._isStringOrNumber(e)) - element.appendChild(Builder._text(e)); - }); - } else - if(Builder._isStringOrNumber(children)) - element.appendChild(Builder._text(children)); - }, - _isStringOrNumber: function(param) { - return(typeof param=='string' || typeof param=='number'); - }, - build: function(html) { - var element = this.node('div'); - $(element).update(html.strip()); - return element.down(); - }, - dump: function(scope) { - if(typeof scope != 'object' && typeof scope != 'function') scope = window; //global scope - - var tags = ("A ABBR ACRONYM ADDRESS APPLET AREA B BASE BASEFONT BDO BIG BLOCKQUOTE BODY " + - "BR BUTTON CAPTION CENTER CITE CODE COL COLGROUP DD DEL DFN DIR DIV DL DT EM FIELDSET " + - "FONT FORM FRAME FRAMESET H1 H2 H3 H4 H5 H6 HEAD HR HTML I IFRAME IMG INPUT INS ISINDEX "+ - "KBD LABEL LEGEND LI LINK MAP MENU META NOFRAMES NOSCRIPT OBJECT OL OPTGROUP OPTION P "+ - "PARAM PRE Q S SAMP SCRIPT SELECT SMALL SPAN STRIKE STRONG STYLE SUB SUP TABLE TBODY TD "+ - "TEXTAREA TFOOT TH THEAD TITLE TR TT U UL VAR").split(/\s+/); - - tags.each( function(tag){ - scope[tag] = function() { - return Builder.node.apply(Builder, [tag].concat($A(arguments))); - } - }); - } -} diff --git a/vendor/plugins/rspec/story_server/prototype/javascripts/controls.js b/vendor/plugins/rspec/story_server/prototype/javascripts/controls.js deleted file mode 100644 index 9cbeae9c6..000000000 --- a/vendor/plugins/rspec/story_server/prototype/javascripts/controls.js +++ /dev/null @@ -1,972 +0,0 @@ -// script.aculo.us controls.js v1.8.0_pre1, Fri Oct 12 21:34:51 +0200 2007 - -// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) -// (c) 2005-2007 Ivan Krstic (http://blogs.law.harvard.edu/ivan) -// (c) 2005-2007 Jon Tirsen (http://www.tirsen.com) -// Contributors: -// Richard Livsey -// Rahul Bhargava -// Rob Wills -// -// script.aculo.us is freely distributable under the terms of an MIT-style license. -// For details, see the script.aculo.us web site: http://script.aculo.us/ - -// Autocompleter.Base handles all the autocompletion functionality -// that's independent of the data source for autocompletion. This -// includes drawing the autocompletion menu, observing keyboard -// and mouse events, and similar. -// -// Specific autocompleters need to provide, at the very least, -// a getUpdatedChoices function that will be invoked every time -// the text inside the monitored textbox changes. This method -// should get the text for which to provide autocompletion by -// invoking this.getToken(), NOT by directly accessing -// this.element.value. This is to allow incremental tokenized -// autocompletion. Specific auto-completion logic (AJAX, etc) -// belongs in getUpdatedChoices. -// -// Tokenized incremental autocompletion is enabled automatically -// when an autocompleter is instantiated with the 'tokens' option -// in the options parameter, e.g.: -// new Ajax.Autocompleter('id','upd', '/url/', { tokens: ',' }); -// will incrementally autocomplete with a comma as the token. -// Additionally, ',' in the above example can be replaced with -// a token array, e.g. { tokens: [',', '\n'] } which -// enables autocompletion on multiple tokens. This is most -// useful when one of the tokens is \n (a newline), as it -// allows smart autocompletion after linebreaks. -// -// vim:expandtab ts=8 sw=2 - -if(typeof Effect == 'undefined') - throw("controls.js requires including script.aculo.us' effects.js library"); - -var Autocompleter = { } -Autocompleter.Base = function() { }; -Autocompleter.Base.prototype = { - baseInitialize: function(element, update, options) { - element = $(element) - this.element = element; - this.update = $(update); - this.hasFocus = false; - this.changed = false; - this.active = false; - this.index = 0; - this.entryCount = 0; - this.oldElementValue = this.element.value; - - if(this.setOptions) - this.setOptions(options); - else - this.options = options || { }; - - this.options.paramName = this.options.paramName || this.element.name; - this.options.tokens = this.options.tokens || []; - this.options.frequency = this.options.frequency || 0.4; - this.options.minChars = this.options.minChars || 1; - this.options.onShow = this.options.onShow || - function(element, update){ - if(!update.style.position || update.style.position=='absolute') { - update.style.position = 'absolute'; - Position.clone(element, update, { - setHeight: false, - offsetTop: element.offsetHeight - }); - } - Effect.Appear(update,{duration:0.15}); - }; - this.options.onHide = this.options.onHide || - function(element, update){ new Effect.Fade(update,{duration:0.15}) }; - - if(typeof(this.options.tokens) == 'string') - this.options.tokens = new Array(this.options.tokens); - // Force carriage returns as token delimiters anyway - if (!this.options.tokens.include('\n')) - this.options.tokens.push('\n'); - - this.observer = null; - - this.element.setAttribute('autocomplete','off'); - - Element.hide(this.update); - - Event.observe(this.element, 'blur', this.onBlur.bindAsEventListener(this)); - Event.observe(this.element, 'keypress', this.onKeyPress.bindAsEventListener(this)); - }, - - show: function() { - if(Element.getStyle(this.update, 'display')=='none') this.options.onShow(this.element, this.update); - if(!this.iefix && - (Prototype.Browser.IE) && - (Element.getStyle(this.update, 'position')=='absolute')) { - new Insertion.After(this.update, - '<iframe id="' + this.update.id + '_iefix" '+ - 'style="display:none;position:absolute;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);" ' + - 'src="javascript:false;" frameborder="0" scrolling="no"></iframe>'); - this.iefix = $(this.update.id+'_iefix'); - } - if(this.iefix) setTimeout(this.fixIEOverlapping.bind(this), 50); - }, - - fixIEOverlapping: function() { - Position.clone(this.update, this.iefix, {setTop:(!this.update.style.height)}); - this.iefix.style.zIndex = 1; - this.update.style.zIndex = 2; - Element.show(this.iefix); - }, - - hide: function() { - this.stopIndicator(); - if(Element.getStyle(this.update, 'display')!='none') this.options.onHide(this.element, this.update); - if(this.iefix) Element.hide(this.iefix); - }, - - startIndicator: function() { - if(this.options.indicator) Element.show(this.options.indicator); - }, - - stopIndicator: function() { - if(this.options.indicator) Element.hide(this.options.indicator); - }, - - onKeyPress: function(event) { - if(this.active) - switch(event.keyCode) { - case Event.KEY_TAB: - case Event.KEY_RETURN: - this.selectEntry(); - Event.stop(event); - case Event.KEY_ESC: - this.hide(); - this.active = false; - Event.stop(event); - return; - case Event.KEY_LEFT: - case Event.KEY_RIGHT: - return; - case Event.KEY_UP: - this.markPrevious(); - this.render(); - if(Prototype.Browser.WebKit) Event.stop(event); - return; - case Event.KEY_DOWN: - this.markNext(); - this.render(); - if(Prototype.Browser.WebKit) Event.stop(event); - return; - } - else - if(event.keyCode==Event.KEY_TAB || event.keyCode==Event.KEY_RETURN || - (Prototype.Browser.WebKit > 0 && event.keyCode == 0)) return; - - this.changed = true; - this.hasFocus = true; - - if(this.observer) clearTimeout(this.observer); - this.observer = - setTimeout(this.onObserverEvent.bind(this), this.options.frequency*1000); - }, - - activate: function() { - this.changed = false; - this.hasFocus = true; - this.getUpdatedChoices(); - }, - - onHover: function(event) { - var element = Event.findElement(event, 'LI'); - if(this.index != element.autocompleteIndex) - { - this.index = element.autocompleteIndex; - this.render(); - } - Event.stop(event); - }, - - onClick: function(event) { - var element = Event.findElement(event, 'LI'); - this.index = element.autocompleteIndex; - this.selectEntry(); - this.hide(); - }, - - onBlur: function(event) { - // needed to make click events working - setTimeout(this.hide.bind(this), 250); - this.hasFocus = false; - this.active = false; - }, - - render: function() { - if(this.entryCount > 0) { - for (var i = 0; i < this.entryCount; i++) - this.index==i ? - Element.addClassName(this.getEntry(i),"selected") : - Element.removeClassName(this.getEntry(i),"selected"); - if(this.hasFocus) { - this.show(); - this.active = true; - } - } else { - this.active = false; - this.hide(); - } - }, - - markPrevious: function() { - if(this.index > 0) this.index-- - else this.index = this.entryCount-1; - this.getEntry(this.index).scrollIntoView(true); - }, - - markNext: function() { - if(this.index < this.entryCount-1) this.index++ - else this.index = 0; - this.getEntry(this.index).scrollIntoView(false); - }, - - getEntry: function(index) { - return this.update.firstChild.childNodes[index]; - }, - - getCurrentEntry: function() { - return this.getEntry(this.index); - }, - - selectEntry: function() { - this.active = false; - this.updateElement(this.getCurrentEntry()); - }, - - updateElement: function(selectedElement) { - if (this.options.updateElement) { - this.options.updateElement(selectedElement); - return; - } - var value = ''; - if (this.options.select) { - var nodes = document.getElementsByClassName(this.options.select, selectedElement) || []; - if(nodes.length>0) value = Element.collectTextNodes(nodes[0], this.options.select); - } else - value = Element.collectTextNodesIgnoreClass(selectedElement, 'informal'); - - var bounds = this.getTokenBounds(); - if (bounds[0] != -1) { - var newValue = this.element.value.substr(0, bounds[0]); - var whitespace = this.element.value.substr(bounds[0]).match(/^\s+/); - if (whitespace) - newValue += whitespace[0]; - this.element.value = newValue + value + this.element.value.substr(bounds[1]); - } else { - this.element.value = value; - } - this.oldElementValue = this.element.value; - this.element.focus(); - - if (this.options.afterUpdateElement) - this.options.afterUpdateElement(this.element, selectedElement); - }, - - updateChoices: function(choices) { - if(!this.changed && this.hasFocus) { - this.update.innerHTML = choices; - Element.cleanWhitespace(this.update); - Element.cleanWhitespace(this.update.down()); - - if(this.update.firstChild && this.update.down().childNodes) { - this.entryCount = - this.update.down().childNodes.length; - for (var i = 0; i < this.entryCount; i++) { - var entry = this.getEntry(i); - entry.autocompleteIndex = i; - this.addObservers(entry); - } - } else { - this.entryCount = 0; - } - - this.stopIndicator(); - this.index = 0; - - if(this.entryCount==1 && this.options.autoSelect) { - this.selectEntry(); - this.hide(); - } else { - this.render(); - } - } - }, - - addObservers: function(element) { - Event.observe(element, "mouseover", this.onHover.bindAsEventListener(this)); - Event.observe(element, "click", this.onClick.bindAsEventListener(this)); - }, - - onObserverEvent: function() { - this.changed = false; - this.tokenBounds = null; - if(this.getToken().length>=this.options.minChars) { - this.getUpdatedChoices(); - } else { - this.active = false; - this.hide(); - } - this.oldElementValue = this.element.value; - }, - - getToken: function() { - var bounds = this.getTokenBounds(); - return this.element.value.substring(bounds[0], bounds[1]).strip(); - }, - - getTokenBounds: function() { - if (null != this.tokenBounds) return this.tokenBounds; - var value = this.element.value; - if (value.strip().empty()) return [-1, 0]; - var diff = arguments.callee.getFirstDifferencePos(value, this.oldElementValue); - var offset = (diff == this.oldElementValue.length ? 1 : 0); - var prevTokenPos = -1, nextTokenPos = value.length; - var tp; - for (var index = 0, l = this.options.tokens.length; index < l; ++index) { - tp = value.lastIndexOf(this.options.tokens[index], diff + offset - 1); - if (tp > prevTokenPos) prevTokenPos = tp; - tp = value.indexOf(this.options.tokens[index], diff + offset); - if (-1 != tp && tp < nextTokenPos) nextTokenPos = tp; - } - return (this.tokenBounds = [prevTokenPos + 1, nextTokenPos]); - } -} - -Autocompleter.Base.prototype.getTokenBounds.getFirstDifferencePos = function(newS, oldS) { - var boundary = Math.min(newS.length, oldS.length); - for (var index = 0; index < boundary; ++index) - if (newS[index] != oldS[index]) - return index; - return boundary; -}; - -Ajax.Autocompleter = Class.create(); -Object.extend(Object.extend(Ajax.Autocompleter.prototype, Autocompleter.Base.prototype), { - initialize: function(element, update, url, options) { - this.baseInitialize(element, update, options); - this.options.asynchronous = true; - this.options.onComplete = this.onComplete.bind(this); - this.options.defaultParams = this.options.parameters || null; - this.url = url; - }, - - getUpdatedChoices: function() { - this.startIndicator(); - - var entry = encodeURIComponent(this.options.paramName) + '=' + - encodeURIComponent(this.getToken()); - - this.options.parameters = this.options.callback ? - this.options.callback(this.element, entry) : entry; - - if(this.options.defaultParams) - this.options.parameters += '&' + this.options.defaultParams; - - new Ajax.Request(this.url, this.options); - }, - - onComplete: function(request) { - this.updateChoices(request.responseText); - } - -}); - -// The local array autocompleter. Used when you'd prefer to -// inject an array of autocompletion options into the page, rather -// than sending out Ajax queries, which can be quite slow sometimes. -// -// The constructor takes four parameters. The first two are, as usual, -// the id of the monitored textbox, and id of the autocompletion menu. -// The third is the array you want to autocomplete from, and the fourth -// is the options block. -// -// Extra local autocompletion options: -// - choices - How many autocompletion choices to offer -// -// - partialSearch - If false, the autocompleter will match entered -// text only at the beginning of strings in the -// autocomplete array. Defaults to true, which will -// match text at the beginning of any *word* in the -// strings in the autocomplete array. If you want to -// search anywhere in the string, additionally set -// the option fullSearch to true (default: off). -// -// - fullSsearch - Search anywhere in autocomplete array strings. -// -// - partialChars - How many characters to enter before triggering -// a partial match (unlike minChars, which defines -// how many characters are required to do any match -// at all). Defaults to 2. -// -// - ignoreCase - Whether to ignore case when autocompleting. -// Defaults to true. -// -// It's possible to pass in a custom function as the 'selector' -// option, if you prefer to write your own autocompletion logic. -// In that case, the other options above will not apply unless -// you support them. - -Autocompleter.Local = Class.create(); -Autocompleter.Local.prototype = Object.extend(new Autocompleter.Base(), { - initialize: function(element, update, array, options) { - this.baseInitialize(element, update, options); - this.options.array = array; - }, - - getUpdatedChoices: function() { - this.updateChoices(this.options.selector(this)); - }, - - setOptions: function(options) { - this.options = Object.extend({ - choices: 10, - partialSearch: true, - partialChars: 2, - ignoreCase: true, - fullSearch: false, - selector: function(instance) { - var ret = []; // Beginning matches - var partial = []; // Inside matches - var entry = instance.getToken(); - var count = 0; - - for (var i = 0; i < instance.options.array.length && - ret.length < instance.options.choices ; i++) { - - var elem = instance.options.array[i]; - var foundPos = instance.options.ignoreCase ? - elem.toLowerCase().indexOf(entry.toLowerCase()) : - elem.indexOf(entry); - - while (foundPos != -1) { - if (foundPos == 0 && elem.length != entry.length) { - ret.push("<li><strong>" + elem.substr(0, entry.length) + "</strong>" + - elem.substr(entry.length) + "</li>"); - break; - } else if (entry.length >= instance.options.partialChars && - instance.options.partialSearch && foundPos != -1) { - if (instance.options.fullSearch || /\s/.test(elem.substr(foundPos-1,1))) { - partial.push("<li>" + elem.substr(0, foundPos) + "<strong>" + - elem.substr(foundPos, entry.length) + "</strong>" + elem.substr( - foundPos + entry.length) + "</li>"); - break; - } - } - - foundPos = instance.options.ignoreCase ? - elem.toLowerCase().indexOf(entry.toLowerCase(), foundPos + 1) : - elem.indexOf(entry, foundPos + 1); - - } - } - if (partial.length) - ret = ret.concat(partial.slice(0, instance.options.choices - ret.length)) - return "<ul>" + ret.join('') + "</ul>"; - } - }, options || { }); - } -}); - -// AJAX in-place editor and collection editor -// Full rewrite by Christophe Porteneuve <tdd@tddsworld.com> (April 2007). - -// Use this if you notice weird scrolling problems on some browsers, -// the DOM might be a bit confused when this gets called so do this -// waits 1 ms (with setTimeout) until it does the activation -Field.scrollFreeActivate = function(field) { - setTimeout(function() { - Field.activate(field); - }, 1); -} - -Ajax.InPlaceEditor = Class.create(); -Object.extend(Ajax.InPlaceEditor, { - DefaultOptions: { - ajaxOptions: { }, - autoRows: 3, // Use when multi-line w/ rows == 1 - cancelControl: 'link', // 'link'|'button'|false - cancelText: 'cancel', - clickToEditText: 'Click to edit', - externalControl: null, // id|elt - externalControlOnly: false, - fieldPostCreation: 'activate', // 'activate'|'focus'|false - formClassName: 'inplaceeditor-form', - formId: null, // id|elt - highlightColor: '#ffff99', - highlightEndColor: '#ffffff', - hoverClassName: '', - htmlResponse: true, - loadingClassName: 'inplaceeditor-loading', - loadingText: 'Loading...', - okControl: 'button', // 'link'|'button'|false - okText: 'ok', - paramName: 'value', - rows: 1, // If 1 and multi-line, uses autoRows - savingClassName: 'inplaceeditor-saving', - savingText: 'Saving...', - size: 0, - stripLoadedTextTags: false, - submitOnBlur: false, - textAfterControls: '', - textBeforeControls: '', - textBetweenControls: '' - }, - DefaultCallbacks: { - callback: function(form) { - return Form.serialize(form); - }, - onComplete: function(transport, element) { - // For backward compatibility, this one is bound to the IPE, and passes - // the element directly. It was too often customized, so we don't break it. - new Effect.Highlight(element, { - startcolor: this.options.highlightColor, keepBackgroundImage: true }); - }, - onEnterEditMode: null, - onEnterHover: function(ipe) { - ipe.element.style.backgroundColor = ipe.options.highlightColor; - if (ipe._effect) - ipe._effect.cancel(); - }, - onFailure: function(transport, ipe) { - alert('Error communication with the server: ' + transport.responseText.stripTags()); - }, - onFormCustomization: null, // Takes the IPE and its generated form, after editor, before controls. - onLeaveEditMode: null, - onLeaveHover: function(ipe) { - ipe._effect = new Effect.Highlight(ipe.element, { - startcolor: ipe.options.highlightColor, endcolor: ipe.options.highlightEndColor, - restorecolor: ipe._originalBackground, keepBackgroundImage: true - }); - } - }, - Listeners: { - click: 'enterEditMode', - keydown: 'checkForEscapeOrReturn', - mouseover: 'enterHover', - mouseout: 'leaveHover' - } -}); -Ajax.InPlaceEditor.prototype = { - initialize: function(element, url, options) { - this.url = url; - this.element = element = $(element); - this.prepareOptions(); - this._controls = { }; - arguments.callee.dealWithDeprecatedOptions(options); // DEPRECATION LAYER!!! - Object.extend(this.options, options || { }); - if (!this.options.formId && this.element.id) { - this.options.formId = this.element.id + '-inplaceeditor'; - if ($(this.options.formId)) - this.options.formId = ''; - } - if (this.options.externalControl) - this.options.externalControl = $(this.options.externalControl); - if (!this.options.externalControl) - this.options.externalControlOnly = false; - this._originalBackground = this.element.getStyle('background-color') || 'transparent'; - this.element.title = this.options.clickToEditText; - this._boundCancelHandler = this.handleFormCancellation.bind(this); - this._boundComplete = (this.options.onComplete || Prototype.emptyFunction).bind(this); - this._boundFailureHandler = this.handleAJAXFailure.bind(this); - this._boundSubmitHandler = this.handleFormSubmission.bind(this); - this._boundWrapperHandler = this.wrapUp.bind(this); - this.registerListeners(); - }, - checkForEscapeOrReturn: function(e) { - if (!this._editing || e.ctrlKey || e.altKey || e.shiftKey) return; - if (Event.KEY_ESC == e.keyCode) - this.handleFormCancellation(e); - else if (Event.KEY_RETURN == e.keyCode) - this.handleFormSubmission(e); - }, - createControl: function(mode, handler, extraClasses) { - var control = this.options[mode + 'Control']; - var text = this.options[mode + 'Text']; - if ('button' == control) { - var btn = document.createElement('input'); - btn.type = 'submit'; - btn.value = text; - btn.className = 'editor_' + mode + '_button'; - if ('cancel' == mode) - btn.onclick = this._boundCancelHandler; - this._form.appendChild(btn); - this._controls[mode] = btn; - } else if ('link' == control) { - var link = document.createElement('a'); - link.href = '#'; - link.appendChild(document.createTextNode(text)); - link.onclick = 'cancel' == mode ? this._boundCancelHandler : this._boundSubmitHandler; - link.className = 'editor_' + mode + '_link'; - if (extraClasses) - link.className += ' ' + extraClasses; - this._form.appendChild(link); - this._controls[mode] = link; - } - }, - createEditField: function() { - var text = (this.options.loadTextURL ? this.options.loadingText : this.getText()); - var fld; - if (1 >= this.options.rows && !/\r|\n/.test(this.getText())) { - fld = document.createElement('input'); - fld.type = 'text'; - var size = this.options.size || this.options.cols || 0; - if (0 < size) fld.size = size; - } else { - fld = document.createElement('textarea'); - fld.rows = (1 >= this.options.rows ? this.options.autoRows : this.options.rows); - fld.cols = this.options.cols || 40; - } - fld.name = this.options.paramName; - fld.value = text; // No HTML breaks conversion anymore - fld.className = 'editor_field'; - if (this.options.submitOnBlur) - fld.onblur = this._boundSubmitHandler; - this._controls.editor = fld; - if (this.options.loadTextURL) - this.loadExternalText(); - this._form.appendChild(this._controls.editor); - }, - createForm: function() { - var ipe = this; - function addText(mode, condition) { - var text = ipe.options['text' + mode + 'Controls']; - if (!text || condition === false) return; - ipe._form.appendChild(document.createTextNode(text)); - }; - this._form = $(document.createElement('form')); - this._form.id = this.options.formId; - this._form.addClassName(this.options.formClassName); - this._form.onsubmit = this._boundSubmitHandler; - this.createEditField(); - if ('textarea' == this._controls.editor.tagName.toLowerCase()) - this._form.appendChild(document.createElement('br')); - if (this.options.onFormCustomization) - this.options.onFormCustomization(this, this._form); - addText('Before', this.options.okControl || this.options.cancelControl); - this.createControl('ok', this._boundSubmitHandler); - addText('Between', this.options.okControl && this.options.cancelControl); - this.createControl('cancel', this._boundCancelHandler, 'editor_cancel'); - addText('After', this.options.okControl || this.options.cancelControl); - }, - destroy: function() { - if (this._oldInnerHTML) - this.element.innerHTML = this._oldInnerHTML; - this.leaveEditMode(); - this.unregisterListeners(); - }, - enterEditMode: function(e) { - if (this._saving || this._editing) return; - this._editing = true; - this.triggerCallback('onEnterEditMode'); - if (this.options.externalControl) - this.options.externalControl.hide(); - this.element.hide(); - this.createForm(); - this.element.parentNode.insertBefore(this._form, this.element); - if (!this.options.loadTextURL) - this.postProcessEditField(); - if (e) Event.stop(e); - }, - enterHover: function(e) { - if (this.options.hoverClassName) - this.element.addClassName(this.options.hoverClassName); - if (this._saving) return; - this.triggerCallback('onEnterHover'); - }, - getText: function() { - return this.element.innerHTML; - }, - handleAJAXFailure: function(transport) { - this.triggerCallback('onFailure', transport); - if (this._oldInnerHTML) { - this.element.innerHTML = this._oldInnerHTML; - this._oldInnerHTML = null; - } - }, - handleFormCancellation: function(e) { - this.wrapUp(); - if (e) Event.stop(e); - }, - handleFormSubmission: function(e) { - var form = this._form; - var value = $F(this._controls.editor); - this.prepareSubmission(); - var params = this.options.callback(form, value); - params = (params ? params + '&' : '?') + 'editorId=' + this.element.id; - if (this.options.htmlResponse) { - var options = Object.extend({ evalScripts: true }, this.options.ajaxOptions); - Object.extend(options, { - parameters: params, - onComplete: this._boundWrapperHandler, - onFailure: this._boundFailureHandler - }); - new Ajax.Updater({ success: this.element }, this.url, options); - } else { - var options = Object.extend({ method: 'get' }, this.options.ajaxOptions); - Object.extend(options, { - parameters: params, - onComplete: this._boundWrapperHandler, - onFailure: this._boundFailureHandler - }); - new Ajax.Request(this.url, options); - } - if (e) Event.stop(e); - }, - leaveEditMode: function() { - this.element.removeClassName(this.options.savingClassName); - this.removeForm(); - this.leaveHover(); - this.element.style.backgroundColor = this._originalBackground; - this.element.show(); - if (this.options.externalControl) - this.options.externalControl.show(); - this._saving = false; - this._editing = false; - this._oldInnerHTML = null; - this.triggerCallback('onLeaveEditMode'); - }, - leaveHover: function(e) { - if (this.options.hoverClassName) - this.element.removeClassName(this.options.hoverClassName); - if (this._saving) return; - this.triggerCallback('onLeaveHover'); - }, - loadExternalText: function() { - this._form.addClassName(this.options.loadingClassName); - this._controls.editor.disabled = true; - var options = Object.extend({ method: 'get' }, this.options.ajaxOptions); - Object.extend(options, { - parameters: 'editorId=' + encodeURIComponent(this.element.id), - onComplete: Prototype.emptyFunction, - onSuccess: function(transport) { - this._form.removeClassName(this.options.loadingClassName); - var text = transport.responseText; - if (this.options.stripLoadedTextTags) - text = text.stripTags(); - this._controls.editor.value = text; - this._controls.editor.disabled = false; - this.postProcessEditField(); - }.bind(this), - onFailure: this._boundFailureHandler - }); - new Ajax.Request(this.options.loadTextURL, options); - }, - postProcessEditField: function() { - var fpc = this.options.fieldPostCreation; - if (fpc) - $(this._controls.editor)['focus' == fpc ? 'focus' : 'activate'](); - }, - prepareOptions: function() { - this.options = Object.clone(Ajax.InPlaceEditor.DefaultOptions); - Object.extend(this.options, Ajax.InPlaceEditor.DefaultCallbacks); - [this._extraDefaultOptions].flatten().compact().each(function(defs) { - Object.extend(this.options, defs); - }.bind(this)); - }, - prepareSubmission: function() { - this._saving = true; - this.removeForm(); - this.leaveHover(); - this.showSaving(); - }, - registerListeners: function() { - this._listeners = { }; - var listener; - $H(Ajax.InPlaceEditor.Listeners).each(function(pair) { - listener = this[pair.value].bind(this); - this._listeners[pair.key] = listener; - if (!this.options.externalControlOnly) - this.element.observe(pair.key, listener); - if (this.options.externalControl) - this.options.externalControl.observe(pair.key, listener); - }.bind(this)); - }, - removeForm: function() { - if (!this._form) return; - this._form.remove(); - this._form = null; - this._controls = { }; - }, - showSaving: function() { - this._oldInnerHTML = this.element.innerHTML; - this.element.innerHTML = this.options.savingText; - this.element.addClassName(this.options.savingClassName); - this.element.style.backgroundColor = this._originalBackground; - this.element.show(); - }, - triggerCallback: function(cbName, arg) { - if ('function' == typeof this.options[cbName]) { - this.options[cbName](this, arg); - } - }, - unregisterListeners: function() { - $H(this._listeners).each(function(pair) { - if (!this.options.externalControlOnly) - this.element.stopObserving(pair.key, pair.value); - if (this.options.externalControl) - this.options.externalControl.stopObserving(pair.key, pair.value); - }.bind(this)); - }, - wrapUp: function(transport) { - this.leaveEditMode(); - // Can't use triggerCallback due to backward compatibility: requires - // binding + direct element - this._boundComplete(transport, this.element); - } -}; -Object.extend(Ajax.InPlaceEditor.prototype, { - dispose: Ajax.InPlaceEditor.prototype.destroy -}); - - -Ajax.InPlaceCollectionEditor = Class.create(); -Ajax.InPlaceCollectionEditor.DefaultOptions = { - loadingCollectionText: 'Loading options...' -}; -Object.extend(Ajax.InPlaceCollectionEditor.prototype, Ajax.InPlaceEditor.prototype); -Object.extend(Ajax.InPlaceCollectionEditor.prototype, { - initialize: function(element, url, options) { - this._extraDefaultOptions = Ajax.InPlaceCollectionEditor.DefaultOptions; - Ajax.InPlaceEditor.prototype.initialize.call(this, element, url, options); - }, - - createEditField: function() { - var list = document.createElement('select'); - list.name = this.options.paramName; - list.size = 1; - this._controls.editor = list; - this._collection = this.options.collection || []; - if (this.options.loadCollectionURL) - this.loadCollection(); - else - this.checkForExternalText(); - this._form.appendChild(this._controls.editor); - }, - - loadCollection: function() { - this._form.addClassName(this.options.loadingClassName); - this.showLoadingText(this.options.loadingCollectionText); - var options = Object.extend({ method: 'get' }, this.options.ajaxOptions); - Object.extend(options, { - parameters: 'editorId=' + encodeURIComponent(this.element.id), - onComplete: Prototype.emptyFunction, - onSuccess: function(transport) { - var js = transport.responseText.strip(); - if (!/^\[.*\]$/.test(js)) // TODO: improve sanity check - throw 'Server returned an invalid collection representation.'; - this._collection = eval(js); - this.checkForExternalText(); - }.bind(this), - onFailure: this.onFailure - }); - new Ajax.Request(this.options.loadCollectionURL, options); - }, - - showLoadingText: function(text) { - this._controls.editor.disabled = true; - var tempOption = this._controls.editor.firstChild; - if (!tempOption) { - tempOption = document.createElement('option'); - tempOption.value = ''; - this._controls.editor.appendChild(tempOption); - tempOption.selected = true; - } - tempOption.update((text || '').stripScripts().stripTags()); - }, - - checkForExternalText: function() { - this._text = this.getText(); - if (this.options.loadTextURL) - this.loadExternalText(); - else - this.buildOptionList(); - }, - - loadExternalText: function() { - this.showLoadingText(this.options.loadingText); - var options = Object.extend({ method: 'get' }, this.options.ajaxOptions); - Object.extend(options, { - parameters: 'editorId=' + encodeURIComponent(this.element.id), - onComplete: Prototype.emptyFunction, - onSuccess: function(transport) { - this._text = transport.responseText.strip(); - this.buildOptionList(); - }.bind(this), - onFailure: this.onFailure - }); - new Ajax.Request(this.options.loadTextURL, options); - }, - - buildOptionList: function() { - this._form.removeClassName(this.options.loadingClassName); - this._collection = this._collection.map(function(entry) { - return 2 === entry.length ? entry : [entry, entry].flatten(); - }); - var marker = ('value' in this.options) ? this.options.value : this._text; - var textFound = this._collection.any(function(entry) { - return entry[0] == marker; - }.bind(this)); - this._controls.editor.update(''); - var option; - this._collection.each(function(entry, index) { - option = document.createElement('option'); - option.value = entry[0]; - option.selected = textFound ? entry[0] == marker : 0 == index; - option.appendChild(document.createTextNode(entry[1])); - this._controls.editor.appendChild(option); - }.bind(this)); - this._controls.editor.disabled = false; - Field.scrollFreeActivate(this._controls.editor); - } -}); - -//**** DEPRECATION LAYER FOR InPlace[Collection]Editor! **** -//**** This only exists for a while, in order to let **** -//**** users adapt to the new API. Read up on the new **** -//**** API and convert your code to it ASAP! **** - -Ajax.InPlaceEditor.prototype.initialize.dealWithDeprecatedOptions = function(options) { - if (!options) return; - function fallback(name, expr) { - if (name in options || expr === undefined) return; - options[name] = expr; - }; - fallback('cancelControl', (options.cancelLink ? 'link' : (options.cancelButton ? 'button' : - options.cancelLink == options.cancelButton == false ? false : undefined))); - fallback('okControl', (options.okLink ? 'link' : (options.okButton ? 'button' : - options.okLink == options.okButton == false ? false : undefined))); - fallback('highlightColor', options.highlightcolor); - fallback('highlightEndColor', options.highlightendcolor); -}; - - -// Delayed observer, like Form.Element.Observer, -// but waits for delay after last key input -// Ideal for live-search fields - -Form.Element.DelayedObserver = Class.create(); -Form.Element.DelayedObserver.prototype = { - initialize: function(element, delay, callback) { - this.delay = delay || 0.5; - this.element = $(element); - this.callback = callback; - this.timer = null; - this.lastValue = $F(this.element); - Event.observe(this.element,'keyup',this.delayedListener.bindAsEventListener(this)); - }, - delayedListener: function(event) { - if(this.lastValue == $F(this.element)) return; - if(this.timer) clearTimeout(this.timer); - this.timer = setTimeout(this.onTimerEvent.bind(this), this.delay * 1000); - this.lastValue = $F(this.element); - }, - onTimerEvent: function() { - this.timer = null; - this.callback(this.element, $F(this.element)); - } -}; diff --git a/vendor/plugins/rspec/story_server/prototype/javascripts/dragdrop.js b/vendor/plugins/rspec/story_server/prototype/javascripts/dragdrop.js deleted file mode 100644 index 96eba902d..000000000 --- a/vendor/plugins/rspec/story_server/prototype/javascripts/dragdrop.js +++ /dev/null @@ -1,976 +0,0 @@ -// script.aculo.us dragdrop.js v1.8.0_pre1, Fri Oct 12 21:34:51 +0200 2007 - -// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) -// (c) 2005-2007 Sammi Williams (http://www.oriontransfer.co.nz, sammi@oriontransfer.co.nz) -// -// script.aculo.us is freely distributable under the terms of an MIT-style license. -// For details, see the script.aculo.us web site: http://script.aculo.us/ - -if(Object.isUndefined(Effect)) - throw("dragdrop.js requires including script.aculo.us' effects.js library"); - -var Droppables = { - drops: [], - - remove: function(element) { - this.drops = this.drops.reject(function(d) { return d.element==$(element) }); - }, - - add: function(element) { - element = $(element); - var options = Object.extend({ - greedy: true, - hoverclass: null, - tree: false - }, arguments[1] || { }); - - // cache containers - if(options.containment) { - options._containers = []; - var containment = options.containment; - if(Object.isArray(containment)) { - containment.each( function(c) { options._containers.push($(c)) }); - } else { - options._containers.push($(containment)); - } - } - - if(options.accept) options.accept = [options.accept].flatten(); - - Element.makePositioned(element); // fix IE - options.element = element; - - this.drops.push(options); - }, - - findDeepestChild: function(drops) { - deepest = drops[0]; - - for (i = 1; i < drops.length; ++i) - if (Element.isParent(drops[i].element, deepest.element)) - deepest = drops[i]; - - return deepest; - }, - - isContained: function(element, drop) { - var containmentNode; - if(drop.tree) { - containmentNode = element.treeNode; - } else { - containmentNode = element.parentNode; - } - return drop._containers.detect(function(c) { return containmentNode == c }); - }, - - isAffected: function(point, element, drop) { - return ( - (drop.element!=element) && - ((!drop._containers) || - this.isContained(element, drop)) && - ((!drop.accept) || - (Element.classNames(element).detect( - function(v) { return drop.accept.include(v) } ) )) && - Position.within(drop.element, point[0], point[1]) ); - }, - - deactivate: function(drop) { - if(drop.hoverclass) - Element.removeClassName(drop.element, drop.hoverclass); - this.last_active = null; - }, - - activate: function(drop) { - if(drop.hoverclass) - Element.addClassName(drop.element, drop.hoverclass); - this.last_active = drop; - }, - - show: function(point, element) { - if(!this.drops.length) return; - var drop, affected = []; - - this.drops.each( function(drop) { - if(Droppables.isAffected(point, element, drop)) - affected.push(drop); - }); - - if(affected.length>0) - drop = Droppables.findDeepestChild(affected); - - if(this.last_active && this.last_active != drop) this.deactivate(this.last_active); - if (drop) { - Position.within(drop.element, point[0], point[1]); - if(drop.onHover) - drop.onHover(element, drop.element, Position.overlap(drop.overlap, drop.element)); - - if (drop != this.last_active) Droppables.activate(drop); - } - }, - - fire: function(event, element) { - if(!this.last_active) return; - Position.prepare(); - - if (this.isAffected([Event.pointerX(event), Event.pointerY(event)], element, this.last_active)) - if (this.last_active.onDrop) { - this.last_active.onDrop(element, this.last_active.element, event); - return true; - } - }, - - reset: function() { - if(this.last_active) - this.deactivate(this.last_active); - } -} - -var Draggables = { - drags: [], - observers: [], - - register: function(draggable) { - if(this.drags.length == 0) { - this.eventMouseUp = this.endDrag.bindAsEventListener(this); - this.eventMouseMove = this.updateDrag.bindAsEventListener(this); - this.eventKeypress = this.keyPress.bindAsEventListener(this); - - Event.observe(document, "mouseup", this.eventMouseUp); - Event.observe(document, "mousemove", this.eventMouseMove); - Event.observe(document, "keypress", this.eventKeypress); - } - this.drags.push(draggable); - }, - - unregister: function(draggable) { - this.drags = this.drags.reject(function(d) { return d==draggable }); - if(this.drags.length == 0) { - Event.stopObserving(document, "mouseup", this.eventMouseUp); - Event.stopObserving(document, "mousemove", this.eventMouseMove); - Event.stopObserving(document, "keypress", this.eventKeypress); - } - }, - - activate: function(draggable) { - if(draggable.options.delay) { - this._timeout = setTimeout(function() { - Draggables._timeout = null; - window.focus(); - Draggables.activeDraggable = draggable; - }.bind(this), draggable.options.delay); - } else { - window.focus(); // allows keypress events if window isn't currently focused, fails for Safari - this.activeDraggable = draggable; - } - }, - - deactivate: function() { - this.activeDraggable = null; - }, - - updateDrag: function(event) { - if(!this.activeDraggable) return; - var pointer = [Event.pointerX(event), Event.pointerY(event)]; - // Mozilla-based browsers fire successive mousemove events with - // the same coordinates, prevent needless redrawing (moz bug?) - if(this._lastPointer && (this._lastPointer.inspect() == pointer.inspect())) return; - this._lastPointer = pointer; - - this.activeDraggable.updateDrag(event, pointer); - }, - - endDrag: function(event) { - if(this._timeout) { - clearTimeout(this._timeout); - this._timeout = null; - } - if(!this.activeDraggable) return; - this._lastPointer = null; - this.activeDraggable.endDrag(event); - this.activeDraggable = null; - }, - - keyPress: function(event) { - if(this.activeDraggable) - this.activeDraggable.keyPress(event); - }, - - addObserver: function(observer) { - this.observers.push(observer); - this._cacheObserverCallbacks(); - }, - - removeObserver: function(element) { // element instead of observer fixes mem leaks - this.observers = this.observers.reject( function(o) { return o.element==element }); - this._cacheObserverCallbacks(); - }, - - notify: function(eventName, draggable, event) { // 'onStart', 'onEnd', 'onDrag' - if(this[eventName+'Count'] > 0) - this.observers.each( function(o) { - if(o[eventName]) o[eventName](eventName, draggable, event); - }); - if(draggable.options[eventName]) draggable.options[eventName](draggable, event); - }, - - _cacheObserverCallbacks: function() { - ['onStart','onEnd','onDrag'].each( function(eventName) { - Draggables[eventName+'Count'] = Draggables.observers.select( - function(o) { return o[eventName]; } - ).length; - }); - } -} - -/*--------------------------------------------------------------------------*/ - -var Draggable = Class.create(); -Draggable._dragging = { }; - -Draggable.prototype = { - initialize: function(element) { - var defaults = { - handle: false, - reverteffect: function(element, top_offset, left_offset) { - var dur = Math.sqrt(Math.abs(top_offset^2)+Math.abs(left_offset^2))*0.02; - new Effect.Move(element, { x: -left_offset, y: -top_offset, duration: dur, - queue: {scope:'_draggable', position:'end'} - }); - }, - endeffect: function(element) { - var toOpacity = Object.isNumber(element._opacity) ? element._opacity : 1.0; - new Effect.Opacity(element, {duration:0.2, from:0.7, to:toOpacity, - queue: {scope:'_draggable', position:'end'}, - afterFinish: function(){ - Draggable._dragging[element] = false - } - }); - }, - zindex: 1000, - revert: false, - quiet: false, - scroll: false, - scrollSensitivity: 20, - scrollSpeed: 15, - snap: false, // false, or xy or [x,y] or function(x,y){ return [x,y] } - delay: 0 - }; - - if(!arguments[1] || Object.isUndefined(arguments[1].endeffect)) - Object.extend(defaults, { - starteffect: function(element) { - element._opacity = Element.getOpacity(element); - Draggable._dragging[element] = true; - new Effect.Opacity(element, {duration:0.2, from:element._opacity, to:0.7}); - } - }); - - var options = Object.extend(defaults, arguments[1] || { }); - - this.element = $(element); - - if(options.handle && Object.isString(options.handle)) - this.handle = this.element.down('.'+options.handle, 0); - - if(!this.handle) this.handle = $(options.handle); - if(!this.handle) this.handle = this.element; - - if(options.scroll && !options.scroll.scrollTo && !options.scroll.outerHTML) { - options.scroll = $(options.scroll); - this._isScrollChild = Element.childOf(this.element, options.scroll); - } - - Element.makePositioned(this.element); // fix IE - - this.options = options; - this.dragging = false; - - this.eventMouseDown = this.initDrag.bindAsEventListener(this); - Event.observe(this.handle, "mousedown", this.eventMouseDown); - - Draggables.register(this); - }, - - destroy: function() { - Event.stopObserving(this.handle, "mousedown", this.eventMouseDown); - Draggables.unregister(this); - }, - - currentDelta: function() { - return([ - parseInt(Element.getStyle(this.element,'left') || '0'), - parseInt(Element.getStyle(this.element,'top') || '0')]); - }, - - initDrag: function(event) { - if(!Object.isUndefined(Draggable._dragging[this.element]) && - Draggable._dragging[this.element]) return; - if(Event.isLeftClick(event)) { - // abort on form elements, fixes a Firefox issue - var src = Event.element(event); - if((tag_name = src.tagName.toUpperCase()) && ( - tag_name=='INPUT' || - tag_name=='SELECT' || - tag_name=='OPTION' || - tag_name=='BUTTON' || - tag_name=='TEXTAREA')) return; - - var pointer = [Event.pointerX(event), Event.pointerY(event)]; - var pos = Position.cumulativeOffset(this.element); - this.offset = [0,1].map( function(i) { return (pointer[i] - pos[i]) }); - - Draggables.activate(this); - Event.stop(event); - } - }, - - startDrag: function(event) { - this.dragging = true; - if(!this.delta) - this.delta = this.currentDelta(); - - if(this.options.zindex) { - this.originalZ = parseInt(Element.getStyle(this.element,'z-index') || 0); - this.element.style.zIndex = this.options.zindex; - } - - if(this.options.ghosting) { - this._clone = this.element.cloneNode(true); - this.element._originallyAbsolute = (this.element.getStyle('position') == 'absolute'); - if (!this.element._originallyAbsolute) - Position.absolutize(this.element); - this.element.parentNode.insertBefore(this._clone, this.element); - } - - if(this.options.scroll) { - if (this.options.scroll == window) { - var where = this._getWindowScroll(this.options.scroll); - this.originalScrollLeft = where.left; - this.originalScrollTop = where.top; - } else { - this.originalScrollLeft = this.options.scroll.scrollLeft; - this.originalScrollTop = this.options.scroll.scrollTop; - } - } - - Draggables.notify('onStart', this, event); - - if(this.options.starteffect) this.options.starteffect(this.element); - }, - - updateDrag: function(event, pointer) { - if(!this.dragging) this.startDrag(event); - - if(!this.options.quiet){ - Position.prepare(); - Droppables.show(pointer, this.element); - } - - Draggables.notify('onDrag', this, event); - - this.draw(pointer); - if(this.options.change) this.options.change(this); - - if(this.options.scroll) { - this.stopScrolling(); - - var p; - if (this.options.scroll == window) { - with(this._getWindowScroll(this.options.scroll)) { p = [ left, top, left+width, top+height ]; } - } else { - p = Position.page(this.options.scroll); - p[0] += this.options.scroll.scrollLeft + Position.deltaX; - p[1] += this.options.scroll.scrollTop + Position.deltaY; - p.push(p[0]+this.options.scroll.offsetWidth); - p.push(p[1]+this.options.scroll.offsetHeight); - } - var speed = [0,0]; - if(pointer[0] < (p[0]+this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[0]+this.options.scrollSensitivity); - if(pointer[1] < (p[1]+this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[1]+this.options.scrollSensitivity); - if(pointer[0] > (p[2]-this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[2]-this.options.scrollSensitivity); - if(pointer[1] > (p[3]-this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[3]-this.options.scrollSensitivity); - this.startScrolling(speed); - } - - // fix AppleWebKit rendering - if(Prototype.Browser.WebKit) window.scrollBy(0,0); - - Event.stop(event); - }, - - finishDrag: function(event, success) { - this.dragging = false; - - if(this.options.quiet){ - Position.prepare(); - var pointer = [Event.pointerX(event), Event.pointerY(event)]; - Droppables.show(pointer, this.element); - } - - if(this.options.ghosting) { - if (!this.element._originallyAbsolute) - Position.relativize(this.element); - delete this.element._originallyAbsolute; - Element.remove(this._clone); - this._clone = null; - } - - var dropped = false; - if(success) { - dropped = Droppables.fire(event, this.element); - if (!dropped) dropped = false; - } - if(dropped && this.options.onDropped) this.options.onDropped(this.element); - Draggables.notify('onEnd', this, event); - - var revert = this.options.revert; - if(revert && Object.isFunction(revert)) revert = revert(this.element); - - var d = this.currentDelta(); - if(revert && this.options.reverteffect) { - if (dropped == 0 || revert != 'failure') - this.options.reverteffect(this.element, - d[1]-this.delta[1], d[0]-this.delta[0]); - } else { - this.delta = d; - } - - if(this.options.zindex) - this.element.style.zIndex = this.originalZ; - - if(this.options.endeffect) - this.options.endeffect(this.element); - - Draggables.deactivate(this); - Droppables.reset(); - }, - - keyPress: function(event) { - if(event.keyCode!=Event.KEY_ESC) return; - this.finishDrag(event, false); - Event.stop(event); - }, - - endDrag: function(event) { - if(!this.dragging) return; - this.stopScrolling(); - this.finishDrag(event, true); - Event.stop(event); - }, - - draw: function(point) { - var pos = Position.cumulativeOffset(this.element); - if(this.options.ghosting) { - var r = Position.realOffset(this.element); - pos[0] += r[0] - Position.deltaX; pos[1] += r[1] - Position.deltaY; - } - - var d = this.currentDelta(); - pos[0] -= d[0]; pos[1] -= d[1]; - - if(this.options.scroll && (this.options.scroll != window && this._isScrollChild)) { - pos[0] -= this.options.scroll.scrollLeft-this.originalScrollLeft; - pos[1] -= this.options.scroll.scrollTop-this.originalScrollTop; - } - - var p = [0,1].map(function(i){ - return (point[i]-pos[i]-this.offset[i]) - }.bind(this)); - - if(this.options.snap) { - if(Object.isFunction(this.options.snap)) { - p = this.options.snap(p[0],p[1],this); - } else { - if(Object.isArray(this.options.snap)) { - p = p.map( function(v, i) { - return (v/this.options.snap[i]).round()*this.options.snap[i] }.bind(this)) - } else { - p = p.map( function(v) { - return (v/this.options.snap).round()*this.options.snap }.bind(this)) - } - }} - - var style = this.element.style; - if((!this.options.constraint) || (this.options.constraint=='horizontal')) - style.left = p[0] + "px"; - if((!this.options.constraint) || (this.options.constraint=='vertical')) - style.top = p[1] + "px"; - - if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering - }, - - stopScrolling: function() { - if(this.scrollInterval) { - clearInterval(this.scrollInterval); - this.scrollInterval = null; - Draggables._lastScrollPointer = null; - } - }, - - startScrolling: function(speed) { - if(!(speed[0] || speed[1])) return; - this.scrollSpeed = [speed[0]*this.options.scrollSpeed,speed[1]*this.options.scrollSpeed]; - this.lastScrolled = new Date(); - this.scrollInterval = setInterval(this.scroll.bind(this), 10); - }, - - scroll: function() { - var current = new Date(); - var delta = current - this.lastScrolled; - this.lastScrolled = current; - if(this.options.scroll == window) { - with (this._getWindowScroll(this.options.scroll)) { - if (this.scrollSpeed[0] || this.scrollSpeed[1]) { - var d = delta / 1000; - this.options.scroll.scrollTo( left + d*this.scrollSpeed[0], top + d*this.scrollSpeed[1] ); - } - } - } else { - this.options.scroll.scrollLeft += this.scrollSpeed[0] * delta / 1000; - this.options.scroll.scrollTop += this.scrollSpeed[1] * delta / 1000; - } - - Position.prepare(); - Droppables.show(Draggables._lastPointer, this.element); - Draggables.notify('onDrag', this); - if (this._isScrollChild) { - Draggables._lastScrollPointer = Draggables._lastScrollPointer || $A(Draggables._lastPointer); - Draggables._lastScrollPointer[0] += this.scrollSpeed[0] * delta / 1000; - Draggables._lastScrollPointer[1] += this.scrollSpeed[1] * delta / 1000; - if (Draggables._lastScrollPointer[0] < 0) - Draggables._lastScrollPointer[0] = 0; - if (Draggables._lastScrollPointer[1] < 0) - Draggables._lastScrollPointer[1] = 0; - this.draw(Draggables._lastScrollPointer); - } - - if(this.options.change) this.options.change(this); - }, - - _getWindowScroll: function(w) { - var T, L, W, H; - with (w.document) { - if (w.document.documentElement && documentElement.scrollTop) { - T = documentElement.scrollTop; - L = documentElement.scrollLeft; - } else if (w.document.body) { - T = body.scrollTop; - L = body.scrollLeft; - } - if (w.innerWidth) { - W = w.innerWidth; - H = w.innerHeight; - } else if (w.document.documentElement && documentElement.clientWidth) { - W = documentElement.clientWidth; - H = documentElement.clientHeight; - } else { - W = body.offsetWidth; - H = body.offsetHeight - } - } - return { top: T, left: L, width: W, height: H }; - } -} - -/*--------------------------------------------------------------------------*/ - -var SortableObserver = Class.create(); -SortableObserver.prototype = { - initialize: function(element, observer) { - this.element = $(element); - this.observer = observer; - this.lastValue = Sortable.serialize(this.element); - }, - - onStart: function() { - this.lastValue = Sortable.serialize(this.element); - }, - - onEnd: function() { - Sortable.unmark(); - if(this.lastValue != Sortable.serialize(this.element)) - this.observer(this.element) - } -} - -var Sortable = { - SERIALIZE_RULE: /^[^_\-](?:[A-Za-z0-9\-\_]*)[_](.*)$/, - - sortables: { }, - - _findRootElement: function(element) { - while (element.tagName.toUpperCase() != "BODY") { - if(element.id && Sortable.sortables[element.id]) return element; - element = element.parentNode; - } - }, - - options: function(element) { - element = Sortable._findRootElement($(element)); - if(!element) return; - return Sortable.sortables[element.id]; - }, - - destroy: function(element){ - var s = Sortable.options(element); - - if(s) { - Draggables.removeObserver(s.element); - s.droppables.each(function(d){ Droppables.remove(d) }); - s.draggables.invoke('destroy'); - - delete Sortable.sortables[s.element.id]; - } - }, - - create: function(element) { - element = $(element); - var options = Object.extend({ - element: element, - tag: 'li', // assumes li children, override with tag: 'tagname' - dropOnEmpty: false, - tree: false, - treeTag: 'ul', - overlap: 'vertical', // one of 'vertical', 'horizontal' - constraint: 'vertical', // one of 'vertical', 'horizontal', false - containment: element, // also takes array of elements (or id's); or false - handle: false, // or a CSS class - only: false, - delay: 0, - hoverclass: null, - ghosting: false, - quiet: false, - scroll: false, - scrollSensitivity: 20, - scrollSpeed: 15, - format: this.SERIALIZE_RULE, - - // these take arrays of elements or ids and can be - // used for better initialization performance - elements: false, - handles: false, - - onChange: Prototype.emptyFunction, - onUpdate: Prototype.emptyFunction - }, arguments[1] || { }); - - // clear any old sortable with same element - this.destroy(element); - - // build options for the draggables - var options_for_draggable = { - revert: true, - quiet: options.quiet, - scroll: options.scroll, - scrollSpeed: options.scrollSpeed, - scrollSensitivity: options.scrollSensitivity, - delay: options.delay, - ghosting: options.ghosting, - constraint: options.constraint, - handle: options.handle }; - - if(options.starteffect) - options_for_draggable.starteffect = options.starteffect; - - if(options.reverteffect) - options_for_draggable.reverteffect = options.reverteffect; - else - if(options.ghosting) options_for_draggable.reverteffect = function(element) { - element.style.top = 0; - element.style.left = 0; - }; - - if(options.endeffect) - options_for_draggable.endeffect = options.endeffect; - - if(options.zindex) - options_for_draggable.zindex = options.zindex; - - // build options for the droppables - var options_for_droppable = { - overlap: options.overlap, - containment: options.containment, - tree: options.tree, - hoverclass: options.hoverclass, - onHover: Sortable.onHover - } - - var options_for_tree = { - onHover: Sortable.onEmptyHover, - overlap: options.overlap, - containment: options.containment, - hoverclass: options.hoverclass - } - - // fix for gecko engine - Element.cleanWhitespace(element); - - options.draggables = []; - options.droppables = []; - - // drop on empty handling - if(options.dropOnEmpty || options.tree) { - Droppables.add(element, options_for_tree); - options.droppables.push(element); - } - - (options.elements || this.findElements(element, options) || []).each( function(e,i) { - var handle = options.handles ? $(options.handles[i]) : - (options.handle ? $(e).getElementsByClassName(options.handle)[0] : e); - options.draggables.push( - new Draggable(e, Object.extend(options_for_draggable, { handle: handle }))); - Droppables.add(e, options_for_droppable); - if(options.tree) e.treeNode = element; - options.droppables.push(e); - }); - - if(options.tree) { - (Sortable.findTreeElements(element, options) || []).each( function(e) { - Droppables.add(e, options_for_tree); - e.treeNode = element; - options.droppables.push(e); - }); - } - - // keep reference - this.sortables[element.id] = options; - - // for onupdate - Draggables.addObserver(new SortableObserver(element, options.onUpdate)); - - }, - - // return all suitable-for-sortable elements in a guaranteed order - findElements: function(element, options) { - return Element.findChildren( - element, options.only, options.tree ? true : false, options.tag); - }, - - findTreeElements: function(element, options) { - return Element.findChildren( - element, options.only, options.tree ? true : false, options.treeTag); - }, - - onHover: function(element, dropon, overlap) { - if(Element.isParent(dropon, element)) return; - - if(overlap > .33 && overlap < .66 && Sortable.options(dropon).tree) { - return; - } else if(overlap>0.5) { - Sortable.mark(dropon, 'before'); - if(dropon.previousSibling != element) { - var oldParentNode = element.parentNode; - element.style.visibility = "hidden"; // fix gecko rendering - dropon.parentNode.insertBefore(element, dropon); - if(dropon.parentNode!=oldParentNode) - Sortable.options(oldParentNode).onChange(element); - Sortable.options(dropon.parentNode).onChange(element); - } - } else { - Sortable.mark(dropon, 'after'); - var nextElement = dropon.nextSibling || null; - if(nextElement != element) { - var oldParentNode = element.parentNode; - element.style.visibility = "hidden"; // fix gecko rendering - dropon.parentNode.insertBefore(element, nextElement); - if(dropon.parentNode!=oldParentNode) - Sortable.options(oldParentNode).onChange(element); - Sortable.options(dropon.parentNode).onChange(element); - } - } - }, - - onEmptyHover: function(element, dropon, overlap) { - var oldParentNode = element.parentNode; - var droponOptions = Sortable.options(dropon); - - if(!Element.isParent(dropon, element)) { - var index; - - var children = Sortable.findElements(dropon, {tag: droponOptions.tag, only: droponOptions.only}); - var child = null; - - if(children) { - var offset = Element.offsetSize(dropon, droponOptions.overlap) * (1.0 - overlap); - - for (index = 0; index < children.length; index += 1) { - if (offset - Element.offsetSize (children[index], droponOptions.overlap) >= 0) { - offset -= Element.offsetSize (children[index], droponOptions.overlap); - } else if (offset - (Element.offsetSize (children[index], droponOptions.overlap) / 2) >= 0) { - child = index + 1 < children.length ? children[index + 1] : null; - break; - } else { - child = children[index]; - break; - } - } - } - - dropon.insertBefore(element, child); - - Sortable.options(oldParentNode).onChange(element); - droponOptions.onChange(element); - } - }, - - unmark: function() { - if(Sortable._marker) Sortable._marker.hide(); - }, - - mark: function(dropon, position) { - // mark on ghosting only - var sortable = Sortable.options(dropon.parentNode); - if(sortable && !sortable.ghosting) return; - - if(!Sortable._marker) { - Sortable._marker = - ($('dropmarker') || Element.extend(document.createElement('DIV'))). - hide().addClassName('dropmarker').setStyle({position:'absolute'}); - document.getElementsByTagName("body").item(0).appendChild(Sortable._marker); - } - var offsets = Position.cumulativeOffset(dropon); - Sortable._marker.setStyle({left: offsets[0]+'px', top: offsets[1] + 'px'}); - - if(position=='after') - if(sortable.overlap == 'horizontal') - Sortable._marker.setStyle({left: (offsets[0]+dropon.clientWidth) + 'px'}); - else - Sortable._marker.setStyle({top: (offsets[1]+dropon.clientHeight) + 'px'}); - - Sortable._marker.show(); - }, - - _tree: function(element, options, parent) { - var children = Sortable.findElements(element, options) || []; - - for (var i = 0; i < children.length; ++i) { - var match = children[i].id.match(options.format); - - if (!match) continue; - - var child = { - id: encodeURIComponent(match ? match[1] : null), - element: element, - parent: parent, - children: [], - position: parent.children.length, - container: $(children[i]).down(options.treeTag) - } - - /* Get the element containing the children and recurse over it */ - if (child.container) - this._tree(child.container, options, child) - - parent.children.push (child); - } - - return parent; - }, - - tree: function(element) { - element = $(element); - var sortableOptions = this.options(element); - var options = Object.extend({ - tag: sortableOptions.tag, - treeTag: sortableOptions.treeTag, - only: sortableOptions.only, - name: element.id, - format: sortableOptions.format - }, arguments[1] || { }); - - var root = { - id: null, - parent: null, - children: [], - container: element, - position: 0 - } - - return Sortable._tree(element, options, root); - }, - - /* Construct a [i] index for a particular node */ - _constructIndex: function(node) { - var index = ''; - do { - if (node.id) index = '[' + node.position + ']' + index; - } while ((node = node.parent) != null); - return index; - }, - - sequence: function(element) { - element = $(element); - var options = Object.extend(this.options(element), arguments[1] || { }); - - return $(this.findElements(element, options) || []).map( function(item) { - return item.id.match(options.format) ? item.id.match(options.format)[1] : ''; - }); - }, - - setSequence: function(element, new_sequence) { - element = $(element); - var options = Object.extend(this.options(element), arguments[2] || { }); - - var nodeMap = { }; - this.findElements(element, options).each( function(n) { - if (n.id.match(options.format)) - nodeMap[n.id.match(options.format)[1]] = [n, n.parentNode]; - n.parentNode.removeChild(n); - }); - - new_sequence.each(function(ident) { - var n = nodeMap[ident]; - if (n) { - n[1].appendChild(n[0]); - delete nodeMap[ident]; - } - }); - }, - - serialize: function(element) { - element = $(element); - var options = Object.extend(Sortable.options(element), arguments[1] || { }); - var name = encodeURIComponent( - (arguments[1] && arguments[1].name) ? arguments[1].name : element.id); - - if (options.tree) { - return Sortable.tree(element, arguments[1]).children.map( function (item) { - return [name + Sortable._constructIndex(item) + "[id]=" + - encodeURIComponent(item.id)].concat(item.children.map(arguments.callee)); - }).flatten().join('&'); - } else { - return Sortable.sequence(element, arguments[1]).map( function(item) { - return name + "[]=" + encodeURIComponent(item); - }).join('&'); - } - } -} - -// Returns true if child is contained within element -Element.isParent = function(child, element) { - if (!child.parentNode || child == element) return false; - if (child.parentNode == element) return true; - return Element.isParent(child.parentNode, element); -} - -Element.findChildren = function(element, only, recursive, tagName) { - if(!element.hasChildNodes()) return null; - tagName = tagName.toUpperCase(); - if(only) only = [only].flatten(); - var elements = []; - $A(element.childNodes).each( function(e) { - if(e.tagName && e.tagName.toUpperCase()==tagName && - (!only || (Element.classNames(e).detect(function(v) { return only.include(v) })))) - elements.push(e); - if(recursive) { - var grandchildren = Element.findChildren(e, only, recursive, tagName); - if(grandchildren) elements.push(grandchildren); - } - }); - - return (elements.length>0 ? elements.flatten() : []); -} - -Element.offsetSize = function (element, type) { - return element['offset' + ((type=='vertical' || type=='height') ? 'Height' : 'Width')]; -} diff --git a/vendor/plugins/rspec/story_server/prototype/javascripts/effects.js b/vendor/plugins/rspec/story_server/prototype/javascripts/effects.js deleted file mode 100644 index 2862f6f83..000000000 --- a/vendor/plugins/rspec/story_server/prototype/javascripts/effects.js +++ /dev/null @@ -1,1117 +0,0 @@ -// script.aculo.us effects.js v1.8.0_pre1, Fri Oct 12 21:34:51 +0200 2007 - -// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) -// Contributors: -// Justin Palmer (http://encytemedia.com/) -// Mark Pilgrim (http://diveintomark.org/) -// Martin Bialasinki -// -// script.aculo.us is freely distributable under the terms of an MIT-style license. -// For details, see the script.aculo.us web site: http://script.aculo.us/ - -// converts rgb() and #xxx to #xxxxxx format, -// returns self (or first argument) if not convertable -String.prototype.parseColor = function() { - var color = '#'; - if (this.slice(0,4) == 'rgb(') { - var cols = this.slice(4,this.length-1).split(','); - var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3); - } else { - if (this.slice(0,1) == '#') { - if (this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase(); - if (this.length==7) color = this.toLowerCase(); - } - } - return (color.length==7 ? color : (arguments[0] || this)); -}; - -/*--------------------------------------------------------------------------*/ - -Element.collectTextNodes = function(element) { - return $A($(element).childNodes).collect( function(node) { - return (node.nodeType==3 ? node.nodeValue : - (node.hasChildNodes() ? Element.collectTextNodes(node) : '')); - }).flatten().join(''); -}; - -Element.collectTextNodesIgnoreClass = function(element, className) { - return $A($(element).childNodes).collect( function(node) { - return (node.nodeType==3 ? node.nodeValue : - ((node.hasChildNodes() && !Element.hasClassName(node,className)) ? - Element.collectTextNodesIgnoreClass(node, className) : '')); - }).flatten().join(''); -}; - -Element.setContentZoom = function(element, percent) { - element = $(element); - element.setStyle({fontSize: (percent/100) + 'em'}); - if (Prototype.Browser.WebKit) window.scrollBy(0,0); - return element; -}; - -Element.getInlineOpacity = function(element){ - return $(element).style.opacity || ''; -}; - -Element.forceRerendering = function(element) { - try { - element = $(element); - var n = document.createTextNode(' '); - element.appendChild(n); - element.removeChild(n); - } catch(e) { } -}; - -/*--------------------------------------------------------------------------*/ - -var Effect = { - _elementDoesNotExistError: { - name: 'ElementDoesNotExistError', - message: 'The specified DOM element does not exist, but is required for this effect to operate' - }, - Transitions: { - linear: Prototype.K, - sinoidal: function(pos) { - return (-Math.cos(pos*Math.PI)/2) + 0.5; - }, - reverse: function(pos) { - return 1-pos; - }, - flicker: function(pos) { - var pos = ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4; - return pos > 1 ? 1 : pos; - }, - wobble: function(pos) { - return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5; - }, - pulse: function(pos, pulses) { - pulses = pulses || 5; - return ( - ((pos % (1/pulses)) * pulses).round() == 0 ? - ((pos * pulses * 2) - (pos * pulses * 2).floor()) : - 1 - ((pos * pulses * 2) - (pos * pulses * 2).floor()) - ); - }, - spring: function(pos) { - return 1 - (Math.cos(pos * 4.5 * Math.PI) * Math.exp(-pos * 6)); - }, - none: function(pos) { - return 0; - }, - full: function(pos) { - return 1; - } - }, - DefaultOptions: { - duration: 1.0, // seconds - fps: 100, // 100= assume 66fps max. - sync: false, // true for combining - from: 0.0, - to: 1.0, - delay: 0.0, - queue: 'parallel' - }, - tagifyText: function(element) { - var tagifyStyle = 'position:relative'; - if (Prototype.Browser.IE) tagifyStyle += ';zoom:1'; - - element = $(element); - $A(element.childNodes).each( function(child) { - if (child.nodeType==3) { - child.nodeValue.toArray().each( function(character) { - element.insertBefore( - new Element('span', {style: tagifyStyle}).update( - character == ' ' ? String.fromCharCode(160) : character), - child); - }); - Element.remove(child); - } - }); - }, - multiple: function(element, effect) { - var elements; - if (((typeof element == 'object') || - Object.isFunction(element)) && - (element.length)) - elements = element; - else - elements = $(element).childNodes; - - var options = Object.extend({ - speed: 0.1, - delay: 0.0 - }, arguments[2] || { }); - var masterDelay = options.delay; - - $A(elements).each( function(element, index) { - new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay })); - }); - }, - PAIRS: { - 'slide': ['SlideDown','SlideUp'], - 'blind': ['BlindDown','BlindUp'], - 'appear': ['Appear','Fade'] - }, - toggle: function(element, effect) { - element = $(element); - effect = (effect || 'appear').toLowerCase(); - var options = Object.extend({ - queue: { position:'end', scope:(element.id || 'global'), limit: 1 } - }, arguments[2] || { }); - Effect[element.visible() ? - Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options); - } -}; - -Effect.DefaultOptions.transition = Effect.Transitions.sinoidal; - -/* ------------- core effects ------------- */ - -Effect.ScopedQueue = Class.create(Enumerable, { - initialize: function() { - this.effects = []; - this.interval = null; - }, - _each: function(iterator) { - this.effects._each(iterator); - }, - add: function(effect) { - var timestamp = new Date().getTime(); - - var position = Object.isString(effect.options.queue) ? - effect.options.queue : effect.options.queue.position; - - switch(position) { - case 'front': - // move unstarted effects after this effect - this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) { - e.startOn += effect.finishOn; - e.finishOn += effect.finishOn; - }); - break; - case 'with-last': - timestamp = this.effects.pluck('startOn').max() || timestamp; - break; - case 'end': - // start effect after last queued effect has finished - timestamp = this.effects.pluck('finishOn').max() || timestamp; - break; - } - - effect.startOn += timestamp; - effect.finishOn += timestamp; - - if (!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit)) - this.effects.push(effect); - - if (!this.interval) - this.interval = setInterval(this.loop.bind(this), 15); - }, - remove: function(effect) { - this.effects = this.effects.reject(function(e) { return e==effect }); - if (this.effects.length == 0) { - clearInterval(this.interval); - this.interval = null; - } - }, - loop: function() { - var timePos = new Date().getTime(); - for(var i=0, len=this.effects.length;i<len;i++) - this.effects[i] && this.effects[i].loop(timePos); - } -}); - -Effect.Queues = { - instances: $H(), - get: function(queueName) { - if (!Object.isString(queueName)) return queueName; - - if (!this.instances[queueName]) - this.instances[queueName] = new Effect.ScopedQueue(); - - return this.instances[queueName]; - } -}; -Effect.Queue = Effect.Queues.get('global'); - -Effect.Base = Class.create(); -Effect.Base.prototype = { - position: null, - start: function(options) { - function codeForEvent(options,eventName){ - return ( - (options[eventName+'Internal'] ? 'this.options.'+eventName+'Internal(this);' : '') + - (options[eventName] ? 'this.options.'+eventName+'(this);' : '') - ); - } - if (options && options.transition === false) options.transition = Effect.Transitions.linear; - this.options = Object.extend(Object.extend({ },Effect.DefaultOptions), options || { }); - this.currentFrame = 0; - this.state = 'idle'; - this.startOn = this.options.delay*1000; - this.finishOn = this.startOn+(this.options.duration*1000); - this.fromToDelta = this.options.to-this.options.from; - this.totalTime = this.finishOn-this.startOn; - this.totalFrames = this.options.fps*this.options.duration; - - eval('this.render = function(pos){ '+ - 'if (this.state=="idle"){this.state="running";'+ - codeForEvent(this.options,'beforeSetup')+ - (this.setup ? 'this.setup();':'')+ - codeForEvent(this.options,'afterSetup')+ - '};if (this.state=="running"){'+ - 'pos=this.options.transition(pos)*'+this.fromToDelta+'+'+this.options.from+';'+ - 'this.position=pos;'+ - codeForEvent(this.options,'beforeUpdate')+ - (this.update ? 'this.update(pos);':'')+ - codeForEvent(this.options,'afterUpdate')+ - '}}'); - - this.event('beforeStart'); - if (!this.options.sync) - Effect.Queues.get(Object.isString(this.options.queue) ? - 'global' : this.options.queue.scope).add(this); - }, - loop: function(timePos) { - if (timePos >= this.startOn) { - if (timePos >= this.finishOn) { - this.render(1.0); - this.cancel(); - this.event('beforeFinish'); - if (this.finish) this.finish(); - this.event('afterFinish'); - return; - } - var pos = (timePos - this.startOn) / this.totalTime, - frame = (pos * this.totalFrames).round(); - if (frame > this.currentFrame) { - this.render(pos); - this.currentFrame = frame; - } - } - }, - cancel: function() { - if (!this.options.sync) - Effect.Queues.get(Object.isString(this.options.queue) ? - 'global' : this.options.queue.scope).remove(this); - this.state = 'finished'; - }, - event: function(eventName) { - if (this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this); - if (this.options[eventName]) this.options[eventName](this); - }, - inspect: function() { - var data = $H(); - for(property in this) - if (!Object.isFunction(this[property])) data[property] = this[property]; - return '#<Effect:' + data.inspect() + ',options:' + $H(this.options).inspect() + '>'; - } -}; - -Effect.Parallel = Class.create(Effect.Base, { - initialize: function(effects) { - this.effects = effects || []; - this.start(arguments[1]); - }, - update: function(position) { - this.effects.invoke('render', position); - }, - finish: function(position) { - this.effects.each( function(effect) { - effect.render(1.0); - effect.cancel(); - effect.event('beforeFinish'); - if (effect.finish) effect.finish(position); - effect.event('afterFinish'); - }); - } -}); - -Effect.Tween = Class.create(Effect.Base, { - initialize: function(object, from, to) { - object = Object.isString(object) ? $(object) : object; - var args = $A(arguments), method = args.last(), - options = args.length == 5 ? args[3] : null; - this.method = Object.isFunction(method) ? method.bind(object) : - Object.isFunction(object[method]) ? object[method].bind(object) : - function(value) { object[method] = value }; - this.start(Object.extend({ from: from, to: to }, options || { })); - }, - update: function(position) { - this.method(position); - } -}); - -Effect.Event = Class.create(Effect.Base, { - initialize: function() { - this.start(Object.extend({ duration: 0 }, arguments[0] || { })); - }, - update: Prototype.emptyFunction -}); - -Effect.Opacity = Class.create(Effect.Base, { - initialize: function(element) { - this.element = $(element); - if (!this.element) throw(Effect._elementDoesNotExistError); - // make this work on IE on elements without 'layout' - if (Prototype.Browser.IE && (!this.element.currentStyle.hasLayout)) - this.element.setStyle({zoom: 1}); - var options = Object.extend({ - from: this.element.getOpacity() || 0.0, - to: 1.0 - }, arguments[1] || { }); - this.start(options); - }, - update: function(position) { - this.element.setOpacity(position); - } -}); - -Effect.Move = Class.create(Effect.Base, { - initialize: function(element) { - this.element = $(element); - if (!this.element) throw(Effect._elementDoesNotExistError); - var options = Object.extend({ - x: 0, - y: 0, - mode: 'relative' - }, arguments[1] || { }); - this.start(options); - }, - setup: function() { - this.element.makePositioned(); - this.originalLeft = parseFloat(this.element.getStyle('left') || '0'); - this.originalTop = parseFloat(this.element.getStyle('top') || '0'); - if (this.options.mode == 'absolute') { - this.options.x = this.options.x - this.originalLeft; - this.options.y = this.options.y - this.originalTop; - } - }, - update: function(position) { - this.element.setStyle({ - left: (this.options.x * position + this.originalLeft).round() + 'px', - top: (this.options.y * position + this.originalTop).round() + 'px' - }); - } -}); - -// for backwards compatibility -Effect.MoveBy = function(element, toTop, toLeft) { - return new Effect.Move(element, - Object.extend({ x: toLeft, y: toTop }, arguments[3] || { })); -}; - -Effect.Scale = Class.create(Effect.Base, { - initialize: function(element, percent) { - this.element = $(element); - if (!this.element) throw(Effect._elementDoesNotExistError); - var options = Object.extend({ - scaleX: true, - scaleY: true, - scaleContent: true, - scaleFromCenter: false, - scaleMode: 'box', // 'box' or 'contents' or { } with provided values - scaleFrom: 100.0, - scaleTo: percent - }, arguments[2] || { }); - this.start(options); - }, - setup: function() { - this.restoreAfterFinish = this.options.restoreAfterFinish || false; - this.elementPositioning = this.element.getStyle('position'); - - this.originalStyle = { }; - ['top','left','width','height','fontSize'].each( function(k) { - this.originalStyle[k] = this.element.style[k]; - }.bind(this)); - - this.originalTop = this.element.offsetTop; - this.originalLeft = this.element.offsetLeft; - - var fontSize = this.element.getStyle('font-size') || '100%'; - ['em','px','%','pt'].each( function(fontSizeType) { - if (fontSize.indexOf(fontSizeType)>0) { - this.fontSize = parseFloat(fontSize); - this.fontSizeType = fontSizeType; - } - }.bind(this)); - - this.factor = (this.options.scaleTo - this.options.scaleFrom)/100; - - this.dims = null; - if (this.options.scaleMode=='box') - this.dims = [this.element.offsetHeight, this.element.offsetWidth]; - if (/^content/.test(this.options.scaleMode)) - this.dims = [this.element.scrollHeight, this.element.scrollWidth]; - if (!this.dims) - this.dims = [this.options.scaleMode.originalHeight, - this.options.scaleMode.originalWidth]; - }, - update: function(position) { - var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position); - if (this.options.scaleContent && this.fontSize) - this.element.setStyle({fontSize: this.fontSize * currentScale + this.fontSizeType }); - this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale); - }, - finish: function(position) { - if (this.restoreAfterFinish) this.element.setStyle(this.originalStyle); - }, - setDimensions: function(height, width) { - var d = { }; - if (this.options.scaleX) d.width = width.round() + 'px'; - if (this.options.scaleY) d.height = height.round() + 'px'; - if (this.options.scaleFromCenter) { - var topd = (height - this.dims[0])/2; - var leftd = (width - this.dims[1])/2; - if (this.elementPositioning == 'absolute') { - if (this.options.scaleY) d.top = this.originalTop-topd + 'px'; - if (this.options.scaleX) d.left = this.originalLeft-leftd + 'px'; - } else { - if (this.options.scaleY) d.top = -topd + 'px'; - if (this.options.scaleX) d.left = -leftd + 'px'; - } - } - this.element.setStyle(d); - } -}); - -Effect.Highlight = Class.create(Effect.Base, { - initialize: function(element) { - this.element = $(element); - if (!this.element) throw(Effect._elementDoesNotExistError); - var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || { }); - this.start(options); - }, - setup: function() { - // Prevent executing on elements not in the layout flow - if (this.element.getStyle('display')=='none') { this.cancel(); return; } - // Disable background image during the effect - this.oldStyle = { }; - if (!this.options.keepBackgroundImage) { - this.oldStyle.backgroundImage = this.element.getStyle('background-image'); - this.element.setStyle({backgroundImage: 'none'}); - } - if (!this.options.endcolor) - this.options.endcolor = this.element.getStyle('background-color').parseColor('#ffffff'); - if (!this.options.restorecolor) - this.options.restorecolor = this.element.getStyle('background-color'); - // init color calculations - this._base = $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this)); - this._delta = $R(0,2).map(function(i){ return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i] }.bind(this)); - }, - update: function(position) { - this.element.setStyle({backgroundColor: $R(0,2).inject('#',function(m,v,i){ - return m+((this._base[i]+(this._delta[i]*position)).round().toColorPart()); }.bind(this)) }); - }, - finish: function() { - this.element.setStyle(Object.extend(this.oldStyle, { - backgroundColor: this.options.restorecolor - })); - } -}); - -Effect.ScrollTo = function(element) { - var options = arguments[1] || { }, - scrollOffsets = document.viewport.getScrollOffsets(), - elementOffsets = $(element).cumulativeOffset(), - max = (window.height || document.body.scrollHeight) - document.viewport.getHeight(); - - if (options.offset) elementOffsets[1] += options.offset; - - return new Effect.Tween(null, - scrollOffsets.top, - elementOffsets[1] > max ? max : elementOffsets[1], - options, - function(p){ scrollTo(scrollOffsets.left, p.round()) } - ); -}; - -/* ------------- combination effects ------------- */ - -Effect.Fade = function(element) { - element = $(element); - var oldOpacity = element.getInlineOpacity(); - var options = Object.extend({ - from: element.getOpacity() || 1.0, - to: 0.0, - afterFinishInternal: function(effect) { - if (effect.options.to!=0) return; - effect.element.hide().setStyle({opacity: oldOpacity}); - } - }, arguments[1] || { }); - return new Effect.Opacity(element,options); -}; - -Effect.Appear = function(element) { - element = $(element); - var options = Object.extend({ - from: (element.getStyle('display') == 'none' ? 0.0 : element.getOpacity() || 0.0), - to: 1.0, - // force Safari to render floated elements properly - afterFinishInternal: function(effect) { - effect.element.forceRerendering(); - }, - beforeSetup: function(effect) { - effect.element.setOpacity(effect.options.from).show(); - }}, arguments[1] || { }); - return new Effect.Opacity(element,options); -}; - -Effect.Puff = function(element) { - element = $(element); - var oldStyle = { - opacity: element.getInlineOpacity(), - position: element.getStyle('position'), - top: element.style.top, - left: element.style.left, - width: element.style.width, - height: element.style.height - }; - return new Effect.Parallel( - [ new Effect.Scale(element, 200, - { sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }), - new Effect.Opacity(element, { sync: true, to: 0.0 } ) ], - Object.extend({ duration: 1.0, - beforeSetupInternal: function(effect) { - Position.absolutize(effect.effects[0].element) - }, - afterFinishInternal: function(effect) { - effect.effects[0].element.hide().setStyle(oldStyle); } - }, arguments[1] || { }) - ); -}; - -Effect.BlindUp = function(element) { - element = $(element); - element.makeClipping(); - return new Effect.Scale(element, 0, - Object.extend({ scaleContent: false, - scaleX: false, - restoreAfterFinish: true, - afterFinishInternal: function(effect) { - effect.element.hide().undoClipping(); - } - }, arguments[1] || { }) - ); -}; - -Effect.BlindDown = function(element) { - element = $(element); - var elementDimensions = element.getDimensions(); - return new Effect.Scale(element, 100, Object.extend({ - scaleContent: false, - scaleX: false, - scaleFrom: 0, - scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width}, - restoreAfterFinish: true, - afterSetup: function(effect) { - effect.element.makeClipping().setStyle({height: '0px'}).show(); - }, - afterFinishInternal: function(effect) { - effect.element.undoClipping(); - } - }, arguments[1] || { })); -}; - -Effect.SwitchOff = function(element) { - element = $(element); - var oldOpacity = element.getInlineOpacity(); - return new Effect.Appear(element, Object.extend({ - duration: 0.4, - from: 0, - transition: Effect.Transitions.flicker, - afterFinishInternal: function(effect) { - new Effect.Scale(effect.element, 1, { - duration: 0.3, scaleFromCenter: true, - scaleX: false, scaleContent: false, restoreAfterFinish: true, - beforeSetup: function(effect) { - effect.element.makePositioned().makeClipping(); - }, - afterFinishInternal: function(effect) { - effect.element.hide().undoClipping().undoPositioned().setStyle({opacity: oldOpacity}); - } - }) - } - }, arguments[1] || { })); -}; - -Effect.DropOut = function(element) { - element = $(element); - var oldStyle = { - top: element.getStyle('top'), - left: element.getStyle('left'), - opacity: element.getInlineOpacity() }; - return new Effect.Parallel( - [ new Effect.Move(element, {x: 0, y: 100, sync: true }), - new Effect.Opacity(element, { sync: true, to: 0.0 }) ], - Object.extend( - { duration: 0.5, - beforeSetup: function(effect) { - effect.effects[0].element.makePositioned(); - }, - afterFinishInternal: function(effect) { - effect.effects[0].element.hide().undoPositioned().setStyle(oldStyle); - } - }, arguments[1] || { })); -}; - -Effect.Shake = function(element) { - element = $(element); - var oldStyle = { - top: element.getStyle('top'), - left: element.getStyle('left') }; - return new Effect.Move(element, - { x: 20, y: 0, duration: 0.05, afterFinishInternal: function(effect) { - new Effect.Move(effect.element, - { x: -40, y: 0, duration: 0.1, afterFinishInternal: function(effect) { - new Effect.Move(effect.element, - { x: 40, y: 0, duration: 0.1, afterFinishInternal: function(effect) { - new Effect.Move(effect.element, - { x: -40, y: 0, duration: 0.1, afterFinishInternal: function(effect) { - new Effect.Move(effect.element, - { x: 40, y: 0, duration: 0.1, afterFinishInternal: function(effect) { - new Effect.Move(effect.element, - { x: -20, y: 0, duration: 0.05, afterFinishInternal: function(effect) { - effect.element.undoPositioned().setStyle(oldStyle); - }}) }}) }}) }}) }}) }}); -}; - -Effect.SlideDown = function(element) { - element = $(element).cleanWhitespace(); - // SlideDown need to have the content of the element wrapped in a container element with fixed height! - var oldInnerBottom = element.down().getStyle('bottom'); - var elementDimensions = element.getDimensions(); - return new Effect.Scale(element, 100, Object.extend({ - scaleContent: false, - scaleX: false, - scaleFrom: window.opera ? 0 : 1, - scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width}, - restoreAfterFinish: true, - afterSetup: function(effect) { - effect.element.makePositioned(); - effect.element.down().makePositioned(); - if (window.opera) effect.element.setStyle({top: ''}); - effect.element.makeClipping().setStyle({height: '0px'}).show(); - }, - afterUpdateInternal: function(effect) { - effect.element.down().setStyle({bottom: - (effect.dims[0] - effect.element.clientHeight) + 'px' }); - }, - afterFinishInternal: function(effect) { - effect.element.undoClipping().undoPositioned(); - effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom}); } - }, arguments[1] || { }) - ); -}; - -Effect.SlideUp = function(element) { - element = $(element).cleanWhitespace(); - var oldInnerBottom = element.down().getStyle('bottom'); - var elementDimensions = element.getDimensions(); - return new Effect.Scale(element, window.opera ? 0 : 1, - Object.extend({ scaleContent: false, - scaleX: false, - scaleMode: 'box', - scaleFrom: 100, - scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width}, - restoreAfterFinish: true, - afterSetup: function(effect) { - effect.element.makePositioned(); - effect.element.down().makePositioned(); - if (window.opera) effect.element.setStyle({top: ''}); - effect.element.makeClipping().show(); - }, - afterUpdateInternal: function(effect) { - effect.element.down().setStyle({bottom: - (effect.dims[0] - effect.element.clientHeight) + 'px' }); - }, - afterFinishInternal: function(effect) { - effect.element.hide().undoClipping().undoPositioned(); - effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom}); - } - }, arguments[1] || { }) - ); -}; - -// Bug in opera makes the TD containing this element expand for a instance after finish -Effect.Squish = function(element) { - return new Effect.Scale(element, window.opera ? 1 : 0, { - restoreAfterFinish: true, - beforeSetup: function(effect) { - effect.element.makeClipping(); - }, - afterFinishInternal: function(effect) { - effect.element.hide().undoClipping(); - } - }); -}; - -Effect.Grow = function(element) { - element = $(element); - var options = Object.extend({ - direction: 'center', - moveTransition: Effect.Transitions.sinoidal, - scaleTransition: Effect.Transitions.sinoidal, - opacityTransition: Effect.Transitions.full - }, arguments[1] || { }); - var oldStyle = { - top: element.style.top, - left: element.style.left, - height: element.style.height, - width: element.style.width, - opacity: element.getInlineOpacity() }; - - var dims = element.getDimensions(); - var initialMoveX, initialMoveY; - var moveX, moveY; - - switch (options.direction) { - case 'top-left': - initialMoveX = initialMoveY = moveX = moveY = 0; - break; - case 'top-right': - initialMoveX = dims.width; - initialMoveY = moveY = 0; - moveX = -dims.width; - break; - case 'bottom-left': - initialMoveX = moveX = 0; - initialMoveY = dims.height; - moveY = -dims.height; - break; - case 'bottom-right': - initialMoveX = dims.width; - initialMoveY = dims.height; - moveX = -dims.width; - moveY = -dims.height; - break; - case 'center': - initialMoveX = dims.width / 2; - initialMoveY = dims.height / 2; - moveX = -dims.width / 2; - moveY = -dims.height / 2; - break; - } - - return new Effect.Move(element, { - x: initialMoveX, - y: initialMoveY, - duration: 0.01, - beforeSetup: function(effect) { - effect.element.hide().makeClipping().makePositioned(); - }, - afterFinishInternal: function(effect) { - new Effect.Parallel( - [ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }), - new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }), - new Effect.Scale(effect.element, 100, { - scaleMode: { originalHeight: dims.height, originalWidth: dims.width }, - sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true}) - ], Object.extend({ - beforeSetup: function(effect) { - effect.effects[0].element.setStyle({height: '0px'}).show(); - }, - afterFinishInternal: function(effect) { - effect.effects[0].element.undoClipping().undoPositioned().setStyle(oldStyle); - } - }, options) - ) - } - }); -}; - -Effect.Shrink = function(element) { - element = $(element); - var options = Object.extend({ - direction: 'center', - moveTransition: Effect.Transitions.sinoidal, - scaleTransition: Effect.Transitions.sinoidal, - opacityTransition: Effect.Transitions.none - }, arguments[1] || { }); - var oldStyle = { - top: element.style.top, - left: element.style.left, - height: element.style.height, - width: element.style.width, - opacity: element.getInlineOpacity() }; - - var dims = element.getDimensions(); - var moveX, moveY; - - switch (options.direction) { - case 'top-left': - moveX = moveY = 0; - break; - case 'top-right': - moveX = dims.width; - moveY = 0; - break; - case 'bottom-left': - moveX = 0; - moveY = dims.height; - break; - case 'bottom-right': - moveX = dims.width; - moveY = dims.height; - break; - case 'center': - moveX = dims.width / 2; - moveY = dims.height / 2; - break; - } - - return new Effect.Parallel( - [ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }), - new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}), - new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }) - ], Object.extend({ - beforeStartInternal: function(effect) { - effect.effects[0].element.makePositioned().makeClipping(); - }, - afterFinishInternal: function(effect) { - effect.effects[0].element.hide().undoClipping().undoPositioned().setStyle(oldStyle); } - }, options) - ); -}; - -Effect.Pulsate = function(element) { - element = $(element); - var options = arguments[1] || { }; - var oldOpacity = element.getInlineOpacity(); - var transition = options.transition || Effect.Transitions.sinoidal; - var reverser = function(pos){ return transition(1-Effect.Transitions.pulse(pos, options.pulses)) }; - reverser.bind(transition); - return new Effect.Opacity(element, - Object.extend(Object.extend({ duration: 2.0, from: 0, - afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); } - }, options), {transition: reverser})); -}; - -Effect.Fold = function(element) { - element = $(element); - var oldStyle = { - top: element.style.top, - left: element.style.left, - width: element.style.width, - height: element.style.height }; - element.makeClipping(); - return new Effect.Scale(element, 5, Object.extend({ - scaleContent: false, - scaleX: false, - afterFinishInternal: function(effect) { - new Effect.Scale(element, 1, { - scaleContent: false, - scaleY: false, - afterFinishInternal: function(effect) { - effect.element.hide().undoClipping().setStyle(oldStyle); - } }); - }}, arguments[1] || { })); -}; - -Effect.Morph = Class.create(Effect.Base, { - initialize: function(element) { - this.element = $(element); - if (!this.element) throw(Effect._elementDoesNotExistError); - var options = Object.extend({ - style: { } - }, arguments[1] || { }); - - if (!Object.isString(options.style)) this.style = $H(options.style); - else { - if (options.style.include(':')) - this.style = options.style.parseStyle(); - else { - this.element.addClassName(options.style); - this.style = $H(this.element.getStyles()); - this.element.removeClassName(options.style); - var css = this.element.getStyles(); - this.style = this.style.reject(function(style) { - return style.value == css[style.key]; - }); - options.afterFinishInternal = function(effect) { - effect.element.addClassName(effect.options.style); - effect.transforms.each(function(transform) { - effect.element.style[transform.style] = ''; - }); - } - } - } - this.start(options); - }, - - setup: function(){ - function parseColor(color){ - if (!color || ['rgba(0, 0, 0, 0)','transparent'].include(color)) color = '#ffffff'; - color = color.parseColor(); - return $R(0,2).map(function(i){ - return parseInt( color.slice(i*2+1,i*2+3), 16 ) - }); - } - this.transforms = this.style.map(function(pair){ - var property = pair[0], value = pair[1], unit = null; - - if (value.parseColor('#zzzzzz') != '#zzzzzz') { - value = value.parseColor(); - unit = 'color'; - } else if (property == 'opacity') { - value = parseFloat(value); - if (Prototype.Browser.IE && (!this.element.currentStyle.hasLayout)) - this.element.setStyle({zoom: 1}); - } else if (Element.CSS_LENGTH.test(value)) { - var components = value.match(/^([\+\-]?[0-9\.]+)(.*)$/); - value = parseFloat(components[1]); - unit = (components.length == 3) ? components[2] : null; - } - - var originalValue = this.element.getStyle(property); - return { - style: property.camelize(), - originalValue: unit=='color' ? parseColor(originalValue) : parseFloat(originalValue || 0), - targetValue: unit=='color' ? parseColor(value) : value, - unit: unit - }; - }.bind(this)).reject(function(transform){ - return ( - (transform.originalValue == transform.targetValue) || - ( - transform.unit != 'color' && - (isNaN(transform.originalValue) || isNaN(transform.targetValue)) - ) - ) - }); - }, - update: function(position) { - var style = { }, transform, i = this.transforms.length; - while(i--) - style[(transform = this.transforms[i]).style] = - transform.unit=='color' ? '#'+ - (Math.round(transform.originalValue[0]+ - (transform.targetValue[0]-transform.originalValue[0])*position)).toColorPart() + - (Math.round(transform.originalValue[1]+ - (transform.targetValue[1]-transform.originalValue[1])*position)).toColorPart() + - (Math.round(transform.originalValue[2]+ - (transform.targetValue[2]-transform.originalValue[2])*position)).toColorPart() : - (transform.originalValue + - (transform.targetValue - transform.originalValue) * position).toFixed(3) + - (transform.unit === null ? '' : transform.unit); - this.element.setStyle(style, true); - } -}); - -Effect.Transform = Class.create({ - initialize: function(tracks){ - this.tracks = []; - this.options = arguments[1] || { }; - this.addTracks(tracks); - }, - addTracks: function(tracks){ - tracks.each(function(track){ - var data = $H(track).values().first(); - this.tracks.push($H({ - ids: $H(track).keys().first(), - effect: Effect.Morph, - options: { style: data } - })); - }.bind(this)); - return this; - }, - play: function(){ - return new Effect.Parallel( - this.tracks.map(function(track){ - var elements = [$(track.ids) || $$(track.ids)].flatten(); - return elements.map(function(e){ return new track.effect(e, Object.extend({ sync:true }, track.options)) }); - }).flatten(), - this.options - ); - } -}); - -Element.CSS_PROPERTIES = $w( - 'backgroundColor backgroundPosition borderBottomColor borderBottomStyle ' + - 'borderBottomWidth borderLeftColor borderLeftStyle borderLeftWidth ' + - 'borderRightColor borderRightStyle borderRightWidth borderSpacing ' + - 'borderTopColor borderTopStyle borderTopWidth bottom clip color ' + - 'fontSize fontWeight height left letterSpacing lineHeight ' + - 'marginBottom marginLeft marginRight marginTop markerOffset maxHeight '+ - 'maxWidth minHeight minWidth opacity outlineColor outlineOffset ' + - 'outlineWidth paddingBottom paddingLeft paddingRight paddingTop ' + - 'right textIndent top width wordSpacing zIndex'); - -Element.CSS_LENGTH = /^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/; - -String.__parseStyleElement = document.createElement('div'); -String.prototype.parseStyle = function(){ - var style, styleRules = $H(); - if (Prototype.Browser.WebKit) - style = new Element('div',{style:this}).style; - else { - String.__parseStyleElement.innerHTML = '<div style="' + this + '"></div>'; - style = String.__parseStyleElement.childNodes[0].style; - } - - Element.CSS_PROPERTIES.each(function(property){ - if (style[property]) styleRules[property] = style[property]; - }); - - if (Prototype.Browser.IE && this.include('opacity')) - styleRules.opacity = this.match(/opacity:\s*((?:0|1)?(?:\.\d*)?)/)[1]; - - return styleRules; -}; - -if (document.defaultView && document.defaultView.getComputedStyle) { - Element.getStyles = function(element) { - var css = document.defaultView.getComputedStyle($(element), null); - return Element.CSS_PROPERTIES.inject({ }, function(styles, property) { - styles[property] = css[property]; - return styles; - }); - }; -} else { - Element.getStyles = function(element) { - element = $(element); - var css = element.currentStyle, styles; - styles = Element.CSS_PROPERTIES.inject({ }, function(hash, property) { - hash[property] = css[property]; - return hash; - }); - if (!styles.opacity) styles.opacity = element.getOpacity(); - return styles; - }; -}; - -Effect.Methods = { - morph: function(element, style) { - element = $(element); - new Effect.Morph(element, Object.extend({ style: style }, arguments[2] || { })); - return element; - }, - visualEffect: function(element, effect, options) { - element = $(element) - var s = effect.dasherize().camelize(), klass = s.charAt(0).toUpperCase() + s.substring(1); - new Effect[klass](element, options); - return element; - }, - highlight: function(element, options) { - element = $(element); - new Effect.Highlight(element, options); - return element; - } -}; - -$w('fade appear grow shrink fold blindUp blindDown slideUp slideDown '+ - 'pulsate shake puff squish switchOff dropOut').each( - function(effect) { - Effect.Methods[effect] = function(element, options){ - element = $(element); - Effect[effect.charAt(0).toUpperCase() + effect.substring(1)](element, options); - return element; - } - } -); - -$w('getInlineOpacity forceRerendering setContentZoom collectTextNodes collectTextNodesIgnoreClass getStyles').each( - function(f) { Effect.Methods[f] = Element[f]; } -); - -Element.addMethods(Effect.Methods);
\ No newline at end of file diff --git a/vendor/plugins/rspec/story_server/prototype/javascripts/prototype.js b/vendor/plugins/rspec/story_server/prototype/javascripts/prototype.js deleted file mode 100644 index 30115e5e8..000000000 --- a/vendor/plugins/rspec/story_server/prototype/javascripts/prototype.js +++ /dev/null @@ -1,4140 +0,0 @@ -/* Prototype JavaScript framework, version 1.6.0_rc0 - * (c) 2005-2007 Sam Stephenson - * - * Prototype is freely distributable under the terms of an MIT-style license. - * For details, see the Prototype web site: http://www.prototypejs.org/ - * - *--------------------------------------------------------------------------*/ - -var Prototype = { - Version: '1.6.0_rc0', - - Browser: { - IE: !!(window.attachEvent && !window.opera), - Opera: !!window.opera, - WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1, - Gecko: navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('KHTML') == -1, - MobileSafari: !!navigator.userAgent.match(/Apple.*Mobile.*Safari/) - }, - - BrowserFeatures: { - XPath: !!document.evaluate, - ElementExtensions: !!window.HTMLElement, - SpecificElementExtensions: - document.createElement('div').__proto__ !== - document.createElement('form').__proto__ - }, - - ScriptFragment: '<script[^>]*>([\\S\\s]*?)<\/script>', - JSONFilter: /^\/\*-secure-([\s\S]*)\*\/\s*$/, - - emptyFunction: function() { }, - K: function(x) { return x } -}; - -if (Prototype.Browser.MobileSafari) - Prototype.BrowserFeatures.SpecificElementExtensions = false; - -/* Based on Alex Arnell's inheritance implementation. */ -var Class = { - create: function() { - var parent = null, properties = $A(arguments); - if (Object.isFunction(properties[0])) - parent = properties.shift(); - - function klass() { - this.initialize.apply(this, arguments); - } - - Object.extend(klass, Class.Methods); - klass.superclass = parent; - klass.subclasses = []; - - if (parent) { - var subclass = function() { }; - subclass.prototype = parent.prototype; - klass.prototype = new subclass; - parent.subclasses.push(klass); - } - - for (var i = 0; i < properties.length; i++) - klass.addMethods(properties[i]); - - if (!klass.prototype.initialize) - klass.prototype.initialize = Prototype.emptyFunction; - - klass.prototype.constructor = klass; - - return klass; - } -}; - -Class.Methods = { - addMethods: function(source) { - var ancestor = this.superclass && this.superclass.prototype; - - for (var property in source) { - var value = source[property]; - if (ancestor && Object.isFunction(value) && - value.argumentNames().first() == "$super") { - var method = value, value = Object.extend((function(m) { - return function() { return ancestor[m].apply(this, arguments) }; - })(property).wrap(method), { - valueOf: function() { return method }, - toString: function() { return method.toString() } - }); - } - this.prototype[property] = value; - } - - return this; - } -}; - -var Abstract = { }; - -Object.extend = function(destination, source) { - for (var property in source) - destination[property] = source[property]; - return destination; -}; - -Object.extend(Object, { - inspect: function(object) { - try { - if (object === undefined) return 'undefined'; - if (object === null) return 'null'; - return object.inspect ? object.inspect() : object.toString(); - } catch (e) { - if (e instanceof RangeError) return '...'; - throw e; - } - }, - - toJSON: function(object) { - var type = typeof object; - switch (type) { - case 'undefined': - case 'function': - case 'unknown': return; - case 'boolean': return object.toString(); - } - - if (object === null) return 'null'; - if (object.toJSON) return object.toJSON(); - if (Object.isElement(object)) return; - - var results = []; - for (var property in object) { - var value = Object.toJSON(object[property]); - if (value !== undefined) - results.push(property.toJSON() + ': ' + value); - } - - return '{' + results.join(', ') + '}'; - }, - - toHTML: function(object) { - return object && object.toHTML ? object.toHTML() : String.interpret(object); - }, - - keys: function(object) { - var keys = []; - for (var property in object) - keys.push(property); - return keys; - }, - - values: function(object) { - var values = []; - for (var property in object) - values.push(object[property]); - return values; - }, - - clone: function(object) { - return Object.extend({ }, object); - }, - - isElement: function(object) { - return object && object.nodeType == 1; - }, - - isArray: function(object) { - return object && object.constructor === Array; - }, - - isFunction: function(object) { - return typeof object == "function"; - }, - - isString: function(object) { - return typeof object == "string"; - }, - - isNumber: function(object) { - return typeof object == "number"; - }, - - isUndefined: function(object) { - return typeof object == "undefined"; - } -}); - -Object.extend(Function.prototype, { - argumentNames: function() { - var names = this.toString().match(/^[\s\(]*function\s*\((.*?)\)/)[1].split(",").invoke("strip"); - return names.length == 1 && !names[0] ? [] : names; - }, - - bind: function() { - if (arguments.length < 2 && arguments[0] === undefined) return this; - var __method = this, args = $A(arguments), object = args.shift(); - return function() { - return __method.apply(object, args.concat($A(arguments))); - } - }, - - bindAsEventListener: function() { - var __method = this, args = $A(arguments), object = args.shift(); - return function(event) { - return __method.apply(object, [event || window.event].concat(args)); - } - }, - - curry: function() { - if (!arguments.length) return this; - var __method = this, args = $A(arguments); - return function() { - return __method.apply(this, args.concat($A(arguments))); - } - }, - - delay: function() { - var __method = this, args = $A(arguments), timeout = args.shift() * 1000; - return window.setTimeout(function() { - return __method.apply(__method, args); - }, timeout); - }, - - wrap: function(wrapper) { - var __method = this; - return function() { - return wrapper.apply(this, [__method.bind(this)].concat($A(arguments))); - } - }, - - methodize: function() { - if (this._methodized) return this._methodized; - var __method = this; - return this._methodized = function() { - return __method.apply(null, [this].concat($A(arguments))); - }; - } -}); - -Function.prototype.defer = Function.prototype.delay.curry(0.01); - -Date.prototype.toJSON = function() { - return '"' + this.getUTCFullYear() + '-' + - (this.getUTCMonth() + 1).toPaddedString(2) + '-' + - this.getUTCDate().toPaddedString(2) + 'T' + - this.getUTCHours().toPaddedString(2) + ':' + - this.getUTCMinutes().toPaddedString(2) + ':' + - this.getUTCSeconds().toPaddedString(2) + 'Z"'; -}; - -var Try = { - these: function() { - var returnValue; - - for (var i = 0, length = arguments.length; i < length; i++) { - var lambda = arguments[i]; - try { - returnValue = lambda(); - break; - } catch (e) { } - } - - return returnValue; - } -}; - -RegExp.prototype.match = RegExp.prototype.test; - -RegExp.escape = function(str) { - return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1'); -}; - -/*--------------------------------------------------------------------------*/ - -var PeriodicalExecuter = Class.create({ - initialize: function(callback, frequency) { - this.callback = callback; - this.frequency = frequency; - this.currentlyExecuting = false; - - this.registerCallback(); - }, - - registerCallback: function() { - this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000); - }, - - execute: function() { - this.callback(this); - }, - - stop: function() { - if (!this.timer) return; - clearInterval(this.timer); - this.timer = null; - }, - - onTimerEvent: function() { - if (!this.currentlyExecuting) { - try { - this.currentlyExecuting = true; - this.execute(); - } finally { - this.currentlyExecuting = false; - } - } - } -}); -Object.extend(String, { - interpret: function(value) { - return value == null ? '' : String(value); - }, - specialChar: { - '\b': '\\b', - '\t': '\\t', - '\n': '\\n', - '\f': '\\f', - '\r': '\\r', - '\\': '\\\\' - } -}); - -Object.extend(String.prototype, { - gsub: function(pattern, replacement) { - var result = '', source = this, match; - replacement = arguments.callee.prepareReplacement(replacement); - - while (source.length > 0) { - if (match = source.match(pattern)) { - result += source.slice(0, match.index); - result += String.interpret(replacement(match)); - source = source.slice(match.index + match[0].length); - } else { - result += source, source = ''; - } - } - return result; - }, - - sub: function(pattern, replacement, count) { - replacement = this.gsub.prepareReplacement(replacement); - count = count === undefined ? 1 : count; - - return this.gsub(pattern, function(match) { - if (--count < 0) return match[0]; - return replacement(match); - }); - }, - - scan: function(pattern, iterator) { - this.gsub(pattern, iterator); - return String(this); - }, - - truncate: function(length, truncation) { - length = length || 30; - truncation = truncation === undefined ? '...' : truncation; - return this.length > length ? - this.slice(0, length - truncation.length) + truncation : String(this); - }, - - strip: function() { - return this.replace(/^\s+/, '').replace(/\s+$/, ''); - }, - - stripTags: function() { - return this.replace(/<\/?[^>]+>/gi, ''); - }, - - stripScripts: function() { - return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), ''); - }, - - extractScripts: function() { - var matchAll = new RegExp(Prototype.ScriptFragment, 'img'); - var matchOne = new RegExp(Prototype.ScriptFragment, 'im'); - return (this.match(matchAll) || []).map(function(scriptTag) { - return (scriptTag.match(matchOne) || ['', ''])[1]; - }); - }, - - evalScripts: function() { - return this.extractScripts().map(function(script) { return eval(script) }); - }, - - escapeHTML: function() { - var self = arguments.callee; - self.text.data = this; - return self.div.innerHTML; - }, - - unescapeHTML: function() { - var div = new Element('div'); - div.innerHTML = this.stripTags(); - return div.childNodes[0] ? (div.childNodes.length > 1 ? - $A(div.childNodes).inject('', function(memo, node) { return memo+node.nodeValue }) : - div.childNodes[0].nodeValue) : ''; - }, - - toQueryParams: function(separator) { - var match = this.strip().match(/([^?#]*)(#.*)?$/); - if (!match) return { }; - - return match[1].split(separator || '&').inject({ }, function(hash, pair) { - if ((pair = pair.split('='))[0]) { - var key = decodeURIComponent(pair.shift()); - var value = pair.length > 1 ? pair.join('=') : pair[0]; - if (value != undefined) value = decodeURIComponent(value); - - if (key in hash) { - if (!Object.isArray(hash[key])) hash[key] = [hash[key]]; - hash[key].push(value); - } - else hash[key] = value; - } - return hash; - }); - }, - - toArray: function() { - return this.split(''); - }, - - succ: function() { - return this.slice(0, this.length - 1) + - String.fromCharCode(this.charCodeAt(this.length - 1) + 1); - }, - - times: function(count) { - var result = ''; - for (var i = 0; i < count; i++) result += this; - return result; - }, - - camelize: function() { - var parts = this.split('-'), len = parts.length; - if (len == 1) return parts[0]; - - var camelized = this.charAt(0) == '-' - ? parts[0].charAt(0).toUpperCase() + parts[0].substring(1) - : parts[0]; - - for (var i = 1; i < len; i++) - camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1); - - return camelized; - }, - - capitalize: function() { - return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase(); - }, - - underscore: function() { - return this.gsub(/::/, '/').gsub(/([A-Z]+)([A-Z][a-z])/,'#{1}_#{2}').gsub(/([a-z\d])([A-Z])/,'#{1}_#{2}').gsub(/-/,'_').toLowerCase(); - }, - - dasherize: function() { - return this.gsub(/_/,'-'); - }, - - inspect: function(useDoubleQuotes) { - var escapedString = this.gsub(/[\x00-\x1f\\]/, function(match) { - var character = String.specialChar[match[0]]; - return character ? character : '\\u00' + match[0].charCodeAt().toPaddedString(2, 16); - }); - if (useDoubleQuotes) return '"' + escapedString.replace(/"/g, '\\"') + '"'; - return "'" + escapedString.replace(/'/g, '\\\'') + "'"; - }, - - toJSON: function() { - return this.inspect(true); - }, - - unfilterJSON: function(filter) { - return this.sub(filter || Prototype.JSONFilter, '#{1}'); - }, - - isJSON: function() { - var str = this.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, ''); - return (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(str); - }, - - evalJSON: function(sanitize) { - var json = this.unfilterJSON(); - try { - if (!sanitize || json.isJSON()) return eval('(' + json + ')'); - } catch (e) { } - throw new SyntaxError('Badly formed JSON string: ' + this.inspect()); - }, - - include: function(pattern) { - return this.indexOf(pattern) > -1; - }, - - startsWith: function(pattern) { - return this.indexOf(pattern) === 0; - }, - - endsWith: function(pattern) { - var d = this.length - pattern.length; - return d >= 0 && this.lastIndexOf(pattern) === d; - }, - - empty: function() { - return this == ''; - }, - - blank: function() { - return /^\s*$/.test(this); - }, - - interpolate: function(object, pattern) { - return new Template(this, pattern).evaluate(object); - } -}); - -if (Prototype.Browser.WebKit || Prototype.Browser.IE) Object.extend(String.prototype, { - escapeHTML: function() { - return this.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>'); - }, - unescapeHTML: function() { - return this.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>'); - } -}); - -String.prototype.gsub.prepareReplacement = function(replacement) { - if (Object.isFunction(replacement)) return replacement; - var template = new Template(replacement); - return function(match) { return template.evaluate(match) }; -}; - -String.prototype.parseQuery = String.prototype.toQueryParams; - -Object.extend(String.prototype.escapeHTML, { - div: document.createElement('div'), - text: document.createTextNode('') -}); - -with (String.prototype.escapeHTML) div.appendChild(text); - -var Template = Class.create({ - initialize: function(template, pattern) { - this.template = template.toString(); - this.pattern = pattern || Template.Pattern; - }, - - evaluate: function(object) { - if (Object.isFunction(object.toTemplateReplacements)) - object = object.toTemplateReplacements(); - - return this.template.gsub(this.pattern, function(match) { - if (object == null) return ''; - - var before = match[1] || ''; - if (before == '\\') return match[2]; - - var ctx = object, expr = match[3]; - var pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/, match = pattern.exec(expr); - if (match == null) return ''; - - while (match != null) { - var comp = match[1].startsWith('[') ? match[2].gsub('\\\\]', ']') : match[1]; - ctx = ctx[comp]; - if (null == ctx || '' == match[3]) break; - expr = expr.substring('[' == match[3] ? match[1].length : match[0].length); - match = pattern.exec(expr); - } - - return before + String.interpret(ctx); - }.bind(this)); - } -}); -Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/; - -var $break = { }; - -var Enumerable = { - each: function(iterator, context) { - var index = 0; - iterator = iterator.bind(context); - try { - this._each(function(value) { - iterator(value, index++); - }); - } catch (e) { - if (e != $break) throw e; - } - return this; - }, - - eachSlice: function(number, iterator, context) { - iterator = iterator ? iterator.bind(context) : Prototype.K; - var index = -number, slices = [], array = this.toArray(); - while ((index += number) < array.length) - slices.push(array.slice(index, index+number)); - return slices.collect(iterator, context); - }, - - all: function(iterator, context) { - iterator = iterator ? iterator.bind(context) : Prototype.K; - var result = true; - this.each(function(value, index) { - result = result && !!iterator(value, index); - if (!result) throw $break; - }); - return result; - }, - - any: function(iterator, context) { - iterator = iterator ? iterator.bind(context) : Prototype.K; - var result = false; - this.each(function(value, index) { - if (result = !!iterator(value, index)) - throw $break; - }); - return result; - }, - - collect: function(iterator, context) { - iterator = iterator ? iterator.bind(context) : Prototype.K; - var results = []; - this.each(function(value, index) { - results.push(iterator(value, index)); - }); - return results; - }, - - detect: function(iterator, context) { - iterator = iterator.bind(context); - var result; - this.each(function(value, index) { - if (iterator(value, index)) { - result = value; - throw $break; - } - }); - return result; - }, - - findAll: function(iterator, context) { - iterator = iterator.bind(context); - var results = []; - this.each(function(value, index) { - if (iterator(value, index)) - results.push(value); - }); - return results; - }, - - grep: function(filter, iterator, context) { - iterator = iterator ? iterator.bind(context) : Prototype.K; - var results = []; - - if (Object.isString(filter)) - filter = new RegExp(filter); - - this.each(function(value, index) { - if (filter.match(value)) - results.push(iterator(value, index)); - }); - return results; - }, - - include: function(object) { - if (Object.isFunction(this.indexOf)) - if (this.indexOf(object) != -1) return true; - - var found = false; - this.each(function(value) { - if (value == object) { - found = true; - throw $break; - } - }); - return found; - }, - - inGroupsOf: function(number, fillWith) { - fillWith = fillWith === undefined ? null : fillWith; - return this.eachSlice(number, function(slice) { - while(slice.length < number) slice.push(fillWith); - return slice; - }); - }, - - inject: function(memo, iterator, context) { - iterator = iterator.bind(context); - this.each(function(value, index) { - memo = iterator(memo, value, index); - }); - return memo; - }, - - invoke: function(method) { - var args = $A(arguments).slice(1); - return this.map(function(value) { - return value[method].apply(value, args); - }); - }, - - max: function(iterator, context) { - iterator = iterator ? iterator.bind(context) : Prototype.K; - var result; - this.each(function(value, index) { - value = iterator(value, index); - if (result == undefined || value >= result) - result = value; - }); - return result; - }, - - min: function(iterator, context) { - iterator = iterator ? iterator.bind(context) : Prototype.K; - var result; - this.each(function(value, index) { - value = iterator(value, index); - if (result == undefined || value < result) - result = value; - }); - return result; - }, - - partition: function(iterator, context) { - iterator = iterator ? iterator.bind(context) : Prototype.K; - var trues = [], falses = []; - this.each(function(value, index) { - (iterator(value, index) ? - trues : falses).push(value); - }); - return [trues, falses]; - }, - - pluck: function(property) { - var results = []; - this.each(function(value) { - results.push(value[property]); - }); - return results; - }, - - reject: function(iterator, context) { - iterator = iterator.bind(context); - var results = []; - this.each(function(value, index) { - if (!iterator(value, index)) - results.push(value); - }); - return results; - }, - - sortBy: function(iterator, context) { - iterator = iterator.bind(context); - return this.map(function(value, index) { - return {value: value, criteria: iterator(value, index)}; - }).sort(function(left, right) { - var a = left.criteria, b = right.criteria; - return a < b ? -1 : a > b ? 1 : 0; - }).pluck('value'); - }, - - toArray: function() { - return this.map(); - }, - - zip: function() { - var iterator = Prototype.K, args = $A(arguments); - if (Object.isFunction(args.last())) - iterator = args.pop(); - - var collections = [this].concat(args).map($A); - return this.map(function(value, index) { - return iterator(collections.pluck(index)); - }); - }, - - size: function() { - return this.toArray().length; - }, - - inspect: function() { - return '#<Enumerable:' + this.toArray().inspect() + '>'; - } -}; - -Object.extend(Enumerable, { - map: Enumerable.collect, - find: Enumerable.detect, - select: Enumerable.findAll, - filter: Enumerable.findAll, - member: Enumerable.include, - entries: Enumerable.toArray, - every: Enumerable.all, - some: Enumerable.any -}); -function $A(iterable) { - if (!iterable) return []; - if (iterable.toArray) return iterable.toArray(); - else { - var results = []; - for (var i = 0, length = iterable.length; i < length; i++) - results.push(iterable[i]); - return results; - } -} - -if (Prototype.Browser.WebKit) { - function $A(iterable) { - if (!iterable) return []; - if (!(Object.isFunction(iterable) && iterable == '[object NodeList]') && - iterable.toArray) { - return iterable.toArray(); - } else { - var results = []; - for (var i = 0, length = iterable.length; i < length; i++) - results.push(iterable[i]); - return results; - } - } -} - -Array.from = $A; - -Object.extend(Array.prototype, Enumerable); - -if (!Array.prototype._reverse) Array.prototype._reverse = Array.prototype.reverse; - -Object.extend(Array.prototype, { - _each: function(iterator) { - for (var i = 0, length = this.length; i < length; i++) - iterator(this[i]); - }, - - clear: function() { - this.length = 0; - return this; - }, - - first: function() { - return this[0]; - }, - - last: function() { - return this[this.length - 1]; - }, - - compact: function() { - return this.select(function(value) { - return value != null; - }); - }, - - flatten: function() { - return this.inject([], function(array, value) { - return array.concat(Object.isArray(value) ? - value.flatten() : [value]); - }); - }, - - without: function() { - var values = $A(arguments); - return this.select(function(value) { - return !values.include(value); - }); - }, - - reverse: function(inline) { - return (inline !== false ? this : this.toArray())._reverse(); - }, - - reduce: function() { - return this.length > 1 ? this : this[0]; - }, - - uniq: function(sorted) { - return this.inject([], function(array, value, index) { - if (0 == index || (sorted ? array.last() != value : !array.include(value))) - array.push(value); - return array; - }); - }, - - intersect: function(array) { - return this.uniq().findAll(function(item) { - return array.detect(function(value) { return item === value }); - }); - }, - - clone: function() { - return [].concat(this); - }, - - size: function() { - return this.length; - }, - - inspect: function() { - return '[' + this.map(Object.inspect).join(', ') + ']'; - }, - - toJSON: function() { - var results = []; - this.each(function(object) { - var value = Object.toJSON(object); - if (value !== undefined) results.push(value); - }); - return '[' + results.join(', ') + ']'; - } -}); - -// use native browser JS 1.6 implementation if available -if (Object.isFunction(Array.prototype.forEach)) - Array.prototype._each = Array.prototype.forEach; - -if (!Array.prototype.indexOf) Array.prototype.indexOf = function(item, i) { - i || (i = 0); - var length = this.length; - if (i < 0) i = length + i; - for (; i < length; i++) - if (this[i] === item) return i; - return -1; -}; - -if (!Array.prototype.lastIndexOf) Array.prototype.lastIndexOf = function(item, i) { - i = isNaN(i) ? this.length : (i < 0 ? this.length + i : i) + 1; - var n = this.slice(0, i).reverse().indexOf(item); - return (n < 0) ? n : i - n - 1; -}; - -Array.prototype.toArray = Array.prototype.clone; - -function $w(string) { - string = string.strip(); - return string ? string.split(/\s+/) : []; -} - -if (Prototype.Browser.Opera){ - Array.prototype.concat = function() { - var array = []; - for (var i = 0, length = this.length; i < length; i++) array.push(this[i]); - for (var i = 0, length = arguments.length; i < length; i++) { - if (Object.isArray(arguments[i])) { - for (var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++) - array.push(arguments[i][j]); - } else { - array.push(arguments[i]); - } - } - return array; - }; -} -Object.extend(Number.prototype, { - toColorPart: function() { - return this.toPaddedString(2, 16); - }, - - succ: function() { - return this + 1; - }, - - times: function(iterator) { - $R(0, this, true).each(iterator); - return this; - }, - - toPaddedString: function(length, radix) { - var string = this.toString(radix || 10); - return '0'.times(length - string.length) + string; - }, - - toJSON: function() { - return isFinite(this) ? this.toString() : 'null'; - } -}); - -$w('abs round ceil floor').each(function(method){ - Number.prototype[method] = Math[method].methodize(); -}); -var Hash = function(object) { - if (object instanceof Hash) this.merge(object); - else Object.extend(this, object || { }); -}; - -Object.extend(Hash, { - toQueryString: function(obj) { - var parts = []; - parts.add = arguments.callee.addPair; - - this.prototype._each.call(obj, function(pair) { - if (!pair.key) return; - var value = pair.value; - - if (value && typeof value == 'object') { - if (Object.isArray(value)) value.each(function(value) { - parts.add(pair.key, value); - }); - return; - } - parts.add(pair.key, value); - }); - - return parts.join('&'); - }, - - toJSON: function(object) { - var results = []; - this.prototype._each.call(object, function(pair) { - var value = Object.toJSON(pair.value); - if (value !== undefined) results.push(pair.key.toJSON() + ': ' + value); - }); - return '{' + results.join(', ') + '}'; - } -}); - -Hash.toQueryString.addPair = function(key, value, prefix) { - key = encodeURIComponent(key); - if (value === undefined) this.push(key); - else this.push(key + '=' + (value == null ? '' : encodeURIComponent(value))); -}; - -Object.extend(Hash.prototype, Enumerable); -Object.extend(Hash.prototype, { - _each: function(iterator) { - for (var key in this) { - var value = this[key]; - if (value && value == Hash.prototype[key]) continue; - - var pair = [key, value]; - pair.key = key; - pair.value = value; - iterator(pair); - } - }, - - keys: function() { - return this.pluck('key'); - }, - - values: function() { - return this.pluck('value'); - }, - - index: function(value) { - var match = this.detect(function(pair) { - return pair.value === value; - }); - return match && match.key; - }, - - merge: function(hash) { - return $H(hash).inject(this, function(mergedHash, pair) { - mergedHash[pair.key] = pair.value; - return mergedHash; - }); - }, - - remove: function() { - var result; - for(var i = 0, length = arguments.length; i < length; i++) { - var value = this[arguments[i]]; - if (value !== undefined){ - if (result === undefined) result = value; - else { - if (!Object.isArray(result)) result = [result]; - result.push(value); - } - } - delete this[arguments[i]]; - } - return result; - }, - - toQueryString: function() { - return Hash.toQueryString(this); - }, - - inspect: function() { - return '#<Hash:{' + this.map(function(pair) { - return pair.map(Object.inspect).join(': '); - }).join(', ') + '}>'; - }, - - toJSON: function() { - return Hash.toJSON(this); - } -}); - -function $H(object) { - if (object instanceof Hash) return object; - return new Hash(object); -}; - -// Safari iterates over shadowed properties -if (function() { - var i = 0, Test = function(value) { this.key = value }; - Test.prototype.key = 'foo'; - for (var property in new Test('bar')) i++; - return i > 1; -}()) Hash.prototype._each = function(iterator) { - var cache = []; - for (var key in this) { - var value = this[key]; - if ((value && value == Hash.prototype[key]) || cache.include(key)) continue; - cache.push(key); - var pair = [key, value]; - pair.key = key; - pair.value = value; - iterator(pair); - } -}; -ObjectRange = Class.create({ - initialize: function(start, end, exclusive) { - this.start = start; - this.end = end; - this.exclusive = exclusive; - }, - - _each: function(iterator) { - var value = this.start; - while (this.include(value)) { - iterator(value); - value = value.succ(); - } - } -}); - -Object.extend(ObjectRange.prototype, Enumerable); - -ObjectRange.prototype.include = function(value) { - if (value < this.start) - return false; - if (this.exclusive) - return value < this.end; - return value <= this.end; -}; - -var $R = function(start, end, exclusive) { - return new ObjectRange(start, end, exclusive); -}; - -var Ajax = { - getTransport: function() { - return Try.these( - function() {return new XMLHttpRequest()}, - function() {return new ActiveXObject('Msxml2.XMLHTTP')}, - function() {return new ActiveXObject('Microsoft.XMLHTTP')} - ) || false; - }, - - activeRequestCount: 0 -}; - -Ajax.Responders = { - responders: [], - - _each: function(iterator) { - this.responders._each(iterator); - }, - - register: function(responder) { - if (!this.include(responder)) - this.responders.push(responder); - }, - - unregister: function(responder) { - this.responders = this.responders.without(responder); - }, - - dispatch: function(callback, request, transport, json) { - this.each(function(responder) { - if (Object.isFunction(responder[callback])) { - try { - responder[callback].apply(responder, [request, transport, json]); - } catch (e) { } - } - }); - } -}; - -Object.extend(Ajax.Responders, Enumerable); - -Ajax.Responders.register({ - onCreate: function() { Ajax.activeRequestCount++ }, - onComplete: function() { Ajax.activeRequestCount-- } -}); - -Ajax.Base = Class.create({ - initialize: function(options) { - this.options = { - method: 'post', - asynchronous: true, - contentType: 'application/x-www-form-urlencoded', - encoding: 'UTF-8', - parameters: '', - evalJSON: true, - evalJS: true - }; - Object.extend(this.options, options || { }); - - this.options.method = this.options.method.toLowerCase(); - if (Object.isString(this.options.parameters)) - this.options.parameters = this.options.parameters.toQueryParams(); - } -}); - -Ajax.Request = Class.create(Ajax.Base, { - _complete: false, - - initialize: function($super, url, options) { - $super(options); - this.transport = Ajax.getTransport(); - this.request(url); - }, - - request: function(url) { - this.url = url; - this.method = this.options.method; - var params = Object.clone(this.options.parameters); - - if (!['get', 'post'].include(this.method)) { - // simulate other verbs over post - params['_method'] = this.method; - this.method = 'post'; - } - - this.parameters = params; - - if (params = Hash.toQueryString(params)) { - // when GET, append parameters to URL - if (this.method == 'get') - this.url += (this.url.include('?') ? '&' : '?') + params; - else if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) - params += '&_='; - } - - try { - var response = new Ajax.Response(this); - if (this.options.onCreate) this.options.onCreate(response); - Ajax.Responders.dispatch('onCreate', this, response); - - this.transport.open(this.method.toUpperCase(), this.url, - this.options.asynchronous); - - if (this.options.asynchronous) this.respondToReadyState.bind(this).defer(1); - - this.transport.onreadystatechange = this.onStateChange.bind(this); - this.setRequestHeaders(); - - this.body = this.method == 'post' ? (this.options.postBody || params) : null; - this.transport.send(this.body); - - /* Force Firefox to handle ready state 4 for synchronous requests */ - if (!this.options.asynchronous && this.transport.overrideMimeType) - this.onStateChange(); - - } - catch (e) { - this.dispatchException(e); - } - }, - - onStateChange: function() { - var readyState = this.transport.readyState; - if (readyState > 1 && !((readyState == 4) && this._complete)) - this.respondToReadyState(this.transport.readyState); - }, - - setRequestHeaders: function() { - var headers = { - 'X-Requested-With': 'XMLHttpRequest', - 'X-Prototype-Version': Prototype.Version, - 'Accept': 'text/javascript, text/html, application/xml, text/xml, */*' - }; - - if (this.method == 'post') { - headers['Content-type'] = this.options.contentType + - (this.options.encoding ? '; charset=' + this.options.encoding : ''); - - /* Force "Connection: close" for older Mozilla browsers to work - * around a bug where XMLHttpRequest sends an incorrect - * Content-length header. See Mozilla Bugzilla #246651. - */ - if (this.transport.overrideMimeType && - (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < 2005) - headers['Connection'] = 'close'; - } - - // user-defined headers - if (typeof this.options.requestHeaders == 'object') { - var extras = this.options.requestHeaders; - - if (Object.isFunction(extras.push)) - for (var i = 0, length = extras.length; i < length; i += 2) - headers[extras[i]] = extras[i+1]; - else - $H(extras).each(function(pair) { headers[pair.key] = pair.value }); - } - - for (var name in headers) - this.transport.setRequestHeader(name, headers[name]); - }, - - success: function() { - var status = this.getStatus(); - return !status || (status >= 200 && status < 300); - }, - - getStatus: function() { - try { - return this.transport.status || 0; - } catch (e) { return 0 } - }, - - respondToReadyState: function(readyState) { - var state = Ajax.Request.Events[readyState], response = new Ajax.Response(this); - - if (state == 'Complete') { - try { - this._complete = true; - (this.options['on' + response.status] - || this.options['on' + (this.success() ? 'Success' : 'Failure')] - || Prototype.emptyFunction)(response, response.headerJSON); - } catch (e) { - this.dispatchException(e); - } - - var contentType = response.getHeader('Content-type'); - if (this.options.evalJS == 'force' - || (this.options.evalJS && contentType - && contentType.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i))) - this.evalResponse(); - } - - try { - (this.options['on' + state] || Prototype.emptyFunction)(response, response.headerJSON); - Ajax.Responders.dispatch('on' + state, this, response, response.headerJSON); - } catch (e) { - this.dispatchException(e); - } - - if (state == 'Complete') { - // avoid memory leak in MSIE: clean up - this.transport.onreadystatechange = Prototype.emptyFunction; - } - }, - - getHeader: function(name) { - try { - return this.transport.getResponseHeader(name); - } catch (e) { return null } - }, - - evalResponse: function() { - try { - return eval((this.transport.responseText || '').unfilterJSON()); - } catch (e) { - this.dispatchException(e); - } - }, - - dispatchException: function(exception) { - (this.options.onException || Prototype.emptyFunction)(this, exception); - Ajax.Responders.dispatch('onException', this, exception); - } -}); - -Ajax.Request.Events = - ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete']; - -Ajax.Response = Class.create({ - initialize: function(request){ - this.request = request; - var transport = this.transport = request.transport, - readyState = this.readyState = transport.readyState; - - if((readyState > 2 && !Prototype.Browser.IE) || readyState == 4) { - this.status = this.getStatus(); - this.statusText = this.getStatusText(); - this.responseText = String.interpret(transport.responseText); - this.headerJSON = this.getHeaderJSON(); - } - - if(readyState == 4) { - var xml = transport.responseXML; - this.responseXML = xml === undefined ? null : xml; - this.responseJSON = this.getResponseJSON(); - } - }, - - status: 0, - statusText: '', - - getStatus: Ajax.Request.prototype.getStatus, - - getStatusText: function() { - try { - return this.transport.statusText || ''; - } catch (e) { return '' } - }, - - getHeader: Ajax.Request.prototype.getHeader, - - getAllHeaders: function() { - try { - return this.getAllResponseHeaders(); - } catch (e) { return null } - }, - - getResponseHeader: function(name) { - return this.transport.getResponseHeader(name); - }, - - getAllResponseHeaders: function() { - return this.transport.getAllResponseHeaders(); - }, - - getHeaderJSON: function() { - var json = this.getHeader('X-JSON'); - try { - return json ? json.evalJSON(this.request.options.sanitizeJSON) : null; - } catch (e) { - this.request.dispatchException(e); - } - }, - - getResponseJSON: function() { - var options = this.request.options; - try { - if (options.evalJSON == 'force' || (options.evalJSON && - (this.getHeader('Content-type') || '').include('application/json'))) - return this.transport.responseText.evalJSON(options.sanitizeJSON); - return null; - } catch (e) { - this.request.dispatchException(e); - } - } -}); - -Ajax.Updater = Class.create(Ajax.Request, { - initialize: function($super, container, url, options) { - this.container = { - success: (container.success || container), - failure: (container.failure || (container.success ? null : container)) - }; - - options = options || { }; - var onComplete = options.onComplete; - options.onComplete = (function(response, param) { - this.updateContent(response.responseText); - if (Object.isFunction(onComplete)) onComplete(response, param); - }).bind(this); - - $super(url, options); - }, - - updateContent: function(responseText) { - var receiver = this.container[this.success() ? 'success' : 'failure'], - options = this.options; - - if (!options.evalScripts) responseText = responseText.stripScripts(); - - if (receiver = $(receiver)) { - if (options.insertion) { - if (Object.isString(options.insertion)) { - var insertion = { }; insertion[options.insertion] = responseText; - receiver.insert(insertion); - } - else options.insertion(receiver, responseText); - } - else receiver.update(responseText); - } - - if (this.success()) { - if (this.onComplete) this.onComplete.bind(this).defer(); - } - } -}); - -Ajax.PeriodicalUpdater = Class.create(Ajax.Base, { - initialize: function($super, container, url, options) { - $super(options); - this.onComplete = this.options.onComplete; - - this.frequency = (this.options.frequency || 2); - this.decay = (this.options.decay || 1); - - this.updater = { }; - this.container = container; - this.url = url; - - this.start(); - }, - - start: function() { - this.options.onComplete = this.updateComplete.bind(this); - this.onTimerEvent(); - }, - - stop: function() { - this.updater.options.onComplete = undefined; - clearTimeout(this.timer); - (this.onComplete || Prototype.emptyFunction).apply(this, arguments); - }, - - updateComplete: function(response) { - if (this.options.decay) { - this.decay = (response.responseText == this.lastText ? - this.decay * this.options.decay : 1); - - this.lastText = response.responseText; - } - this.timer = this.onTimerEvent.bind(this).delay(this.decay * this.frequency); - }, - - onTimerEvent: function() { - this.updater = new Ajax.Updater(this.container, this.url, this.options); - } -}); -function $(element) { - if (arguments.length > 1) { - for (var i = 0, elements = [], length = arguments.length; i < length; i++) - elements.push($(arguments[i])); - return elements; - } - if (Object.isString(element)) - element = document.getElementById(element); - return Element.extend(element); -} - -if (Prototype.BrowserFeatures.XPath) { - document._getElementsByXPath = function(expression, parentElement) { - var results = []; - var query = document.evaluate(expression, $(parentElement) || document, - null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); - for (var i = 0, length = query.snapshotLength; i < length; i++) - results.push(Element.extend(query.snapshotItem(i))); - return results; - }; -} - -/*--------------------------------------------------------------------------*/ - -if (!window.Node) var Node = { }; - -if (!Node.ELEMENT_NODE) { - // DOM level 2 ECMAScript Language Binding - Object.extend(Node, { - ELEMENT_NODE: 1, - ATTRIBUTE_NODE: 2, - TEXT_NODE: 3, - CDATA_SECTION_NODE: 4, - ENTITY_REFERENCE_NODE: 5, - ENTITY_NODE: 6, - PROCESSING_INSTRUCTION_NODE: 7, - COMMENT_NODE: 8, - DOCUMENT_NODE: 9, - DOCUMENT_TYPE_NODE: 10, - DOCUMENT_FRAGMENT_NODE: 11, - NOTATION_NODE: 12 - }); -} - -(function() { - var element = this.Element; - this.Element = function(tagName, attributes) { - attributes = attributes || { }; - tagName = tagName.toLowerCase(); - var cache = Element.cache; - if (Prototype.Browser.IE && attributes.name) { - tagName = '<' + tagName + ' name="' + attributes.name + '">'; - delete attributes.name; - return Element.writeAttribute(document.createElement(tagName), attributes); - } - if (!cache[tagName]) cache[tagName] = Element.extend(document.createElement(tagName)); - return Element.writeAttribute(cache[tagName].cloneNode(false), attributes); - }; - Object.extend(this.Element, element || { }); -}).call(window); - -Element.cache = { }; - -Element.Methods = { - visible: function(element) { - return $(element).style.display != 'none'; - }, - - toggle: function(element) { - element = $(element); - Element[Element.visible(element) ? 'hide' : 'show'](element); - return element; - }, - - hide: function(element) { - $(element).style.display = 'none'; - return element; - }, - - show: function(element) { - $(element).style.display = ''; - return element; - }, - - remove: function(element) { - element = $(element); - element.parentNode.removeChild(element); - return element; - }, - - update: function(element, content) { - element = $(element); - if (content && content.toElement) content = content.toElement(); - if (Object.isElement(content)) return element.update().insert(content); - content = Object.toHTML(content); - element.innerHTML = content.stripScripts(); - content.evalScripts.bind(content).defer(); - return element; - }, - - replace: function(element, content) { - element = $(element); - if (content && content.toElement) content = content.toElement(); - else if (!Object.isElement(content)) { - content = Object.toHTML(content); - var range = element.ownerDocument.createRange(); - range.selectNode(element); - content.evalScripts.bind(content).defer(); - content = range.createContextualFragment(content.stripScripts()); - } - element.parentNode.replaceChild(content, element); - return element; - }, - - insert: function(element, insertions) { - element = $(element); - - if (Object.isString(insertions) || Object.isNumber(insertions) || - Object.isElement(insertions) || (insertions && (insertions.toElement || insertions.toHTML))) - insertions = {bottom:insertions}; - - var content, t, range; - - for (position in insertions) { - content = insertions[position]; - position = position.toLowerCase(); - t = Element._insertionTranslations[position]; - - if (content && content.toElement) content = content.toElement(); - if (Object.isElement(content)) { - t.insert(element, content); - continue; - } - - content = Object.toHTML(content); - - range = element.ownerDocument.createRange(); - t.initializeRange(element, range); - t.insert(element, range.createContextualFragment(content.stripScripts())); - - content.evalScripts.bind(content).defer(); - } - - return element; - }, - - wrap: function(element, wrapper, attributes) { - element = $(element); - if (Object.isElement(wrapper)) - $(wrapper).writeAttribute(attributes || { }); - else if (Object.isString(wrapper)) wrapper = new Element(wrapper, attributes); - else wrapper = new Element('div', wrapper); - if (element.parentNode) - element.parentNode.replaceChild(wrapper, element); - wrapper.appendChild(element); - return wrapper; - }, - - inspect: function(element) { - element = $(element); - var result = '<' + element.tagName.toLowerCase(); - $H({'id': 'id', 'className': 'class'}).each(function(pair) { - var property = pair.first(), attribute = pair.last(); - var value = (element[property] || '').toString(); - if (value) result += ' ' + attribute + '=' + value.inspect(true); - }); - return result + '>'; - }, - - recursivelyCollect: function(element, property) { - element = $(element); - var elements = []; - while (element = element[property]) - if (element.nodeType == 1) - elements.push(Element.extend(element)); - return elements; - }, - - ancestors: function(element) { - return $(element).recursivelyCollect('parentNode'); - }, - - descendants: function(element) { - return $A($(element).getElementsByTagName('*')).each(Element.extend); - }, - - firstDescendant: function(element) { - element = $(element).firstChild; - while (element && element.nodeType != 1) element = element.nextSibling; - return $(element); - }, - - immediateDescendants: function(element) { - if (!(element = $(element).firstChild)) return []; - while (element && element.nodeType != 1) element = element.nextSibling; - if (element) return [element].concat($(element).nextSiblings()); - return []; - }, - - previousSiblings: function(element) { - return $(element).recursivelyCollect('previousSibling'); - }, - - nextSiblings: function(element) { - return $(element).recursivelyCollect('nextSibling'); - }, - - siblings: function(element) { - element = $(element); - return element.previousSiblings().reverse().concat(element.nextSiblings()); - }, - - match: function(element, selector) { - if (Object.isString(selector)) - selector = new Selector(selector); - return selector.match($(element)); - }, - - up: function(element, expression, index) { - element = $(element); - if (arguments.length == 1) return $(element.parentNode); - var ancestors = element.ancestors(); - return expression ? Selector.findElement(ancestors, expression, index) : - ancestors[index || 0]; - }, - - down: function(element, expression, index) { - element = $(element); - if (arguments.length == 1) return element.firstDescendant(); - var descendants = element.descendants(); - return expression ? Selector.findElement(descendants, expression, index) : - descendants[index || 0]; - }, - - previous: function(element, expression, index) { - element = $(element); - if (arguments.length == 1) return $(Selector.handlers.previousElementSibling(element)); - var previousSiblings = element.previousSiblings(); - return expression ? Selector.findElement(previousSiblings, expression, index) : - previousSiblings[index || 0]; - }, - - next: function(element, expression, index) { - element = $(element); - if (arguments.length == 1) return $(Selector.handlers.nextElementSibling(element)); - var nextSiblings = element.nextSiblings(); - return expression ? Selector.findElement(nextSiblings, expression, index) : - nextSiblings[index || 0]; - }, - - select: function() { - var args = $A(arguments), element = $(args.shift()); - return Selector.findChildElements(element, args); - }, - - adjacent: function() { - var args = $A(arguments), element = $(args.shift()); - return Selector.findChildElements(element.parentNode, args).without(element); - }, - - identify: function(element) { - element = $(element); - var id = element.readAttribute('id'), self = arguments.callee; - if (id) return id; - do { id = 'anonymous_element_' + self.counter++ } while ($(id)); - element.writeAttribute('id', id); - return id; - }, - - readAttribute: function(element, name) { - element = $(element); - if (Prototype.Browser.IE) { - var t = Element._attributeTranslations.read; - if (t.values[name]) return t.values[name](element, name); - if (t.names[name]) name = t.names[name]; - if (name.include(':')) { - return (!element.attributes || !element.attributes[name]) ? null : - element.attributes[name].value; - } - } - return element.getAttribute(name); - }, - - writeAttribute: function(element, name, value) { - element = $(element); - var attributes = { }, t = Element._attributeTranslations.write; - - if (typeof name == 'object') attributes = name; - else attributes[name] = value === undefined ? true : value; - - for (var attr in attributes) { - var name = t.names[attr] || attr, value = attributes[attr]; - if (t.values[attr]) name = t.values[attr](element, value); - if (value === false || value === null) - element.removeAttribute(name); - else if (value === true) - element.setAttribute(name, name); - else element.setAttribute(name, value); - } - return element; - }, - - getHeight: function(element) { - return $(element).getDimensions().height; - }, - - getWidth: function(element) { - return $(element).getDimensions().width; - }, - - classNames: function(element) { - return new Element.ClassNames(element); - }, - - hasClassName: function(element, className) { - if (!(element = $(element))) return; - var elementClassName = element.className; - return (elementClassName.length > 0 && (elementClassName == className || - elementClassName.match(new RegExp("(^|\\s)" + className + "(\\s|$)")))); - }, - - addClassName: function(element, className) { - if (!(element = $(element))) return; - if (!element.hasClassName(className)) - element.className += (element.className ? ' ' : '') + className; - return element; - }, - - removeClassName: function(element, className) { - if (!(element = $(element))) return; - element.className = element.className.replace( - new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' ').strip(); - return element; - }, - - toggleClassName: function(element, className) { - if (!(element = $(element))) return; - return element[element.hasClassName(className) ? - 'removeClassName' : 'addClassName'](className); - }, - - // removes whitespace-only text node children - cleanWhitespace: function(element) { - element = $(element); - var node = element.firstChild; - while (node) { - var nextNode = node.nextSibling; - if (node.nodeType == 3 && !/\S/.test(node.nodeValue)) - element.removeChild(node); - node = nextNode; - } - return element; - }, - - empty: function(element) { - return $(element).innerHTML.blank(); - }, - - descendantOf: function(element, ancestor) { - element = $(element), ancestor = $(ancestor); - while (element = element.parentNode) - if (element == ancestor) return true; - return false; - }, - - scrollTo: function(element) { - element = $(element); - var pos = element.cumulativeOffset(); - window.scrollTo(pos[0], pos[1]); - return element; - }, - - getStyle: function(element, style) { - element = $(element); - style = style == 'float' ? 'cssFloat' : style.camelize(); - var value = element.style[style]; - if (!value) { - var css = document.defaultView.getComputedStyle(element, null); - value = css ? css[style] : null; - } - if (style == 'opacity') return value ? parseFloat(value) : 1.0; - return value == 'auto' ? null : value; - }, - - getOpacity: function(element) { - return $(element).getStyle('opacity'); - }, - - setStyle: function(element, styles) { - element = $(element); - var elementStyle = element.style, match; - if (Object.isString(styles)) { - element.style.cssText += ';' + styles; - return styles.include('opacity') ? - element.setOpacity(styles.match(/opacity:\s*(\d?\.?\d*)/)[1]) : element; - } - for (var property in styles) - if (property == 'opacity') element.setOpacity(styles[property]); - else - elementStyle[(property == 'float' || property == 'cssFloat') ? - (elementStyle.styleFloat === undefined ? 'cssFloat' : 'styleFloat') : - property] = styles[property]; - - return element; - }, - - setOpacity: function(element, value) { - element = $(element); - element.style.opacity = (value == 1 || value === '') ? '' : - (value < 0.00001) ? 0 : value; - return element; - }, - - getDimensions: function(element) { - element = $(element); - var display = $(element).getStyle('display'); - if (display != 'none' && display != null) // Safari bug - return {width: element.offsetWidth, height: element.offsetHeight}; - - // All *Width and *Height properties give 0 on elements with display none, - // so enable the element temporarily - var els = element.style; - var originalVisibility = els.visibility; - var originalPosition = els.position; - var originalDisplay = els.display; - els.visibility = 'hidden'; - els.position = 'absolute'; - els.display = 'block'; - var originalWidth = element.clientWidth; - var originalHeight = element.clientHeight; - els.display = originalDisplay; - els.position = originalPosition; - els.visibility = originalVisibility; - return {width: originalWidth, height: originalHeight}; - }, - - makePositioned: function(element) { - element = $(element); - var pos = Element.getStyle(element, 'position'); - if (pos == 'static' || !pos) { - element._madePositioned = true; - element.style.position = 'relative'; - // Opera returns the offset relative to the positioning context, when an - // element is position relative but top and left have not been defined - if (window.opera) { - element.style.top = 0; - element.style.left = 0; - } - } - return element; - }, - - undoPositioned: function(element) { - element = $(element); - if (element._madePositioned) { - element._madePositioned = undefined; - element.style.position = - element.style.top = - element.style.left = - element.style.bottom = - element.style.right = ''; - } - return element; - }, - - makeClipping: function(element) { - element = $(element); - if (element._overflow) return element; - element._overflow = element.style.overflow || 'auto'; - if ((Element.getStyle(element, 'overflow') || 'visible') != 'hidden') - element.style.overflow = 'hidden'; - return element; - }, - - undoClipping: function(element) { - element = $(element); - if (!element._overflow) return element; - element.style.overflow = element._overflow == 'auto' ? '' : element._overflow; - element._overflow = null; - return element; - }, - - cumulativeOffset: function(element) { - var valueT = 0, valueL = 0; - do { - valueT += element.offsetTop || 0; - valueL += element.offsetLeft || 0; - element = element.offsetParent; - } while (element); - return Element._returnOffset(valueL, valueT); - }, - - positionedOffset: function(element) { - var valueT = 0, valueL = 0; - do { - valueT += element.offsetTop || 0; - valueL += element.offsetLeft || 0; - element = element.offsetParent; - if (element) { - if (element.tagName == 'BODY') break; - var p = Element.getStyle(element, 'position'); - if (p == 'relative' || p == 'absolute') break; - } - } while (element); - return Element._returnOffset(valueL, valueT); - }, - - absolutize: function(element) { - element = $(element); - if (element.getStyle('position') == 'absolute') return; - // Position.prepare(); // To be done manually by Scripty when it needs it. - - var offsets = element.positionedOffset(); - var top = offsets[1]; - var left = offsets[0]; - var width = element.clientWidth; - var height = element.clientHeight; - - element._originalLeft = left - parseFloat(element.style.left || 0); - element._originalTop = top - parseFloat(element.style.top || 0); - element._originalWidth = element.style.width; - element._originalHeight = element.style.height; - - element.style.position = 'absolute'; - element.style.top = top + 'px'; - element.style.left = left + 'px'; - element.style.width = width + 'px'; - element.style.height = height + 'px'; - return element; - }, - - relativize: function(element) { - element = $(element); - if (element.getStyle('position') == 'relative') return; - // Position.prepare(); // To be done manually by Scripty when it needs it. - - element.style.position = 'relative'; - var top = parseFloat(element.style.top || 0) - (element._originalTop || 0); - var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0); - - element.style.top = top + 'px'; - element.style.left = left + 'px'; - element.style.height = element._originalHeight; - element.style.width = element._originalWidth; - return element; - }, - - cumulativeScrollOffset: function(element) { - var valueT = 0, valueL = 0; - do { - valueT += element.scrollTop || 0; - valueL += element.scrollLeft || 0; - element = element.parentNode; - } while (element); - return Element._returnOffset(valueL, valueT); - }, - - getOffsetParent: function(element) { - if (element.offsetParent) return $(element.offsetParent); - if (element == document.body) return $(element); - - while ((element = element.parentNode) && element != document.body) - if (Element.getStyle(element, 'position') != 'static') - return $(element); - - return $(document.body); - }, - - viewportOffset: function(forElement) { - var valueT = 0, valueL = 0; - - var element = forElement; - do { - valueT += element.offsetTop || 0; - valueL += element.offsetLeft || 0; - - // Safari fix - if (element.offsetParent == document.body && - Element.getStyle(element, 'position') == 'absolute') break; - - } while (element = element.offsetParent); - - element = forElement; - do { - if (!Prototype.Browser.Opera || element.tagName == 'BODY') { - valueT -= element.scrollTop || 0; - valueL -= element.scrollLeft || 0; - } - } while (element = element.parentNode); - - return Element._returnOffset(valueL, valueT); - }, - - clonePosition: function(element, source) { - var options = Object.extend({ - setLeft: true, - setTop: true, - setWidth: true, - setHeight: true, - offsetTop: 0, - offsetLeft: 0 - }, arguments[2] || { }); - - // find page position of source - source = $(source); - var p = source.viewportOffset(); - - // find coordinate system to use - element = $(element); - var delta = [0, 0]; - var parent = null; - // delta [0,0] will do fine with position: fixed elements, - // position:absolute needs offsetParent deltas - if (Element.getStyle(element, 'position') == 'absolute') { - parent = element.getOffsetParent(); - delta = parent.viewportOffset(); - } - - // correct by body offsets (fixes Safari) - if (parent == document.body) { - delta[0] -= document.body.offsetLeft; - delta[1] -= document.body.offsetTop; - } - - // set position - if (options.setLeft) element.style.left = (p[0] - delta[0] + options.offsetLeft) + 'px'; - if (options.setTop) element.style.top = (p[1] - delta[1] + options.offsetTop) + 'px'; - if (options.setWidth) element.style.width = source.offsetWidth + 'px'; - if (options.setHeight) element.style.height = source.offsetHeight + 'px'; - return element; - } -}; - -Element.Methods.identify.counter = 1; - -Object.extend(Element.Methods, { - getElementsBySelector: Element.Methods.select, - childElements: Element.Methods.immediateDescendants -}); - -Element._attributeTranslations = { - write: { - names: { - className: 'class', - htmlFor: 'for' - }, - values: { } - } -}; - - -if (!document.createRange || Prototype.Browser.Opera) { - Element.Methods.insert = function(element, insertions) { - element = $(element); - - if (Object.isString(insertions) || Object.isNumber(insertions) || - Object.isElement(insertions) || (insertions && (insertions.toElement || insertions.toHTML))) - insertions = { bottom: insertions }; - - var t = Element._insertionTranslations, content, position, pos, tagName; - - for (position in insertions) { - content = insertions[position]; - position = position.toLowerCase(); - pos = t[position]; - - if (content && content.toElement) content = content.toElement(); - if (Object.isElement(content)) { - pos.insert(element, content); - continue; - } - - content = Object.toHTML(content); - tagName = ((position == 'before' || position == 'after') - ? element.parentNode : element).tagName.toUpperCase(); - - if (t.tags[tagName]) { - var fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts()); - if (position == 'top' || position == 'after') fragments.reverse(); - fragments.each(pos.insert.curry(element)); - } - else element.insertAdjacentHTML(pos.adjacency, content.stripScripts()); - - content.evalScripts.bind(content).defer(); - } - - return element; - }; -} - -if (Prototype.Browser.Opera) { - Element.Methods._getStyle = Element.Methods.getStyle; - Element.Methods.getStyle = function(element, style) { - switch(style) { - case 'left': - case 'top': - case 'right': - case 'bottom': - if (Element._getStyle(element, 'position') == 'static') return null; - default: return Element._getStyle(element, style); - } - }; - Element.Methods._readAttribute = Element.Methods.readAttribute; - Element.Methods.readAttribute = function(element, attribute) { - if (attribute == 'title') return element.title; - return Element._readAttribute(element, attribute); - }; -} - -else if (Prototype.Browser.IE) { - $w('positionedOffset getOffsetParent viewportOffset').each(function(method) { - Element.Methods[method] = Element.Methods[method].wrap( - function(proceed, element) { - element = $(element); - var position = element.getStyle('position'); - if (position != 'static') return proceed(element); - element.setStyle({ position: 'relative' }); - var value = proceed(element); - element.setStyle({ position: position }); - return value; - } - ); - }); - - Element.Methods.getStyle = function(element, style) { - element = $(element); - style = (style == 'float' || style == 'cssFloat') ? 'styleFloat' : style.camelize(); - var value = element.style[style]; - if (!value && element.currentStyle) value = element.currentStyle[style]; - - if (style == 'opacity') { - if (value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/)) - if (value[1]) return parseFloat(value[1]) / 100; - return 1.0; - } - - if (value == 'auto') { - if ((style == 'width' || style == 'height') && (element.getStyle('display') != 'none')) - return element['offset' + style.capitalize()] + 'px'; - return null; - } - return value; - }; - - Element.Methods.setOpacity = function(element, value) { - function stripAlpha(filter){ - return filter.replace(/alpha\([^\)]*\)/gi,''); - } - element = $(element); - if (!element.currentStyle.hasLayout) element.style.zoom = 1; - var filter = element.getStyle('filter'), style = element.style; - if (value == 1 || value === '') { - (filter = stripAlpha(filter)) ? - style.filter = filter : style.removeAttribute('filter'); - return element; - } else if (value < 0.00001) value = 0; - style.filter = stripAlpha(filter) + - 'alpha(opacity=' + (value * 100) + ')'; - return element; - }; - - Element._attributeTranslations = { - read: { - names: { - 'class': 'className', - 'for': 'htmlFor' - }, - values: { - _getAttr: function(element, attribute) { - return element.getAttribute(attribute, 2); - }, - _getAttrNode: function(element, attribute) { - var node = element.getAttributeNode(attribute); - return node ? node.value : ""; - }, - _getEv: function(element, attribute) { - var attribute = element.getAttribute(attribute); - return attribute ? attribute.toString().slice(23, -2) : null; - }, - _flag: function(element, attribute) { - return $(element).hasAttribute(attribute) ? attribute : null; - }, - style: function(element) { - return element.style.cssText.toLowerCase(); - }, - title: function(element) { - return element.title; - } - } - } - }; - - Element._attributeTranslations.write = { - names: Object.clone(Element._attributeTranslations.read.names), - values: { - checked: function(element, value) { - element.checked = !!value; - }, - - style: function(element, value) { - element.style.cssText = value ? value : ''; - } - } - }; - - Element._attributeTranslations.has = {}; - - $w('colSpan rowSpan vAlign dateTime accessKey tabIndex ' + - 'encType maxLength readOnly longDesc').each(function(attr) { - Element._attributeTranslations.write.names[attr.toLowerCase()] = attr; - Element._attributeTranslations.has[attr.toLowerCase()] = attr; - }); - - (function(v) { - Object.extend(v, { - href: v._getAttr, - src: v._getAttr, - type: v._getAttr, - action: v._getAttrNode, - disabled: v._flag, - checked: v._flag, - readonly: v._flag, - multiple: v._flag, - onload: v._getEv, - onunload: v._getEv, - onclick: v._getEv, - ondblclick: v._getEv, - onmousedown: v._getEv, - onmouseup: v._getEv, - onmouseover: v._getEv, - onmousemove: v._getEv, - onmouseout: v._getEv, - onfocus: v._getEv, - onblur: v._getEv, - onkeypress: v._getEv, - onkeydown: v._getEv, - onkeyup: v._getEv, - onsubmit: v._getEv, - onreset: v._getEv, - onselect: v._getEv, - onchange: v._getEv - }); - })(Element._attributeTranslations.read.values); -} - -else if (Prototype.Browser.Gecko) { - Element.Methods.setOpacity = function(element, value) { - element = $(element); - element.style.opacity = (value == 1) ? 0.999999 : - (value === '') ? '' : (value < 0.00001) ? 0 : value; - return element; - }; -} - -else if (Prototype.Browser.WebKit) { - Element.Methods.setOpacity = function(element, value) { - element = $(element); - element.style.opacity = (value == 1 || value === '') ? '' : - (value < 0.00001) ? 0 : value; - - if (value == 1) - if(element.tagName == 'IMG' && element.width) { - element.width++; element.width--; - } else try { - var n = document.createTextNode(' '); - element.appendChild(n); - element.removeChild(n); - } catch (e) { } - - return element; - }; - - // Safari returns margins on body which is incorrect if the child is absolutely - // positioned. For performance reasons, redefine Position.cumulativeOffset for - // KHTML/WebKit only. - Element.Methods.cumulativeOffset = function(element) { - var valueT = 0, valueL = 0; - do { - valueT += element.offsetTop || 0; - valueL += element.offsetLeft || 0; - if (element.offsetParent == document.body) - if (Element.getStyle(element, 'position') == 'absolute') break; - - element = element.offsetParent; - } while (element); - - return Element._returnOffset(valueL, valueT); - }; -} - -if (Prototype.Browser.IE || Prototype.Browser.Opera) { - // IE and Opera are missing .innerHTML support for TABLE-related and SELECT elements - Element.Methods.update = function(element, content) { - element = $(element); - - if (content && content.toElement) content = content.toElement(); - if (Object.isElement(content)) return element.update().insert(content); - - content = Object.toHTML(content); - var tagName = element.tagName.toUpperCase(); - - if (tagName in Element._insertionTranslations.tags) { - $A(element.childNodes).each(function(node) { element.removeChild(node) }); - Element._getContentFromAnonymousElement(tagName, content.stripScripts()) - .each(function(node) { element.appendChild(node) }); - } - else element.innerHTML = content.stripScripts(); - - content.evalScripts.bind(content).defer(); - return element; - }; -} - -if (document.createElement('div').outerHTML) { - Element.Methods.replace = function(element, content) { - element = $(element); - - if (content && content.toElement) content = content.toElement(); - if (Object.isElement(content)) { - element.parentNode.replaceChild(content, element); - return element; - } - - content = Object.toHTML(content); - var parent = element.parentNode, tagName = parent.tagName.toUpperCase(); - - if (Element._insertionTranslations.tags[tagName]) { - var nextSibling = element.next(); - var fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts()); - parent.removeChild(element); - if (nextSibling) - fragments.each(function(node) { parent.insertBefore(node, nextSibling) }); - else - fragments.each(function(node) { parent.appendChild(node) }); - } - else element.outerHTML = content.stripScripts(); - - content.evalScripts.bind(content).defer(); - return element; - }; -} - -Element._returnOffset = function(l, t) { - var result = [l, t]; - result.left = l; - result.top = t; - return result; -}; - -Element._getContentFromAnonymousElement = function(tagName, html) { - var div = new Element('div'), t = Element._insertionTranslations.tags[tagName]; - div.innerHTML = t[0] + html + t[1]; - t[2].times(function() { div = div.firstChild }); - return $A(div.childNodes); -}; - -Element._insertionTranslations = { - before: { - adjacency: 'beforeBegin', - insert: function(element, node) { - element.parentNode.insertBefore(node, element); - }, - initializeRange: function(element, range) { - range.setStartBefore(element); - } - }, - top: { - adjacency: 'afterBegin', - insert: function(element, node) { - element.insertBefore(node, element.firstChild); - }, - initializeRange: function(element, range) { - range.selectNodeContents(element); - range.collapse(true); - } - }, - bottom: { - adjacency: 'beforeEnd', - insert: function(element, node) { - element.appendChild(node); - } - }, - after: { - adjacency: 'afterEnd', - insert: function(element, node) { - element.parentNode.insertBefore(node, element.nextSibling); - }, - initializeRange: function(element, range) { - range.setStartAfter(element); - } - }, - tags: { - TABLE: ['<table>', '</table>', 1], - TBODY: ['<table><tbody>', '</tbody></table>', 2], - TR: ['<table><tbody><tr>', '</tr></tbody></table>', 3], - TD: ['<table><tbody><tr><td>', '</td></tr></tbody></table>', 4], - SELECT: ['<select>', '</select>', 1] - } -}; - -(function() { - this.bottom.initializeRange = this.top.initializeRange; - Object.extend(this.tags, { - THEAD: this.tags.TBODY, - TFOOT: this.tags.TBODY, - TH: this.tags.TD - }); -}).call(Element._insertionTranslations); - -Element.Methods.Simulated = { - hasAttribute: function(element, attribute) { - attribute = Element._attributeTranslations.has[attribute] || attribute; - var node = $(element).getAttributeNode(attribute); - return node && node.specified; - } -}; - -Element.Methods.ByTag = { }; - -Object.extend(Element, Element.Methods); - -if (!Prototype.BrowserFeatures.ElementExtensions && - document.createElement('div').__proto__) { - window.HTMLElement = { }; - window.HTMLElement.prototype = document.createElement('div').__proto__; - Prototype.BrowserFeatures.ElementExtensions = true; -} - -Element.extend = (function() { - if (Prototype.BrowserFeatures.SpecificElementExtensions) - return Prototype.K; - - var Methods = { }, ByTag = Element.Methods.ByTag; - - var extend = Object.extend(function(element) { - if (!element || element._extendedByPrototype || - element.nodeType != 1 || element == window) return element; - - var methods = Object.clone(Methods), - tagName = element.tagName, property, value; - - // extend methods for specific tags - if (ByTag[tagName]) Object.extend(methods, ByTag[tagName]); - - for (property in methods) { - value = methods[property]; - if (Object.isFunction(value) && !(property in element)) - element[property] = value.methodize(); - } - - element._extendedByPrototype = Prototype.emptyFunction; - return element; - - }, { - refresh: function() { - // extend methods for all tags (Safari doesn't need this) - if (!Prototype.BrowserFeatures.ElementExtensions) { - Object.extend(Methods, Element.Methods); - Object.extend(Methods, Element.Methods.Simulated); - } - } - }); - - extend.refresh(); - return extend; -})(); - -Element.hasAttribute = function(element, attribute) { - if (element.hasAttribute) return element.hasAttribute(attribute); - return Element.Methods.Simulated.hasAttribute(element, attribute); -}; - -Element.addMethods = function(methods) { - var F = Prototype.BrowserFeatures, T = Element.Methods.ByTag; - - if (!methods) { - Object.extend(Form, Form.Methods); - Object.extend(Form.Element, Form.Element.Methods); - Object.extend(Element.Methods.ByTag, { - "FORM": Object.clone(Form.Methods), - "INPUT": Object.clone(Form.Element.Methods), - "SELECT": Object.clone(Form.Element.Methods), - "TEXTAREA": Object.clone(Form.Element.Methods) - }); - } - - if (arguments.length == 2) { - var tagName = methods; - methods = arguments[1]; - } - - if (!tagName) Object.extend(Element.Methods, methods || { }); - else { - if (Object.isArray(tagName)) tagName.each(extend); - else extend(tagName); - } - - function extend(tagName) { - tagName = tagName.toUpperCase(); - if (!Element.Methods.ByTag[tagName]) - Element.Methods.ByTag[tagName] = { }; - Object.extend(Element.Methods.ByTag[tagName], methods); - } - - function copy(methods, destination, onlyIfAbsent) { - onlyIfAbsent = onlyIfAbsent || false; - for (var property in methods) { - var value = methods[property]; - if (!Object.isFunction(value)) continue; - if (!onlyIfAbsent || !(property in destination)) - destination[property] = value.methodize(); - } - } - - function findDOMClass(tagName) { - var klass; - var trans = { - "OPTGROUP": "OptGroup", "TEXTAREA": "TextArea", "P": "Paragraph", - "FIELDSET": "FieldSet", "UL": "UList", "OL": "OList", "DL": "DList", - "DIR": "Directory", "H1": "Heading", "H2": "Heading", "H3": "Heading", - "H4": "Heading", "H5": "Heading", "H6": "Heading", "Q": "Quote", - "INS": "Mod", "DEL": "Mod", "A": "Anchor", "IMG": "Image", "CAPTION": - "TableCaption", "COL": "TableCol", "COLGROUP": "TableCol", "THEAD": - "TableSection", "TFOOT": "TableSection", "TBODY": "TableSection", "TR": - "TableRow", "TH": "TableCell", "TD": "TableCell", "FRAMESET": - "FrameSet", "IFRAME": "IFrame" - }; - if (trans[tagName]) klass = 'HTML' + trans[tagName] + 'Element'; - if (window[klass]) return window[klass]; - klass = 'HTML' + tagName + 'Element'; - if (window[klass]) return window[klass]; - klass = 'HTML' + tagName.capitalize() + 'Element'; - if (window[klass]) return window[klass]; - - window[klass] = { }; - window[klass].prototype = document.createElement(tagName).__proto__; - return window[klass]; - } - - if (F.ElementExtensions) { - copy(Element.Methods, HTMLElement.prototype); - copy(Element.Methods.Simulated, HTMLElement.prototype, true); - } - - if (F.SpecificElementExtensions) { - for (var tag in Element.Methods.ByTag) { - var klass = findDOMClass(tag); - if (Object.isUndefined(klass)) continue; - copy(T[tag], klass.prototype); - } - } - - Object.extend(Element, Element.Methods); - delete Element.ByTag; - - if (Element.extend.refresh) Element.extend.refresh(); - Element.cache = { }; -}; - -document.viewport = { - getDimensions: function() { - var dimensions = { }; - $w('width height').each(function(d) { - var D = d.capitalize(); - dimensions[d] = self['inner' + D] || - (document.documentElement['client' + D] || document.body['client' + D]); - }); - return dimensions; - }, - - getWidth: function() { - return this.getDimensions().width; - }, - - getHeight: function() { - return this.getDimensions().height; - }, - - getScrollOffsets: function() { - return Element._returnOffset( - window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft, - window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop); - } -}; -/* Portions of the Selector class are derived from Jack Slocum’s DomQuery, - * part of YUI-Ext version 0.40, distributed under the terms of an MIT-style - * license. Please see http://www.yui-ext.com/ for more information. */ - -var Selector = Class.create({ - initialize: function(expression) { - this.expression = expression.strip(); - this.compileMatcher(); - }, - - compileMatcher: function() { - // Selectors with namespaced attributes can't use the XPath version - if (Prototype.BrowserFeatures.XPath && !(/\[[\w-]*?:/).test(this.expression)) - return this.compileXPathMatcher(); - - var e = this.expression, ps = Selector.patterns, h = Selector.handlers, - c = Selector.criteria, le, p, m; - - if (Selector._cache[e]) { - this.matcher = Selector._cache[e]; - return; - } - - this.matcher = ["this.matcher = function(root) {", - "var r = root, h = Selector.handlers, c = false, n;"]; - - while (e && le != e && (/\S/).test(e)) { - le = e; - for (var i in ps) { - p = ps[i]; - if (m = e.match(p)) { - this.matcher.push(Object.isFunction(c[i]) ? c[i](m) : - new Template(c[i]).evaluate(m)); - e = e.replace(m[0], ''); - break; - } - } - } - - this.matcher.push("return h.unique(n);\n}"); - eval(this.matcher.join('\n')); - Selector._cache[this.expression] = this.matcher; - }, - - compileXPathMatcher: function() { - var e = this.expression, ps = Selector.patterns, - x = Selector.xpath, le, m; - - if (Selector._cache[e]) { - this.xpath = Selector._cache[e]; return; - } - - this.matcher = ['.//*']; - while (e && le != e && (/\S/).test(e)) { - le = e; - for (var i in ps) { - if (m = e.match(ps[i])) { - this.matcher.push(Object.isFunction(x[i]) ? x[i](m) : - new Template(x[i]).evaluate(m)); - e = e.replace(m[0], ''); - break; - } - } - } - - this.xpath = this.matcher.join(''); - Selector._cache[this.expression] = this.xpath; - }, - - findElements: function(root) { - root = root || document; - if (this.xpath) return document._getElementsByXPath(this.xpath, root); - return this.matcher(root); - }, - - match: function(element) { - this.tokens = []; - - var e = this.expression, ps = Selector.patterns, as = Selector.assertions; - var le, p, m; - - while (e && le !== e && (/\S/).test(e)) { - le = e; - for (var i in ps) { - p = ps[i]; - if (m = e.match(p)) { - // use the Selector.assertions methods unless the selector - // is too complex. - if (as[i]) { - this.tokens.push([i, Object.clone(m)]); - e = e.replace(m[0], ''); - } else { - // reluctantly do a document-wide search - // and look for a match in the array - return this.findElements(document).include(element); - } - } - } - } - - var match = true, name, matches; - for (var i = 0, token; token = this.tokens[i]; i++) { - name = token[0], matches = token[1]; - if (!Selector.assertions[name](element, matches)) { - match = false; break; - } - } - - return match; - }, - - toString: function() { - return this.expression; - }, - - inspect: function() { - return "#<Selector:" + this.expression.inspect() + ">"; - } -}); - -Object.extend(Selector, { - _cache: { }, - - xpath: { - descendant: "//*", - child: "/*", - adjacent: "/following-sibling::*[1]", - laterSibling: '/following-sibling::*', - tagName: function(m) { - if (m[1] == '*') return ''; - return "[local-name()='" + m[1].toLowerCase() + - "' or local-name()='" + m[1].toUpperCase() + "']"; - }, - className: "[contains(concat(' ', @class, ' '), ' #{1} ')]", - id: "[@id='#{1}']", - attrPresence: "[@#{1}]", - attr: function(m) { - m[3] = m[5] || m[6]; - return new Template(Selector.xpath.operators[m[2]]).evaluate(m); - }, - pseudo: function(m) { - var h = Selector.xpath.pseudos[m[1]]; - if (!h) return ''; - if (Object.isFunction(h)) return h(m); - return new Template(Selector.xpath.pseudos[m[1]]).evaluate(m); - }, - operators: { - '=': "[@#{1}='#{3}']", - '!=': "[@#{1}!='#{3}']", - '^=': "[starts-with(@#{1}, '#{3}')]", - '$=': "[substring(@#{1}, (string-length(@#{1}) - string-length('#{3}') + 1))='#{3}']", - '*=': "[contains(@#{1}, '#{3}')]", - '~=': "[contains(concat(' ', @#{1}, ' '), ' #{3} ')]", - '|=': "[contains(concat('-', @#{1}, '-'), '-#{3}-')]" - }, - pseudos: { - 'first-child': '[not(preceding-sibling::*)]', - 'last-child': '[not(following-sibling::*)]', - 'only-child': '[not(preceding-sibling::* or following-sibling::*)]', - 'empty': "[count(*) = 0 and (count(text()) = 0 or translate(text(), ' \t\r\n', '') = '')]", - 'checked': "[@checked]", - 'disabled': "[@disabled]", - 'enabled': "[not(@disabled)]", - 'not': function(m) { - var e = m[6], p = Selector.patterns, - x = Selector.xpath, le, m, v; - - var exclusion = []; - while (e && le != e && (/\S/).test(e)) { - le = e; - for (var i in p) { - if (m = e.match(p[i])) { - v = Object.isFunction(x[i]) ? x[i](m) : new Template(x[i]).evaluate(m); - exclusion.push("(" + v.substring(1, v.length - 1) + ")"); - e = e.replace(m[0], ''); - break; - } - } - } - return "[not(" + exclusion.join(" and ") + ")]"; - }, - 'nth-child': function(m) { - return Selector.xpath.pseudos.nth("(count(./preceding-sibling::*) + 1) ", m); - }, - 'nth-last-child': function(m) { - return Selector.xpath.pseudos.nth("(count(./following-sibling::*) + 1) ", m); - }, - 'nth-of-type': function(m) { - return Selector.xpath.pseudos.nth("position() ", m); - }, - 'nth-last-of-type': function(m) { - return Selector.xpath.pseudos.nth("(last() + 1 - position()) ", m); - }, - 'first-of-type': function(m) { - m[6] = "1"; return Selector.xpath.pseudos['nth-of-type'](m); - }, - 'last-of-type': function(m) { - m[6] = "1"; return Selector.xpath.pseudos['nth-last-of-type'](m); - }, - 'only-of-type': function(m) { - var p = Selector.xpath.pseudos; return p['first-of-type'](m) + p['last-of-type'](m); - }, - nth: function(fragment, m) { - var mm, formula = m[6], predicate; - if (formula == 'even') formula = '2n+0'; - if (formula == 'odd') formula = '2n+1'; - if (mm = formula.match(/^(\d+)$/)) // digit only - return '[' + fragment + "= " + mm[1] + ']'; - if (mm = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b - if (mm[1] == "-") mm[1] = -1; - var a = mm[1] ? Number(mm[1]) : 1; - var b = mm[2] ? Number(mm[2]) : 0; - predicate = "[((#{fragment} - #{b}) mod #{a} = 0) and " + - "((#{fragment} - #{b}) div #{a} >= 0)]"; - return new Template(predicate).evaluate({ - fragment: fragment, a: a, b: b }); - } - } - } - }, - - criteria: { - tagName: 'n = h.tagName(n, r, "#{1}", c); c = false;', - className: 'n = h.className(n, r, "#{1}", c); c = false;', - id: 'n = h.id(n, r, "#{1}", c); c = false;', - attrPresence: 'n = h.attrPresence(n, r, "#{1}"); c = false;', - attr: function(m) { - m[3] = (m[5] || m[6]); - return new Template('n = h.attr(n, r, "#{1}", "#{3}", "#{2}"); c = false;').evaluate(m); - }, - pseudo: function(m) { - if (m[6]) m[6] = m[6].replace(/"/g, '\\"'); - return new Template('n = h.pseudo(n, "#{1}", "#{6}", r, c); c = false;').evaluate(m); - }, - descendant: 'c = "descendant";', - child: 'c = "child";', - adjacent: 'c = "adjacent";', - laterSibling: 'c = "laterSibling";' - }, - - patterns: { - // combinators must be listed first - // (and descendant needs to be last combinator) - laterSibling: /^\s*~\s*/, - child: /^\s*>\s*/, - adjacent: /^\s*\+\s*/, - descendant: /^\s/, - - // selectors follow - tagName: /^\s*(\*|[\w\-]+)(\b|$)?/, - id: /^#([\w\-\*]+)(\b|$)/, - className: /^\.([\w\-\*]+)(\b|$)/, - pseudo: /^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis)abled|not)(\((.*?)\))?(\b|$|\s|(?=:))/, - attrPresence: /^\[([\w]+)\]/, - attr: /\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=)\s*((['"])([^\4]*?)\4|([^'"][^\]]*?)))?\]/ - }, - - // for Selector.match and Element#match - assertions: { - tagName: function(element, matches) { - return matches[1].toUpperCase() == element.tagName.toUpperCase(); - }, - - className: function(element, matches) { - return Element.hasClassName(element, matches[1]); - }, - - id: function(element, matches) { - return element.id === matches[1]; - }, - - attrPresence: function(element, matches) { - return Element.hasAttribute(element, matches[1]); - }, - - attr: function(element, matches) { - var nodeValue = Element.readAttribute(element, matches[1]); - return Selector.operators[matches[2]](nodeValue, matches[3]); - } - }, - - handlers: { - // UTILITY FUNCTIONS - // joins two collections - concat: function(a, b) { - for (var i = 0, node; node = b[i]; i++) - a.push(node); - return a; - }, - - // marks an array of nodes for counting - mark: function(nodes) { - for (var i = 0, node; node = nodes[i]; i++) - node._counted = true; - return nodes; - }, - - unmark: function(nodes) { - for (var i = 0, node; node = nodes[i]; i++) - node._counted = undefined; - return nodes; - }, - - // mark each child node with its position (for nth calls) - // "ofType" flag indicates whether we're indexing for nth-of-type - // rather than nth-child - index: function(parentNode, reverse, ofType) { - parentNode._counted = true; - if (reverse) { - for (var nodes = parentNode.childNodes, i = nodes.length - 1, j = 1; i >= 0; i--) { - var node = nodes[i]; - if (node.nodeType == 1 && (!ofType || node._counted)) node.nodeIndex = j++; - } - } else { - for (var i = 0, j = 1, nodes = parentNode.childNodes; node = nodes[i]; i++) - if (node.nodeType == 1 && (!ofType || node._counted)) node.nodeIndex = j++; - } - }, - - // filters out duplicates and extends all nodes - unique: function(nodes) { - if (nodes.length == 0) return nodes; - var results = [], n; - for (var i = 0, l = nodes.length; i < l; i++) - if (!(n = nodes[i])._counted) { - n._counted = true; - results.push(Element.extend(n)); - } - return Selector.handlers.unmark(results); - }, - - // COMBINATOR FUNCTIONS - descendant: function(nodes) { - var h = Selector.handlers; - for (var i = 0, results = [], node; node = nodes[i]; i++) - h.concat(results, node.getElementsByTagName('*')); - return results; - }, - - child: function(nodes) { - var h = Selector.handlers; - for (var i = 0, results = [], node; node = nodes[i]; i++) { - for (var j = 0, children = [], child; child = node.childNodes[j]; j++) - if (child.nodeType == 1 && child.tagName != '!') results.push(child); - } - return results; - }, - - adjacent: function(nodes) { - for (var i = 0, results = [], node; node = nodes[i]; i++) { - var next = this.nextElementSibling(node); - if (next) results.push(next); - } - return results; - }, - - laterSibling: function(nodes) { - var h = Selector.handlers; - for (var i = 0, results = [], node; node = nodes[i]; i++) - h.concat(results, Element.nextSiblings(node)); - return results; - }, - - nextElementSibling: function(node) { - while (node = node.nextSibling) - if (node.nodeType == 1) return node; - return null; - }, - - previousElementSibling: function(node) { - while (node = node.previousSibling) - if (node.nodeType == 1) return node; - return null; - }, - - // TOKEN FUNCTIONS - tagName: function(nodes, root, tagName, combinator) { - tagName = tagName.toUpperCase(); - var results = [], h = Selector.handlers; - if (nodes) { - if (combinator) { - // fastlane for ordinary descendant combinators - if (combinator == "descendant") { - for (var i = 0, node; node = nodes[i]; i++) - h.concat(results, node.getElementsByTagName(tagName)); - return results; - } else nodes = this[combinator](nodes); - if (tagName == "*") return nodes; - } - for (var i = 0, node; node = nodes[i]; i++) - if (node.tagName.toUpperCase() == tagName) results.push(node); - return results; - } else return root.getElementsByTagName(tagName); - }, - - id: function(nodes, root, id, combinator) { - var targetNode = $(id), h = Selector.handlers; - if (!targetNode) return []; - if (!nodes && root == document) return [targetNode]; - if (nodes) { - if (combinator) { - if (combinator == 'child') { - for (var i = 0, node; node = nodes[i]; i++) - if (targetNode.parentNode == node) return [targetNode]; - } else if (combinator == 'descendant') { - for (var i = 0, node; node = nodes[i]; i++) - if (Element.descendantOf(targetNode, node)) return [targetNode]; - } else if (combinator == 'adjacent') { - for (var i = 0, node; node = nodes[i]; i++) - if (Selector.handlers.previousElementSibling(targetNode) == node) - return [targetNode]; - } else nodes = h[combinator](nodes); - } - for (var i = 0, node; node = nodes[i]; i++) - if (node == targetNode) return [targetNode]; - return []; - } - return (targetNode && Element.descendantOf(targetNode, root)) ? [targetNode] : []; - }, - - className: function(nodes, root, className, combinator) { - if (nodes && combinator) nodes = this[combinator](nodes); - return Selector.handlers.byClassName(nodes, root, className); - }, - - byClassName: function(nodes, root, className) { - if (!nodes) nodes = Selector.handlers.descendant([root]); - var needle = ' ' + className + ' '; - for (var i = 0, results = [], node, nodeClassName; node = nodes[i]; i++) { - nodeClassName = node.className; - if (nodeClassName.length == 0) continue; - if (nodeClassName == className || (' ' + nodeClassName + ' ').include(needle)) - results.push(node); - } - return results; - }, - - attrPresence: function(nodes, root, attr) { - var results = []; - for (var i = 0, node; node = nodes[i]; i++) - if (Element.hasAttribute(node, attr)) results.push(node); - return results; - }, - - attr: function(nodes, root, attr, value, operator) { - if (!nodes) nodes = root.getElementsByTagName("*"); - var handler = Selector.operators[operator], results = []; - for (var i = 0, node; node = nodes[i]; i++) { - var nodeValue = Element.readAttribute(node, attr); - if (nodeValue === null) continue; - if (handler(nodeValue, value)) results.push(node); - } - return results; - }, - - pseudo: function(nodes, name, value, root, combinator) { - if (nodes && combinator) nodes = this[combinator](nodes); - if (!nodes) nodes = root.getElementsByTagName("*"); - return Selector.pseudos[name](nodes, value, root); - } - }, - - pseudos: { - 'first-child': function(nodes, value, root) { - for (var i = 0, results = [], node; node = nodes[i]; i++) { - if (Selector.handlers.previousElementSibling(node)) continue; - results.push(node); - } - return results; - }, - 'last-child': function(nodes, value, root) { - for (var i = 0, results = [], node; node = nodes[i]; i++) { - if (Selector.handlers.nextElementSibling(node)) continue; - results.push(node); - } - return results; - }, - 'only-child': function(nodes, value, root) { - var h = Selector.handlers; - for (var i = 0, results = [], node; node = nodes[i]; i++) - if (!h.previousElementSibling(node) && !h.nextElementSibling(node)) - results.push(node); - return results; - }, - 'nth-child': function(nodes, formula, root) { - return Selector.pseudos.nth(nodes, formula, root); - }, - 'nth-last-child': function(nodes, formula, root) { - return Selector.pseudos.nth(nodes, formula, root, true); - }, - 'nth-of-type': function(nodes, formula, root) { - return Selector.pseudos.nth(nodes, formula, root, false, true); - }, - 'nth-last-of-type': function(nodes, formula, root) { - return Selector.pseudos.nth(nodes, formula, root, true, true); - }, - 'first-of-type': function(nodes, formula, root) { - return Selector.pseudos.nth(nodes, "1", root, false, true); - }, - 'last-of-type': function(nodes, formula, root) { - return Selector.pseudos.nth(nodes, "1", root, true, true); - }, - 'only-of-type': function(nodes, formula, root) { - var p = Selector.pseudos; - return p['last-of-type'](p['first-of-type'](nodes, formula, root), formula, root); - }, - - // handles the an+b logic - getIndices: function(a, b, total) { - if (a == 0) return b > 0 ? [b] : []; - return $R(1, total).inject([], function(memo, i) { - if (0 == (i - b) % a && (i - b) / a >= 0) memo.push(i); - return memo; - }); - }, - - // handles nth(-last)-child, nth(-last)-of-type, and (first|last)-of-type - nth: function(nodes, formula, root, reverse, ofType) { - if (nodes.length == 0) return []; - if (formula == 'even') formula = '2n+0'; - if (formula == 'odd') formula = '2n+1'; - var h = Selector.handlers, results = [], indexed = [], m; - h.mark(nodes); - for (var i = 0, node; node = nodes[i]; i++) { - if (!node.parentNode._counted) { - h.index(node.parentNode, reverse, ofType); - indexed.push(node.parentNode); - } - } - if (formula.match(/^\d+$/)) { // just a number - formula = Number(formula); - for (var i = 0, node; node = nodes[i]; i++) - if (node.nodeIndex == formula) results.push(node); - } else if (m = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b - if (m[1] == "-") m[1] = -1; - var a = m[1] ? Number(m[1]) : 1; - var b = m[2] ? Number(m[2]) : 0; - var indices = Selector.pseudos.getIndices(a, b, nodes.length); - for (var i = 0, node, l = indices.length; node = nodes[i]; i++) { - for (var j = 0; j < l; j++) - if (node.nodeIndex == indices[j]) results.push(node); - } - } - h.unmark(nodes); - h.unmark(indexed); - return results; - }, - - 'empty': function(nodes, value, root) { - for (var i = 0, results = [], node; node = nodes[i]; i++) { - // IE treats comments as element nodes - if (node.tagName == '!' || (node.firstChild && !node.innerHTML.match(/^\s*$/))) continue; - results.push(node); - } - return results; - }, - - 'not': function(nodes, selector, root) { - var h = Selector.handlers, selectorType, m; - var exclusions = new Selector(selector).findElements(root); - h.mark(exclusions); - for (var i = 0, results = [], node; node = nodes[i]; i++) - if (!node._counted) results.push(node); - h.unmark(exclusions); - return results; - }, - - 'enabled': function(nodes, value, root) { - for (var i = 0, results = [], node; node = nodes[i]; i++) - if (!node.disabled) results.push(node); - return results; - }, - - 'disabled': function(nodes, value, root) { - for (var i = 0, results = [], node; node = nodes[i]; i++) - if (node.disabled) results.push(node); - return results; - }, - - 'checked': function(nodes, value, root) { - for (var i = 0, results = [], node; node = nodes[i]; i++) - if (node.checked) results.push(node); - return results; - } - }, - - operators: { - '=': function(nv, v) { return nv == v; }, - '!=': function(nv, v) { return nv != v; }, - '^=': function(nv, v) { return nv.startsWith(v); }, - '$=': function(nv, v) { return nv.endsWith(v); }, - '*=': function(nv, v) { return nv.include(v); }, - '~=': function(nv, v) { return (' ' + nv + ' ').include(' ' + v + ' '); }, - '|=': function(nv, v) { return ('-' + nv.toUpperCase() + '-').include('-' + v.toUpperCase() + '-'); } - }, - - matchElements: function(elements, expression) { - var matches = new Selector(expression).findElements(), h = Selector.handlers; - h.mark(matches); - for (var i = 0, results = [], element; element = elements[i]; i++) - if (element._counted) results.push(element); - h.unmark(matches); - return results; - }, - - findElement: function(elements, expression, index) { - if (Object.isNumber(expression)) { - index = expression; expression = false; - } - return Selector.matchElements(elements, expression || '*')[index || 0]; - }, - - findChildElements: function(element, expressions) { - var exprs = expressions.join(','), expressions = []; - exprs.scan(/(([\w#:.~>+()\s-]+|\*|\[.*?\])+)\s*(,|$)/, function(m) { - expressions.push(m[1].strip()); - }); - var results = [], h = Selector.handlers; - for (var i = 0, l = expressions.length, selector; i < l; i++) { - selector = new Selector(expressions[i].strip()); - h.concat(results, selector.findElements(element)); - } - return (l > 1) ? h.unique(results) : results; - } -}); - -function $$() { - return Selector.findChildElements(document, $A(arguments)); -} -var Form = { - reset: function(form) { - $(form).reset(); - return form; - }, - - serializeElements: function(elements, options) { - if (typeof options != 'object') options = { hash: !!options }; - else if (options.hash === undefined) options.hash = true; - var key, value, submitted = false, submit = options.submit; - - var data = elements.inject({ }, function(result, element) { - if (!element.disabled && element.name) { - key = element.name; value = $(element).getValue(); - if (value != null && (element.type != 'submit' || (!submitted && - submit !== false && (!submit || key == submit) && (submitted = true)))) { - if (key in result) { - // a key is already present; construct an array of values - if (!Object.isArray(result[key])) result[key] = [result[key]]; - result[key].push(value); - } - else result[key] = value; - } - } - return result; - }); - - return options.hash ? data : Hash.toQueryString(data); - } -}; - -Form.Methods = { - serialize: function(form, options) { - return Form.serializeElements(Form.getElements(form), options); - }, - - getElements: function(form) { - return $A($(form).getElementsByTagName('*')).inject([], - function(elements, child) { - if (Form.Element.Serializers[child.tagName.toLowerCase()]) - elements.push(Element.extend(child)); - return elements; - } - ); - }, - - getInputs: function(form, typeName, name) { - form = $(form); - var inputs = form.getElementsByTagName('input'); - - if (!typeName && !name) return $A(inputs).map(Element.extend); - - for (var i = 0, matchingInputs = [], length = inputs.length; i < length; i++) { - var input = inputs[i]; - if ((typeName && input.type != typeName) || (name && input.name != name)) - continue; - matchingInputs.push(Element.extend(input)); - } - - return matchingInputs; - }, - - disable: function(form) { - form = $(form); - Form.getElements(form).invoke('disable'); - return form; - }, - - enable: function(form) { - form = $(form); - Form.getElements(form).invoke('enable'); - return form; - }, - - findFirstElement: function(form) { - var elements = $(form).getElements().findAll(function(element) { - return 'hidden' != element.type && !element.disabled; - }); - var firstByIndex = elements.findAll(function(element) { - return element.hasAttribute('tabIndex') && element.tabIndex >= 0; - }).sortBy(function(element) { return element.tabIndex }).first(); - - return firstByIndex ? firstByIndex : elements.find(function(element) { - return ['input', 'select', 'textarea'].include(element.tagName.toLowerCase()); - }); - }, - - focusFirstElement: function(form) { - form = $(form); - form.findFirstElement().activate(); - return form; - }, - - request: function(form, options) { - form = $(form), options = Object.clone(options || { }); - - var params = options.parameters, action = form.readAttribute('action') || ''; - if (action.blank()) action = window.location.href; - options.parameters = form.serialize(true); - - if (params) { - if (Object.isString(params)) params = params.toQueryParams(); - Object.extend(options.parameters, params); - } - - if (form.hasAttribute('method') && !options.method) - options.method = form.method; - - return new Ajax.Request(action, options); - } -}; - -/*--------------------------------------------------------------------------*/ - -Form.Element = { - focus: function(element) { - $(element).focus(); - return element; - }, - - select: function(element) { - $(element).select(); - return element; - } -}; - -Form.Element.Methods = { - serialize: function(element) { - element = $(element); - if (!element.disabled && element.name) { - var value = element.getValue(); - if (value != undefined) { - var pair = { }; - pair[element.name] = value; - return Hash.toQueryString(pair); - } - } - return ''; - }, - - getValue: function(element) { - element = $(element); - var method = element.tagName.toLowerCase(); - return Form.Element.Serializers[method](element); - }, - - setValue: function(element, value) { - element = $(element); - var method = element.tagName.toLowerCase(); - Form.Element.Serializers[method](element, value); - return element; - }, - - clear: function(element) { - $(element).value = ''; - return element; - }, - - present: function(element) { - return $(element).value != ''; - }, - - activate: function(element) { - element = $(element); - try { - element.focus(); - if (element.select && (element.tagName.toLowerCase() != 'input' || - !['button', 'reset', 'submit'].include(element.type))) - element.select(); - } catch (e) { } - return element; - }, - - disable: function(element) { - element = $(element); - element.blur(); - element.disabled = true; - return element; - }, - - enable: function(element) { - element = $(element); - element.disabled = false; - return element; - } -}; - -/*--------------------------------------------------------------------------*/ - -var Field = Form.Element; -var $F = Form.Element.Methods.getValue; - -/*--------------------------------------------------------------------------*/ - -Form.Element.Serializers = { - input: function(element, value) { - switch (element.type.toLowerCase()) { - case 'checkbox': - case 'radio': - return Form.Element.Serializers.inputSelector(element, value); - default: - return Form.Element.Serializers.textarea(element, value); - } - }, - - inputSelector: function(element, value) { - if (value === undefined) return element.checked ? element.value : null; - else element.checked = !!value; - }, - - textarea: function(element, value) { - if (value === undefined) return element.value; - else element.value = value; - }, - - select: function(element, index) { - if (index === undefined) - return this[element.type == 'select-one' ? - 'selectOne' : 'selectMany'](element); - else { - var opt, value, single = !Object.isArray(index); - for (var i = 0, length = element.length; i < length; i++) { - opt = element.options[i]; - value = this.optionValue(opt); - if (single) { - if (value == index) { - opt.selected = true; - return; - } - } - else opt.selected = index.include(value); - } - } - }, - - selectOne: function(element) { - var index = element.selectedIndex; - return index >= 0 ? this.optionValue(element.options[index]) : null; - }, - - selectMany: function(element) { - var values, length = element.length; - if (!length) return null; - - for (var i = 0, values = []; i < length; i++) { - var opt = element.options[i]; - if (opt.selected) values.push(this.optionValue(opt)); - } - return values; - }, - - optionValue: function(opt) { - // extend element because hasAttribute may not be native - return Element.extend(opt).hasAttribute('value') ? opt.value : opt.text; - } -}; - -/*--------------------------------------------------------------------------*/ - -Abstract.TimedObserver = Class.create(PeriodicalExecuter, { - initialize: function($super, element, frequency, callback) { - $super(callback, frequency); - this.element = $(element); - this.lastValue = this.getValue(); - }, - - execute: function() { - var value = this.getValue(); - if (Object.isString(this.lastValue) && Object.isString(value) ? - this.lastValue != value : String(this.lastValue) != String(value)) { - this.callback(this.element, value); - this.lastValue = value; - } - } -}); - -Form.Element.Observer = Class.create(Abstract.TimedObserver, { - getValue: function() { - return Form.Element.getValue(this.element); - } -}); - -Form.Observer = Class.create(Abstract.TimedObserver, { - getValue: function() { - return Form.serialize(this.element); - } -}); - -/*--------------------------------------------------------------------------*/ - -Abstract.EventObserver = Class.create({ - initialize: function(element, callback) { - this.element = $(element); - this.callback = callback; - - this.lastValue = this.getValue(); - if (this.element.tagName.toLowerCase() == 'form') - this.registerFormCallbacks(); - else - this.registerCallback(this.element); - }, - - onElementEvent: function() { - var value = this.getValue(); - if (this.lastValue != value) { - this.callback(this.element, value); - this.lastValue = value; - } - }, - - registerFormCallbacks: function() { - Form.getElements(this.element).each(this.registerCallback, this); - }, - - registerCallback: function(element) { - if (element.type) { - switch (element.type.toLowerCase()) { - case 'checkbox': - case 'radio': - Event.observe(element, 'click', this.onElementEvent.bind(this)); - break; - default: - Event.observe(element, 'change', this.onElementEvent.bind(this)); - break; - } - } - } -}); - -Form.Element.EventObserver = Class.create(Abstract.EventObserver, { - getValue: function() { - return Form.Element.getValue(this.element); - } -}); - -Form.EventObserver = Class.create(Abstract.EventObserver, { - getValue: function() { - return Form.serialize(this.element); - } -}); -if (!window.Event) var Event = { }; - -Object.extend(Event, { - KEY_BACKSPACE: 8, - KEY_TAB: 9, - KEY_RETURN: 13, - KEY_ESC: 27, - KEY_LEFT: 37, - KEY_UP: 38, - KEY_RIGHT: 39, - KEY_DOWN: 40, - KEY_DELETE: 46, - KEY_HOME: 36, - KEY_END: 35, - KEY_PAGEUP: 33, - KEY_PAGEDOWN: 34, - KEY_INSERT: 45, - - cache: { }, - - relatedTarget: function(event) { - var element; - switch(event.type) { - case 'mouseover': element = event.fromElement; break; - case 'mouseout': element = event.toElement; break; - default: return null; - } - return Element.extend(element); - } -}); - -Event.Methods = { - element: function(event) { - var node = event.target; - return Element.extend(node.nodeType == Node.TEXT_NODE ? node.parentNode : node); - }, - - findElement: function(event, expression) { - var element = Event.element(event); - return element.match(expression) ? element : element.up(expression); - }, - - isLeftClick: function(event) { - return (((event.which) && (event.which == 1)) || - ((event.button) && (event.button == 1))); - }, - - pointer: function(event) { - return { - x: event.pageX || (event.clientX + - (document.documentElement.scrollLeft || document.body.scrollLeft)), - y: event.pageY || (event.clientY + - (document.documentElement.scrollTop || document.body.scrollTop)) - }; - }, - - pointerX: function(event) { return Event.pointer(event).x }, - pointerY: function(event) { return Event.pointer(event).y }, - - stop: function(event) { - event.preventDefault(); - event.stopPropagation(); - } -}; - -Event.extend = (function() { - var methods = Object.keys(Event.Methods).inject({ }, function(m, name) { - m[name] = Event.Methods[name].methodize(); - return m; - }); - - if (Prototype.Browser.IE) { - Object.extend(methods, { - stopPropagation: function() { this.cancelBubble = true }, - preventDefault: function() { this.returnValue = false }, - inspect: function() { return "[object Event]" } - }); - - return function(event) { - if (!event) return false; - if (event._extendedByPrototype) return event; - - event._extendedByPrototype = Prototype.emptyFunction; - var pointer = Event.pointer(event); - Object.extend(event, { - target: event.srcElement, - relatedTarget: Event.relatedTarget(event), - pageX: pointer.x, - pageY: pointer.y - }); - return Object.extend(event, methods); - }; - - } else { - Event.prototype = Event.prototype || document.createEvent("HTMLEvents").__proto__; - Object.extend(Event.prototype, methods); - return Prototype.K; - } -})(); - -Object.extend(Event, (function() { - var cache = Event.cache; - - function getEventID(element) { - if (element._eventID) return element._eventID; - arguments.callee.id = arguments.callee.id || 1; - return element._eventID = ++arguments.callee.id; - } - - function getDOMEventName(eventName) { - if (eventName && eventName.match(/:/)) return "dataavailable"; - return { keypress: "keydown" }[eventName] || eventName; - } - - function getCacheForID(id) { - return cache[id] = cache[id] || { }; - } - - function getWrappersForEventName(id, eventName) { - var c = getCacheForID(id); - return c[eventName] = c[eventName] || []; - } - - function createWrapper(element, eventName, handler) { - var id = getEventID(element); - var c = getWrappersForEventName(id, eventName); - if (c.pluck("handler").include(handler)) return false; - - var wrapper = function(event) { - if (event.eventName && event.eventName != eventName) - return false; - - Event.extend(event); - handler.call(element, event) - }; - - wrapper.handler = handler; - c.push(wrapper); - return wrapper; - } - - function findWrapper(id, eventName, handler) { - var c = getWrappersForEventName(id, eventName); - return c.find(function(wrapper) { return wrapper.handler == handler }); - } - - function destroyWrapper(id, eventName, handler) { - var c = getCacheForID(id); - if (!c[eventName]) return false; - c[eventName] = c[eventName].without(findWrapper(id, eventName, handler)); - } - - function destroyCache() { - for (var id in cache) - for (var eventName in cache[id]) - cache[id][eventName] = null; - } - - if (window.attachEvent) { - window.attachEvent("onunload", destroyCache); - } - - return { - observe: function(element, eventName, handler) { - element = $(element); - var name = getDOMEventName(eventName); - - var wrapper = createWrapper(element, eventName, handler); - if (!wrapper) return element; - - if (element.addEventListener) { - element.addEventListener(name, wrapper, false); - } else { - element.attachEvent("on" + name, wrapper); - } - - return element; - }, - - stopObserving: function(element, eventName, handler) { - element = $(element); - var id = getEventID(element), name = getDOMEventName(eventName); - - if (!handler && eventName) { - getWrappersForEventName(id, eventName).each(function(wrapper) { - element.stopObserving(eventName, wrapper.handler); - }); - return element; - - } else if (!eventName) { - Object.keys(getCacheForID(id)).each(function(eventName) { - element.stopObserving(eventName); - }); - return element; - } - - var wrapper = findWrapper(id, eventName, handler); - if (!wrapper) return element; - - if (element.removeEventListener) { - element.removeEventListener(name, wrapper, false); - } else { - element.detachEvent("on" + name, wrapper); - } - - destroyWrapper(id, eventName, handler); - - return element; - }, - - fire: function(element, eventName, memo) { - element = $(element); - if (element == document && document.createEvent && !element.dispatchEvent) - element = document.documentElement; - - if (document.createEvent) { - var event = document.createEvent("HTMLEvents"); - event.initEvent("dataavailable", true, true); - } else { - var event = document.createEventObject(); - event.eventType = "ondataavailable"; - } - - event.eventName = eventName; - event.memo = memo || { }; - - if (document.createEvent) { - element.dispatchEvent(event); - } else { - element.fireEvent(event.eventType, event); - } - - return event; - } - }; -})()); - -Object.extend(Event, Event.Methods); - -Element.addMethods({ - fire: Event.fire, - observe: Event.observe, - stopObserving: Event.stopObserving -}); - -Object.extend(document, { - fire: Element.Methods.fire.methodize(), - observe: Element.Methods.observe.methodize(), - stopObserving: Element.Methods.stopObserving.methodize() -}); - -(function() { - /* Support for the DOMContentLoaded event is based on work by Dan Webb, - Matthias Miller, Dean Edwards and John Resig. */ - - var timer, fired = false; - - function fireContentLoadedEvent() { - if (fired) return; - if (timer) window.clearInterval(timer); - document.fire("dom:loaded"); - fired = true; - } - - if (document.addEventListener) { - if (Prototype.Browser.WebKit) { - timer = window.setInterval(function() { - if (/loaded|complete/.test(document.readyState)) - fireContentLoadedEvent(); - }, 0); - - Event.observe(window, "load", fireContentLoadedEvent); - - } else { - document.addEventListener("DOMContentLoaded", - fireContentLoadedEvent, false); - } - - } else { - document.write("<script id=__onDOMContentLoaded defer src=//:><\/script>"); - $("__onDOMContentLoaded").onreadystatechange = function() { - if (this.readyState == "complete") { - this.onreadystatechange = null; - fireContentLoadedEvent(); - } - }; - } -})(); -/*------------------------------- DEPRECATED -------------------------------*/ - -var Toggle = { display: Element.toggle }; - -Element.Methods.childOf = Element.Methods.descendantOf; - -var Insertion = { - Before: function(element, content) { - return Element.insert(element, {before:content}); - }, - - Top: function(element, content) { - return Element.insert(element, {top:content}); - }, - - Bottom: function(element, content) { - return Element.insert(element, {bottom:content}); - }, - - After: function(element, content) { - return Element.insert(element, {after:content}); - } -}; - -var $continue = new Error('"throw $continue" is deprecated, use "return" instead'); - -// This should be moved to script.aculo.us; notice the deprecated methods -// further below, that map to the newer Element methods. -var Position = { - // set to true if needed, warning: firefox performance problems - // NOT neeeded for page scrolling, only if draggable contained in - // scrollable elements - includeScrollOffsets: false, - - // must be called before calling withinIncludingScrolloffset, every time the - // page is scrolled - prepare: function() { - this.deltaX = window.pageXOffset - || document.documentElement.scrollLeft - || document.body.scrollLeft - || 0; - this.deltaY = window.pageYOffset - || document.documentElement.scrollTop - || document.body.scrollTop - || 0; - }, - - // caches x/y coordinate pair to use with overlap - within: function(element, x, y) { - if (this.includeScrollOffsets) - return this.withinIncludingScrolloffsets(element, x, y); - this.xcomp = x; - this.ycomp = y; - this.offset = Element.cumulativeOffset(element); - - return (y >= this.offset[1] && - y < this.offset[1] + element.offsetHeight && - x >= this.offset[0] && - x < this.offset[0] + element.offsetWidth); - }, - - withinIncludingScrolloffsets: function(element, x, y) { - var offsetcache = Element.cumulativeScrollOffset(element); - - this.xcomp = x + offsetcache[0] - this.deltaX; - this.ycomp = y + offsetcache[1] - this.deltaY; - this.offset = Element.cumulativeOffset(element); - - return (this.ycomp >= this.offset[1] && - this.ycomp < this.offset[1] + element.offsetHeight && - this.xcomp >= this.offset[0] && - this.xcomp < this.offset[0] + element.offsetWidth); - }, - - // within must be called directly before - overlap: function(mode, element) { - if (!mode) return 0; - if (mode == 'vertical') - return ((this.offset[1] + element.offsetHeight) - this.ycomp) / - element.offsetHeight; - if (mode == 'horizontal') - return ((this.offset[0] + element.offsetWidth) - this.xcomp) / - element.offsetWidth; - }, - - // Deprecation layer -- use newer Element methods now (1.5.2). - - cumulativeOffset: Element.Methods.cumulativeOffset, - - positionedOffset: Element.Methods.positionedOffset, - - absolutize: function(element) { - Position.prepare(); - return Element.absolutize(element); - }, - - relativize: function(element) { - Position.prepare(); - return Element.relativize(element); - }, - - realOffset: Element.Methods.cumulativeScrollOffset, - - offsetParent: Element.Methods.getOffsetParent, - - page: Element.Methods.viewportOffset, - - clone: function(source, target, options) { - options = options || { }; - return Element.clonePosition(target, source, options); - } -}; - -/*--------------------------------------------------------------------------*/ - -if (!document.getElementsByClassName) document.getElementsByClassName = function(instanceMethods){ - function iter(name) { - return name.blank() ? null : "[contains(concat(' ', @class, ' '), ' " + name + " ')]"; - } - - instanceMethods.getElementsByClassName = Prototype.BrowserFeatures.XPath ? - function(element, className) { - className = className.toString().strip(); - var cond = /\s/.test(className) ? $w(className).map(iter).join('') : iter(className); - return cond ? document._getElementsByXPath('.//*' + cond, element) : []; - } : function(element, className) { - className = className.toString().strip(); - var elements = [], classNames = (/\s/.test(className) ? $w(className) : null); - if (!classNames && !className) return elements; - - var nodes = $(element).getElementsByTagName('*'); - className = ' ' + className + ' '; - - for (var i = 0, child, cn; child = nodes[i]; i++) { - if (child.className && (cn = ' ' + child.className + ' ') && (cn.include(className) || - (classNames && classNames.all(function(name) { - return !name.toString().blank() && cn.include(' ' + name + ' '); - })))) - elements.push(Element.extend(child)); - } - return elements; - }; - - return function(className, parentElement) { - return $(parentElement || document.body).getElementsByClassName(className); - }; -}(Element.Methods); - -/*--------------------------------------------------------------------------*/ - -Element.ClassNames = Class.create(); -Element.ClassNames.prototype = { - initialize: function(element) { - this.element = $(element); - }, - - _each: function(iterator) { - this.element.className.split(/\s+/).select(function(name) { - return name.length > 0; - })._each(iterator); - }, - - set: function(className) { - this.element.className = className; - }, - - add: function(classNameToAdd) { - if (this.include(classNameToAdd)) return; - this.set($A(this).concat(classNameToAdd).join(' ')); - }, - - remove: function(classNameToRemove) { - if (!this.include(classNameToRemove)) return; - this.set($A(this).without(classNameToRemove).join(' ')); - }, - - toString: function() { - return $A(this).join(' '); - } -}; - -Object.extend(Element.ClassNames.prototype, Enumerable); - -/*--------------------------------------------------------------------------*/ - -Element.addMethods();
\ No newline at end of file diff --git a/vendor/plugins/rspec/story_server/prototype/javascripts/rspec.js b/vendor/plugins/rspec/story_server/prototype/javascripts/rspec.js deleted file mode 100644 index d63609600..000000000 --- a/vendor/plugins/rspec/story_server/prototype/javascripts/rspec.js +++ /dev/null @@ -1,149 +0,0 @@ -var InPlaceEditor = {}; -InPlaceEditor.Local = Class.create(); -Object.extend(Object.extend(InPlaceEditor.Local.prototype, Ajax.InPlaceEditor.prototype), { - enterHover: function() {}, - leaveHover: function() {}, - onComplete: function() {}, - handleFormSubmission: function(e) { - var value = $F(this._controls.editor); - RSpec.addStockStep(value); - this.element.innerHTML = value; - this.leaveEditMode(); - if (e) Event.stop(e); - } -}); - -var RSpec = { - stockSteps: function() { - return $('stock_steps').childElements().map(function(li){ - return li.innerHTML; - }).sort(); - }, - - addStockStep: function(stockStep) { - if(!this.stockSteps().include(stockStep)) { - $('stock_steps').appendChild(Builder.node('li', {}, stockStep)); - } - }, - - makeParamEditors: function() { - $$('span.param').each(function(span) { - span.removeClassName('param'); - span.addClassName('param_editor'); - new InPlaceEditor.Local(span, null, {}); - }); - }, - - setId: function(e) { - if(!this.currentId) this.currentId = 0; - this.currentId++; - e.id = "id_" + this.currentId; - }, - - applyUi: function() { - this.setUpTogglers(); - this.makeParamEditors(); - - var currentId = 0; - $$('ul.steps').each(function(ul) { - RSpec.setId(ul); - var footer = document.createElement("p"); - var addStepLink = document.createElement("a"); - addStepLink.href = "#"; - addStepLink.appendChild(document.createTextNode('Add step')); - footer.appendChild(addStepLink); - ul.parentNode.appendChild(footer); - - Sortable.create(ul, { - scroll: window - }); - -/* Disable for now - it messes with the autocomplete's visibility (zIndex galore) - Droppables.add(footer, { - hoverclass: 'wastebin', - onDrop: function(li, droppable, evt) { - li.remove(); - } - }); -*/ - Event.observe(addStepLink, 'click', function() { - var form = Builder.node('form', {}); - - var li = Builder.node('li', {className: 'new'}); - var input = Builder.node('input', {}, 'New step here'); - var autoComplete = Builder.node('div', {className: 'auto_complete'}, ''); - - li.appendChild(form); - form.appendChild(input); - form.appendChild(autoComplete); - ul.appendChild(li); - Sortable.destroy(ul); - Sortable.create(ul); - - Event.observe(form, 'submit', function(e) { - var value = input.value; - Element.remove(this); - li.innerHTML = value.gsub(/(\$[a-z]*)/, '<span class="param">#{1}</span>'); - RSpec.makeParamEditors(); - if (e) Event.stop(e); - }); - - var ac = new Autocompleter.Local(input, autoComplete, RSpec.stockSteps(), {}); - input.focus(); - }); - }) - }, - - setUpTogglers: function() { - $$('dt').each(function(dt) { - var dd = dt.parentNode.getElementsByTagName('dd')[0]; - dt.onclick = function(){ - dd.toggle(); - } - }); - } -}; - -var StoryDom = { - narrativeText: function(s) { - return s.split(/\n/m).map(function(line){ - if(line == "" || line.match(/^\s+$/) ) { - return null; - } else { - return " " + (line.gsub(/^\s+/, '').gsub(/<br \/>/, "\n").gsub(/<br>/, "\n")); - } - }).compact().join(""); - }, - - stepText: function(s) { - return s.gsub(/<span[^>]*>([^<]*)<\/span>/, "#{1}"); - }, - - scenario: function(dl) { - var scenario = ' Scenario: ' + dl.getElementsByTagName('dt')[0].innerHTML + '\n'; - scenario += $A(dl.getElementsByTagName('li')).map(function(li){ - return ' ' + StoryDom.stepText(li.innerHTML); - }).join("\n") + "\n"; - return scenario; - }, - - story: function() { - var dl = $$('dl.story')[0]; - var story = 'Story: ' + dl.getElementsByTagName('dt')[0].innerHTML + '\n\n'; - story += this.narrativeText(dl.getElementsByTagName('p')[0].innerHTML) + '\n'; - story += $A(dl.getElementsByTagName('dl')).map(function(scenarioDl){ - return StoryDom.scenario(scenarioDl); - }).join("\n"); - return story; - }, - - save: function() { - new Ajax.Request('stories', { - postBody: this.story() - }); - } -}; - -Event.observe(window, 'load', function() { - RSpec.applyUi(); -}); diff --git a/vendor/plugins/rspec/story_server/prototype/javascripts/scriptaculous.js b/vendor/plugins/rspec/story_server/prototype/javascripts/scriptaculous.js deleted file mode 100644 index 4eb84b6b0..000000000 --- a/vendor/plugins/rspec/story_server/prototype/javascripts/scriptaculous.js +++ /dev/null @@ -1,58 +0,0 @@ -// script.aculo.us scriptaculous.js v1.8.0_pre1, Fri Oct 12 21:34:51 +0200 2007 - -// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) -// -// Permission is hereby granted, free of charge, to any person obtaining -// a copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to -// permit persons to whom the Software is furnished to do so, subject to -// the following conditions: -// -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// -// For details, see the script.aculo.us web site: http://script.aculo.us/ - -var Scriptaculous = { - Version: '1.8.0_pre1', - require: function(libraryName) { - // inserting via DOM fails in Safari 2.0, so brute force approach - document.write('<script type="text/javascript" src="'+libraryName+'"></script>'); - }, - REQUIRED_PROTOTYPE: '1.6.0', - load: function() { - function convertVersionString(versionString){ - var r = versionString.split('.'); - return parseInt(r[0])*100000 + parseInt(r[1])*1000 + parseInt(r[2]); - } - - if((typeof Prototype=='undefined') || - (typeof Element == 'undefined') || - (typeof Element.Methods=='undefined') || - (convertVersionString(Prototype.Version) < - convertVersionString(Scriptaculous.REQUIRED_PROTOTYPE))) - throw("script.aculo.us requires the Prototype JavaScript framework >= " + - Scriptaculous.REQUIRED_PROTOTYPE); - - $A(document.getElementsByTagName("script")).findAll( function(s) { - return (s.src && s.src.match(/scriptaculous\.js(\?.*)?$/)) - }).each( function(s) { - var path = s.src.replace(/scriptaculous\.js(\?.*)?$/,''); - var includes = s.src.match(/\?.*load=([a-z,]*)/); - (includes ? includes[1] : 'builder,effects,dragdrop,controls,slider,sound').split(',').each( - function(include) { Scriptaculous.require(path+include+'.js') }); - }); - } -} - -Scriptaculous.load();
\ No newline at end of file diff --git a/vendor/plugins/rspec/story_server/prototype/javascripts/slider.js b/vendor/plugins/rspec/story_server/prototype/javascripts/slider.js deleted file mode 100644 index 46c667370..000000000 --- a/vendor/plugins/rspec/story_server/prototype/javascripts/slider.js +++ /dev/null @@ -1,276 +0,0 @@ -// script.aculo.us slider.js v1.8.0_pre1, Fri Oct 12 21:34:51 +0200 2007 - -// Copyright (c) 2005-2007 Marty Haught, Thomas Fuchs -// -// script.aculo.us is freely distributable under the terms of an MIT-style license. -// For details, see the script.aculo.us web site: http://script.aculo.us/ - -if (!Control) var Control = { }; -Control.Slider = Class.create(); - -// options: -// axis: 'vertical', or 'horizontal' (default) -// -// callbacks: -// onChange(value) -// onSlide(value) -Control.Slider.prototype = { - initialize: function(handle, track, options) { - var slider = this; - - if (Object.isArray(handle)) { - this.handles = handle.collect( function(e) { return $(e) }); - } else { - this.handles = [$(handle)]; - } - - this.track = $(track); - this.options = options || { }; - - this.axis = this.options.axis || 'horizontal'; - this.increment = this.options.increment || 1; - this.step = parseInt(this.options.step || '1'); - this.range = this.options.range || $R(0,1); - - this.value = 0; // assure backwards compat - this.values = this.handles.map( function() { return 0 }); - this.spans = this.options.spans ? this.options.spans.map(function(s){ return $(s) }) : false; - this.options.startSpan = $(this.options.startSpan || null); - this.options.endSpan = $(this.options.endSpan || null); - - this.restricted = this.options.restricted || false; - - this.maximum = this.options.maximum || this.range.end; - this.minimum = this.options.minimum || this.range.start; - - // Will be used to align the handle onto the track, if necessary - this.alignX = parseInt(this.options.alignX || '0'); - this.alignY = parseInt(this.options.alignY || '0'); - - this.trackLength = this.maximumOffset() - this.minimumOffset(); - - this.handleLength = this.isVertical() ? - (this.handles[0].offsetHeight != 0 ? - this.handles[0].offsetHeight : this.handles[0].style.height.replace(/px$/,"")) : - (this.handles[0].offsetWidth != 0 ? this.handles[0].offsetWidth : - this.handles[0].style.width.replace(/px$/,"")); - - this.active = false; - this.dragging = false; - this.disabled = false; - - if (this.options.disabled) this.setDisabled(); - - // Allowed values array - this.allowedValues = this.options.values ? this.options.values.sortBy(Prototype.K) : false; - if (this.allowedValues) { - this.minimum = this.allowedValues.min(); - this.maximum = this.allowedValues.max(); - } - - this.eventMouseDown = this.startDrag.bindAsEventListener(this); - this.eventMouseUp = this.endDrag.bindAsEventListener(this); - this.eventMouseMove = this.update.bindAsEventListener(this); - - // Initialize handles in reverse (make sure first handle is active) - this.handles.each( function(h,i) { - i = slider.handles.length-1-i; - slider.setValue(parseFloat( - (Object.isArray(slider.options.sliderValue) ? - slider.options.sliderValue[i] : slider.options.sliderValue) || - slider.range.start), i); - h.makePositioned().observe("mousedown", slider.eventMouseDown); - }); - - this.track.observe("mousedown", this.eventMouseDown); - document.observe("mouseup", this.eventMouseUp); - document.observe("mousemove", this.eventMouseMove); - - this.initialized = true; - }, - dispose: function() { - var slider = this; - Event.stopObserving(this.track, "mousedown", this.eventMouseDown); - Event.stopObserving(document, "mouseup", this.eventMouseUp); - Event.stopObserving(document, "mousemove", this.eventMouseMove); - this.handles.each( function(h) { - Event.stopObserving(h, "mousedown", slider.eventMouseDown); - }); - }, - setDisabled: function(){ - this.disabled = true; - }, - setEnabled: function(){ - this.disabled = false; - }, - getNearestValue: function(value){ - if (this.allowedValues){ - if (value >= this.allowedValues.max()) return(this.allowedValues.max()); - if (value <= this.allowedValues.min()) return(this.allowedValues.min()); - - var offset = Math.abs(this.allowedValues[0] - value); - var newValue = this.allowedValues[0]; - this.allowedValues.each( function(v) { - var currentOffset = Math.abs(v - value); - if (currentOffset <= offset){ - newValue = v; - offset = currentOffset; - } - }); - return newValue; - } - if (value > this.range.end) return this.range.end; - if (value < this.range.start) return this.range.start; - return value; - }, - setValue: function(sliderValue, handleIdx){ - if (!this.active) { - this.activeHandleIdx = handleIdx || 0; - this.activeHandle = this.handles[this.activeHandleIdx]; - this.updateStyles(); - } - handleIdx = handleIdx || this.activeHandleIdx || 0; - if (this.initialized && this.restricted) { - if ((handleIdx>0) && (sliderValue<this.values[handleIdx-1])) - sliderValue = this.values[handleIdx-1]; - if ((handleIdx < (this.handles.length-1)) && (sliderValue>this.values[handleIdx+1])) - sliderValue = this.values[handleIdx+1]; - } - sliderValue = this.getNearestValue(sliderValue); - this.values[handleIdx] = sliderValue; - this.value = this.values[0]; // assure backwards compat - - this.handles[handleIdx].style[this.isVertical() ? 'top' : 'left'] = - this.translateToPx(sliderValue); - - this.drawSpans(); - if (!this.dragging || !this.event) this.updateFinished(); - }, - setValueBy: function(delta, handleIdx) { - this.setValue(this.values[handleIdx || this.activeHandleIdx || 0] + delta, - handleIdx || this.activeHandleIdx || 0); - }, - translateToPx: function(value) { - return Math.round( - ((this.trackLength-this.handleLength)/(this.range.end-this.range.start)) * - (value - this.range.start)) + "px"; - }, - translateToValue: function(offset) { - return ((offset/(this.trackLength-this.handleLength) * - (this.range.end-this.range.start)) + this.range.start); - }, - getRange: function(range) { - var v = this.values.sortBy(Prototype.K); - range = range || 0; - return $R(v[range],v[range+1]); - }, - minimumOffset: function(){ - return(this.isVertical() ? this.alignY : this.alignX); - }, - maximumOffset: function(){ - return(this.isVertical() ? - (this.track.offsetHeight != 0 ? this.track.offsetHeight : - this.track.style.height.replace(/px$/,"")) - this.alignY : - (this.track.offsetWidth != 0 ? this.track.offsetWidth : - this.track.style.width.replace(/px$/,"")) - this.alignY); - }, - isVertical: function(){ - return (this.axis == 'vertical'); - }, - drawSpans: function() { - var slider = this; - if (this.spans) - $R(0, this.spans.length-1).each(function(r) { slider.setSpan(slider.spans[r], slider.getRange(r)) }); - if (this.options.startSpan) - this.setSpan(this.options.startSpan, - $R(0, this.values.length>1 ? this.getRange(0).min() : this.value )); - if (this.options.endSpan) - this.setSpan(this.options.endSpan, - $R(this.values.length>1 ? this.getRange(this.spans.length-1).max() : this.value, this.maximum)); - }, - setSpan: function(span, range) { - if (this.isVertical()) { - span.style.top = this.translateToPx(range.start); - span.style.height = this.translateToPx(range.end - range.start + this.range.start); - } else { - span.style.left = this.translateToPx(range.start); - span.style.width = this.translateToPx(range.end - range.start + this.range.start); - } - }, - updateStyles: function() { - this.handles.each( function(h){ Element.removeClassName(h, 'selected') }); - Element.addClassName(this.activeHandle, 'selected'); - }, - startDrag: function(event) { - if (Event.isLeftClick(event)) { - if (!this.disabled){ - this.active = true; - - var handle = Event.element(event); - var pointer = [Event.pointerX(event), Event.pointerY(event)]; - var track = handle; - if (track==this.track) { - var offsets = Position.cumulativeOffset(this.track); - this.event = event; - this.setValue(this.translateToValue( - (this.isVertical() ? pointer[1]-offsets[1] : pointer[0]-offsets[0])-(this.handleLength/2) - )); - var offsets = Position.cumulativeOffset(this.activeHandle); - this.offsetX = (pointer[0] - offsets[0]); - this.offsetY = (pointer[1] - offsets[1]); - } else { - // find the handle (prevents issues with Safari) - while((this.handles.indexOf(handle) == -1) && handle.parentNode) - handle = handle.parentNode; - - if (this.handles.indexOf(handle)!=-1) { - this.activeHandle = handle; - this.activeHandleIdx = this.handles.indexOf(this.activeHandle); - this.updateStyles(); - - var offsets = Position.cumulativeOffset(this.activeHandle); - this.offsetX = (pointer[0] - offsets[0]); - this.offsetY = (pointer[1] - offsets[1]); - } - } - } - Event.stop(event); - } - }, - update: function(event) { - if (this.active) { - if (!this.dragging) this.dragging = true; - this.draw(event); - if (Prototype.Browser.WebKit) window.scrollBy(0,0); - Event.stop(event); - } - }, - draw: function(event) { - var pointer = [Event.pointerX(event), Event.pointerY(event)]; - var offsets = Position.cumulativeOffset(this.track); - pointer[0] -= this.offsetX + offsets[0]; - pointer[1] -= this.offsetY + offsets[1]; - this.event = event; - this.setValue(this.translateToValue( this.isVertical() ? pointer[1] : pointer[0] )); - if (this.initialized && this.options.onSlide) - this.options.onSlide(this.values.length>1 ? this.values : this.value, this); - }, - endDrag: function(event) { - if (this.active && this.dragging) { - this.finishDrag(event, true); - Event.stop(event); - } - this.active = false; - this.dragging = false; - }, - finishDrag: function(event, success) { - this.active = false; - this.dragging = false; - this.updateFinished(); - }, - updateFinished: function() { - if (this.initialized && this.options.onChange) - this.options.onChange(this.values.length>1 ? this.values : this.value, this); - this.event = null; - } -}
\ No newline at end of file diff --git a/vendor/plugins/rspec/story_server/prototype/javascripts/sound.js b/vendor/plugins/rspec/story_server/prototype/javascripts/sound.js deleted file mode 100644 index 1277b63a1..000000000 --- a/vendor/plugins/rspec/story_server/prototype/javascripts/sound.js +++ /dev/null @@ -1,55 +0,0 @@ -// script.aculo.us sound.js v1.8.0_pre1, Fri Oct 12 21:34:51 +0200 2007 - -// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) -// -// Based on code created by Jules Gravinese (http://www.webveteran.com/) -// -// script.aculo.us is freely distributable under the terms of an MIT-style license. -// For details, see the script.aculo.us web site: http://script.aculo.us/ - -Sound = { - tracks: {}, - _enabled: true, - template: - new Template('<embed style="height:0" id="sound_#{track}_#{id}" src="#{url}" loop="false" autostart="true" hidden="true"/>'), - enable: function(){ - Sound._enabled = true; - }, - disable: function(){ - Sound._enabled = false; - }, - play: function(url){ - if(!Sound._enabled) return; - var options = Object.extend({ - track: 'global', url: url, replace: false - }, arguments[1] || {}); - - if(options.replace && this.tracks[options.track]) { - $R(0, this.tracks[options.track].id).each(function(id){ - var sound = $('sound_'+options.track+'_'+id); - sound.Stop && sound.Stop(); - sound.remove(); - }) - this.tracks[options.track] = null; - } - - if(!this.tracks[options.track]) - this.tracks[options.track] = { id: 0 } - else - this.tracks[options.track].id++; - - options.id = this.tracks[options.track].id; - $$('body')[0].insert( - Prototype.Browser.IE ? new Element('bgsound',{ - id: 'sound_'+options.track+'_'+options.id, - src: options.url, loop: 1, autostart: true - }) : Sound.template.evaluate(options)); - } -}; - -if(Prototype.Browser.Gecko && navigator.userAgent.indexOf("Win") > 0){ - if(navigator.plugins && $A(navigator.plugins).detect(function(p){ return p.name.indexOf('QuickTime') != -1 })) - Sound.template = new Template('<object id="sound_#{track}_#{id}" width="0" height="0" type="audio/mpeg" data="#{url}"/>') - else - Sound.play = function(){} -} diff --git a/vendor/plugins/rspec/story_server/prototype/javascripts/unittest.js b/vendor/plugins/rspec/story_server/prototype/javascripts/unittest.js deleted file mode 100644 index b5e9005eb..000000000 --- a/vendor/plugins/rspec/story_server/prototype/javascripts/unittest.js +++ /dev/null @@ -1,568 +0,0 @@ -// script.aculo.us unittest.js v1.8.0_pre1, Fri Oct 12 21:34:51 +0200 2007 - -// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) -// (c) 2005-2007 Jon Tirsen (http://www.tirsen.com) -// (c) 2005-2007 Michael Schuerig (http://www.schuerig.de/michael/) -// -// script.aculo.us is freely distributable under the terms of an MIT-style license. -// For details, see the script.aculo.us web site: http://script.aculo.us/ - -// experimental, Firefox-only -Event.simulateMouse = function(element, eventName) { - var options = Object.extend({ - pointerX: 0, - pointerY: 0, - buttons: 0, - ctrlKey: false, - altKey: false, - shiftKey: false, - metaKey: false - }, arguments[2] || {}); - var oEvent = document.createEvent("MouseEvents"); - oEvent.initMouseEvent(eventName, true, true, document.defaultView, - options.buttons, options.pointerX, options.pointerY, options.pointerX, options.pointerY, - options.ctrlKey, options.altKey, options.shiftKey, options.metaKey, 0, $(element)); - - if(this.mark) Element.remove(this.mark); - this.mark = document.createElement('div'); - this.mark.appendChild(document.createTextNode(" ")); - document.body.appendChild(this.mark); - this.mark.style.position = 'absolute'; - this.mark.style.top = options.pointerY + "px"; - this.mark.style.left = options.pointerX + "px"; - this.mark.style.width = "5px"; - this.mark.style.height = "5px;"; - this.mark.style.borderTop = "1px solid red;" - this.mark.style.borderLeft = "1px solid red;" - - if(this.step) - alert('['+new Date().getTime().toString()+'] '+eventName+'/'+Test.Unit.inspect(options)); - - $(element).dispatchEvent(oEvent); -}; - -// Note: Due to a fix in Firefox 1.0.5/6 that probably fixed "too much", this doesn't work in 1.0.6 or DP2. -// You need to downgrade to 1.0.4 for now to get this working -// See https://bugzilla.mozilla.org/show_bug.cgi?id=289940 for the fix that fixed too much -Event.simulateKey = function(element, eventName) { - var options = Object.extend({ - ctrlKey: false, - altKey: false, - shiftKey: false, - metaKey: false, - keyCode: 0, - charCode: 0 - }, arguments[2] || {}); - - var oEvent = document.createEvent("KeyEvents"); - oEvent.initKeyEvent(eventName, true, true, window, - options.ctrlKey, options.altKey, options.shiftKey, options.metaKey, - options.keyCode, options.charCode ); - $(element).dispatchEvent(oEvent); -}; - -Event.simulateKeys = function(element, command) { - for(var i=0; i<command.length; i++) { - Event.simulateKey(element,'keypress',{charCode:command.charCodeAt(i)}); - } -}; - -var Test = {} -Test.Unit = {}; - -// security exception workaround -Test.Unit.inspect = Object.inspect; - -Test.Unit.Logger = Class.create(); -Test.Unit.Logger.prototype = { - initialize: function(log) { - this.log = $(log); - if (this.log) { - this._createLogTable(); - } - }, - start: function(testName) { - if (!this.log) return; - this.testName = testName; - this.lastLogLine = document.createElement('tr'); - this.statusCell = document.createElement('td'); - this.nameCell = document.createElement('td'); - this.nameCell.className = "nameCell"; - this.nameCell.appendChild(document.createTextNode(testName)); - this.messageCell = document.createElement('td'); - this.lastLogLine.appendChild(this.statusCell); - this.lastLogLine.appendChild(this.nameCell); - this.lastLogLine.appendChild(this.messageCell); - this.loglines.appendChild(this.lastLogLine); - }, - finish: function(status, summary) { - if (!this.log) return; - this.lastLogLine.className = status; - this.statusCell.innerHTML = status; - this.messageCell.innerHTML = this._toHTML(summary); - this.addLinksToResults(); - }, - message: function(message) { - if (!this.log) return; - this.messageCell.innerHTML = this._toHTML(message); - }, - summary: function(summary) { - if (!this.log) return; - this.logsummary.innerHTML = this._toHTML(summary); - }, - _createLogTable: function() { - this.log.innerHTML = - '<div id="logsummary"></div>' + - '<table id="logtable">' + - '<thead><tr><th>Status</th><th>Test</th><th>Message</th></tr></thead>' + - '<tbody id="loglines"></tbody>' + - '</table>'; - this.logsummary = $('logsummary') - this.loglines = $('loglines'); - }, - _toHTML: function(txt) { - return txt.escapeHTML().replace(/\n/g,"<br/>"); - }, - addLinksToResults: function(){ - $$("tr.failed .nameCell").each( function(td){ // todo: limit to children of this.log - td.title = "Run only this test" - Event.observe(td, 'click', function(){ window.location.search = "?tests=" + td.innerHTML;}); - }); - $$("tr.passed .nameCell").each( function(td){ // todo: limit to children of this.log - td.title = "Run all tests" - Event.observe(td, 'click', function(){ window.location.search = "";}); - }); - } -} - -Test.Unit.Runner = Class.create(); -Test.Unit.Runner.prototype = { - initialize: function(testcases) { - this.options = Object.extend({ - testLog: 'testlog' - }, arguments[1] || {}); - this.options.resultsURL = this.parseResultsURLQueryParameter(); - this.options.tests = this.parseTestsQueryParameter(); - if (this.options.testLog) { - this.options.testLog = $(this.options.testLog) || null; - } - if(this.options.tests) { - this.tests = []; - for(var i = 0; i < this.options.tests.length; i++) { - if(/^test/.test(this.options.tests[i])) { - this.tests.push(new Test.Unit.Testcase(this.options.tests[i], testcases[this.options.tests[i]], testcases["setup"], testcases["teardown"])); - } - } - } else { - if (this.options.test) { - this.tests = [new Test.Unit.Testcase(this.options.test, testcases[this.options.test], testcases["setup"], testcases["teardown"])]; - } else { - this.tests = []; - for(var testcase in testcases) { - if(/^test/.test(testcase)) { - this.tests.push( - new Test.Unit.Testcase( - this.options.context ? ' -> ' + this.options.titles[testcase] : testcase, - testcases[testcase], testcases["setup"], testcases["teardown"] - )); - } - } - } - } - this.currentTest = 0; - this.logger = new Test.Unit.Logger(this.options.testLog); - setTimeout(this.runTests.bind(this), 1000); - }, - parseResultsURLQueryParameter: function() { - return window.location.search.parseQuery()["resultsURL"]; - }, - parseTestsQueryParameter: function(){ - if (window.location.search.parseQuery()["tests"]){ - return window.location.search.parseQuery()["tests"].split(','); - }; - }, - // Returns: - // "ERROR" if there was an error, - // "FAILURE" if there was a failure, or - // "SUCCESS" if there was neither - getResult: function() { - var hasFailure = false; - for(var i=0;i<this.tests.length;i++) { - if (this.tests[i].errors > 0) { - return "ERROR"; - } - if (this.tests[i].failures > 0) { - hasFailure = true; - } - } - if (hasFailure) { - return "FAILURE"; - } else { - return "SUCCESS"; - } - }, - postResults: function() { - if (this.options.resultsURL) { - new Ajax.Request(this.options.resultsURL, - { method: 'get', parameters: 'result=' + this.getResult(), asynchronous: false }); - } - }, - runTests: function() { - var test = this.tests[this.currentTest]; - if (!test) { - // finished! - this.postResults(); - this.logger.summary(this.summary()); - return; - } - if(!test.isWaiting) { - this.logger.start(test.name); - } - test.run(); - if(test.isWaiting) { - this.logger.message("Waiting for " + test.timeToWait + "ms"); - setTimeout(this.runTests.bind(this), test.timeToWait || 1000); - } else { - this.logger.finish(test.status(), test.summary()); - this.currentTest++; - // tail recursive, hopefully the browser will skip the stackframe - this.runTests(); - } - }, - summary: function() { - var assertions = 0; - var failures = 0; - var errors = 0; - var messages = []; - for(var i=0;i<this.tests.length;i++) { - assertions += this.tests[i].assertions; - failures += this.tests[i].failures; - errors += this.tests[i].errors; - } - return ( - (this.options.context ? this.options.context + ': ': '') + - this.tests.length + " tests, " + - assertions + " assertions, " + - failures + " failures, " + - errors + " errors"); - } -} - -Test.Unit.Assertions = Class.create(); -Test.Unit.Assertions.prototype = { - initialize: function() { - this.assertions = 0; - this.failures = 0; - this.errors = 0; - this.messages = []; - }, - summary: function() { - return ( - this.assertions + " assertions, " + - this.failures + " failures, " + - this.errors + " errors" + "\n" + - this.messages.join("\n")); - }, - pass: function() { - this.assertions++; - }, - fail: function(message) { - this.failures++; - this.messages.push("Failure: " + message); - }, - info: function(message) { - this.messages.push("Info: " + message); - }, - error: function(error) { - this.errors++; - this.messages.push(error.name + ": "+ error.message + "(" + Test.Unit.inspect(error) +")"); - }, - status: function() { - if (this.failures > 0) return 'failed'; - if (this.errors > 0) return 'error'; - return 'passed'; - }, - assert: function(expression) { - var message = arguments[1] || 'assert: got "' + Test.Unit.inspect(expression) + '"'; - try { expression ? this.pass() : - this.fail(message); } - catch(e) { this.error(e); } - }, - assertEqual: function(expected, actual) { - var message = arguments[2] || "assertEqual"; - try { (expected == actual) ? this.pass() : - this.fail(message + ': expected "' + Test.Unit.inspect(expected) + - '", actual "' + Test.Unit.inspect(actual) + '"'); } - catch(e) { this.error(e); } - }, - assertInspect: function(expected, actual) { - var message = arguments[2] || "assertInspect"; - try { (expected == actual.inspect()) ? this.pass() : - this.fail(message + ': expected "' + Test.Unit.inspect(expected) + - '", actual "' + Test.Unit.inspect(actual) + '"'); } - catch(e) { this.error(e); } - }, - assertEnumEqual: function(expected, actual) { - var message = arguments[2] || "assertEnumEqual"; - try { $A(expected).length == $A(actual).length && - expected.zip(actual).all(function(pair) { return pair[0] == pair[1] }) ? - this.pass() : this.fail(message + ': expected ' + Test.Unit.inspect(expected) + - ', actual ' + Test.Unit.inspect(actual)); } - catch(e) { this.error(e); } - }, - assertNotEqual: function(expected, actual) { - var message = arguments[2] || "assertNotEqual"; - try { (expected != actual) ? this.pass() : - this.fail(message + ': got "' + Test.Unit.inspect(actual) + '"'); } - catch(e) { this.error(e); } - }, - assertIdentical: function(expected, actual) { - var message = arguments[2] || "assertIdentical"; - try { (expected === actual) ? this.pass() : - this.fail(message + ': expected "' + Test.Unit.inspect(expected) + - '", actual "' + Test.Unit.inspect(actual) + '"'); } - catch(e) { this.error(e); } - }, - assertNotIdentical: function(expected, actual) { - var message = arguments[2] || "assertNotIdentical"; - try { !(expected === actual) ? this.pass() : - this.fail(message + ': expected "' + Test.Unit.inspect(expected) + - '", actual "' + Test.Unit.inspect(actual) + '"'); } - catch(e) { this.error(e); } - }, - assertNull: function(obj) { - var message = arguments[1] || 'assertNull' - try { (obj==null) ? this.pass() : - this.fail(message + ': got "' + Test.Unit.inspect(obj) + '"'); } - catch(e) { this.error(e); } - }, - assertMatch: function(expected, actual) { - var message = arguments[2] || 'assertMatch'; - var regex = new RegExp(expected); - try { (regex.exec(actual)) ? this.pass() : - this.fail(message + ' : regex: "' + Test.Unit.inspect(expected) + ' did not match: ' + Test.Unit.inspect(actual) + '"'); } - catch(e) { this.error(e); } - }, - assertHidden: function(element) { - var message = arguments[1] || 'assertHidden'; - this.assertEqual("none", element.style.display, message); - }, - assertNotNull: function(object) { - var message = arguments[1] || 'assertNotNull'; - this.assert(object != null, message); - }, - assertType: function(expected, actual) { - var message = arguments[2] || 'assertType'; - try { - (actual.constructor == expected) ? this.pass() : - this.fail(message + ': expected "' + Test.Unit.inspect(expected) + - '", actual "' + (actual.constructor) + '"'); } - catch(e) { this.error(e); } - }, - assertNotOfType: function(expected, actual) { - var message = arguments[2] || 'assertNotOfType'; - try { - (actual.constructor != expected) ? this.pass() : - this.fail(message + ': expected "' + Test.Unit.inspect(expected) + - '", actual "' + (actual.constructor) + '"'); } - catch(e) { this.error(e); } - }, - assertInstanceOf: function(expected, actual) { - var message = arguments[2] || 'assertInstanceOf'; - try { - (actual instanceof expected) ? this.pass() : - this.fail(message + ": object was not an instance of the expected type"); } - catch(e) { this.error(e); } - }, - assertNotInstanceOf: function(expected, actual) { - var message = arguments[2] || 'assertNotInstanceOf'; - try { - !(actual instanceof expected) ? this.pass() : - this.fail(message + ": object was an instance of the not expected type"); } - catch(e) { this.error(e); } - }, - assertRespondsTo: function(method, obj) { - var message = arguments[2] || 'assertRespondsTo'; - try { - (obj[method] && typeof obj[method] == 'function') ? this.pass() : - this.fail(message + ": object doesn't respond to [" + method + "]"); } - catch(e) { this.error(e); } - }, - assertReturnsTrue: function(method, obj) { - var message = arguments[2] || 'assertReturnsTrue'; - try { - var m = obj[method]; - if(!m) m = obj['is'+method.charAt(0).toUpperCase()+method.slice(1)]; - m() ? this.pass() : - this.fail(message + ": method returned false"); } - catch(e) { this.error(e); } - }, - assertReturnsFalse: function(method, obj) { - var message = arguments[2] || 'assertReturnsFalse'; - try { - var m = obj[method]; - if(!m) m = obj['is'+method.charAt(0).toUpperCase()+method.slice(1)]; - !m() ? this.pass() : - this.fail(message + ": method returned true"); } - catch(e) { this.error(e); } - }, - assertRaise: function(exceptionName, method) { - var message = arguments[2] || 'assertRaise'; - try { - method(); - this.fail(message + ": exception expected but none was raised"); } - catch(e) { - ((exceptionName == null) || (e.name==exceptionName)) ? this.pass() : this.error(e); - } - }, - assertElementsMatch: function() { - var expressions = $A(arguments), elements = $A(expressions.shift()); - if (elements.length != expressions.length) { - this.fail('assertElementsMatch: size mismatch: ' + elements.length + ' elements, ' + expressions.length + ' expressions'); - return false; - } - elements.zip(expressions).all(function(pair, index) { - var element = $(pair.first()), expression = pair.last(); - if (element.match(expression)) return true; - this.fail('assertElementsMatch: (in index ' + index + ') expected ' + expression.inspect() + ' but got ' + element.inspect()); - }.bind(this)) && this.pass(); - }, - assertElementMatches: function(element, expression) { - this.assertElementsMatch([element], expression); - }, - benchmark: function(operation, iterations) { - var startAt = new Date(); - (iterations || 1).times(operation); - var timeTaken = ((new Date())-startAt); - this.info((arguments[2] || 'Operation') + ' finished ' + - iterations + ' iterations in ' + (timeTaken/1000)+'s' ); - return timeTaken; - }, - _isVisible: function(element) { - element = $(element); - if(!element.parentNode) return true; - this.assertNotNull(element); - if(element.style && Element.getStyle(element, 'display') == 'none') - return false; - - return this._isVisible(element.parentNode); - }, - assertNotVisible: function(element) { - this.assert(!this._isVisible(element), Test.Unit.inspect(element) + " was not hidden and didn't have a hidden parent either. " + ("" || arguments[1])); - }, - assertVisible: function(element) { - this.assert(this._isVisible(element), Test.Unit.inspect(element) + " was not visible. " + ("" || arguments[1])); - }, - benchmark: function(operation, iterations) { - var startAt = new Date(); - (iterations || 1).times(operation); - var timeTaken = ((new Date())-startAt); - this.info((arguments[2] || 'Operation') + ' finished ' + - iterations + ' iterations in ' + (timeTaken/1000)+'s' ); - return timeTaken; - } -} - -Test.Unit.Testcase = Class.create(); -Object.extend(Object.extend(Test.Unit.Testcase.prototype, Test.Unit.Assertions.prototype), { - initialize: function(name, test, setup, teardown) { - Test.Unit.Assertions.prototype.initialize.bind(this)(); - this.name = name; - - if(typeof test == 'string') { - test = test.gsub(/(\.should[^\(]+\()/,'#{0}this,'); - test = test.gsub(/(\.should[^\(]+)\(this,\)/,'#{1}(this)'); - this.test = function() { - eval('with(this){'+test+'}'); - } - } else { - this.test = test || function() {}; - } - - this.setup = setup || function() {}; - this.teardown = teardown || function() {}; - this.isWaiting = false; - this.timeToWait = 1000; - }, - wait: function(time, nextPart) { - this.isWaiting = true; - this.test = nextPart; - this.timeToWait = time; - }, - run: function() { - try { - try { - if (!this.isWaiting) this.setup.bind(this)(); - this.isWaiting = false; - this.test.bind(this)(); - } finally { - if(!this.isWaiting) { - this.teardown.bind(this)(); - } - } - } - catch(e) { this.error(e); } - } -}); - -// *EXPERIMENTAL* BDD-style testing to please non-technical folk -// This draws many ideas from RSpec http://rspec.rubyforge.org/ - -Test.setupBDDExtensionMethods = function(){ - var METHODMAP = { - shouldEqual: 'assertEqual', - shouldNotEqual: 'assertNotEqual', - shouldEqualEnum: 'assertEnumEqual', - shouldBeA: 'assertType', - shouldNotBeA: 'assertNotOfType', - shouldBeAn: 'assertType', - shouldNotBeAn: 'assertNotOfType', - shouldBeNull: 'assertNull', - shouldNotBeNull: 'assertNotNull', - - shouldBe: 'assertReturnsTrue', - shouldNotBe: 'assertReturnsFalse', - shouldRespondTo: 'assertRespondsTo' - }; - var makeAssertion = function(assertion, args, object) { - this[assertion].apply(this,(args || []).concat([object])); - } - - Test.BDDMethods = {}; - $H(METHODMAP).each(function(pair) { - Test.BDDMethods[pair.key] = function() { - var args = $A(arguments); - var scope = args.shift(); - makeAssertion.apply(scope, [pair.value, args, this]); }; - }); - - [Array.prototype, String.prototype, Number.prototype, Boolean.prototype].each( - function(p){ Object.extend(p, Test.BDDMethods) } - ); -} - -Test.context = function(name, spec, log){ - Test.setupBDDExtensionMethods(); - - var compiledSpec = {}; - var titles = {}; - for(specName in spec) { - switch(specName){ - case "setup": - case "teardown": - compiledSpec[specName] = spec[specName]; - break; - default: - var testName = 'test'+specName.gsub(/\s+/,'-').camelize(); - var body = spec[specName].toString().split('\n').slice(1); - if(/^\{/.test(body[0])) body = body.slice(1); - body.pop(); - body = body.map(function(statement){ - return statement.strip() - }); - compiledSpec[testName] = body.join('\n'); - titles[testName] = specName; - } - } - new Test.Unit.Runner(compiledSpec, { titles: titles, testLog: log || 'testlog', context: name }); -};
\ No newline at end of file diff --git a/vendor/plugins/rspec/story_server/prototype/lib/server.rb b/vendor/plugins/rspec/story_server/prototype/lib/server.rb deleted file mode 100644 index b4a58da7b..000000000 --- a/vendor/plugins/rspec/story_server/prototype/lib/server.rb +++ /dev/null @@ -1,24 +0,0 @@ -require 'webrick' - -class DispatchServlet < WEBrick::HTTPServlet::AbstractServlet - def do_POST(request, response) - File.open('story', 'w') do |io| - io.write(request.body) - end - - response.status = 200 - response['Content-Type'] = 'text/html' - response.body = "body" - end -end - -params = { :Port => 4000, - :ServerType => WEBrick::SimpleServer, - :BindAddress => "0.0.0.0", - :MimeTypes => WEBrick::HTTPUtils::DefaultMimeTypes } -server = WEBrick::HTTPServer.new(params) -server.mount('/stories', DispatchServlet) -server.mount('/', WEBrick::HTTPServlet::FileHandler, File.dirname(__FILE__) + '/..', { :FancyIndexing => true }) - -trap("INT") { server.shutdown } -server.start
\ No newline at end of file diff --git a/vendor/plugins/rspec/story_server/prototype/stories.html b/vendor/plugins/rspec/story_server/prototype/stories.html deleted file mode 100644 index 9d27f32b8..000000000 --- a/vendor/plugins/rspec/story_server/prototype/stories.html +++ /dev/null @@ -1,176 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html - PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" - "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> - <head> - <title>Stories</title> - <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> - <meta http-equiv="Expires" content="-1" /> - <meta http-equiv="Pragma" content="no-cache" /> - <script src="javascripts/prototype.js" type="text/javascript"></script> - <script src="javascripts/scriptaculous.js" type="text/javascript"></script> - <script src="javascripts/rspec.js" type="text/javascript"></script> - <script src="javascripts/unittest.js" type="text/javascript"></script> - - <link href="stylesheets/rspec.css" rel="stylesheet" type="text/css" /> - <link href="stylesheets/test.css" rel="stylesheet" type="text/css" /> - </head> - <body> - <!-- - Classes and ids that are only used by the Story UI, which don't have to be present in - the Example report: - - #nav - #stock_steps - dl.story - ul.steps - --> - <div id="nav"> - <a href="#" onclick="javascript:StoryDom.save();">SAVE</a> - </div> - <div id="container"> - <ul id="stock_steps" style="display: none;"> - <li>Given my savings account balance is $balance dollars</li> - <li>Given my cash account balance is $balance dollars</li> - <li>Given my $which account has been blocked for $n days</li> - <li>When I transfer $amount dollars</li> - <li>Then my savings account balance should be $balance dollars</li> - <li>Then my cash account balance should be $balance dollars</li> - </ul> - <dl class="story failed"> - <dt>transfer to cash account</dt> - <dd> - <p> - As a savings account holder<br /> - I want to transfer money from my savings account<br /> - So that I can get cash easily from an ATM<br /> - </p> - <dl class="passed"> - <dt>savings account is in credit</dt> - <dd> - <ul class="steps"> - <li class="passed">Given my savings account balance is <span class="param">100</span> dollars</li> - <li class="passed">Given my cash account balance is <span class="param">10</span> dollars</li> - <li class="passed">When I transfer <span class="param">20</span> dollars</li> - <li class="passed">Then my savings account balance should be <span class="param">80</span> dollars</li> - <li class="passed">Then my cash account balance should be <span class="param">30</span> dollars</li> - </ul> - </dd> - </dl> - - <dl class="failed"> - <dt>savings account is overdrawn</dt> - <dd> - <ul class="steps"> - <li class="passed">Given my savings account balance is <span class="param">-20</span> dollars</li> - <li class="passed">Given my cash account balance is <span class="param">10</span> dollars</li> - <li class="passed">When I transfer <span class="param">20</span> dollars</li> - <li class="failed">Then my savings account balance should be <span class="param">-20</span> dollars</li> - <li class="failed">Then my cash account balance should be <span class="param">10</span> dollars</li> - <li class="pending">Then I should still be poor</li> - </ul> - </dd> - </dl> - </dd> - </dl> - <!-- More stories here... --> - - <!-- Tests follow --> - <div id="testlog"> </div> - <script type="text/javascript" language="javascript" charset="utf-8"> - // <![CDATA[ - Test.context("RSpec editor tests (this won't be in the final editor - it's just self tests)",{ - 'should extract story narrative': function() { - var narrative = StoryDom.narrativeText($$('p')[0].innerHTML); - narrative.shouldEqual( - " As a savings account holder\n" + - " I want to transfer money from my savings account\n" + - " So that I can get cash easily from an ATM\n" - ); - }, - - 'should extract step text with two spans': function() { - var stepText = StoryDom.stepText('Given <span class="param">this</span> and <span class="param">that</span> stuff'); - stepText.shouldEqual("Given this and that stuff"); - }, - - 'should extract scenario': function() { - var scenario = StoryDom.scenario($$('dl')[1]); - scenario.shouldEqual( - " Scenario: savings account is in credit\n" + - " Given my savings account balance is 100 dollars\n" + - " Given my cash account balance is 10 dollars\n" + - " When I transfer 20 dollars\n" + - " Then my savings account balance should be 80 dollars\n" + - " Then my cash account balance should be 30 dollars\n" - ); - }, - - 'should extract story from page': function() { - var story = StoryDom.story(); - story.shouldEqual( - "Story: transfer to cash account\n" + - "\n" + - " As a savings account holder\n" + - " I want to transfer money from my savings account\n" + - " So that I can get cash easily from an ATM\n" + - "\n" + - " Scenario: savings account is in credit\n" + - " Given my savings account balance is 100 dollars\n" + - " Given my cash account balance is 10 dollars\n" + - " When I transfer 20 dollars\n" + - " Then my savings account balance should be 80 dollars\n" + - " Then my cash account balance should be 30 dollars\n" + - "\n" + - " Scenario: savings account is overdrawn\n" + - " Given my savings account balance is -20 dollars\n" + - " Given my cash account balance is 10 dollars\n" + - " When I transfer 20 dollars\n" + - " Then my savings account balance should be -20 dollars\n" + - " Then my cash account balance should be 10 dollars\n" + - " Then I should still be poor\n" - ); - }, - - 'should extract stock steps from dom': function() { - var stockSteps = RSpec.stockSteps(); - stockSteps.shouldEqualEnum([ - 'Given my $which account has been blocked for $n days', - 'Given my cash account balance is $balance dollars', - 'Given my savings account balance is $balance dollars', - 'Then my cash account balance should be $balance dollars', - 'Then my savings account balance should be $balance dollars', - 'When I transfer $amount dollars' - ]); - }, - - 'should add new stock steps unless they already exist': function() { - RSpec.addStockStep('When Godzilla chews over a cable'); - RSpec.stockSteps().shouldEqualEnum([ - 'Given my $which account has been blocked for $n days', - 'Given my cash account balance is $balance dollars', - 'Given my savings account balance is $balance dollars', - 'Then my cash account balance should be $balance dollars', - 'Then my savings account balance should be $balance dollars', - 'When Godzilla chews over a cable', - 'When I transfer $amount dollars' - ]); - RSpec.addStockStep('When Godzilla chews over a cable'); - RSpec.stockSteps().shouldEqualEnum([ - 'Given my $which account has been blocked for $n days', - 'Given my cash account balance is $balance dollars', - 'Given my savings account balance is $balance dollars', - 'Then my cash account balance should be $balance dollars', - 'Then my savings account balance should be $balance dollars', - 'When Godzilla chews over a cable', - 'When I transfer $amount dollars' - ]); - } - }); - // ]]> - </script> - - </div> - </body> -</html> diff --git a/vendor/plugins/rspec/story_server/prototype/stylesheets/rspec.css b/vendor/plugins/rspec/story_server/prototype/stylesheets/rspec.css deleted file mode 100644 index 90f4b9be6..000000000 --- a/vendor/plugins/rspec/story_server/prototype/stylesheets/rspec.css +++ /dev/null @@ -1,136 +0,0 @@ -body { - background: #fff; - font-size: 80%; - margin:0pt; - padding:0pt; -} - -#nav { - border-bottom:1px solid #222222; - border-top-style:solid; - border-top-width:0.5em; - font-family:Helvetica,Arial,sans-serif; - font-size:1.1em; - padding:0.2em 0pt; - position:fixed; - text-align:center; - width:100%; - z-index:50; - - background-color: #000000; - opacity: 0.6; -} - -#container { - background:white none repeat scroll 0%; - font-family:Helvetica,Arial,sans-serif; - margin:0pt auto; - position:relative; - text-align:left; - top:4.0em; - width:78em; -} - -dl { - font: normal 11px "Lucida Grande", Helvetica, sans-serif; -} - -dt { - color: #fff; -} - -dl.passed { - border-left: 5px solid #65C400; -} - -dl.failed { - border-left: 5px solid #C20000; -} - -dt { - padding: 3px; - font-weight: bold; -} - -dd { - margin: 0px 0px 0px 0px; -} - -dd p { - padding: 5px; - margin-top: 0; - margin-bottom: 5px; -} - -dd > dl { - margin-left: 5px; -} - -dl.passed > dt { - background: #65C400; -} - -dl.failed > dt { - background: #C20000; -} - -dl.passed > dd > p, li.passed { - background: #DBFFB4; color: #3D7700; - border-bottom: 1px solid #65C400; -} - -dl.failed > dd > p, li.failed { - color: #C20000; background: #FFFBD3; - border-bottom: 1px solid #C20000; -} - -dl.pending > dd > p, li.pending { - color: #131313; background: #FCFB98; - border-bottom: 1px solid #FAF834; -} - -dl.new > dd > p, li.new { - color: #444444; background: #DDDDDD; - border-bottom: 1px solid #444444; -} - -dl > dd > p.wastebin { - background-color: black; -} - -span.param, span.param_editor { - font-weight: bold; -} - -input { - width: 100%; -} - -ul.steps { - padding: 0px; - list-style: none; -} - -ul.steps > li { - margin: 5px 0px 5px 5px; - padding: 3px 3px 3px 5px; -} - -div.auto_complete ul { - list-style-type: none; - border: 2px solid #F0F0F0; - margin: 0px; - padding: 0px; -} - -div.auto_complete ul li { - background-color: white; - list-style-type: none; - display: block; - margin: 0; - padding: 2px; -} - -div.auto_complete ul li.selected { - color: #444444; background: #DDDDDD; -} diff --git a/vendor/plugins/rspec/story_server/prototype/stylesheets/test.css b/vendor/plugins/rspec/story_server/prototype/stylesheets/test.css deleted file mode 100644 index 8c738a396..000000000 --- a/vendor/plugins/rspec/story_server/prototype/stylesheets/test.css +++ /dev/null @@ -1,90 +0,0 @@ -body, div, p, h1, h2, h3, ul, ol, span, a, table, td, form, img, li { - font-family: sans-serif; -} - -body { - font-size:0.8em; -} - -.navigation { - background: #9DC569; - color: #fff; -} - -.navigation h1 { - font-size: 20px; -} - -.navigation h2 { - font-size: 16px; - font-weight: normal; - margin: 0; - border: 1px solid #e8a400; - border-bottom: 0; - background: #ffc; - color: #E8A400; - padding: 8px; - padding-bottom: 0; -} - -.navigation ul { - margin-top: 0; - border: 1px solid #E8A400; - border-top: none; - background: #ffc; - padding: 8px; - margin-left: 0; -} - -.navigation ul li { - font-size: 12px; - list-style-type: none; - margin-top: 1px; - margin-bottom: 1px; - color: #555; -} - -.navigation a { - color: #ffc; -} - -.navigation ul li a { - color: #000; -} - -#log { - padding-bottom: 1em; - border-bottom: 2px solid #000; - margin-bottom: 2em; -} - -#logsummary { - margin-bottom: 1em; - padding: 1ex; - border: 1px solid #000; - font-weight: bold; -} - -#logtable { - width:100%; - border-collapse: collapse; - border: 1px dotted #666; -} - -#logtable td, #logtable th { - text-align: left; - padding: 3px 8px; - border: 1px dotted #666; -} - -#logtable .passed { - background-color: #cfc; -} - -#logtable .failed, #logtable .error { - background-color: #fcc; -} - -#logtable .nameCell { - cursor: pointer; -}
\ No newline at end of file |