| // Copyright 2017-2020 The Verible Authors. | |
| // | |
| // Licensed under the Apache License, Version 2.0 (the "License"); | |
| // you may not use this file except in compliance with the License. | |
| // You may obtain a copy of the License at | |
| // | |
| // http://www.apache.org/licenses/LICENSE-2.0 | |
| // | |
| // Unless required by applicable law or agreed to in writing, software | |
| // distributed under the License is distributed on an "AS IS" BASIS, | |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| // See the License for the specific language governing permissions and | |
| // limitations under the License. | |
| #ifndef VERIBLE_COMMON_TEXT_TOKEN_INFO_TEST_UTIL_H_ | |
| #define VERIBLE_COMMON_TEXT_TOKEN_INFO_TEST_UTIL_H_ | |
| #include <initializer_list> | |
| #include <string> | |
| #include <vector> | |
| #include "absl/strings/string_view.h" | |
| #include "common/text/token_info.h" | |
| namespace verible { | |
| // Proxy class of a TokenInfo for lexer test case construction. | |
| // This class exists for the sole purpose of being able to easily construct | |
| // lexer test cases from a mixture of plain string literals and TokenInfos. | |
| // There are no new data members in this class, so it is expected to be | |
| // copyable into a TokenInfo without slicing out any information. | |
| // Use this class in containers of TokenInfos that require default | |
| // constructibility. | |
| struct ExpectedTokenInfo : public TokenInfo { | |
| // This pseudo token_enum signals to the test harness to not bother | |
| // checking the token enum, and check only the string contents. | |
| enum { | |
| kDontCare = -2, | |
| kNoToken // kNoToken skips the token | |
| }; | |
| ExpectedTokenInfo() : TokenInfo(TokenInfo::EOFToken()) {} | |
| // Arbitrary text constructor for cases where one does not care about | |
| // the token enum of the string. | |
| // Implicit construction intentional. | |
| ExpectedTokenInfo( // NOLINT(google-explicit-constructor) | |
| absl::string_view token_text) | |
| : TokenInfo(kDontCare, token_text) {} | |
| // Arbitrary text constructor for cases where one does not care about | |
| // the token enum of the string. This constructor is provided to bypass | |
| // conversion through string_view, to work directly with string literals. | |
| // Implicit construction intentional. | |
| ExpectedTokenInfo( // NOLINT(google-explicit-constructor) | |
| const char* token_text) | |
| : ExpectedTokenInfo(absl::string_view(token_text)) {} // delegating | |
| // Single-character token constructor, for the cases where the | |
| // only character of the text **is** the token enum. | |
| // The internal text string_view set to point to the location of the | |
| // (internally stored) character literal. | |
| // This internal storage is necessary because unlike a string literal, | |
| // a character literal is not guaranteed permanent storage. | |
| // Implicit construction intentional. | |
| ExpectedTokenInfo( // NOLINT(google-explicit-constructor) | |
| char token_enum_and_text); | |
| ExpectedTokenInfo(int expected_token_enum, absl::string_view expected_text) | |
| : TokenInfo(expected_token_enum, expected_text) {} | |
| // Deleted interfaces. | |
| // Deleted because the (char) constructor points the text string_view member | |
| // to the internal token_enum member, creating a self-pointer. | |
| ExpectedTokenInfo(const ExpectedTokenInfo&) = delete; | |
| ExpectedTokenInfo(ExpectedTokenInfo&&) = delete; | |
| ExpectedTokenInfo& operator=(const ExpectedTokenInfo&) = delete; | |
| }; | |
| static_assert( | |
| sizeof(ExpectedTokenInfo) == sizeof(TokenInfo), | |
| "class ExpectedTokenInfo must not introduce any new data members."); | |
| // Encapsulates both input code and expected tokens by concatenating | |
| // expected tokens' text into a single string. | |
| struct TokenInfoTestData { | |
| // Sequence of expected tokens to find that point into 'code'. | |
| // Publicly, this should to be const, but cannot be due to initialization | |
| // details. | |
| std::vector<TokenInfo> expected_tokens; | |
| // This needs to own the memory for a newly concatenated string. | |
| // Publicly, this should to be const, but cannot be due to initialization | |
| // details. | |
| std::string code; | |
| TokenInfoTestData(std::initializer_list<ExpectedTokenInfo> fragments); | |
| // disallow copy/assign because of relationship between expected_tokens' | |
| // string_view and code string buffer. | |
| TokenInfoTestData(const TokenInfoTestData&) = delete; | |
| TokenInfoTestData& operator=(const TokenInfoTestData&) = delete; | |
| // No need for moveability (yet). | |
| TokenInfoTestData(TokenInfoTestData&&) = delete; | |
| TokenInfoTestData& operator=(TokenInfoTestData&&) = delete; | |
| // Returns subset of expected_tokens that are *not* enumerated | |
| // ExpectedTokenInfo::kDontCare. | |
| std::vector<TokenInfo> FindImportantTokens() const; | |
| // This variant rebases tokens to a copy of the same 'code' that lives | |
| // in a different buffer. This combines FindImportantTokens() with | |
| // RebaseToCodeCopy(). | |
| std::vector<TokenInfo> FindImportantTokens(absl::string_view base) const; | |
| // Moves the locations of tokens into the range spanned by the 'base' buffer. | |
| // 'base' is another copy of (this) 'code' (content match is verified). | |
| void RebaseToCodeCopy(std::vector<TokenInfo>* tokens, | |
| absl::string_view base) const; | |
| }; | |
| } // namespace verible | |
| #endif // VERIBLE_COMMON_TEXT_TOKEN_INFO_TEST_UTIL_H_ |