cppcodegen_test.cpp 19.5 KB
Newer Older
hjk's avatar
hjk committed
1
/****************************************************************************
Bill King's avatar
Bill King committed
2
**
3
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
hjk's avatar
hjk committed
4
** Contact: http://www.qt-project.org/legal
Bill King's avatar
Bill King committed
5
**
hjk's avatar
hjk committed
6
** This file is part of Qt Creator.
Bill King's avatar
Bill King committed
7
**
hjk's avatar
hjk committed
8 9 10 11 12 13 14
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Digia.  For licensing terms and
** conditions see http://qt.digia.com/licensing.  For further information
** use the contact form at http://qt.digia.com/contact-us.
Bill King's avatar
Bill King committed
15 16
**
** GNU Lesser General Public License Usage
hjk's avatar
hjk committed
17 18 19 20 21 22 23 24 25
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file.  Please review the following information to
** ensure the GNU Lesser General Public License version 2.1 requirements
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Digia gives you certain additional
** rights.  These rights are described in the Digia Qt LGPL Exception
Bill King's avatar
Bill King committed
26 27
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
hjk's avatar
hjk committed
28
****************************************************************************/
Bill King's avatar
Bill King committed
29

30
#include "insertionpointlocator.h"
31 32
#include "cpptoolsplugin.h"

33
#include <utils/fileutils.h>
34 35

#include <QtTest>
hjk's avatar
hjk committed
36
#include <QDebug>
37
#include <QDir>
38

39 40 41 42
/*!
    Tests for various parts of the code generation. Well, okay, currently it only
    tests the InsertionPointLocator.
 */
43
using namespace CPlusPlus;
44
using namespace CppTools;
45
using namespace CppTools::Internal;
46

47 48 49
/*!
    Should insert at line 3, column 1, with "public:\n" as prefix and without suffix.
 */
50
void CppToolsPlugin::test_codegen_public_in_empty_class()
51 52 53 54
{
    const QByteArray src = "\n"
            "class Foo\n" // line 1
            "{\n"
55
            "};\n"
56 57
            "\n";

58
    Document::Ptr doc = Document::create(QLatin1String("public_in_empty_class"));
59
    doc->setUtf8Source(src);
60 61 62 63 64 65
    doc->parse();
    doc->check();

    QCOMPARE(doc->diagnosticMessages().size(), 0);
    QCOMPARE(doc->globalSymbolCount(), 1U);

66 67 68 69 70 71 72
    Class *foo = doc->globalSymbolAt(0)->asClass();
    QVERIFY(foo);
    QCOMPARE(foo->line(), 1U);
    QCOMPARE(foo->column(), 7U);

    Snapshot snapshot;
    snapshot.insert(doc);
73
    CppRefactoringChanges changes(snapshot);
74
    InsertionPointLocator find(changes);
75
    InsertionLocation loc = find.methodDeclarationInClass(
76 77
                doc->fileName(),
                foo,
78
                InsertionPointLocator::Public);
79
    QVERIFY(loc.isValid());
80
    QCOMPARE(loc.prefix(), QLatin1String("public:\n"));
81
    QVERIFY(loc.suffix().isEmpty());
82
    QCOMPARE(loc.line(), 3U);
83 84 85
    QCOMPARE(loc.column(), 1U);
}

86 87 88
/*!
    Should insert at line 3, column 1, without prefix and without suffix.
 */
89
void CppToolsPlugin::test_codegen_public_in_nonempty_class()
90 91 92 93
{
    const QByteArray src = "\n"
            "class Foo\n" // line 1
            "{\n"
94 95
            "public:\n"   // line 3
            "};\n"        // line 4
96 97
            "\n";

98
    Document::Ptr doc = Document::create(QLatin1String("public_in_nonempty_class"));
99
    doc->setUtf8Source(src);
100 101 102 103 104 105
    doc->parse();
    doc->check();

    QCOMPARE(doc->diagnosticMessages().size(), 0);
    QCOMPARE(doc->globalSymbolCount(), 1U);

106 107 108 109
    Class *foo = doc->globalSymbolAt(0)->asClass();
    QVERIFY(foo);
    QCOMPARE(foo->line(), 1U);
    QCOMPARE(foo->column(), 7U);
110

111 112
    Snapshot snapshot;
    snapshot.insert(doc);
113
    CppRefactoringChanges changes(snapshot);
114
    InsertionPointLocator find(changes);
115
    InsertionLocation loc = find.methodDeclarationInClass(
116 117
                doc->fileName(),
                foo,
118
                InsertionPointLocator::Public);
119
    QVERIFY(loc.isValid());
120
    QVERIFY(loc.prefix().isEmpty());
121
    QVERIFY(loc.suffix().isEmpty());
122
    QCOMPARE(loc.line(), 4U);
123 124 125
    QCOMPARE(loc.column(), 1U);
}

126 127 128
/*!
    Should insert at line 3, column 1, with "public:\n" as prefix and "\n suffix.
 */
129
void CppToolsPlugin::test_codegen_public_before_protected()
130 131 132 133 134 135 136 137
{
    const QByteArray src = "\n"
            "class Foo\n"  // line 1
            "{\n"
            "protected:\n" // line 3
            "};\n"
            "\n";

138
    Document::Ptr doc = Document::create(QLatin1String("public_before_protected"));
139
    doc->setUtf8Source(src);
140 141 142 143 144 145
    doc->parse();
    doc->check();

    QCOMPARE(doc->diagnosticMessages().size(), 0);
    QCOMPARE(doc->globalSymbolCount(), 1U);

146 147 148 149
    Class *foo = doc->globalSymbolAt(0)->asClass();
    QVERIFY(foo);
    QCOMPARE(foo->line(), 1U);
    QCOMPARE(foo->column(), 7U);
150

151 152
    Snapshot snapshot;
    snapshot.insert(doc);
153
    CppRefactoringChanges changes(snapshot);
154
    InsertionPointLocator find(changes);
155
    InsertionLocation loc = find.methodDeclarationInClass(
156 157
                doc->fileName(),
                foo,
158
                InsertionPointLocator::Public);
159 160 161 162 163 164 165
    QVERIFY(loc.isValid());
    QCOMPARE(loc.prefix(), QLatin1String("public:\n"));
    QCOMPARE(loc.suffix(), QLatin1String("\n"));
    QCOMPARE(loc.column(), 1U);
    QCOMPARE(loc.line(), 3U);
}

166 167 168 169
/*!
    Should insert at line 4, column 1, with "private:\n" as prefix and without
    suffix.
 */
170
void CppToolsPlugin::test_codegen_private_after_protected()
171 172 173 174 175 176 177 178
{
    const QByteArray src = "\n"
            "class Foo\n"  // line 1
            "{\n"
            "protected:\n" // line 3
            "};\n"
            "\n";

179
    Document::Ptr doc = Document::create(QLatin1String("private_after_protected"));
180
    doc->setUtf8Source(src);
181 182 183 184 185 186
    doc->parse();
    doc->check();

    QCOMPARE(doc->diagnosticMessages().size(), 0);
    QCOMPARE(doc->globalSymbolCount(), 1U);

187 188 189 190
    Class *foo = doc->globalSymbolAt(0)->asClass();
    QVERIFY(foo);
    QCOMPARE(foo->line(), 1U);
    QCOMPARE(foo->column(), 7U);
191

192 193
    Snapshot snapshot;
    snapshot.insert(doc);
194
    CppRefactoringChanges changes(snapshot);
195
    InsertionPointLocator find(changes);
196
    InsertionLocation loc = find.methodDeclarationInClass(
197 198
                doc->fileName(),
                foo,
199
                InsertionPointLocator::Private);
200 201 202 203 204 205 206
    QVERIFY(loc.isValid());
    QCOMPARE(loc.prefix(), QLatin1String("private:\n"));
    QVERIFY(loc.suffix().isEmpty());
    QCOMPARE(loc.column(), 1U);
    QCOMPARE(loc.line(), 4U);
}

207 208 209 210
/*!
    Should insert at line 4, column 1, with "protected:\n" as prefix and without
    suffix.
 */
211
void CppToolsPlugin::test_codegen_protected_in_nonempty_class()
212 213 214 215 216 217 218 219
{
    const QByteArray src = "\n"
            "class Foo\n" // line 1
            "{\n"
            "public:\n"   // line 3
            "};\n"        // line 4
            "\n";

220
    Document::Ptr doc = Document::create(QLatin1String("protected_in_nonempty_class"));
221
    doc->setUtf8Source(src);
222 223 224 225 226 227
    doc->parse();
    doc->check();

    QCOMPARE(doc->diagnosticMessages().size(), 0);
    QCOMPARE(doc->globalSymbolCount(), 1U);

228 229 230 231
    Class *foo = doc->globalSymbolAt(0)->asClass();
    QVERIFY(foo);
    QCOMPARE(foo->line(), 1U);
    QCOMPARE(foo->column(), 7U);
232

233 234
    Snapshot snapshot;
    snapshot.insert(doc);
235
    CppRefactoringChanges changes(snapshot);
236
    InsertionPointLocator find(changes);
237
    InsertionLocation loc = find.methodDeclarationInClass(
238 239
                doc->fileName(),
                foo,
240
                InsertionPointLocator::Protected);
241 242 243 244 245 246 247
    QVERIFY(loc.isValid());
    QCOMPARE(loc.prefix(), QLatin1String("protected:\n"));
    QVERIFY(loc.suffix().isEmpty());
    QCOMPARE(loc.column(), 1U);
    QCOMPARE(loc.line(), 4U);
}

248 249 250
/*!
    Should insert at line 4, column 1, with "protected\n" as prefix and "\n" suffix.
 */
251
void CppToolsPlugin::test_codegen_protected_between_public_and_private()
252 253 254 255 256 257 258 259 260
{
    const QByteArray src = "\n"
            "class Foo\n" // line 1
            "{\n"
            "public:\n"   // line 3
            "private:\n"  // line 4
            "};\n"        // line 5
            "\n";

261
    Document::Ptr doc = Document::create(QLatin1String("protected_betwee_public_and_private"));
262
    doc->setUtf8Source(src);
263 264 265 266 267 268
    doc->parse();
    doc->check();

    QCOMPARE(doc->diagnosticMessages().size(), 0);
    QCOMPARE(doc->globalSymbolCount(), 1U);

269 270 271 272
    Class *foo = doc->globalSymbolAt(0)->asClass();
    QVERIFY(foo);
    QCOMPARE(foo->line(), 1U);
    QCOMPARE(foo->column(), 7U);
273

274 275
    Snapshot snapshot;
    snapshot.insert(doc);
276
    CppRefactoringChanges changes(snapshot);
277
    InsertionPointLocator find(changes);
278
    InsertionLocation loc = find.methodDeclarationInClass(
279 280
                doc->fileName(),
                foo,
281
                InsertionPointLocator::Protected);
282 283 284 285 286 287 288
    QVERIFY(loc.isValid());
    QCOMPARE(loc.prefix(), QLatin1String("protected:\n"));
    QCOMPARE(loc.suffix(), QLatin1String("\n"));
    QCOMPARE(loc.column(), 1U);
    QCOMPARE(loc.line(), 4U);
}

289 290 291 292 293 294 295
/*!
    Should insert at line 18, column 1, with "private slots:\n" as prefix and "\n"
    as suffix.

    This is the typical Qt Designer case, with test-input like what the integration
    generates.
 */
296
void CppToolsPlugin::test_codegen_qtdesigner_integration()
297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321
{
    const QByteArray src = "/**** Some long (C)opyright notice ****/\n"
            "#ifndef MAINWINDOW_H\n"
            "#define MAINWINDOW_H\n"
            "\n"
            "#include <QMainWindow>\n"
            "\n"
            "namespace Ui {\n"
            "    class MainWindow;\n"
            "}\n"
            "\n"
            "class MainWindow : public QMainWindow\n" // line 10
            "{\n"
            "    Q_OBJECT\n"
            "\n"
            "public:\n" // line 14
            "    explicit MainWindow(QWidget *parent = 0);\n"
            "    ~MainWindow();\n"
            "\n"
            "private:\n" // line 18
            "    Ui::MainWindow *ui;\n"
            "};\n"
            "\n"
            "#endif // MAINWINDOW_H\n";

322
    Document::Ptr doc = Document::create(QLatin1String("qtdesigner_integration"));
323
    doc->setUtf8Source(src);
324 325 326 327 328 329
    doc->parse();
    doc->check();

    QCOMPARE(doc->diagnosticMessages().size(), 0);
    QCOMPARE(doc->globalSymbolCount(), 2U);

330 331 332 333
    Class *foo = doc->globalSymbolAt(1)->asClass();
    QVERIFY(foo);
    QCOMPARE(foo->line(), 10U);
    QCOMPARE(foo->column(), 7U);
334

335 336
    Snapshot snapshot;
    snapshot.insert(doc);
337
    CppRefactoringChanges changes(snapshot);
338
    InsertionPointLocator find(changes);
339
    InsertionLocation loc = find.methodDeclarationInClass(
340 341
                doc->fileName(),
                foo,
342
                InsertionPointLocator::PrivateSlot);
343 344 345 346 347 348 349
    QVERIFY(loc.isValid());
    QCOMPARE(loc.prefix(), QLatin1String("private slots:\n"));
    QCOMPARE(loc.suffix(), QLatin1String("\n"));
    QCOMPARE(loc.line(), 18U);
    QCOMPARE(loc.column(), 1U);
}

350
void CppToolsPlugin::test_codegen_definition_empty_class()
351 352 353 354 355 356 357 358 359 360 361 362
{
    const QByteArray srcText = "\n"
            "class Foo\n"  // line 1
            "{\n"
            "void foo();\n" // line 3
            "};\n"
            "\n";

    const QByteArray dstText = "\n"
            "int x;\n"  // line 1
            "\n";

363
    Document::Ptr src = Document::create(QDir::tempPath() + QLatin1String("/file.h"));
364 365 366
    Utils::FileSaver srcSaver(src->fileName());
    srcSaver.write(srcText);
    srcSaver.finalize();
367
    src->setUtf8Source(srcText);
368 369 370 371 372
    src->parse();
    src->check();
    QCOMPARE(src->diagnosticMessages().size(), 0);
    QCOMPARE(src->globalSymbolCount(), 1U);

373
    Document::Ptr dst = Document::create(QDir::tempPath() + QLatin1String("/file.cpp"));
374 375 376
    Utils::FileSaver dstSaver(dst->fileName());
    dstSaver.write(dstText);
    dstSaver.finalize();
377
    dst->setUtf8Source(dstText);
378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401
    dst->parse();
    dst->check();
    QCOMPARE(dst->diagnosticMessages().size(), 0);
    QCOMPARE(dst->globalSymbolCount(), 1U);

    Snapshot snapshot;
    snapshot.insert(src);
    snapshot.insert(dst);

    Class *foo = src->globalSymbolAt(0)->asClass();
    QVERIFY(foo);
    QCOMPARE(foo->line(), 1U);
    QCOMPARE(foo->column(), 7U);
    QCOMPARE(foo->memberCount(), 1U);
    Declaration *decl = foo->memberAt(0)->asDeclaration();
    QVERIFY(decl);
    QCOMPARE(decl->line(), 3U);
    QCOMPARE(decl->column(), 6U);

    CppRefactoringChanges changes(snapshot);
    InsertionPointLocator find(changes);
    QList<InsertionLocation> locList = find.methodDefinition(decl);
    QVERIFY(locList.size() == 1);
    InsertionLocation loc = locList.first();
402
    QCOMPARE(loc.fileName(), dst->fileName());
403 404
    QCOMPARE(loc.prefix(), QLatin1String("\n\n"));
    QCOMPARE(loc.suffix(), QString());
Leandro Melo's avatar
Leandro Melo committed
405 406
    QCOMPARE(loc.line(), 3U);
    QCOMPARE(loc.column(), 1U);
407 408
}

409
void CppToolsPlugin::test_codegen_definition_first_member()
410 411 412 413 414 415 416 417 418
{
    const QByteArray srcText = "\n"
            "class Foo\n"  // line 1
            "{\n"
            "void foo();\n" // line 3
            "void bar();\n" // line 4
            "};\n"
            "\n";

419
    const QByteArray dstText = QString::fromLatin1(
420 421 422 423 424 425 426 427 428
                "\n"
                "#include \"%1/file.h\"\n" // line 1
                "int x;\n"
                "\n"
                "void Foo::bar()\n" // line 4
                "{\n"
                "\n"
                "}\n"
                "\n"
429
                "int y;\n").arg(QDir::tempPath()).toLatin1();
430

431
    Document::Ptr src = Document::create(QDir::tempPath() + QLatin1String("/file.h"));
432 433 434
    Utils::FileSaver srcSaver(src->fileName());
    srcSaver.write(srcText);
    srcSaver.finalize();
435
    src->setUtf8Source(srcText);
436 437 438 439 440
    src->parse();
    src->check();
    QCOMPARE(src->diagnosticMessages().size(), 0);
    QCOMPARE(src->globalSymbolCount(), 1U);

441
    Document::Ptr dst = Document::create(QDir::tempPath() + QLatin1String("/file.cpp"));
442 443
    dst->addIncludeFile(Document::Include(QLatin1String("file.h"), src->fileName(), 1,
                                          Client::IncludeLocal));
444 445 446
    Utils::FileSaver dstSaver(dst->fileName());
    dstSaver.write(dstText);
    dstSaver.finalize();
447
    dst->setUtf8Source(dstText);
448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471
    dst->parse();
    dst->check();
    QCOMPARE(dst->diagnosticMessages().size(), 0);
    QCOMPARE(dst->globalSymbolCount(), 3U);

    Snapshot snapshot;
    snapshot.insert(src);
    snapshot.insert(dst);

    Class *foo = src->globalSymbolAt(0)->asClass();
    QVERIFY(foo);
    QCOMPARE(foo->line(), 1U);
    QCOMPARE(foo->column(), 7U);
    QCOMPARE(foo->memberCount(), 2U);
    Declaration *decl = foo->memberAt(0)->asDeclaration();
    QVERIFY(decl);
    QCOMPARE(decl->line(), 3U);
    QCOMPARE(decl->column(), 6U);

    CppRefactoringChanges changes(snapshot);
    InsertionPointLocator find(changes);
    QList<InsertionLocation> locList = find.methodDefinition(decl);
    QVERIFY(locList.size() == 1);
    InsertionLocation loc = locList.first();
472
    QCOMPARE(loc.fileName(), dst->fileName());
473 474 475 476 477 478
    QCOMPARE(loc.line(), 4U);
    QCOMPARE(loc.column(), 1U);
    QCOMPARE(loc.suffix(), QLatin1String("\n\n"));
    QCOMPARE(loc.prefix(), QString());
}

479
void CppToolsPlugin::test_codegen_definition_last_member()
480 481 482 483 484 485 486 487 488
{
    const QByteArray srcText = "\n"
            "class Foo\n"  // line 1
            "{\n"
            "void foo();\n" // line 3
            "void bar();\n" // line 4
            "};\n"
            "\n";

489
    const QByteArray dstText = QString::fromLatin1(
490 491 492 493 494 495 496 497 498
                "\n"
                "#include \"%1/file.h\"\n" // line 1
                "int x;\n"
                "\n"
                "void Foo::foo()\n" // line 4
                "{\n"
                "\n"
                "}\n" // line 7
                "\n"
499
                "int y;\n").arg(QDir::tempPath()).toLatin1();
500

501
    Document::Ptr src = Document::create(QDir::tempPath() + QLatin1String("/file.h"));
502 503 504
    Utils::FileSaver srcSaver(src->fileName());
    srcSaver.write(srcText);
    srcSaver.finalize();
505
    src->setUtf8Source(srcText);
506 507 508 509 510
    src->parse();
    src->check();
    QCOMPARE(src->diagnosticMessages().size(), 0);
    QCOMPARE(src->globalSymbolCount(), 1U);

511
    Document::Ptr dst = Document::create(QDir::tempPath() + QLatin1String("/file.cpp"));
512 513
    dst->addIncludeFile(Document::Include(QLatin1String("file.h"), src->fileName(), 1,
                                          Client::IncludeLocal));
514 515 516
    Utils::FileSaver dstSaver(dst->fileName());
    dstSaver.write(dstText);
    dstSaver.finalize();
517
    dst->setUtf8Source(dstText);
518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541
    dst->parse();
    dst->check();
    QCOMPARE(dst->diagnosticMessages().size(), 0);
    QCOMPARE(dst->globalSymbolCount(), 3U);

    Snapshot snapshot;
    snapshot.insert(src);
    snapshot.insert(dst);

    Class *foo = src->globalSymbolAt(0)->asClass();
    QVERIFY(foo);
    QCOMPARE(foo->line(), 1U);
    QCOMPARE(foo->column(), 7U);
    QCOMPARE(foo->memberCount(), 2U);
    Declaration *decl = foo->memberAt(1)->asDeclaration();
    QVERIFY(decl);
    QCOMPARE(decl->line(), 4U);
    QCOMPARE(decl->column(), 6U);

    CppRefactoringChanges changes(snapshot);
    InsertionPointLocator find(changes);
    QList<InsertionLocation> locList = find.methodDefinition(decl);
    QVERIFY(locList.size() == 1);
    InsertionLocation loc = locList.first();
542
    QCOMPARE(loc.fileName(), dst->fileName());
543 544 545 546 547 548
    QCOMPARE(loc.line(), 7U);
    QCOMPARE(loc.column(), 2U);
    QCOMPARE(loc.prefix(), QLatin1String("\n\n"));
    QCOMPARE(loc.suffix(), QString());
}

549
void CppToolsPlugin::test_codegen_definition_middle_member()
550 551 552 553 554 555 556 557 558 559
{
    const QByteArray srcText = "\n"
            "class Foo\n"  // line 1
            "{\n"
            "void foo();\n" // line 3
            "void bar();\n" // line 4
            "void car();\n" // line 5
            "};\n"
            "\n";

560
    const QByteArray dstText = QString::fromLatin1(
561 562 563 564 565 566 567 568 569 570 571 572 573 574
                "\n"
                "#include \"%1/file.h\"\n" // line 1
                "int x;\n"
                "\n"
                "void Foo::foo()\n" // line 4
                "{\n"
                "\n"
                "}\n" // line 7
                "\n"
                "void Foo::car()\n" // line 9
                "{\n"
                "\n"
                "}\n"
                "\n"
575
                "int y;\n").arg(QDir::tempPath()).toLatin1();
576

577
    Document::Ptr src = Document::create(QDir::tempPath() + QLatin1String("/file.h"));
578 579 580
    Utils::FileSaver srcSaver(src->fileName());
    srcSaver.write(srcText);
    srcSaver.finalize();
581
    src->setUtf8Source(srcText);
582 583 584 585 586
    src->parse();
    src->check();
    QCOMPARE(src->diagnosticMessages().size(), 0);
    QCOMPARE(src->globalSymbolCount(), 1U);

587
    Document::Ptr dst = Document::create(QDir::tempPath() + QLatin1String("/file.cpp"));
588 589
    dst->addIncludeFile(Document::Include(QLatin1String("file.h"), src->fileName(), 1,
                                          Client::IncludeLocal));
590 591 592
    Utils::FileSaver dstSaver(dst->fileName());
    dstSaver.write(dstText);
    dstSaver.finalize();
593
    dst->setUtf8Source(dstText);
594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617
    dst->parse();
    dst->check();
    QCOMPARE(dst->diagnosticMessages().size(), 0);
    QCOMPARE(dst->globalSymbolCount(), 4U);

    Snapshot snapshot;
    snapshot.insert(src);
    snapshot.insert(dst);

    Class *foo = src->globalSymbolAt(0)->asClass();
    QVERIFY(foo);
    QCOMPARE(foo->line(), 1U);
    QCOMPARE(foo->column(), 7U);
    QCOMPARE(foo->memberCount(), 3U);
    Declaration *decl = foo->memberAt(1)->asDeclaration();
    QVERIFY(decl);
    QCOMPARE(decl->line(), 4U);
    QCOMPARE(decl->column(), 6U);

    CppRefactoringChanges changes(snapshot);
    InsertionPointLocator find(changes);
    QList<InsertionLocation> locList = find.methodDefinition(decl);
    QVERIFY(locList.size() == 1);
    InsertionLocation loc = locList.first();
618
    QCOMPARE(loc.fileName(), dst->fileName());
619 620 621 622 623
    QCOMPARE(loc.line(), 7U);
    QCOMPARE(loc.column(), 2U);
    QCOMPARE(loc.prefix(), QLatin1String("\n\n"));
    QCOMPARE(loc.suffix(), QString());
}