You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
597 lines
19 KiB
597 lines
19 KiB
/* |
|
Copyright (c) 2009 Stephen Kelly <steveire@gmail.com> |
|
|
|
This library is free software; you can redistribute it and/or modify it |
|
under the terms of the GNU Library General Public License as published by |
|
the Free Software Foundation; either version 2 of the License, or (at your |
|
option) any later version. |
|
|
|
This library is distributed in the hope that it will be useful, but WITHOUT |
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public |
|
License for more details. |
|
|
|
You should have received a copy of the GNU Library General Public License |
|
along with this library; see the file COPYING.LIB. If not, write to the |
|
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA |
|
02110-1301, USA. |
|
*/ |
|
|
|
#include "modelcommander.h" |
|
#include "dynamictreemodel.h" |
|
#include <QDebug> |
|
|
|
ModelCommander::ModelCommander(DynamicTreeModel *model, QObject *parent) |
|
: QObject(parent), m_model(model) |
|
{ |
|
} |
|
|
|
QStringList ModelCommander::execute_testInsertWhenEmpty(const QString &dataTag) |
|
{ |
|
ModelInsertCommand *ins = new ModelInsertCommand(m_model, this); |
|
ins->setStartRow(0); |
|
|
|
static const QStringList testData = QStringList() << QStringLiteral("insert01") |
|
<< QStringLiteral("insert02") |
|
<< QStringLiteral("insert03"); |
|
|
|
if (dataTag.isEmpty()) { |
|
return testData; |
|
} |
|
|
|
if (dataTag == testData.at(0)) { |
|
// Insert a single item at the top. |
|
ins->setEndRow(0); |
|
} else if (dataTag == testData.at(1)) { |
|
// Insert 10 items. |
|
ins->setEndRow(9); |
|
} else if (dataTag == testData.at(2)) { |
|
// Insert 5 items, some of which are parents |
|
ins->interpret( |
|
QLatin1String(" - 1" |
|
" - - 2" |
|
" - 3" |
|
" - 4" |
|
" - - 5" |
|
" - - - 6" |
|
" - 7" |
|
" - 8" |
|
" - - 9") |
|
); |
|
} else { |
|
qDebug() << dataTag; |
|
return testData; |
|
} |
|
execute(ins); |
|
return testData; |
|
} |
|
|
|
void ModelCommander::init_testInsertWhenEmpty(const QString &dataTag) |
|
{ |
|
Q_UNUSED(dataTag); |
|
} |
|
|
|
void ModelCommander::init_testInsertInRoot(const QString &dataTag) |
|
{ |
|
initTestModel(dataTag); |
|
} |
|
|
|
void ModelCommander::init_testInsertInTopLevel(const QString &dataTag) |
|
{ |
|
initTestModel(dataTag); |
|
} |
|
|
|
void ModelCommander::init_testInsertInSecondLevel(const QString &dataTag) |
|
{ |
|
initTestModel(dataTag); |
|
} |
|
|
|
void ModelCommander::init_testRemoveFromRoot(const QString &dataTag) |
|
{ |
|
initTestModel(dataTag); |
|
} |
|
|
|
void ModelCommander::init_testRemoveFromSecondLevel(const QString &dataTag) |
|
{ |
|
initTestModel(dataTag); |
|
} |
|
|
|
void ModelCommander::init_testRemoveFromTopLevel(const QString &dataTag) |
|
{ |
|
initTestModel(dataTag); |
|
} |
|
|
|
void ModelCommander::init_testMoveFromRoot(const QString &dataTag) |
|
{ |
|
initTestModel(dataTag); |
|
} |
|
|
|
void ModelCommander::init_testMoveFromSecondLevel(const QString &dataTag) |
|
{ |
|
initTestModel(dataTag); |
|
} |
|
|
|
void ModelCommander::init_testMoveFromTopLevel(const QString &dataTag) |
|
{ |
|
initTestModel(dataTag); |
|
} |
|
|
|
void ModelCommander::init_testModifyInRoot(const QString &dataTag) |
|
{ |
|
initTestModel(dataTag); |
|
} |
|
|
|
void ModelCommander::init_testModifyInTopLevel(const QString &dataTag) |
|
{ |
|
initTestModel(dataTag); |
|
} |
|
|
|
void ModelCommander::init_testModifyInSecondLevel(const QString &dataTag) |
|
{ |
|
initTestModel(dataTag); |
|
} |
|
|
|
void ModelCommander::initTestModel(const QString &dataTag) |
|
{ |
|
Q_UNUSED(dataTag); |
|
|
|
// A standard initial model for all these tests. |
|
ModelInsertCommand *ins = new ModelInsertCommand(m_model, this); |
|
ins->setStartRow(0); |
|
ins->interpret( |
|
QLatin1String(" - 1" |
|
" - 2" |
|
" - - 3" |
|
" - - 4" |
|
" - - 5" |
|
" - 6" |
|
" - 7" |
|
" - 8" |
|
" - 9" |
|
" - - 10" |
|
" - - 11" |
|
" - - - 12" |
|
" - - - 13" |
|
" - - 14" |
|
" - - 15" |
|
" - - 16" |
|
" - - 17" |
|
" - - - 18" |
|
" - - - 19" |
|
" - - - - 20" |
|
" - - - - 21" |
|
" - - - 22" |
|
" - - - 23" |
|
" - - - 24" |
|
" - - - 25" |
|
" - - - - 26" |
|
" - - - - 27" |
|
" - - - 28" |
|
" - - - 29" |
|
" - - - - 30" |
|
" - - - 31" |
|
" - - - 32" |
|
" - - 33" |
|
" - - 34" |
|
" - - - 35" |
|
" - - 36" |
|
" - - 37" |
|
" - 38" |
|
" - 39" |
|
" - - 40" |
|
" - - 41" |
|
" - 42" |
|
" - 43") |
|
); |
|
execute(ins); |
|
} |
|
|
|
QStringList ModelCommander::execute_testInsertInRoot(const QString &dataTag) |
|
{ |
|
return executeTestInsert(QList<int>(), dataTag); |
|
} |
|
|
|
QStringList ModelCommander::execute_testInsertInTopLevel(const QString &dataTag) |
|
{ |
|
return executeTestInsert(QList<int>() << 5, dataTag); |
|
} |
|
|
|
QStringList ModelCommander::execute_testInsertInSecondLevel(const QString &dataTag) |
|
{ |
|
return executeTestInsert(QList<int>() << 5 << 5, dataTag); |
|
} |
|
|
|
QStringList ModelCommander::execute_testRemoveFromRoot(const QString &dataTag) |
|
{ |
|
return executeTestRemove(QList<int>(), dataTag); |
|
} |
|
|
|
QStringList ModelCommander::execute_testRemoveFromTopLevel(const QString &dataTag) |
|
{ |
|
return executeTestRemove(QList<int>() << 5, dataTag); |
|
} |
|
|
|
QStringList ModelCommander::execute_testRemoveFromSecondLevel(const QString &dataTag) |
|
{ |
|
return executeTestRemove(QList<int>() << 5 << 5, dataTag); |
|
} |
|
|
|
QStringList ModelCommander::execute_testMoveFromRoot(const QString &dataTag) |
|
{ |
|
return executeTestMove(QList<int>(), dataTag); |
|
} |
|
|
|
QStringList ModelCommander::execute_testMoveFromTopLevel(const QString &dataTag) |
|
{ |
|
return executeTestMove(QList<int>() << 5, dataTag); |
|
} |
|
|
|
QStringList ModelCommander::execute_testMoveFromSecondLevel(const QString &dataTag) |
|
{ |
|
return executeTestMove(QList<int>() << 5 << 5, dataTag); |
|
} |
|
|
|
QStringList ModelCommander::execute_testModifyInRoot(const QString &dataTag) |
|
{ |
|
return executeTestModify(QList<int>(), dataTag); |
|
} |
|
|
|
QStringList ModelCommander::execute_testModifyInTopLevel(const QString &dataTag) |
|
{ |
|
return executeTestModify(QList<int>() << 5, dataTag); |
|
} |
|
|
|
QStringList ModelCommander::execute_testModifyInSecondLevel(const QString &dataTag) |
|
{ |
|
return executeTestModify(QList<int>() << 5 << 5, dataTag); |
|
} |
|
|
|
void ModelCommander::execute(ModelChangeCommand *command) |
|
{ |
|
m_currentCommand = command; |
|
command->doCommand(); |
|
delete command; |
|
command = nullptr; |
|
} |
|
|
|
ModelChangeCommand *ModelCommander::currentCommand() |
|
{ |
|
return m_currentCommand; |
|
} |
|
|
|
QStringList ModelCommander::executeTestRemove(QList<int> rowAncestors, const QString &dataTag) |
|
{ |
|
static const QStringList testData = QStringList() << QStringLiteral("remove01") |
|
<< QStringLiteral("remove02") |
|
<< QStringLiteral("remove03"); |
|
|
|
if (dataTag.isEmpty()) { |
|
return testData; |
|
} |
|
|
|
ModelRemoveCommand *rem = new ModelRemoveCommand(m_model, this); |
|
if (dataTag == testData.at(0)) { |
|
// Remove a single item from the top. |
|
rem->setAncestorRowNumbers(rowAncestors); |
|
rem->setStartRow(0); |
|
rem->setEndRow(0); |
|
} else if (dataTag == testData.at(1)) { |
|
// Remove four items form the top. |
|
rem->setAncestorRowNumbers(rowAncestors); |
|
rem->setStartRow(0); |
|
rem->setEndRow(4); |
|
} else if (dataTag == testData.at(2)) { |
|
// Remove a single item from the bottom. |
|
rem->setAncestorRowNumbers(rowAncestors); |
|
rem->setStartRow(m_model->rowCount() - 1); |
|
rem->setEndRow(m_model->rowCount() - 1); |
|
} |
|
execute(rem); |
|
return testData; |
|
} |
|
|
|
QStringList ModelCommander::executeTestMove(QList<int> rowAncestors, const QString &dataTag) |
|
{ |
|
static const QStringList testData = QStringList() << QStringLiteral("move01") |
|
<< QStringLiteral("move02") |
|
<< QStringLiteral("move03") |
|
<< QStringLiteral("move04") |
|
<< QStringLiteral("move05"); |
|
|
|
if (dataTag.isEmpty()) { |
|
return testData; |
|
} |
|
|
|
ModelMoveCommand *move = new ModelMoveCommand(m_model, this); |
|
if (dataTag == testData.at(0)) { |
|
// Move a single item from the top to the middle in the same parent. |
|
move->setAncestorRowNumbers(rowAncestors); |
|
move->setStartRow(0); |
|
move->setEndRow(0); |
|
move->setDestAncestors(rowAncestors); |
|
move->setDestRow(5); |
|
} else if (dataTag == testData.at(1)) { |
|
// Move a single item from the middle to the top in the same parent. |
|
move->setAncestorRowNumbers(rowAncestors); |
|
move->setStartRow(4); |
|
move->setEndRow(4); |
|
move->setDestAncestors(rowAncestors); |
|
move->setDestRow(0); |
|
} else if (dataTag == testData.at(2)) { |
|
// Move a single item from the middle to the bottom in the same parent. |
|
move->setAncestorRowNumbers(rowAncestors); |
|
move->setStartRow(4); |
|
move->setEndRow(4); |
|
move->setDestAncestors(rowAncestors); |
|
move->setDestRow(10); |
|
} else if (dataTag == testData.at(3)) { |
|
// Move a single item from the bottom to the middle in the same parent. |
|
move->setAncestorRowNumbers(rowAncestors); |
|
move->setStartRow(9); |
|
move->setEndRow(9); |
|
move->setDestAncestors(rowAncestors); |
|
move->setDestRow(4); |
|
} else if (dataTag == testData.at(4)) { |
|
// Move a single item from the bottom to the top in the same parent. |
|
move->setAncestorRowNumbers(rowAncestors); |
|
move->setStartRow(9); |
|
move->setEndRow(9); |
|
move->setDestAncestors(rowAncestors); |
|
move->setDestRow(0); |
|
} |
|
execute(move); |
|
return testData; |
|
} |
|
|
|
QStringList ModelCommander::executeTestModify(QList<int> rowAncestors, const QString &dataTag) |
|
{ |
|
static const QStringList testData = QStringList() << QStringLiteral("modify01") |
|
<< QStringLiteral("modify02") |
|
<< QStringLiteral("modify03") |
|
<< QStringLiteral("modify04") |
|
<< QStringLiteral("modify05") |
|
<< QStringLiteral("modify06") |
|
<< QStringLiteral("modify07"); |
|
|
|
if (dataTag.isEmpty()) { |
|
return testData; |
|
} |
|
|
|
ModelDataChangeCommand *modify = new ModelDataChangeCommand(m_model, this); |
|
if (dataTag == testData.at(0)) { |
|
// Modify a single item at the top. |
|
modify->setAncestorRowNumbers(rowAncestors); |
|
modify->setStartRow(0); |
|
modify->setEndRow(0); |
|
} else if (dataTag == testData.at(1)) { |
|
// Modify four items at the top. |
|
modify->setAncestorRowNumbers(rowAncestors); |
|
modify->setStartRow(0); |
|
modify->setEndRow(4); |
|
} else if (dataTag == testData.at(2)) { |
|
// Modify a single item at the bottom. |
|
modify->setAncestorRowNumbers(rowAncestors); |
|
modify->setStartRow(m_model->rowCount() - 1); |
|
modify->setEndRow(m_model->rowCount() - 1); |
|
} else if (dataTag == testData.at(3)) { |
|
// Modify four items at the bottom. |
|
modify->setAncestorRowNumbers(rowAncestors); |
|
modify->setStartRow(m_model->rowCount() - 4); |
|
modify->setEndRow(m_model->rowCount() - 1); |
|
} else if (dataTag == testData.at(4)) { |
|
// Modify a single item in the middle. |
|
modify->setAncestorRowNumbers(rowAncestors); |
|
modify->setStartRow(4); |
|
modify->setEndRow(4); |
|
} else if (dataTag == testData.at(5)) { |
|
// Modify four items in the middle. |
|
modify->setAncestorRowNumbers(rowAncestors); |
|
modify->setStartRow(3); |
|
modify->setEndRow(7); |
|
} else if (dataTag == testData.at(6)) { |
|
// Modify all items. |
|
modify->setAncestorRowNumbers(rowAncestors); |
|
modify->setStartRow(0); |
|
modify->setEndRow(m_model->rowCount() - 1); |
|
} |
|
execute(modify); |
|
return testData; |
|
} |
|
|
|
QStringList ModelCommander::executeTestInsert(QList<int> rowAncestors, const QString &dataTag) |
|
{ |
|
static const QStringList testData = QStringList() << QStringLiteral("insert01") |
|
<< QStringLiteral("insert02") |
|
<< QStringLiteral("insert03") |
|
<< QStringLiteral("insert04") |
|
<< QStringLiteral("insert05") |
|
<< QStringLiteral("insert06") |
|
<< QStringLiteral("insert07") |
|
<< QStringLiteral("insert08") |
|
<< QStringLiteral("insert09") |
|
<< QStringLiteral("insert10") |
|
<< QStringLiteral("insert11") |
|
<< QStringLiteral("insert12") |
|
<< QStringLiteral("insert13") |
|
<< QStringLiteral("insert14") |
|
<< QStringLiteral("insert15") |
|
<< QStringLiteral("insert16") |
|
<< QStringLiteral("insert17") |
|
<< QStringLiteral("insert18"); |
|
|
|
if (dataTag.isEmpty()) { |
|
return testData; |
|
} |
|
|
|
ModelInsertCommand *ins = new ModelInsertCommand(m_model, this); |
|
if (dataTag == testData.at(0)) { |
|
// Insert a single item at the top. |
|
ins->setAncestorRowNumbers(rowAncestors); |
|
ins->setStartRow(0); |
|
ins->setEndRow(0); |
|
} else if (dataTag == testData.at(1)) { |
|
// Insert 10 items at the top. |
|
ins->setAncestorRowNumbers(rowAncestors); |
|
ins->setStartRow(0); |
|
ins->setEndRow(9); |
|
} else if (dataTag == testData.at(2)) { |
|
// Insert a single item at the bottom. |
|
ins->setAncestorRowNumbers(rowAncestors); |
|
ins->setStartRow(m_model->rowCount()); |
|
ins->setEndRow(m_model->rowCount()); |
|
} else if (dataTag == testData.at(3)) { |
|
// Insert a 10 items at the bottom. |
|
ins->setAncestorRowNumbers(rowAncestors); |
|
ins->setStartRow(m_model->rowCount()); |
|
ins->setEndRow(m_model->rowCount() + 9); |
|
} else if (dataTag == testData.at(4)) { |
|
// Insert a single item in the middle |
|
ins->setAncestorRowNumbers(rowAncestors); |
|
ins->setStartRow(4); |
|
ins->setEndRow(4); |
|
} else if (dataTag == testData.at(5)) { |
|
// Insert 10 items in the middle |
|
ins->setAncestorRowNumbers(rowAncestors); |
|
ins->setStartRow(4); |
|
ins->setEndRow(13); |
|
} else if (dataTag == testData.at(6)) { |
|
// Insert a single item at with children at the top |
|
ins->setAncestorRowNumbers(rowAncestors); |
|
ins->setStartRow(0); |
|
ins->interpret( |
|
QLatin1String(" - 1" |
|
" - - 2" |
|
" - - - 3" |
|
" - - - - 4" |
|
" - - 5") |
|
); |
|
} else if (dataTag == testData.at(7)) { |
|
// Insert a single item at with children at the bottom |
|
ins->setAncestorRowNumbers(rowAncestors); |
|
ins->setStartRow(m_model->rowCount()); |
|
ins->interpret( |
|
QLatin1String(" - 1" |
|
" - - 2" |
|
" - - - 3" |
|
" - - - - 4" |
|
" - - 5") |
|
); |
|
} else if (dataTag == testData.at(8)) { |
|
// Insert a single item at with children in the middle |
|
ins->setAncestorRowNumbers(rowAncestors); |
|
ins->setStartRow(4); |
|
ins->interpret( |
|
QLatin1String(" - 1" |
|
" - - 2" |
|
" - - - 3" |
|
" - - - - 4" |
|
" - - 5") |
|
); |
|
} else if (dataTag == testData.at(9)) { |
|
// Insert 5 items, some of which are parents at the top |
|
ins->setAncestorRowNumbers(rowAncestors); |
|
ins->setStartRow(0); |
|
ins->interpret( |
|
QLatin1String(" - 1" |
|
" - - 2" |
|
" - 3" |
|
" - 4" |
|
" - - 5" |
|
" - - 6" |
|
" - - - 7" |
|
" - 8" |
|
" - 9" |
|
" - - 10") |
|
); |
|
} else if (dataTag == testData.at(10)) { |
|
// Insert 5 items, some of which are parents at the bottom |
|
ins->setAncestorRowNumbers(rowAncestors); |
|
ins->setStartRow(m_model->rowCount()); |
|
ins->interpret( |
|
QLatin1String(" - 1" |
|
" - - 2" |
|
" - 3" |
|
" - 4" |
|
" - - 5" |
|
" - - 6" |
|
" - - - 7" |
|
" - 8" |
|
" - 9" |
|
" - - 10") |
|
); |
|
} else if (dataTag == testData.at(11)) { |
|
// Insert 5 items, some of which are parents in the middle |
|
ins->setAncestorRowNumbers(rowAncestors); |
|
ins->setStartRow(4); |
|
ins->interpret( |
|
QLatin1String(" - 1" |
|
" - - 2" |
|
" - 3" |
|
" - 4" |
|
" - - 5" |
|
" - - 6" |
|
" - - - 7" |
|
" - 8" |
|
" - 9" |
|
" - - 10") |
|
); |
|
} else if (dataTag == testData.at(12)) { |
|
// Insert 5 items, some of which are parents in the middle |
|
ins->setAncestorRowNumbers(rowAncestors << 0); |
|
ins->setStartRow(0); |
|
ins->setEndRow(0); |
|
} else if (dataTag == testData.at(13)) { |
|
// Insert 5 items, some of which are parents in the middle |
|
ins->setAncestorRowNumbers(rowAncestors << 0); |
|
ins->setStartRow(0); |
|
ins->setEndRow(9); |
|
} else if (dataTag == testData.at(14)) { |
|
// Insert 5 items, some of which are parents in the middle |
|
ins->setAncestorRowNumbers(rowAncestors << 0); |
|
ins->setStartRow(0); |
|
ins->interpret( |
|
QLatin1String(" - 1" |
|
" - - 2" |
|
" - 3" |
|
" - 4" |
|
" - - 5" |
|
" - - 6" |
|
" - - - 7" |
|
" - 8" |
|
" - 9" |
|
" - - 10") |
|
); |
|
} else if (dataTag == testData.at(15)) { |
|
// Insert 5 items, some of which are parents in the middle |
|
ins->setAncestorRowNumbers(rowAncestors << 9); |
|
ins->setStartRow(0); |
|
ins->setEndRow(0); |
|
} else if (dataTag == testData.at(16)) { |
|
// Insert 5 items, some of which are parents in the middle |
|
ins->setAncestorRowNumbers(rowAncestors << 9); |
|
ins->setStartRow(0); |
|
ins->setEndRow(9); |
|
} else if (dataTag == testData.at(17)) { |
|
// Insert 5 items, some of which are parents in the middle |
|
ins->setAncestorRowNumbers(rowAncestors << 9); |
|
ins->setStartRow(0); |
|
ins->interpret( |
|
QLatin1String(" - 1" |
|
" - - 2" |
|
" - 3" |
|
" - 4" |
|
" - - 5" |
|
" - - 6" |
|
" - - - 7" |
|
" - 8" |
|
" - 9" |
|
" - - 10") |
|
); |
|
} else { |
|
qDebug() << dataTag; |
|
delete ins; |
|
return testData; |
|
} |
|
execute(ins); |
|
return testData; |
|
}
|
|
|