diff --git a/src/lib/diff/record-content-mutator.hpp b/src/lib/diff/record-content-mutator.hpp index c46299f9b..05b79dfee 100644 --- a/src/lib/diff/record-content-mutator.hpp +++ b/src/lib/diff/record-content-mutator.hpp @@ -51,6 +51,7 @@ namespace lib { namespace diff{ + namespace error = lumiera::error; using std::move; using std::swap; @@ -77,19 +78,21 @@ namespace diff{ empty() const { return attribs.empty() - && children.empty(); + and children.empty(); } bool currIsAttrib() const { - UNIMPLEMENTED ("determine current scope"); + return & *pos >= & *attribs.begin() + and & *pos < & *attribs.end(); } bool currIsChild() const { - UNIMPLEMENTED ("determine current scope"); + return & *pos >= & *children.begin() + and & *pos < & *children.end(); } Iter end() { return children.end(); } @@ -98,7 +101,16 @@ namespace diff{ RecordContentMutator& operator++() { - UNIMPLEMENTED ("iteration"); + if (pos == children.end()) + throw error::State ("attempt to iterate beyond end of scope" + ,error::LUMIERA_ERROR_ITER_EXHAUST); + if (pos == attribs.end()) + pos = children.begin(); + else + ++pos; + if (pos == attribs.end()) + pos = children.begin(); + return *this; } void diff --git a/src/lib/diff/record.hpp b/src/lib/diff/record.hpp index 491091509..7fe87d1e0 100644 --- a/src/lib/diff/record.hpp +++ b/src/lib/diff/record.hpp @@ -463,6 +463,7 @@ namespace diff{ record_.children_.size()); std::swap (record_.attribs_, alteredContent.attribs); std::swap (record_.children_, alteredContent.children); + alteredContent.resetPos(); } /* === extension point for building specific value types === */ diff --git a/tests/15library.tests b/tests/15library.tests index 927327069..5a66af384 100644 --- a/tests/15library.tests +++ b/tests/15library.tests @@ -243,7 +243,12 @@ return: 0 END -TEST "GenNodeBasic_test" GenNodeBasic_test <»|Rec(spam| ham = DataCap|«std::string»|eggs |{}) out-lit: --spam-- out-lit: GenNode-ID("baked beans")-DataCap|«lib::diff::Record»|Rec(hasSpam = DataCap|«bool»|1 |{GenNode-ID("_CHILD_char.002")-DataCap|«char»|*, GenNode-ID("_CHILD_string.006")-DataCap|«std::string»|★, GenNode-ID("_CHILD_double.001")-DataCap|«double»|3.1415926535897931, GenNode-ID("spam")-DataCap|«lib::diff::Record»|Rec(ham| |{GenNode-ID("_CHILD_string.003")-DataCap|«std::string»|eggs, GenNode-ID("_CHILD_string.004")-DataCap|«std::string»|spam, GenNode-ID("_CHILD_string.005")-DataCap|«std::string»|spam}), GenNode-ID("_CHILD_TimeSpan.002")-DataCap|«lib::time::TimeSpan»|0:00:00.000[920ms], GenNode-ID("_CHILD_long.001")-DataCap|«long»|42}) diff --git a/tests/library/diff/generic-record-update-test.cpp b/tests/library/diff/generic-record-update-test.cpp index 2767982a8..582e210da 100644 --- a/tests/library/diff/generic-record-update-test.cpp +++ b/tests/library/diff/generic-record-update-test.cpp @@ -24,9 +24,7 @@ #include "lib/test/run.hpp" #include "lib/test/test-helper.hpp" #include "lib/diff/record-content-mutator.hpp" -//#include "lib/iter-adapter-stl.hpp" -//#include "lib/time/timevalue.hpp" -//#include "lib/format-util.hpp" +#include "lib/format-util.hpp" #include "lib/diff/record.hpp" #include "lib/itertools.hpp" #include "lib/util.hpp" @@ -34,15 +32,10 @@ #include #include #include -#include ///TODO -//using lib::iter_stl::snapshot; using lib::append_all; using util::isnil; -//using util::join; -//using std::string; using std::vector; -//using lib::time::Time; using lumiera::error::LUMIERA_ERROR_ITER_EXHAUST; @@ -71,7 +64,6 @@ namespace test{ return contents (rec_of_strings.begin()); } - }//(End)Test fixture @@ -90,7 +82,7 @@ namespace test{ * which are by default immutable. Thus, for this specific task, embedded * data is moved into this adapter, which exposes the mutating operation * required to apply such a diff message. - * + * * @see generic-record-representation-test.cpp * @see tree-diff-application-test.cpp */ @@ -105,13 +97,12 @@ namespace test{ RecS::Mutator mut(subject); mut.appendChild("δ"); mut.setType("🌰"); - std::cout << string(subject) << std::endl; - RecS::ContentMutator content; + RecS::ContentMutator content; // empty CHECK (!isnil (mut)); CHECK ( isnil (content)); - mut.swapContent(content); + mut.swapContent(content); // contents of mutator now moved over CHECK (!isnil (content)); CHECK ( isnil (mut)); @@ -133,7 +124,7 @@ namespace test{ std::sort (content.children.begin(), content.children.end()); - ++content; + ++content; // now leaving attributes and entering child scope... CHECK (!content.currIsAttrib()); CHECK (content.currIsChild()); CHECK ("γ" == *content.pos); @@ -151,6 +142,8 @@ namespace test{ VERIFY_ERROR (ITER_EXHAUST, ++content); content.resetPos(); + CHECK (content.currIsAttrib()); + CHECK (!content.currIsChild()); CHECK (rawElm == & *content.pos); ++content; CHECK ("b = β" == *content.pos); @@ -163,7 +156,7 @@ namespace test{ mut.replace(subject); CHECK (Seq({"a = α", "b = β", "γ", "δ", "ε"}) == contents(subject)); - std::cout << string(subject) << std::endl; + CHECK ("Rec(🌰| a = α, b = β |{γ, δ, ε})" == string(subject)); } };