# Copyright (C) 2011 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.

'''Unit tests for watchlist.py.'''

import unittest

from webkitpy.common.checkout.diff_test_data import DIFF_TEST_DATA
from webkitpy.common.watchlist.watchlistparser import WatchListParser


class WatchListTest(unittest.TestCase):
    def setUp(self):
        self._watch_list_parser = WatchListParser()

    def test_filename_definition_no_matches(self):
        watch_list = self._watch_list_parser.parse(
            '{'
            '    "DEFINITIONS": {'
            '        "WatchList1": {'
            '            "filename": r".*\\MyFileName\\.cpp",'
            '        },'
            '     },'
            '    "CC_RULES": {'
            '        "WatchList1": ['
            '            "levin@chromium.org",'
            '        ],'
           '    },'
            '}')
        self.assertEqual(set([]), watch_list.find_matching_definitions(DIFF_TEST_DATA))

    def test_filename_definition(self):
        watch_list = self._watch_list_parser.parse(
            '{'
            '    "DEFINITIONS": {'
            '        "WatchList1": {'
            '            "filename": r"WebCore/rendering/style/StyleFlexibleBoxData\.h",'
            '        },'
            '     },'
            '    "CC_RULES": {'
            '        "WatchList1": ['
            '            "levin@chromium.org",'
            '        ],'
           '    },'
            '}')
        self.assertEqual(set(['WatchList1']), watch_list.find_matching_definitions(DIFF_TEST_DATA))

    def test_cc_rules_simple(self):
        watch_list = self._watch_list_parser.parse(
            '{'
            '    "DEFINITIONS": {'
            '        "WatchList1": {'
            '            "filename": r"WebCore/rendering/style/StyleFlexibleBoxData\.h",'
            '        },'
            '     },'
            '    "CC_RULES": {'
            '        "WatchList1": ['
            '            "levin@chromium.org",'
            '        ],'
           '    },'
            '}')
        cc_and_messages = watch_list.determine_cc_and_messages(DIFF_TEST_DATA)
        self.assertEqual({
                'cc_list': ['levin@chromium.org'],
                'messages': [],
                }, cc_and_messages)

    def test_cc_rules_complex(self):
        watch_list = self._watch_list_parser.parse(
            '{'
            '    "DEFINITIONS": {'
            '        "WatchList1": {'
            '            "filename": r"WebCore/rendering/style/StyleFlexibleBoxData\.h",'
            '        },'
            '        "WatchList2": {'
            '            "filename": r"WillNotMatch",'
            '        },'
            '        "WatchList3": {'
            '            "filename": r"WillNotMatch",'
            '        },'
            '     },'
            '    "CC_RULES": {'
            '        "WatchList2|WatchList1|WatchList3": [ "levin@chromium.org", ],'
            '    },'
            '}')
        cc_and_messages = watch_list.determine_cc_and_messages(DIFF_TEST_DATA)
        self.assertEqual({
                'cc_list': ['levin@chromium.org'],
                'messages': [],
                }, cc_and_messages)

    def test_cc_and_message_rules_complex(self):
        watch_list = self._watch_list_parser.parse(
            '{'
            '    "DEFINITIONS": {'
            '        "WatchList1": {'
            '            "filename": r"WebCore/rendering/style/StyleFlexibleBoxData\.h",'
            '        },'
            '        "WatchList2": {'
            '            "filename": r"WillNotMatch",'
            '        },'
            '        "WatchList3": {'
            '            "filename": r"WillNotMatch",'
            '        },'
            '     },'
            '    "CC_RULES": {'
            '        "WatchList2|WatchList1|WatchList3": [ "levin@chromium.org", ],'
            '    },'
            '    "MESSAGE_RULES": {'
            '        "WatchList2|WatchList1|WatchList3": [ "msg1", "msg2", ],'
            '    },'
            '}')
        cc_and_messages = watch_list.determine_cc_and_messages(DIFF_TEST_DATA)
        self.assertEqual({
                'cc_list': ['levin@chromium.org'],
                'messages': ['msg1', 'msg2'],
                }, cc_and_messages)

    def test_cc_and_message_rules_no_matches(self):
        watch_list = self._watch_list_parser.parse(
            '{'
            '    "DEFINITIONS": {'
            '        "WatchList1": {'
            '            "filename": r"WebCore/rendering/style/ThisFileDoesNotExist\.h",'
            '        },'
            '        "WatchList2": {'
            '            "filename": r"WillNotMatch",'
            '        },'
            '        "WatchList3": {'
            '            "filename": r"WillNotMatch",'
            '        },'
            '     },'
            '    "CC_RULES": {'
            '        "WatchList2|WatchList1|WatchList3": [ "levin@chromium.org", ],'
            '    },'
            '    "MESSAGE_RULES": {'
            '        "WatchList2|WatchList1|WatchList3": [ "msg1", "msg2", ],'
            '    },'
            '}')
        cc_and_messages = watch_list.determine_cc_and_messages(DIFF_TEST_DATA)
        self.assertEqual({
                'cc_list': [],
                'messages': [],
                }, cc_and_messages)

    def test_added_match(self):
        watch_list = self._watch_list_parser.parse(
            '{'
            '    "DEFINITIONS": {'
            '        "WatchList1": {'
            '            "in_added_lines": r"RenderStyle::initialBoxOrient",'
            '        },'
            '        "WatchList2": {'
            '            "in_deleted_lines": r"RenderStyle::initialBoxOrient",'
            '        },'
            '     },'
            '    "CC_RULES": {'
            '        "WatchList1": [ "eric@webkit.org", ],'
            '        "WatchList2": [ "abarth@webkit.org", ],'
            '    },'
            '}')
        cc_and_messages = watch_list.determine_cc_and_messages(DIFF_TEST_DATA)
        self.assertEqual({
                'cc_list': ['eric@webkit.org'],
                'messages': [],
                }, cc_and_messages)

    def test_deleted_match(self):
        watch_list = self._watch_list_parser.parse(
            '{'
            '    "DEFINITIONS": {'
            '        "WatchList1": {'
            '            "in_added_lines": r"unsigned orient: 1;",'
            '        },'
            '        "WatchList2": {'
            '            "in_deleted_lines": r"unsigned orient: 1;",'
            '        },'
            '     },'
            '    "CC_RULES": {'
            '        "WatchList1": [ "eric@webkit.org", ],'
            '        "WatchList2": [ "abarth@webkit.org", ],'
            '    },'
            '}')
        cc_and_messages = watch_list.determine_cc_and_messages(DIFF_TEST_DATA)
        self.assertEqual({
                'cc_list': ['abarth@webkit.org'],
                'messages': [],
                }, cc_and_messages)

    def test_more_and_less_match(self):
        watch_list = self._watch_list_parser.parse(
            '{'
            '    "DEFINITIONS": {'
            '        "WatchList1": {'
            # This pattern is in both added and deleted lines, so no match.
            '            "more": r"userSelect == o\.userSelect",'
            '        },'
            '        "WatchList2": {'
            '            "more": r"boxOrient\(o\.boxOrient\)",'
            '        },'
            '        "WatchList3": {'
            '            "less": r"unsigned orient"'
            '        },'
            '     },'
            '    "CC_RULES": {'
            '        "WatchList1": [ "eric@webkit.org", ],'
            '        "WatchList2": [ "levin@chromium.org", ],'
            '    },'
            '    "MESSAGE_RULES": {'
            '        "WatchList3": ["Test message."],'
            '    },'
            '}')
        cc_and_messages = watch_list.determine_cc_and_messages(DIFF_TEST_DATA)
        self.assertEqual({
                'cc_list': ['levin@chromium.org'],
                'messages': ["Test message."],
                }, cc_and_messages)

    def test_complex_match(self):
        watch_list = self._watch_list_parser.parse(
            '{'
            '    "DEFINITIONS": {'
            '        "WatchList1": {'
            '            "filename": r"WebCore/rendering/style/StyleRareInheritedData\.cpp",'
            '            "in_added_lines": r"\&\& boxOrient == o\.boxOrient;",'
            '            "in_deleted_lines": r"\&\& userSelect == o\.userSelect;",'
            '            "more": r"boxOrient\(o\.boxOrient\)",'
            '        },'
            '        "WatchList2": {'
            '            "filename": r"WebCore/rendering/style/StyleRareInheritedData\.cpp",'
            '            "in_added_lines": r"RenderStyle::initialBoxOrient",'
            '            "less": r"userSelect;"'
            '        },'
            # WatchList3 won't match because these two patterns aren't in the same file.
            '        "WatchList3": {'
            '            "in_added_lines": r"RenderStyle::initialBoxOrient",'
            '            "in_deleted_lines": r"unsigned orient: 1;",'
            '        },'
            '     },'
            '    "CC_RULES": {'
            '        "WatchList1": [ "eric@webkit.org", ],'
            '        "WatchList3": [ "abarth@webkit.org", ],'
            '    },'
            '    "MESSAGE_RULES": {'
            '        "WatchList2": ["This is a test message."],'
            '    },'
            '}')
        cc_and_messages = watch_list.determine_cc_and_messages(DIFF_TEST_DATA)
        self.assertEqual({
                'cc_list': ['eric@webkit.org'],
                'messages': ["This is a test message."],
                }, cc_and_messages)
