blob: 57276affe61f1f6faeef200f032ec09e2227d433 [file] [log] [blame]
Sam McCallb536a2a2017-12-19 12:23:48 +00001//===-- SourceCodeTests.cpp ------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9#include "SourceCode.h"
Simon Marchi766338a2018-03-21 14:36:46 +000010#include "llvm/Support/Error.h"
Sam McCallb536a2a2017-12-19 12:23:48 +000011#include "llvm/Support/raw_os_ostream.h"
Simon Marchi766338a2018-03-21 14:36:46 +000012#include "llvm/Testing/Support/Error.h"
Sam McCallb536a2a2017-12-19 12:23:48 +000013#include "gmock/gmock.h"
14#include "gtest/gtest.h"
15
16namespace clang{
17namespace clangd {
Sam McCallb536a2a2017-12-19 12:23:48 +000018namespace {
19
Simon Marchi766338a2018-03-21 14:36:46 +000020using llvm::Failed;
21using llvm::HasValue;
22
Sam McCallb536a2a2017-12-19 12:23:48 +000023MATCHER_P2(Pos, Line, Col, "") {
24 return arg.line == Line && arg.character == Col;
25}
26
Sam McCalla4962cc2018-04-27 11:59:28 +000027// The = → 🡆 below are ASCII (1 byte), BMP (3 bytes), and astral (4 bytes).
Sam McCallb536a2a2017-12-19 12:23:48 +000028const char File[] = R"(0:0 = 0
Sam McCalla4962cc2018-04-27 11:59:28 +0000291:0 8
302:0 🡆 18)";
Sam McCallb536a2a2017-12-19 12:23:48 +000031
Ilya Biryukov7beea3a2018-02-14 10:52:04 +000032/// A helper to make tests easier to read.
33Position position(int line, int character) {
34 Position Pos;
35 Pos.line = line;
36 Pos.character = character;
37 return Pos;
38}
39
Sam McCallb536a2a2017-12-19 12:23:48 +000040TEST(SourceCodeTests, PositionToOffset) {
41 // line out of bounds
Simon Marchi766338a2018-03-21 14:36:46 +000042 EXPECT_THAT_EXPECTED(positionToOffset(File, position(-1, 2)), Failed());
Sam McCallb536a2a2017-12-19 12:23:48 +000043 // first line
Simon Marchi766338a2018-03-21 14:36:46 +000044 EXPECT_THAT_EXPECTED(positionToOffset(File, position(0, -1)),
45 Failed()); // out of range
46 EXPECT_THAT_EXPECTED(positionToOffset(File, position(0, 0)),
47 HasValue(0)); // first character
48 EXPECT_THAT_EXPECTED(positionToOffset(File, position(0, 3)),
49 HasValue(3)); // middle character
50 EXPECT_THAT_EXPECTED(positionToOffset(File, position(0, 6)),
51 HasValue(6)); // last character
52 EXPECT_THAT_EXPECTED(positionToOffset(File, position(0, 7)),
53 HasValue(7)); // the newline itself
54 EXPECT_THAT_EXPECTED(positionToOffset(File, position(0, 7), false),
55 HasValue(7));
56 EXPECT_THAT_EXPECTED(positionToOffset(File, position(0, 8)),
57 HasValue(7)); // out of range
58 EXPECT_THAT_EXPECTED(positionToOffset(File, position(0, 8), false),
59 Failed()); // out of range
Sam McCallb536a2a2017-12-19 12:23:48 +000060 // middle line
Simon Marchi766338a2018-03-21 14:36:46 +000061 EXPECT_THAT_EXPECTED(positionToOffset(File, position(1, -1)),
62 Failed()); // out of range
63 EXPECT_THAT_EXPECTED(positionToOffset(File, position(1, 0)),
64 HasValue(8)); // first character
65 EXPECT_THAT_EXPECTED(positionToOffset(File, position(1, 3)),
66 HasValue(11)); // middle character
67 EXPECT_THAT_EXPECTED(positionToOffset(File, position(1, 3), false),
68 HasValue(11));
69 EXPECT_THAT_EXPECTED(positionToOffset(File, position(1, 6)),
Sam McCalla4962cc2018-04-27 11:59:28 +000070 HasValue(16)); // last character
Simon Marchi766338a2018-03-21 14:36:46 +000071 EXPECT_THAT_EXPECTED(positionToOffset(File, position(1, 7)),
Sam McCalla4962cc2018-04-27 11:59:28 +000072 HasValue(17)); // the newline itself
Simon Marchi766338a2018-03-21 14:36:46 +000073 EXPECT_THAT_EXPECTED(positionToOffset(File, position(1, 8)),
Sam McCalla4962cc2018-04-27 11:59:28 +000074 HasValue(17)); // out of range
Simon Marchi766338a2018-03-21 14:36:46 +000075 EXPECT_THAT_EXPECTED(positionToOffset(File, position(1, 8), false),
76 Failed()); // out of range
Sam McCallb536a2a2017-12-19 12:23:48 +000077 // last line
Simon Marchi766338a2018-03-21 14:36:46 +000078 EXPECT_THAT_EXPECTED(positionToOffset(File, position(2, -1)),
79 Failed()); // out of range
80 EXPECT_THAT_EXPECTED(positionToOffset(File, position(2, 0)),
Sam McCalla4962cc2018-04-27 11:59:28 +000081 HasValue(18)); // first character
Simon Marchi766338a2018-03-21 14:36:46 +000082 EXPECT_THAT_EXPECTED(positionToOffset(File, position(2, 3)),
Sam McCalla4962cc2018-04-27 11:59:28 +000083 HasValue(21)); // middle character
84 EXPECT_THAT_EXPECTED(positionToOffset(File, position(2, 5), false),
85 Failed()); // middle of surrogate pair
86 EXPECT_THAT_EXPECTED(positionToOffset(File, position(2, 5)),
87 HasValue(26)); // middle of surrogate pair
88 EXPECT_THAT_EXPECTED(positionToOffset(File, position(2, 6), false),
89 HasValue(26)); // end of surrogate pair
Simon Marchi766338a2018-03-21 14:36:46 +000090 EXPECT_THAT_EXPECTED(positionToOffset(File, position(2, 8)),
Sam McCalla4962cc2018-04-27 11:59:28 +000091 HasValue(28)); // last character
92 EXPECT_THAT_EXPECTED(positionToOffset(File, position(2, 9)),
93 HasValue(29)); // EOF
94 EXPECT_THAT_EXPECTED(positionToOffset(File, position(2, 10), false),
Simon Marchi766338a2018-03-21 14:36:46 +000095 Failed()); // out of range
Sam McCallb536a2a2017-12-19 12:23:48 +000096 // line out of bounds
Simon Marchi766338a2018-03-21 14:36:46 +000097 EXPECT_THAT_EXPECTED(positionToOffset(File, position(3, 0)), Failed());
98 EXPECT_THAT_EXPECTED(positionToOffset(File, position(3, 1)), Failed());
Sam McCallb536a2a2017-12-19 12:23:48 +000099}
100
101TEST(SourceCodeTests, OffsetToPosition) {
102 EXPECT_THAT(offsetToPosition(File, 0), Pos(0, 0)) << "start of file";
103 EXPECT_THAT(offsetToPosition(File, 3), Pos(0, 3)) << "in first line";
104 EXPECT_THAT(offsetToPosition(File, 6), Pos(0, 6)) << "end of first line";
105 EXPECT_THAT(offsetToPosition(File, 7), Pos(0, 7)) << "first newline";
106 EXPECT_THAT(offsetToPosition(File, 8), Pos(1, 0)) << "start of second line";
Sam McCalla4962cc2018-04-27 11:59:28 +0000107 EXPECT_THAT(offsetToPosition(File, 12), Pos(1, 4)) << "before BMP char";
108 EXPECT_THAT(offsetToPosition(File, 13), Pos(1, 5)) << "in BMP char";
109 EXPECT_THAT(offsetToPosition(File, 15), Pos(1, 5)) << "after BMP char";
110 EXPECT_THAT(offsetToPosition(File, 16), Pos(1, 6)) << "end of second line";
111 EXPECT_THAT(offsetToPosition(File, 17), Pos(1, 7)) << "second newline";
112 EXPECT_THAT(offsetToPosition(File, 18), Pos(2, 0)) << "start of last line";
113 EXPECT_THAT(offsetToPosition(File, 21), Pos(2, 3)) << "in last line";
114 EXPECT_THAT(offsetToPosition(File, 22), Pos(2, 4)) << "before astral char";
115 EXPECT_THAT(offsetToPosition(File, 24), Pos(2, 6)) << "in astral char";
116 EXPECT_THAT(offsetToPosition(File, 26), Pos(2, 6)) << "after astral char";
117 EXPECT_THAT(offsetToPosition(File, 28), Pos(2, 8)) << "end of last line";
118 EXPECT_THAT(offsetToPosition(File, 29), Pos(2, 9)) << "EOF";
119 EXPECT_THAT(offsetToPosition(File, 30), Pos(2, 9)) << "out of bounds";
Sam McCallb536a2a2017-12-19 12:23:48 +0000120}
121
122} // namespace
123} // namespace clangd
124} // namespace clang