# 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.

import unittest

from src.build import git_prepare_commit


class TestGitPrepareCommit(unittest.TestCase):
  def test_add_mandatory_lines(self):
    self.assertEqual(
        ['\n', 'TEST=\n', 'PERF=\n', 'BUG=\n', '\n'],
        git_prepare_commit.add_mandatory_lines([]))
    self.assertEqual(
        ['\n', 'TEST=\n', 'PERF=\n', 'BUG=\n', '\n', '# comment\n'],
        git_prepare_commit.add_mandatory_lines(['# comment\n']))
    self.assertEqual(
        ['TEST=foobar\n', 'PERF=N/A\n', 'BUG=999999\n', '# comment\n'],
        git_prepare_commit.add_mandatory_lines(
            ['TEST=foobar\n', 'PERF=N/A\n', 'BUG=999999\n', '# comment\n']))
    # Only nonexistent prefixes should be inserted.
    self.assertEqual(
        ['TEST=foobar\n', 'PERF=N/A\n', 'BUG=\n', '\n', 'Change-Id:'],
        git_prepare_commit.add_mandatory_lines(
            ['TEST=foobar\n', 'PERF=N/A\n', '\n', 'Change-Id:']))

  def test_get_bug_ids_from_diff(self):
    diffs = ['''diff --git a/path/to/x b/path/to/x
index 1d91473..f56a7aa 100755
--- a/path/to/x
+++ b/path/to/x
@@ -44,9 +44,9 @@ something
 crbug.com/111111

+ crbug.com/222222
+ crbug.com/333333
- crbug.com/333333
- crbug.com/444444
- crbug.com/555555
- crbug.com/666666
- crbug.com/invalid

''',
             '''diff --git a/path/to/x b/path/to/x
index 1d91473..f56a7aa 100755
--- a/path/to/x
+++ b/path/to/x
@@ -44,9 +44,9 @@ something
+ crbug.com/666666
''']
    self.assertEqual(set(('444444', '555555')),
                     git_prepare_commit.get_bug_ids_from_diffs(diffs))

  def test_update_bug_line(self):
    self.assertEqual(
        ['foobar\n', 'BUG=111111, 222222\n'],
        git_prepare_commit.update_bug_line(['foobar\n', 'BUG=\n'],
                                           set(('111111', '222222'))))
    self.assertEqual(
        ['BUG=333333\n', '# Suggestion: BUG=111111, 222222, 333333\n'],
        git_prepare_commit.update_bug_line(['BUG=333333\n'],
                                           set(('111111', '222222'))))
    # There must not be duplicated IDs.
    self.assertEqual(
        ['BUG=222222, 333333\n', '# Suggestion: BUG=111111, 222222, 333333\n'],
        git_prepare_commit.update_bug_line(['BUG=333333, 222222\n'],
                                           set(('111111', '222222'))))

    # Nothing should be done when no bug ID is specified.
    self.assertEqual(
        ['BUG=N/A\n'],
        git_prepare_commit.update_bug_line(['BUG=N/A\n'], set()))
    self.assertEqual(
        ['BUG=\n'],
        git_prepare_commit.update_bug_line(['BUG=\n'], set()))

    # N/A or None should not be replaced by bug IDs.
    self.assertEqual(
        ['BUG=N/A\n', '# Suggestion: BUG=111111, 222222\n'],
        git_prepare_commit.update_bug_line(['BUG=N/A\n'],
                                           set(('111111', '222222'))))
    self.assertEqual(
        ['BUG=nOnE\n', '# Suggestion: BUG=111111, 222222\n'],
        git_prepare_commit.update_bug_line(['BUG=nOnE\n'],
                                           set(('111111', '222222'))))

    # An empty bug line should be replaced by bug IDs.
    self.assertEqual(
        ['BUG=111111, 222222\n'],
        git_prepare_commit.update_bug_line(['BUG=\n'],
                                           set(('111111', '222222'))))

    # Unknown type of bug description should be preserved.
    self.assertEqual(
        ['BUG=native_client:3456\n',
         '# Suggestion: BUG=111111, native_client:3456\n'],
        git_prepare_commit.update_bug_line(['BUG=native_client:3456\n'],
                                           set(['111111'])))

    # When no BUG= line is found, do nothing.
    self.assertEqual(
        ['foobar'],
        git_prepare_commit.update_bug_line(['foobar'], set(['111111'])))


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