# test_best_match_to_list.py -- Portage Unit Testing Functionality
# Copyright 2010-2012 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2

from itertools import permutations

from portage.tests import TestCase
from portage.dep import Atom, best_match_to_list


class Test_best_match_to_list(TestCase):
    def best_match_to_list_wrapper(self, mypkg, mylist):
        """
        This function uses best_match_to_list to create sorted
        list of matching atoms.
        """
        ret = []
        mylist = list(mylist)
        while mylist:
            m = best_match_to_list(mypkg, mylist)
            if m is not None:
                ret.append(m)
                mylist.remove(m)
            else:
                break

        return ret

    def testBest_match_to_list(self):
        tests = [
            (
                "dev-libs/A-4",
                [Atom(">=dev-libs/A-3"), Atom(">=dev-libs/A-2")],
                [Atom(">=dev-libs/A-3"), Atom(">=dev-libs/A-2")],
                True,
            ),
            (
                "dev-libs/A-4",
                [Atom("<=dev-libs/A-5"), Atom("<=dev-libs/A-6")],
                [Atom("<=dev-libs/A-5"), Atom("<=dev-libs/A-6")],
                True,
            ),
            (
                "dev-libs/A-1",
                [Atom("dev-libs/A"), Atom("=dev-libs/A-1")],
                [Atom("=dev-libs/A-1"), Atom("dev-libs/A")],
                True,
            ),
            (
                "dev-libs/A-1",
                [Atom("dev-libs/B"), Atom("=dev-libs/A-1:0")],
                [Atom("=dev-libs/A-1:0")],
                True,
            ),
            (
                "dev-libs/A-1",
                [Atom("dev-libs/*", allow_wildcard=True), Atom("=dev-libs/A-1:0")],
                [Atom("=dev-libs/A-1:0"), Atom("dev-libs/*", allow_wildcard=True)],
                True,
            ),
            (
                "dev-libs/A-4.9999-r1",
                [
                    Atom("dev-libs/*", allow_wildcard=True),
                    Atom("=*/*-*9999*", allow_wildcard=True),
                ],
                [
                    Atom("=*/*-*9999*", allow_wildcard=True),
                    Atom("dev-libs/*", allow_wildcard=True),
                ],
                True,
            ),
            (
                "dev-libs/A-4_beta-r1",
                [
                    Atom("dev-libs/*", allow_wildcard=True),
                    Atom("=*/*-*_beta*", allow_wildcard=True),
                ],
                [
                    Atom("=*/*-*_beta*", allow_wildcard=True),
                    Atom("dev-libs/*", allow_wildcard=True),
                ],
                True,
            ),
            (
                "dev-libs/A-4_beta1-r1",
                [
                    Atom("dev-libs/*", allow_wildcard=True),
                    Atom("=*/*-*_beta*", allow_wildcard=True),
                ],
                [
                    Atom("=*/*-*_beta*", allow_wildcard=True),
                    Atom("dev-libs/*", allow_wildcard=True),
                ],
                True,
            ),
            (
                "dev-libs/A-1:0",
                [
                    Atom("dev-*/*", allow_wildcard=True),
                    Atom("dev-*/*:0", allow_wildcard=True),
                    Atom("dev-libs/A"),
                    Atom("<=dev-libs/A-2"),
                    Atom("dev-libs/A:0"),
                    Atom("=dev-libs/A-1*"),
                    Atom("~dev-libs/A-1"),
                    Atom("=dev-libs/A-1"),
                ],
                [
                    Atom("=dev-libs/A-1"),
                    Atom("~dev-libs/A-1"),
                    Atom("=dev-libs/A-1*"),
                    Atom("dev-libs/A:0"),
                    Atom("<=dev-libs/A-2"),
                    Atom("dev-libs/A"),
                    Atom("dev-*/*:0", allow_wildcard=True),
                    Atom("dev-*/*", allow_wildcard=True),
                ],
                False,
            ),
        ]

        for pkg, atom_list, result, all_permutations in tests:
            if all_permutations:
                atom_lists = permutations(atom_list)
            else:
                atom_lists = [atom_list]
            for atom_list in atom_lists:
                self.assertEqual(
                    self.best_match_to_list_wrapper(pkg, atom_list), result
                )
