blob: 088a2bb871d3bdf6c3c00efdb790c8d021cffff6 [file] [log] [blame]
// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "src/developer/debug/zxdb/expr/operator_keyword.h"
#include <gtest/gtest.h>
#include "src/developer/debug/zxdb/expr/expr_tokenizer.h"
namespace zxdb {
namespace {
void CheckParseOperator(const std::string& input, OperatorKeywordResult expected,
size_t start_token = 0) {
ExprTokenizer tokenizer(input);
EXPECT_TRUE(tokenizer.Tokenize());
OperatorKeywordResult result = ParseOperatorKeyword(tokenizer.tokens(), start_token);
EXPECT_EQ(expected.success, result.success) << "For " << input;
EXPECT_EQ(expected.canonical_name, result.canonical_name) << "For " << input;
EXPECT_EQ(expected.end_token, result.end_token) << "For " << input;
}
} // namespace
TEST(OperatorKeyword, Parse) {
// Nothing following the keyword.
CheckParseOperator("operator", OperatorKeywordResult());
// Invalid thing following the keyword.
CheckParseOperator("operator hello", OperatorKeywordResult());
CheckParseOperator("operator.", OperatorKeywordResult());
CheckParseOperator(
"operator+",
OperatorKeywordResult{.success = true, .canonical_name = "operator+", .end_token = 2});
CheckParseOperator(
"operator delete",
OperatorKeywordResult{.success = true, .canonical_name = "operator delete", .end_token = 2});
CheckParseOperator(
"operator new[]",
OperatorKeywordResult{.success = true, .canonical_name = "operator new[]", .end_token = 4});
CheckParseOperator(
"operator,",
OperatorKeywordResult{.success = true, .canonical_name = "operator,", .end_token = 2});
CheckParseOperator(
"operator +",
OperatorKeywordResult{.success = true, .canonical_name = "operator+", .end_token = 2});
CheckParseOperator(
"operator >>=",
OperatorKeywordResult{.success = true, .canonical_name = "operator>>=", .end_token = 3});
CheckParseOperator(
"operator >>",
OperatorKeywordResult{.success = true, .canonical_name = "operator>>", .end_token = 3});
CheckParseOperator(
"operator > >",
OperatorKeywordResult{.success = true, .canonical_name = "operator>", .end_token = 2});
CheckParseOperator(
"operator<<",
OperatorKeywordResult{.success = true, .canonical_name = "operator<<", .end_token = 2});
// Valid stuff following the keyword.
CheckParseOperator(
"operator +;",
OperatorKeywordResult{.success = true, .canonical_name = "operator+", .end_token = 2});
CheckParseOperator(
"operator new()",
OperatorKeywordResult{.success = true, .canonical_name = "operator new", .end_token = 2});
CheckParseOperator(
"operator/(hello)",
OperatorKeywordResult{.success = true, .canonical_name = "operator/", .end_token = 2});
// Stuff before and after.
CheckParseOperator(
"void operator()()",
OperatorKeywordResult{.success = true, .canonical_name = "operator()", .end_token = 4}, 1);
CheckParseOperator(
"void operator delete[]()",
OperatorKeywordResult{.success = true, .canonical_name = "operator delete[]", .end_token = 5},
1);
}
} // namespace zxdb