Feat/fix faulty string (#1406)

This commit is contained in:
Simon Gene Gottlieb
2026-02-18 21:45:23 +01:00
committed by GitHub
parent 44d54544b1
commit 97d150e98b
3 changed files with 22 additions and 2 deletions

View File

@@ -89,6 +89,7 @@ const char* const INVALID_ANCHOR = "invalid anchor";
const char* const INVALID_ALIAS = "invalid alias"; const char* const INVALID_ALIAS = "invalid alias";
const char* const INVALID_TAG = "invalid tag"; const char* const INVALID_TAG = "invalid tag";
const char* const BAD_FILE = "bad file"; const char* const BAD_FILE = "bad file";
const char* const UNEXPECTED_TOKEN_AFTER_DOC = "unexpected token after end of document";
template <typename T> template <typename T>
inline const std::string KEY_NOT_FOUND_WITH_KEY( inline const std::string KEY_NOT_FOUND_WITH_KEY(

View File

@@ -41,8 +41,13 @@ void SingleDocParser::HandleDocument(EventHandler& eventHandler) {
eventHandler.OnDocumentEnd(); eventHandler.OnDocumentEnd();
// check if any tokens left after the text
if (!m_scanner.empty() && m_scanner.peek().type != Token::DOC_END
&& m_scanner.peek().type != Token::DOC_START)
throw ParserException(m_scanner.mark(), ErrorMsg::UNEXPECTED_TOKEN_AFTER_DOC);
// and finally eat any doc ends we see // and finally eat any doc ends we see
while (!m_scanner.empty() && m_scanner.peek().type == Token::DOC_END) if (!m_scanner.empty() && m_scanner.peek().type == Token::DOC_END)
m_scanner.pop(); m_scanner.pop();
} }

View File

@@ -375,11 +375,21 @@ TEST(NodeTest, InfiniteLoopNodes) {
EXPECT_THROW(LoadAll(R"(,)"), ParserException); EXPECT_THROW(LoadAll(R"(,)"), ParserException);
} }
TEST(NodeTest, MultipleDocuments) { TEST(NodeTest, MultipleDocumentsBeginning) {
std::vector<Node> docs = LoadAll("\n---\n---\nA\n"); std::vector<Node> docs = LoadAll("\n---\n---\nA\n");
EXPECT_EQ(docs.size(), 2); EXPECT_EQ(docs.size(), 2);
} }
TEST(NodeTest, MultipleDocumentsEnds) {
std::vector<Node> docs = LoadAll("\n...\nA\n...\n");
EXPECT_EQ(docs.size(), 2);
}
TEST(NodeTest, MultipleDocumentsEndsWithEmptyDocs) {
std::vector<Node> docs = LoadAll("\n...\nA\n...\n...\nB\n...");
EXPECT_EQ(docs.size(), 4);
}
struct NewLineStringsTestCase { struct NewLineStringsTestCase {
std::string input; std::string input;
std::string expected_content; std::string expected_content;
@@ -451,6 +461,10 @@ TEST(LoadNodeTest, BlockCREncoded) {
EXPECT_EQ(1, node["followup"].as<int>()); EXPECT_EQ(1, node["followup"].as<int>());
} }
TEST(LoadNodeTest, IncorrectSeqEnd) {
EXPECT_THROW(Load("[foo]_bar"), ParserException);
}
} // namespace } // namespace
} // namespace YAML } // namespace YAML