Sha256: c9ac6a745d0efa8699173ed075f668ce4405350ab45e6cb1db25ec205652deec

Contents?: true

Size: 1.54 KB

Versions: 80

Compression:

Stored size: 1.54 KB

Contents

require 'mspec/helpers/tmp'
require 'fileutils'

# Lower-level output speccing mechanism for a single
# output stream. Unlike OutputMatcher which provides
# methods to capture the output, we actually replace
# the FD itself so that there is no reliance on a
# certain method being used.
class OutputToFDMatcher
  def initialize(expected, to)
    @to, @expected = to, expected

    case @to
    when STDOUT
      @to_name = "STDOUT"
    when STDERR
      @to_name = "STDERR"
    when IO
      @to_name = @to.object_id.to_s
    else
      raise ArgumentError, "#{@to.inspect} is not a supported output target"
    end
  end

  def matches?(block)
    old_to = @to.dup
    out = File.open(tmp("mspec_output_to_#{$$}_#{Time.now.to_i}"), 'w+')

    # Replacing with a file handle so that Readline etc. work
    @to.reopen out

    block.call

  ensure
    begin
      @to.reopen old_to

      out.rewind
      @actual = out.read

      case @expected
        when Regexp
          return !(@actual =~ @expected).nil?
        else
          return @actual == @expected
      end

    # Clean up
    ensure
      out.close unless out.closed?
      FileUtils.rm out.path
    end

    return true
  end

  def failure_message()
    ["Expected (#{@to_name}): #{@expected.inspect}\n",
     "#{'but got'.rjust(@to_name.length + 10)}: #{@actual.inspect}\nBacktrace"]
  end

  def negative_failure_message()
    ["Expected output (#{@to_name}) to NOT be:\n", @actual.inspect]
  end
end

class Object
  def output_to_fd(what, where = STDOUT)
    OutputToFDMatcher.new what, where
  end
end

Version data entries

80 entries across 80 versions & 3 rubygems

Version Path
rhodes-5.5.18 lib/extensions/mspec/mspec/matchers/output_to_fd.rb
rhodes-5.5.17 lib/extensions/mspec/mspec/matchers/output_to_fd.rb
rhodes-5.5.15 lib/extensions/mspec/mspec/matchers/output_to_fd.rb
rhodes-5.5.0.22 lib/extensions/mspec/mspec/matchers/output_to_fd.rb
rhodes-5.5.2 lib/extensions/mspec/mspec/matchers/output_to_fd.rb
rhodes-5.5.0.7 lib/extensions/mspec/mspec/matchers/output_to_fd.rb
rhodes-5.5.0.3 lib/extensions/mspec/mspec/matchers/output_to_fd.rb
rhodes-5.5.0 lib/extensions/mspec/mspec/matchers/output_to_fd.rb
tauplatform-1.0.3 lib/extensions/mspec/mspec/matchers/output_to_fd.rb
mspec-1.9.1 lib/mspec/matchers/output_to_fd.rb
mspec-1.9.0 lib/mspec/matchers/output_to_fd.rb
tauplatform-1.0.2 lib/extensions/mspec/mspec/matchers/output_to_fd.rb
tauplatform-1.0.1 lib/extensions/mspec/mspec/matchers/output_to_fd.rb
mspec-1.8.0 lib/mspec/matchers/output_to_fd.rb
mspec-1.7.0 lib/mspec/matchers/output_to_fd.rb
mspec-1.6.0 lib/mspec/matchers/output_to_fd.rb
mspec-1.5.21 lib/mspec/matchers/output_to_fd.rb
mspec-1.5.20 lib/mspec/matchers/output_to_fd.rb
mspec-1.5.19 lib/mspec/matchers/output_to_fd.rb
mspec-1.5.18 lib/mspec/matchers/output_to_fd.rb