File indexing completed on 2024-05-12 05:40:46
0001 /*************************************************************************** 0002 * Copyright (C) 2011 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 #include <QAbstractItemModelTester> 0021 #include <QObject> 0022 #include <QString> 0023 #include <QtTest> 0024 0025 #include "controller/antagonistboardcontroller.h" 0026 #include "model/nonplayablecharactermodel.h" 0027 #include <memory> 0028 0029 struct PropertyInfo 0030 { 0031 QString name; 0032 QVariantList values; 0033 QList<int> matchingCount; 0034 }; 0035 0036 void initModel(campaign::NonPlayableCharacterModel* model) 0037 { 0038 // name, path, descr, color, distanceperturn, hp, initVal, lifeColor, minhp, maxhp, size, state Id, tags, id, 0039 // hasAct, hasProp, hasShape 0040 std::vector<std::tuple<QString, QString, QString, QColor, int, int, int, QColor, int, int, int, QString, 0041 QStringList, QString, bool, bool, bool, QString, QString>> 0042 data{ 0043 {"Lynn Gray-Rike", 0044 "", 0045 "blond with a gun", 0046 QColor(Qt::blue), 0047 0, 0048 100, 0049 0, 0050 QColor(Qt::green), 0051 0, 0052 100, 0053 64, 0054 "safe", 0055 {"cops", "girl", "swat", "law"}, 0056 "lynn", 0057 true, 0058 true, 0059 true, 0060 "", 0061 ""}, 0062 {"Otomo Akamu", 0063 "", 0064 "Ikoma's shadow", 0065 QColor(Qt::darkGreen), 0066 0, 0067 49, 0068 10, 0069 QColor(Qt::green), 0070 0, 0071 100, 0072 64, 0073 "injured", 0074 {"l5r", "secret", "honor", "spouse"}, 0075 "akamu", 0076 false, 0077 false, 0078 false, 0079 "4G3", 0080 "gm details"}, 0081 {"Ikoma Kae", 0082 "", 0083 "Proud with beautiful voice", 0084 QColor(Qt::darkYellow), 0085 0, 0086 100, 0087 0, 0088 QColor(Qt::green), 0089 0, 0090 100, 0091 64, 0092 "safe", 0093 {"l5r", "singer", "general", "lion"}, 0094 "kae", 0095 true, 0096 false, 0097 false, 0098 "1d10+10", 0099 "daughter of the bad guy"}, 0100 {"Toku Kahime", 0101 "", 0102 "The young prodigy", 0103 QColor(Qt::darkRed), 0104 0, 0105 12, 0106 35, 0107 QColor(Qt::green), 0108 0, 0109 100, 0110 64, 0111 "heavily injured", 0112 {"l5r", "champion", "monkey", "samurai"}, 0113 "kahime", 0114 true, 0115 true, 0116 false, 0117 "", 0118 "Afraid of hawks"}, 0119 {"John Northa", 0120 "", 0121 "Long sword actor", 0122 QColor(Qt::cyan), 0123 0, 0124 100, 0125 0, 0126 QColor(Qt::green), 0127 0, 0128 100, 0129 64, 0130 "safe", 0131 {"mv", "angel", "sword", "faith"}, 0132 "john", 0133 true, 0134 false, 0135 true, 0136 "6d10", 0137 ""}, 0138 {"Luna Gaztelumendi", 0139 "", 0140 "Demon with sniper rifle", 0141 QColor(Qt::darkMagenta), 0142 0, 0143 0, 0144 0, 0145 QColor(Qt::green), 0146 0, 0147 100, 0148 64, 0149 "dead", 0150 {"ins", "girl", "demon", "succube"}, 0151 "luna", 0152 false, 0153 true, 0154 true, 0155 "", 0156 ""}, 0157 }; 0158 0159 int i= 0; 0160 for(auto& character : data) 0161 { 0162 auto c= new campaign::NonPlayableCharacter(); 0163 c->setName(std::get<0>(character)); 0164 c->setAvatarPath(std::get<1>(character)); 0165 c->setDescription(std::get<2>(character)); 0166 c->setColor(std::get<3>(character)); 0167 c->setDistancePerTurn(std::get<4>(character)); 0168 c->setHealthPointsCurrent(std::get<5>(character)); 0169 c->setInitiativeScore(std::get<6>(character)); 0170 c->setLifeColor(std::get<7>(character)); 0171 c->setHealthPointsMin(std::get<8>(character)); 0172 c->setHealthPointsMax(std::get<9>(character)); 0173 c->setSize(std::get<10>(character)); 0174 c->setStateId(std::get<11>(character)); 0175 c->setTags(std::get<12>(character)); 0176 c->setUuid(std::get<13>(character)); 0177 0178 if(std::get<14>(character)) 0179 { // actions 0180 c->addAction(new CharacterAction()); 0181 } 0182 if(std::get<15>(character)) 0183 { // properties 0184 c->addProperty(new CharacterProperty()); 0185 } 0186 if(std::get<16>(character)) 0187 { // shape 0188 c->addShape(new CharacterShape()); 0189 } 0190 c->setInitCommand(std::get<17>(character)); 0191 c->setGameMasterDesc(std::get<18>(character)); 0192 0193 model->addCharacter(c); 0194 } 0195 } 0196 0197 class TestAntaFilter : public QObject 0198 { 0199 Q_OBJECT 0200 public: 0201 TestAntaFilter(QObject* parent= nullptr); 0202 0203 private slots: 0204 void init(); 0205 void cleanup(); 0206 0207 void advancedFilterModel(); 0208 void advancedFilterModel_data(); 0209 0210 private: 0211 std::unique_ptr<campaign::NonPlayableCharacterModel> m_sourceModel; 0212 std::unique_ptr<campaign::FilteredCharacterModel> m_filterModel; 0213 }; 0214 0215 TestAntaFilter::TestAntaFilter(QObject* parent) : QObject(parent) {} 0216 0217 void TestAntaFilter::init() 0218 { 0219 m_sourceModel.reset(new campaign::NonPlayableCharacterModel(nullptr)); 0220 m_filterModel.reset(new campaign::FilteredCharacterModel()); 0221 new QAbstractItemModelTester(m_sourceModel.get()); 0222 0223 initModel(m_sourceModel.get()); 0224 m_filterModel->setSourceModel(m_sourceModel.get()); 0225 0226 new QAbstractItemModelTester(m_filterModel.get()); 0227 } 0228 0229 void TestAntaFilter::cleanup() {} 0230 0231 void TestAntaFilter::advancedFilterModel() 0232 { 0233 QFETCH(QString, propertyName); 0234 QFETCH(QVariant, propertyValue); 0235 QFETCH(int, result); 0236 0237 m_filterModel->setAdvanced(true); 0238 0239 auto meta= m_filterModel->metaObject(); 0240 auto property= meta->property(meta->indexOfProperty(propertyName.toStdString().c_str())); 0241 0242 if(!property.write(m_filterModel.get(), propertyValue)) 0243 qDebug() << "fail to write"; 0244 0245 QCOMPARE(m_filterModel->rowCount(), result); 0246 } 0247 void TestAntaFilter::advancedFilterModel_data() 0248 { 0249 QTest::addColumn<QString>("propertyName"); 0250 QTest::addColumn<QVariant>("propertyValue"); 0251 QTest::addColumn<int>("result"); 0252 0253 static QList<PropertyInfo> infos{ 0254 {"search", {"", "lynn", "otomo", "ikoma", "john", "kahime", "luna", "ka", "zzz"}, {6, 1, 1, 1, 1, 1, 1, 3, 0}}, 0255 {"exclude", 0256 {"", "lynn", "otomo", "ikoma", "john", "kahime", "luna", "ka", "zzz", "a"}, 0257 {6, 5, 5, 5, 5, 5, 5, 3, 6, 0}}, 0258 {"tags", {"", "l5r", "singer", "girl"}, {6, 3, 1, 2}}, 0259 {"excludeTags", {"", "l5r", "singer", "girl"}, {6, 3, 5, 4}}, 0260 {"avatarDefinition", 0261 {campaign::FilteredCharacterModel::All, campaign::FilteredCharacterModel::With, 0262 campaign::FilteredCharacterModel::Without}, 0263 {6, 0, 6}}, 0264 {"initiativeScoreDef", 0265 {campaign::FilteredCharacterModel::All, campaign::FilteredCharacterModel::With, 0266 campaign::FilteredCharacterModel::Without}, 0267 {6, 2, 4}}, 0268 {"actionDef", 0269 {campaign::FilteredCharacterModel::All, campaign::FilteredCharacterModel::With, 0270 campaign::FilteredCharacterModel::Without}, 0271 {6, 4, 2}}, 0272 {"shapeDef", 0273 {campaign::FilteredCharacterModel::All, campaign::FilteredCharacterModel::With, 0274 campaign::FilteredCharacterModel::Without}, 0275 {6, 3, 3}}, 0276 {"propertiesDef", 0277 {campaign::FilteredCharacterModel::All, campaign::FilteredCharacterModel::With, 0278 campaign::FilteredCharacterModel::Without}, 0279 {6, 3, 3}}, 0280 {"initiativeCmdDef", 0281 {campaign::FilteredCharacterModel::All, campaign::FilteredCharacterModel::With, 0282 campaign::FilteredCharacterModel::Without}, 0283 {6, 3, 3}}, 0284 {"gmdetailsDef", 0285 {campaign::FilteredCharacterModel::All, campaign::FilteredCharacterModel::With, 0286 campaign::FilteredCharacterModel::Without}, 0287 {6, 3, 3}}, 0288 {"gmdetails", {"", "e", "hawk"}, {6, 2, 1}}}; 0289 0290 int i= 0; 0291 for(auto& info : infos) 0292 { 0293 if(info.matchingCount.size() != info.values.size()) 0294 { 0295 qFatal("Bad test: values does not fit the matching count"); 0296 continue; 0297 } 0298 int j= 0; 0299 for(const auto& value : info.values) 0300 { 0301 QTest::addRow("Filter [%d x %d]", i, j) << info.name << value << info.matchingCount[j]; 0302 ++j; 0303 } 0304 ++i; 0305 } 0306 } 0307 0308 QTEST_MAIN(TestAntaFilter); 0309 0310 #include "test_anta_filter.moc"