require 'spec/runner/options'
require 'spec/runner/option_parser'
require 'spec/runner/example_group_runner'
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/class_and_arguments_parser'
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 before :each block will run before each of the examples, once for each example. Likewise,
# the after :each block will run after each of the examples.
#
# It is also possible to specify a before :all and after :all
# block that will run only once for each behaviour, respectively before the first before :each
# and after the last after :each
. 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
def self.configuration # :nodoc:
@configuration ||= Spec::Example::Configuration.new
end
# Use this to configure various configurable aspects of
# RSpec:
#
# Spec::Runner.configure do |configuration|
# # Configure RSpec here
# end
#
# The yielded configuration object is a
# Spec::Example::Configuration instance. See its RDoc
# for details about what you can do with it.
#
def self.configure
yield configuration
end
def self.register_at_exit_hook # :nodoc:
unless @already_registered_at_exit_hook
at_exit do
unless $! || Spec.run? || Spec::Example::ExampleGroupFactory.registered_or_ancestor_of_registered?(options.example_groups)
success = Spec.run
exit success if Spec.exit?
end
end
@already_registered_at_exit_hook = true
end
end
def self.options # :nodoc:
@options ||= begin
parser = ::Spec::Runner::OptionParser.new($stderr, $stdout)
parser.order!(ARGV)
parser.options
end
end
def self.use options
@options = options
end
end
end