1require File.expand_path('../helper', __FILE__)
2require 'thread'
3
4class TestRakeMultiTask < Rake::TestCase
5  include Rake
6  include Rake::DSL
7
8  def setup
9    super
10
11    Task.clear
12    @runs = Array.new
13    @mutex = Mutex.new
14  end
15
16  def add_run(obj)
17    @mutex.synchronize do
18      @runs << obj
19    end
20  end
21
22  def test_running_multitasks
23    task :a do 3.times do |i| add_run("A#{i}"); sleep 0.01; end end
24    task :b do 3.times do |i| add_run("B#{i}"); sleep 0.01;  end end
25    multitask :both => [:a, :b]
26    Task[:both].invoke
27    assert_equal 6, @runs.size
28    assert @runs.index("A0") < @runs.index("A1")
29    assert @runs.index("A1") < @runs.index("A2")
30    assert @runs.index("B0") < @runs.index("B1")
31    assert @runs.index("B1") < @runs.index("B2")
32  end
33
34  def test_all_multitasks_wait_on_slow_prerequisites
35    task :slow do 3.times do |i| add_run("S#{i}"); sleep 0.05 end end
36    task :a => [:slow] do 3.times do |i| add_run("A#{i}"); sleep 0.01 end end
37    task :b => [:slow] do 3.times do |i| add_run("B#{i}"); sleep 0.01 end end
38    multitask :both => [:a, :b]
39    Task[:both].invoke
40    assert_equal 9, @runs.size
41    assert @runs.index("S0") < @runs.index("S1")
42    assert @runs.index("S1") < @runs.index("S2")
43    assert @runs.index("S2") < @runs.index("A0")
44    assert @runs.index("S2") < @runs.index("B0")
45    assert @runs.index("A0") < @runs.index("A1")
46    assert @runs.index("A1") < @runs.index("A2")
47    assert @runs.index("B0") < @runs.index("B1")
48    assert @runs.index("B1") < @runs.index("B2")
49  end
50
51  def test_multitasks_with_parameters
52    task :a, [:arg] do |t,args| add_run(args[:arg]) end
53    multitask :b, [:arg] => [:a] do |t,args| add_run(args[:arg]+'mt') end
54    Task[:b].invoke "b"
55    assert @runs[0] == "b"
56    assert @runs[1] == "bmt"
57  end
58end
59
60