diff --git a/src/gui/interact/ui-coord-resolver.cpp b/src/gui/interact/ui-coord-resolver.cpp index 55caea76a..88bb4a8d7 100644 --- a/src/gui/interact/ui-coord-resolver.cpp +++ b/src/gui/interact/ui-coord-resolver.cpp @@ -85,6 +85,20 @@ namespace interact { currDepth_ = depth+1; } }; + + + size_t + find_wildcardFree_suffix (UICoord const& uic) + { + size_t pos = uic.size(); + for ( ; 0 < pos; --pos) + { + Literal const& elm = uic[pos-1]; + if (elm == Symbol::ANY or elm == Symbol::EMPTY) + break; + } + return pos; + } }//(End) implementation details @@ -123,7 +137,8 @@ namespace interact { // algorithm state size_t maxDepth = 0; PathManipulator coverage; - size_t coordDepth = this->uic_.size(); + const size_t coordDepth = this->uic_.size(); + const size_t minSolutionDepth = find_wildcardFree_suffix (uic_); auto searchAlgo = query_.getChildren (uic_, 0) .expandOnIteration() @@ -144,6 +159,8 @@ namespace interact { }) .filter ([&](auto& iter) { + if (iter.depth() < minSolutionDepth) + return false; // filter solutions which did not bind all wildcards if (iter.depth()+1 <= maxDepth) // filter for maximum solution length return false; maxDepth = 1 + iter.depth(); diff --git a/tests/gui/interact/ui-coord-resolver-test.cpp b/tests/gui/interact/ui-coord-resolver-test.cpp index cf80138e8..ade8a4095 100644 --- a/tests/gui/interact/ui-coord-resolver-test.cpp +++ b/tests/gui/interact/ui-coord-resolver-test.cpp @@ -268,7 +268,7 @@ namespace test { UICoord uic3 = UICoord::firstWindow(); UICoord uic4 = UICoord::currentWindow().persp("perspective-B"); UICoord uic5 = UICoord::currentWindow().panel("panelY"); - UICoord uic6 = UICoord().view("someView").path("α/β/γ"); + UICoord uic6 = UICoord().view("someView"); UICoordResolver r1{uic1, tree}; UICoordResolver r2{uic2, tree}; @@ -316,7 +316,7 @@ namespace test { * ** interpolate anchor and consecutive wildcards * ** discriminate by anchor and fill additional gap * - (4) failure detection - * ** reject trailing wildcards + * ** trailing wildcards are stripped and ignored * ** reject gap beyond existing real UI tree * ** reject gap ending at perimeter of real UI tree * ** reject interpolated gap on immediately following mismatch @@ -330,7 +330,7 @@ namespace test { GenNodeLocationQuery tree{MakeRec() .set("window-1" , MakeRec() - .type("perspective-A") + .type("persp-A") .set("panelX" , MakeRec() .set("firstView", MakeRec()) @@ -342,23 +342,23 @@ namespace test { , MakeRec() .set("#1", MakeRec()) .set("#2", MakeRec()) - .set("special", MakeRec()) + .set("tab", MakeRec()) ) ) ) .set("window-2" , MakeRec() - .type("perspective-B") + .type("persp-B") .set("panelY", MakeRec()) ) .set("window-3" , MakeRec() - .type("perspective-C") + .type("persp-C") .set("panelZ" , MakeRec() .set("thirdView" , MakeRec() - .set("special" + .set("tab" , MakeRec() .set("sub", MakeRec()) ) @@ -370,82 +370,81 @@ namespace test { /* === trivial cases === */ UICoordResolver r11 {UICoord::window("window-1") - .persp("perspective-A") + .persp("persp-A") .panel("panelX"), tree}; CHECK (r11.isCovered()); CHECK (3 == r11.coverDepth()); UICoordResolver r12 {UICoord::window("window-1") - .persp("perspective-A") + .persp("persp-A") .panel("panelX") .view("thirdView"), tree}; CHECK (not r12.isCovered()); CHECK ( r12.isCoveredPartially()); CHECK (3 ==r12.coverDepth()); - CHECK ("UI:window-1[perspective-A]-panelX.thirdView" == string(r12)); + CHECK ("UI:window-1[persp-A]-panelX.thirdView" == string(r12)); auto r12_covered = r12.cover(); CHECK (r12_covered.isCovered()); CHECK (r12_covered.isCoveredPartially()); CHECK (3 ==r12_covered.coverDepth()); - CHECK ("UI:window-1[perspective-A]-panelX" == string(r12_covered)); + CHECK ("UI:window-1[persp-A]-panelX" == string(r12_covered)); /* === expand anchor === */ - UICoordResolver r21 {UICoord::firstWindow().persp("perspective-A"), tree}; - cout << r21.cover()< - - - - + + + + @@ -4489,12 +4489,12 @@ - - - - + + + + - + @@ -4508,9 +4508,8 @@

-
- + @@ -4529,7 +4528,6 @@ -
@@ -8779,33 +8777,36 @@
- + + - - + + - - + + - - + + - - + + - - - - - + + + + + + + - - - + + + @@ -8813,9 +8814,8 @@ - - - + +