jiuyiUniapp/service/node_modules/react-native/ReactCommon/jsinspector-modern/tests/Utf8.cpp

59 lines
2.3 KiB
C++

/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
#include <jsinspector-modern/Utf8.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
using namespace ::testing;
namespace facebook::react::jsinspector_modern {
TEST(Utf8Test, TruncateToValidUtf8) {
auto buffer = std::vector<char>();
std::vector<std::pair<std::string, size_t>> expectedStringsUpToSizes;
// Construct a buffer with a concatenation of all code points, and a vector
// or "expectedStringsUpToSizes", pairs of valid UTF8 prefix strings and sizes
// "n" such that the string would be the expected truncation of the first "n"
// bytes of the buffer.
for (const std::string& codePoint : {
"a", // 1 byte
"é", // 2 bytes
"", // 3 bytes
"😀" // 4 bytes
}) {
auto partial = std::string(buffer.data(), buffer.size());
buffer.insert(buffer.end(), codePoint.begin(), codePoint.end());
expectedStringsUpToSizes.push_back(std::pair(partial, buffer.size()));
}
// The constructed buffer is 10 bytes long, comprised of 4 code points of
// varied size. Range over naive slices of length 0-9 ensuring that the
// truncated result matches the valid UTF8 substring of length <= n.
size_t n = 0;
for (const auto& expectedStringUpToSize : expectedStringsUpToSizes) {
auto nextSize = expectedStringUpToSize.second;
auto expectedString = expectedStringUpToSize.first;
for (; n < nextSize; ++n) {
// Take the first n bytes of the whole buffer, which may be slicing
// through the middle of a code point.
std::vector<char> slice(buffer.begin(), buffer.begin() + n);
truncateToValidUTF8(slice);
// Expect the final code point fragment has been discarded and that the
// contents are equal to expectedString, which is valid UTF8.
EXPECT_EQ(std::string(slice.begin(), slice.end()), expectedString);
}
}
// Finally verify that truncating the whole buffer, which is already valid
// UTF8, is a no-op.
auto wholeString = std::string(buffer.begin(), buffer.end());
truncateToValidUTF8(buffer);
EXPECT_EQ(std::string(buffer.begin(), buffer.end()), wholeString);
}
} // namespace facebook::react::jsinspector_modern