# Copyright 2010 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2

from portage.tests import TestCase
from portage.tests.resolver.ResolverPlayground import (
    ResolverPlayground,
    ResolverPlaygroundTestCase,
)


class MergelistOutputTestCase(TestCase):
    def testMergelistOutput(self):
        """
        This test doesn't check if the output is correct, but makes sure
        that we don't backtrace somewhere in the output code.
        """
        ebuilds = {
            "dev-libs/A-1": {
                "DEPEND": "dev-libs/B dev-libs/C",
                "IUSE": "+foo",
                "EAPI": 1,
            },
            "dev-libs/B-1": {"DEPEND": "dev-libs/D", "IUSE": "foo +bar", "EAPI": 1},
            "dev-libs/C-1": {"DEPEND": "dev-libs/E", "IUSE": "foo bar"},
            "dev-libs/D-1": {"IUSE": ""},
            "dev-libs/E-1": {},
            # reinstall for flags
            "dev-libs/Z-1": {"IUSE": "+foo", "EAPI": 1},
            "dev-libs/Y-1": {"IUSE": "foo", "EAPI": 1},
            "dev-libs/X-1": {},
            "dev-libs/W-1": {"IUSE": "+foo", "EAPI": 1},
        }

        installed = {
            "dev-libs/Z-1": {"USE": "", "IUSE": "foo"},
            "dev-libs/Y-1": {"USE": "foo", "IUSE": "+foo", "EAPI": 1},
            "dev-libs/X-1": {"USE": "foo", "IUSE": "+foo", "EAPI": 1},
            "dev-libs/W-1": {},
        }

        option_cobos = (
            (),
            ("verbose",),
            ("tree",),
            (
                "tree",
                "unordered-display",
            ),
            ("verbose",),
            (
                "verbose",
                "tree",
            ),
            (
                "verbose",
                "tree",
                "unordered-display",
            ),
        )

        test_cases = []
        for options in option_cobos:
            testcase_opts = {}
            for opt in options:
                testcase_opts["--" + opt] = True

            test_cases.append(
                ResolverPlaygroundTestCase(
                    ["dev-libs/A"],
                    options=testcase_opts,
                    success=True,
                    ignore_mergelist_order=True,
                    mergelist=[
                        "dev-libs/D-1",
                        "dev-libs/E-1",
                        "dev-libs/C-1",
                        "dev-libs/B-1",
                        "dev-libs/A-1",
                    ],
                )
            )

            test_cases.append(
                ResolverPlaygroundTestCase(
                    ["dev-libs/Z"],
                    options=testcase_opts,
                    success=True,
                    mergelist=["dev-libs/Z-1"],
                )
            )

            test_cases.append(
                ResolverPlaygroundTestCase(
                    ["dev-libs/Y"],
                    options=testcase_opts,
                    success=True,
                    mergelist=["dev-libs/Y-1"],
                )
            )

            test_cases.append(
                ResolverPlaygroundTestCase(
                    ["dev-libs/X"],
                    options=testcase_opts,
                    success=True,
                    mergelist=["dev-libs/X-1"],
                )
            )

            test_cases.append(
                ResolverPlaygroundTestCase(
                    ["dev-libs/W"],
                    options=testcase_opts,
                    success=True,
                    mergelist=["dev-libs/W-1"],
                )
            )

        playground = ResolverPlayground(ebuilds=ebuilds, installed=installed)
        try:
            for test_case in test_cases:
                playground.run_TestCase(test_case)
                self.assertEqual(test_case.test_success, True, test_case.fail_msg)
        finally:
            playground.cleanup()
