if ENV['COVERAGE']
  require 'simplecov'
  SimpleCov.start
end

if ENV['PROFILE']
  require 'perftools'
  PerfTools::CpuProfiler.start("/tmp/jhw-profile")
end

require 'jasmine-headless-webkit'
require 'fakefs/spec_helpers'

RSpec.configure do |c|
  c.mock_with :mocha
  c.backtrace_clean_patterns = []
  
  c.before(:each) do
    Jasmine::Headless::CacheableAction.enabled = false
    Jasmine::Headless::FilesList.reset!
  end

  c.before(:each, :type => :integration) do
    let(:report) { 'spec/report.txt' }

    before do
      FileUtils.rm_f report
    end

    after do
      FileUtils.rm_f report
    end
  end
end

specrunner = 'ext/jasmine-webkit-specrunner/jasmine-webkit-specrunner'

if !File.file?(specrunner)
  Dir.chdir File.split(specrunner).first do
    system %{ruby extconf.rb}
  end
end

class FakeFS::File
  class << self
    def fnmatch?(pattern, file)
      RealFile.fnmatch?(pattern, file)
    end
  end

  class Stat
    def file?
      File.file?(@file)
    end
  end
end

module RSpec::Matchers
  define :be_a_report_containing do |total, failed, used_console|
    match do |filename|
      report(filename)
      report.total.should == total
      report.failed.should == failed
      report.has_used_console?.should == used_console
      true
    end

    failure_message_for_should do |filename|
      "expected #{filename} to be a report containing (#{total}, #{failed}, #{used_console.inspect})"
    end

    def report(filename = nil)
      @report ||= Jasmine::Headless::Report.load(filename)
    end
  end

  define :contain_a_failing_spec do |*parts|
    match do |filename|
      report(filename).should have_failed_on(parts.join(" "))
    end

    def report(filename)
      @report ||= Jasmine::Headless::Report.load(filename)
    end
  end

  define :be_a_file do
    match do |file|
      File.file?(file)
    end
  end

  define :contain_in_order_in_file_list do |*files|
    match do |lines|
      file_list = files.dup

      lines.each do |line|
        next if !file_list.first

        if line[file_list.first]
          file_list.shift
        end
      end

      file_list.length == 0
    end

    failure_message_for_should do |lines|
      %{expected\n#{lines.join("\n")}\nto contain the following files, in order:\n#{files.join("\n")}}
    end
  end
end