Files
clice/unittests/Basic/SourceConverter.cpp
star9029 b0e59a2954 Support xmake (#37)
Co-authored-by: ykiko <ykikoykikoykiko@gmail.com>
2025-01-14 18:26:14 +08:00

92 lines
2.3 KiB
C++

#include "Basic/SourceConverter.h"
#include "Test/Test.h"
namespace clice {
namespace {
TEST(SourceConverter, Remeasure) {
using SC = SourceConverter;
SourceConverter utf8{proto::PositionEncodingKind::UTF8};
EXPECT_EQ(utf8.remeasure(""), 0);
EXPECT_EQ(utf8.remeasure("ascii"), 5);
SourceConverter utf16{proto::PositionEncodingKind::UTF16};
EXPECT_EQ(utf16.remeasure(""), 1);
EXPECT_EQ(utf16.remeasure("¥"), 1);
SourceConverter utf32{proto::PositionEncodingKind::UTF32};
EXPECT_EQ(utf8.remeasure("😂"), 4);
EXPECT_EQ(utf16.remeasure("😂"), 2);
EXPECT_EQ(utf32.remeasure("😂"), 1);
}
TEST(SourceConverter, Position) {
const char *main = "int a /*😂*/ = 1;$(eof)";
Tester txs("main.cpp", main);
txs.run("-std=c++11");
auto &src = txs.info.srcMgr();
auto &tks = txs.info.tokBuf();
auto mainid = src.getMainFileID();
auto tokens = tks.expandedTokens(
{src.getLocForStartOfFile(mainid), src.getLocForEndOfFile(mainid)});
auto eof = tokens.back().endLocation();
txs.expect("eof", eof);
{
SourceConverter cvtr{proto::PositionEncodingKind::UTF8};
auto pos = cvtr.toPosition(eof, src);
EXPECT_EQ(pos.line, 0);
EXPECT_EQ(pos.character, 19);
}
{
SourceConverter cvtr{proto::PositionEncodingKind::UTF16};
auto pos = cvtr.toPosition(eof, src);
EXPECT_EQ(pos.line, 0);
EXPECT_EQ(pos.character, 19);
}
{
SourceConverter cvtr{proto::PositionEncodingKind::UTF32};
auto pos = cvtr.toPosition(eof, src);
EXPECT_EQ(pos.line, 0);
EXPECT_EQ(pos.character, 19);
}
}
TEST(SourceConverter, UriAndFsPath) {
using SC = SourceConverter;
// It must be a existed file.
#if defined(__unix__)
llvm::StringRef paths[] = {"/dev/null"};
llvm::StringRef uris[] = {"file:///dev/null"};
#elif defined(_WIN32)
llvm::StringRef paths[] = {"C:\\Windows\\System32\\notepad.exe"};
llvm::StringRef uris[] = {"file:///C%3A/Windows/System32/notepad.exe"};
#else
#error "Unsupported platform"
#endif
EXPECT_EQ(std::size(paths), std::size(uris));
for (int i = 0; i < std::size(paths); ++i) {
llvm::outs() << ": " << SC::toURI(paths[i])<< "\n";
llvm::outs() << ": " << SC::toPath(uris[i])<< "\n";
EXPECT_EQ(SC::toURI(paths[i]), uris[i]);
EXPECT_EQ(paths[i], SC::toPath(uris[i]));
}
}
} // namespace
} // namespace clice