From a15e9741504d8c8cae3e2b73e3e07287e72e4362 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Tue, 21 Mar 2017 12:14:04 -0700 Subject: [PATCH] Make clearer assertions about SpyInput's read strings --- test/helpers/spy_input.cc | 30 +++++++++++++++++++++++++----- test/helpers/spy_input.h | 3 ++- test/runtime/document_test.cc | 4 ++-- test/runtime/parser_test.cc | 4 ++-- 4 files changed, 31 insertions(+), 10 deletions(-) diff --git a/test/helpers/spy_input.cc b/test/helpers/spy_input.cc index 6c479c16..bdcb2709 100644 --- a/test/helpers/spy_input.cc +++ b/test/helpers/spy_input.cc @@ -6,6 +6,7 @@ using std::pair; using std::string; +using std::vector; static const size_t UTF8_MAX_CHAR_SIZE = 4; @@ -16,12 +17,25 @@ SpyInput::SpyInput(string content, size_t chars_per_chunk) : byte_offset(0), content(content), encoding(TSInputEncodingUTF8), - strings_read({""}) {} + ranges_read({}) {} SpyInput::~SpyInput() { delete[] buffer; } +static void add_byte_range(vector> *ranges, + uint32_t start, uint32_t count) { + uint32_t end = start + count; + for (auto &range : *ranges) { + if (range.first <= start && start <= range.second) { + if (start < range.first) range.first = start; + if (end > range.second) range.second = end; + return; + } + } + ranges->push_back({start, end}); +} + const char * SpyInput::read(void *payload, uint32_t *bytes_read) { auto spy = static_cast(payload); @@ -36,7 +50,7 @@ const char * SpyInput::read(void *payload, uint32_t *bytes_read) { string result = spy->content.substr(spy->byte_offset, byte_count); *bytes_read = byte_count; - spy->strings_read.back() += result; + add_byte_range(&spy->ranges_read, spy->byte_offset, byte_count); spy->byte_offset += byte_count; /* @@ -54,12 +68,18 @@ const char * SpyInput::read(void *payload, uint32_t *bytes_read) { int SpyInput::seek(void *payload, uint32_t character, uint32_t byte) { auto spy = static_cast(payload); - if (spy->strings_read.size() == 0 || spy->strings_read.back().size() > 0) - spy->strings_read.push_back(""); spy->byte_offset = byte; return 0; } +vector SpyInput::strings_read() const { + vector result; + for (auto &range : ranges_read) { + result.push_back(content.substr(range.first, range.second - range.first)); + } + return result; +} + TSInput SpyInput::input() { TSInput result; result.payload = this; @@ -129,5 +149,5 @@ pair SpyInput::swap_substr(size_t start_byte, size_t bytes_remo } void SpyInput::clear() { - strings_read.clear(); + ranges_read.clear(); } diff --git a/test/helpers/spy_input.h b/test/helpers/spy_input.h index a81213eb..9e0ee8d1 100644 --- a/test/helpers/spy_input.h +++ b/test/helpers/spy_input.h @@ -30,10 +30,11 @@ class SpyInput { void clear(); TSInputEdit replace(size_t start_char, size_t chars_removed, std::string text); TSInputEdit undo(); + std::vector strings_read() const; std::string content; TSInputEncoding encoding; - std::vector strings_read; + std::vector> ranges_read; }; #endif // HELPERS_SPY_INPUT_H_ diff --git a/test/runtime/document_test.cc b/test/runtime/document_test.cc index 71d7b8c7..d732fbc8 100644 --- a/test/runtime/document_test.cc +++ b/test/runtime/document_test.cc @@ -94,7 +94,7 @@ describe("Document", [&]() { ts_document_set_input(document, spy_input->input()); AssertThat(ts_document_root_node(document), Equals(root)); AssertThat(ts_node_has_changes(root), IsFalse()); - AssertThat(spy_input->strings_read, Equals(vector({ "" }))); + AssertThat(spy_input->strings_read(), IsEmpty()); }); it("reads text from the new input for future parses", [&]() { @@ -113,7 +113,7 @@ describe("Document", [&]() { assert_node_string_equals( new_root, "(object (pair (string) (array (null) (number))))"); - AssertThat(spy_input->strings_read, Equals(vector({" [null, 2" }))); + AssertThat(spy_input->strings_read(), Equals(vector({" [null, 2" }))); }); it("allows setting input string with length", [&]() { diff --git a/test/runtime/parser_test.cc b/test/runtime/parser_test.cc index 0a075aba..d9aee54a 100644 --- a/test/runtime/parser_test.cc +++ b/test/runtime/parser_test.cc @@ -254,7 +254,7 @@ describe("Parser", [&]() { "(identifier) " "(math_op (number) (member_access (identifier) (identifier))))))"); - AssertThat(input->strings_read, Equals(vector({ " + abc.d)" }))); + AssertThat(input->strings_read(), Equals(vector({ " abc.d);" }))); }); }); @@ -279,7 +279,7 @@ describe("Parser", [&]() { "(number) " "(math_op (number) (math_op (number) (identifier)))))))"); - AssertThat(input->strings_read, Equals(vector({ "123 || 5 +" }))); + AssertThat(input->strings_read(), Equals(vector({"123 || 5 ", ";"}))); }); });