#! /usr/bin/ruby
require 'test/unit'

def merge_libs(*libs)
  libs.inject([]) do |l, r|
    i = 0
    (r & l).each do |c|
      j = r.index(c)
      l.insert(l.rindex(c), *r[i...j])
      i = j + 1
    end
    l.concat(r[i..-1])
  end
end

class TestLib < Test::Unit::TestCase
  def assert_in_order(array, x, y)
    assert(array.index(x) < array.rindex(y), "#{x} must proceed to #{y}")
  end
  def test_simple
    assert_equal([], merge_libs(%w[]))
    assert_equal(%w[a b], merge_libs(%w[a], %w[b]))
    array = merge_libs(%w[a c], %w[b])
    assert_in_order(array, "a", "c")
  end
  def test_seq
    array = merge_libs(%w[a c d], %w[b c d e])
    assert_in_order(array, "a", "c")
    assert_in_order(array, "c", "d")
    assert_in_order(array, "b", "c")
    assert_in_order(array, "d", "e")
    array = merge_libs(%w[a c d], %w[c b e])
    assert_in_order(array, "a", "c")
    assert_in_order(array, "c", "d")
    assert_in_order(array, "c", "b")
    assert_in_order(array, "b", "e")
  end
  def test_cyclic
    array = merge_libs(%w[a c d], %w[b c b])
    assert_in_order(array, "a", "c")
    assert_in_order(array, "c", "d")
    assert_in_order(array, "b", "c")
    assert_in_order(array, "c", "b")
    array = merge_libs(%w[a c a d], %w[b c b])
    assert_in_order(array, "a", "c")
    assert_in_order(array, "c", "a")
    assert_in_order(array, "c", "d")
    assert_in_order(array, "a", "d")
    assert_in_order(array, "b", "c")
    assert_in_order(array, "c", "b")
  end
end
