Implement the now tag.
[grantlee:grantlee.git] / tests / testdefaulttags.cpp
1 /*
2     Copyright (c) 2009 Stephen Kelly <steveire@gmail.com>
3 */
4
5 #ifndef DEFAULTTAGSTEST_H
6 #define DEFAULTTAGSTEST_H
7
8 #include <QtTest>
9 #include <QtCore>
10 #include <QObject>
11
12 #include "template.h"
13 #include "context.h"
14
15 #include "grantlee.h"
16
17 typedef QHash<QString, QVariant> Dict;
18
19 Q_DECLARE_METATYPE(Dict)
20 Q_DECLARE_METATYPE(Grantlee::Error)
21
22 using namespace Grantlee;
23
24 class TestDefaultTags : public QObject
25 {
26   Q_OBJECT
27
28 private slots:
29   void initTestCase();
30
31   void testCommentTag_data();
32   void testCommentTag() { doTest(); }
33
34   void testFirstOfTag_data();
35   void testFirstOfTag() {  doTest(); }
36
37   void testIfTag_data();
38   void testIfTag() {  doTest();  }
39
40   void testForTag_data();
41   void testForTag() {  doTest();  }
42
43   void testIfEqualTag_data();
44   void testIfEqualTag() {  doTest();  }
45
46   void testIfNotEqualTag_data();
47   void testIfNotEqualTag() {  doTest();  }
48
49   void testTemplateTagTag_data();
50   void testTemplateTagTag() {  doTest();  }
51
52   void testWithTag_data();
53   void testWithTag() {  doTest();  }
54
55   void testCycleTag_data();
56   void testCycleTag() {  /* doTest(); */ }
57
58   void testWidthRatioTag_data();
59   void testWidthRatioTag() {  doTest();  }
60
61   void testFilterTag_data();
62   void testFilterTag() {  doTest();  }
63
64   void testNowTag_data();
65   void testNowTag() {  doTest();  }
66
67 private:
68
69   void doTest();
70
71   TemplateLoader *m_tl;
72
73 };
74
75 void TestDefaultTags::initTestCase()
76 {
77   m_tl = TemplateLoader::instance();
78
79   m_tl->setPluginDirs(QStringList() << "/home/kde-devel/kde/lib/");
80
81 }
82
83 void TestDefaultTags::doTest()
84 {
85   QFETCH(QString, input);
86   QFETCH(Dict, dict);
87   QFETCH(QString, output);
88   QFETCH(Grantlee::Error, error);
89
90   Template* t = m_tl->getTemplate();
91
92   QSignalSpy spy(t, SIGNAL(error(int, const QString &)));
93   t->setContent(input);
94
95   if (spy.count() > 0)
96   {
97     QVariantList l = spy.takeFirst();
98     QCOMPARE(l.at(0).toInt(), (int)error );
99     return;
100   }
101
102   Context context(dict);
103
104   QString result = t->render(&context);
105
106   if (spy.count() > 0)
107   {
108     QVariantList l = spy.takeFirst();
109     QCOMPARE(l.at(0).toInt(), (int)error );
110     QCOMPARE(result, QString());
111     return;
112   }
113
114   // Didn't catch any errors, so make sure I didn't expect any.
115   QCOMPARE(NoError, error);
116
117   QCOMPARE(result, output);
118 }
119
120 void TestDefaultTags::testCommentTag_data()
121 {
122   QTest::addColumn<QString>("input");
123   QTest::addColumn<Dict>("dict");
124   QTest::addColumn<QString>("output");
125   QTest::addColumn<Grantlee::Error>("error");
126
127   Dict dict;
128
129   QTest::newRow("comment-tag01") << "{% comment %}this is hidden{% endcomment %}hello" << dict << "hello" << NoError;
130
131   QTest::newRow("comment-tag02") << "{% comment %}this is hidden{% endcomment %}hello{% comment %}foo{% endcomment %}" << dict << "hello" << NoError;
132   // Comment tag can contain invalid stuff.
133   QTest::newRow("comment-tag03") << "foo{% comment %} {% if %} {% endcomment %}" << dict << "foo" << NoError;
134   QTest::newRow("comment-tag04") << "foo{% comment %} {% endblock %} {% endcomment %}" << dict << "foo" << NoError;
135   QTest::newRow("comment-tag05") << "foo{% comment %} {% somerandomtag %} {% endcomment %}" << dict << "foo" << NoError;
136 }
137
138 void TestDefaultTags::testFirstOfTag_data()
139 {
140   QTest::addColumn<QString>("input");
141   QTest::addColumn<Dict>("dict");
142   QTest::addColumn<QString>("output");
143   QTest::addColumn<Grantlee::Error>("error");
144
145   Dict dict;
146   dict.insert("a", 0);
147   dict.insert("b", 0);
148   dict.insert("c", 0);
149   QTest::newRow("firstof01") << "{% firstof a b c %}" << dict << "" << NoError;
150
151   dict.clear();
152   dict.insert("a", 1);
153   dict.insert("b", 0);
154   dict.insert("c", 0);
155   QTest::newRow("firstof02") << "{% firstof a b c %}" << dict << "1" << NoError;
156
157   dict.clear();
158   dict.insert("a", 0);
159   dict.insert("b", 2);
160   dict.insert("c", 0);
161   QTest::newRow("firstof03") << "{% firstof a b c %}" << dict << "2" << NoError;
162
163   dict.clear();
164   dict.insert("a", 0);
165   dict.insert("b", 0);
166   dict.insert("c", 3);
167   QTest::newRow("firstof04") << "{% firstof a b c %}" << dict << "3" << NoError;
168
169   dict.clear();
170   dict.insert("a", 1);
171   dict.insert("b", 2);
172   dict.insert("c", 3);
173   QTest::newRow("firstof05") << "{% firstof a b c %}" << dict << "1" << NoError;
174
175   dict.clear();
176   dict.insert("b", 0);
177   dict.insert("c", 3);
178   QTest::newRow("firstof06") << "{% firstof a b c %}" << dict << "3" << NoError;
179
180   dict.clear();
181   dict.insert("a", 0);
182   QTest::newRow("firstof07") << "{% firstof a b \"c\" %}" << dict << "c" << NoError;
183
184   dict.clear();
185   dict.insert("a", 0);
186   dict.insert("b", 0);
187   QTest::newRow("firstof08") << "{% firstof a b \"c and d\" %}" << dict << "c and d" << NoError;
188   QTest::newRow("firstof09") << "{% firstof %}" << dict << "a" << TagSyntaxError;
189
190 }
191
192
193 void TestDefaultTags::testIfTag_data()
194 {
195   QTest::addColumn<QString>("input");
196   QTest::addColumn<Dict>("dict");
197   QTest::addColumn<QString>("output");
198   QTest::addColumn<Grantlee::Error>("error");
199
200   Dict dict;
201
202   dict.insert("foo", true);
203
204   QTest::newRow("if-tag01") << "{% if foo %}yes{% else %}no{% endif %}" << dict << "yes" << NoError;
205
206   dict.clear();
207   dict.insert("foo", false);
208   QTest::newRow("if-tag02") << "{% if foo %}yes{% else %}no{% endif %}" << dict << "no" << NoError;
209
210   dict.clear();
211   QTest::newRow("if-tag03") << "{% if foo %}yes{% else %}no{% endif %}" << dict << "no" << NoError;
212
213   // AND
214
215   dict.clear();
216   dict.insert("foo", true);
217   dict.insert("bar", true);
218   QTest::newRow("if-tag-and01") << "{% if foo and bar %}yes{% else %}no{% endif %}" << dict << "yes" << NoError;
219
220   dict.clear();
221   dict.insert("foo", true);
222   dict.insert("bar", false);
223   QTest::newRow("if-tag-and02") << "{% if foo and bar %}yes{% else %}no{% endif %}" << dict << "no" << NoError;
224
225   dict.clear();
226   dict.insert("foo", false);
227   dict.insert("bar", true);
228   QTest::newRow("if-tag-and03") << "{% if foo and bar %}yes{% else %}no{% endif %}" << dict << "no" << NoError;
229
230   dict.clear();
231   dict.insert("foo", false);
232   dict.insert("bar", false);
233   QTest::newRow("if-tag-and04") << "{% if foo and bar %}yes{% else %}no{% endif %}" << dict << "no" << NoError;
234
235   dict.clear();
236   dict.insert("foo", false);
237   QTest::newRow("if-tag-and05") << "{% if foo and bar %}yes{% else %}no{% endif %}" << dict << "no" << NoError;
238
239   dict.clear();
240   dict.insert("bar", false);
241   QTest::newRow("if-tag-and06") << "{% if foo and bar %}yes{% else %}no{% endif %}" << dict << "no" << NoError;
242
243   dict.clear();
244   dict.insert("foo", true);
245   QTest::newRow("if-tag-and07") << "{% if foo and bar %}yes{% else %}no{% endif %}" << dict << "no" << NoError;
246
247   dict.clear();
248   dict.insert("bar", true);
249   QTest::newRow("if-tag-and08") << "{% if foo and bar %}yes{% else %}no{% endif %}" << dict << "no" << NoError;
250
251   // OR
252
253   dict.clear();
254   dict.insert("foo", true);
255   dict.insert("bar", true);
256   QTest::newRow("if-tag-or01") << "{% if foo or bar %}yes{% else %}no{% endif %}" << dict << "yes" << NoError;
257
258   dict.clear();
259   dict.insert("foo", true);
260   dict.insert("bar", false);
261   QTest::newRow("if-tag-or02") << "{% if foo or bar %}yes{% else %}no{% endif %}" << dict << "yes" << NoError;
262
263   dict.clear();
264   dict.insert("foo", false);
265   dict.insert("bar", true);
266   QTest::newRow("if-tag-or03") << "{% if foo or bar %}yes{% else %}no{% endif %}" << dict << "yes" << NoError;
267
268   dict.clear();
269   dict.insert("foo", false);
270   dict.insert("bar", false);
271   QTest::newRow("if-tag-or04") << "{% if foo or bar %}yes{% else %}no{% endif %}" << dict << "no" << NoError;
272
273   dict.clear();
274   dict.insert("foo", false);
275   QTest::newRow("if-tag-or05") << "{% if foo or bar %}yes{% else %}no{% endif %}" << dict << "no" << NoError;
276
277   dict.clear();
278   dict.insert("bar", false);
279   QTest::newRow("if-tag-or06") << "{% if foo or bar %}yes{% else %}no{% endif %}" << dict << "no" << NoError;
280
281   dict.clear();
282   dict.insert("foo", true);
283   QTest::newRow("if-tag-or07") << "{% if foo or bar %}yes{% else %}no{% endif %}" << dict << "yes" << NoError;
284
285   dict.clear();
286   dict.insert("bar", true);
287   QTest::newRow("if-tag-or08") << "{% if foo or bar %}yes{% else %}no{% endif %}" << dict << "yes" << NoError;
288
289   // TODO: multiple ORs
290
291
292   // NOT
293
294   dict.clear();
295   dict.insert("foo", true);
296   QTest::newRow("if-tag-not01") << "{% if not foo %}no{% else %}yes{% endif %}" << dict << "yes" << NoError;
297   QTest::newRow("if-tag-not02") << "{% if not %}yes{% else %}no{% endif %}" << dict << "no" << NoError;
298
299   dict.clear();
300   dict.insert("not", true);
301   QTest::newRow("if-tag-not03") << "{% if not %}yes{% else %}no{% endif %}" << dict << "yes" << NoError;
302   QTest::newRow("if-tag-not04") << "{% if not not %}no{% else %}yes{% endif %}" << dict << "yes" << NoError;
303
304   dict.clear();
305   QTest::newRow("if-tag-not05") << "{% if not not %}no{% else %}yes{% endif %}" << dict << "no" << NoError;
306   QTest::newRow("if-tag-not06") << "{% if foo and not bar %}yes{% else %}no{% endif %}" << dict << "no" << NoError;
307
308   dict.clear();
309   dict.insert("foo", true);
310   dict.insert("bar", true);
311   QTest::newRow("if-tag-not07") << "{% if foo and not bar %}yes{% else %}no{% endif %}" << dict << "no" << NoError;
312
313   dict.clear();
314   dict.insert("foo", true);
315   dict.insert("bar", false);
316   QTest::newRow("if-tag-not08") << "{% if foo and not bar %}yes{% else %}no{% endif %}" << dict << "yes" << NoError;
317
318   dict.clear();
319   dict.insert("foo", false);
320   dict.insert("bar", true);
321   QTest::newRow("if-tag-not09") << "{% if foo and not bar %}yes{% else %}no{% endif %}" << dict << "no" << NoError;
322
323   dict.clear();
324   dict.insert("foo", false);
325   dict.insert("bar", false);
326   QTest::newRow("if-tag-not10") << "{% if foo and not bar %}yes{% else %}no{% endif %}" << dict << "no" << NoError;
327
328   dict.clear();
329   QTest::newRow("if-tag-not11") << "{% if not foo and bar %}yes{% else %}no{% endif %}" << dict << "no" << NoError;
330
331   dict.clear();
332   dict.insert("foo", true);
333   dict.insert("bar", true);
334   QTest::newRow("if-tag-not12") << "{% if not foo and bar %}yes{% else %}no{% endif %}" << dict << "no" << NoError;
335
336   dict.clear();
337   dict.insert("foo", true);
338   dict.insert("bar", false);
339   QTest::newRow("if-tag-not13") << "{% if not foo and bar %}yes{% else %}no{% endif %}" << dict << "no" << NoError;
340
341   dict.clear();
342   dict.insert("foo", false);
343   dict.insert("bar", true);
344   QTest::newRow("if-tag-not14") << "{% if not foo and bar %}yes{% else %}no{% endif %}" << dict << "yes" << NoError;
345
346   dict.clear();
347   dict.insert("foo", false);
348   dict.insert("bar", false);
349   QTest::newRow("if-tag-not15") << "{% if not foo and bar %}yes{% else %}no{% endif %}" << dict << "no" << NoError;
350
351   dict.clear();
352   QTest::newRow("if-tag-not16") << "{% if foo or not bar %}yes{% else %}no{% endif %}" << dict << "yes" << NoError;
353
354   dict.clear();
355   dict.insert("foo", true);
356   dict.insert("bar", true);
357   QTest::newRow("if-tag-not17") << "{% if foo or not bar %}yes{% else %}no{% endif %}" << dict << "yes" << NoError;
358
359   dict.clear();
360   dict.insert("foo", true);
361   dict.insert("bar", false);
362   QTest::newRow("if-tag-not18") << "{% if foo or not bar %}yes{% else %}no{% endif %}" << dict << "yes" << NoError;
363
364   dict.clear();
365   dict.insert("foo", false);
366   dict.insert("bar", true);
367   QTest::newRow("if-tag-not19") << "{% if foo or not bar %}yes{% else %}no{% endif %}" << dict << "no" << NoError;
368
369   dict.clear();
370   dict.insert("foo", false);
371   dict.insert("bar", false);
372   QTest::newRow("if-tag-not20") << "{% if foo or not bar %}yes{% else %}no{% endif %}" << dict << "yes" << NoError;
373
374   dict.clear();
375   QTest::newRow("if-tag-not21") << "{% if not foo or bar %}yes{% else %}no{% endif %}" << dict << "yes" << NoError;
376
377   dict.clear();
378   dict.insert("foo", true);
379   dict.insert("bar", true);
380   QTest::newRow("if-tag-not22") << "{% if not foo or bar %}yes{% else %}no{% endif %}" << dict << "yes" << NoError;
381
382   dict.clear();
383   dict.insert("foo", true);
384   dict.insert("bar", false);
385   QTest::newRow("if-tag-not23") << "{% if not foo or bar %}yes{% else %}no{% endif %}" << dict << "no" << NoError;
386
387   dict.clear();
388   dict.insert("foo", false);
389   dict.insert("bar", true);
390   QTest::newRow("if-tag-not24") << "{% if not foo or bar %}yes{% else %}no{% endif %}" << dict << "yes" << NoError;
391
392   dict.clear();
393   dict.insert("foo", false);
394   dict.insert("bar", false);
395   QTest::newRow("if-tag-not25") << "{% if not foo or bar %}yes{% else %}no{% endif %}" << dict << "yes" << NoError;
396
397   dict.clear();
398   QTest::newRow("if-tag-not26") << "{% if not foo and not bar %}yes{% else %}no{% endif %}" << dict << "yes" << NoError;
399
400   dict.clear();
401   dict.insert("foo", true);
402   dict.insert("bar", true);
403   QTest::newRow("if-tag-not27") << "{% if not foo and not bar %}yes{% else %}no{% endif %}" << dict << "no" << NoError;
404
405   dict.clear();
406   dict.insert("foo", true);
407   dict.insert("bar", false);
408   QTest::newRow("if-tag-not28") << "{% if not foo and not bar %}yes{% else %}no{% endif %}" << dict << "no" << NoError;
409
410   dict.clear();
411   dict.insert("foo", false);
412   dict.insert("bar", true);
413   QTest::newRow("if-tag-not29") << "{% if not foo and not bar %}yes{% else %}no{% endif %}" << dict << "no" << NoError;
414
415   dict.clear();
416   dict.insert("foo", false);
417   dict.insert("bar", false);
418   QTest::newRow("if-tag-not30") << "{% if not foo and not bar %}yes{% else %}no{% endif %}" << dict << "yes" << NoError;
419
420   dict.clear();
421   QTest::newRow("if-tag-not31") << "{% if not foo or not bar %}yes{% else %}no{% endif %}" << dict << "yes" << NoError;
422
423   dict.clear();
424   dict.insert("foo", true);
425   dict.insert("bar", true);
426   QTest::newRow("if-tag-not32") << "{% if not foo or not bar %}yes{% else %}no{% endif %}" << dict << "no" << NoError;
427
428   dict.clear();
429   dict.insert("foo", true);
430   dict.insert("bar", false);
431   QTest::newRow("if-tag-not33") << "{% if not foo or not bar %}yes{% else %}no{% endif %}" << dict << "yes" << NoError;
432
433   dict.clear();
434   dict.insert("foo", false);
435   dict.insert("bar", true);
436   QTest::newRow("if-tag-not34") << "{% if not foo or not bar %}yes{% else %}no{% endif %}" << dict << "yes" << NoError;
437
438   dict.clear();
439   dict.insert("foo", false);
440   dict.insert("bar", false);
441   QTest::newRow("if-tag-not35") << "{% if not foo or not bar %}yes{% else %}no{% endif %}" << dict << "yes" << NoError;
442
443   // AND and OR raises a TemplateSyntaxError
444   QTest::newRow("if-tag-error01") << "{% if foo or bar and baz %}yes{% else %}no{% endif %}" << dict << "" << TagSyntaxError;
445
446   dict.clear();
447   dict.insert("foo", true);
448   QTest::newRow("if-tag-error02") << "{% if foo and %}yes{% else %}no{% endif %}" << dict << "" << TagSyntaxError;
449   QTest::newRow("if-tag-error03") << "{% if foo or %}yes{% else %}no{% endif %}" << dict << "" << TagSyntaxError;
450   QTest::newRow("if-tag-error04") << "{% if not foo and %}yes{% else %}no{% endif %}" << dict << "" << TagSyntaxError;
451   QTest::newRow("if-tag-error05") << "{% if not foo or %}yes{% else %}no{% endif %}" << dict << "" << TagSyntaxError;
452
453 }
454
455 void TestDefaultTags::testForTag_data()
456 {
457   QTest::addColumn<QString>("input");
458   QTest::addColumn<Dict>("dict");
459   QTest::addColumn<QString>("output");
460   QTest::addColumn<Grantlee::Error>("error");
461
462   Dict dict;
463
464   QVariantList list;
465   list << 1 << 2 << 3;
466   dict.insert("values", list);
467   QTest::newRow("for-tag01") << "{% for val in values %}{{ val }}{% endfor %}" << dict << "123" << NoError;
468   QTest::newRow("for-tag02") << "{% for val in values reversed %}{{ val }}{% endfor %}" << dict << "321" << NoError;
469   list.clear();
470   list << 6 << 6 << 6;
471   QTest::newRow("for-tag-vars01") << "{% for val in values %}{{ forloop.counter }}{% endfor %}" << dict << "123" << NoError;
472   QTest::newRow("for-tag-vars02") << "{% for val in values %}{{ forloop.counter0 }}{% endfor %}" << dict << "012" << NoError;
473   QTest::newRow("for-tag-vars03") << "{% for val in values %}{{ forloop.revcounter }}{% endfor %}" << dict << "321" << NoError;
474   QTest::newRow("for-tag-vars04") << "{% for val in values %}{{ forloop.revcounter0 }}{% endfor %}" << dict << "210" << NoError;
475   QTest::newRow("for-tag-vars05") << "{% for val in values %}{% if forloop.first %}f{% else %}x{% endif %}{% endfor %}" << dict << "fxx" << NoError;
476   QTest::newRow("for-tag-vars06") << "{% for val in values %}{% if forloop.last %}l{% else %}x{% endif %}{% endfor %}" << dict << "xxl" << NoError;
477 }
478
479 void TestDefaultTags::testIfEqualTag_data()
480 {
481   QTest::addColumn<QString>("input");
482   QTest::addColumn<Dict>("dict");
483   QTest::addColumn<QString>("output");
484   QTest::addColumn<Grantlee::Error>("error");
485
486   Dict dict;
487
488   dict.insert("a", 1);
489   dict.insert("b", 2);
490
491   QTest::newRow("ifequal01") << "{% ifequal a b %}yes{% endifequal %}" << dict << "" << NoError;
492   QTest::newRow("ifequal03") << "{% ifequal a b %}yes{% else %}no{% endifequal %}" << dict << "no" << NoError;
493
494   dict.clear();
495   dict.insert("a", 1);
496   dict.insert("b", 1);
497
498   QTest::newRow("ifequal02") << "{% ifequal a b %}yes{% endifequal %}" << dict << "yes" << NoError;
499   QTest::newRow("ifequal04") << "{% ifequal a b %}yes{% else %}no{% endifequal %}" << dict << "yes" << NoError;
500
501   dict.clear();
502   dict.insert("a", "test");
503
504   QTest::newRow("ifequal05") << "{% ifequal a 'test' %}yes{% else %}no{% endifequal %}" << dict << "yes" << NoError;
505
506   dict.clear();
507   dict.insert("a", "no");
508
509   QTest::newRow("ifequal06") << "{% ifequal a 'test' %}yes{% else %}no{% endifequal %}" << dict << "no" << NoError;
510
511   dict.clear();
512   dict.insert("a", "test");
513
514   QTest::newRow("ifequal07") << "{% ifequal a \"test\" %}yes{% else %}no{% endifequal %}" << dict << "yes" << NoError;
515
516   dict.clear();
517   dict.insert("a", "no");
518
519   QTest::newRow("ifequal08") << "{% ifequal a \"test\" %}yes{% else %}no{% endifequal %}" << dict << "no" << NoError;
520
521   dict.clear();
522
523   QTest::newRow("ifequal09") << "{% ifequal a \"test\" %}yes{% else %}no{% endifequal %}" << dict << "no" << NoError;
524
525   QTest::newRow("ifequal10") << "{% ifequal a b %}yes{% else %}no{% endifequal %}" << dict << "yes" << NoError;
526
527
528   QTest::newRow("ifequal-split01") << "{% ifequal a \"test man\" %}yes{% else %}no{% endifequal %}" << dict << "no" << NoError;
529
530   dict.insert("a", "foo");
531   QTest::newRow("ifequal-split01") << "{% ifequal a \"test man\" %}yes{% else %}no{% endifequal %}" << dict << "no" << NoError;
532   QTest::newRow("ifequal-split02") << "{% ifequal a \"test man\" %}yes{% else %}no{% endifequal %}" << dict << "no" << NoError;
533
534   dict.clear();
535   dict.insert("a", "test man");
536   QTest::newRow("ifequal-split03") << "{% ifequal a \"test man\" %}yes{% else %}no{% endifequal %}" << dict << "yes" << NoError;
537   QTest::newRow("ifequal-split04") << "{% ifequal a 'test man' %}yes{% else %}no{% endifequal %}" << dict << "yes" << NoError;
538
539   dict.clear();
540   dict.insert("a", "");
541   QTest::newRow("ifequal-split05") << "{% ifequal a 'i \"love\" you' %}yes{% else %}no{% endifequal %}" << dict << "no" << NoError;
542
543   dict.clear();
544   dict.insert("a", "i \"love\" you");
545   QTest::newRow("ifequal-split06") << "{% ifequal a 'i \"love\" you' %}yes{% else %}no{% endifequal %}" << dict << "yes" << NoError;
546
547   dict.clear();
548   dict.insert("a", "i love you");
549   QTest::newRow("ifequal-split07") << "{% ifequal a 'i \"love\" you' %}yes{% else %}no{% endifequal %}" << dict << "no" << NoError;
550
551   dict.clear();
552   dict.insert("a", "I'm happy");
553   QTest::newRow("ifequal-split08") << "{% ifequal a 'I\\'m happy' %}yes{% else %}no{% endifequal %}" << dict << "yes" << NoError;
554
555   dict.clear();
556   dict.insert("a", "slash\\man");
557   QTest::newRow("ifequal-split09") << "{% ifequal a 'slash\\man' %}yes{% else %}no{% endifequal %}" << dict << "yes" << NoError;
558
559   dict.clear();
560   dict.insert("a", "slashman");
561   QTest::newRow("ifequal-split10") << "{% ifequal a 'slash\\man' %}yes{% else %}no{% endifequal %}" << dict << "no" << NoError;
562 // NUMERIC RESOLUTION
563
564   dict.clear();
565   dict.insert("x", "5");
566
567   QTest::newRow("ifequal-numeric01") << "{% ifequal x 5 %}yes{% endifequal %}" << dict << "" << NoError;
568
569   dict.clear();
570   dict.insert("x", 5);
571   QTest::newRow("ifequal-numeric02") << "{% ifequal x 5 %}yes{% endifequal %}" << dict << "yes" << NoError;
572
573   dict.clear();
574   dict.insert("x", 5.2);
575   QTest::newRow("ifequal-numeric03") << "{% ifequal x 5 %}yes{% endifequal %}" << dict << "" << NoError;
576   QTest::newRow("ifequal-numeric04") << "{% ifequal x 5.2 %}yes{% endifequal %}" << dict << "yes" << NoError;
577
578   dict.clear();
579   dict.insert("x", .2);
580
581   QTest::newRow("ifequal-numeric05") << "{% ifequal x 0.2 %}yes{% endifequal %}" << dict << "yes" << NoError;
582   QTest::newRow("ifequal-numeric06") << "{% ifequal x .2 %}yes{% endifequal %}" << dict << "yes" << NoError;
583
584   dict.clear();
585   dict.insert("x", 2);
586
587   QTest::newRow("ifequal-numeric07") << "{% ifequal x 2. %}yes{% endifequal %}" << dict << "" << NoError;
588
589   dict.clear();
590   dict.insert("x", 5);
591   QTest::newRow("ifequal-numeric08") << "{% ifequal x \"5\" %}yes{% endifequal %}" << dict << "" << NoError;
592
593   dict.clear();
594   dict.insert("x", "5");
595   QTest::newRow("ifequal-numeric09") << "{% ifequal x \"5\" %}yes{% endifequal %}" << dict << "yes" << NoError;
596
597   dict.clear();
598   dict.insert("x", -5);
599   QTest::newRow("ifequal-numeric10") << "{% ifequal x -5 %}yes{% endifequal %}" << dict << "yes" << NoError;
600
601   dict.clear();
602   dict.insert("x", -5.2);
603   QTest::newRow("ifequal-numeric11") << "{% ifequal x -5.2 %}yes{% endifequal %}" << dict << "yes" << NoError;
604
605   dict.clear();
606   dict.insert("x", 5);
607   QTest::newRow("ifequal-numeric12") << "{% ifequal x +5 %}yes{% endifequal %}" << dict << "yes" << NoError;
608
609 }
610
611 void TestDefaultTags::testIfNotEqualTag_data()
612 {
613   QTest::addColumn<QString>("input");
614   QTest::addColumn<Dict>("dict");
615   QTest::addColumn<QString>("output");
616   QTest::addColumn<Grantlee::Error>("error");
617
618   Dict dict;
619
620   dict.insert("a", 1);
621   dict.insert("b", 2);
622
623   QTest::newRow("ifnotequal01") << "{% ifnotequal a b %}yes{% endifnotequal %}" << dict << "yes" << NoError;
624   QTest::newRow("ifnotequal03") << "{% ifnotequal a b %}yes{% else %}no{% endifnotequal %}" << dict << "yes" << NoError;
625
626   dict.clear();
627   dict.insert("a", 1);
628   dict.insert("b", 1);
629
630   QTest::newRow("ifnotequal02") << "{% ifnotequal a b %}yes{% endifnotequal %}" << dict << "" << NoError;
631   QTest::newRow("ifnotequal04") << "{% ifnotequal a b %}yes{% else %}no{% endifnotequal %}" << dict << "no" << NoError;
632
633 }
634
635 void TestDefaultTags::testTemplateTagTag_data()
636 {
637   QTest::addColumn<QString>("input");
638   QTest::addColumn<Dict>("dict");
639   QTest::addColumn<QString>("output");
640   QTest::addColumn<Grantlee::Error>("error");
641
642   Dict dict;
643
644   QTest::newRow("templatetag01") << "{% templatetag openblock %}" << dict << "{%" << NoError;
645   QTest::newRow("templatetag02") << "{% templatetag closeblock %}" << dict << "%}" << NoError;
646   QTest::newRow("templatetag03") << "{% templatetag openvariable %}" << dict << "{{" << NoError;
647   QTest::newRow("templatetag04") << "{% templatetag closevariable %}" << dict << "}}" << NoError;
648   QTest::newRow("templatetag05") << "{% templatetag %}" << dict << "" << TagSyntaxError;
649   QTest::newRow("templatetag06") << "{% templatetag foo %}" << dict << "" << TagSyntaxError;
650   QTest::newRow("templatetag07") << "{% templatetag openbrace %}" << dict << "{" << NoError;
651   QTest::newRow("templatetag08") << "{% templatetag closebrace %}" << dict << "}" << NoError;
652   QTest::newRow("templatetag09") << "{% templatetag openbrace %}{% templatetag openbrace %}" << dict << "{{" << NoError;
653   QTest::newRow("templatetag10") << "{% templatetag closebrace %}{% templatetag closebrace %}" << dict << "}}" << NoError;
654   QTest::newRow("templatetag11") << "{% templatetag opencomment %}" << dict << "{#" << NoError;
655   QTest::newRow("templatetag12") << "{% templatetag closecomment %}" << dict << "#}" << NoError;
656
657 }
658
659 void TestDefaultTags::testWithTag_data()
660 {
661   QTest::addColumn<QString>("input");
662   QTest::addColumn<Dict>("dict");
663   QTest::addColumn<QString>("output");
664   QTest::addColumn<Grantlee::Error>("error");
665
666   Dict dict;
667
668   QVariantMap map;
669   map.insert("key", 50);
670   dict.insert("dict", map);
671   QTest::newRow("with01") << "{% with dict.key as key %}{{ key }}{% endwith %}" << dict << "50" << NoError;
672   QTest::newRow("with02")
673         << "{{ key }}{% with dict.key as key %}{{ key }}-{{ dict.key }}-{{ key }}{% endwith %}{{ key }}"
674         << dict << "50-50-50" << NoError;
675   QTest::newRow("with03") << "{% with dict.key xx key %}{{ key }}{% endwith %}" << dict << "" << TagSyntaxError;
676   QTest::newRow("with04") << "{% with dict.key as %}{{ key }}{% endwith %}" << dict << "" << TagSyntaxError;
677 }
678
679 void TestDefaultTags::testCycleTag_data()
680 {
681   QTest::addColumn<QString>("input");
682   QTest::addColumn<Dict>("dict");
683   QTest::addColumn<QString>("output");
684   QTest::addColumn<Grantlee::Error>("error");
685
686   Dict dict;
687
688   QTest::newRow("cycle01") << "{% cycle a %}" << dict << "" << TagSyntaxError;
689   QTest::newRow("cycle02") << "{% cycle a,b,c as abc %}{% cycle abc %}" << dict << "ab" << NoError;
690   QTest::newRow("cycle03") << "{% cycle a,b,c as abc %}{% cycle abc %}{% cycle abc %}" << dict << "abc" << NoError;
691   QTest::newRow("cycle04") << "{% cycle a,b,c as abc %}{% cycle abc %}{% cycle abc %}{% cycle abc %}" << dict << "abca" << NoError;
692   QTest::newRow("cycle05") << "{% cycle a %}" << dict << "" << TagSyntaxError;
693   // TODO: This is the same as cycle01. Remove.
694   QTest::newRow("cycle06") << "{% cycle a %}" << dict << "" << TagSyntaxError;
695   QTest::newRow("cycle06") << "{% cycle a,b,c as foo %}{% cycle bar %}" << dict << "" << TagSyntaxError;
696   QTest::newRow("cycle06") << "{% cycle a,b,c as foo %}{% cycle foo %}{{ foo }}{{ foo }}{% cycle foo %}{{ foo }}" << dict << "abbbcc" << TagSyntaxError;
697
698   dict.insert("test", QVariantList() << 0 << 1 << 2 << 3 << 4);
699   QTest::newRow("cycle09") << "{% for i in test %}{% cycle a,b %}{{ i }},{% endfor %}" << dict << "a0,b1,a2,b3,a4," << NoError;
700
701   dict.clear();
702   QTest::newRow("cycle10") << "{% cycle 'a' 'b' 'c' as abc %}{% cycle abc %}" << dict << "ab" << NoError;
703   QTest::newRow("cycle11") << "{% cycle 'a' 'b' 'c' as abc %}{% cycle abc %}{% cycle abc %}" << dict << "abc" << NoError;
704   QTest::newRow("cycle12") << "{% cycle 'a' 'b' 'c' as abc %}{% cycle abc %}{% cycle abc %}{% cycle abc %}" << dict << "abca" << NoError;
705
706   dict.insert("test", QVariantList() << 0 << 1 << 2 << 3 << 4);
707   QTest::newRow("cycle13") << "{% for i in test %}{% cycle 'a' 'b' %}{{ i }},{% endfor %}" << dict << "a0,b1,a2,b3,a4," << NoError;
708
709   dict.clear();
710   dict.insert("one", "1");
711   dict.insert("two", "2");
712   QTest::newRow("cycle14") << "{% cycle one two as foo %}{% cycle foo %}" << dict << "12" << NoError;
713   dict.insert("test", QVariantList() << 0 << 1 << 2 << 3 << 4);
714   // TODO: Same name as cycle13 in Django. Fix upstream.
715   //  'aye': 'a', 'bee': 'b'}, '
716 //   QTest::newRow("cycle15") << "{% for i in test %}{% cycle aye bee %}{{ i }},{% endfor %}" << dict << "a0,b1,a2,b3,a4," ;
717 }
718
719 void TestDefaultTags::testWidthRatioTag_data()
720 {
721   QTest::addColumn<QString>("input");
722   QTest::addColumn<Dict>("dict");
723   QTest::addColumn<QString>("output");
724   QTest::addColumn<Grantlee::Error>("error");
725
726   Dict dict;
727
728   dict.insert("a", 50);
729   dict.insert("b", 100);
730   QTest::newRow("widthratio01") << "{% widthratio a b 0 %}" << dict << "0" << NoError;
731
732   dict.clear();
733   dict.insert("a", 0);
734   dict.insert("b", 0);
735   QTest::newRow("widthratio02") << "{% widthratio a b 0 %}" << dict << "" << NoError;
736
737   dict.clear();
738   dict.insert("a", 0);
739   dict.insert("b", 100);
740   QTest::newRow("widthratio03") << "{% widthratio a b 100 %}" << dict << "0" << NoError;
741
742   dict.clear();
743   dict.insert("a", 50);
744   dict.insert("b", 100);
745   QTest::newRow("widthratio04") << "{% widthratio a b 100 %}" << dict << "50" << NoError;
746
747   dict.clear();
748   dict.insert("a", 100);
749   dict.insert("b", 100);
750   QTest::newRow("widthratio05") << "{% widthratio a b 100 %}" << dict << "100" << NoError;
751
752   dict.clear();
753   dict.insert("a", 50);
754   dict.insert("b", 80);
755   QTest::newRow("widthratio06") << "{% widthratio a b 100 %}" << dict << "63" << NoError;
756
757   dict.clear();
758   dict.insert("a", 50);
759   dict.insert("b", 70);
760   QTest::newRow("widthratio07") << "{% widthratio a b 100 %}" << dict << "71" << NoError;
761
762   dict.clear();
763 // Raise exception if we don't have 3 args, last one an integer
764   QTest::newRow("widthratio08") << "{% widthratio %}" << dict << "" << TagSyntaxError;
765
766   dict.clear();
767   QTest::newRow("widthratio09") << "{% widthratio a b %}" << dict << "" << TagSyntaxError;
768
769   dict.clear();
770   QTest::newRow("widthratio10") << "{% widthratio a b 100.0 %}" << dict << "" << TagSyntaxError;
771 }
772
773
774 void TestDefaultTags::testFilterTag_data()
775 {
776   QTest::addColumn<QString>("input");
777   QTest::addColumn<Dict>("dict");
778   QTest::addColumn<QString>("output");
779   QTest::addColumn<Grantlee::Error>("error");
780
781   Dict dict;
782
783   QTest::newRow("filter01") << "{% filter upper %}{% endfilter %}" << dict << "" << NoError;
784   QTest::newRow("filter02") << "{% filter upper %}django{% endfilter %}" << dict << "DJANGO" << NoError;
785   QTest::newRow("filter03") << "{% filter upper|lower %}django{% endfilter %}" << dict << "django" << NoError;
786
787   dict.insert("remove", "spam");
788   QTest::newRow("filter04") << "{% filter cut:remove %}djangospam{% endfilter %}" << dict << "django" << NoError;
789
790 }
791
792 void TestDefaultTags::testNowTag_data()
793 {
794   QTest::addColumn<QString>("input");
795   QTest::addColumn<Dict>("dict");
796   QTest::addColumn<QString>("output");
797   QTest::addColumn<Grantlee::Error>("error");
798
799   Dict dict;
800
801   QDate today = QDateTime::currentDateTime().date();
802
803   QTest::newRow("now01") << "{% now \"d M yyyy\"%}" << dict << (QString::number(today.day()) + " " +  QString::number(today.month()) + " " + QString::number(today.year())) << NoError;
804
805
806 }
807
808
809
810 QTEST_MAIN(TestDefaultTags)
811 #include "testdefaulttags.moc"
812
813 #endif