From 5cba374d2b1d9921e0782cb24a357b1869e7e72e Mon Sep 17 00:00:00 2001 From: Green Sky Date: Sat, 17 Dec 2022 01:18:52 +0100 Subject: [PATCH] bugfixing, debug. still broken, but better --- version0/crdt/text_document.hpp | 4 +- version0/test2.cpp | 22 +++++++- vim_research/test1.cpp | 98 +++++++++++++++++++++++++++++++-- 3 files changed, 115 insertions(+), 9 deletions(-) diff --git a/version0/crdt/text_document.hpp b/version0/crdt/text_document.hpp index 489b8f8..41e453b 100644 --- a/version0/crdt/text_document.hpp +++ b/version0/crdt/text_document.hpp @@ -245,11 +245,11 @@ struct TextDocument { //std::cout << "text between: " << getText() << "\n"; // 2. add range (add all text_start - text_end) - if (text_start < text_end) { + if (state.doc_size < text.size()) { auto tmp_add_ops = addText( list_start == 0 ? std::nullopt : std::make_optional(state.list[list_start-1].id), list_start == state.list.size() ? std::nullopt :std::make_optional(state.list.at(list_start).id), - text.substr(text_start, text_end-text_start) + text.substr(text_start, text.size() - state.doc_size) ); //std::cout << "added: " << tmp_add_ops.size() << "\n"; ops.insert(ops.end(), tmp_add_ops.begin(), tmp_add_ops.end()); diff --git a/version0/test2.cpp b/version0/test2.cpp index 9f5887a..db96bb5 100644 --- a/version0/test2.cpp +++ b/version0/test2.cpp @@ -398,8 +398,21 @@ void testChange1(size_t seed) { assert(doc.getText() == otherdoc.getText()); } +void testBugSame(void) { + Doc doc; + doc.local_agent = 'A'; + + std::string_view new_text1{"a"}; + doc.merge(new_text1); + assert(doc.getText() == new_text1); + + std::string_view new_text2{"aa"}; + doc.merge(new_text2); + assert(doc.getText() == new_text2); +} + int main(void) { - const size_t loops = 10'000; + const size_t loops = 1'000; { std::cout << "testEmptyDocAdds:\n"; for (size_t i = 0; i < loops; i++) { @@ -453,6 +466,13 @@ int main(void) { } } + std::cout << std::string(40, '=') << "\n"; + + { + std::cout << "testBugNLNL:\n"; + testBugSame(); + } + return 0; } diff --git a/vim_research/test1.cpp b/vim_research/test1.cpp index cb99443..888a502 100644 --- a/vim_research/test1.cpp +++ b/vim_research/test1.cpp @@ -1,18 +1,83 @@ #include #include +extern "C" { +#include +} + #include #include -#include +#include #include #include // single letter agent, for testing only -using Agent = char; +//using Agent = char; +using Agent = uint16_t; // tmp local port using Doc = GreenCRDT::TextDocument; using ListType = Doc::ListType; +std::ostream& operator<<(std::ostream& out, const std::optional& id) { + if (id.has_value()) { + out << id.value().id << "-" << id.value().seq; + } else { + out << "null"; + } + return out; +} + +std::ostream& operator<<(std::ostream& out, const ListType::OpAdd& op) { + out + << "Add{ id:" << op.id.id + << "-" << op.id.seq + << ", v:" << op.value + << ", l:" << op.parent_left + << ", r:" << op.parent_right + << " }" + ; + return out; +} + +std::ostream& operator<<(std::ostream& out, const ListType::OpDel& op) { + out + << "Del{ id:" << op.id.id + << "-" << op.id.seq + << " }" + ; + return out; +} + +std::ostream& operator<<(std::ostream& out, const Doc::Op& op) { + if (std::holds_alternative(op)) { + out << std::get(op); + } else if (std::holds_alternative(op)) { + out << std::get(op); + } + return out; +} + +std::ostream& operator<<(std::ostream& out, const std::optional& id) { + if (id.has_value()) { + out << id.value(); + } else { + out << "null"; + } + return out; +} + +std::ostream& operator<<(std::ostream& out, const ListType::Entry& e) { + out + << "{ id:" << e.id.id + << "-" << e.id.seq + << ", v:" << e.value + << ", l:" << e.parent_left + << ", r:" << e.parent_right + << " }" + ; + return out; +} + static bool send_command(zed_net_socket_t* remote_socket, const std::string_view mode, const std::string_view command) { auto j = nlohmann::json::array(); @@ -106,7 +171,7 @@ int main(void) { std::cout << "initialized zed_net\n"; - const unsigned int port {1337}; + const uint16_t port {1337}; zed_net_socket_t listen_socket; if (zed_net_tcp_socket_open( &listen_socket, @@ -142,6 +207,8 @@ int main(void) { // send doauto text changed for inital buffer Doc doc; + doc.local_agent = remote_address.port; // tmp: use local port as id + while (true) { // 10MiB auto buffer = std::make_unique>(); @@ -227,15 +294,34 @@ int main(void) { } std::string new_text; - for (const auto& line : j_lines) { - new_text += line; - new_text += '\n'; + for (size_t i = 0; i < j_lines.size(); i++) { + if (!j_lines.at(i).empty()) { + new_text += static_cast(j_lines.at(i)); + } + + if (i+1 < j_lines.size()) { + new_text += "\n"; + } } + //std::cout << "new_text:\n" << new_text << "\n"; + //std::cout << "old_text:\n" << doc.getText() << "\n"; + std::cout << "doc state: "; + for (const auto& e : doc.state.list) { + std::cout << e << " "; + } + std::cout << "\n"; + const auto ops = doc.merge(new_text); if (!ops.empty()) { std::cout << "ops.size: " << ops.size() << "\n"; + std::cout << "ops: "; + for (const auto& op : ops) { + std::cout << op << " "; + } + std::cout << "\n"; } + assert(doc.getText() == new_text); } else { std::cout << "unknown command '" << command << "'\n"; }