EVOLUTION-MANAGER
Edit File: test_query.py
# Copyright (c) 2004 Divmod. # See LICENSE for details. from nevow import tags, flat, testutil, context, loaders, stan from nevow.inevow import IQ simple = tags.html[tags.div(pattern="foo")] tooMany = tags.html[tags.div(pattern="foo"), tags.div(pattern="foo")] notEnough = tags.html[tags.div[tags.span["Hello"]]] class OnePatternTestCase(testutil.TestCase): """ Test various C{IQ.onePattern} implementations. """ _patternDiv = tags.div(pattern="foo") _simpleStan = tags.html[_patternDiv] _simpleSlot = tags.slot('slotname')[_patternDiv] _tooManyPatternsSiblingStan = tags.html[ tags.div(pattern="foo"), tags.div(pattern="foo")] _manyPatternsLinealStan = tags.html(pattern="foo")[ tags.div(pattern="foo"), "extra content"] def _testQuery(self, container, expected): pattern = IQ(container).onePattern('foo') # The pattern node has had its pattern special removed - put it back, # so we can perform a comparison self.assertEqual(pattern.pattern, None) pattern.pattern = 'foo' self.assertEqual(str(pattern), str(expected)) def test_tagQuery(self): return self._testQuery( self._simpleStan, self._patternDiv) def test_contextQuery(self): return self._testQuery( context.WovenContext(tag=self._simpleStan), self._patternDiv) def test_listQuery(self): return self._testQuery( flat.precompile(self._simpleStan), self._patternDiv) def test_loaderQuery(self): return self._testQuery( loaders.stan(self._simpleStan), self._patternDiv) def test_slotQuery(self): return self._testQuery( self._simpleSlot, self._patternDiv) def test_precompiledSlotQuery(self): return self._testQuery( flat.precompile(self._simpleSlot), self._patternDiv) def _testTooManyPatterns(self, obj): """ Test that the L{IQ} adapter for C{obj} provides a L{onePattern} method which raises L{stan.TooManyNodes} if passed a pattern name for which there are multiple pattern nodes. """ self.assertRaises(stan.TooManyNodes, IQ(obj).onePattern, 'foo') def test_stanTooManySiblingPatterns(self): """ Test that a Tag with children with the same pattern name causes onePattern to raise L{TooManyNodes}. """ return self._testTooManyPatterns(self._tooManyPatternsSiblingStan) def test_contextTooManySiblingPatterns(self): """ Like L{test_stanTooManySiblingPatterns} but for a WovenContext. """ return self._testTooManyPatterns( context.WovenContext(tag=self._tooManyPatternsSiblingStan)) def test_listTooManySiblingPatterns(self): """ Like L{test_stanTooManySiblingPatterns} but for a list. """ return self._testTooManyPatterns([self._tooManyPatternsSiblingStan]) def test_precompiledTooManySiblingPatterns(self): """ Like L{test_stanTooManySiblingPatterns} but for a precompiled document. """ P = flat.precompile(self._tooManyPatternsSiblingStan) return self._testTooManyPatterns(P) def test_loaderTooManySiblingPatterns(self): """ Like L{test_stanTooManySiblingPatterns} but for a loader. """ return self._testTooManyPatterns(loaders.stan(self._tooManyPatternsSiblingStan)) def test_stanMultipleLinealPatterns(self): """ Test that calling onePattern a Tag with a pattern and a child with the same pattern """ return self._testQuery( self._manyPatternsLinealStan, self._manyPatternsLinealStan) def test_contextMultipleLinealPatterns(self): return self._testQuery( context.WovenContext(tag=self._manyPatternsLinealStan), self._manyPatternsLinealStan) def test_listMultipleLinealPatterns(self): return self._testQuery( [self._manyPatternsLinealStan], self._manyPatternsLinealStan) def test_precompiledMultipleLinealPatterns(self): P = flat.precompile(self._manyPatternsLinealStan) return self._testQuery( P, P[0].tag) def test_loaderMultipleLinealPatterns(self): return self._testQuery( loaders.stan(self._manyPatternsLinealStan), loaders.stan(self._manyPatternsLinealStan).load()[0].tag) def test_tagNotEnough(self): self.assertRaises(stan.NodeNotFound, IQ(notEnough).onePattern, 'foo') def test_contextNotEnough(self): self.assertRaises( stan.NodeNotFound, IQ(context.WovenContext(tag=notEnough)).onePattern, 'foo') def test_contextTagQuery(self): T = simple.clone(deep=False) T.pattern = "outer" C = context.WovenContext(tag=T) new = IQ(C).onePattern('outer') self.assertEquals(new.tagName, 'html') def test_listNotEnough(self): P = flat.precompile(notEnough) self.assertRaises(stan.NodeNotFound, IQ(P).onePattern, 'foo') def test_loaderNotEnough(self): L = loaders.stan(notEnough) self.assertRaises(stan.NodeNotFound, IQ(L).onePattern, 'foo') multiple = tags.html[tags.div(pattern="foo", bar="one"), tags.span(pattern="foo", bar="two")] class TestAll(testutil.TestCase): def verify(self, them): them = list(them) self.assertEquals(len(them), 2) self.assertEquals(them[0].tagName, 'div') self.assertEquals(them[1].tagName, 'span') self.assertEquals(them[0].attributes['bar'], 'one') self.assertEquals(them[1].attributes['bar'], 'two') def testTagPatterns(self): self.verify( IQ(multiple).allPatterns('foo')) def testContextPatterns(self): self.verify( IQ(context.WovenContext(tag=multiple)).allPatterns('foo')) def testListPatterns(self): self.verify( IQ(flat.precompile(multiple)).allPatterns('foo')) def testLoaderPatterns(self): self.verify( IQ(loaders.stan(multiple)).allPatterns('foo')) class TestGenerator(testutil.TestCase): def verify(self, it): one = it(color="red") two = it(color="blue") three = it(color="green") four = it(color="orange") self.assertEquals(one.attributes['color'], 'red') self.assertEquals(one.attributes['bar'], 'one') self.assertEquals(two.attributes['color'], 'blue') self.assertEquals(two.attributes['bar'], 'two') self.assertEquals(three.attributes['color'], 'green') self.assertEquals(three.attributes['bar'], 'one') self.assertEquals(four.attributes['color'], 'orange') self.assertEquals(four.attributes['bar'], 'two') def testTagGenerators(self): self.verify( IQ(multiple).patternGenerator('foo')) def testTagMissing(self): self.assertRaises(stan.NodeNotFound, IQ(notEnough).patternGenerator, 'foo') def testContextGenerators(self): self.verify( IQ(context.WovenContext(tag=multiple)).patternGenerator('foo')) def testContextMissing(self): self.assertRaises(stan.NodeNotFound, IQ(context.WovenContext(tag=notEnough)).patternGenerator, 'foo') def testListGenerators(self): self.verify( IQ(flat.precompile(multiple)).patternGenerator('foo')) def testListMissing(self): self.assertRaises(stan.NodeNotFound, IQ(flat.precompile(notEnough)).patternGenerator, 'foo') def testLoaderGenerators(self): self.verify( IQ(loaders.stan(multiple)).patternGenerator('foo')) def testTagMissing(self): self.assertRaises(stan.NodeNotFound, IQ(loaders.stan(notEnough)).patternGenerator, 'foo') def testClonableDefault(self): orig = tags.p["Hello"] gen = IQ(flat.precompile(notEnough)).patternGenerator('foo', orig) new = gen.next() self.assertEquals(new.tagName, 'p') self.assertNotIdentical(orig, new) def testNonClonableDefault(self): gen = IQ(flat.precompile(notEnough)).patternGenerator('foo', 'bar') new = gen.next() self.assertEquals(new, 'bar') def testXmlMissing(self): self.assertRaises(stan.NodeNotFound, IQ(stan.xml('<html>hello</html>')).patternGenerator, 'foo') def test_listOfTagPatternGenerator(self): """ Querying a list which contains a tag for patterns gives back the tag if the tag has a matching pattern special. """ patterns = IQ([tags.div(pattern="foo", bar="baz")]).patternGenerator("foo") for i in xrange(3): self.assertEqual(patterns.next().attributes['bar'], "baz")