blob: d257eca0a1e8a8e9ed5a65ac1c566d409727a06b [file] [log] [blame]
Armin Ronacher58875382007-02-27 19:40:14 +01001# -*- coding: utf-8 -*-
2"""
Armin Ronacher26c0f512008-04-17 11:16:01 +02003 jinja2.tests
4 ~~~~~~~~~~~~
Armin Ronacher58875382007-02-27 19:40:14 +01005
6 Jinja test functions. Used with the "is" operator.
7
Armin Ronacher55494e42010-01-22 09:41:48 +01008 :copyright: (c) 2010 by the Jinja Team.
Armin Ronacher58875382007-02-27 19:40:14 +01009 :license: BSD, see LICENSE for more details.
10"""
11import re
Armin Ronacher577ad382008-04-16 15:36:49 +020012from jinja2.runtime import Undefined
Armin Ronacher58875382007-02-27 19:40:14 +010013
Armin Ronacher8e64adf2010-02-07 02:00:11 +010014# nose, nothing here to test
15__test__ = False
16
Armin Ronacher58875382007-02-27 19:40:14 +010017
Armin Ronacherab45b842007-03-18 20:47:50 +010018number_re = re.compile(r'^-?\d+(\.\d+)?$')
Armin Ronacher58875382007-02-27 19:40:14 +010019regex_type = type(number_re)
20
21
Armin Ronacher42a19882009-08-05 18:45:39 +020022try:
23 test_callable = callable
24except NameError:
25 def test_callable(x):
26 return hasattr(x, '__call__')
27
28
Armin Ronacher577ad382008-04-16 15:36:49 +020029def test_odd(value):
30 """Return true if the variable is odd."""
31 return value % 2 == 1
Armin Ronacher58875382007-02-27 19:40:14 +010032
33
Armin Ronacher577ad382008-04-16 15:36:49 +020034def test_even(value):
Lukas Meuserad48a2e2008-05-01 18:19:57 +020035 """Return true if the variable is even."""
Armin Ronacher577ad382008-04-16 15:36:49 +020036 return value % 2 == 0
Armin Ronacher58875382007-02-27 19:40:14 +010037
38
Armin Ronacherf59bac22008-04-20 13:11:43 +020039def test_divisibleby(value, num):
40 """Check if a variable is divisible by a number."""
41 return value % num == 0
42
43
Armin Ronacher577ad382008-04-16 15:36:49 +020044def test_defined(value):
45 """Return true if the variable is defined:
Armin Ronacher58875382007-02-27 19:40:14 +010046
Armin Ronacher37a88512007-03-02 20:42:18 +010047 .. sourcecode:: jinja
48
49 {% if variable is defined %}
50 value of variable: {{ variable }}
51 {% else %}
52 variable is not defined
53 {% endif %}
54
Armin Ronacher9f258ff2008-05-24 22:28:52 +020055 See the :func:`default` filter for a simple way to set undefined
Armin Ronacher26c0f512008-04-17 11:16:01 +020056 variables.
Armin Ronacher58875382007-02-27 19:40:14 +010057 """
Armin Ronacher577ad382008-04-16 15:36:49 +020058 return not isinstance(value, Undefined)
Armin Ronacher58875382007-02-27 19:40:14 +010059
60
Armin Ronacher53042292008-04-26 18:30:19 +020061def test_undefined(value):
Armin Ronacher9f258ff2008-05-24 22:28:52 +020062 """Like :func:`defined` but the other way round."""
Armin Ronacher53042292008-04-26 18:30:19 +020063 return isinstance(value, Undefined)
64
65
66def test_none(value):
67 """Return true if the variable is none."""
68 return value is None
69
70
Armin Ronacher577ad382008-04-16 15:36:49 +020071def test_lower(value):
Armin Ronacher53042292008-04-26 18:30:19 +020072 """Return true if the variable is lowercased."""
Armin Ronacher577ad382008-04-16 15:36:49 +020073 return unicode(value).islower()
Armin Ronacher58875382007-02-27 19:40:14 +010074
75
Armin Ronacher577ad382008-04-16 15:36:49 +020076def test_upper(value):
Armin Ronacher53042292008-04-26 18:30:19 +020077 """Return true if the variable is uppercased."""
Armin Ronacher577ad382008-04-16 15:36:49 +020078 return unicode(value).isupper()
Armin Ronacher58875382007-02-27 19:40:14 +010079
80
Armin Ronacher53042292008-04-26 18:30:19 +020081def test_string(value):
82 """Return true if the object is a string."""
83 return isinstance(value, basestring)
84
85
86def test_number(value):
87 """Return true if the variable is a number."""
88 return isinstance(value, (int, long, float, complex))
Armin Ronacher58875382007-02-27 19:40:14 +010089
90
Armin Ronacher577ad382008-04-16 15:36:49 +020091def test_sequence(value):
92 """Return true if the variable is a sequence. Sequences are variables
Armin Ronacher37a88512007-03-02 20:42:18 +010093 that are iterable.
Armin Ronacher58875382007-02-27 19:40:14 +010094 """
Armin Ronacher577ad382008-04-16 15:36:49 +020095 try:
96 len(value)
97 value.__getitem__
98 except:
99 return False
100 return True
Armin Ronacher58875382007-02-27 19:40:14 +0100101
102
Armin Ronacher577ad382008-04-16 15:36:49 +0200103def test_sameas(value, other):
104 """Check if an object points to the same memory address than another
Armin Ronacher69ddc582007-06-24 12:37:13 +0200105 object:
106
107 .. sourcecode:: jinja
108
Armin Ronacherf59bac22008-04-20 13:11:43 +0200109 {% if foo.attribute is sameas false %}
Armin Ronacher69ddc582007-06-24 12:37:13 +0200110 the foo attribute really is the `False` singleton
111 {% endif %}
Armin Ronacher69ddc582007-06-24 12:37:13 +0200112 """
Armin Ronacher577ad382008-04-16 15:36:49 +0200113 return value is other
Armin Ronacher69ddc582007-06-24 12:37:13 +0200114
115
Armin Ronacher53042292008-04-26 18:30:19 +0200116def test_iterable(value):
117 """Check if it's possible to iterate over an object."""
118 try:
119 iter(value)
120 except TypeError:
121 return False
122 return True
123
124
Armin Ronacher3c8b7ad2008-04-28 13:52:21 +0200125def test_escaped(value):
126 """Check if the value is escaped."""
127 return hasattr(value, '__html__')
128
129
Armin Ronacher58875382007-02-27 19:40:14 +0100130TESTS = {
131 'odd': test_odd,
132 'even': test_even,
Armin Ronacherf59bac22008-04-20 13:11:43 +0200133 'divisibleby': test_divisibleby,
Armin Ronacher58875382007-02-27 19:40:14 +0100134 'defined': test_defined,
Armin Ronacher53042292008-04-26 18:30:19 +0200135 'undefined': test_undefined,
136 'none': test_none,
Armin Ronacher58875382007-02-27 19:40:14 +0100137 'lower': test_lower,
138 'upper': test_upper,
Armin Ronacher53042292008-04-26 18:30:19 +0200139 'string': test_string,
140 'number': test_number,
Armin Ronacher58875382007-02-27 19:40:14 +0100141 'sequence': test_sequence,
Armin Ronacher53042292008-04-26 18:30:19 +0200142 'iterable': test_iterable,
Armin Ronacher42a19882009-08-05 18:45:39 +0200143 'callable': test_callable,
Armin Ronacher3c8b7ad2008-04-28 13:52:21 +0200144 'sameas': test_sameas,
145 'escaped': test_escaped
Armin Ronacher58875382007-02-27 19:40:14 +0100146}