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"