Discover Model paths and compatible binding targets in both hosts

Add non-constructing target metadata and a shared read-only browser for the Person fixtures. Negotiate binding discovery independently, preserve FXML, and explain direction/type mismatches. Record remaining manual navigation checks as explicitly skipped.
This commit is contained in:
2026-11-13 08:57:35 +01:00
parent 2156894fa8
commit 2fe408bb4d
38 changed files with 1087 additions and 37 deletions
@@ -426,6 +426,61 @@ public final class ProjectionHostChecks {
check(
document.snapshot().toCompletableFuture().get().text().equals(full),
"Runtime sizing changed source");
fx(
() -> {
pane.lookupAll(".titled-pane").stream()
.filter(n -> n instanceof TitledPane t && t.getText().equals("Bindings — discovery"))
.map(n -> (TitledPane) n)
.forEach(t -> t.setExpanded(true));
return null;
});
click(pane, "Discover bindings");
await(
() ->
fx(
() ->
((TableView<?>) pane.lookup("#binding-targets"))
.getItems().stream()
.anyMatch(
v ->
v
instanceof
de.neitzel.fxdesigner.protocol.BindingMetadata.Target t
&& t.control().equals("rankInput")
&& t.property().equals("text")
&& t.status().equals("COMPATIBLE"))));
fx(
() -> {
var paths =
(ComboBox<de.neitzel.fxdesigner.protocol.BindingMetadata.Attribute>)
pane.lookup("#binding-path");
check(
paths.getItems().stream().anyMatch(a -> a.path().equals("home.street")),
"Binding browser lacks nested path");
paths.setValue(
paths.getItems().stream()
.filter(a -> a.path().equals("rank"))
.findFirst()
.orElseThrow());
return null;
});
await(
() ->
fx(
() ->
((TableView<?>) pane.lookup("#binding-targets"))
.getItems().stream()
.anyMatch(
v ->
v
instanceof
de.neitzel.fxdesigner.protocol.BindingMetadata.Target t
&& t.control().equals("rankInput")
&& t.property().equals("text")
&& t.status().equals("CONVERTER_REQUIRED"))));
check(
document.snapshot().toCompletableFuture().get().text().equals(full),
"Binding discovery altered source");
document
.save(document.snapshot().toCompletableFuture().get().revision())
.toCompletableFuture()