blob: a86651b3d62cb0ab1b9adcfa13e9dfafe1b010bd [file] [log] [blame]
// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
#include <type_traits>
#include "platform/globals.h"
#include "vm/kernel.h"
#include "vm/object.h"
#include "vm/unit_test.h"
namespace dart {
const dart::TypedData& CreateLineStartsData() {
const intptr_t raw_line_starts_data[] = {
0, 8, 12, 17, 18, 20, 23, 30, 31, 33,
};
const intptr_t length = std::extent<decltype(raw_line_starts_data)>::value;
ASSERT(length > 0);
const TypedData& line_starts_data = TypedData::Handle(
TypedData::New(kTypedDataUint16ArrayCid, length, Heap::kOld));
for (intptr_t i = 0; i < length; ++i) {
line_starts_data.SetUint16(i << 1,
static_cast<int16_t>(raw_line_starts_data[i]));
}
return line_starts_data;
}
ISOLATE_UNIT_TEST_CASE(KernelLineStartsReader_MaxPosition) {
kernel::KernelLineStartsReader reader(CreateLineStartsData(), thread->zone());
EXPECT_EQ(33u, reader.MaxPosition());
}
void ExpectLocationForPosition(const kernel::KernelLineStartsReader& reader,
intptr_t position,
intptr_t expected_line,
intptr_t expected_col) {
intptr_t line;
intptr_t col;
EXPECT_EQ(true, reader.LocationForPosition(position, &line, &col));
EXPECT_EQ(expected_line, line);
EXPECT_EQ(expected_col, col);
}
ISOLATE_UNIT_TEST_CASE(KernelLineStartsReader_LocationForPosition) {
kernel::KernelLineStartsReader reader(CreateLineStartsData(), thread->zone());
ExpectLocationForPosition(reader, 0, 1, 1);
ExpectLocationForPosition(reader, 4, 1, 5);
ExpectLocationForPosition(reader, 8, 2, 1);
ExpectLocationForPosition(reader, 14, 3, 3);
ExpectLocationForPosition(reader, 17, 4, 1);
ExpectLocationForPosition(reader, 19, 5, 2);
ExpectLocationForPosition(reader, 22, 6, 3);
ExpectLocationForPosition(reader, 29, 7, 7);
ExpectLocationForPosition(reader, 30, 8, 1);
ExpectLocationForPosition(reader, 32, 9, 2);
ExpectLocationForPosition(reader, 33, 10, 1);
intptr_t line;
intptr_t col;
EXPECT_EQ(false, reader.LocationForPosition(-1, &line, &col));
EXPECT_EQ(false, reader.LocationForPosition(34, &line, &col));
}
void ExpectTokenRangeAtLine(const kernel::KernelLineStartsReader& reader,
intptr_t line,
intptr_t expected_first_token,
intptr_t expected_last_token) {
TokenPosition first_token = TokenPosition::Synthetic(0);
TokenPosition last_token = TokenPosition::Synthetic(0);
EXPECT_EQ(true, reader.TokenRangeAtLine(line, &first_token, &last_token));
EXPECT_EQ(expected_first_token, first_token.Serialize());
EXPECT_EQ(expected_last_token, last_token.Serialize());
}
ISOLATE_UNIT_TEST_CASE(KernelLineStartsReader_TokenRangeAtLine) {
kernel::KernelLineStartsReader reader(CreateLineStartsData(), thread->zone());
ExpectTokenRangeAtLine(reader, 1, 0, 7);
ExpectTokenRangeAtLine(reader, 2, 8, 11);
ExpectTokenRangeAtLine(reader, 3, 12, 16);
ExpectTokenRangeAtLine(reader, 4, 17, 17);
ExpectTokenRangeAtLine(reader, 5, 18, 19);
ExpectTokenRangeAtLine(reader, 6, 20, 22);
ExpectTokenRangeAtLine(reader, 7, 23, 29);
ExpectTokenRangeAtLine(reader, 8, 30, 30);
ExpectTokenRangeAtLine(reader, 9, 31, 32);
ExpectTokenRangeAtLine(reader, 10, 33, 33);
TokenPosition first_token = TokenPosition::Synthetic(0);
TokenPosition last_token = TokenPosition::Synthetic(0);
EXPECT_EQ(false, reader.TokenRangeAtLine(0, &first_token, &last_token));
EXPECT_EQ(false, reader.TokenRangeAtLine(11, &first_token, &last_token));
}
} // namespace dart