mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			83 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			83 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| from django.template import Context, Template, Variable, VariableDoesNotExist
 | |
| from django.template.base import DebugLexer, Lexer, TokenType
 | |
| from django.test import SimpleTestCase
 | |
| from django.utils.translation import gettext_lazy
 | |
| 
 | |
| 
 | |
| class LexerTestMixin:
 | |
|     template_string = (
 | |
|         'text\n'
 | |
|         '{% if test %}{{ varvalue }}{% endif %}'
 | |
|         '{#comment {{not a var}} %{not a block}% #}'
 | |
|         'end text'
 | |
|     )
 | |
|     expected_token_tuples = [
 | |
|         # (token_type, contents, lineno, position)
 | |
|         (TokenType.TEXT, 'text\n', 1, (0, 5)),
 | |
|         (TokenType.BLOCK, 'if test', 2, (5, 18)),
 | |
|         (TokenType.VAR, 'varvalue', 2, (18, 32)),
 | |
|         (TokenType.BLOCK, 'endif', 2, (32, 43)),
 | |
|         (TokenType.COMMENT, 'comment {{not a var}} %{not a block}%', 2, (43, 85)),
 | |
|         (TokenType.TEXT, 'end text', 2, (85, 93)),
 | |
|     ]
 | |
| 
 | |
|     def test_tokenize(self):
 | |
|         tokens = self.lexer_class(self.template_string).tokenize()
 | |
|         token_tuples = [(t.token_type, t.contents, t.lineno, t.position) for t in tokens]
 | |
|         self.assertEqual(token_tuples, self.make_expected())
 | |
| 
 | |
|     def make_expected(self):
 | |
|         raise NotImplementedError('This method must be implemented by a subclass.')
 | |
| 
 | |
| 
 | |
| class LexerTests(LexerTestMixin, SimpleTestCase):
 | |
|     lexer_class = Lexer
 | |
| 
 | |
|     def make_expected(self):
 | |
|         # The non-debug lexer does not record position.
 | |
|         return [t[:-1] + (None,) for t in self.expected_token_tuples]
 | |
| 
 | |
| 
 | |
| class DebugLexerTests(LexerTestMixin, SimpleTestCase):
 | |
|     lexer_class = DebugLexer
 | |
| 
 | |
|     def make_expected(self):
 | |
|         return self.expected_token_tuples
 | |
| 
 | |
| 
 | |
| class TemplateTests(SimpleTestCase):
 | |
|     def test_lazy_template_string(self):
 | |
|         template_string = gettext_lazy('lazy string')
 | |
|         self.assertEqual(Template(template_string).render(Context()), template_string)
 | |
| 
 | |
|     def test_repr(self):
 | |
|         template = Template(
 | |
|             '<html><body>\n'
 | |
|             '{% if test %}<h1>{{ varvalue }}</h1>{% endif %}'
 | |
|             '</body></html>'
 | |
|         )
 | |
|         self.assertEqual(
 | |
|             repr(template),
 | |
|             '<Template template_string="<html><body>{% if t...">',
 | |
|         )
 | |
| 
 | |
| 
 | |
| class VariableDoesNotExistTests(SimpleTestCase):
 | |
|     def test_str(self):
 | |
|         exc = VariableDoesNotExist(msg='Failed lookup in %r', params=({'foo': 'bar'},))
 | |
|         self.assertEqual(str(exc), "Failed lookup in {'foo': 'bar'}")
 | |
| 
 | |
| 
 | |
| class VariableTests(SimpleTestCase):
 | |
|     def test_integer_literals(self):
 | |
|         self.assertEqual(Variable('999999999999999999999999999').literal, 999999999999999999999999999)
 | |
| 
 | |
|     def test_nonliterals(self):
 | |
|         """Variable names that aren't resolved as literals."""
 | |
|         var_names = []
 | |
|         for var in ('inf', 'infinity', 'iNFiniTy', 'nan'):
 | |
|             var_names.extend((var, '-' + var, '+' + var))
 | |
|         for var in var_names:
 | |
|             with self.subTest(var=var):
 | |
|                 self.assertIsNone(Variable(var).literal)
 |