123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468 |
- /*=========================================================================
- Library: CTK
- Copyright (c) Kitware Inc.
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0.txt
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- =========================================================================*/
- // Qt includes
- #include <QBuffer>
- #include <QCoreApplication>
- #include <QList>
- #include <QString>
- // CTK includes
- #include "ctkCmdLineModuleFrontendFactoryQtGui.h"
- #include "ctkCmdLineModuleXslTransform.h"
- #include "ctkTest.h"
- // ----------------------------------------------------------------------------
- class ctkCmdLineModuleQtXslTransformTester: public QObject
- {
- Q_OBJECT
- private slots:
- void initTestCase();
- void testTransform();
- void testTransform_data();
- void testBindVariable();
- void testBindVariable_data();
- void testXslExtraTransformation();
- void testXslExtraTransformation_data();
- };
- QString invalidXml =
- "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
- "<executable>";
- QString header =
- "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
- "<executable>"
- " <category/>"
- " <title>A Test</title>"
- " <description><![CDATA[No parameter.]]></description>"
- " <version>0.1.0</version>"
- " <documentation-url/>"
- " <license/>"
- " <contributor></contributor>"
- " <acknowledgements/>";
- QString footer =
- "</executable>\n";
- QString mainWidgetHeader =
- "<ui version=\"4.0\">\n"
- " <class>ATest</class>\n"
- " <widget class=\"QWidget\" name=\"executable:A Test\">\n"
- " <layout class=\"QVBoxLayout\">\n";
- QString mainWidgetFooter =
- " <item>\n"
- " <spacer name=\"verticalSpacer\">\n"
- " <property name=\"orientation\">\n"
- " <enum>Qt::Vertical</enum>\n"
- " </property>\n"
- " </spacer>\n"
- " </item>\n"
- " </layout>\n"
- " </widget>\n"
- " <connections/>\n"
- "</ui>\n";
- QString parametersHeader =
- " <parameters>"
- " <label>Parameters</label>"
- " <description><![CDATA[Parameters]]></description>";
- QString parametersFooter =
- " </parameters>\n";
- QString parametersWidgetHeader =
- " <item>\n"
- " <widget class=\"ctkCollapsibleGroupBox\" name=\"paramGroup:Parameters\">\n"
- " <property name=\"title\">\n"
- " <string>Parameters</string>\n"
- " </property>\n"
- " <property name=\"toolTip\">\n"
- " <string>Parameters</string>\n"
- " </property>\n"
- " <property name=\"checked\">\n"
- " <bool>true</bool>\n"
- " </property>\n"
- ;
- QString parametersWidgetEmptyLayout =
- " <layout class=\"QGridLayout\"/>\n";
- QString parametersLayoutHeader =
- " <layout class=\"QGridLayout\">\n";
- QString parametersLayoutFooter =
- " </layout>\n";
- QString parametersWidgetFooter =
- " </widget>\n"
- " </item>\n"
- ;
- QString integer =
- "<integer>"
- " <name>integer</name>"
- " <flag>-i</flag>"
- " <longflag>--integer</longflag>"
- " <description><![CDATA[Integer description]]></description>"
- " <label>Integer</label>"
- " <default>1</default>"
- "</integer>"
- ;
- QString integerWidgetLabel =
- " <item row=\"0\" column=\"0\">\n"
- " <widget class=\"QLabel\">\n"
- " <property name=\"sizePolicy\">\n"
- " <sizepolicy hsizetype=\"Fixed\" vsizetype=\"Preferred\">\n"
- " <horstretch>0</horstretch>\n"
- " <verstretch>0</verstretch>\n"
- " </sizepolicy>\n"
- " </property>\n"
- " <property name=\"text\">\n"
- " <string>Integer</string>\n"
- " </property>\n"
- " </widget>\n"
- " </item>\n"
- ;
- QString integerWidgetSpinBoxHeader =
- " <item row=\"0\" column=\"1\">\n"
- ;
- QString integerWidgetSpinBox =
- " <widget class=\"QSpinBox\" name=\"parameter:integer\">\n"
- " <property name=\"minimum\">\n"
- " <number>-999999999</number>\n"
- " </property>\n"
- " <property name=\"maximum\">\n"
- " <number>999999999</number>\n"
- " </property>\n"
- " <property name=\"toolTip\">\n"
- " <string>Integer description</string>\n"
- " </property>\n"
- " <property name=\"parameter:valueProperty\">\n"
- " <string>value</string>\n"
- " </property>\n"
- " <property name=\"value\">\n"
- " <number>1</number>\n"
- " </property>\n"
- " </widget>\n"
- ;
- QString integerWidgetSpinBoxFooter =
- " </item>\n"
- ;
- // ----------------------------------------------------------------------------
- void ctkCmdLineModuleQtXslTransformTester::initTestCase()
- {
- // Introduce a dummy linker dependency to CTKCommandLineModulesFrontendQtGui to
- // get access to the ctkCmdLineModuleXmlToQtUi.xsl resource.
- ctkCmdLineModuleFrontendFactoryQtGui guiFactory;
- }
- // ----------------------------------------------------------------------------
- void ctkCmdLineModuleQtXslTransformTester::testTransform()
- {
- ctkCmdLineModuleXslTransform transformer;
- QFile transformation(":/ctkCmdLineModuleXmlToQtUi.xsl");
- transformer.setXslTransformation(&transformation);
- QFETCH(QString, input);
- QByteArray inputByteArray = input.toUtf8();
- QBuffer inputBuffer(&inputByteArray);
- transformer.setInput(&inputBuffer);
- QBuffer output;
- output.open(QBuffer::ReadWrite);
- transformer.setOutput(&output);
- transformer.setFormatXmlOutput(true);
- QFETCH(bool, expectedSuccess);
- bool success = transformer.transform();
- if (!success)
- {
- qDebug() << transformer.errorString();
- QCOMPARE(transformer.error(), true);
- QVERIFY(!transformer.errorString().isEmpty());
- }
- QCOMPARE(success, expectedSuccess);
- QFETCH(QString, expectedOutput);
- QCOMPARE(QString(output.readAll()), expectedOutput);
- }
- // ----------------------------------------------------------------------------
- void ctkCmdLineModuleQtXslTransformTester::testTransform_data()
- {
- QTest::addColumn<QString>("input");
- QTest::addColumn<bool>("expectedSuccess");
- QTest::addColumn<QString>("expectedOutput");
- QTest::newRow("null") << QString() << false << QString();
- QTest::newRow("empty") << QString("") << false << QString();
- QTest::newRow("invalidXml") << invalidXml << false << QString();
- QString noParameter = header + footer;
- QString noParameterUi = mainWidgetHeader + mainWidgetFooter;
- QTest::newRow("no parameter") << noParameter << true << noParameterUi;
- QString justParameters =
- header
- + parametersHeader
- + parametersFooter
- + footer;
- QString justParametersUi =
- mainWidgetHeader
- + parametersWidgetHeader
- + parametersWidgetEmptyLayout
- + parametersWidgetFooter
- + mainWidgetFooter;
- QTest::newRow("just parameters") << justParameters << true << justParametersUi;
- QString integerParameter =
- header
- + parametersHeader
- + integer
- + parametersFooter
- + footer;
- QString integerParameterUi =
- mainWidgetHeader
- + parametersWidgetHeader
- + parametersLayoutHeader
- + integerWidgetLabel
- + integerWidgetSpinBoxHeader
- + integerWidgetSpinBox
- + integerWidgetSpinBoxFooter
- + parametersLayoutFooter
- + parametersWidgetFooter
- + mainWidgetFooter;
- QTest::newRow("integer") << integerParameter << true << integerParameterUi;
- }
- // ----------------------------------------------------------------------------
- void ctkCmdLineModuleQtXslTransformTester::testBindVariable()
- {
- ctkCmdLineModuleXslTransform transformer;
- QFile transformation(":/ctkCmdLineModuleXmlToQtUi.xsl");
- transformer.setXslTransformation(&transformation);
- QFETCH(QString, input);
- QByteArray inputArray(input.toUtf8());
- QBuffer inputBuffer(&inputArray);
- transformer.setInput(&inputBuffer);
- QBuffer output;
- output.open(QBuffer::ReadWrite);
- transformer.setOutput(&output);
- transformer.setFormatXmlOutput(true);
- QFETCH(QString, variableName);
- QFETCH(QString, variableValue);
- transformer.bindVariable(variableName, variableValue);
- transformer.transform();
- QFETCH(QString, expectedOutput);
- QCOMPARE(QString(transformer.output()->readAll()), expectedOutput);
- }
- // ----------------------------------------------------------------------------
- void ctkCmdLineModuleQtXslTransformTester::testBindVariable_data()
- {
- QTest::addColumn<QString>("input");
- QTest::addColumn<QString>("variableName");
- QTest::addColumn<QString>("variableValue");
- QTest::addColumn<QString>("expectedOutput");
- QString integerParameter =
- header
- + parametersHeader
- + integer
- + parametersFooter
- + footer;
- QString integerParameterUi =
- mainWidgetHeader
- + parametersWidgetHeader
- + parametersLayoutHeader
- + integerWidgetLabel
- + integerWidgetSpinBoxHeader
- + integerWidgetSpinBox
- + integerWidgetSpinBoxFooter
- + parametersLayoutFooter
- + parametersWidgetFooter
- + mainWidgetFooter;
- integerParameterUi.replace("QSpinBox", "ctkSliderWidget");
- QTest::newRow("QSpinBox -> ctkSpinBox") << integerParameter
- << QString("integerWidget")
- << QString("ctkSliderWidget")
- << integerParameterUi;
- }
- // ----------------------------------------------------------------------------
- void ctkCmdLineModuleQtXslTransformTester::testXslExtraTransformation()
- {
- ctkCmdLineModuleXslTransform transformer;
- QFile transformation(":/ctkCmdLineModuleXmlToQtUi.xsl");
- transformer.setXslTransformation(&transformation);
- QFETCH(QString, input);
- QByteArray inputArray(input.toUtf8());
- QBuffer inputBuffer(&inputArray);
- transformer.setInput(&inputBuffer);
- QBuffer output;
- output.open(QBuffer::ReadWrite);
- transformer.setOutput(&output);
- transformer.setFormatXmlOutput(true);
- QFETCH(QString, extra);
- QByteArray extraTransformationArray(extra.toUtf8());
- QBuffer extraTransformationBuffer(&extraTransformationArray);
- transformer.setXslExtraTransformation(&extraTransformationBuffer);
- transformer.transform();
- QFETCH(QString, expectedOutput);
- //qDebug() << transformer.output();
- //qDebug() << expectedOutput;
- QCOMPARE(QString(transformer.output()->readAll()), expectedOutput);
- }
- // ----------------------------------------------------------------------------
- void ctkCmdLineModuleQtXslTransformTester::testXslExtraTransformation_data()
- {
- QString extra =
- "<xsl:template match=\"parameters/integer\" priority=\"1\">\n"
- "<xsl:call-template name=\"gridItemWithLabel\"/>\n"
- "<item row=\"{position()-1}\" column=\"1\">\n"
- " <layout class=\"QHBoxLayout\">\n"
- " <item>\n"
- " <widget class=\"QSlider\" name=\"parameter:{name}Slider\">\n"
- " <xsl:if test=\"not(constraints)\">\n"
- " <property name=\"minimum\">\n"
- " <number>-999999999</number>\n"
- " </property>\n"
- " <property name=\"maximum\">\n"
- " <number>999999999</number>\n"
- " </property>\n"
- " </xsl:if>\n"
- " <xsl:call-template name=\"commonWidgetProperties\"/>\n"
- " </widget>\n"
- " </item>"
- " <item>\n"
- " <widget class=\"QSpinBox\" name=\"parameter:{name}\">\n"
- " <xsl:if test=\"not(constraints)\">\n"
- " <property name=\"minimum\">\n"
- " <number>-999999999</number>\n"
- " </property>\n"
- " <property name=\"maximum\">\n"
- " <number>999999999</number>\n"
- " </property>\n"
- " </xsl:if>\n"
- " <xsl:call-template name=\"commonWidgetProperties\"/>\n"
- " </widget>\n"
- " </item>\n"
- " </layout>\n"
- "</item>\n"
- "</xsl:template>\n"
- ;
- QString integerWidgetSliderSpinBox =
- " <layout class=\"QHBoxLayout\">\n"
- " <item>\n"
- " <widget class=\"QSlider\" name=\"parameter:integerSlider\">\n"
- " <property name=\"minimum\">\n"
- " <number>-999999999</number>\n"
- " </property>\n"
- " <property name=\"maximum\">\n"
- " <number>999999999</number>\n"
- " </property>\n"
- " <property name=\"toolTip\">\n"
- " <string>Integer description</string>\n"
- " </property>\n"
- " <property name=\"parameter:valueProperty\">\n"
- " <string>value</string>\n"
- " </property>\n"
- " <property name=\"value\">\n"
- " <number>1</number>\n"
- " </property>\n"
- " </widget>\n"
- " </item>\n"
- " <item>\n"
- " <widget class=\"QSpinBox\" name=\"parameter:integer\">\n"
- " <property name=\"minimum\">\n"
- " <number>-999999999</number>\n"
- " </property>\n"
- " <property name=\"maximum\">\n"
- " <number>999999999</number>\n"
- " </property>\n"
- " <property name=\"toolTip\">\n"
- " <string>Integer description</string>\n"
- " </property>\n"
- " <property name=\"parameter:valueProperty\">\n"
- " <string>value</string>\n"
- " </property>\n"
- " <property name=\"value\">\n"
- " <number>1</number>\n"
- " </property>\n"
- " </widget>\n"
- " </item>\n"
- " </layout>\n"
- ;
- QTest::addColumn<QString>("input");
- QTest::addColumn<QString>("extra");
- QTest::addColumn<QString>("expectedOutput");
- QString integerParameter =
- header
- + parametersHeader
- + integer
- + parametersFooter
- + footer;
- QString integerParameterUi =
- mainWidgetHeader
- + parametersWidgetHeader
- + parametersLayoutHeader
- + integerWidgetLabel
- + integerWidgetSpinBoxHeader
- + integerWidgetSliderSpinBox
- + integerWidgetSpinBoxFooter
- + parametersLayoutFooter
- + parametersWidgetFooter
- + mainWidgetFooter;
- QTest::newRow("QSpinBox -> QSlider+QSpinBox") << integerParameter
- << extra
- << integerParameterUi;
- }
- // ----------------------------------------------------------------------------
- CTK_TEST_MAIN(ctkCmdLineModuleQtXslTransformTest)
- #include "moc_ctkCmdLineModuleQtXslTransformTest.cpp"
|