Discover Converter capabilities and validate shared binding drafts

This commit is contained in:
2026-11-13 12:58:08 +01:00
parent 17b1bce704
commit 5a208d2336
35 changed files with 1096 additions and 34 deletions
@@ -0,0 +1,19 @@
package fixture.components;
@de.neitzel.fxdesigner.preview.ConverterCapabilities(
modelType = Integer.class,
controlType = String.class,
reverse = true)
public class BrokenReverseConverter implements de.neitzel.fx.view.Converter {
static {
System.setProperty("fixture.converter.initialized", "BrokenReverseConverter");
}
public BrokenReverseConverter() {
throw new AssertionError("Discovery must not construct Converters");
}
public Object toControlValue(Object value) {
return "";
}
}
@@ -0,0 +1,18 @@
package fixture.components;
@de.neitzel.fxdesigner.preview.ConverterCapabilities(
modelType = Integer.class,
controlType = String.class)
public class ForwardRankConverter implements de.neitzel.fx.view.Converter {
static {
System.setProperty("fixture.converter.initialized", "ForwardRankConverter");
}
public ForwardRankConverter() {
throw new AssertionError("Discovery must not construct Converters");
}
public Object toControlValue(Object value) {
return "";
}
}
@@ -0,0 +1,11 @@
package fixture.components;
public class LegacyRankConverter extends RankConverter {
static {
System.setProperty("fixture.converter.initialized", "LegacyRankConverter");
}
public LegacyRankConverter() {
throw new AssertionError("Discovery must not construct Converters");
}
}
@@ -0,0 +1,15 @@
package fixture.components;
@de.neitzel.fxdesigner.preview.ConverterCapabilities(
modelType = String.class,
controlType = String.class,
reverse = true)
public class NameConverterA extends RankConverter {
static {
System.setProperty("fixture.converter.initialized", "NameConverterA");
}
public NameConverterA() {
throw new AssertionError("Discovery must not construct Converters");
}
}
@@ -0,0 +1,15 @@
package fixture.components;
@de.neitzel.fxdesigner.preview.ConverterCapabilities(
modelType = String.class,
controlType = String.class,
reverse = true)
public class NameConverterB extends RankConverter {
static {
System.setProperty("fixture.converter.initialized", "NameConverterB");
}
public NameConverterB() {
throw new AssertionError("Discovery must not construct Converters");
}
}
@@ -1,5 +1,9 @@
package fixture.components;
@de.neitzel.fxdesigner.preview.ConverterCapabilities(
modelType = Integer.class,
controlType = String.class,
reverse = true)
@jakarta.inject.Singleton
public class RankConverter implements de.neitzel.fx.view.Converter {
public Object toControlValue(Object value) {
@@ -90,6 +90,45 @@ public final class PreviewChecks {
check(
System.getProperty("fixture.provider.initialized") == null,
"Discovery initialized provider");
try (var in = loader.getResourceAsStream("fixture/components/Full.fxml")) {
String full = new String(in.readAllBytes(), java.nio.charset.StandardCharsets.UTF_8);
var details = BindingDiscovery.inspect(full, "rank", "both", "rankInput", "text", loader);
check(
details.problems().isEmpty(),
"Valid converter binding rejected: " + details.problems());
for (var expected :
java.util.Map.of(
"RankConverter",
"COMPATIBLE",
"LegacyRankConverter",
"UNVERIFIED",
"BrokenReverseConverter",
"ERROR",
"ForwardRankConverter",
"INCOMPATIBLE")
.entrySet())
check(
details.converters().stream()
.anyMatch(
c ->
c.name().equals("fixture.components." + expected.getKey())
&& c.status().equals(expected.getValue())),
"Converter status: " + expected);
var invalid =
BindingDiscovery.inspect(
full.replace(
"converter=\"fixture.components.RankConverter\"",
"converter=\"fixture.components.BrokenReverseConverter\""),
"rank",
"both",
loader);
check(
invalid.problems().stream().anyMatch(v -> v.severity().equals("ERROR")),
"Invalid reverse metadata accepted");
check(
System.getProperty("fixture.converter.initialized") == null,
"Discovery initialized Converter");
}
System.out.println("PASS bindings " + checks);
return;
}