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