1# -*- test-case-name: nevow.test.test_context -*-
2# Copyright (c) 2004 Divmod.
3# See LICENSE for details.
4
5import itertools
6import time
7
8import zope.interface as zi
9from twisted.python.components import registerAdapter
10
11from nevow import context
12from nevow import tags
13from nevow import inevow
14
15from nevow.testutil import TestCase
16
17
18class IStuff(zi.Interface): pass
19
20
21class TestRememberLocate(TestCase):
22    def test_basic(self):
23        top = context.WovenContext()
24        middle = context.WovenContext(top, tags.invisible())
25        bottom = context.WovenContext(middle, tags.invisible())
26        top.remember(0, IStuff)
27        self.assertEquals(bottom.locate(IStuff), 0)
28        middle.remember(1, IStuff)
29        self.assertEquals(bottom.locate(IStuff), 1)
30        self.assertEquals(bottom.locate(IStuff, depth=2), 0)
31
32    def test_reverse(self):
33        top = context.WovenContext().remember(0, IStuff)
34        bottom = context.WovenContext(top, tags.invisible()).remember(1, IStuff)
35        self.assertEquals(bottom.locate(IStuff, depth=-1), 0)
36
37    def test_page(self):
38        page = context.PageContext(tag=1)
39        page.remember(1, inevow.IData)
40        ctx = context.WovenContext(page, tags.invisible())
41        self.assertEquals(ctx.locate(inevow.IData), 1)
42        self.assertEquals(ctx.locate(inevow.IData, depth=-1), 1)
43
44    def test_factoryContext(self):
45        ctx = TestContext()
46        self.assertEquals(IFoo(ctx), True)
47
48    def test_factoryContextFromLocate(self):
49        factory = TestContext()
50        ctx = context.WovenContext(parent=factory)
51        self.assertEquals(IFoo(ctx), True)
52
53    def test_factoryContextRemembers(self):
54        basectx = TestContext()
55        ctx = context.WovenContext(parent=basectx)
56        bar1 = IBar(ctx)
57        ctx = context.WovenContext(parent=basectx)
58        bar2 = IBar(ctx)
59        self.assertEqual(bar1, bar2)
60
61    def test_negativeLocate(self):
62        ctx = context.WovenContext()
63        self.assertRaises(KeyError, ctx.locate, IFoo)
64        self.assertRaises(TypeError, IFoo, ctx)
65
66    def test_negativeSomething(self):
67        factory = TestContext()
68        ctx = context.WovenContext(parent=factory)
69        self.assertRaises(KeyError, ctx.locate, inevow.IData)
70
71    def test_slots(self):
72        ctx = context.WovenContext()
73        ctx.fillSlots('foo', 'bar')
74        ctx = context.WovenContext(parent=ctx)
75        self.assertEquals(
76            ctx.locateSlotData('foo'),
77            'bar')
78
79    def test_negativeSlots(self):
80        ctx = context.WovenContext()
81        self.assertRaises(KeyError, ctx.locateSlotData, 'foo')
82
83    def benchmark_longContextChainArg(self):
84        from nevow import testutil
85        ctx = context.RequestContext(
86            tag=testutil.FakeRequest(args=dict(foo=["foo"], bar=["bar"])))
87        for x in range(5):
88            ## Do some factory contexts
89            ctx = TestContext(parent=ctx)
90        for x in range(100):
91            ## Do a bunch of crap
92            ctx = context.WovenContext(parent=ctx)
93        ## Look for some request arguments
94
95        loops = 1e4
96        before = time.clock()
97        for x in xrange(loops):
98            ignored = ctx.arg('foo')
99            ignored = ctx.arg('bar')
100        after = time.clock()
101
102        self.recordStat({"arg/(cpu sec)": loops / (after - before)})
103
104class TestContext(context.FactoryContext):
105    """A target for registering adatpters.
106    """
107
108# IFoo interface/adapter that always adapts to True
109class IFoo(zi.Interface):
110    """A dummy interface.
111    """
112
113dummyAdapter = lambda x: True
114
115registerAdapter(dummyAdapter, TestContext, IFoo)
116
117
118# IBar interface that adapts to an incrementing value
119class IBar(zi.Interface):
120    """A dummy interface.
121    """
122
123nextBar = itertools.count()
124def barFactory(ctx):
125    return nextBar.next()
126
127registerAdapter(barFactory, TestContext, IBar)
128
129