mirror of
https://github.com/KhronosGroup/SPIRV-Tools
synced 2024-11-22 11:40:05 +00:00
9beb54513c
* Reimplement LCS used by spirv-diff Two improvements are made to the LCS algorithm: - The LCS algorithm is reimplemented to use a std::stack instead of being recursive. This prevents stack overflow in the LCSTest.Large test. - The LCS algorithm uses an NxM table. Previously, entries of this table were {size_t, bool, bool}, which is now packed in 32 bits. The first entry can assume a maximum value of min(N, M), which realistically for SPIR-V diff will not be larger than 1 billion instructions. This reduces memory usage of LCS by 75%. This partially reverts845f3efb8a
and enables LCS tests. * Stabilize the output of spirv-diff std::map is used instead of std::unordered_map to ensure the output of spirv-diff is identical everywhere. This partially reverts845f3efb8a
and enables spirv-diff tests.
330 lines
13 KiB
C++
330 lines
13 KiB
C++
// Copyright (c) 2022 Google LLC.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
#include "source/diff/lcs.h"
|
|
|
|
#include <string>
|
|
|
|
#include "gtest/gtest.h"
|
|
|
|
namespace spvtools {
|
|
namespace diff {
|
|
namespace {
|
|
|
|
using Sequence = std::vector<int>;
|
|
using LCS = LongestCommonSubsequence<Sequence>;
|
|
|
|
void VerifyMatch(const Sequence& src, const Sequence& dst,
|
|
size_t expected_match_count) {
|
|
DiffMatch src_match, dst_match;
|
|
|
|
LCS lcs(src, dst);
|
|
size_t match_count =
|
|
lcs.Get<int>([](int s, int d) { return s == d; }, &src_match, &dst_match);
|
|
|
|
EXPECT_EQ(match_count, expected_match_count);
|
|
|
|
size_t src_cur = 0;
|
|
size_t dst_cur = 0;
|
|
size_t matches_seen = 0;
|
|
|
|
while (src_cur < src.size() && dst_cur < dst.size()) {
|
|
if (src_match[src_cur] && dst_match[dst_cur]) {
|
|
EXPECT_EQ(src[src_cur], dst[dst_cur])
|
|
<< "Src: " << src_cur << " Dst: " << dst_cur;
|
|
++src_cur;
|
|
++dst_cur;
|
|
++matches_seen;
|
|
continue;
|
|
}
|
|
if (!src_match[src_cur]) {
|
|
++src_cur;
|
|
}
|
|
if (!dst_match[dst_cur]) {
|
|
++dst_cur;
|
|
}
|
|
}
|
|
|
|
EXPECT_EQ(matches_seen, expected_match_count);
|
|
}
|
|
|
|
TEST(LCSTest, EmptySequences) {
|
|
Sequence src, dst;
|
|
|
|
DiffMatch src_match, dst_match;
|
|
|
|
LCS lcs(src, dst);
|
|
size_t match_count =
|
|
lcs.Get<int>([](int s, int d) { return s == d; }, &src_match, &dst_match);
|
|
|
|
EXPECT_EQ(match_count, 0u);
|
|
EXPECT_TRUE(src_match.empty());
|
|
EXPECT_TRUE(dst_match.empty());
|
|
}
|
|
|
|
TEST(LCSTest, EmptySrc) {
|
|
Sequence src, dst = {1, 2, 3};
|
|
|
|
DiffMatch src_match, dst_match;
|
|
|
|
LCS lcs(src, dst);
|
|
size_t match_count =
|
|
lcs.Get<int>([](int s, int d) { return s == d; }, &src_match, &dst_match);
|
|
|
|
EXPECT_EQ(match_count, 0u);
|
|
EXPECT_TRUE(src_match.empty());
|
|
EXPECT_EQ(dst_match, DiffMatch(3, false));
|
|
}
|
|
|
|
TEST(LCSTest, EmptyDst) {
|
|
Sequence src = {1, 2, 3}, dst;
|
|
|
|
DiffMatch src_match, dst_match;
|
|
|
|
LCS lcs(src, dst);
|
|
size_t match_count =
|
|
lcs.Get<int>([](int s, int d) { return s == d; }, &src_match, &dst_match);
|
|
|
|
EXPECT_EQ(match_count, 0u);
|
|
EXPECT_EQ(src_match, DiffMatch(3, false));
|
|
EXPECT_TRUE(dst_match.empty());
|
|
}
|
|
|
|
TEST(LCSTest, Identical) {
|
|
Sequence src = {1, 2, 3, 4, 5, 6}, dst = {1, 2, 3, 4, 5, 6};
|
|
|
|
DiffMatch src_match, dst_match;
|
|
|
|
LCS lcs(src, dst);
|
|
size_t match_count =
|
|
lcs.Get<int>([](int s, int d) { return s == d; }, &src_match, &dst_match);
|
|
|
|
EXPECT_EQ(match_count, 6u);
|
|
EXPECT_EQ(src_match, DiffMatch(6, true));
|
|
EXPECT_EQ(dst_match, DiffMatch(6, true));
|
|
}
|
|
|
|
TEST(LCSTest, SrcPrefix) {
|
|
Sequence src = {1, 2, 3, 4}, dst = {1, 2, 3, 4, 5, 6};
|
|
|
|
DiffMatch src_match, dst_match;
|
|
|
|
LCS lcs(src, dst);
|
|
size_t match_count =
|
|
lcs.Get<int>([](int s, int d) { return s == d; }, &src_match, &dst_match);
|
|
|
|
const DiffMatch src_expect = {true, true, true, true};
|
|
const DiffMatch dst_expect = {true, true, true, true, false, false};
|
|
|
|
EXPECT_EQ(match_count, 4u);
|
|
EXPECT_EQ(src_match, src_expect);
|
|
EXPECT_EQ(dst_match, dst_expect);
|
|
}
|
|
|
|
TEST(LCSTest, DstPrefix) {
|
|
Sequence src = {1, 2, 3, 4, 5, 6}, dst = {1, 2, 3, 4, 5};
|
|
|
|
DiffMatch src_match, dst_match;
|
|
|
|
LCS lcs(src, dst);
|
|
size_t match_count =
|
|
lcs.Get<int>([](int s, int d) { return s == d; }, &src_match, &dst_match);
|
|
|
|
const DiffMatch src_expect = {true, true, true, true, true, false};
|
|
const DiffMatch dst_expect = {true, true, true, true, true};
|
|
|
|
EXPECT_EQ(match_count, 5u);
|
|
EXPECT_EQ(src_match, src_expect);
|
|
EXPECT_EQ(dst_match, dst_expect);
|
|
}
|
|
|
|
TEST(LCSTest, SrcSuffix) {
|
|
Sequence src = {3, 4, 5, 6}, dst = {1, 2, 3, 4, 5, 6};
|
|
|
|
DiffMatch src_match, dst_match;
|
|
|
|
LCS lcs(src, dst);
|
|
size_t match_count =
|
|
lcs.Get<int>([](int s, int d) { return s == d; }, &src_match, &dst_match);
|
|
|
|
const DiffMatch src_expect = {true, true, true, true};
|
|
const DiffMatch dst_expect = {false, false, true, true, true, true};
|
|
|
|
EXPECT_EQ(match_count, 4u);
|
|
EXPECT_EQ(src_match, src_expect);
|
|
EXPECT_EQ(dst_match, dst_expect);
|
|
}
|
|
|
|
TEST(LCSTest, DstSuffix) {
|
|
Sequence src = {1, 2, 3, 4, 5, 6}, dst = {5, 6};
|
|
|
|
DiffMatch src_match, dst_match;
|
|
|
|
LCS lcs(src, dst);
|
|
size_t match_count =
|
|
lcs.Get<int>([](int s, int d) { return s == d; }, &src_match, &dst_match);
|
|
|
|
const DiffMatch src_expect = {false, false, false, false, true, true};
|
|
const DiffMatch dst_expect = {true, true};
|
|
|
|
EXPECT_EQ(match_count, 2u);
|
|
EXPECT_EQ(src_match, src_expect);
|
|
EXPECT_EQ(dst_match, dst_expect);
|
|
}
|
|
|
|
TEST(LCSTest, None) {
|
|
Sequence src = {1, 3, 5, 7, 9}, dst = {2, 4, 6, 8, 10, 12};
|
|
|
|
DiffMatch src_match, dst_match;
|
|
|
|
LCS lcs(src, dst);
|
|
size_t match_count =
|
|
lcs.Get<int>([](int s, int d) { return s == d; }, &src_match, &dst_match);
|
|
|
|
EXPECT_EQ(match_count, 0u);
|
|
EXPECT_EQ(src_match, DiffMatch(5, false));
|
|
EXPECT_EQ(dst_match, DiffMatch(6, false));
|
|
}
|
|
|
|
TEST(LCSTest, NonContiguous) {
|
|
Sequence src = {1, 2, 3, 4, 5, 6, 10}, dst = {2, 4, 5, 8, 9, 10, 12};
|
|
|
|
DiffMatch src_match, dst_match;
|
|
|
|
LCS lcs(src, dst);
|
|
size_t match_count =
|
|
lcs.Get<int>([](int s, int d) { return s == d; }, &src_match, &dst_match);
|
|
|
|
const DiffMatch src_expect = {false, true, false, true, true, false, true};
|
|
const DiffMatch dst_expect = {true, true, true, false, false, true, false};
|
|
|
|
EXPECT_EQ(match_count, 4u);
|
|
EXPECT_EQ(src_match, src_expect);
|
|
EXPECT_EQ(dst_match, dst_expect);
|
|
}
|
|
|
|
TEST(LCSTest, WithDuplicates) {
|
|
Sequence src = {1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4},
|
|
dst = {1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4};
|
|
VerifyMatch(src, dst, 6);
|
|
}
|
|
|
|
TEST(LCSTest, Large) {
|
|
const std::string src_str =
|
|
"GUJwrJSlkKJXxCVIAxlVgnUyOrdyRyFtlZwWMmFhYGfkFTNnhiBmClgHyrcXMVwfrRxNUfQk"
|
|
"qaoGvCbPZHAzXsaZpXHPfJxOMCUtRDmIQpfiXKbHQbhTfPqhxBDWvmTQAqwsWTLajZYtMUnf"
|
|
"hNNCfkuAXkZsaebwEbIZOxTDZsqSMUfCMoGeKJGVSNFgLTiBMbdvchHGfFRkHKcYCDjBfIcj"
|
|
"todPnvDjzQYWBcvIfVvyBzHikrwpDORaGEZLhmyztIFCLJOqeLhOzERYmVqzlsoUzruTXTXq"
|
|
"DLTxQRakOCMRrgRzCDTXfwwfDcKMBVnxRZemjcwcEsOVxwtwdBCWJycsDcZKlvrCvZaenKlv"
|
|
"vyByDQeLdxAyBnPkIMQlMQwqjUfRLybeoaOanlbFkpTPPZdHelQrIvucTHzMpWWQTbuANwvN"
|
|
"OVhCGGoIcGNDpfIsaBexlMMdHsxMGerTngmjpdPeQQJHfvKZkdYqAzrtDohqtDsaFMxQViVQ"
|
|
"YszDVgyoSHZdOXAvXkJidojLvGZOzhRajVPhWDwKuGqdaympELxHsrXAJYufdCPwJdGJfWqq"
|
|
"yvTWpcrFHOIuCEmNLnSCDsxQGRVDwyCykBJazhApfCnrOadnafvqfVuFqEXMSrYbHTfTnzbz"
|
|
"MhISyOtMUITaurCXvanCbuOXBhHyCjOhVbxnMvhlPmZBMQgEHCghtAJVMXGPNRtszVZlPxVl"
|
|
"QIPTBnPUPejlyZGPqeICyNngdQGkvKbIoWlTLBtVhMdBeUMozNlKQTIPYBeImVcMdLafuxUf"
|
|
"TIXysmcTrUTcspOSKBxhdhLwiRnREGFWJTfUKsgGOAQeYojXdrqsGjMJfiKalyoiqrgLnlij"
|
|
"CtOapoxDGVOOBalNYGzCtBlxbvaAzxipGnJpOEbmXcpeoIsAdxspKBzBDgoPVxnuRBUwmTSr"
|
|
"CRpWhxikgUYQVCwalLUIeBPRyhhsECGCXJmGDZSCIUaBwROkigzdeVPOXhgCGBEprWtNdYfL"
|
|
"tOUYJHQXxiIJgSGmWntezJFpNQoTPbRRYAGhtYvAechvBcYWocLkYFxsDAuszvQNLXdhmAHw"
|
|
"DErcjbtCdQllnKcDADVNWVezljjLrAuyGHetINMgAvJZwOEYakihYVUbZGCsHEufluLNyNHy"
|
|
"gqtSTSFFjBHiIqQejTPWybLdpWNwZrWvIWnlzUcGNQPEYHVPCbteWknjAnWrdTBeCbHUDBoK"
|
|
"aHvDStmpNRGIjvlumiZTbdZNAzUeSFnFChCsSExwXeEfDJfjyOoSBofHzJqJErvHLNyUJTjX"
|
|
"qmtgKPpMKohUPBMhtCteQFcNEpWrUVGbibMOpvBwdiWYXNissArpSasVJFgDzrqTyGkerTMX"
|
|
"gcrzFUGFZRhNdekaJeKYPogsofJaRsUQmIRyYdkrxKeMgLPpwOfSKJOqzXDoeHljTzhOwEVy"
|
|
"krOEnACFrWhufajsMitjOWdLOHHchQDddGPzxknEgdwmZepKDvRZGCuPqzeQkjOPqUBKpKLJ"
|
|
"eKieSsRXkaqxSPGajfvPKmwFWdLByEcLgvrmteazgFjmMGrLYqRRxzUOfOCokenqHVYstBHf"
|
|
"AwsWsqPTvqsRJUfGGTaYiylZMGbQqTzINhFHvdlRQvvYKBcuAHdBeKlHSxVrSsEKbcAvnIcf"
|
|
"xzdVDdwQPHMCHeZZRpGHWvKzgTGzSTbYTeOPyKvvYWmQToTpsjAtKUJUjcEHWhmdBLDTBMHJ"
|
|
"ivBXcLGtCsumNNVFyGbVviGmqHTdyBlkneibXBesKJGOUzOtIwXCPJggqBekSzNQYkALlItk"
|
|
"cbEhbdXAIKVHYpInLwxXalKZrkrpxtfuagqMGmRJnJbFQaEoYMoqPsxZpocddPXXPyvxVkaF"
|
|
"qdKISejWDhBImnEEOPDcyWTubbfVfwUztciaFJcsPLhgYVfhqlOfoNjKbmTFptFttYuyBrUI"
|
|
"zzmZypOqrjQHTGFwlHStpIwxPtMvtsEDpsmWIgwzYgwmdpbMOnfElZMYpVIcvzSWejeJcdUB"
|
|
"QUoBRUmGQVVWvEDseuozrDjgdXFScPwwsgaUPwSzScfBNrkpmEFDSZLKfNjMqvOmUtocUkbo"
|
|
"VGFEKgGLbNruwLgXHTloWDrnqymPVAtzjWPutonIsMDPeeCmTjYWAFXcyTAlBeiJTIRkZxiM"
|
|
"kLjMnAflSNJzmZkatXkYiPEMYSmzHbLKEizHbEjQOxBDzpRHiFjhedqiyMiUMvThjaRFmwll"
|
|
"aMGgwKBIKepwyoEdnuhtzJzboiNEAFKiqiWxxmkRFRoTiFWXLPAWLuzSCrajgkQhDxAQDqyM"
|
|
"VwZlhZicQLEDYYisEalesDWZAYzcvENuHUwRutIsGgsdoYwOZiURhcgdbTGWBNqhrFjvTQCj"
|
|
"VlTPNlRdRLaaqzUBBwbdtyXFkCBUYYMbmRrkFxfxbCqkgZNGyHPKLkOPnezfVTRmRQgCgHbx"
|
|
"wcZlInVOwmFePnSIbThMJosimzkhfuiqYEpwHQiemqsSDNNdbNhBLzbsPZBJZujSHJGtYKGb"
|
|
"HaAYGJZxBumsKUrATwPuqXFLfwNyImLQbchBKiJAYRZhkcrKCHXBEGYyBhBGvSqvabcRUrfq"
|
|
"AbPiMzjHAehGYjDEmxAnYLyoSFdeWVrfJUCuYZPluhXEBuyUpKaRXDKXeiCvGidpvATwMbcz"
|
|
"DZpzxrhTZYyrFORFQWTbPLCBjMKMhlRMFEiarDgGPttjmkrQVlujztMSkxXffXFNqLWOLThI"
|
|
"KBoyMHoFTEPCdUAZjLTifAdjjUehyDLEGKlRTFoLpjalziRSUjZfRYbNzhiHgTHowMMkKTwE"
|
|
"ZgnqiirMtnNpaBJqhcIVrWXPpcPWZfRpsPstHleFJDZYAsxYhOREVbFtebXTZRAIjGgWeoiN"
|
|
"qPLCCAVadqmUrjOcqIbdCTpcDRWuDVbHrZOQRPhqbyvOWwxAWJphjLiDgoAybcjzgfVktPlj"
|
|
"kNBCjelpuQfnYsiTgPpCNKYtOrxGaLEEtAuLdGdDsONHNhSn";
|
|
const std::string dst_str =
|
|
"KzitfifORCbGhfNEbnbObUdFLLaAsLOpMkOeKupjCoatzqfHBkNJfSgqSMYouswfNMnoQngK"
|
|
"jWwyPKmEnoZWyPBUdQRmKUNudUclueKXKQefUdXWUyyqtumzsFKznrLVLwfvPZpLChNYrrHK"
|
|
"AtpfOuVHiUKyeRCrktJAhkyFKmPWrASEMvBLNOzuGlvinZjvZUUXazNEkyMPiOLdqXvCIroC"
|
|
"MeWsvjHShlLhDwLZrVlpYBnDJmILcsNFDSoaLWOKNNkNGBgNBvVjPCJXAuKfsrKZhYcdEpxK"
|
|
"UihiRkYvMiLyOUvaqBMklLDwEhvQBfCXHSRoqsLsSCzLZQhIYMhBapvHaPbDoRrHoJXZsNXc"
|
|
"rxZYCrOMIzYcVPwDCFiHBFnPNTTeAeKEMGeVUeCaAeuWZmngyPWlQBcgWumSUIfbhjVYdnpV"
|
|
"hRSJXrIoFZubBXfNOMhilAkVPixrhILZKgDoFTvytPFPfBLMnbhSOBmLWCbJsLQxrCrMAlOw"
|
|
"RmfSQyGhrjhzYVqFSBHeoQBagFwyxIjcHFZngntpVHbSwqhwHeMnWSsISPljTxSNXfCxLebW"
|
|
"GhMdlphtJbdvhEcjNpwPCFqhdquxCyOxkjsDUPNgjpDcpIMhMwMclNhfESTrroJaoyeGQclV"
|
|
"gonnhuQRmXcBwcsWeLqjNngZOlyMyfeQBwnwMVJEvGqknDyzSApniRTPgJpFoDkJJhXQFuFB"
|
|
"VqhuEPMRGCeTDOSEFmXeIHOnDxaJacvnmORwVpmrRhGjDpUCkuODNPdZMdupYExDEDnDLdNF"
|
|
"iObKBaVWpGVMKdgNLgsNxcpypBPPKKoaajeSGPZQJWSOKrkLjiFexYVmUGxJnbTNsCXXLfZp"
|
|
"jfxQAEVYvqKehBzMsVHVGWmTshWFAoCNDkNppzzjHBZWckrzSTANICioCJSpLwPwQvtXVxst"
|
|
"nTRBAboPFREEUFazibpFesCsjzUOnECwoPCOFiwGORlIZVLpUkJyhYXCENmzTBLVigOFuCWO"
|
|
"IiXBYmiMtsxnUdoqSTTGyEFFrQsNAjcDdOKDtHwlANWoUVwiJCMCQFILdGqzEePuSXFbOEOz"
|
|
"dLlEnTJbKRSTfAFToOZNtDXTfFgvQiefAKbSUWUXFcpCjRYCBNXCCcLMjjuUDXErpiNsRuIx"
|
|
"mgHsrObTEXcnmjdqxTGhTjTeYizNnkrJRhNQIqDXmZMwArBccnixpcuiGOOexjgkpcEyGAnz"
|
|
"UbgiBfflTUyJfZeFFLrZVueFkSRosebnnwAnakIrywTGByhQKWvmNQJsWQezqLhHQzXnEpeD"
|
|
"rFRTSQSpVxPzSeEzfWYzfpcenxsUyzOMLxhNEhfcuprDtqubsXehuqKqZlLQeSclvoGjuKJK"
|
|
"XoWrazsgjXXnkWHdqFESZdMGDYldyYdbpSZcgBPgEKLWZHfBirNPLUadmajYkiEzmGuWGELB"
|
|
"WLiSrMdaGSbptKmgYVqMGcQaaATStiZYteGAPxSEBHuAzzjlRHYsrdDkaGNXmzRGoalJMiCC"
|
|
"GMtWSDMhgvRSEgKnywbRgnqWXFlwrhXbbvcgLGtWSuKQBiqIlWkfPMozOTWgVoLHavDJGRYI"
|
|
"YerrmZnTMtuuxmZALWakfzUbksTwoetqkOiRPGqGZepcVXHoZyOaaaijjZWQLlIhYwiQNbfc"
|
|
"KCwhhFaMQBoaCnOecJEdKzdsMPFEYQuJNPYiiNtsYxaWBRuWjlLqGokHMNtyTQfSJKbgGdol"
|
|
"fWlOZdupouQMfUWXIYHzyJHefMDnqxxasDxtgArvDqtwjDBaVEMACPkLFpiDOoKCHqkWVizh"
|
|
"lKqbOHpsPKkhjRQRNGYRYEfxtBjYvlCvHBNUwVuIwDJYMqHxEFtwdLqYWvjdOfQmNiviDfUq"
|
|
"pbucbNwjNQfMYgwUuPnQWIPOlqHcbjtuDXvTzLtkdBQanJbrmLSyFqSapZCSPMDOrxWVYzyO"
|
|
"lwDTTJFmKxoyfPunadkHcrcSQaQsAbrQtbhqwSTXGTPURYTCbNozjAVwbmcyVxIbZudBZWYm"
|
|
"rnSDyelGCRRWYtrUxvOVWlTLHHdYuAmVMGnGbHscbjmjmAzmYLaCxNNwhmMYdExKvySxuYpE"
|
|
"rVGwfqMngBCHnZodotNaNJZiNRFWubuPDfiywXPiyVWoQMeOlSuWmpilLTIFOvfpjmJTgrWa"
|
|
"dgoxYeyPyOaglOvZVGdFOBSeqEcGXBwjoeUAXqkpvOxEpSXhmklKZydTvRVYVvfQdRNNDkCT"
|
|
"dLNfcZCFQbZORdcDOhwotoyccrSbWvlqYMoiAYeEpDzZTvkamapzZMmCpEutZFCcHBWGIIkr"
|
|
"urwDNHrobaErPpclyEegLJDtkfUWSNWZosWSbBGAHIvJsFNUlJXbnkSVycLkOVQVcNcUtiBy"
|
|
"djLDIFsycbPBEWaMvCbntNtJlOeCttvXypGnHAQFnFSiXFWWqonWuVIKmVPpKXuJtFguXCWC"
|
|
"rNExYYvxLGEmuZJLJDjHgjlQyOzeieCpizJxkrdqKCgomyEkvsyVYSsLeyLvOZQrrgEJgRFK"
|
|
"CjYtoOfluNrLdRMTRkQXmAiMRFwloYECpXCReAMxOkNiwCtutsrqWoMHsrogRqPoUCueonvW"
|
|
"MTwmkAkajfGJkhnQidwpwIMEttQkzIMOPvvyWZHpqkMHWlNTeSKibfRfwDyxveKENZhtlPwP"
|
|
"dfAjwegjRcavtFnkkTNVYdCdCrgdUvzsIcqmUjwGmVvuuQvjVrWWIDBmAzQtiZPYvCOEWjce"
|
|
"rWzeqVKeiYTJBOedmQCVidOgUIEjfRnbGvUbctYxfRybJkdmeAkLZQMRMGPOnsPbFswXAoCK"
|
|
"IxWGwohoPpEJxslbqHFKSwknxTmrDCITRZWEDkGQeucPxHBdYkduwbYhKnoxCKhgjBFiFawC"
|
|
"QtgTDldTQmlOsBiGLquMjuecAbrUJJvNtXbFNGjWxaZPimSRXUJWgRbydpsczOqSFIeEtuKA"
|
|
"ZpRhmLtPdVNKdSDQZeeImUFmUwXApRTUNHItyvFyJtNtn";
|
|
|
|
Sequence src;
|
|
Sequence dst;
|
|
|
|
src.reserve(src_str.length());
|
|
dst.reserve(dst_str.length());
|
|
|
|
for (char c : src_str) {
|
|
src.push_back(c);
|
|
}
|
|
for (char c : dst_str) {
|
|
dst.push_back(c);
|
|
}
|
|
|
|
VerifyMatch(src, dst, 723);
|
|
}
|
|
|
|
} // namespace
|
|
} // namespace diff
|
|
} // namespace spvtools
|