require "bundler/gem_tasks"
require "rake/testtask"
require './lib/orocos/rake'


Rake::TestTask.new(:test) do |t|
    t.libs << "lib"
    t.libs << "."
    test_files = FileList['test/**/test_*.rb']
    test_files.exclude "test/standalone/**/*"
    if !Orocos::Rake::USE_ROS
        test_files.exclude 'test/ros/**'
    end
    t.test_files = test_files
    t.warning = false
end

Rake::TestTask.new(:test_standalone) do |t|
    t.libs << "lib"
    t.libs << "."
    t.test_files = FileList['test/standalone/test_*.rb']
    t.warning = false
end

def build_orogen(name, options = Hash.new)
    parsed_options = Hash.new
    parsed_options[:keep_wc] =
        if ['1', 'true'].include?(options[:keep_wc]) then true
        else false
        end
    parsed_options[:transports] = (options[:transports] || "corba typelib mqueue").split(" ")
    if parsed_options[:transports].empty?
        parsed_options[:transports] = nil
    elsif parsed_options[:transports] == 'none'
        parsed_options[:transports] = []
    end

    parsed_options[:make_options] = Shellwords.split(options[:make_options] || "").
        map { |opt| opt.gsub(';', ',') }
    work_dir = File.expand_path(File.join('test', 'working_copy'))
    data_dir = File.expand_path(File.join('test', 'data'))

    Orocos::Rake.generate_and_build \
        File.join(data_dir, name, "#{name}.orogen"),
        work_dir, parsed_options
end

task 'default' do
    Rake::Task['clean'].invoke
    Rake::Task['compile'].invoke
end

# Leave in top level namespace to allow rake-compiler to build native gem: 'rake native gem'
require 'rake/extensiontask'
desc "builds Orocos.rb C extension"
Rake::ExtensionTask.new('rorocos') do |ext|
    # Same info as in ext/rocoros/extconf.rb where cmake
    # is used to generate the Makefile
    ext.name = "rorocos"
    ext.ext_dir = "ext/rorocos"
    ext.lib_dir = "lib/orocos"
    ext.source_pattern = "*.{c,cpp,cc}"

    if not Dir.exists?(ext.tmp_dir)
        FileUtils.mkdir_p ext.tmp_dir
    end
end

namespace :setup do
    desc "builds the oroGen modules that are needed by the tests"
    task :orogen_all, [:keep_wc,:transports,:make_options] do |_, args|
        build_orogen 'process', args
        build_orogen 'simple_sink', args
        build_orogen 'simple_source', args
        build_orogen 'echo', args
        build_orogen 'operations', args
        build_orogen 'configurations', args
        build_orogen 'states', args
        build_orogen 'uncaught', args
        build_orogen 'system', args
    end

    desc "builds the test 'process' module"
    task :orogen_process, [:keep_wc,:transports,:update] do |_, args| build_orogen 'process', args end
    desc "builds the test 'simple_sink' module"
    task :orogen_sink, [:keep_wc,:transports,:update]    do |_, args| build_orogen 'simple_sink', args end
    desc "builds the test 'simple_source' module"
    task :orogen_source, [:keep_wc,:transports,:update]  do |_, args| build_orogen 'simple_source', args end
    desc "builds the test 'echo' module"
    task :orogen_echo, [:keep_wc,:transports,:update]    do |_, args| build_orogen 'echo', args end
    desc "builds the test 'states' module"
    task :orogen_states, [:keep_wc,:transports,:update]    do |_, args| build_orogen 'states', args end
    desc "builds the test 'uncaught' module"
    task :orogen_uncaught, [:keep_wc,:transports,:update]    do |_, args| build_orogen 'uncaught', args end
    desc "builds the test 'system' module"
    task :orogen_system, [:keep_wc,:transports,:update]    do |_, args| build_orogen 'system', args end
    desc "builds the test 'operations' module"
    task :orogen_operations, [:keep_wc,:transports,:update]    do |_, args| build_orogen 'operations', args end
    desc "builds the test 'configurations' module"
    task :orogen_configurations, [:keep_wc,:transports,:update]    do |_, args| build_orogen 'configurations', args end
    desc "builds the test 'ros_test' module"
    task :orogen_ros_test, [:keep_wc,:transports,:update]    do |_, args| build_orogen 'ros_test', args end

    task :test do |t, args|
        Rake::Task['setup:orogen_all'].invoke('1', '', '1')
    end
end

require 'yard/rake/yardoc_task'
YARD::Rake::YardocTask.new

task :test
task :doc => :yard
task :docs => :yard
task :redoc => :yard
task :redocs => :yard

