ctkCmdLineModuleXslTransformTest.cpp 16 KB

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