#!/usr/bin/env python
# Copyright 2014 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

from link_dependencies import extract_inputs, library_deps
import unittest


class ExtractInputsTest(unittest.TestCase):
  def test_empty(self):
    self.assertListEqual([], extract_inputs(''))
    query_result = '\n'.join([
      'header',
      '  input: link',
      '  outputs: nothing',
      'footer'
    ])
    self.assertListEqual([], extract_inputs(query_result))

  def test_one_input(self):
    query_result = '\n'.join([
      'header',
      '  input: link',
      '    foo',
      '  outputs: link',
      '    quxx',
      'footer'
    ])
    self.assertListEqual(['foo'], extract_inputs(query_result))

  def test_many_inputs(self):
    query_result = '\n'.join([
      'header',
      '  input: link',
      '    foo',
      '    bar',
      '    baz',
      '  outputs:',
      '    quxx',
      'footer'
    ])
    self.assertListEqual(['foo', 'bar', 'baz'], extract_inputs(query_result))

  def test_no_pipe_inputs(self):
    query_result = '\n'.join([
      'header',
      '  input: link',
      '    |foo',
      '    bar',
      '    |baz',
      '  outputs:',
      '    quxx',
      'footer'
    ])
    self.assertListEqual(['bar'], extract_inputs(query_result))

  def test_prefix(self):
    query_result = '\n'.join([
      'header',
      '  input: link',
      '    bar',
      '  outputs:',
      'footer'
    ])
    self.assertListEqual(['foo/bar'],
                         extract_inputs(query_result, 'foo/'))


class LibraryDepsTest(unittest.TestCase):
  def mkquery(self, answers):
    """Creates a query function for library_deps.

    Creates a query function for library_deps that returns answers from the
    supplied map.
    """
    return lambda target, unused_workdir, unused_prefix='': answers[target]

  def test_empty(self):
    self.assertEqual(set(), library_deps([], 'wd', self.mkquery({})))

  def test_nonarch(self):
    deps = ['abc.a', 'def.o', 'abc.a']
    self.assertEqual({'wd/abc.a', 'wd/def.o'},
                     library_deps(deps, 'wd', self.mkquery({})))

  def test_arch(self):
    dep_map = {'abc': ['wd/def.a', 'wd/ghi.o']}
    deps = ['abc', 'jkl.o']
    self.assertEqual({'wd/def.a', 'wd/ghi.o', 'wd/jkl.o'},
                     library_deps(deps, 'wd', self.mkquery(dep_map)))

  def test_arch_many(self):
    dep_map = {'abc': ['wd/def.o', 'wd/ghi.a'],
               'def': ['wd/def.o', 'wd/jkl.a']}
    deps = ['abc', 'def', 'def.o']
    self.assertEqual({'wd/def.o', 'wd/ghi.a', 'wd/jkl.a'},
                     library_deps(deps, 'wd', self.mkquery(dep_map)))


if __name__ == '__main__':
  unittest.main()
