From 0ea5583b62f737bdc68ddf7dfd9686b966ebfc27 Mon Sep 17 00:00:00 2001
From: Ichthyostega
Date: Fri, 5 Jan 2018 03:57:27 +0100
Subject: [PATCH] Navigator: explicitly reject solutions that did not bind all
wildcards
...this makes most of the remaining test cases pass
only a plain anchor is not yet properly interpolated
---
src/gui/interact/ui-coord-resolver.cpp | 19 +++++-
tests/gui/interact/ui-coord-resolver-test.cpp | 65 +++++++++----------
wiki/thinkPad.ichthyo.mm | 64 +++++++++---------
3 files changed, 82 insertions(+), 66 deletions(-)
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 @@
-
-
-
+
+