ctkCmdLineModuleQtXslTransformTest.cpp 18 KB

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