| // 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 |