df8851f286
the rewriting sink was just broken. when given a rewrite set that contained a key that is also a proper infix of another key it was possible to produce an incorrectly rewritten result if the writer used the wrong block size. fixing this duplicates rewriteStrings, to avoid this we'll rewrite rewriteStrings to use RewritingSource in a new mode that'll allow rewrites we had previously forbidden. Change-Id: I57fa0a9a994e654e11d07172b8e31d15f0b7e8c0
43 lines
1.2 KiB
C++
43 lines
1.2 KiB
C++
#include "references.hh"
|
|
#include <gtest/gtest.h>
|
|
|
|
namespace nix {
|
|
|
|
using std::string;
|
|
|
|
struct RewriteParams {
|
|
string originalString, finalString;
|
|
StringMap rewrites;
|
|
|
|
friend std::ostream& operator<<(std::ostream& os, const RewriteParams& bar) {
|
|
StringSet strRewrites;
|
|
for (auto & [from, to] : bar.rewrites)
|
|
strRewrites.insert(from + "->" + to);
|
|
return os <<
|
|
"OriginalString: " << bar.originalString << std::endl <<
|
|
"Rewrites: " << concatStringsSep(",", strRewrites) << std::endl <<
|
|
"Expected result: " << bar.finalString;
|
|
}
|
|
};
|
|
|
|
class RewriteTest : public ::testing::TestWithParam<RewriteParams> {
|
|
};
|
|
|
|
TEST_P(RewriteTest, IdentityRewriteIsIdentity) {
|
|
RewriteParams param = GetParam();
|
|
StringSource src{param.originalString};
|
|
ASSERT_EQ(RewritingSource(param.rewrites, src).drain(), param.finalString);
|
|
}
|
|
|
|
INSTANTIATE_TEST_CASE_P(
|
|
references,
|
|
RewriteTest,
|
|
::testing::Values(
|
|
RewriteParams{ "foooo", "baroo", {{"foo", "bar"}, {"bar", "baz"}}},
|
|
RewriteParams{ "foooo", "bazoo", {{"fou", "bar"}, {"foo", "baz"}}},
|
|
RewriteParams{ "foooo", "foooo", {}},
|
|
RewriteParams{ "babb", "bbbb", {{"ab", "aa"}, {"babb", "bbbb"}}}
|
|
)
|
|
);
|
|
|
|
}
|