# Copyright (C) 2009 Google Inc. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
#    * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#    * Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following disclaimer # in the documentation and/or other materials provided with the
# distribution.
#    * Neither the name of Google Inc. nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

import unittest
from webkitpy.common.config.committers import CommitterList, Contributor, Committer, Reviewer

from webkitpy.test.markers import xfail


class CommittersTest(unittest.TestCase):
    def test_committer_lookup(self):
        committer = Committer('Test One', 'one@test.com', 'one')
        reviewer = Reviewer('Test Two', ['two@test.com', 'Two@rad.com', 'so_two@gmail.com'])
        contributor = Contributor('Test Three', ['Three@test.com'], 'three')
        contributor_with_two_nicknames = Contributor('Other Four', ['otherfour@webkit.org', 'otherfour@webkit2.org'], ['four', 'otherfour'])
        contributor_with_same_email_username = Contributor('Yet Another Four', ['otherfour@webkit.com'], ['yetanotherfour'])
        committer_list = CommitterList(committers=[committer], reviewers=[reviewer],
            contributors=[contributor, contributor_with_two_nicknames, contributor_with_same_email_username])

        # Test valid committer, reviewer and contributor lookup
        self.assertEqual(committer_list.committer_by_email('one@test.com'), committer)
        self.assertEqual(committer_list.reviewer_by_email('two@test.com'), reviewer)
        self.assertEqual(committer_list.committer_by_email('two@test.com'), reviewer)
        self.assertEqual(committer_list.committer_by_email('two@rad.com'), reviewer)
        self.assertEqual(committer_list.reviewer_by_email('so_two@gmail.com'), reviewer)
        self.assertEqual(committer_list.contributor_by_email('three@test.com'), contributor)

        # Test valid committer, reviewer and contributor lookup
        self.assertEqual(committer_list.committer_by_name("Test One"), committer)
        self.assertEqual(committer_list.committer_by_name("Test Two"), reviewer)
        self.assertIsNone(committer_list.committer_by_name("Test Three"))
        self.assertEqual(committer_list.contributor_by_name("Test Three"), contributor)
        self.assertEqual(committer_list.contributor_by_name("test one"), committer)
        self.assertEqual(committer_list.contributor_by_name("test two"), reviewer)
        self.assertEqual(committer_list.contributor_by_name("test three"), contributor)

        # Test that the first email is assumed to be the Bugzilla email address (for now)
        self.assertEqual(committer_list.committer_by_email('two@rad.com').bugzilla_email(), 'two@test.com')

        # Test that a known committer is not returned during reviewer lookup
        self.assertIsNone(committer_list.reviewer_by_email('one@test.com'))
        self.assertIsNone(committer_list.reviewer_by_email('three@test.com'))
        # and likewise that a known contributor is not returned for committer lookup.
        self.assertIsNone(committer_list.committer_by_email('three@test.com'))

        # Test that unknown email address fail both committer and reviewer lookup
        self.assertIsNone(committer_list.committer_by_email('bar@bar.com'))
        self.assertIsNone(committer_list.reviewer_by_email('bar@bar.com'))

        # Test that emails returns a list.
        self.assertEqual(committer.emails, ['one@test.com'])

        self.assertEqual(committer.irc_nicknames, ['one'])
        self.assertEqual(committer_list.contributor_by_irc_nickname('one'), committer)
        self.assertEqual(committer_list.contributor_by_irc_nickname('three'), contributor)
        self.assertEqual(committer_list.contributor_by_irc_nickname('four'), contributor_with_two_nicknames)
        self.assertEqual(committer_list.contributor_by_irc_nickname('otherfour'), contributor_with_two_nicknames)

        # Test that the lists returned are are we expect them.
        self.assertEqual(committer_list.contributors(), [contributor, contributor_with_two_nicknames, contributor_with_same_email_username, committer, reviewer])
        self.assertEqual(committer_list.committers(), [committer, reviewer])
        self.assertEqual(committer_list.reviewers(), [reviewer])

        self.assertEqual(committer_list.contributors_by_search_string('test'), [contributor, committer, reviewer])
        self.assertEqual(committer_list.contributors_by_search_string('rad'), [reviewer])
        self.assertEqual(committer_list.contributors_by_search_string('Two'), [reviewer])
        self.assertEqual(committer_list.contributors_by_search_string('otherfour'), [contributor_with_two_nicknames])
        self.assertEqual(committer_list.contributors_by_search_string('*otherfour*'), [contributor_with_two_nicknames, contributor_with_same_email_username])

        self.assertEqual(committer_list.contributors_by_email_username("one"), [committer])
        self.assertEqual(committer_list.contributors_by_email_username("four"), [])
        self.assertEqual(committer_list.contributors_by_email_username("otherfour"), [contributor_with_two_nicknames, contributor_with_same_email_username])

    def _assert_fuzz_match(self, text, name_of_expected_contributor, expected_distance):
        committers = CommitterList()
        contributors, distance = committers.contributors_by_fuzzy_match(text)
        if type(name_of_expected_contributor) is list:
            expected_names = name_of_expected_contributor
        else:
            expected_names = [name_of_expected_contributor] if name_of_expected_contributor else []
        self.assertEqual(([contributor.full_name for contributor in contributors], distance), (expected_names, expected_distance))

    # Test that the string representation of a Contributor supports unicode
    def test_contributor_encoding(self):
        committer_encoding = Contributor(u'\u017dan M\u00fcller', 'zmuller@example.com', 'zmuller')
        self.assertTrue(str(committer_encoding))

    # Basic testing of the edit distance matching ...
    def test_contributors_by_fuzzy_match(self):
        self._assert_fuzz_match('Geof Garen', 'Geoffrey Garen', 4)
        self._assert_fuzz_match('Sam', 'Sam Weinig', 0)

    # The remaining tests test that certain names are resolved in a specific way.
    # We break this up into multiple tests so that each is faster and they can
    # be run in parallel. Unfortunately each test scans the entire committers list,
    # so these are inherently slow (see https://bugs.webkit.org/show_bug.cgi?id=79179).
    #
    # Commented out lines are test cases imported from the bug 26533 yet to pass.

    def integration_test_contributors__none(self):
        self._assert_fuzz_match('myself', None, 6)
        self._assert_fuzz_match('others', None, 6)
        self._assert_fuzz_match('BUILD FIX', None, 9)

    def integration_test_contributors__none_2(self):
        self._assert_fuzz_match('but Dan Bernstein also reviewed', None, 31)
        self._assert_fuzz_match('asked thoughtful questions', None, 26)
        self._assert_fuzz_match('build fix of mac', None, 16)

    def integration_test_contributors__none_3(self):
        self._assert_fuzz_match('a spell checker', None, 15)
        self._assert_fuzz_match('nobody, build fix', None, 17)
        self._assert_fuzz_match('NOBODY (chromium build fix)', None, 27)

    def integration_test_contributors_ada_chan(self):
        self._assert_fuzz_match('Ada', 'Ada Chan', 0)

    def integration_test_contributors_adele_peterson(self):
        self._assert_fuzz_match('adele', 'Adele Peterson', 0)

    def integration_test_contributors_adele_peterson(self):
        # self._assert_fuzz_match('Adam', 'Adam Roben', 0)
        self._assert_fuzz_match('aroben', 'Adam Roben', 0)

    def integration_test_contributors_alexey_proskuryakov(self):
        # self._assert_fuzz_match('Alexey', 'Alexey Proskuryakov', 0)
        self._assert_fuzz_match('ap', 'Alexey Proskuryakov', 0)
        self._assert_fuzz_match('Alexey P', 'Alexey Proskuryakov', 0)

    @xfail
    def integration_test_contributors_alice_liu(self):
        # self._assert_fuzz_match('Alice', 'Alice Liu', 0)
        self._assert_fuzz_match('aliu', 'Alice Liu', 0)
        self._assert_fuzz_match('Liu', 'Alice Liu', 0)

    def integration_test_contributors_alp_toker(self):
        self._assert_fuzz_match('Alp', 'Alp Toker', 0)

    def integration_test_contributors_anders_carlsson(self):
        self._assert_fuzz_match('Anders', 'Anders Carlsson', 0)
        self._assert_fuzz_match('andersca', 'Anders Carlsson', 0)
        self._assert_fuzz_match('anders', 'Anders Carlsson', 0)
        self._assert_fuzz_match('Andersca', 'Anders Carlsson', 0)

    def integration_test_contributors_antti_koivisto(self):
        self._assert_fuzz_match('Antti "printf" Koivisto', 'Antti Koivisto', 9)
        self._assert_fuzz_match('Antti', 'Antti Koivisto', 0)

    def integration_test_contributors_beth_dakin(self):
        self._assert_fuzz_match('Beth', 'Beth Dakin', 0)
        self._assert_fuzz_match('beth', 'Beth Dakin', 0)
        self._assert_fuzz_match('bdakin', 'Beth Dakin', 0)

    def integration_test_contributors_brady_eidson(self):
        self._assert_fuzz_match('Brady', 'Brady Eidson', 0)
        self._assert_fuzz_match('bradee-oh', 'Brady Eidson', 0)
        self._assert_fuzz_match('Brady', 'Brady Eidson', 0)

    def integration_test_contributors_cameron_zwarich(self):
        pass  # self._assert_fuzz_match('Cameron', 'Cameron Zwarich', 0)
        # self._assert_fuzz_match('cpst', 'Cameron Zwarich', 1)

    def integration_test_contributors_chris_blumenberg(self):
        # self._assert_fuzz_match('Chris', 'Chris Blumenberg', 0)
        self._assert_fuzz_match('cblu', 'Chris Blumenberg', 0)

    @xfail
    def integration_test_contributors_dan_bernstein(self):
        self._assert_fuzz_match('Dan', ['Dan Winship', 'Dan Bernstein'], 0)
        self._assert_fuzz_match('Dan B', 'Dan Bernstein', 0)
        # self._assert_fuzz_match('mitz', 'Dan Bernstein', 0)
        self._assert_fuzz_match('Mitz Pettel', 'Dan Bernstein', 1)
        self._assert_fuzz_match('Mitzpettel', 'Dan Bernstein', 0)
        self._assert_fuzz_match('Mitz Pettel RTL', 'Dan Bernstein', 5)

    def integration_test_contributors_dan_bernstein_2(self):
        self._assert_fuzz_match('Teh Mitzpettel', 'Dan Bernstein', 4)
        # self._assert_fuzz_match('The Mitz', 'Dan Bernstein', 0)
        self._assert_fuzz_match('Dr Dan Bernstein', 'Dan Bernstein', 3)

    def integration_test_contributors_darin_adler(self):
        self._assert_fuzz_match('Darin Adler\'', 'Darin Adler', 1)
        self._assert_fuzz_match('Darin', 'Darin Adler', 0)  # Thankfully "Fisher" is longer than "Adler"
        self._assert_fuzz_match('darin', 'Darin Adler', 0)

    def integration_test_contributors_david_harrison(self):
        self._assert_fuzz_match('Dave Harrison', 'David Harrison', 2)
        self._assert_fuzz_match('harrison', 'David Harrison', 0)
        self._assert_fuzz_match('Dr. Harrison', 'David Harrison', 4)

    @xfail
    def integration_test_contributors_david_harrison_2(self):
        self._assert_fuzz_match('Dave Harrson', 'David Harrison', 3)
        self._assert_fuzz_match('Dave Harrsion', 'David Harrison', 4)  # Damerau-Levenshtein distance is 3

    @xfail
    def integration_test_contributors_david_hyatt(self):
        self._assert_fuzz_match('Dave Hyatt', 'David Hyatt', 2)
        self._assert_fuzz_match('Daddy Hyatt', 'David Hyatt', 3)
        # self._assert_fuzz_match('Dave', 'David Hyatt', 0)  # 'Dave' could mean harrison.
        self._assert_fuzz_match('hyatt', 'David Hyatt', 0)
        # self._assert_fuzz_match('Haytt', 'David Hyatt', 0)  # Works if we had implemented Damerau-Levenshtein distance!

    @xfail
    def integration_test_contributors_david_kilzer(self):
        self._assert_fuzz_match('Dave Kilzer', 'David Kilzer', 2)
        self._assert_fuzz_match('David D. Kilzer', 'David Kilzer', 3)
        self._assert_fuzz_match('ddkilzer', 'David Kilzer', 0)

    @xfail
    def integration_test_contributors_don_melton(self):
        self._assert_fuzz_match('Don', 'Don Melton', 0)
        self._assert_fuzz_match('Gramps', 'Don Melton', 0)

    def integration_test_contributors_eric_seidel(self):
        # self._assert_fuzz_match('eric', 'Eric Seidel', 0)
        self._assert_fuzz_match('Eric S', 'Eric Seidel', 0)
        # self._assert_fuzz_match('MacDome', 'Eric Seidel', 0)
        self._assert_fuzz_match('eseidel', 'Eric Seidel', 0)

    @xfail
    def integration_test_contributors_geoffrey_garen(self):
        # self._assert_fuzz_match('Geof', 'Geoffrey Garen', 4)
        # self._assert_fuzz_match('Geoff', 'Geoffrey Garen', 3)
        self._assert_fuzz_match('Geoff Garen', 'Geoffrey Garen', 3)
        self._assert_fuzz_match('ggaren', 'Geoffrey Garen', 0)
        # self._assert_fuzz_match('geoff', 'Geoffrey Garen', 0)
        self._assert_fuzz_match('Geoffrey', 'Geoffrey Garen', 0)
        self._assert_fuzz_match('GGaren', 'Geoffrey Garen', 0)

    def integration_test_contributors_greg_bolsinga(self):
        pass  # self._assert_fuzz_match('Greg', 'Greg Bolsinga', 0)

    @xfail
    def integration_test_contributors_holger_freyther(self):
        self._assert_fuzz_match('Holger', 'Holger Freyther', 0)
        self._assert_fuzz_match('Holger Hans Peter Freyther', 'Holger Freyther', 11)

    def integration_test_contributors_jon_sullivan(self):
        # self._assert_fuzz_match('john', 'John Sullivan', 0)
        self._assert_fuzz_match('sullivan', 'John Sullivan', 0)

    def integration_test_contributors_jon_honeycutt(self):
        self._assert_fuzz_match('John Honeycutt', 'Jon Honeycutt', 1)
        # self._assert_fuzz_match('Jon', 'Jon Honeycutt', 0)

    def integration_test_contributors_jon_honeycutt(self):
        # self._assert_fuzz_match('justin', 'Justin Garcia', 0)
        self._assert_fuzz_match('justing', 'Justin Garcia', 0)

    @xfail
    def integration_test_contributors_joseph_pecoraro(self):
        self._assert_fuzz_match('Joe Pecoraro', 'Joseph Pecoraro', 3)

    @xfail
    def integration_test_contributors_ken_kocienda(self):
        self._assert_fuzz_match('ken', 'Ken Kocienda', 0)
        self._assert_fuzz_match('kocienda', 'Ken Kocienda', 0)

    @xfail
    def integration_test_contributors_kenneth_russell(self):
        self._assert_fuzz_match('Ken Russell', 'Kenneth Russell', 4)

    def integration_test_contributors_kevin_decker(self):
        self._assert_fuzz_match('kdecker', 'Kevin Decker', 0)

    def integration_test_contributors_kevin_mccullough(self):
        self._assert_fuzz_match('Kevin M', 'Kevin McCullough', 0)
        self._assert_fuzz_match('Kevin McCulough', 'Kevin McCullough', 1)
        self._assert_fuzz_match('mccullough', 'Kevin McCullough', 0)

    def integration_test_contributors_lars_knoll(self):
        self._assert_fuzz_match('lars', 'Lars Knoll', 0)

    def integration_test_contributors_lars_weintraub(self):
        self._assert_fuzz_match('levi', 'Levi Weintraub', 0)

    def integration_test_contributors_maciej_stachowiak(self):
        self._assert_fuzz_match('Maciej', 'Maciej Stachowiak', 0)
        # self._assert_fuzz_match('mjs', 'Maciej Stachowiak', 0)
        self._assert_fuzz_match('Maciej S', 'Maciej Stachowiak', 0)

    def integration_test_contributors_mark_rowe(self):
        # self._assert_fuzz_match('Mark', 'Mark Rowe', 0)
        self._assert_fuzz_match('bdash', 'Mark Rowe', 0)
        self._assert_fuzz_match('mrowe', 'Mark Rowe', 0)
        # self._assert_fuzz_match('Brian Dash', 'Mark Rowe', 0)

    @xfail
    def integration_test_contributors_nikolas_zimmermann(self):
        # self._assert_fuzz_match('Niko', 'Nikolas Zimmermann', 1)
        self._assert_fuzz_match('Niko Zimmermann', 'Nikolas Zimmermann', 3)
        self._assert_fuzz_match('Nikolas', 'Nikolas Zimmermann', 0)

    def integration_test_contributors_oliver_hunt(self):
        #  self._assert_fuzz_match('Oliver', 'Oliver Hunt', 0)
        self._assert_fuzz_match('Ollie', 'Oliver Hunt', 1)
        self._assert_fuzz_match('Olliej', 'Oliver Hunt', 0)
        self._assert_fuzz_match('Olliej Hunt', 'Oliver Hunt', 3)
        self._assert_fuzz_match('olliej', 'Oliver Hunt', 0)
        self._assert_fuzz_match('ollie', 'Oliver Hunt', 1)
        self._assert_fuzz_match('ollliej', 'Oliver Hunt', 1)

    def integration_test_contributors_oliver_hunt(self):
        self._assert_fuzz_match('Richard', 'Richard Williamson', 0)
        self._assert_fuzz_match('rjw', 'Richard Williamson', 0)

    def integration_test_contributors_oliver_hunt(self):
        self._assert_fuzz_match('Rob', 'Rob Buis', 0)
        self._assert_fuzz_match('rwlbuis', 'Rob Buis', 0)

    def integration_test_contributors_rniwa(self):
        self._assert_fuzz_match('rniwa@webkit.org', 'Ryosuke Niwa', 0)

    def disabled_integration_test_contributors_simon_fraser(self):
        pass  # self._assert_fuzz_match('Simon', 'Simon Fraser', 0)

    def integration_test_contributors_steve_falkenburg(self):
        self._assert_fuzz_match('Sfalken', 'Steve Falkenburg', 0)
        # self._assert_fuzz_match('Steve', 'Steve Falkenburg', 0)

    def integration_test_contributors_sam_weinig(self):
        self._assert_fuzz_match('Sam', 'Sam Weinig', 0)
        # self._assert_fuzz_match('Weinig Sam', 'weinig', 0)
        self._assert_fuzz_match('Weinig', 'Sam Weinig', 0)
        self._assert_fuzz_match('Sam W', 'Sam Weinig', 0)
        self._assert_fuzz_match('Sammy Weinig', 'Sam Weinig', 2)

    def integration_test_contributors_tim_omernick(self):
        # self._assert_fuzz_match('timo', 'Tim Omernick', 0)
        self._assert_fuzz_match('TimO', 'Tim Omernick', 0)
        # self._assert_fuzz_match('Timo O', 'Tim Omernick', 0)
        # self._assert_fuzz_match('Tim O.', 'Tim Omernick', 0)
        self._assert_fuzz_match('Tim O', 'Tim Omernick', 0)

    @xfail
    def integration_test_contributors_timothy_hatcher(self):
        # self._assert_fuzz_match('Tim', 'Timothy Hatcher', 0)
        # self._assert_fuzz_match('Tim H', 'Timothy Hatcher', 0)
        self._assert_fuzz_match('Tim Hatcher', 'Timothy Hatcher', 4)
        self._assert_fuzz_match('Tim Hatcheri', 'Timothy Hatcher', 5)
        self._assert_fuzz_match('timothy', 'Timothy Hatcher', 0)
        self._assert_fuzz_match('thatcher', 'Timothy Hatcher', 1)
        self._assert_fuzz_match('xenon', 'Timothy Hatcher', 0)
        self._assert_fuzz_match('Hatcher', 'Timothy Hatcher', 0)
        # self._assert_fuzz_match('TimH', 'Timothy Hatcher', 0)

    def integration_test_contributors_tor_arne_vestbo(self):
        self._assert_fuzz_match('Tor Arne', u"Tor Arne Vestb\u00f8", 1)  # Matches IRC nickname

    def integration_test_contributors_vicki_murley(self):
        self._assert_fuzz_match('Vicki', u"Vicki Murley", 0)

    def integration_test_contributors_zack_rusin(self):
        self._assert_fuzz_match('Zack', 'Zack Rusin', 0)
