ctkCmdLineModuleQtXslTransformTest.cpp 17 KB

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