import java.util.Collection;
import java.util.List;
import java.util.function.Supplier;
class Should {
if (!expected.equals(given)) {
throw new RuntimeException("equality failed. expected " + expected
+ ", but given " + given
); }
}
}
// ----------------------------------------------------------------
class A {
return getClass().getSimpleName();
}
}
class ASpec<T extends A> {
final void runAll(Collection<Supplier<? extends T>> implementations) {
implementations.forEach(this::run);
}
void run(Supplier<? extends T> a) {
should_be_A_object_description_when_x_is_42(a.get());
}
return a.getClass().getSimpleName();
}
void should_be_A_object_description_when_x_is_42(A a) {
final var expected = descriptionOf(a);
Should.beEqual(expected, a.description(42));
}
}
class B extends A {
return "B";
}
}
class BSpec<T extends B> extends ASpec<B> {
void run(Supplier<? extends B> b) {
super.run(b);
should_be_B_object_description(b.get());
}
return "B";
}
void should_be_B_object_description(B b) {
final var expected = bDescriptionOf(b);
Should.beEqual(expected, b.description());
}
}
final class Ideone {
public static void main
(String[] args
) { new ASpec
<>().
runAll(List.
of(A
::new, B
::new)); new BSpec
<>().
runAll(List.
of(B
::new)); }
}
aW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwppbXBvcnQgamF2YS51dGlsLkxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uU3VwcGxpZXI7CgpjbGFzcyBTaG91bGQgewoKICAgIHN0YXRpYyB2b2lkIGJlRXF1YWwoT2JqZWN0IGV4cGVjdGVkLCBPYmplY3QgZ2l2ZW4pIHsKICAgICAgICBpZiAoIWV4cGVjdGVkLmVxdWFscyhnaXZlbikpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImVxdWFsaXR5IGZhaWxlZC4gZXhwZWN0ZWQgIiArIGV4cGVjdGVkICsgIiwgYnV0IGdpdmVuICIgKyBnaXZlbik7CiAgICAgICAgfQogICAgfQp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpjbGFzcyBBIHsKCiAgICBTdHJpbmcgZGVzY3JpcHRpb24oaW50IHgpIHsKICAgICAgICByZXR1cm4gZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCk7CiAgICB9Cn0KCmNsYXNzIEFTcGVjPFQgZXh0ZW5kcyBBPiB7CgogICAgZmluYWwgdm9pZCBydW5BbGwoQ29sbGVjdGlvbjxTdXBwbGllcjw/IGV4dGVuZHMgVD4+IGltcGxlbWVudGF0aW9ucykgewogICAgICAgIGltcGxlbWVudGF0aW9ucy5mb3JFYWNoKHRoaXM6OnJ1bik7CiAgICB9CgogICAgdm9pZCBydW4oU3VwcGxpZXI8PyBleHRlbmRzIFQ+IGEpIHsKICAgICAgICBzaG91bGRfYmVfQV9vYmplY3RfZGVzY3JpcHRpb25fd2hlbl94X2lzXzQyKGEuZ2V0KCkpOwogICAgfQoKICAgIFN0cmluZyBkZXNjcmlwdGlvbk9mKEEgYSkgewogICAgICAgIHJldHVybiBhLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpOwogICAgfQoKICAgIHZvaWQgc2hvdWxkX2JlX0Ffb2JqZWN0X2Rlc2NyaXB0aW9uX3doZW5feF9pc180MihBIGEpIHsKICAgICAgICBmaW5hbCB2YXIgZXhwZWN0ZWQgPSBkZXNjcmlwdGlvbk9mKGEpOwogICAgICAgIFNob3VsZC5iZUVxdWFsKGV4cGVjdGVkLCBhLmRlc2NyaXB0aW9uKDQyKSk7CiAgICB9Cn0KCmNsYXNzIEIgZXh0ZW5kcyBBIHsKCiAgICBTdHJpbmcgZGVzY3JpcHRpb24oKSB7CiAgICAgICAgcmV0dXJuICJCIjsKICAgIH0KfQoKY2xhc3MgQlNwZWM8VCBleHRlbmRzIEI+IGV4dGVuZHMgQVNwZWM8Qj4gewoKICAgIHZvaWQgcnVuKFN1cHBsaWVyPD8gZXh0ZW5kcyBCPiBiKSB7CiAgICAgICAgc3VwZXIucnVuKGIpOwogICAgICAgIHNob3VsZF9iZV9CX29iamVjdF9kZXNjcmlwdGlvbihiLmdldCgpKTsKICAgIH0KCiAgICBTdHJpbmcgYkRlc2NyaXB0aW9uT2YoQiBiKSB7CiAgICAgICAgcmV0dXJuICJCIjsKICAgIH0KCiAgICB2b2lkIHNob3VsZF9iZV9CX29iamVjdF9kZXNjcmlwdGlvbihCIGIpIHsKICAgICAgICBmaW5hbCB2YXIgZXhwZWN0ZWQgPSBiRGVzY3JpcHRpb25PZihiKTsKICAgICAgICBTaG91bGQuYmVFcXVhbChleHBlY3RlZCwgYi5kZXNjcmlwdGlvbigpKTsKICAgIH0KfQoKZmluYWwgY2xhc3MgSWRlb25lIHsKCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CiAgICAgICAgbmV3IEFTcGVjPD4oKS5ydW5BbGwoTGlzdC5vZihBOjpuZXcsIEI6Om5ldykpOwogICAgICAgIG5ldyBCU3BlYzw+KCkucnVuQWxsKExpc3Qub2YoQjo6bmV3KSk7CiAgICB9Cn0=