ctkCmdLineModuleXslTransformTest.cpp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495
  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:cppType\">\n"
  136. " <string>int</string>\n"
  137. " </property>\n"
  138. " <property name=\"parameter:valueProperty\">\n"
  139. " <string>value</string>\n"
  140. " </property>\n"
  141. " <property name=\"value\">\n"
  142. " <number>1</number>\n"
  143. " </property>\n"
  144. " <property name=\"parameter:flag\">\n"
  145. " <string>-i</string>\n"
  146. " </property>\n"
  147. " <property name=\"parameter:longflag\">\n"
  148. " <string>--integer</string>\n"
  149. " </property>\n"
  150. " <property name=\"parameter:description\">\n"
  151. " <string>Integer description</string>\n"
  152. " </property>\n"
  153. " <property name=\"parameter:label\">\n"
  154. " <string>Integer</string>\n"
  155. " </property>\n"
  156. " <property name=\"parameter:default\">\n"
  157. " <string>1</string>\n"
  158. " </property>\n"
  159. " </widget>\n"
  160. ;
  161. QString integerWidgetSpinBoxFooter =
  162. " </item>\n"
  163. ;
  164. // ----------------------------------------------------------------------------
  165. void ctkCmdLineModuleXslTransformTester::testTransform()
  166. {
  167. ctkCmdLineModuleXslTransform transformer;
  168. QFETCH(QString, input);
  169. QByteArray inputByteArray = input.toUtf8();
  170. QBuffer inputBuffer(&inputByteArray);
  171. transformer.setInput(&inputBuffer);
  172. QBuffer output;
  173. output.open(QBuffer::ReadWrite);
  174. transformer.setOutput(&output);
  175. QFETCH(bool, expectedSuccess);
  176. bool success = transformer.transform();
  177. if (!success)
  178. {
  179. qDebug() << transformer.errorString();
  180. QCOMPARE(transformer.error(), true);
  181. QVERIFY(!transformer.errorString().isEmpty());
  182. }
  183. QCOMPARE(success, expectedSuccess);
  184. QFETCH(QString, expectedOutput);
  185. QCOMPARE(QString(output.readAll()), expectedOutput);
  186. }
  187. // ----------------------------------------------------------------------------
  188. void ctkCmdLineModuleXslTransformTester::testTransform_data()
  189. {
  190. QTest::addColumn<QString>("input");
  191. QTest::addColumn<bool>("expectedSuccess");
  192. QTest::addColumn<QString>("expectedOutput");
  193. QTest::newRow("null") << QString() << false << QString();
  194. QTest::newRow("empty") << QString("") << false << QString();
  195. QTest::newRow("invalidXml") << invalidXml << false << QString();
  196. QString noParameter = header + footer;
  197. QString noParameterUi = mainWidgetHeader + mainWidgetFooter;
  198. QTest::newRow("no parameter") << noParameter << true << noParameterUi;
  199. QString justParameters =
  200. header
  201. + parametersHeader
  202. + parametersFooter
  203. + footer;
  204. QString justParametersUi =
  205. mainWidgetHeader
  206. + parametersWidgetHeader
  207. + parametersWidgetEmptyLayout
  208. + parametersWidgetFooter
  209. + mainWidgetFooter;
  210. QTest::newRow("just parameters") << justParameters << true << justParametersUi;
  211. QString integerParameter =
  212. header
  213. + parametersHeader
  214. + integer
  215. + parametersFooter
  216. + footer;
  217. QString integerParameterUi =
  218. mainWidgetHeader
  219. + parametersWidgetHeader
  220. + parametersLayoutHeader
  221. + integerWidgetLabel
  222. + integerWidgetSpinBoxHeader
  223. + integerWidgetSpinBox
  224. + integerWidgetSpinBoxFooter
  225. + parametersLayoutFooter
  226. + parametersWidgetFooter
  227. + mainWidgetFooter;
  228. QTest::newRow("integer") << integerParameter << true << integerParameterUi;
  229. }
  230. // ----------------------------------------------------------------------------
  231. void ctkCmdLineModuleXslTransformTester::testBindVariable()
  232. {
  233. ctkCmdLineModuleXslTransform transformer;
  234. QFETCH(QString, input);
  235. QByteArray inputArray(input.toUtf8());
  236. QBuffer inputBuffer(&inputArray);
  237. transformer.setInput(&inputBuffer);
  238. QBuffer output;
  239. output.open(QBuffer::ReadWrite);
  240. transformer.setOutput(&output);
  241. QFETCH(QString, variableName);
  242. QFETCH(QString, variableValue);
  243. transformer.bindVariable(variableName, variableValue);
  244. transformer.transform();
  245. QFETCH(QString, expectedOutput);
  246. QCOMPARE(QString(transformer.output()->readAll()), expectedOutput);
  247. }
  248. // ----------------------------------------------------------------------------
  249. void ctkCmdLineModuleXslTransformTester::testBindVariable_data()
  250. {
  251. QTest::addColumn<QString>("input");
  252. QTest::addColumn<QString>("variableName");
  253. QTest::addColumn<QString>("variableValue");
  254. QTest::addColumn<QString>("expectedOutput");
  255. QString integerParameter =
  256. header
  257. + parametersHeader
  258. + integer
  259. + parametersFooter
  260. + footer;
  261. QString integerParameterUi =
  262. mainWidgetHeader
  263. + parametersWidgetHeader
  264. + parametersLayoutHeader
  265. + integerWidgetLabel
  266. + integerWidgetSpinBoxHeader
  267. + integerWidgetSpinBox
  268. + integerWidgetSpinBoxFooter
  269. + parametersLayoutFooter
  270. + parametersWidgetFooter
  271. + mainWidgetFooter;
  272. integerParameterUi.replace("QSpinBox", "ctkSliderWidget");
  273. QTest::newRow("QSpinBox -> ctkSpinBox") << integerParameter
  274. << QString("integerWidget")
  275. << QString("ctkSliderWidget")
  276. << integerParameterUi;
  277. }
  278. // ----------------------------------------------------------------------------
  279. void ctkCmdLineModuleXslTransformTester::testXslExtraTransformation()
  280. {
  281. ctkCmdLineModuleXslTransform transformer;
  282. QFETCH(QString, input);
  283. QByteArray inputArray(input.toUtf8());
  284. QBuffer inputBuffer(&inputArray);
  285. transformer.setInput(&inputBuffer);
  286. QBuffer output;
  287. output.open(QBuffer::ReadWrite);
  288. transformer.setOutput(&output);
  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 ctkCmdLineModuleXslTransformTester::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:cppType\">\n"
  351. " <string>int</string>\n"
  352. " </property>\n"
  353. " <property name=\"parameter:valueProperty\">\n"
  354. " <string>value</string>\n"
  355. " </property>\n"
  356. " <property name=\"value\">\n"
  357. " <number>1</number>\n"
  358. " </property>\n"
  359. " <property name=\"parameter:flag\">\n"
  360. " <string>-i</string>\n"
  361. " </property>\n"
  362. " <property name=\"parameter:longflag\">\n"
  363. " <string>--integer</string>\n"
  364. " </property>\n"
  365. " <property name=\"parameter:description\">\n"
  366. " <string>Integer description</string>\n"
  367. " </property>\n"
  368. " <property name=\"parameter:label\">\n"
  369. " <string>Integer</string>\n"
  370. " </property>\n"
  371. " <property name=\"parameter:default\">\n"
  372. " <string>1</string>\n"
  373. " </property>\n"
  374. " </widget>\n"
  375. " </item>\n"
  376. " <item>\n"
  377. " <widget class=\"QSpinBox\" name=\"parameter:integer\">\n"
  378. " <property name=\"minimum\">\n"
  379. " <number>-999999999</number>\n"
  380. " </property>\n"
  381. " <property name=\"maximum\">\n"
  382. " <number>999999999</number>\n"
  383. " </property>\n"
  384. " <property name=\"toolTip\">\n"
  385. " <string>Integer description</string>\n"
  386. " </property>\n"
  387. " <property name=\"parameter:cppType\">\n"
  388. " <string>int</string>\n"
  389. " </property>\n"
  390. " <property name=\"parameter:valueProperty\">\n"
  391. " <string>value</string>\n"
  392. " </property>\n"
  393. " <property name=\"value\">\n"
  394. " <number>1</number>\n"
  395. " </property>\n"
  396. " <property name=\"parameter:flag\">\n"
  397. " <string>-i</string>\n"
  398. " </property>\n"
  399. " <property name=\"parameter:longflag\">\n"
  400. " <string>--integer</string>\n"
  401. " </property>\n"
  402. " <property name=\"parameter:description\">\n"
  403. " <string>Integer description</string>\n"
  404. " </property>\n"
  405. " <property name=\"parameter:label\">\n"
  406. " <string>Integer</string>\n"
  407. " </property>\n"
  408. " <property name=\"parameter:default\">\n"
  409. " <string>1</string>\n"
  410. " </property>\n"
  411. " </widget>\n"
  412. " </item>\n"
  413. " </layout>\n"
  414. ;
  415. QTest::addColumn<QString>("input");
  416. QTest::addColumn<QString>("extra");
  417. QTest::addColumn<QString>("expectedOutput");
  418. QString integerParameter =
  419. header
  420. + parametersHeader
  421. + integer
  422. + parametersFooter
  423. + footer;
  424. QString integerParameterUi =
  425. mainWidgetHeader
  426. + parametersWidgetHeader
  427. + parametersLayoutHeader
  428. + integerWidgetLabel
  429. + integerWidgetSpinBoxHeader
  430. + integerWidgetSliderSpinBox
  431. + integerWidgetSpinBoxFooter
  432. + parametersLayoutFooter
  433. + parametersWidgetFooter
  434. + mainWidgetFooter;
  435. QTest::newRow("QSpinBox -> QSlider+QSpinBox") << integerParameter
  436. << extra
  437. << integerParameterUi;
  438. }
  439. // ----------------------------------------------------------------------------
  440. CTK_TEST_MAIN(ctkCmdLineModuleXslTransformTest)
  441. #include "moc_ctkCmdLineModuleXslTransformTest.cpp"