ctkCmdLineModuleQtXslTransformTest.cpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469
  1. /*=========================================================================
  2. Library: CTK
  3. Copyright (c) Kitware Inc.
  4. Licensed under the Apache License, Version 2.0 (the "License");
  5. you may not use this file except in compliance with the License.
  6. You may obtain a copy of the License at
  7. http://www.apache.org/licenses/LICENSE-2.0.txt
  8. Unless required by applicable law or agreed to in writing, software
  9. distributed under the License is distributed on an "AS IS" BASIS,
  10. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  11. See the License for the specific language governing permissions and
  12. limitations under the License.
  13. =========================================================================*/
  14. // Qt includes
  15. #include <QBuffer>
  16. #include <QCoreApplication>
  17. #include <QList>
  18. #include <QString>
  19. // CTK includes
  20. #include "ctkCmdLineModuleFrontendFactoryQtGui.h"
  21. #include "ctkCmdLineModuleXslTransform.h"
  22. #include "ctkTest.h"
  23. // ----------------------------------------------------------------------------
  24. class ctkCmdLineModuleQtXslTransformTester: public QObject
  25. {
  26. Q_OBJECT
  27. private slots:
  28. void testTransform();
  29. void testTransform_data();
  30. void testBindVariable();
  31. void testBindVariable_data();
  32. void testXslExtraTransformation();
  33. void testXslExtraTransformation_data();
  34. };
  35. QString invalidXml =
  36. "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
  37. "<executable>";
  38. QString header =
  39. "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
  40. "<executable>"
  41. " <category/>"
  42. " <title>A Test</title>"
  43. " <description><![CDATA[No parameter.]]></description>"
  44. " <version>0.1.0</version>"
  45. " <documentation-url/>"
  46. " <license/>"
  47. " <contributor></contributor>"
  48. " <acknowledgements/>";
  49. QString footer =
  50. "</executable>\n";
  51. QString mainWidgetHeader =
  52. "<ui version=\"4.0\">\n"
  53. " <class>ATest</class>\n"
  54. " <widget class=\"QWidget\" name=\"executable:A Test\">\n"
  55. " <layout class=\"QVBoxLayout\">\n";
  56. QString mainWidgetFooter =
  57. " <item>\n"
  58. " <spacer name=\"verticalSpacer\">\n"
  59. " <property name=\"orientation\">\n"
  60. " <enum>Qt::Vertical</enum>\n"
  61. " </property>\n"
  62. " </spacer>\n"
  63. " </item>\n"
  64. " </layout>\n"
  65. " </widget>\n"
  66. " <connections/>\n"
  67. "</ui>\n";
  68. QString parametersHeader =
  69. " <parameters>"
  70. " <label>Parameters</label>"
  71. " <description><![CDATA[Parameters]]></description>";
  72. QString parametersFooter =
  73. " </parameters>\n";
  74. QString parametersWidgetHeader =
  75. " <item>\n"
  76. " <widget class=\"ctkCollapsibleGroupBox\" name=\"paramGroup:Parameters\">\n"
  77. " <property name=\"title\">\n"
  78. " <string>Parameters</string>\n"
  79. " </property>\n"
  80. " <property name=\"toolTip\">\n"
  81. " <string>Parameters</string>\n"
  82. " </property>\n"
  83. " <property name=\"checked\">\n"
  84. " <bool>true</bool>\n"
  85. " </property>\n"
  86. ;
  87. QString parametersWidgetEmptyLayout =
  88. " <layout class=\"QGridLayout\"/>\n";
  89. QString parametersLayoutHeader =
  90. " <layout class=\"QGridLayout\">\n";
  91. QString parametersLayoutFooter =
  92. " </layout>\n";
  93. QString parametersWidgetFooter =
  94. " </widget>\n"
  95. " </item>\n"
  96. ;
  97. QString integer =
  98. "<integer>"
  99. " <name>integer</name>"
  100. " <flag>-i</flag>"
  101. " <longflag>--integer</longflag>"
  102. " <description><![CDATA[Integer description]]></description>"
  103. " <label>Integer</label>"
  104. " <default>1</default>"
  105. "</integer>"
  106. ;
  107. QString integerWidgetLabel =
  108. " <item row=\"0\" column=\"0\">\n"
  109. " <widget class=\"QLabel\">\n"
  110. " <property name=\"sizePolicy\">\n"
  111. " <sizepolicy hsizetype=\"Fixed\" vsizetype=\"Preferred\">\n"
  112. " <horstretch>0</horstretch>\n"
  113. " <verstretch>0</verstretch>\n"
  114. " </sizepolicy>\n"
  115. " </property>\n"
  116. " <property name=\"text\">\n"
  117. " <string>Integer</string>\n"
  118. " </property>\n"
  119. " </widget>\n"
  120. " </item>\n"
  121. ;
  122. QString integerWidgetSpinBoxHeader =
  123. " <item row=\"0\" column=\"1\">\n"
  124. ;
  125. QString integerWidgetSpinBox =
  126. " <widget class=\"QSpinBox\" name=\"parameter:integer\">\n"
  127. " <property name=\"minimum\">\n"
  128. " <number>-999999999</number>\n"
  129. " </property>\n"
  130. " <property name=\"maximum\">\n"
  131. " <number>999999999</number>\n"
  132. " </property>\n"
  133. " <property name=\"toolTip\">\n"
  134. " <string>Integer description</string>\n"
  135. " </property>\n"
  136. " <property name=\"parameter:valueProperty\">\n"
  137. " <string>value</string>\n"
  138. " </property>\n"
  139. " <property name=\"value\">\n"
  140. " <number>1</number>\n"
  141. " </property>\n"
  142. " </widget>\n"
  143. ;
  144. QString integerWidgetSpinBoxFooter =
  145. " </item>\n"
  146. ;
  147. // ----------------------------------------------------------------------------
  148. void ctkCmdLineModuleQtXslTransformTester::testTransform()
  149. {
  150. ctkCmdLineModuleXslTransform transformer;
  151. QFile transformation(":/ctkCmdLineModuleXmlToQtUi.xsl");
  152. transformer.setXslTransformation(&transformation);
  153. QFETCH(QString, input);
  154. QByteArray inputByteArray = input.toUtf8();
  155. QBuffer inputBuffer(&inputByteArray);
  156. transformer.setInput(&inputBuffer);
  157. QBuffer output;
  158. output.open(QBuffer::ReadWrite);
  159. transformer.setOutput(&output);
  160. transformer.setFormatXmlOutput(true);
  161. QFETCH(bool, expectedSuccess);
  162. bool success = transformer.transform();
  163. if (!success)
  164. {
  165. qDebug() << transformer.errorString();
  166. QCOMPARE(transformer.error(), true);
  167. QVERIFY(!transformer.errorString().isEmpty());
  168. }
  169. QCOMPARE(success, expectedSuccess);
  170. QFETCH(QString, expectedOutput);
  171. QCOMPARE(QString(output.readAll()), expectedOutput);
  172. }
  173. // ----------------------------------------------------------------------------
  174. void ctkCmdLineModuleQtXslTransformTester::testTransform_data()
  175. {
  176. QTest::addColumn<QString>("input");
  177. QTest::addColumn<bool>("expectedSuccess");
  178. QTest::addColumn<QString>("expectedOutput");
  179. QTest::newRow("null") << QString() << false << QString();
  180. QTest::newRow("empty") << QString("") << false << QString();
  181. QTest::newRow("invalidXml") << invalidXml << false << QString();
  182. QString noParameter = header + footer;
  183. QString noParameterUi = mainWidgetHeader + mainWidgetFooter;
  184. QTest::newRow("no parameter") << noParameter << true << noParameterUi;
  185. QString justParameters =
  186. header
  187. + parametersHeader
  188. + parametersFooter
  189. + footer;
  190. QString justParametersUi =
  191. mainWidgetHeader
  192. + parametersWidgetHeader
  193. + parametersWidgetEmptyLayout
  194. + parametersWidgetFooter
  195. + mainWidgetFooter;
  196. QTest::newRow("just parameters") << justParameters << true << justParametersUi;
  197. QString integerParameter =
  198. header
  199. + parametersHeader
  200. + integer
  201. + parametersFooter
  202. + footer;
  203. QString integerParameterUi =
  204. mainWidgetHeader
  205. + parametersWidgetHeader
  206. + parametersLayoutHeader
  207. + integerWidgetLabel
  208. + integerWidgetSpinBoxHeader
  209. + integerWidgetSpinBox
  210. + integerWidgetSpinBoxFooter
  211. + parametersLayoutFooter
  212. + parametersWidgetFooter
  213. + mainWidgetFooter;
  214. QTest::newRow("integer") << integerParameter << true << integerParameterUi;
  215. }
  216. // ----------------------------------------------------------------------------
  217. void ctkCmdLineModuleQtXslTransformTester::testBindVariable()
  218. {
  219. ctkCmdLineModuleXslTransform transformer;
  220. QFile transformation(":/ctkCmdLineModuleXmlToQtUi.xsl");
  221. transformer.setXslTransformation(&transformation);
  222. QFETCH(QString, input);
  223. QByteArray inputArray(input.toUtf8());
  224. QBuffer inputBuffer(&inputArray);
  225. transformer.setInput(&inputBuffer);
  226. QBuffer output;
  227. output.open(QBuffer::ReadWrite);
  228. transformer.setOutput(&output);
  229. transformer.setFormatXmlOutput(true);
  230. QFETCH(QString, variableName);
  231. QFETCH(QString, variableValue);
  232. transformer.bindVariable(variableName, variableValue);
  233. transformer.transform();
  234. QFETCH(QString, expectedOutput);
  235. QCOMPARE(QString(transformer.output()->readAll()), expectedOutput);
  236. }
  237. // ----------------------------------------------------------------------------
  238. void ctkCmdLineModuleQtXslTransformTester::testBindVariable_data()
  239. {
  240. QTest::addColumn<QString>("input");
  241. QTest::addColumn<QString>("variableName");
  242. QTest::addColumn<QString>("variableValue");
  243. QTest::addColumn<QString>("expectedOutput");
  244. QString integerParameter =
  245. header
  246. + parametersHeader
  247. + integer
  248. + parametersFooter
  249. + footer;
  250. QString integerParameterUi =
  251. mainWidgetHeader
  252. + parametersWidgetHeader
  253. + parametersLayoutHeader
  254. + integerWidgetLabel
  255. + integerWidgetSpinBoxHeader
  256. + integerWidgetSpinBox
  257. + integerWidgetSpinBoxFooter
  258. + parametersLayoutFooter
  259. + parametersWidgetFooter
  260. + mainWidgetFooter;
  261. integerParameterUi.replace("QSpinBox", "ctkSliderWidget");
  262. QTest::newRow("QSpinBox -> ctkSpinBox") << integerParameter
  263. << QString("integerWidget")
  264. << QString("ctkSliderWidget")
  265. << integerParameterUi;
  266. }
  267. // ----------------------------------------------------------------------------
  268. void ctkCmdLineModuleQtXslTransformTester::testXslExtraTransformation()
  269. {
  270. ctkCmdLineModuleXslTransform transformer;
  271. QFile transformation(":/ctkCmdLineModuleXmlToQtUi.xsl");
  272. transformer.setXslTransformation(&transformation);
  273. QFETCH(QString, input);
  274. QByteArray inputArray(input.toUtf8());
  275. QBuffer inputBuffer(&inputArray);
  276. transformer.setInput(&inputBuffer);
  277. QBuffer output;
  278. output.open(QBuffer::ReadWrite);
  279. transformer.setOutput(&output);
  280. transformer.setFormatXmlOutput(true);
  281. QFETCH(QString, extra);
  282. QByteArray extraTransformationArray(extra.toUtf8());
  283. QBuffer extraTransformationBuffer(&extraTransformationArray);
  284. transformer.setXslExtraTransformation(&extraTransformationBuffer);
  285. transformer.transform();
  286. QFETCH(QString, expectedOutput);
  287. //qDebug() << transformer.output();
  288. //qDebug() << expectedOutput;
  289. QCOMPARE(QString(transformer.output()->readAll()), expectedOutput);
  290. }
  291. // ----------------------------------------------------------------------------
  292. void ctkCmdLineModuleQtXslTransformTester::testXslExtraTransformation_data()
  293. {
  294. QString extra =
  295. "<xsl:template match=\"parameters/integer\" priority=\"1\">\n"
  296. "<xsl:call-template name=\"gridItemWithLabel\"/>\n"
  297. "<item row=\"{position()-1}\" column=\"1\">\n"
  298. " <layout class=\"QHBoxLayout\">\n"
  299. " <item>\n"
  300. " <widget class=\"QSlider\" name=\"parameter:{name}Slider\">\n"
  301. " <xsl:if test=\"not(constraints)\">\n"
  302. " <property name=\"minimum\">\n"
  303. " <number>-999999999</number>\n"
  304. " </property>\n"
  305. " <property name=\"maximum\">\n"
  306. " <number>999999999</number>\n"
  307. " </property>\n"
  308. " </xsl:if>\n"
  309. " <xsl:call-template name=\"commonWidgetProperties\"/>\n"
  310. " </widget>\n"
  311. " </item>"
  312. " <item>\n"
  313. " <widget class=\"QSpinBox\" name=\"parameter:{name}\">\n"
  314. " <xsl:if test=\"not(constraints)\">\n"
  315. " <property name=\"minimum\">\n"
  316. " <number>-999999999</number>\n"
  317. " </property>\n"
  318. " <property name=\"maximum\">\n"
  319. " <number>999999999</number>\n"
  320. " </property>\n"
  321. " </xsl:if>\n"
  322. " <xsl:call-template name=\"commonWidgetProperties\"/>\n"
  323. " </widget>\n"
  324. " </item>\n"
  325. " </layout>\n"
  326. "</item>\n"
  327. "</xsl:template>\n"
  328. ;
  329. QString integerWidgetSliderSpinBox =
  330. " <layout class=\"QHBoxLayout\">\n"
  331. " <item>\n"
  332. " <widget class=\"QSlider\" name=\"parameter:integerSlider\">\n"
  333. " <property name=\"minimum\">\n"
  334. " <number>-999999999</number>\n"
  335. " </property>\n"
  336. " <property name=\"maximum\">\n"
  337. " <number>999999999</number>\n"
  338. " </property>\n"
  339. " <property name=\"toolTip\">\n"
  340. " <string>Integer description</string>\n"
  341. " </property>\n"
  342. " <property name=\"parameter:valueProperty\">\n"
  343. " <string>value</string>\n"
  344. " </property>\n"
  345. " <property name=\"value\">\n"
  346. " <number>1</number>\n"
  347. " </property>\n"
  348. " </widget>\n"
  349. " </item>\n"
  350. " <item>\n"
  351. " <widget class=\"QSpinBox\" name=\"parameter:integer\">\n"
  352. " <property name=\"minimum\">\n"
  353. " <number>-999999999</number>\n"
  354. " </property>\n"
  355. " <property name=\"maximum\">\n"
  356. " <number>999999999</number>\n"
  357. " </property>\n"
  358. " <property name=\"toolTip\">\n"
  359. " <string>Integer description</string>\n"
  360. " </property>\n"
  361. " <property name=\"parameter:valueProperty\">\n"
  362. " <string>value</string>\n"
  363. " </property>\n"
  364. " <property name=\"value\">\n"
  365. " <number>1</number>\n"
  366. " </property>\n"
  367. " </widget>\n"
  368. " </item>\n"
  369. " </layout>\n"
  370. ;
  371. QTest::addColumn<QString>("input");
  372. QTest::addColumn<QString>("extra");
  373. QTest::addColumn<QString>("expectedOutput");
  374. QString integerParameter =
  375. header
  376. + parametersHeader
  377. + integer
  378. + parametersFooter
  379. + footer;
  380. QString integerParameterUi =
  381. mainWidgetHeader
  382. + parametersWidgetHeader
  383. + parametersLayoutHeader
  384. + integerWidgetLabel
  385. + integerWidgetSpinBoxHeader
  386. + integerWidgetSliderSpinBox
  387. + integerWidgetSpinBoxFooter
  388. + parametersLayoutFooter
  389. + parametersWidgetFooter
  390. + mainWidgetFooter;
  391. QTest::newRow("QSpinBox -> QSlider+QSpinBox") << integerParameter
  392. << extra
  393. << integerParameterUi;
  394. }
  395. // ----------------------------------------------------------------------------
  396. //CTK_TEST_MAIN(ctkCmdLineModuleQtXslTransformTest)
  397. int ctkCmdLineModuleQtXslTransformTest(int argc, char *argv[])
  398. {
  399. QCoreApplication app(argc, argv);
  400. QTEST_DISABLE_KEYPAD_NAVIGATION
  401. // Introduce a dummy linker dependency to CTKCommandLineModulesFrontendQtGui to
  402. // get access to the ctkCmdLineModuleXmlToQtUi.xsl resource.
  403. ctkCmdLineModuleFrontendFactoryQtGui guiFactory;
  404. ctkCmdLineModuleQtXslTransformTester tc;
  405. return QTest::qExec(&tc, argc, argv);
  406. }
  407. #include "moc_ctkCmdLineModuleQtXslTransformTest.cpp"