# Copyright 2014 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 ChangedDepsTestCase(TestCase):

	def testChangedDeps(self):

		ebuilds = {
			"app-misc/A-0": {
				"DEPEND": "app-misc/B",
				"RDEPEND": "app-misc/B",
			},
			"app-misc/B-0": {
			}
		}

		binpkgs = {
			"app-misc/A-0": {},
		}

		installed = {
			"app-misc/A-0": {},
		}

		world= (
			"app-misc/A",
		)

		test_cases = (

			# --dynamic-deps=n causes the original deps to be respected
			ResolverPlaygroundTestCase(
				["@world"],
				success = True,
				options = {
					"--update": True,
					"--deep": True,
					"--dynamic-deps": "n",
					"--usepkg": True,
				},
				mergelist = []
			),

			# --dynamic-deps causes app-misc/B to get pulled in
			ResolverPlaygroundTestCase(
				["@world"],
				success = True,
				options = {
					"--update": True,
					"--deep": True,
					"--usepkg": True,
				},
				mergelist = ["app-misc/B-0"]
			),

			# --changed-deps causes app-misc/A to be rebuilt
			ResolverPlaygroundTestCase(
				["@world"],
				success = True,
				options = {
					"--update": True,
					"--deep": True,
					"--changed-deps": "y",
					"--usepkg": True,
				},
				mergelist = ["app-misc/B-0", "app-misc/A-0"]
			),

			# --usepkgonly prevents automatic --binpkg-changed-deps
			ResolverPlaygroundTestCase(
				["app-misc/A"],
				success = True,
				options = {
					"--changed-deps": "y",
					"--usepkgonly": True,
				},
				mergelist = ["[binary]app-misc/A-0"]
			),

			# Test automatic --binpkg-changed-deps, which cases the
			# binpkg with stale deps to be ignored (with warning
			# message)
			ResolverPlaygroundTestCase(
				["app-misc/A"],
				success = True,
				options = {
					"--usepkg": True,
				},
				mergelist = ["app-misc/B-0", "app-misc/A-0"]
			),
		)
		test_cases = (

			# Forcibly disable --binpkg-changed-deps, which causes
			# --changed-deps to be overridden by --binpkg-changed-deps
			ResolverPlaygroundTestCase(
				["app-misc/A"],
				success = True,
				options = {
					"--binpkg-changed-deps": "n",
					"--changed-deps": "y",
					"--usepkg": True,
				},
				mergelist = ["[binary]app-misc/A-0"]
			),
		)

		playground = ResolverPlayground(debug=False, ebuilds=ebuilds,
			binpkgs=binpkgs, installed=installed, world=world)
		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()
