require 'spec_helper'

module Spec
  module Runner
    unless jruby?
      describe DrbCommandLine do

        context "without server running" do
          it "prints error" do
            err = out = StringIO.new
            DrbCommandLine.run(OptionParser.parse(['--version'], err, out))

            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    

        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

          before(:all) do
            DRb.start_service("druby://127.0.0.1:8989", ::CommandLineForDrbSpec)
            @@drb_example_file_counter = 0
          end

          before(:each) do
            create_dummy_spec_file
            @@drb_example_file_counter = @@drb_example_file_counter + 1
          end

          after(:each) do
            File.delete(@dummy_spec_filename)
          end

          after(:all) do
            DRb.stop_service
          end

          it "returns true" do
            err = out = StringIO.new
            result = DrbCommandLine.run(OptionParser.parse(['--version'], err, out))
            result.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!")
                  end
                end
              }
            end
          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
        end

      end
    end
  end
end
