12 #include "gmock/gmock.h" 13 #include "gtest/gtest.h" 19 struct IncrementalTestStep {
24 int rangeLength(llvm::StringRef
Code,
const Range &Rng) {
33 void stepByStep(llvm::ArrayRef<IncrementalTestStep> Steps) {
35 Annotations InitialSrc(Steps.front().Src);
36 constexpr llvm::StringLiteral
Path(
"/hello.cpp");
39 DS.addDraft(Path, InitialSrc.code());
41 for (
size_t i = 1; i < Steps.size(); i++) {
42 Annotations SrcBefore(Steps[i - 1].
Src);
43 Annotations SrcAfter(Steps[i].
Src);
44 llvm::StringRef
Contents = Steps[i - 1].Contents;
45 TextDocumentContentChangeEvent
Event{
47 rangeLength(SrcBefore.code(), SrcBefore.range()),
51 llvm::Expected<std::string> Result = DS.updateDraft(Path, {
Event});
52 ASSERT_TRUE(!!Result);
53 EXPECT_EQ(*Result, SrcAfter.code());
54 EXPECT_EQ(*DS.getDraft(Path), SrcAfter.code());
59 void allAtOnce(llvm::ArrayRef<IncrementalTestStep> Steps) {
61 Annotations InitialSrc(Steps.front().Src);
62 Annotations FinalSrc(Steps.back().Src);
63 constexpr llvm::StringLiteral
Path(
"/hello.cpp");
64 std::vector<TextDocumentContentChangeEvent>
Changes;
66 for (
size_t i = 0; i < Steps.size() - 1; i++) {
67 Annotations
Src(Steps[i].
Src);
68 llvm::StringRef
Contents = Steps[i].Contents;
72 rangeLength(Src.code(), Src.range()),
78 DS.addDraft(Path, InitialSrc.code());
80 llvm::Expected<std::string> Result = DS.updateDraft(Path, Changes);
83 EXPECT_EQ(*Result, FinalSrc.code());
84 EXPECT_EQ(*DS.getDraft(Path), FinalSrc.code());
87 TEST(DraftStoreIncrementalUpdateTest, Simple) {
89 IncrementalTestStep Steps[] =
125 TEST(DraftStoreIncrementalUpdateTest, MultiLine) {
127 IncrementalTestStep Steps[] =
145 R
"cpp(static char[[]]() 155 R"cpp(#include <stdio.h> 160 R
"cpp([[#include <stdio.h> 182 TEST(DraftStoreIncrementalUpdateTest, WrongRangeLength) {
186 DS.addDraft(File,
"int main() {}\n");
188 TextDocumentContentChangeEvent Change;
189 Change.range.emplace();
190 Change.range->start.line = 0;
191 Change.range->start.character = 0;
192 Change.range->end.line = 0;
193 Change.range->end.character = 2;
194 Change.rangeLength = 10;
196 Expected<std::string> Result = DS.updateDraft(File, {Change});
198 EXPECT_TRUE(!Result);
201 "Change's rangeLength (10) doesn't match the computed range length (2).");
204 TEST(DraftStoreIncrementalUpdateTest, EndBeforeStart) {
208 DS.addDraft(File,
"int main() {}\n");
210 TextDocumentContentChangeEvent Change;
211 Change.range.emplace();
212 Change.range->start.line = 0;
213 Change.range->start.character = 5;
214 Change.range->end.line = 0;
215 Change.range->end.character = 3;
217 Expected<std::string> Result = DS.updateDraft(File, {Change});
219 EXPECT_TRUE(!Result);
220 EXPECT_EQ(
toString(Result.takeError()),
221 "Range's end position (0:3) is before start position (0:5)");
224 TEST(DraftStoreIncrementalUpdateTest, StartCharOutOfRange) {
228 DS.addDraft(File,
"int main() {}\n");
230 TextDocumentContentChangeEvent Change;
231 Change.range.emplace();
232 Change.range->start.line = 0;
233 Change.range->start.character = 100;
234 Change.range->end.line = 0;
235 Change.range->end.character = 100;
238 Expected<std::string> Result = DS.updateDraft(File, {Change});
240 EXPECT_TRUE(!Result);
241 EXPECT_EQ(
toString(Result.takeError()),
242 "utf-16 offset 100 is invalid for line 0");
245 TEST(DraftStoreIncrementalUpdateTest, EndCharOutOfRange) {
249 DS.addDraft(File,
"int main() {}\n");
251 TextDocumentContentChangeEvent Change;
252 Change.range.emplace();
253 Change.range->start.line = 0;
254 Change.range->start.character = 0;
255 Change.range->end.line = 0;
256 Change.range->end.character = 100;
259 Expected<std::string> Result = DS.updateDraft(File, {Change});
261 EXPECT_TRUE(!Result);
262 EXPECT_EQ(
toString(Result.takeError()),
263 "utf-16 offset 100 is invalid for line 0");
266 TEST(DraftStoreIncrementalUpdateTest, StartLineOutOfRange) {
270 DS.addDraft(File,
"int main() {}\n");
272 TextDocumentContentChangeEvent Change;
273 Change.range.emplace();
274 Change.range->start.line = 100;
275 Change.range->start.character = 0;
276 Change.range->end.line = 100;
277 Change.range->end.character = 0;
280 Expected<std::string> Result = DS.updateDraft(File, {Change});
282 EXPECT_TRUE(!Result);
283 EXPECT_EQ(
toString(Result.takeError()),
"Line value is out of range (100)");
286 TEST(DraftStoreIncrementalUpdateTest, EndLineOutOfRange) {
290 DS.addDraft(File,
"int main() {}\n");
292 TextDocumentContentChangeEvent Change;
293 Change.range.emplace();
294 Change.range->start.line = 0;
295 Change.range->start.character = 0;
296 Change.range->end.line = 100;
297 Change.range->end.character = 0;
300 Expected<std::string> Result = DS.updateDraft(File, {Change});
302 EXPECT_TRUE(!Result);
303 EXPECT_EQ(
toString(Result.takeError()),
"Line value is out of range (100)");
308 TEST(DraftStoreIncrementalUpdateTest, InvalidRangeInASequence) {
312 StringRef OriginalContents =
"int main() {}\n";
313 DS.addDraft(File, OriginalContents);
316 TextDocumentContentChangeEvent Change1;
317 Change1.range.emplace();
318 Change1.range->start.line = 0;
319 Change1.range->start.character = 0;
320 Change1.range->end.line = 0;
321 Change1.range->end.character = 0;
322 Change1.text =
"Hello ";
325 TextDocumentContentChangeEvent Change2;
326 Change2.range.emplace();
327 Change2.range->start.line = 0;
328 Change2.range->start.character = 5;
329 Change2.range->end.line = 0;
330 Change2.range->end.character = 100;
331 Change2.text =
"something";
333 Expected<std::string> Result = DS.updateDraft(File, {Change1, Change2});
335 EXPECT_TRUE(!Result);
336 EXPECT_EQ(
toString(Result.takeError()),
337 "utf-16 offset 100 is invalid for line 0");
339 Optional<std::string>
Contents = DS.getDraft(File);
340 EXPECT_TRUE(Contents);
341 EXPECT_EQ(*Contents, OriginalContents);
347
static llvm::StringRef toString(SpecialMemberFunctionsCheck::SpecialMemberFunctionKind K)
TEST(BackgroundQueueTest, Priority)
llvm::Expected< size_t > positionToOffset(llvm::StringRef Code, Position P, bool AllowColumnsBeyondLineLength)
Turn a [line, column] pair into an offset in Code.
static const char * toString(OffsetEncoding OE)
std::string Path
A typedef to represent a file path.
===– Representation.cpp - ClangDoc Representation --------—*- C++ -*-===//
CharSourceRange Range
SourceRange for the file name.