# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with this
# work for additional information regarding copyright ownership.  The ASF
# licenses this file to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
# License for the specific language governing permissions and limitations under
# the License.


begin
  require 'spec/rake/spectask'
  directory '_reports'

  def default_spec_opts
    default = %w{--format failing_examples:failed --format html:_reports/specs.html --backtrace}
    default << '--colour' if $stdout.isatty
    default
  end
  
  desc "Run all specs"
  Spec::Rake::SpecTask.new :spec=>['_reports', :compile] do |task|
    ENV['USE_FSC'] = 'no'
    task.spec_files = FileList['spec/**/*_spec.rb']
    task.spec_files.exclude('spec/groovy/*') if RUBY_PLATFORM[/java/]
    task.spec_opts = default_spec_opts
    task.spec_opts << '--format specdoc'
  end
  file('_reports/specs.html') { task(:spec).invoke }

  desc 'Run all failed examples from previous run'
  Spec::Rake::SpecTask.new :failed do |task|
    ENV['USE_FSC'] = 'no'
    task.spec_files = FileList['spec/**/*_spec.rb']
    task.spec_opts = default_spec_opts
    task.spec_opts << '--format specdoc' << '--example failed'
  end

  desc 'Run RSpec and generate Spec and coverage reports (slow)'
  Spec::Rake::SpecTask.new :coverage=>['_reports', :compile] do |task|
    ENV['USE_FSC'] = 'no'
    task.spec_files = FileList['spec/**/*_spec.rb']
    task.spec_opts = default_spec_opts
    task.spec_opts << '--format progress'
    task.rcov = true
    task.rcov_dir = '_reports/coverage'
    task.rcov_opts = %w{--exclude / --include-file ^lib --text-summary}
  end
  file('_reports/coverage') { task(:coverage).invoke }

  task :load_ci_reporter do
    gem 'ci_reporter'
    ENV['CI_REPORTS'] = '_reports/ci'
    # CI_Reporter does not quote the path to rspec_loader which causes problems when ruby is installed in C:/Program Files
    ci_rep_path = Gem.loaded_specs['ci_reporter'].full_gem_path
    ENV["SPEC_OPTS"] = [ENV["SPEC_OPTS"], default_spec_opts, "--require", "\"#{ci_rep_path}/lib/ci/reporter/rake/rspec_loader.rb\"", "--format", "CI::Reporter::RSpec"].join(" ")
  end
  
  desc 'Run all specs with CI reporter'
  task :ci=>[:load_ci_reporter, :spec] 
  
  # Useful for testing with JRuby when using Ruby and vice versa.
  namespace :spec do
    desc "Run all specs specifically with Ruby"
    task :ruby do
      puts "Running test suite using Ruby ..."
      sh 'ruby -S rake spec'
    end

    desc "Run all specs specifically with JRuby"
    task :jruby do
      puts "Running test suite using JRuby ..."
      sh 'jruby -S rake spec'
    end
  end

  task :clobber do
    rm_f 'failed'
    rm_rf '_reports'
  end

rescue LoadError
  puts "Buildr uses RSpec. You can install it by running rake setup"
  task(:setup) { install_gem 'rcov', :version=>'~>0.8' }
  task(:setup) { install_gem 'win32console' if RUBY_PLATFORM[/win32/] } # Colors for RSpec, only on Windows platform.
end