# 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 CircularDependencyTestCase(TestCase):

	#TODO:
	#	use config change by autounmask
	#	conflict on parent's parent
	#	difference in RDEPEND and DEPEND
	#	is there anything else than priority buildtime and runtime?
	#	play with use.{mask,force}
	#	play with REQUIRED_USE
	

	def testCircularDependency(self):
		ebuilds = {
			"dev-libs/Z-1": { "DEPEND": "foo? ( !bar? ( dev-libs/Y ) )", "IUSE": "+foo bar", "EAPI": 1 }, 
			"dev-libs/Z-2": { "DEPEND": "foo? ( dev-libs/Y ) !bar? ( dev-libs/Y )", "IUSE": "+foo bar", "EAPI": 1 }, 
			"dev-libs/Z-3": { "DEPEND": "foo? ( !bar? ( dev-libs/Y ) ) foo? ( dev-libs/Y ) !bar? ( dev-libs/Y )", "IUSE": "+foo bar", "EAPI": 1 }, 
			"dev-libs/Y-1": { "DEPEND": "dev-libs/Z" },
			"dev-libs/W-1": { "DEPEND": "dev-libs/Z[foo] dev-libs/Y", "EAPI": 2 },
			"dev-libs/W-2": { "DEPEND": "dev-libs/Z[foo=] dev-libs/Y", "IUSE": "+foo", "EAPI": 2 },
			"dev-libs/W-3": { "DEPEND": "dev-libs/Z[bar] dev-libs/Y", "EAPI": 2 },

			#~ "app-misc/A-1": { "DEPEND": "foo? ( =app-misc/B-1 )", "IUSE": "+foo bar", "REQUIRED_USE": "^^ ( foo bar )", "EAPI": 4 },
			#~ "app-misc/A-2": { "DEPEND": "foo? ( =app-misc/B-2 ) bar? ( =app-misc/B-2 )", "IUSE": "+foo bar", "REQUIRED_USE": "^^ ( foo bar )", "EAPI": 4 },
			#~ "app-misc/B-1": { "DEPEND": "=app-misc/A-1" },
			#~ "app-misc/B-2": { "DEPEND": "=app-misc/A-2" },
			}

		test_cases = (
			#Simple tests
			ResolverPlaygroundTestCase(
				["=dev-libs/Z-1"],
				circular_dependency_solutions = { "dev-libs/Y-1": frozenset([frozenset([("foo", False)]), frozenset([("bar", True)])])},
				success = False),
			ResolverPlaygroundTestCase(
				["=dev-libs/Z-2"],
				circular_dependency_solutions = { "dev-libs/Y-1": frozenset([frozenset([("foo", False), ("bar", True)])])},
				success = False),
			ResolverPlaygroundTestCase(
				["=dev-libs/Z-3"],
				circular_dependency_solutions = { "dev-libs/Y-1": frozenset([frozenset([("foo", False), ("bar", True)])])},
				success = False),

			#Conflict on parent
			ResolverPlaygroundTestCase(
				["=dev-libs/W-1"],
				circular_dependency_solutions = {},
				success = False),
			ResolverPlaygroundTestCase(
				["=dev-libs/W-2"],
				circular_dependency_solutions = { "dev-libs/Y-1": frozenset([frozenset([("foo", False), ("bar", True)])])},
				success = False),

			#Conflict with autounmask
			ResolverPlaygroundTestCase(
				["=dev-libs/W-3"],
				options = { "--autounmask": True },
				circular_dependency_solutions = { "dev-libs/Y-1": frozenset([frozenset([("foo", False)])])},
				use_changes = { "dev-libs/Z-3": {"bar": True}},
				success = False),

			#Conflict with REQUIRED_USE
			#~ ResolverPlaygroundTestCase(
				#~ ["=app-misc/B-1"],
				#~ circular_dependency_solutions = { "app-misc/B-1": frozenset([frozenset([("foo", False), ("bar", True)])])},
				#~ success = False),
			#~ ResolverPlaygroundTestCase(
				#~ ["=app-misc/B-2"],
				#~ circular_dependency_solutions = {},
				#~ success = False),
		)

		playground = ResolverPlayground(ebuilds=ebuilds)
		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()
