diff --git a/spec/Rakefile b/spec/Rakefile new file mode 100644 index 000000000..5d0b7cc07 --- /dev/null +++ b/spec/Rakefile @@ -0,0 +1,9 @@ +require File.join(File.dirname(__FILE__), "spec_helper.rb") +require 'rake' +require 'spec/rake/spectask' + +desc "Run all spec unit tests" +Spec::Rake::SpecTask.new('unit') do |t| + t.spec_files = FileList['unit/**/*.rb'] +end + diff --git a/spec/bin/spec b/spec/bin/spec new file mode 100755 index 000000000..a7e6ce0cb --- /dev/null +++ b/spec/bin/spec @@ -0,0 +1,3 @@ +$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__) + "/../lib")) +require 'spec' +::Spec::Runner::CommandLine.run(ARGV, STDERR, STDOUT, true, true) diff --git a/test/lib/spec.rb b/spec/lib/spec.rb similarity index 100% rename from test/lib/spec.rb rename to spec/lib/spec.rb diff --git a/test/lib/spec/dsl.rb b/spec/lib/spec/dsl.rb similarity index 100% rename from test/lib/spec/dsl.rb rename to spec/lib/spec/dsl.rb diff --git a/test/lib/spec/dsl/behaviour.rb b/spec/lib/spec/dsl/behaviour.rb similarity index 100% rename from test/lib/spec/dsl/behaviour.rb rename to spec/lib/spec/dsl/behaviour.rb diff --git a/test/lib/spec/dsl/behaviour_callbacks.rb b/spec/lib/spec/dsl/behaviour_callbacks.rb similarity index 100% rename from test/lib/spec/dsl/behaviour_callbacks.rb rename to spec/lib/spec/dsl/behaviour_callbacks.rb diff --git a/test/lib/spec/dsl/behaviour_eval.rb b/spec/lib/spec/dsl/behaviour_eval.rb similarity index 100% rename from test/lib/spec/dsl/behaviour_eval.rb rename to spec/lib/spec/dsl/behaviour_eval.rb diff --git a/test/lib/spec/dsl/behaviour_factory.rb b/spec/lib/spec/dsl/behaviour_factory.rb similarity index 100% rename from test/lib/spec/dsl/behaviour_factory.rb rename to spec/lib/spec/dsl/behaviour_factory.rb diff --git a/test/lib/spec/dsl/composite_proc_builder.rb b/spec/lib/spec/dsl/composite_proc_builder.rb similarity index 100% rename from test/lib/spec/dsl/composite_proc_builder.rb rename to spec/lib/spec/dsl/composite_proc_builder.rb diff --git a/test/lib/spec/dsl/configuration.rb b/spec/lib/spec/dsl/configuration.rb similarity index 100% rename from test/lib/spec/dsl/configuration.rb rename to spec/lib/spec/dsl/configuration.rb diff --git a/test/lib/spec/dsl/description.rb b/spec/lib/spec/dsl/description.rb similarity index 100% rename from test/lib/spec/dsl/description.rb rename to spec/lib/spec/dsl/description.rb diff --git a/test/lib/spec/dsl/errors.rb b/spec/lib/spec/dsl/errors.rb similarity index 100% rename from test/lib/spec/dsl/errors.rb rename to spec/lib/spec/dsl/errors.rb diff --git a/test/lib/spec/dsl/example.rb b/spec/lib/spec/dsl/example.rb similarity index 100% rename from test/lib/spec/dsl/example.rb rename to spec/lib/spec/dsl/example.rb diff --git a/test/lib/spec/dsl/example_matcher.rb b/spec/lib/spec/dsl/example_matcher.rb similarity index 100% rename from test/lib/spec/dsl/example_matcher.rb rename to spec/lib/spec/dsl/example_matcher.rb diff --git a/test/lib/spec/dsl/example_should_raise_handler.rb b/spec/lib/spec/dsl/example_should_raise_handler.rb similarity index 100% rename from test/lib/spec/dsl/example_should_raise_handler.rb rename to spec/lib/spec/dsl/example_should_raise_handler.rb diff --git a/test/lib/spec/expectations.rb b/spec/lib/spec/expectations.rb similarity index 100% rename from test/lib/spec/expectations.rb rename to spec/lib/spec/expectations.rb diff --git a/test/lib/spec/expectations/differs/default.rb b/spec/lib/spec/expectations/differs/default.rb similarity index 100% rename from test/lib/spec/expectations/differs/default.rb rename to spec/lib/spec/expectations/differs/default.rb diff --git a/test/lib/spec/expectations/errors.rb b/spec/lib/spec/expectations/errors.rb similarity index 100% rename from test/lib/spec/expectations/errors.rb rename to spec/lib/spec/expectations/errors.rb diff --git a/test/lib/spec/expectations/extensions.rb b/spec/lib/spec/expectations/extensions.rb similarity index 100% rename from test/lib/spec/expectations/extensions.rb rename to spec/lib/spec/expectations/extensions.rb diff --git a/test/lib/spec/expectations/extensions/object.rb b/spec/lib/spec/expectations/extensions/object.rb similarity index 100% rename from test/lib/spec/expectations/extensions/object.rb rename to spec/lib/spec/expectations/extensions/object.rb diff --git a/test/lib/spec/expectations/extensions/string_and_symbol.rb b/spec/lib/spec/expectations/extensions/string_and_symbol.rb similarity index 100% rename from test/lib/spec/expectations/extensions/string_and_symbol.rb rename to spec/lib/spec/expectations/extensions/string_and_symbol.rb diff --git a/test/lib/spec/expectations/handler.rb b/spec/lib/spec/expectations/handler.rb similarity index 100% rename from test/lib/spec/expectations/handler.rb rename to spec/lib/spec/expectations/handler.rb diff --git a/test/lib/spec/extensions.rb b/spec/lib/spec/extensions.rb similarity index 100% rename from test/lib/spec/extensions.rb rename to spec/lib/spec/extensions.rb diff --git a/test/lib/spec/extensions/object.rb b/spec/lib/spec/extensions/object.rb similarity index 100% rename from test/lib/spec/extensions/object.rb rename to spec/lib/spec/extensions/object.rb diff --git a/test/lib/spec/matchers.rb b/spec/lib/spec/matchers.rb similarity index 100% rename from test/lib/spec/matchers.rb rename to spec/lib/spec/matchers.rb diff --git a/test/lib/spec/matchers/be.rb b/spec/lib/spec/matchers/be.rb similarity index 100% rename from test/lib/spec/matchers/be.rb rename to spec/lib/spec/matchers/be.rb diff --git a/test/lib/spec/matchers/be_close.rb b/spec/lib/spec/matchers/be_close.rb similarity index 100% rename from test/lib/spec/matchers/be_close.rb rename to spec/lib/spec/matchers/be_close.rb diff --git a/test/lib/spec/matchers/change.rb b/spec/lib/spec/matchers/change.rb similarity index 100% rename from test/lib/spec/matchers/change.rb rename to spec/lib/spec/matchers/change.rb diff --git a/test/lib/spec/matchers/eql.rb b/spec/lib/spec/matchers/eql.rb similarity index 100% rename from test/lib/spec/matchers/eql.rb rename to spec/lib/spec/matchers/eql.rb diff --git a/test/lib/spec/matchers/equal.rb b/spec/lib/spec/matchers/equal.rb similarity index 100% rename from test/lib/spec/matchers/equal.rb rename to spec/lib/spec/matchers/equal.rb diff --git a/test/lib/spec/matchers/has.rb b/spec/lib/spec/matchers/has.rb similarity index 100% rename from test/lib/spec/matchers/has.rb rename to spec/lib/spec/matchers/has.rb diff --git a/test/lib/spec/matchers/have.rb b/spec/lib/spec/matchers/have.rb similarity index 100% rename from test/lib/spec/matchers/have.rb rename to spec/lib/spec/matchers/have.rb diff --git a/test/lib/spec/matchers/include.rb b/spec/lib/spec/matchers/include.rb similarity index 100% rename from test/lib/spec/matchers/include.rb rename to spec/lib/spec/matchers/include.rb diff --git a/test/lib/spec/matchers/match.rb b/spec/lib/spec/matchers/match.rb similarity index 100% rename from test/lib/spec/matchers/match.rb rename to spec/lib/spec/matchers/match.rb diff --git a/test/lib/spec/matchers/operator_matcher.rb b/spec/lib/spec/matchers/operator_matcher.rb similarity index 100% rename from test/lib/spec/matchers/operator_matcher.rb rename to spec/lib/spec/matchers/operator_matcher.rb diff --git a/test/lib/spec/matchers/raise_error.rb b/spec/lib/spec/matchers/raise_error.rb similarity index 100% rename from test/lib/spec/matchers/raise_error.rb rename to spec/lib/spec/matchers/raise_error.rb diff --git a/test/lib/spec/matchers/respond_to.rb b/spec/lib/spec/matchers/respond_to.rb similarity index 100% rename from test/lib/spec/matchers/respond_to.rb rename to spec/lib/spec/matchers/respond_to.rb diff --git a/test/lib/spec/matchers/satisfy.rb b/spec/lib/spec/matchers/satisfy.rb similarity index 100% rename from test/lib/spec/matchers/satisfy.rb rename to spec/lib/spec/matchers/satisfy.rb diff --git a/test/lib/spec/matchers/throw_symbol.rb b/spec/lib/spec/matchers/throw_symbol.rb similarity index 100% rename from test/lib/spec/matchers/throw_symbol.rb rename to spec/lib/spec/matchers/throw_symbol.rb diff --git a/test/lib/spec/mocks.rb b/spec/lib/spec/mocks.rb similarity index 100% rename from test/lib/spec/mocks.rb rename to spec/lib/spec/mocks.rb diff --git a/test/lib/spec/mocks/argument_constraint_matchers.rb b/spec/lib/spec/mocks/argument_constraint_matchers.rb similarity index 100% rename from test/lib/spec/mocks/argument_constraint_matchers.rb rename to spec/lib/spec/mocks/argument_constraint_matchers.rb diff --git a/test/lib/spec/mocks/argument_expectation.rb b/spec/lib/spec/mocks/argument_expectation.rb similarity index 100% rename from test/lib/spec/mocks/argument_expectation.rb rename to spec/lib/spec/mocks/argument_expectation.rb diff --git a/test/lib/spec/mocks/error_generator.rb b/spec/lib/spec/mocks/error_generator.rb similarity index 100% rename from test/lib/spec/mocks/error_generator.rb rename to spec/lib/spec/mocks/error_generator.rb diff --git a/test/lib/spec/mocks/errors.rb b/spec/lib/spec/mocks/errors.rb similarity index 100% rename from test/lib/spec/mocks/errors.rb rename to spec/lib/spec/mocks/errors.rb diff --git a/test/lib/spec/mocks/extensions/object.rb b/spec/lib/spec/mocks/extensions/object.rb similarity index 100% rename from test/lib/spec/mocks/extensions/object.rb rename to spec/lib/spec/mocks/extensions/object.rb diff --git a/test/lib/spec/mocks/message_expectation.rb b/spec/lib/spec/mocks/message_expectation.rb similarity index 100% rename from test/lib/spec/mocks/message_expectation.rb rename to spec/lib/spec/mocks/message_expectation.rb diff --git a/test/lib/spec/mocks/methods.rb b/spec/lib/spec/mocks/methods.rb similarity index 100% rename from test/lib/spec/mocks/methods.rb rename to spec/lib/spec/mocks/methods.rb diff --git a/test/lib/spec/mocks/mock.rb b/spec/lib/spec/mocks/mock.rb similarity index 100% rename from test/lib/spec/mocks/mock.rb rename to spec/lib/spec/mocks/mock.rb diff --git a/test/lib/spec/mocks/order_group.rb b/spec/lib/spec/mocks/order_group.rb similarity index 100% rename from test/lib/spec/mocks/order_group.rb rename to spec/lib/spec/mocks/order_group.rb diff --git a/test/lib/spec/mocks/proxy.rb b/spec/lib/spec/mocks/proxy.rb similarity index 100% rename from test/lib/spec/mocks/proxy.rb rename to spec/lib/spec/mocks/proxy.rb diff --git a/test/lib/spec/mocks/space.rb b/spec/lib/spec/mocks/space.rb similarity index 100% rename from test/lib/spec/mocks/space.rb rename to spec/lib/spec/mocks/space.rb diff --git a/test/lib/spec/mocks/spec_methods.rb b/spec/lib/spec/mocks/spec_methods.rb similarity index 100% rename from test/lib/spec/mocks/spec_methods.rb rename to spec/lib/spec/mocks/spec_methods.rb diff --git a/test/lib/spec/rake/spectask.rb b/spec/lib/spec/rake/spectask.rb similarity index 100% rename from test/lib/spec/rake/spectask.rb rename to spec/lib/spec/rake/spectask.rb diff --git a/test/lib/spec/rake/verify_rcov.rb b/spec/lib/spec/rake/verify_rcov.rb similarity index 100% rename from test/lib/spec/rake/verify_rcov.rb rename to spec/lib/spec/rake/verify_rcov.rb diff --git a/test/lib/spec/runner.rb b/spec/lib/spec/runner.rb similarity index 100% rename from test/lib/spec/runner.rb rename to spec/lib/spec/runner.rb diff --git a/test/lib/spec/runner/backtrace_tweaker.rb b/spec/lib/spec/runner/backtrace_tweaker.rb similarity index 100% rename from test/lib/spec/runner/backtrace_tweaker.rb rename to spec/lib/spec/runner/backtrace_tweaker.rb diff --git a/test/lib/spec/runner/behaviour_runner.rb b/spec/lib/spec/runner/behaviour_runner.rb similarity index 100% rename from test/lib/spec/runner/behaviour_runner.rb rename to spec/lib/spec/runner/behaviour_runner.rb diff --git a/test/lib/spec/runner/command_line.rb b/spec/lib/spec/runner/command_line.rb similarity index 100% rename from test/lib/spec/runner/command_line.rb rename to spec/lib/spec/runner/command_line.rb diff --git a/test/lib/spec/runner/drb_command_line.rb b/spec/lib/spec/runner/drb_command_line.rb similarity index 100% rename from test/lib/spec/runner/drb_command_line.rb rename to spec/lib/spec/runner/drb_command_line.rb diff --git a/test/lib/spec/runner/extensions/kernel.rb b/spec/lib/spec/runner/extensions/kernel.rb similarity index 100% rename from test/lib/spec/runner/extensions/kernel.rb rename to spec/lib/spec/runner/extensions/kernel.rb diff --git a/test/lib/spec/runner/extensions/object.rb b/spec/lib/spec/runner/extensions/object.rb similarity index 100% rename from test/lib/spec/runner/extensions/object.rb rename to spec/lib/spec/runner/extensions/object.rb diff --git a/test/lib/spec/runner/formatter.rb b/spec/lib/spec/runner/formatter.rb similarity index 100% rename from test/lib/spec/runner/formatter.rb rename to spec/lib/spec/runner/formatter.rb diff --git a/test/lib/spec/runner/formatter/base_formatter.rb b/spec/lib/spec/runner/formatter/base_formatter.rb similarity index 100% rename from test/lib/spec/runner/formatter/base_formatter.rb rename to spec/lib/spec/runner/formatter/base_formatter.rb diff --git a/test/lib/spec/runner/formatter/base_text_formatter.rb b/spec/lib/spec/runner/formatter/base_text_formatter.rb similarity index 100% rename from test/lib/spec/runner/formatter/base_text_formatter.rb rename to spec/lib/spec/runner/formatter/base_text_formatter.rb diff --git a/test/lib/spec/runner/formatter/failing_behaviours_formatter.rb b/spec/lib/spec/runner/formatter/failing_behaviours_formatter.rb similarity index 100% rename from test/lib/spec/runner/formatter/failing_behaviours_formatter.rb rename to spec/lib/spec/runner/formatter/failing_behaviours_formatter.rb diff --git a/test/lib/spec/runner/formatter/failing_examples_formatter.rb b/spec/lib/spec/runner/formatter/failing_examples_formatter.rb similarity index 100% rename from test/lib/spec/runner/formatter/failing_examples_formatter.rb rename to spec/lib/spec/runner/formatter/failing_examples_formatter.rb diff --git a/test/lib/spec/runner/formatter/html_formatter.rb b/spec/lib/spec/runner/formatter/html_formatter.rb similarity index 100% rename from test/lib/spec/runner/formatter/html_formatter.rb rename to spec/lib/spec/runner/formatter/html_formatter.rb diff --git a/test/lib/spec/runner/formatter/progress_bar_formatter.rb b/spec/lib/spec/runner/formatter/progress_bar_formatter.rb similarity index 100% rename from test/lib/spec/runner/formatter/progress_bar_formatter.rb rename to spec/lib/spec/runner/formatter/progress_bar_formatter.rb diff --git a/test/lib/spec/runner/formatter/rdoc_formatter.rb b/spec/lib/spec/runner/formatter/rdoc_formatter.rb similarity index 100% rename from test/lib/spec/runner/formatter/rdoc_formatter.rb rename to spec/lib/spec/runner/formatter/rdoc_formatter.rb diff --git a/test/lib/spec/runner/formatter/snippet_extractor.rb b/spec/lib/spec/runner/formatter/snippet_extractor.rb similarity index 100% rename from test/lib/spec/runner/formatter/snippet_extractor.rb rename to spec/lib/spec/runner/formatter/snippet_extractor.rb diff --git a/test/lib/spec/runner/formatter/specdoc_formatter.rb b/spec/lib/spec/runner/formatter/specdoc_formatter.rb similarity index 100% rename from test/lib/spec/runner/formatter/specdoc_formatter.rb rename to spec/lib/spec/runner/formatter/specdoc_formatter.rb diff --git a/test/lib/spec/runner/heckle_runner.rb b/spec/lib/spec/runner/heckle_runner.rb similarity index 100% rename from test/lib/spec/runner/heckle_runner.rb rename to spec/lib/spec/runner/heckle_runner.rb diff --git a/test/lib/spec/runner/heckle_runner_unsupported.rb b/spec/lib/spec/runner/heckle_runner_unsupported.rb similarity index 100% rename from test/lib/spec/runner/heckle_runner_unsupported.rb rename to spec/lib/spec/runner/heckle_runner_unsupported.rb diff --git a/test/lib/spec/runner/option_parser.rb b/spec/lib/spec/runner/option_parser.rb similarity index 100% rename from test/lib/spec/runner/option_parser.rb rename to spec/lib/spec/runner/option_parser.rb diff --git a/test/lib/spec/runner/options.rb b/spec/lib/spec/runner/options.rb similarity index 100% rename from test/lib/spec/runner/options.rb rename to spec/lib/spec/runner/options.rb diff --git a/test/lib/spec/runner/reporter.rb b/spec/lib/spec/runner/reporter.rb similarity index 100% rename from test/lib/spec/runner/reporter.rb rename to spec/lib/spec/runner/reporter.rb diff --git a/test/lib/spec/runner/spec_parser.rb b/spec/lib/spec/runner/spec_parser.rb similarity index 100% rename from test/lib/spec/runner/spec_parser.rb rename to spec/lib/spec/runner/spec_parser.rb diff --git a/test/lib/spec/test_case_adapter.rb b/spec/lib/spec/test_case_adapter.rb similarity index 100% rename from test/lib/spec/test_case_adapter.rb rename to spec/lib/spec/test_case_adapter.rb diff --git a/test/lib/spec/translator.rb b/spec/lib/spec/translator.rb similarity index 100% rename from test/lib/spec/translator.rb rename to spec/lib/spec/translator.rb diff --git a/test/lib/spec/version.rb b/spec/lib/spec/version.rb similarity index 100% rename from test/lib/spec/version.rb rename to spec/lib/spec/version.rb diff --git a/spec/plugins/mock_frameworks/flexmock.rb b/spec/plugins/mock_frameworks/flexmock.rb new file mode 100644 index 000000000..6875a5222 --- /dev/null +++ b/spec/plugins/mock_frameworks/flexmock.rb @@ -0,0 +1,23 @@ +#!/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/spec/plugins/mock_frameworks/mocha.rb b/spec/plugins/mock_frameworks/mocha.rb new file mode 100644 index 000000000..69d11636c --- /dev/null +++ b/spec/plugins/mock_frameworks/mocha.rb @@ -0,0 +1,19 @@ +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/spec/plugins/mock_frameworks/rr.rb b/spec/plugins/mock_frameworks/rr.rb new file mode 100644 index 000000000..c019c18a1 --- /dev/null +++ b/spec/plugins/mock_frameworks/rr.rb @@ -0,0 +1,21 @@ +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/spec/plugins/mock_frameworks/rspec.rb b/spec/plugins/mock_frameworks/rspec.rb new file mode 100644 index 000000000..e606c3089 --- /dev/null +++ b/spec/plugins/mock_frameworks/rspec.rb @@ -0,0 +1,18 @@ +require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "lib", "spec", "mocks")) + +module Spec + module Plugins + module MockFramework + include Spec::Mocks::SpecMethods + 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/spec/spec_helper.rb b/spec/spec_helper.rb new file mode 100644 index 000000000..d8f326924 --- /dev/null +++ b/spec/spec_helper.rb @@ -0,0 +1,13 @@ +dir = File.dirname(__FILE__) +$:.unshift("#{dir}/lib").unshift("#{dir}/../lib") + +# Add the old test dir, so that we can still find mocha and spec +$:.unshift("#{dir}/../test/lib") + +require 'mocha' +require 'spec' +require 'puppet' + +Spec::Runner.configure do |config| + config.mock_with :mocha +end diff --git a/spec/unit/parser/interpreter.rb b/spec/unit/parser/interpreter.rb new file mode 100755 index 000000000..0e32b8c5b --- /dev/null +++ b/spec/unit/parser/interpreter.rb @@ -0,0 +1,94 @@ +#!/usr/bin/env ruby + +require File.dirname(__FILE__) + '/../../spec_helper' + +describe Puppet::Parser::Interpreter, " when creating parser instances" do + before do + @interp = Puppet::Parser::Interpreter.new + @parser = mock('parser') + end + + it "should create a parser with code passed in at initialization time" do + @interp.code = :some_code + @parser.expects(:code=).with(:some_code) + @parser.expects(:parse) + Puppet::Parser::Parser.expects(:new).with(:environment).returns(@parser) + @interp.send(:create_parser, :environment).object_id.should equal(@parser.object_id) + end + + it "should create a parser with a file passed in at initialization time" do + @interp.file = :a_file + @parser.expects(:file=).with(:a_file) + @parser.expects(:parse) + Puppet::Parser::Parser.expects(:new).with(:environment).returns(@parser) + @interp.send(:create_parser, :environment).should equal(@parser) + end + + it "should create a parser when passed neither code nor file" do + @parser.expects(:parse) + Puppet::Parser::Parser.expects(:new).with(:environment).returns(@parser) + @interp.send(:create_parser, :environment).should equal(@parser) + end + + it "should return nothing when new parsers fail" do + Puppet::Parser::Parser.expects(:new).with(:environment).raises(ArgumentError) + @interp.send(:create_parser, :environment).should be_nil + end +end + +describe Puppet::Parser::Interpreter, " when managing parser instances" do + before do + @interp = Puppet::Parser::Interpreter.new + @parser = mock('parser') + end + + it "it should an exception when nothing is there and nil is returned" do + @interp.expects(:create_parser).with(:environment).returns(nil) + lambda { @interp.send(:parser, :environment) }.should raise_error(Puppet::Error) + end + + it "should create and return a new parser and use the same parser when the parser does not need reparsing" do + @interp.expects(:create_parser).with(:environment).returns(@parser) + @interp.send(:parser, :environment).should equal(@parser) + + @parser.expects(:reparse?).returns(false) + @interp.send(:parser, :environment).should equal(@parser) + end + + it "should create a new parser when reparse is true" do + oldparser = mock('oldparser') + newparser = mock('newparser') + oldparser.expects(:reparse?).returns(true) + oldparser.expects(:clear) + + @interp.expects(:create_parser).with(:environment).returns(oldparser) + @interp.send(:parser, :environment).should equal(oldparser) + @interp.expects(:create_parser).with(:environment).returns(newparser) + @interp.send(:parser, :environment).should equal(newparser) + end + + it "should keep the old parser if create_parser doesn't return anything." do + # Get the first parser in the hash. + @interp.expects(:create_parser).with(:environment).returns(@parser) + @interp.send(:parser, :environment).should equal(@parser) + + # Have it indicate something has changed + @parser.expects(:reparse?).returns(true) + + # But fail to create a new parser + @interp.expects(:create_parser).with(:environment).returns(nil) + + # And make sure we still get the old valid parser + @interp.send(:parser, :environment).should equal(@parser) + end + + it "should use different parsers for different environments" do + # get one for the first env + @interp.expects(:create_parser).with(:first_env).returns(@parser) + @interp.send(:parser, :first_env).should equal(@parser) + + other_parser = mock('otherparser') + @interp.expects(:create_parser).with(:second_env).returns(other_parser) + @interp.send(:parser, :second_env).should equal(other_parser) + end +end