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"