NCL Composer  0.1.5
 All Classes Functions Variables Pages
tst_InsertNode.cpp
1 #include "tst_InsertNode.h"
2 
3 #include <iostream>
4 #include <fstream>
5 using namespace std;
6 
7 void tst_InsertNode::initTestCase()
8 {
9  nNodes = 10000;
10 
11  pjControl = ProjectControl::getInstance();
12  resourceDir = "resources";
13  resourceDir = resourceDir+QDir::separator()+"documents"+QDir::separator();
14 
15  QString baseDir = "..";
16  profileDir = baseDir+QDir::separator()+"extensions"+QDir::separator();
17  // +"composer"+QDir::separator();
18  lgControl = LanguageControl::getInstance();
19 
20  pluginList = TestUtil::getPluginList();
21 
22  pgControl = PluginControl::getInstance();
23 
24  connect(pgControl,
25  SIGNAL(addPluginWidgetToWindow(IPluginFactory*,IPlugin*,Project*,int)),
26  &showWidgets,
27  SLOT(showPluginWidget(IPluginFactory*, IPlugin*, Project*, int)));
28 }
29 
30 
31 void tst_InsertNode::cleanupTestCase()
32 {
33  ProjectControl::releaseInstance();
34  pjControl = NULL;
35  LanguageControl::releaseInstance();
36  lgControl = NULL;
37  PluginControl::releaseInstance();
38  pgControl = NULL;
39 
40  /* Clean up the project directory */
41  QString projectDir = resourceDir + QDir::separator() + "projects";
42  QDir docDir(projectDir);
43  docDir.setFilter(QDir::Files | QDir::NoSymLinks);
44  QFileInfoList list = docDir.entryInfoList();
45 
46  for (int i = 0; i != list.size(); i++)
47  {
48  QFileInfo fileInfo = list.at(i);
49  cout << "Trying to remove " << fileInfo.absoluteFilePath().toStdString();
50  QFile file(fileInfo.absoluteFilePath());
51  file.remove();
52  }
53 }
54 
55 void tst_InsertNode::init()
56 {
57 #ifdef Q_WS_MAC
58  QString filename = profileDir+QDir::separator()+
59  "NCL"+QDir::separator()+"libNCLLanguageProfile.dylib";
60 #elif WIN32
61  //TODO:
62 #else
63  QString filename = profileDir+QDir::separator()
64  +"NCL"+QDir::separator()+"libNCLLanguageProfile.so";
65 #endif
66  QVERIFY(lgControl->loadProfile(filename));
67 }
68 
69 
70 void tst_InsertNode::insertNode_data()
71 {
72  QTest::addColumn<QString>("projectFileName");
73  QTest::addColumn<int>("nNodes");
74  QTest::addColumn<int>("numPlugins");
75 
76  for(int i = 0; i < pluginList.size(); i++)
77  {
78  QString testName = "teste" + i;
79  QString projectName = QDir::separator();
80  projectName += "tmp";
81  projectName += QDir::separator();
82  projectName += "project";
83  projectName += ".cpr";
84  QTest::newRow(testName.toStdString().c_str()) << projectName << nNodes << i;
85  }
86 }
87 
88 void tst_InsertNode::insertNode()
89 {
90  QFETCH(QString, projectFileName);
91  QFETCH(int, nNodes);
92  QFETCH(int, numPlugins);
93 
94  for (int i = 0; i < numPlugins; i++)
95  {
96  QString pluginName = pluginList.at(i);
97  pgControl->loadPlugin(pluginName);
98  }
99 
100  QVERIFY(pjControl->launchProject(projectFileName));
101 
102  MessageControl *messageControl =
103  pgControl->getMessageControl(projectFileName);
104  Project *project = ProjectControl::getInstance()
105  ->getOpenProject(projectFileName);
106 
107  QMap <QString, QString> attrs;
108  messageControl->anonymousAddEntity("ncl", project->getUniqueId(), attrs);
109  Entity *ncl = project->getEntitiesbyType("ncl").first();
110  messageControl->anonymousAddEntity("head", ncl->getUniqueId(), attrs);
111  Entity *head = project->getEntitiesbyType("head").first();
112  messageControl->anonymousAddEntity("regionBase", head->getUniqueId(), attrs);
113  Entity *regionBase = project->getEntitiesbyType("regionBase").first();
114  timeval begin, end;
115  long long int interval;
116 
117  ofstream myfile;
118  QString filename = "output/composer_";
119  filename += QString::number(numPlugins);
120  filename += "_plugins_1.txt";
121  myfile.open(filename.toStdString().c_str());
122  for(int i = 0; i < nNodes; i++)
123  {
124  attrs.insert("id", "node");
125  gettimeofday(&begin,NULL);
126  messageControl->anonymousAddEntity("region", regionBase->getUniqueId(),
127  attrs);
128 
129  QApplication::processEvents();
130  showWidgets.redraw();
131  gettimeofday(&end, NULL);
132  interval = TestUtil::timeval_subtract_micro(begin, end);
133  myfile << ((double)interval)/1000.0 << endl;
134  }
135  myfile.close();
136 
137  // ProjectControl::getInstance()->saveProject(projectFileName);
138  // QVERIFY(pgControl->releasePlugins(project));
139  showWidgets.closeAllWidgets();
140  QVERIFY(pjControl->closeProject(project->getLocation()));
141 }
142 
143 void tst_InsertNode::insertNodeNPlugins_data()
144 {
145  insertNode_data();
146 }
147 
148 void tst_InsertNode::insertNodeNPlugins()
149 {
150  QFETCH(QString, projectFileName);
151  QFETCH(int, nNodes);
152  QFETCH(int, numPlugins);
153 
154  QList <IPluginFactory *> factories;
155 
156  for (int i = 0; i < numPlugins; i++)
157  {
158  QString pluginName = pluginList.at(i);
159  IPluginFactory *fact = pgControl->loadPlugin(pluginName);
160  factories.push_back(fact);
161  }
162 
163  QVERIFY(pjControl->launchProject(projectFileName));
164 
165  MessageControl *messageControl =
166  pgControl->getMessageControl(projectFileName);
167  Project *project = ProjectControl::getInstance()
168  ->getOpenProject(projectFileName);
169 
170  int nInstances = 0;
171  if(factories.size() > 1)
172  {
173  for(int i = 0; i < nInstances; i++)
174  {
175  cout << i << endl;
176  IPluginFactory *pluginFactory = factories.at(1);
177  PluginControl::getInstance()->launchNewPlugin(pluginFactory, project);
178  }
179  }
180 
181  QMap <QString, QString> attrs;
182  messageControl->anonymousAddEntity("ncl", project->getUniqueId(), attrs);
183  Entity *ncl = project->getEntitiesbyType("ncl").first();
184  messageControl->anonymousAddEntity("head", ncl->getUniqueId(), attrs);
185  Entity *head = project->getEntitiesbyType("head").first();
186  messageControl->anonymousAddEntity("regionBase", head->getUniqueId(), attrs);
187  Entity *regionBase = project->getEntitiesbyType("regionBase").first();
188 
189  messageControl->anonymousAddEntity("body", ncl->getUniqueId(), attrs);
190  Entity *body = project->getEntitiesbyType("body").first();
191  timeval begin, end;
192  long long int interval;
193 
194  ofstream myfile;
195  QString filename = "output/composer_";
196  filename += QString::number(numPlugins);
197  filename += "_plugins.txt";
198  myfile.open(filename.toStdString().c_str());
199  for(int i = 0; i < nNodes; i++)
200  {
201  attrs.insert("id", "node");
202  gettimeofday(&begin,NULL);
203  messageControl->anonymousAddEntity("region", regionBase->getUniqueId(),
204  attrs, false, false);
205 
206 // messageControl->anonymousAddEntity("media", body->getUniqueId(),
207 // attrs);
208  messageControl->anonymousUpdateFromModel();
209  QApplication::processEvents();
210  showWidgets.redraw();
211  gettimeofday(&end, NULL);
212  interval = TestUtil::timeval_subtract_micro (begin, end);
213  myfile << ((double)interval)/1000.0 << endl;
214  }
215  myfile.close();
216 
217  // ProjectControl::getInstance()->saveProject(projectFileName);
218  // QVERIFY(pgControl->releasePlugins(project));
219  showWidgets.closeAllWidgets();
220  QVERIFY(pjControl->closeProject(project->getLocation()));
221 }
222 
223 
224 void tst_InsertNode::updateNodes_data()
225 {
226  QTest::addColumn<QString>("projectFileName");
227  QTest::addColumn<int>("numPlugins");
228  QTest::addColumn<int>("nNodes");
229  QTest::addColumn<int>("nUpdates");
230 
231  QVector <int> nNodes;
232  nNodes.push_back(10);
233  nNodes.push_back(100);
234  nNodes.push_back(500);
235  nNodes.push_back(1000);
236 // nNodes.push_back(5000);
237 // nNodes.push_back(10000);
238 
239  for(int i = 0; i < nNodes.size(); i++)
240  {
241  QString testName = "teste" + i;
242  QString projectName = QDir::separator();
243  projectName += "tmp";
244  projectName += QDir::separator();
245  projectName += "project";
246  projectName += ".cpr";
247 
248  QTest::newRow(testName.toStdString().c_str()) << projectName
249  << pluginList.size()
250  << nNodes[i]
251  << 100;
252  }
253 }
254 
255 void tst_InsertNode::updateNodes()
256 {
257  QFETCH(QString, projectFileName);
258  QFETCH(int, numPlugins);
259  QFETCH(int, nNodes);
260  QFETCH(int, nUpdates);
261 
262  QList <IPluginFactory *> factories;
263 
264  for (int i = 0; i < numPlugins; i++)
265  {
266  QString pluginName = pluginList.at(i);
267  IPluginFactory *fact = pgControl->loadPlugin(pluginName);
268  factories.push_back(fact);
269  }
270 
271  QVERIFY(pjControl->launchProject(projectFileName));
272 
273  MessageControl *messageControl =
274  pgControl->getMessageControl(projectFileName);
275  Project *project = ProjectControl::getInstance()
276  ->getOpenProject(projectFileName);
277 
278  /* Create the original document */
279  QMap <QString, QString> attrs;
280  messageControl->anonymousAddEntity("ncl", project->getUniqueId(), attrs);
281  Entity *ncl = project->getEntitiesbyType("ncl").first();
282  messageControl->anonymousAddEntity("head", ncl->getUniqueId(), attrs);
283  Entity *head = project->getEntitiesbyType("head").first();
284  messageControl->anonymousAddEntity("regionBase", head->getUniqueId(), attrs);
285  Entity *regionBase = project->getEntitiesbyType("regionBase").first();
286 
287  messageControl->anonymousAddEntity("body", ncl->getUniqueId(), attrs);
288  Entity *body = project->getEntitiesbyType("body").first();
289  timeval begin, end;
290  long long int interval;
291 
292  for(int i = 0; i < nNodes; i++)
293  {
294  messageControl->anonymousAddEntity("region", regionBase->getUniqueId(),
295  attrs);
296  }
297  QApplication::processEvents();
298  showWidgets.redraw();
299 
300  /* Update nUpdates times the node */
301  Entity *region = project->getEntitiesbyType("region").last();
302  ofstream myfile;
303  QString filename = "output/composer_";
304  filename += QString::number(numPlugins);
305  filename += "_plugins_incremental_";
306  filename += QString::number(nNodes);
307  filename += "_nodes.txt";
308  myfile.open(filename.toStdString().c_str());
309 
310  attrs.clear();
311 
312  for(int i = 0; i < nUpdates; i++)
313  {
314  gettimeofday(&begin,NULL);
315  for(int j = 0; j < i; j++)
316  {
317  QString value = QString::number(j);
318  attrs.insert("top", value);
319  messageControl->anonymousChangeEntity(region->getUniqueId(), attrs);
320  }
321  gettimeofday(&end, NULL);
322  interval = TestUtil::timeval_subtract_micro (begin, end);
323  myfile << ((double)interval)/1000.0 << endl;
324  }
325  QApplication::processEvents();
326  showWidgets.redraw();
327  myfile.close();
328 
329  filename = "output/composer_";
330  filename += QString::number(numPlugins);
331  filename += "_plugins_updateFromModel_";
332  filename += QString::number(nNodes);
333  filename += "_nodes.txt";
334  myfile.open(filename.toStdString().c_str());
335  /* The same thing, but now update only in the end */
336 
337  for(int i = 0; i < nUpdates; i++)
338  {
339  gettimeofday(&begin,NULL);
340  for(int j = 0; j < i; j++)
341  {
342  QString value = QString::number(i);
343  attrs.insert("top", value);
344  messageControl->anonymousChangeEntity(region->getUniqueId(), attrs,
345  false, false);
346  }
347  messageControl->anonymousUpdateFromModel();
348  QApplication::processEvents();
349  showWidgets.redraw();
350 
351  gettimeofday(&end, NULL);
352  interval = TestUtil::timeval_subtract_micro (begin, end);
353  myfile << ((double)interval)/1000.0 << endl;
354  }
355 
356  myfile.close();
357 
358  // ProjectControl::getInstance()->saveProject(projectFileName);
359  // QVERIFY(pgControl->releasePlugins(project));
360  showWidgets.closeAllWidgets();
361  QVERIFY(pjControl->closeProject(project->getLocation()));
362 }