Use explicit latin1 in the tests.
[grantlee:grantlee.git] / tests / benchmarks.cpp
1 /*
2   This file is part of the Grantlee template system.
3
4   Copyright (c) 2009,2010 Stephen Kelly <steveire@gmail.com>
5
6   This library is free software; you can redistribute it and/or
7   modify it under the terms of the GNU Lesser General Public
8   License as published by the Free Software Foundation; either version
9   2 of the Licence, or (at your option) any later version.
10
11   This library is distributed in the hope that it will be useful,
12   but WITHOUT ANY WARRANTY; without even the implied warranty of
13   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14   Library General Public License for more details.
15
16   You should have received a copy of the GNU Lesser General Public
17   License along with this library.  If not, see <http://www.gnu.org/licenses/>.
18
19 */
20
21 #ifndef BENCHMARKING_H
22 #define BENCHMARKING_H
23
24 #include <QtTest>
25 #include <QtCore>
26 #include <QtCore/QObject>
27
28 #include "lexer_p.h"
29 #include "template.h"
30 #include "engine.h"
31 #include "context.h"
32 #include "filterexpression.h"
33 #include "parser.h"
34 #include "grantlee_paths.h"
35
36 typedef QHash<QString, QVariant> Dict;
37
38 Q_DECLARE_METATYPE( Dict )
39 Q_DECLARE_METATYPE( Grantlee::Error )
40
41 using namespace Grantlee;
42
43 class Benchmarking : public QObject
44 {
45   Q_OBJECT
46
47 private Q_SLOTS:
48   void initTestCase();
49
50   void testTokenizing_data() {
51     getData();
52   }
53   void testTokenizing();
54
55   void testParsing_data() {
56     getData();
57   }
58   void testParsing();
59
60   void testRendering_data() {
61     getData();
62   }
63   void testRendering();
64
65   void cleanupTestCase();
66
67 private:
68
69   void getData();
70   QVariantHash getDictData( int size );
71   QString getTemplate( int size );
72   Engine *m_engine;
73   QString m_templateGeneratorString;
74   Template m_templateGenerator;
75
76 };
77
78 void Benchmarking::initTestCase()
79 {
80   m_engine = new Engine( this );
81
82   QString appDirPath = QFileInfo( QCoreApplication::applicationDirPath() ).absoluteDir().path();
83
84   m_engine->setPluginPaths( QStringList( QLatin1String( GRANTLEE_PLUGIN_PATH ) ) );
85
86   m_templateGeneratorString =
87     QLatin1String(  "Lorem {% for i in items %}"
88     " Ipsum {% templatetag openblock %} if boo {% templatetag closeblock %} "
89     "bar {% templatetag openvariable %} bat|upper {% templatetag closevariable %} baz {{ i }} dolor"
90     " {% templatetag openblock %} endif {% templatetag closeblock %} sit."
91     "{% endfor %} amet.\n" );
92
93   m_templateGenerator = m_engine->newTemplate( m_templateGeneratorString, QLatin1String( "generator" ) );
94
95 }
96
97 void Benchmarking::cleanupTestCase()
98 {
99 }
100
101 void Benchmarking::testTokenizing()
102 {
103   QFETCH( QString, input );
104   QFETCH( Dict, dict );
105
106   Lexer l( input );
107
108   QList<Token> tokens;
109   QBENCHMARK( tokens = l.tokenize() );
110 }
111
112 void Benchmarking::testParsing()
113 {
114   QFETCH( QString, input );
115   QFETCH( Dict, dict );
116
117   Lexer l( input );
118
119   QList<Token> tokens;
120   tokens = l.tokenize();
121
122   Template t = m_engine->newTemplate( QString(), QString() );
123
124   Parser p( tokens, t.data() );
125   NodeList list;
126
127   QBENCHMARK { p.setTokens( tokens ); list = p.parse( t.data() ); }
128 }
129
130 void Benchmarking::testRendering()
131 {
132   QFETCH( QString, input );
133   QFETCH( Dict, dict );
134
135   Template t = m_engine->newTemplate( input, QLatin1String( "testtemplate" ) );
136
137   Context context( dict );
138
139   QFile outputFile( QLatin1String( "./output" ) );
140   outputFile.open( QFile::WriteOnly );
141   QTextStream tstream( &outputFile );
142
143   OutputStream os( &tstream );
144
145   QBENCHMARK( t->render( &os, &context ) );
146 }
147
148 void Benchmarking::getData()
149 {
150   QTest::addColumn<QString>( "input" );
151   QTest::addColumn<Dict>( "dict" );
152
153   Dict dict;
154
155   dict.insert( QLatin1String( "boo" ), QLatin1String( "Far" ) );
156   dict.insert( QLatin1String( "bat" ), QLatin1String( "Cat" ) );
157   dict.insert( QLatin1String( "booList" ), QVariantList() << QString::fromLatin1( "Tom" ) << QString::fromLatin1( "Dick" ) << QString::fromLatin1( "Harry" ) );
158
159   // Using Grantlee to create Grantlee templates. How recursive...
160
161 //   QList<int> repeatSizes;
162 //   repeatSizes << 10 << 100 << 200 << 300 << 1000 << 1500 << 2000 << 3000 << 4000;
163
164 //   Q_FOREACH(int size, repeatSizes)
165 //   {
166 //     const char * name = QLatin1String( "growing-%1" ).arg( size ).toLatin1();
167 //     QTest::newRow( name ) << getTemplate( size ) << dict;
168 //   }
169
170   QTest::newRow( "growing-10"   ) << getTemplate( 10   ) << dict;
171   QTest::newRow( "growing-20"   ) << getTemplate( 20   ) << dict;
172   QTest::newRow( "growing-30"   ) << getTemplate( 30   ) << dict;
173   QTest::newRow( "growing-100"  ) << getTemplate( 100  ) << dict;
174   QTest::newRow( "growing-300"  ) << getTemplate( 300  ) << dict;
175   QTest::newRow( "growing-700"  ) << getTemplate( 700  ) << dict;
176   QTest::newRow( "growing-1000" ) << getTemplate( 1000 ) << dict;
177   QTest::newRow( "growing-2000" ) << getTemplate( 2000 ) << dict;
178   QTest::newRow( "growing-2500" ) << getTemplate( 2500 ) << dict;
179   QTest::newRow( "growing-2700" ) << getTemplate( 2700 ) << dict;
180   QTest::newRow( "growing-3000" ) << getTemplate( 3000 ) << dict;
181 }
182
183 QVariantHash Benchmarking::getDictData( int size )
184 {
185   QVariantHash h;
186   QVariantList list;
187
188   for ( int i = 0 ; i < size; i++ )
189     list << i;
190   h.insert( QLatin1String( "items" ), list );
191
192   return h;
193 }
194
195 QString Benchmarking::getTemplate( int size )
196 {
197   Context c( getDictData( size ) );
198   return m_templateGenerator->render( &c );
199 }
200
201
202 QTEST_MAIN( Benchmarking )
203 #include "benchmarks.moc"
204
205 #endif
206