Interesting case: Two parts of qualified identifier should match a single identifier

This mapping has 4 multi-map groups: several pairings are equally correct there. The code view shows one arbitrary valid pairing, not the only one.

Code view:

A painting is a person's account of this edit as text, recorded independently of the node mapping - a rendering often has several equally defensible answers where the mapping has one. Deletions and insertions carry no position on the opposite side in a painting, so that panel draws no caret for them.

Before

1/*
2 * This file is part of nzbget. See <https://nzbget.com>.
3 *
4 * Copyright (C) 2015-2016 Andrey Prygunkov <hugbug@users.sourceforge.net>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 */
19
20
21#include "nzbget.h"
22
23#include <boost/test/unit_test.hpp>
24#include <filesystem>
25
26#include "DupeMatcher.h"
27
28BOOST_AUTO_TEST_CASE(DupeMatcherTest)
29{
30 const std::string testDataDir = std::filesystem::current_path().string() + "/rarrenamer";
31 const std::string workingDir = testDataDir + "/DupeMatcher";
32 std::filesystem::create_directory(workingDir);
33
34 CString errmsg;
35
36 // prepare directories
37
38 std::string dupe1(workingDir + "/dupe1");
39 BOOST_CHECK(FileSystem::ForceDirectories(dupe1.c_str(), errmsg));
40 std::filesystem::copy(dupe1, testDataDir + "/parchecker");
41
42 std::string dupe2(workingDir + "/dupe2");
43 BOOST_CHECK(FileSystem::ForceDirectories(dupe2.c_str(), errmsg));
44 std::filesystem::copy(dupe2, testDataDir + "/parchecker");
45 FileSystem::DeleteFile((dupe2 + "/testfile.nfo").c_str());
46
47 std::string rardupe1(testDataDir + "/dupematcher1");
48 std::string rardupe2(testDataDir + "/dupematcher2");
49
50 std::string nondupe(workingDir + "/nondupe");
51 BOOST_CHECK(FileSystem::ForceDirectories(nondupe.c_str(), errmsg));
52 std::filesystem::copy(nondupe, testDataDir + "/parchecker");
53 remove((nondupe + "/testfile.dat").c_str());
54
55 // now test
56 int64 expectedSize = FileSystem::FileSize((dupe1 + "/testfile.dat").c_str());
57
58 BOOST_TEST_MESSAGE("This test requires working unrar 5 in search path");
…lines 59–95 unchanged (37 lines)

After

1/*
2 * This file is part of nzbget. See <https://nzbget.com>.
3 *
4 * Copyright (C) 2015-2016 Andrey Prygunkov <hugbug@users.sourceforge.net>
5 * Copyright (C) 2024 Denis <denis@nzbget.com>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <https://www.gnu.org/licenses/>.
19 */
20
21
22#include "nzbget.h"
23
24#include <boost/test/unit_test.hpp>
25#include "FileSystem.h"
26#include "DupeMatcher.h"
27#include "TestUtil.h"
28
29BOOST_AUTO_TEST_CASE(DupeMatcherTest)
30{
31 const std::string testDataDir = TestUtil::WorkingDir() + "/rarrenamer";
32 const std::string workingDir = testDataDir + "/DupeMatcher";
33 FileSystem::CreateDirectory(workingDir.c_str());
34
35 CString errmsg;
36
37 // prepare directories
38
39 std::string dupe1(workingDir + "/dupe1");
40 BOOST_CHECK(FileSystem::ForceDirectories(dupe1.c_str(), errmsg));
41 FileSystem::CopyFile(dupe1.c_str(), (testDataDir + "/parchecker").c_str());
42
43 std::string dupe2(workingDir + "/dupe2");
44 BOOST_CHECK(FileSystem::ForceDirectories(dupe2.c_str(), errmsg));
45 FileSystem::CopyFile(dupe2.c_str(), (testDataDir + "/parchecker").c_str());
46 FileSystem::DeleteFile((dupe2 + "/testfile.nfo").c_str());
47
48 std::string rardupe1(testDataDir + "/dupematcher1");
49 std::string rardupe2(testDataDir + "/dupematcher2");
50
51 std::string nondupe(workingDir + "/nondupe");
52 BOOST_CHECK(FileSystem::ForceDirectories(nondupe.c_str(), errmsg));
53 FileSystem::CopyFile(nondupe.c_str(), (testDataDir + "/parchecker").c_str());
54 remove((nondupe + "/testfile.dat").c_str());
55
56 // now test
57 int64 expectedSize = FileSystem::FileSize((dupe1 + "/testfile.dat").c_str());
58
59 BOOST_TEST_MESSAGE("This test requires working unrar 5 in search path");
…lines 60–96 unchanged (37 lines)

Before

translation_unit
comment "/*\n * This file is part of nzbget. See <https://nzbget.com>"...
preproc_include
#include "#include"
string_literal
" "\""
string_content "nzbget.h"
" "\""
preproc_include
#include "#include"
system_lib_string "<boost/test/unit_test.hpp>"
preproc_include
#include "#include"
system_lib_string "<filesystem>"
preproc_include
#include "#include"
string_literal
" "\""
string_content "DupeMatcher.h"
" "\""
function_definition
function_declarator
identifier "BOOST_AUTO_TEST_CASE"
parameter_list
( "("
parameter_declaration
type_identifier "DupeMatcherTest"
) ")"
compound_statement
{ "{"
declaration
type_qualifier
const "const"
qualified_identifier
namespace_identifier "std"
:: "::"
type_identifier "string"
init_declarator
identifier "testDataDir"
= "="
binary_expression
call_expression
field_expression
call_expression
qualified_identifier
namespace_identifier "std"
:: "::"
qualified_identifier
namespace_identifier "filesystem"
:: "::"
identifier "current_path"
argument_list
( "("
) ")"
. "."
field_identifier "string"
argument_list
( "("
) ")"
+ "+"
string_literal
" "\""
string_content "/rarrenamer"
" "\""
; ";"
declaration
type_qualifier
const "const"
qualified_identifier
namespace_identifier "std"
:: "::"
type_identifier "string"
init_declarator
identifier "workingDir"
= "="
binary_expression
identifier "testDataDir"
+ "+"
string_literal
" "\""
string_content "/DupeMatcher"
" "\""
; ";"
expression_statement
call_expression
qualified_identifier
namespace_identifier "std" any 4:1
:: "::" any 4:1
qualified_identifier any 4:1
namespace_identifier "filesystem" any 4:1
:: "::"
identifier "create_directory"
argument_list
( "("
identifier "workingDir"
) ")"
; ";"
declaration
type_identifier "CString"
identifier "errmsg"
; ";"
comment "// prepare directories"
declaration
qualified_identifier
namespace_identifier "std"
:: "::"
type_identifier "string"
init_declarator
identifier "dupe1"
argument_list
( "("
binary_expression
identifier "workingDir"
+ "+"
string_literal
" "\""
string_content "/dupe1"
" "\""
) ")"
; ";"
expression_statement (+25 nodes collapsed)
expression_statement
call_expression
qualified_identifier
namespace_identifier "std" any 4:1
:: "::" any 4:1
qualified_identifier any 4:1
namespace_identifier "filesystem" any 4:1
:: "::"
identifier "copy"
argument_list
( "("
identifier "dupe1"
, ","
binary_expression
identifier "testDataDir"
+ "+"
string_literal
" "\""
string_content "/parchecker"
" "\""
) ")"
; ";"
declaration
qualified_identifier
namespace_identifier "std"
:: "::"
type_identifier "string"
init_declarator
identifier "dupe2"
argument_list
( "("
binary_expression
identifier "workingDir"
+ "+"
string_literal
" "\""
string_content "/dupe2"
" "\""
) ")"
; ";"
expression_statement (+25 nodes collapsed)
expression_statement
call_expression
qualified_identifier
namespace_identifier "std" any 4:1
:: "::" any 4:1
qualified_identifier any 4:1
namespace_identifier "filesystem" any 4:1
:: "::"
identifier "copy"
argument_list
( "("
identifier "dupe2"
, ","
binary_expression
identifier "testDataDir"
+ "+"
string_literal
" "\""
string_content "/parchecker"
" "\""
) ")"
; ";"
expression_statement (+27 nodes collapsed)
declaration
qualified_identifier
namespace_identifier "std"
:: "::"
type_identifier "string"
init_declarator
identifier "rardupe1"
argument_list
( "("
binary_expression
identifier "testDataDir"
+ "+"
string_literal
" "\""
string_content "/dupematcher1"
" "\""
) ")"
; ";"
declaration
qualified_identifier
namespace_identifier "std"
:: "::"
type_identifier "string"
init_declarator
identifier "rardupe2"
argument_list
( "("
binary_expression
identifier "testDataDir"
+ "+"
string_literal
" "\""
string_content "/dupematcher2"
" "\""
) ")"
; ";"
declaration
qualified_identifier
namespace_identifier "std"
:: "::"
type_identifier "string"
init_declarator
identifier "nondupe"
argument_list
( "("
binary_expression
identifier "workingDir"
+ "+"
string_literal
" "\""
string_content "/nondupe"
" "\""
) ")"
; ";"
expression_statement (+25 nodes collapsed)
expression_statement
call_expression
qualified_identifier
namespace_identifier "std" any 4:1
:: "::" any 4:1
qualified_identifier any 4:1
namespace_identifier "filesystem" any 4:1
:: "::"
identifier "copy"
argument_list
( "("
identifier "nondupe"
, ","
binary_expression
identifier "testDataDir"
+ "+"
string_literal
" "\""
string_content "/parchecker"
" "\""
) ")"
; ";"
expression_statement (+24 nodes collapsed)
comment "// now test"
declaration (+31 nodes collapsed)
expression_statement
call_expression
identifier "BOOST_TEST_MESSAGE"
argument_list
( "("
string_literal
" "\""
string_content "This test requires working unrar 5 in search path"
" "\""
) ")"
; ";"
declaration
type_identifier "DupeMatcher"
init_declarator
identifier "dupe1Matcher"
argument_list
( "("
call_expression
field_expression
identifier "dupe1"
. "."
field_identifier "c_str"
argument_list
( "("
) ")"
, ","
identifier "expectedSize"
) ")"
; ";"
expression_statement
call_expression
identifier "BOOST_CHECK"
argument_list
( "("
call_expression
field_expression
identifier "dupe1Matcher"
. "."
field_identifier "Prepare"
argument_list
( "("
) ")"
) ")"
; ";"
expression_statement (+23 nodes collapsed)
expression_statement (+23 nodes collapsed)
expression_statement (+23 nodes collapsed)
expression_statement (+26 nodes collapsed)
declaration
type_identifier "DupeMatcher"
init_declarator
identifier "dupe2Matcher"
argument_list
( "("
call_expression
field_expression
identifier "dupe2"
. "."
field_identifier "c_str"
argument_list
( "("
) ")"
, ","
identifier "expectedSize"
) ")"
; ";"
expression_statement
call_expression
identifier "BOOST_CHECK"
argument_list
( "("
call_expression
field_expression
identifier "dupe2Matcher"
. "."
field_identifier "Prepare"
argument_list
( "("
) ")"
) ")"
; ";"
expression_statement (+23 nodes collapsed)
expression_statement (+23 nodes collapsed)
expression_statement (+23 nodes collapsed)
expression_statement (+26 nodes collapsed)
declaration
type_identifier "DupeMatcher"
init_declarator
identifier "nonDupeMatcher"
argument_list
( "("
call_expression
field_expression
identifier "nondupe"
. "."
field_identifier "c_str"
argument_list
( "("
) ")"
, ","
identifier "expectedSize"
) ")"
; ";"
expression_statement
call_expression
identifier "BOOST_CHECK"
argument_list
( "("
binary_expression
call_expression
field_expression
identifier "nonDupeMatcher"
. "."
field_identifier "Prepare"
argument_list
( "("
) ")"
== "=="
false "false"
) ")"
; ";"
expression_statement (+26 nodes collapsed)
expression_statement (+26 nodes collapsed)
expression_statement (+26 nodes collapsed)
expression_statement (+26 nodes collapsed)
declaration
type_identifier "DupeMatcher"
init_declarator
identifier "rardupe1matcher"
argument_list
( "("
call_expression
field_expression
identifier "rardupe1"
. "."
field_identifier "c_str"
argument_list
( "("
) ")"
, ","
identifier "expectedSize"
) ")"
; ";"
expression_statement
call_expression
identifier "BOOST_CHECK"
argument_list
( "("
call_expression
field_expression
identifier "rardupe1matcher"
. "."
field_identifier "Prepare"
argument_list
( "("
) ")"
) ")"
; ";"
expression_statement (+23 nodes collapsed)
expression_statement (+23 nodes collapsed)
expression_statement (+23 nodes collapsed)
expression_statement (+26 nodes collapsed)
declaration
type_identifier "DupeMatcher"
init_declarator
identifier "rardupe2matcher"
argument_list
( "("
call_expression
field_expression
identifier "rardupe2"
. "."
field_identifier "c_str"
argument_list
( "("
) ")"
, ","
identifier "expectedSize"
) ")"
; ";"
expression_statement
call_expression
identifier "BOOST_CHECK"
argument_list
( "("
call_expression
field_expression
identifier "rardupe2matcher"
. "."
field_identifier "Prepare"
argument_list
( "("
) ")"
) ")"
; ";"
expression_statement (+23 nodes collapsed)
expression_statement (+23 nodes collapsed)
expression_statement (+23 nodes collapsed)
expression_statement (+26 nodes collapsed)
} "}"

After

translation_unit
comment "/*\n * This file is part of nzbget. See <https://nzbget.com>"...
preproc_include
#include "#include"
string_literal
" "\""
string_content "nzbget.h"
" "\""
preproc_include
#include "#include"
system_lib_string "<boost/test/unit_test.hpp>"
preproc_include
#include "#include"
string_literal
" "\""
string_content "FileSystem.h"
" "\""
preproc_include
#include "#include"
string_literal
" "\""
string_content "DupeMatcher.h"
" "\""
preproc_include
#include "#include"
string_literal
" "\""
string_content "TestUtil.h"
" "\""
function_definition
function_declarator
identifier "BOOST_AUTO_TEST_CASE"
parameter_list
( "("
parameter_declaration
type_identifier "DupeMatcherTest"
) ")"
compound_statement
{ "{"
declaration
type_qualifier
const "const"
qualified_identifier
namespace_identifier "std"
:: "::"
type_identifier "string"
init_declarator
identifier "testDataDir"
= "="
binary_expression
call_expression
qualified_identifier
namespace_identifier "TestUtil"
:: "::"
identifier "WorkingDir"
argument_list
( "("
) ")"
+ "+"
string_literal
" "\""
string_content "/rarrenamer"
" "\""
; ";"
declaration
type_qualifier
const "const"
qualified_identifier
namespace_identifier "std"
:: "::"
type_identifier "string"
init_declarator
identifier "workingDir"
= "="
binary_expression
identifier "testDataDir"
+ "+"
string_literal
" "\""
string_content "/DupeMatcher"
" "\""
; ";"
expression_statement
call_expression
qualified_identifier
namespace_identifier "FileSystem" any 4:1
:: "::"
identifier "CreateDirectory"
argument_list
( "("
call_expression
field_expression
identifier "workingDir"
. "."
field_identifier "c_str"
argument_list
( "("
) ")"
) ")"
; ";"
declaration
type_identifier "CString"
identifier "errmsg"
; ";"
comment "// prepare directories"
declaration
qualified_identifier
namespace_identifier "std"
:: "::"
type_identifier "string"
init_declarator
identifier "dupe1"
argument_list
( "("
binary_expression
identifier "workingDir"
+ "+"
string_literal
" "\""
string_content "/dupe1"
" "\""
) ")"
; ";"
expression_statement (+25 nodes collapsed)
expression_statement
call_expression
qualified_identifier
namespace_identifier "FileSystem" any 4:1
:: "::"
identifier "CopyFile"
argument_list
( "("
call_expression
field_expression
identifier "dupe1"
. "."
field_identifier "c_str"
argument_list
( "("
) ")"
, ","
call_expression
field_expression
parenthesized_expression
( "("
binary_expression
identifier "testDataDir"
+ "+"
string_literal
" "\""
string_content "/parchecker"
" "\""
) ")"
. "."
field_identifier "c_str"
argument_list
( "("
) ")"
) ")"
; ";"
declaration
qualified_identifier
namespace_identifier "std"
:: "::"
type_identifier "string"
init_declarator
identifier "dupe2"
argument_list
( "("
binary_expression
identifier "workingDir"
+ "+"
string_literal
" "\""
string_content "/dupe2"
" "\""
) ")"
; ";"
expression_statement (+25 nodes collapsed)
expression_statement
call_expression
qualified_identifier
namespace_identifier "FileSystem" any 4:1
:: "::"
identifier "CopyFile"
argument_list
( "("
call_expression
field_expression
identifier "dupe2"
. "."
field_identifier "c_str"
argument_list
( "("
) ")"
, ","
call_expression
field_expression
parenthesized_expression
( "("
binary_expression
identifier "testDataDir"
+ "+"
string_literal
" "\""
string_content "/parchecker"
" "\""
) ")"
. "."
field_identifier "c_str"
argument_list
( "("
) ")"
) ")"
; ";"
expression_statement (+27 nodes collapsed)
declaration
qualified_identifier
namespace_identifier "std"
:: "::"
type_identifier "string"
init_declarator
identifier "rardupe1"
argument_list
( "("
binary_expression
identifier "testDataDir"
+ "+"
string_literal
" "\""
string_content "/dupematcher1"
" "\""
) ")"
; ";"
declaration
qualified_identifier
namespace_identifier "std"
:: "::"
type_identifier "string"
init_declarator
identifier "rardupe2"
argument_list
( "("
binary_expression
identifier "testDataDir"
+ "+"
string_literal
" "\""
string_content "/dupematcher2"
" "\""
) ")"
; ";"
declaration
qualified_identifier
namespace_identifier "std"
:: "::"
type_identifier "string"
init_declarator
identifier "nondupe"
argument_list
( "("
binary_expression
identifier "workingDir"
+ "+"
string_literal
" "\""
string_content "/nondupe"
" "\""
) ")"
; ";"
expression_statement (+25 nodes collapsed)
expression_statement
call_expression
qualified_identifier
namespace_identifier "FileSystem" any 4:1
:: "::"
identifier "CopyFile"
argument_list
( "("
call_expression
field_expression
identifier "nondupe"
. "."
field_identifier "c_str"
argument_list
( "("
) ")"
, ","
call_expression
field_expression
parenthesized_expression
( "("
binary_expression
identifier "testDataDir"
+ "+"
string_literal
" "\""
string_content "/parchecker"
" "\""
) ")"
. "."
field_identifier "c_str"
argument_list
( "("
) ")"
) ")"
; ";"
expression_statement (+24 nodes collapsed)
comment "// now test"
declaration (+31 nodes collapsed)
expression_statement
call_expression
identifier "BOOST_TEST_MESSAGE"
argument_list
( "("
string_literal
" "\""
string_content "This test requires working unrar 5 in search path"
" "\""
) ")"
; ";"
declaration
type_identifier "DupeMatcher"
init_declarator
identifier "dupe1Matcher"
argument_list
( "("
call_expression
field_expression
identifier "dupe1"
. "."
field_identifier "c_str"
argument_list
( "("
) ")"
, ","
identifier "expectedSize"
) ")"
; ";"
expression_statement
call_expression
identifier "BOOST_CHECK"
argument_list
( "("
call_expression
field_expression
identifier "dupe1Matcher"
. "."
field_identifier "Prepare"
argument_list
( "("
) ")"
) ")"
; ";"
expression_statement (+23 nodes collapsed)
expression_statement (+23 nodes collapsed)
expression_statement (+23 nodes collapsed)
expression_statement (+26 nodes collapsed)
declaration
type_identifier "DupeMatcher"
init_declarator
identifier "dupe2Matcher"
argument_list
( "("
call_expression
field_expression
identifier "dupe2"
. "."
field_identifier "c_str"
argument_list
( "("
) ")"
, ","
identifier "expectedSize"
) ")"
; ";"
expression_statement
call_expression
identifier "BOOST_CHECK"
argument_list
( "("
call_expression
field_expression
identifier "dupe2Matcher"
. "."
field_identifier "Prepare"
argument_list
( "("
) ")"
) ")"
; ";"
expression_statement (+23 nodes collapsed)
expression_statement (+23 nodes collapsed)
expression_statement (+23 nodes collapsed)
expression_statement (+26 nodes collapsed)
declaration
type_identifier "DupeMatcher"
init_declarator
identifier "nonDupeMatcher"
argument_list
( "("
call_expression
field_expression
identifier "nondupe"
. "."
field_identifier "c_str"
argument_list
( "("
) ")"
, ","
identifier "expectedSize"
) ")"
; ";"
expression_statement
call_expression
identifier "BOOST_CHECK"
argument_list
( "("
binary_expression
call_expression
field_expression
identifier "nonDupeMatcher"
. "."
field_identifier "Prepare"
argument_list
( "("
) ")"
== "=="
false "false"
) ")"
; ";"
expression_statement (+26 nodes collapsed)
expression_statement (+26 nodes collapsed)
expression_statement (+26 nodes collapsed)
expression_statement (+26 nodes collapsed)
declaration
type_identifier "DupeMatcher"
init_declarator
identifier "rardupe1matcher"
argument_list
( "("
call_expression
field_expression
identifier "rardupe1"
. "."
field_identifier "c_str"
argument_list
( "("
) ")"
, ","
identifier "expectedSize"
) ")"
; ";"
expression_statement
call_expression
identifier "BOOST_CHECK"
argument_list
( "("
call_expression
field_expression
identifier "rardupe1matcher"
. "."
field_identifier "Prepare"
argument_list
( "("
) ")"
) ")"
; ";"
expression_statement (+23 nodes collapsed)
expression_statement (+23 nodes collapsed)
expression_statement (+23 nodes collapsed)
expression_statement (+26 nodes collapsed)
declaration
type_identifier "DupeMatcher"
init_declarator
identifier "rardupe2matcher"
argument_list
( "("
call_expression
field_expression
identifier "rardupe2"
. "."
field_identifier "c_str"
argument_list
( "("
) ")"
, ","
identifier "expectedSize"
) ")"
; ";"
expression_statement
call_expression
identifier "BOOST_CHECK"
argument_list
( "("
call_expression
field_expression
identifier "rardupe2matcher"
. "."
field_identifier "Prepare"
argument_list
( "("
) ")"
) ")"
; ";"
expression_statement (+23 nodes collapsed)
expression_statement (+23 nodes collapsed)
expression_statement (+23 nodes collapsed)
expression_statement (+26 nodes collapsed)
} "}"