# Copyright 2013 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 SlotConflictUpdateTestCase(TestCase):

	def testSlotConflictUpdate(self):

		ebuilds = {

			"app-text/podofo-0.9.2" : {
				"EAPI": "5",
				"RDEPEND" : "dev-util/boost-build"
			},

			"dev-cpp/libcmis-0.3.1" : {
				"EAPI": "5",
				"RDEPEND" : "dev-libs/boost:="
			},

			"dev-libs/boost-1.53.0" : {
				"EAPI": "5",
				"SLOT": "0/1.53",
				"RDEPEND" : "=dev-util/boost-build-1.53.0"
			},

			"dev-libs/boost-1.52.0" : {
				"EAPI": "5",
				"SLOT": "0/1.52",
				"RDEPEND" : "=dev-util/boost-build-1.52.0"
			},

			"dev-util/boost-build-1.53.0" : {
				"EAPI": "5",
				"SLOT": "0"
			},

			"dev-util/boost-build-1.52.0" : {
				"EAPI": "5",
				"SLOT": "0"
			},


		}

		installed = {

			"app-text/podofo-0.9.2" : {
				"EAPI": "5",
				"RDEPEND" : "dev-util/boost-build"
			},

			"dev-cpp/libcmis-0.3.1" : {
				"EAPI": "5",
				"RDEPEND" : "dev-libs/boost:0/1.52="
			},

			"dev-util/boost-build-1.52.0" : {
				"EAPI": "5",
				"SLOT": "0"
			},

			"dev-libs/boost-1.52.0" : {
				"EAPI": "5",
				"SLOT": "0/1.52",
				"RDEPEND" : "=dev-util/boost-build-1.52.0"
			}

		}

		world = ["dev-cpp/libcmis", "dev-libs/boost", "app-text/podofo"]

		test_cases = (

			# In order to avoid a missed update, first mask lower
			# versions that conflict with higher versions. Note that
			# this behavior makes SlotConflictMaskUpdateTestCase
			# fail.
			ResolverPlaygroundTestCase(
				world,
				all_permutations = True,
				options = {"--update": True, "--deep": True},
				success = True,
				mergelist = ['dev-util/boost-build-1.53.0', 'dev-libs/boost-1.53.0', 'dev-cpp/libcmis-0.3.1']),

		)

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