File indexing completed on 2024-05-12 05:40:47

0001 /***************************************************************************
0002  *   Copyright (C) 2018 by Renaud Guezennec                                *
0003  *   http://renaudguezennec.homelinux.org/accueil,3.html                   *
0004  *                                                                         *
0005  *   Rolisteam is free software; you can redistribute it and/or modify     *
0006  *   it under the terms of the GNU General Public License as published by  *
0007  *   the Free Software Foundation; either version 2 of the License, or     *
0008  *   (at your option) any later version.                                   *
0009  *                                                                         *
0010  *   This program is distributed in the hope that it will be useful,       *
0011  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
0012  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
0013  *   GNU General Public License for more details.                          *
0014  *                                                                         *
0015  *   You should have received a copy of the GNU General Public License     *
0016  *   along with this program; if not, write to the                         *
0017  *   Free Software Foundation, Inc.,                                       *
0018  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
0019  ***************************************************************************/
0020 
0021 #include <QModelIndex>
0022 #include <QModelIndexList>
0023 #include <QString>
0024 #include <QVector>
0025 #include <QtTest>
0026 #include <memory>
0027 
0028 #include "charactersheetitem.h"
0029 #include "charactersheetmodel.h"
0030 #include "field.h"
0031 #include "networkmessagereader.h"
0032 #include "networkmessagewriter.h"
0033 #include "section.h"
0034 #include "tablefield.h"
0035 #include <helper.h>
0036 
0037 class TestCharacterSheetModel : public QObject
0038 {
0039     Q_OBJECT
0040 public:
0041     TestCharacterSheetModel();
0042 
0043 private slots:
0044     void init();
0045 
0046     void creationTest();
0047 
0048     void addField();
0049     void addField_data();
0050 
0051     void addCharacter();
0052 
0053     void removeDataTest();
0054     void removeDataTest_data();
0055 
0056     void saveModelTest();
0057     void saveModelTest_data();
0058 
0059     void readAndWriteModelTest();
0060     void readAndWriteModelTest_data();
0061 
0062     void clearModel();
0063     void clearModel_data();
0064 
0065 private:
0066     std::unique_ptr<CharacterSheetModel> m_model;
0067 };
0068 Q_DECLARE_METATYPE(CharacterSheetItem*);
0069 
0070 TestCharacterSheetModel::TestCharacterSheetModel() {}
0071 
0072 Field* fieldFactory(const CharacterSheetItem::TypeField& currentType)
0073 {
0074     auto field= new Field(true);
0075     field->setCurrentType(currentType);
0076     return field;
0077 }
0078 
0079 void TestCharacterSheetModel::init()
0080 {
0081     m_model.reset(new CharacterSheetModel());
0082 }
0083 
0084 void TestCharacterSheetModel::creationTest()
0085 {
0086     QVERIFY(m_model->getRootSection() != nullptr);
0087 }
0088 
0089 void TestCharacterSheetModel::addField()
0090 {
0091     QFETCH(Field*, field);
0092     QFETCH(int, expected);
0093 
0094     QVERIFY(m_model->rowCount() == 0);
0095 
0096     auto root= new Section();
0097     root->appendChild(field);
0098 
0099     m_model->setRootSection(root);
0100 
0101     QCOMPARE(m_model->rowCount(), expected);
0102 }
0103 
0104 void TestCharacterSheetModel::addField_data()
0105 {
0106     QTest::addColumn<Field*>("field");
0107     QTest::addColumn<int>("expected");
0108 
0109     QTest::addRow("list1") << fieldFactory(CharacterSheetItem::TEXTINPUT) << 1;
0110     QTest::addRow("list2") << fieldFactory(CharacterSheetItem::TEXTFIELD) << 1;
0111     QTest::addRow("list3") << fieldFactory(CharacterSheetItem::TEXTAREA) << 1;
0112     QTest::addRow("list4") << fieldFactory(CharacterSheetItem::SELECT) << 1;
0113     QTest::addRow("list5") << fieldFactory(CharacterSheetItem::CHECKBOX) << 1;
0114     QTest::addRow("list6") << fieldFactory(CharacterSheetItem::IMAGE) << 1;
0115     QTest::addRow("list7") << fieldFactory(CharacterSheetItem::DICEBUTTON) << 1;
0116     QTest::addRow("list8") << fieldFactory(CharacterSheetItem::FUNCBUTTON) << 1;
0117     QTest::addRow("list9") << fieldFactory(CharacterSheetItem::WEBPAGE) << 1;
0118     QTest::addRow("list10") << fieldFactory(CharacterSheetItem::NEXTPAGE) << 1;
0119     QTest::addRow("list11") << fieldFactory(CharacterSheetItem::PREVIOUSPAGE) << 1;
0120     QTest::addRow("list12") << fieldFactory(CharacterSheetItem::TABLE) << 1;
0121 }
0122 
0123 void TestCharacterSheetModel::addCharacter()
0124 {
0125     auto sheet= m_model->addCharacterSheet();
0126     auto uuid= sheet->getUuid();
0127     QCOMPARE(m_model->getCharacterSheetCount(), 1);
0128 
0129     auto sheet2= m_model->getCharacterSheetById(uuid);
0130     QCOMPARE(sheet, sheet2);
0131 
0132     m_model->removeCharacterSheet(sheet);
0133     QCOMPARE(m_model->getCharacterSheetCount(), 0);
0134 }
0135 
0136 void TestCharacterSheetModel::removeDataTest()
0137 {
0138     QFETCH(QVector<Field*>, fields);
0139     QFETCH(int, expected);
0140 
0141     auto sheet= m_model->addCharacterSheet();
0142 
0143     auto root= new Section();
0144     for(auto field : fields)
0145     {
0146         root->appendChild(field);
0147     }
0148     m_model->setRootSection(root);
0149 
0150     QCOMPARE(sheet->getFieldCount(), expected);
0151 
0152     for(auto field : fields)
0153     {
0154         root->removeChild(field);
0155     }
0156     m_model->setRootSection(root);
0157     QCOMPARE(sheet->getFieldCount(), 0);
0158 }
0159 void TestCharacterSheetModel::removeDataTest_data()
0160 {
0161     QTest::addColumn<QVector<Field*>>("fields");
0162     QTest::addColumn<int>("expected");
0163 
0164     QTest::addRow("remove0") << QVector<Field*>() << 0;
0165 
0166     std::vector<CharacterSheetItem::TypeField> data(
0167         {CharacterSheetItem::TEXTINPUT, CharacterSheetItem::TEXTFIELD, CharacterSheetItem::TEXTAREA,
0168             CharacterSheetItem::SELECT, CharacterSheetItem::CHECKBOX, CharacterSheetItem::IMAGE,
0169             CharacterSheetItem::DICEBUTTON, CharacterSheetItem::FUNCBUTTON, CharacterSheetItem::WEBPAGE,
0170             CharacterSheetItem::NEXTPAGE, CharacterSheetItem::PREVIOUSPAGE, CharacterSheetItem::TABLE});
0171 
0172     QVector<Field*> list;
0173 
0174     int index= 0;
0175     for(std::size_t i= 0; i < data.size(); ++i)
0176     {
0177         std::size_t comb_size= i + 1;
0178         do
0179         {
0180             list.clear();
0181             for(auto it= data.begin(); it < data.begin() + comb_size; ++it)
0182             {
0183                 list.push_back(fieldFactory(*it));
0184             }
0185             auto title= QStringLiteral("remove%1").arg(++index);
0186             QTest::addRow(title.toStdString().c_str()) << list << list.size();
0187         } while(Helper::next_combination(data.begin(), data.begin() + comb_size, data.end()));
0188     }
0189 }
0190 void TestCharacterSheetModel::saveModelTest()
0191 {
0192     QJsonObject obj;
0193     {
0194         QFETCH(QVector<Field*>, fields);
0195         QFETCH(int, expected);
0196 
0197         auto sheet= m_model->addCharacterSheet();
0198 
0199         auto root= new Section();
0200         for(auto field : fields)
0201         {
0202             root->appendChild(field);
0203         }
0204         m_model->setRootSection(root);
0205 
0206         QCOMPARE(sheet->getFieldCount(), expected);
0207 
0208         m_model->writeModel(obj, true);
0209     }
0210     CharacterSheetModel model;
0211     model.readModel(obj, true);
0212 
0213     QCOMPARE(model.getCharacterSheetCount(), m_model->getCharacterSheetCount());
0214     auto rootSec= model.getRootSection();
0215     auto rootSec2= m_model->getRootSection();
0216     QCOMPARE(rootSec->getChildrenCount(), rootSec2->getChildrenCount());
0217 }
0218 
0219 void TestCharacterSheetModel::saveModelTest_data()
0220 {
0221     QTest::addColumn<QVector<Field*>>("fields");
0222     QTest::addColumn<int>("expected");
0223 
0224     QTest::addRow("save0") << QVector<Field*>() << 0;
0225 
0226     std::vector<CharacterSheetItem::TypeField> data(
0227         {CharacterSheetItem::TEXTINPUT, CharacterSheetItem::TEXTFIELD, CharacterSheetItem::TEXTAREA,
0228             CharacterSheetItem::SELECT, CharacterSheetItem::CHECKBOX, CharacterSheetItem::IMAGE,
0229             CharacterSheetItem::DICEBUTTON, CharacterSheetItem::FUNCBUTTON, CharacterSheetItem::WEBPAGE,
0230             CharacterSheetItem::NEXTPAGE, CharacterSheetItem::PREVIOUSPAGE, CharacterSheetItem::TABLE});
0231 
0232     QVector<Field*> list;
0233 
0234     int index= 0;
0235     for(std::size_t i= 0; i < data.size(); ++i)
0236     {
0237         std::size_t comb_size= i + 1;
0238         do
0239         {
0240             list.clear();
0241             for(auto it= data.begin(); it < data.begin() + comb_size; ++it)
0242             {
0243                 list.push_back(fieldFactory(*it));
0244             }
0245             auto title= QStringLiteral("save%1").arg(++index);
0246             QTest::addRow(title.toStdString().c_str()) << list << list.size();
0247         } while(Helper::next_combination(data.begin(), data.begin() + comb_size, data.end()));
0248     }
0249 }
0250 
0251 void TestCharacterSheetModel::readAndWriteModelTest()
0252 {
0253     NetworkMessageWriter msg(NetMsg::CharacterCategory, NetMsg::addCharacterSheet);
0254     {
0255         QFETCH(QVector<Field*>, fields);
0256         QFETCH(int, expected);
0257 
0258         auto sheet= m_model->addCharacterSheet();
0259 
0260         auto root= new Section();
0261         for(auto field : fields)
0262         {
0263             root->appendChild(field);
0264         }
0265         m_model->setRootSection(root);
0266 
0267         QCOMPARE(sheet->getFieldCount(), expected);
0268 
0269         m_model->fillRootSection(&msg);
0270     }
0271     CharacterSheetModel model;
0272     NetworkMessageReader reader;
0273     auto const array= msg.getData();
0274     reader.setInternalData(array);
0275     reader.resetToData();
0276     model.readRootSection(&reader);
0277 
0278     auto rootSec= model.getRootSection();
0279     auto rootSec2= m_model->getRootSection();
0280     QCOMPARE(rootSec->getChildrenCount(), rootSec2->getChildrenCount());
0281 }
0282 void TestCharacterSheetModel::readAndWriteModelTest_data()
0283 {
0284     QTest::addColumn<QVector<Field*>>("fields");
0285     QTest::addColumn<int>("expected");
0286 
0287     QTest::addRow("network0") << QVector<Field*>() << 0;
0288 
0289     std::vector<CharacterSheetItem::TypeField> data(
0290         {CharacterSheetItem::TEXTINPUT, CharacterSheetItem::TEXTFIELD, CharacterSheetItem::TEXTAREA,
0291             CharacterSheetItem::SELECT, CharacterSheetItem::CHECKBOX, CharacterSheetItem::IMAGE,
0292             CharacterSheetItem::DICEBUTTON, CharacterSheetItem::FUNCBUTTON, CharacterSheetItem::WEBPAGE,
0293             CharacterSheetItem::NEXTPAGE, CharacterSheetItem::PREVIOUSPAGE, CharacterSheetItem::TABLE});
0294 
0295     QVector<Field*> list;
0296 
0297     int index= 0;
0298     for(std::size_t i= 0; i < data.size(); ++i)
0299     {
0300         std::size_t comb_size= i + 1;
0301         do
0302         {
0303             list.clear();
0304             for(auto it= data.begin(); it < data.begin() + comb_size; ++it)
0305             {
0306                 list.push_back(fieldFactory(*it));
0307             }
0308             auto title= QStringLiteral("network%1").arg(++index);
0309             QTest::addRow(title.toStdString().c_str()) << list << list.size();
0310         } while(Helper::next_combination(data.begin(), data.begin() + comb_size, data.end()));
0311     }
0312 }
0313 void TestCharacterSheetModel::clearModel()
0314 {
0315     QFETCH(QVector<Field*>, fields);
0316     QFETCH(int, expected);
0317 
0318     QPointer<CharacterSheet> sheet= m_model->addCharacterSheet();
0319 
0320     auto root= new Section();
0321     for(auto field : fields)
0322     {
0323         root->appendChild(field);
0324     }
0325     m_model->setRootSection(root);
0326 
0327     QCOMPARE(sheet->getFieldCount(), expected);
0328 
0329     m_model->clearModel();
0330     QCOMPARE(sheet.isNull(), true);
0331     QCOMPARE(m_model->getCharacterSheetCount(), 0);
0332     QCOMPARE(m_model->getRootSection()->getChildrenCount(), 0);
0333 }
0334 void TestCharacterSheetModel::clearModel_data()
0335 {
0336     QTest::addColumn<QVector<Field*>>("fields");
0337     QTest::addColumn<int>("expected");
0338 
0339     QTest::addRow("clear0") << QVector<Field*>() << 0;
0340 
0341     std::vector<CharacterSheetItem::TypeField> data(
0342         {CharacterSheetItem::TEXTINPUT, CharacterSheetItem::TEXTFIELD, CharacterSheetItem::TEXTAREA,
0343             CharacterSheetItem::SELECT, CharacterSheetItem::CHECKBOX, CharacterSheetItem::IMAGE,
0344             CharacterSheetItem::DICEBUTTON, CharacterSheetItem::FUNCBUTTON, CharacterSheetItem::WEBPAGE,
0345             CharacterSheetItem::NEXTPAGE, CharacterSheetItem::PREVIOUSPAGE, CharacterSheetItem::TABLE});
0346 
0347     QVector<Field*> list;
0348 
0349     int index= 0;
0350     for(std::size_t i= 0; i < data.size(); ++i)
0351     {
0352         std::size_t comb_size= i + 1;
0353         do
0354         {
0355             list.clear();
0356             for(auto it= data.begin(); it < data.begin() + comb_size; ++it)
0357             {
0358                 list.push_back(fieldFactory(*it));
0359             }
0360             auto title= QStringLiteral("clear%1").arg(++index);
0361             QTest::addRow(title.toStdString().c_str()) << list << list.size();
0362         } while(Helper::next_combination(data.begin(), data.begin() + comb_size, data.end()));
0363     }
0364 }
0365 QTEST_MAIN(TestCharacterSheetModel);
0366 
0367 #include "tst_charactersheetmodel.moc"