mirror of
https://bitbucket.org/smil3y/kde-extraapps.git
synced 2025-02-26 20:03:10 +00:00
728 lines
26 KiB
C++
728 lines
26 KiB
C++
![]() |
/*
|
||
|
* This file is part of KDevelop
|
||
|
* Copyright 2011 Dmitry Risenberg <dmitry.risenberg@gmail.com>
|
||
|
*
|
||
|
* This program 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 program 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 General Public License for more details.
|
||
|
*
|
||
|
* You should have received a copy of the GNU General Public
|
||
|
* License along with this program; if not, write to the
|
||
|
* Free Software Foundation, Inc.,
|
||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||
|
*/
|
||
|
|
||
|
#include "interactivedifftest.h"
|
||
|
|
||
|
#include <QTest>
|
||
|
#include "../diffmodel.h"
|
||
|
#include "../parser.h"
|
||
|
|
||
|
using namespace Diff2;
|
||
|
|
||
|
typedef QHash<int, QPair<QStringList, QStringList> > DifferenceHash;
|
||
|
Q_DECLARE_METATYPE(DifferenceHash);
|
||
|
typedef QHash<int, QPair<int, int> > LineNumberHash;
|
||
|
Q_DECLARE_METATYPE(LineNumberHash);
|
||
|
|
||
|
void InteractiveDiffTest::CompareDifferenceStringList(const DifferenceStringList& actual, const QStringList& expected)
|
||
|
{
|
||
|
DifferenceStringListConstIterator actualIter;
|
||
|
QStringList::const_iterator expectedIter;
|
||
|
for(actualIter = actual.constBegin(), expectedIter = expected.constBegin(); actualIter != actual.constEnd() && expectedIter != expected.constEnd(); ++actualIter, ++expectedIter) {
|
||
|
QCOMPARE((*actualIter)->string(), *expectedIter);
|
||
|
}
|
||
|
if (actualIter != actual.constEnd()) {
|
||
|
QFAIL(QString("Actual has too many items, starting with '%1', line %2").arg((*actualIter)->string()).arg(actualIter - actual.constBegin()).toAscii());
|
||
|
}
|
||
|
if (expectedIter != expected.constEnd()) {
|
||
|
QFAIL(QString("Actual has too few items, no match for '%1', line %2").arg(*expectedIter).arg(expectedIter - expected.constBegin()).toAscii());
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// The most basic test - something is actually working
|
||
|
void InteractiveDiffTest::testOneLineChange()
|
||
|
{
|
||
|
DiffModel* model = new DiffModel();
|
||
|
QStringList newLines;
|
||
|
newLines << "newline\n";
|
||
|
QStringList oldLines;
|
||
|
oldLines << "oldline\n";
|
||
|
model->linesChanged(oldLines, newLines, 2);
|
||
|
QCOMPARE(model->differences()->size(), 1);
|
||
|
|
||
|
QCOMPARE(model->differenceCount(), 1);
|
||
|
const Difference* diff = model->differenceAt(0);
|
||
|
CompareDifferenceStringList(diff->sourceLines(), oldLines);
|
||
|
CompareDifferenceStringList(diff->destinationLines(), newLines);
|
||
|
QCOMPARE(diff->type(), int(Difference::Change));
|
||
|
}
|
||
|
|
||
|
void InteractiveDiffTest::testSameLine()
|
||
|
{
|
||
|
DiffModel* model = new DiffModel();
|
||
|
QStringList newLines;
|
||
|
newLines << "oldline2\n";
|
||
|
QStringList oldLines;
|
||
|
oldLines << "oldline1\n" << "oldline2\n";
|
||
|
model->linesChanged(oldLines, newLines, 2);
|
||
|
|
||
|
QCOMPARE(model->differenceCount(), 1);
|
||
|
const Difference* diff = model->differenceAt(0);
|
||
|
CompareDifferenceStringList(diff->sourceLines(), QStringList() << "oldline1\n");
|
||
|
CompareDifferenceStringList(diff->destinationLines(), QStringList());
|
||
|
QCOMPARE(diff->type(), int(Difference::Delete));
|
||
|
}
|
||
|
|
||
|
void InteractiveDiffTest::testDifferenceContents()
|
||
|
{
|
||
|
QFETCH(QStringList, patch);
|
||
|
Parser parser(0);
|
||
|
DiffModelList* models = parser.parse(patch);
|
||
|
QCOMPARE(models->size(), 1);
|
||
|
DiffModel* model = models->at(0);
|
||
|
|
||
|
QFETCH(QStringList, oldLines);
|
||
|
QFETCH(QStringList, newLines);
|
||
|
QFETCH(int, editLineNumber);
|
||
|
QFETCH(bool, isAlreadyApplied);
|
||
|
model->applyAllDifferences(isAlreadyApplied);
|
||
|
model->linesChanged(oldLines, newLines, editLineNumber);
|
||
|
QFETCH(int, expectedDifferenceCount);
|
||
|
QCOMPARE(model->differenceCount(), expectedDifferenceCount);
|
||
|
|
||
|
QFETCH(DifferenceHash, expectedDifferences);
|
||
|
for (DifferenceHash::ConstIterator iter = expectedDifferences.constBegin(); iter != expectedDifferences.constEnd(); ++iter) {
|
||
|
const Difference* diff = model->differenceAt(iter.key());
|
||
|
CompareDifferenceStringList(diff->sourceLines(), iter.value().first);
|
||
|
CompareDifferenceStringList(diff->destinationLines(), iter.value().second);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void InteractiveDiffTest::testDifferenceContents_data()
|
||
|
{
|
||
|
QTest::addColumn<QStringList>("patch");
|
||
|
QTest::addColumn<QStringList>("oldLines"); // lines that are replaced
|
||
|
QTest::addColumn<QStringList>("newLines"); // replacement lines
|
||
|
QTest::addColumn<int>("editLineNumber");
|
||
|
QTest::addColumn<bool>("isAlreadyApplied");
|
||
|
QTest::addColumn<int>("expectedDifferenceCount");
|
||
|
QTest::addColumn<DifferenceHash>("expectedDifferences");
|
||
|
|
||
|
{
|
||
|
QStringList patch;
|
||
|
patch <<
|
||
|
"--- file1\t2011-01-01 20:23:45.000000000 +0300\n" <<
|
||
|
"+++ file2\t2011-01-01 20:24:02.000000000 +0300\n" <<
|
||
|
"@@ -1,5 +1,5 @@\n" <<
|
||
|
" abcd\n" <<
|
||
|
"-delete1\n" <<
|
||
|
"+insert1\n" <<
|
||
|
" efgh\n" <<
|
||
|
"-delete2\n" <<
|
||
|
"+insert2\n" <<
|
||
|
" ijkl\n";
|
||
|
|
||
|
QStringList newLines;
|
||
|
newLines << "newline1\n" << "newline2\n";
|
||
|
QStringList oldLines;
|
||
|
oldLines << "efgh\n";
|
||
|
QStringList sourceLines;
|
||
|
sourceLines << "delete1\n" << "efgh\n" << "delete2\n";
|
||
|
QStringList destinationLines;
|
||
|
destinationLines << "insert1\n" << "newline1\n" << "newline2\n" << "insert2\n";
|
||
|
DifferenceHash expectedDifferences;
|
||
|
expectedDifferences.insert(0, qMakePair(sourceLines, destinationLines));
|
||
|
|
||
|
QTest::newRow("Merge adjacent differences") << patch << oldLines << newLines << 3 << true << 1 << expectedDifferences;
|
||
|
}
|
||
|
{
|
||
|
QStringList patch;
|
||
|
patch <<
|
||
|
"--- file1\t2011-01-01 20:23:45.000000000 +0300\n" <<
|
||
|
"+++ file2\t2011-01-01 20:24:02.000000000 +0300\n" <<
|
||
|
"@@ -1,4 +1,4 @@\n" <<
|
||
|
" abcd\n" <<
|
||
|
"-delete1\n" <<
|
||
|
"-delete2\n" <<
|
||
|
"+insert1\n" <<
|
||
|
"+insert2\n" <<
|
||
|
" efgh\n";
|
||
|
|
||
|
QStringList newLines;
|
||
|
newLines << "newline1\n";
|
||
|
QStringList oldLines;
|
||
|
oldLines << "efgh\n";
|
||
|
QStringList sourceLines;
|
||
|
sourceLines << "delete1\n" << "delete2\n" << "efgh\n";
|
||
|
QStringList destinationLines;
|
||
|
destinationLines << "insert1\n" << "insert2\n" << "newline1\n";
|
||
|
DifferenceHash expectedDifferences;
|
||
|
expectedDifferences.insert(0, qMakePair(sourceLines, destinationLines));
|
||
|
|
||
|
// Append a line to a multiline diff
|
||
|
QTest::newRow("Append multiline") << patch << oldLines << newLines << 4 << true << 1 << expectedDifferences;
|
||
|
}
|
||
|
{
|
||
|
QStringList patch;
|
||
|
patch <<
|
||
|
"--- file1\t2011-01-01 20:23:45.000000000 +0300\n" <<
|
||
|
"+++ file2\t2011-01-01 20:24:02.000000000 +0300\n" <<
|
||
|
"@@ -1,3 +1,3 @@\n" <<
|
||
|
" abcd\n" <<
|
||
|
"-delete1\n" <<
|
||
|
"+insert1\n" <<
|
||
|
" efgh\n";
|
||
|
|
||
|
QStringList newLines;
|
||
|
newLines << "delete1\n";
|
||
|
QStringList oldLines;
|
||
|
oldLines << "insert1\n";
|
||
|
QTest::newRow("Revert existing difference") << patch << oldLines << newLines << 2 << true << 0 << DifferenceHash();
|
||
|
}
|
||
|
{
|
||
|
QStringList patch;
|
||
|
patch <<
|
||
|
"--- file1\t2011-01-01 20:23:45.000000000 +0300\n" <<
|
||
|
"+++ file2\t2011-01-01 20:24:02.000000000 +0300\n" <<
|
||
|
"@@ -1,3 +1,2 @@\n" <<
|
||
|
" abcd\n" <<
|
||
|
"-delete1\n" <<
|
||
|
" efgh\n";
|
||
|
|
||
|
QStringList newLines;
|
||
|
newLines << "abcd\n" << "delete1\n";
|
||
|
QStringList oldLines;
|
||
|
oldLines << "abcd\n";
|
||
|
QTest::newRow("Revert deletion") << patch << oldLines << newLines << 1 << true << 0 << DifferenceHash();
|
||
|
}
|
||
|
{
|
||
|
QStringList patch;
|
||
|
patch <<
|
||
|
"--- file1\t2011-01-01 20:23:45.000000000 +0300\n" <<
|
||
|
"+++ file2\t2011-01-01 20:24:02.000000000 +0300\n" <<
|
||
|
"@@ -1,4 +1,5 @@\n" <<
|
||
|
" abcd\n" <<
|
||
|
"-delete1\n" <<
|
||
|
"-delete2\n" <<
|
||
|
"+insert1\n" <<
|
||
|
"+insert2\n" <<
|
||
|
"+insert3\n" <<
|
||
|
" efgh\n";
|
||
|
|
||
|
QStringList newLines;
|
||
|
newLines << "delete2\n";
|
||
|
QStringList oldLines;
|
||
|
oldLines << "insert2\n";
|
||
|
DifferenceHash expectedDifferences;
|
||
|
expectedDifferences.insert(0, qMakePair(QStringList() << "delete1\n", QStringList() << "insert1\n"));
|
||
|
expectedDifferences.insert(1, qMakePair(QStringList(), QStringList() << "insert3\n"));
|
||
|
|
||
|
QTest::newRow("Partial reversion") << patch << oldLines << newLines << 3 << true << 2 << expectedDifferences;
|
||
|
}
|
||
|
{
|
||
|
QStringList patch;
|
||
|
patch <<
|
||
|
"--- file1\t2011-01-01 20:23:45.000000000 +0300\n" <<
|
||
|
"+++ file2\t2011-01-01 20:24:02.000000000 +0300\n" <<
|
||
|
"@@ -1,4 +1,4 @@\n" <<
|
||
|
" abcd\n" <<
|
||
|
"-delete1\n" <<
|
||
|
"-delete2\n" <<
|
||
|
"+insert1\n" <<
|
||
|
"+insert2\n" <<
|
||
|
" efgh\n";
|
||
|
|
||
|
QStringList newLines;
|
||
|
newLines << "newline1\n" << "newline2\n";
|
||
|
QStringList oldLines;
|
||
|
oldLines << "abcd\n" << "insert1\n" << "insert2\n" << "efgh\n";
|
||
|
QStringList sourceLines;
|
||
|
sourceLines << "abcd\n" << "delete1\n" << "delete2\n" << "efgh\n";
|
||
|
QStringList destinationLines;
|
||
|
destinationLines << "newline1\n" << "newline2\n";
|
||
|
DifferenceHash expectedDifferences;
|
||
|
expectedDifferences.insert(0, qMakePair(sourceLines, destinationLines));
|
||
|
|
||
|
// The first existing difference inside the edit
|
||
|
QTest::newRow("First inside") << patch << oldLines << newLines << 1 << true << 1 << expectedDifferences;
|
||
|
}
|
||
|
{
|
||
|
QStringList patch;
|
||
|
patch <<
|
||
|
"--- file1\t2011-01-01 20:23:45.000000000 +0300\n" <<
|
||
|
"+++ file2\t2011-01-01 20:24:02.000000000 +0300\n" <<
|
||
|
"@@ -1,4 +1,4 @@\n" <<
|
||
|
" abcd\n" <<
|
||
|
"-delete1\n" <<
|
||
|
"-delete2\n" <<
|
||
|
"+insert1\n" <<
|
||
|
"+insert2\n" <<
|
||
|
" efgh\n";
|
||
|
|
||
|
QStringList newLines;
|
||
|
newLines << "newline1\n" << "newline2\n";
|
||
|
QStringList oldLines;
|
||
|
oldLines << "insert2\n" << "efgh\n";
|
||
|
QStringList sourceLines;
|
||
|
sourceLines << "delete1\n" << "delete2\n" << "efgh\n";
|
||
|
QStringList destinationLines;
|
||
|
destinationLines << "insert1\n" << "newline1\n" << "newline2\n";
|
||
|
DifferenceHash expectedDifferences;
|
||
|
expectedDifferences.insert(0, qMakePair(sourceLines, destinationLines));
|
||
|
|
||
|
// The first existing difference intersects with the edit
|
||
|
QTest::newRow("First intersects") << patch << oldLines << newLines << 3 << true << 1 << expectedDifferences;
|
||
|
}
|
||
|
{
|
||
|
QStringList patch;
|
||
|
patch <<
|
||
|
"--- file1\t2011-01-01 20:23:45.000000000 +0300\n" <<
|
||
|
"+++ file2\t2011-01-01 20:24:02.000000000 +0300\n" <<
|
||
|
"@@ -1,2 +1,3 @@\n" <<
|
||
|
" abcd\n" <<
|
||
|
"+\n" <<
|
||
|
" efgh\n";
|
||
|
|
||
|
QStringList newLines;
|
||
|
newLines << "a\n";
|
||
|
QStringList oldLines;
|
||
|
oldLines << "\n";
|
||
|
DifferenceHash expectedDifferences;
|
||
|
expectedDifferences.insert(0, qMakePair(QStringList(), QStringList() << "a\n"));
|
||
|
|
||
|
QTest::newRow("Replace empty line") << patch << oldLines << newLines << 2 << true << 1 << expectedDifferences;
|
||
|
}
|
||
|
{
|
||
|
QStringList patch;
|
||
|
patch <<
|
||
|
"--- file1\t2011-01-01 20:23:45.000000000 +0300\n" <<
|
||
|
"+++ file2\t2011-01-01 20:24:02.000000000 +0300\n" <<
|
||
|
"@@ -1,3 +1,3 @@\n" <<
|
||
|
" abcd\n" <<
|
||
|
"+insert1\n" <<
|
||
|
"+insert2\n" <<
|
||
|
"+insert3\n" <<
|
||
|
"+insert4\n" <<
|
||
|
"+insert5\n" <<
|
||
|
" efgh\n" <<
|
||
|
"@@ -10,3 +15,3 @@\n" <<
|
||
|
" abcd\n" <<
|
||
|
"-delete1\n" <<
|
||
|
"+insert1\n" <<
|
||
|
" efgh\n";
|
||
|
|
||
|
QStringList newLines;
|
||
|
newLines << "newline1\n";
|
||
|
QStringList oldLines;
|
||
|
oldLines << "delete1\n";
|
||
|
DifferenceHash expectedDifferences;
|
||
|
expectedDifferences.insert(1, qMakePair(QStringList() << "delete1\n", QStringList() << "newline1\n"));
|
||
|
|
||
|
QTest::newRow("Replace line in source") << patch << oldLines << newLines << 11 << false << 2 << expectedDifferences;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void InteractiveDiffTest::testLineNumbers_data()
|
||
|
{
|
||
|
QTest::addColumn<QStringList>("patch");
|
||
|
QTest::addColumn<QStringList>("oldLines"); // lines that are replaced
|
||
|
QTest::addColumn<QStringList>("newLines"); // replacement lines
|
||
|
QTest::addColumn<int>("editLineNumber");
|
||
|
QTest::addColumn<int>("expectedDifferenceCount");
|
||
|
QTest::addColumn<LineNumberHash>("expectedLineNumbers");
|
||
|
|
||
|
{
|
||
|
QStringList patch;
|
||
|
patch <<
|
||
|
"--- file1\t2011-01-01 20:23:45.000000000 +0300\n" <<
|
||
|
"+++ file2\t2011-01-01 20:24:02.000000000 +0300\n" <<
|
||
|
"@@ -1,4 +1,6 @@\n" <<
|
||
|
" abcd\n" <<
|
||
|
"-delete1\n" <<
|
||
|
"-delete2\n" <<
|
||
|
"+insert1\n" <<
|
||
|
"+insert2\n" <<
|
||
|
"+insert3\n" <<
|
||
|
"+insert4\n" <<
|
||
|
" efgh\n" <<
|
||
|
"@@ -15,3 +17,4 @@\n" <<
|
||
|
" abcd\n" <<
|
||
|
"-delete1\n" <<
|
||
|
"+insert1\n" <<
|
||
|
"+insert2\n" <<
|
||
|
" efgh\n";
|
||
|
|
||
|
QStringList newLines;
|
||
|
newLines << "newline1\n" << "newline2\n" << "newline2\n";
|
||
|
QStringList oldLines;
|
||
|
oldLines << "oldline1\n";
|
||
|
LineNumberHash expectedLineNumbers;
|
||
|
expectedLineNumbers.insert(0, qMakePair(2, 2));
|
||
|
expectedLineNumbers.insert(2, qMakePair(16, 20));
|
||
|
QTest::newRow("Update existing line numbers") << patch << oldLines << newLines << 10 << 3 << expectedLineNumbers;
|
||
|
}
|
||
|
{
|
||
|
QStringList patch;
|
||
|
patch <<
|
||
|
"--- file1\t2011-01-01 20:23:45.000000000 +0300\n" <<
|
||
|
"+++ file2\t2011-01-01 20:24:02.000000000 +0300\n" <<
|
||
|
"@@ -1,4 +1,6 @@\n" <<
|
||
|
" abcd\n" <<
|
||
|
"-delete1\n" <<
|
||
|
"-delete2\n" <<
|
||
|
"+insert1\n" <<
|
||
|
"+insert2\n" <<
|
||
|
"+insert3\n" <<
|
||
|
"+insert4\n" <<
|
||
|
" efgh\n" <<
|
||
|
"@@ -15,3 +17,4 @@\n" <<
|
||
|
" abcd\n" <<
|
||
|
"-delete1\n" <<
|
||
|
"+insert1\n" <<
|
||
|
"+insert2\n" <<
|
||
|
" efgh\n";
|
||
|
|
||
|
QStringList newLines;
|
||
|
newLines << "newline1\n";
|
||
|
QStringList oldLines;
|
||
|
oldLines << "oldline1\n";
|
||
|
LineNumberHash expectedLineNumbers;
|
||
|
expectedLineNumbers.insert(2, qMakePair(22, 25));
|
||
|
|
||
|
// Line numbers assigned to new difference when it is inserted after all existing differences
|
||
|
QTest::newRow("Last edit line number") << patch << oldLines << newLines << 25 << 3 << expectedLineNumbers;
|
||
|
}
|
||
|
{
|
||
|
QStringList patch;
|
||
|
patch <<
|
||
|
"--- file1\t2011-01-01 20:23:45.000000000 +0300\n" <<
|
||
|
"+++ file2\t2011-01-01 20:24:02.000000000 +0300\n" <<
|
||
|
"@@ -1,4 +1,6 @@\n" <<
|
||
|
" abcd\n" <<
|
||
|
"-delete1\n" <<
|
||
|
"-delete2\n" <<
|
||
|
"+insert1\n" <<
|
||
|
"+insert2\n" <<
|
||
|
"+insert3\n" <<
|
||
|
"+insert4\n" <<
|
||
|
" efgh\n" <<
|
||
|
"@@ -15,3 +17,4 @@\n" <<
|
||
|
" abcd\n" <<
|
||
|
"-delete1\n" <<
|
||
|
"+insert1\n" <<
|
||
|
"+insert2\n" <<
|
||
|
" efgh\n";
|
||
|
|
||
|
QStringList newLines;
|
||
|
newLines << "newline1\n";
|
||
|
QStringList oldLines;
|
||
|
oldLines << "oldline1\n";
|
||
|
LineNumberHash expectedLineNumbers;
|
||
|
expectedLineNumbers.insert(1, qMakePair(11, 13));
|
||
|
|
||
|
// Line numbers assigned to new difference when it is inserted between existing differences
|
||
|
QTest::newRow("Middle edit line number") << patch << oldLines << newLines << 13 << 3 << expectedLineNumbers;
|
||
|
}
|
||
|
{
|
||
|
QStringList patch;
|
||
|
patch <<
|
||
|
"--- file1\t2011-01-01 20:23:45.000000000 +0300\n" <<
|
||
|
"+++ file2\t2011-01-01 20:24:02.000000000 +0300\n" <<
|
||
|
"@@ -10,4 +10,4 @@\n" <<
|
||
|
" abcd\n" <<
|
||
|
"-delete1\n" <<
|
||
|
"-delete2\n" <<
|
||
|
"+insert1\n" <<
|
||
|
"+insert2\n" <<
|
||
|
" efgh\n";
|
||
|
|
||
|
QStringList newLines;
|
||
|
newLines << "newline1\n";
|
||
|
QStringList oldLines;
|
||
|
oldLines << "oldline1\n";
|
||
|
LineNumberHash expectedLineNumbers;
|
||
|
expectedLineNumbers.insert(0, qMakePair(5, 5));
|
||
|
|
||
|
// Line numbers assigned to new difference when it is inserted before all existing differences
|
||
|
QTest::newRow("First edit line number") << patch << oldLines << newLines << 5 << 2 << expectedLineNumbers;
|
||
|
}
|
||
|
{
|
||
|
QStringList patch;
|
||
|
patch <<
|
||
|
"--- file1\t2011-01-01 20:23:45.000000000 +0300\n" <<
|
||
|
"+++ file2\t2011-01-01 20:24:02.000000000 +0300\n" <<
|
||
|
"@@ -1,3 +1,4 @@\n" <<
|
||
|
" abcd\n" <<
|
||
|
"-delete1\n" <<
|
||
|
"+insert1\n" <<
|
||
|
"+insert2\n" <<
|
||
|
" efgh\n" <<
|
||
|
"@@ -11,4 +12,5 @@\n" <<
|
||
|
" abcd\n" <<
|
||
|
"-delete2\n" <<
|
||
|
"-delete3\n" <<
|
||
|
"+insert3\n" <<
|
||
|
"+insert4\n" <<
|
||
|
"+insert5\n" <<
|
||
|
" efgh\n" <<
|
||
|
"@@ -21,4 +23,3 @@\n" <<
|
||
|
" abcd\n" <<
|
||
|
"-delete4\n" <<
|
||
|
"-delete5\n" <<
|
||
|
"+insert6\n" <<
|
||
|
" efgh\n";
|
||
|
|
||
|
QStringList newLines;
|
||
|
newLines << "delete2\n";
|
||
|
QStringList oldLines;
|
||
|
oldLines << "insert4\n";
|
||
|
LineNumberHash expectedLineNumbers;
|
||
|
expectedLineNumbers.insert(0, qMakePair(2, 2));
|
||
|
expectedLineNumbers.insert(1, qMakePair(12, 13));
|
||
|
expectedLineNumbers.insert(2, qMakePair(13, 15));
|
||
|
expectedLineNumbers.insert(3, qMakePair(22, 24));
|
||
|
|
||
|
QTest::newRow("Partial reversion") << patch << oldLines << newLines << 14 << 4 << expectedLineNumbers;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void InteractiveDiffTest::testLineNumbers()
|
||
|
{
|
||
|
QFETCH(QStringList, patch);
|
||
|
Parser parser(0);
|
||
|
DiffModelList* models = parser.parse(patch);
|
||
|
QCOMPARE(models->size(), 1);
|
||
|
DiffModel* model = models->at(0);
|
||
|
model->applyAllDifferences(true);
|
||
|
|
||
|
QFETCH(QStringList, oldLines);
|
||
|
QFETCH(QStringList, newLines);
|
||
|
QFETCH(int, editLineNumber);
|
||
|
model->linesChanged(oldLines, newLines, editLineNumber);
|
||
|
QFETCH(int, expectedDifferenceCount);
|
||
|
QCOMPARE(model->differenceCount(), expectedDifferenceCount);
|
||
|
|
||
|
QFETCH(LineNumberHash, expectedLineNumbers);
|
||
|
for (LineNumberHash::ConstIterator iter = expectedLineNumbers.constBegin(); iter != expectedLineNumbers.constEnd(); ++iter) {
|
||
|
const Difference* diff = model->differenceAt(iter.key());
|
||
|
QCOMPARE(diff->sourceLineNumber(), iter.value().first);
|
||
|
QCOMPARE(diff->trackingDestinationLineNumber(), iter.value().second);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// When the new diff and an existing unapplied one are on neighbour lines, do not merge the unapplied with the new.
|
||
|
void InteractiveDiffTest::testAppliedTouch()
|
||
|
{
|
||
|
Difference* first = new Difference(2, 2);
|
||
|
first->addSourceLine(QString("delete1"));
|
||
|
first->addDestinationLine(QString("insert1"));
|
||
|
first->apply(false);
|
||
|
Difference* second = new Difference(4, 4);
|
||
|
second->addSourceLine(QString("delete2"));
|
||
|
second->addDestinationLine(QString("insert2"));
|
||
|
second->apply(false);
|
||
|
DiffModel model;
|
||
|
model.addDiff(first);
|
||
|
model.addDiff(second);
|
||
|
model.linesChanged(QStringList() << "oldline\n", QStringList() << "newline\n", 3);
|
||
|
QCOMPARE(model.differenceCount(), 3);
|
||
|
QCOMPARE(model.differenceAt(0), first);
|
||
|
QCOMPARE(model.differenceAt(2), second);
|
||
|
}
|
||
|
|
||
|
// When the new diff and an existing unapplied one intersect, the unapplied one should be removed
|
||
|
void InteractiveDiffTest::testAppliedIntersect()
|
||
|
{
|
||
|
Difference* first = new Difference(2, 2);
|
||
|
first->addSourceLine(QString("delete1"));
|
||
|
first->addSourceLine(QString("delete2"));
|
||
|
first->addDestinationLine(QString("insert1"));
|
||
|
first->addDestinationLine(QString("insert2"));
|
||
|
first->apply(false);
|
||
|
Difference* second = new Difference(5, 5);
|
||
|
second->addSourceLine(QString("delete3"));
|
||
|
second->addSourceLine(QString("delete4"));
|
||
|
second->addDestinationLine(QString("insert3"));
|
||
|
second->addDestinationLine(QString("insert4"));
|
||
|
second->apply(false);
|
||
|
DiffModel model;
|
||
|
model.addDiff(first);
|
||
|
model.addDiff(second);
|
||
|
QStringList removedLines;
|
||
|
removedLines << "delete2\n" << "oldline1\n" << "delete3\n";
|
||
|
QStringList insertedLines;
|
||
|
insertedLines << "newline1\n";
|
||
|
model.linesChanged(removedLines, insertedLines, 3);
|
||
|
QCOMPARE(model.differenceCount(), 1);
|
||
|
const Difference* newDiff = model.differenceAt(0);
|
||
|
QCOMPARE(newDiff->applied(), true);
|
||
|
QCOMPARE(newDiff->sourceLineNumber(), 3);
|
||
|
QCOMPARE(newDiff->trackingDestinationLineNumber(), 3);
|
||
|
CompareDifferenceStringList(newDiff->sourceLines(), removedLines);
|
||
|
CompareDifferenceStringList(newDiff->destinationLines(), insertedLines);
|
||
|
}
|
||
|
|
||
|
void InteractiveDiffTest::testExistingAndApplied()
|
||
|
{
|
||
|
Difference* first = new Difference(2, 2);
|
||
|
first->addSourceLine(QString("delete1"));
|
||
|
first->addDestinationLine(QString("insert1"));
|
||
|
first->apply(true);
|
||
|
Difference* second = new Difference(3, 3);
|
||
|
second->addSourceLine(QString("delete2"));
|
||
|
second->addDestinationLine(QString("insert2"));
|
||
|
second->apply(false);
|
||
|
DiffModel model;
|
||
|
model.addDiff(first);
|
||
|
model.addDiff(second);
|
||
|
QStringList removedLines;
|
||
|
removedLines << "delete1\n";
|
||
|
QStringList insertedLines;
|
||
|
insertedLines << "newline1\n";
|
||
|
model.linesChanged(removedLines, insertedLines, 2);
|
||
|
QCOMPARE(model.differenceCount(), 2);
|
||
|
QVERIFY(model.differenceAt(0)->applied());
|
||
|
QVERIFY(!model.differenceAt(1)->applied());
|
||
|
}
|
||
|
|
||
|
void InteractiveDiffTest::testOneLineDeletionUnapplied()
|
||
|
{
|
||
|
Difference* unappliedDeletion = new Difference(1, 1);
|
||
|
unappliedDeletion->addSourceLine("delete1\n");
|
||
|
unappliedDeletion->apply(false);
|
||
|
DiffModel model;
|
||
|
model.addDiff(unappliedDeletion);
|
||
|
QStringList removedLines;
|
||
|
removedLines << "delete1\n";
|
||
|
QStringList insertedLines;
|
||
|
insertedLines << "newline1\n";
|
||
|
model.linesChanged(removedLines, insertedLines, 1);
|
||
|
QCOMPARE(model.differenceCount(), 1);
|
||
|
const Difference* actual = model.differenceAt(0);
|
||
|
CompareDifferenceStringList(actual->sourceLines(), removedLines);
|
||
|
CompareDifferenceStringList(actual->destinationLines(), insertedLines);
|
||
|
}
|
||
|
|
||
|
void InteractiveDiffTest::testApplyUnapply()
|
||
|
{
|
||
|
QStringList patch;
|
||
|
patch <<
|
||
|
"--- file1\t2011-01-01 20:23:45 +0300\n" <<
|
||
|
"+++ file2\t2011-01-01 20:24:02 +0300\n" <<
|
||
|
"@@ -1,3 +1,4 @@\n" <<
|
||
|
" line1\n" <<
|
||
|
"-delete1\n" <<
|
||
|
"+insert1\n" <<
|
||
|
"+insert2\n" <<
|
||
|
" line2\n" <<
|
||
|
"@@ -11,4 +12,5 @@\n" <<
|
||
|
" line3\n" <<
|
||
|
"-delete2\n" <<
|
||
|
"-delete3\n" <<
|
||
|
"+insert3\n" <<
|
||
|
"+insert4\n" <<
|
||
|
"+insert5\n" <<
|
||
|
" line4\n" <<
|
||
|
"@@ -21,4 +23,2 @@\n" <<
|
||
|
" line5\n" <<
|
||
|
"-delete4\n" <<
|
||
|
"-delete5\n" <<
|
||
|
" line6\n" <<
|
||
|
"@@ -31,3 +31,3 @@\n" <<
|
||
|
" line7\n" <<
|
||
|
"-delete6\n" <<
|
||
|
"+insert6\n" <<
|
||
|
" line8\n";
|
||
|
Parser parser(0);
|
||
|
DiffModelList* models = parser.parse(patch);
|
||
|
QCOMPARE(models->size(), 1);
|
||
|
DiffModel* model = models->at(0);
|
||
|
QCOMPARE(model->differenceCount(), 4);
|
||
|
model->applyAllDifferences(true);
|
||
|
|
||
|
foreach( Difference* diff, *model->differences() )
|
||
|
{
|
||
|
QVERIFY(diff->applied());
|
||
|
}
|
||
|
model->applyAllDifferences(false);
|
||
|
QVERIFY(!model->differenceAt(0)->applied());
|
||
|
QCOMPARE(model->differenceAt(0)->sourceLineNumber(), 2);
|
||
|
QCOMPARE(model->differenceAt(0)->trackingDestinationLineNumber(), 2);
|
||
|
QVERIFY(!model->differenceAt(1)->applied());
|
||
|
QCOMPARE(model->differenceAt(1)->sourceLineNumber(), 12);
|
||
|
QCOMPARE(model->differenceAt(1)->trackingDestinationLineNumber(), 12);
|
||
|
QVERIFY(!model->differenceAt(2)->applied());
|
||
|
QCOMPARE(model->differenceAt(2)->sourceLineNumber(), 22);
|
||
|
QCOMPARE(model->differenceAt(2)->trackingDestinationLineNumber(), 22);
|
||
|
QVERIFY(!model->differenceAt(3)->applied());
|
||
|
QCOMPARE(model->differenceAt(3)->sourceLineNumber(), 32);
|
||
|
QCOMPARE(model->differenceAt(3)->trackingDestinationLineNumber(), 32);
|
||
|
|
||
|
model->differenceAt(1)->apply(true);
|
||
|
QVERIFY(model->differenceAt(1)->applied());
|
||
|
QCOMPARE(model->differenceAt(1)->sourceLineNumber(), 12);
|
||
|
QCOMPARE(model->differenceAt(1)->trackingDestinationLineNumber(), 12);
|
||
|
QVERIFY(!model->differenceAt(2)->applied());
|
||
|
QCOMPARE(model->differenceAt(2)->sourceLineNumber(), 22);
|
||
|
QCOMPARE(model->differenceAt(2)->trackingDestinationLineNumber(), 23);
|
||
|
QVERIFY(!model->differenceAt(3)->applied());
|
||
|
QCOMPARE(model->differenceAt(3)->sourceLineNumber(), 32);
|
||
|
QCOMPARE(model->differenceAt(3)->trackingDestinationLineNumber(), 33);
|
||
|
|
||
|
model->differenceAt(1)->apply(true);
|
||
|
QVERIFY(model->differenceAt(1)->applied());
|
||
|
QCOMPARE(model->differenceAt(1)->sourceLineNumber(), 12);
|
||
|
QCOMPARE(model->differenceAt(1)->trackingDestinationLineNumber(), 12);
|
||
|
QVERIFY(!model->differenceAt(2)->applied());
|
||
|
QCOMPARE(model->differenceAt(2)->sourceLineNumber(), 22);
|
||
|
QCOMPARE(model->differenceAt(2)->trackingDestinationLineNumber(), 23);
|
||
|
QVERIFY(!model->differenceAt(3)->applied());
|
||
|
QCOMPARE(model->differenceAt(3)->sourceLineNumber(), 32);
|
||
|
QCOMPARE(model->differenceAt(3)->trackingDestinationLineNumber(), 33);
|
||
|
|
||
|
model->differenceAt(2)->apply(true);
|
||
|
QVERIFY(model->differenceAt(2)->applied());
|
||
|
QCOMPARE(model->differenceAt(2)->sourceLineNumber(), 22);
|
||
|
QCOMPARE(model->differenceAt(2)->trackingDestinationLineNumber(), 23);
|
||
|
QVERIFY(!model->differenceAt(3)->applied());
|
||
|
QCOMPARE(model->differenceAt(3)->sourceLineNumber(), 32);
|
||
|
QCOMPARE(model->differenceAt(3)->trackingDestinationLineNumber(), 31);
|
||
|
|
||
|
model->applyAllDifferences(true);
|
||
|
QVERIFY(model->differenceAt(0)->applied());
|
||
|
QCOMPARE(model->differenceAt(0)->sourceLineNumber(), 2);
|
||
|
QCOMPARE(model->differenceAt(0)->trackingDestinationLineNumber(), 2);
|
||
|
QVERIFY(model->differenceAt(1)->applied());
|
||
|
QCOMPARE(model->differenceAt(1)->sourceLineNumber(), 12);
|
||
|
QCOMPARE(model->differenceAt(1)->trackingDestinationLineNumber(), 13);
|
||
|
QVERIFY(model->differenceAt(2)->applied());
|
||
|
QCOMPARE(model->differenceAt(2)->sourceLineNumber(), 22);
|
||
|
QCOMPARE(model->differenceAt(2)->trackingDestinationLineNumber(), 24);
|
||
|
QVERIFY(model->differenceAt(3)->applied());
|
||
|
QCOMPARE(model->differenceAt(3)->sourceLineNumber(), 32);
|
||
|
QCOMPARE(model->differenceAt(3)->trackingDestinationLineNumber(), 32);
|
||
|
|
||
|
model->applyAllDifferences(true);
|
||
|
QVERIFY(model->differenceAt(0)->applied());
|
||
|
QCOMPARE(model->differenceAt(0)->sourceLineNumber(), 2);
|
||
|
QCOMPARE(model->differenceAt(0)->trackingDestinationLineNumber(), 2);
|
||
|
QVERIFY(model->differenceAt(1)->applied());
|
||
|
QCOMPARE(model->differenceAt(1)->sourceLineNumber(), 12);
|
||
|
QCOMPARE(model->differenceAt(1)->trackingDestinationLineNumber(), 13);
|
||
|
QVERIFY(model->differenceAt(2)->applied());
|
||
|
QCOMPARE(model->differenceAt(2)->sourceLineNumber(), 22);
|
||
|
QCOMPARE(model->differenceAt(2)->trackingDestinationLineNumber(), 24);
|
||
|
QVERIFY(model->differenceAt(3)->applied());
|
||
|
QCOMPARE(model->differenceAt(3)->sourceLineNumber(), 32);
|
||
|
QCOMPARE(model->differenceAt(3)->trackingDestinationLineNumber(), 32);
|
||
|
}
|
||
|
|
||
|
QTEST_MAIN(InteractiveDiffTest);
|