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 "A";
}
}
class ASpec {
void runAll(Collection<Supplier<? extends A>> implementations) {
implementations.forEach(this::run);
}
void run(Supplier<? extends A> impl) {
should_be_A_object_description(impl.get());
}
private String descriptionOf
(A a
) { return a.getClass().getSimpleName();
}
void should_be_A_object_description(A a) {
final var expected = descriptionOf(a);
Should.beEqual(expected, a.description());
}
}
class B extends A {
return "B";
}
}
class Ideone {
public static void main
(String[] args
) { new ASpec
().
runAll(List.
of(A
::new, B
::new)); }
}
aW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwppbXBvcnQgamF2YS51dGlsLkxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uU3VwcGxpZXI7CgpjbGFzcyBTaG91bGQgewoKICAgIHN0YXRpYyB2b2lkIGJlRXF1YWwoT2JqZWN0IGV4cGVjdGVkLCBPYmplY3QgZ2l2ZW4pIHsKICAgICAgICBpZiAoIWV4cGVjdGVkLmVxdWFscyhnaXZlbikpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImVxdWFsaXR5IGZhaWxlZC4gZXhwZWN0ZWQgIiArIGV4cGVjdGVkICsgIiwgYnV0IGdpdmVuICIgKyBnaXZlbik7CiAgICAgICAgfQogICAgfQp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpjbGFzcyBBIHsKCiAgICBTdHJpbmcgZGVzY3JpcHRpb24oKSB7CiAgICAgICAgcmV0dXJuICJBIjsKICAgIH0KfQoKY2xhc3MgQVNwZWMgewoKICAgIHZvaWQgcnVuQWxsKENvbGxlY3Rpb248U3VwcGxpZXI8PyBleHRlbmRzIEE+PiBpbXBsZW1lbnRhdGlvbnMpIHsKICAgICAgICBpbXBsZW1lbnRhdGlvbnMuZm9yRWFjaCh0aGlzOjpydW4pOwogICAgfQoKICAgIHZvaWQgcnVuKFN1cHBsaWVyPD8gZXh0ZW5kcyBBPiBpbXBsKSB7CiAgICAgICAgc2hvdWxkX2JlX0Ffb2JqZWN0X2Rlc2NyaXB0aW9uKGltcGwuZ2V0KCkpOwogICAgfQoKICAgIHByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uT2YoQSBhKSB7CiAgICAgICAgcmV0dXJuIGEuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCk7CiAgICB9CgogICAgdm9pZCBzaG91bGRfYmVfQV9vYmplY3RfZGVzY3JpcHRpb24oQSBhKSB7CiAgICAgICAgZmluYWwgdmFyIGV4cGVjdGVkID0gZGVzY3JpcHRpb25PZihhKTsKICAgICAgICBTaG91bGQuYmVFcXVhbChleHBlY3RlZCwgYS5kZXNjcmlwdGlvbigpKTsKICAgIH0KfQoKY2xhc3MgQiBleHRlbmRzIEEgewoKICAgIFN0cmluZyBkZXNjcmlwdGlvbigpIHsKICAgICAgICByZXR1cm4gIkIiOwogICAgfQp9CgpjbGFzcyBJZGVvbmUgewoKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKICAgICAgICBuZXcgQVNwZWMoKS5ydW5BbGwoTGlzdC5vZihBOjpuZXcsIEI6Om5ldykpOwogICAgfQp9