# Copyright 2005 Divmod, Inc.  See LICENSE file for details

from twisted.trial import unittest

from axiom.store import Store
from axiom.dependency import installOn

from nevow.url import URL

from xmantissa import webnav
from xmantissa.webapp import PrivateApplication

class FakeNavigator1(object):
    def getTabs(self):
        return [webnav.Tab('Hello', 1234, 0.5,
                           [webnav.Tab('Super', 'sup', 1.0),
                            webnav.Tab('Mega', 'meg', 0.5)],
                           False)]

class FakeNavigator2(object):
    def getTabs(self):
        return [webnav.Tab('Hello', 5678, 1.,
                           [webnav.Tab('Ultra', 'ult', 0.75),
                            webnav.Tab('Hyper', 'hyp', 0.25)]),
                webnav.Tab('Goodbye', None, 0.9)]

class NavConfig(unittest.TestCase):

    def testTabMerge(self):
        nav = webnav.getTabs([FakeNavigator1(),
                              FakeNavigator2()])

        self.assertEquals(
            nav[0].name, 'Hello')
        self.assertEquals(
            nav[0].storeID, 5678)

        self.assertEquals(
            nav[1].name, 'Goodbye')

        kids = [x.name for x in nav[0].children]
        self.assertEquals(kids, ['Super', 'Ultra', 'Mega', 'Hyper'])

    def testSetTabURLs(self):
        """
        Check that L{webnav.setTabURLs} correctly sets the C{linkURL}
        attribute of L{webnav.Tab} instances to the result of
        passing tab.storeID to L{xmantissa.ixmantissa.IWebTranslator.linkTo}
        if C{linkURL} is not set, and that it leaves it alone if it is
        """

        s = Store()

        privapp = PrivateApplication(store=s)
        installOn(privapp,s)

        tabs = [webnav.Tab('PrivateApplication', privapp.storeID, 0),
                webnav.Tab('Something Else', None, 0, linkURL='/foo/bar')]

        webnav.setTabURLs(tabs, privapp)

        self.assertEqual(tabs[0].linkURL, privapp.linkTo(privapp.storeID))
        self.assertEqual(tabs[1].linkURL, '/foo/bar')

    def testGetSelectedTabExactMatch(self):
        """
        Check that L{webnav.getSelectedTab} returns the tab whose C{linkURL}
        attribute exactly matches the path of the L{nevow.url.URL} it is passed
        """

        tabs = list(webnav.Tab(str(i), None, 0, linkURL='/' + str(i))
                        for i in xrange(5))

        for (i, tab) in enumerate(tabs):
            selected = webnav.getSelectedTab(tabs, URL.fromString(tab.linkURL))
            self.assertIdentical(selected, tab)

        selected = webnav.getSelectedTab(tabs, URL.fromString('/XYZ'))
        self.failIf(selected)

    def testGetSelectedTabPrefixMatch(self):
        """
        Check that L[webnav.getSelectedTab} returns the tab whose C{linkURL}
        attribute contains the longest prefix of path segments that appears
        at the beginning of the L{nevow.url.URL} it is passed (if there is not
        an exact match)
        """

        tabs = [webnav.Tab('thing1', None, 0, linkURL='/a/b/c/d'),
                webnav.Tab('thing2', None, 0, linkURL='/a/b/c')]

        def assertSelected(tab):
            selected = webnav.getSelectedTab(tabs, URL.fromString('/a/b/c/d/e'))
            self.assertIdentical(selected, tab)

        assertSelected(tabs[0])
        tabs.reverse()
        assertSelected(tabs[1])

        tabs.append(webnav.Tab('thing3', None, 0, linkURL='a/b/c/e/e'))
        assertSelected(tabs[1])

        t = webnav.Tab('thing4', None, 0, linkURL='/a/b/c/d/e')
        tabs.append(t)
        assertSelected(t)


syntax highlighted by Code2HTML, v. 0.9.1