package testlib.lubglb;
// Test case for issues 691 and 756.
// https://github.com/typetools/checker-framework/issues/691
// https://github.com/typetools/checker-framework/issues/756
import javax.lang.model.element.AnnotationMirror;
import javax.lang.model.util.Elements;
import org.checkerframework.checker.formatter.FormatterChecker;
import org.checkerframework.checker.formatter.FormatterTreeUtil;
import org.checkerframework.checker.formatter.qual.ConversionCategory;
import org.checkerframework.checker.formatter.qual.Format;
import org.checkerframework.checker.formatter.qual.FormatBottom;
import org.checkerframework.checker.formatter.qual.InvalidFormat;
import org.checkerframework.checker.formatter.qual.UnknownFormat;
import org.checkerframework.common.basetype.BaseTypeVisitor;
import org.checkerframework.framework.type.QualifierHierarchy;
import org.checkerframework.framework.util.AnnotationBuilder;
import org.checkerframework.javacutil.AnnotationUtils;
/**
* This class tests the implementation of GLB computation in the Formatter Checker, but it does not
* test for the crash described in issue 691. That is done by tests/all-systems/Issue691.java. It
* also tests the implementation of LUB computation in the Formatter Checker.
*/
public class FormatterLubGlbChecker extends FormatterChecker {
@Override
public void initChecker() {
super.initChecker();
FormatterTreeUtil treeUtil = new FormatterTreeUtil(this);
Elements elements = getElementUtils();
AnnotationMirror UNKNOWNFORMAT = AnnotationUtils.fromClass(elements, UnknownFormat.class);
AnnotationMirror FORMAT = AnnotationUtils.fromClass(elements, Format.class);
AnnotationMirror INVALIDFORMAT = AnnotationUtils.fromClass(elements, InvalidFormat.class);
AnnotationMirror FORMATBOTTOM = AnnotationUtils.fromClass(elements, FormatBottom.class);
AnnotationBuilder builder =
new AnnotationBuilder(processingEnv, InvalidFormat.class.getCanonicalName());
builder.setValue("value", "Message");
AnnotationMirror InvalidFormatWithMessage = builder.build();
builder = new AnnotationBuilder(processingEnv, InvalidFormat.class.getCanonicalName());
builder.setValue("value", "Message2");
AnnotationMirror InvalidFormatWithMessage2 = builder.build();
builder = new AnnotationBuilder(processingEnv, InvalidFormat.class.getCanonicalName());
builder.setValue("value", "(\"Message\" or \"Message2\")");
AnnotationMirror InvalidFormatWithMessagesOred = builder.build();
builder = new AnnotationBuilder(processingEnv, InvalidFormat.class.getCanonicalName());
builder.setValue("value", "(\"Message\" and \"Message2\")");
AnnotationMirror InvalidFormatWithMessagesAnded = builder.build();
ConversionCategory[] cc = new ConversionCategory[1];
cc[0] = ConversionCategory.UNUSED;
AnnotationMirror FormatUnusedAnno = treeUtil.categoriesToFormatAnnotation(cc);
cc[0] = ConversionCategory.GENERAL;
AnnotationMirror FormatGeneralAnno = treeUtil.categoriesToFormatAnnotation(cc);
cc[0] = ConversionCategory.CHAR;
AnnotationMirror FormatCharAnno = treeUtil.categoriesToFormatAnnotation(cc);
cc[0] = ConversionCategory.INT;
AnnotationMirror FormatIntAnno = treeUtil.categoriesToFormatAnnotation(cc);
cc[0] = ConversionCategory.TIME;
AnnotationMirror FormatTimeAnno = treeUtil.categoriesToFormatAnnotation(cc);
cc[0] = ConversionCategory.FLOAT;
AnnotationMirror FormatFloatAnno = treeUtil.categoriesToFormatAnnotation(cc);
cc[0] = ConversionCategory.CHAR_AND_INT;
AnnotationMirror FormatCharAndIntAnno = treeUtil.categoriesToFormatAnnotation(cc);
cc[0] = ConversionCategory.INT_AND_TIME;
AnnotationMirror FormatIntAndTimeAnno = treeUtil.categoriesToFormatAnnotation(cc);
cc[0] = ConversionCategory.NULL;
AnnotationMirror FormatNullAnno = treeUtil.categoriesToFormatAnnotation(cc);
QualifierHierarchy qh =
((BaseTypeVisitor<?>) visitor).getTypeFactory().getQualifierHierarchy();
// ** GLB tests **
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatCharAndIntAnno, FormatIntAndTimeAnno),
FormatIntAnno)
: "GLB of @Format(CHAR_AND_INT) and @Format(INT_AND_TIME) is not @Format(INT)!";
// GLB of UNUSED and others
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatUnusedAnno, FormatUnusedAnno), FormatUnusedAnno)
: "GLB of @Format(UNUSED) and @Format(UNUSED) is not @Format(UNUSED)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatUnusedAnno, FormatGeneralAnno),
FormatUnusedAnno)
: "GLB of @Format(UNUSED) and @Format(GENERAL) is not @Format(UNUSED)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatUnusedAnno, FormatCharAnno), FormatUnusedAnno)
: "GLB of @Format(UNUSED) and @Format(CHAR) is not @Format(UNUSED)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatUnusedAnno, FormatIntAnno), FormatUnusedAnno)
: "GLB of @Format(UNUSED) and @Format(INT) is not @Format(UNUSED)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatUnusedAnno, FormatTimeAnno), FormatUnusedAnno)
: "GLB of @Format(UNUSED) and @Format(TIME) is not @Format(UNUSED)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatUnusedAnno, FormatFloatAnno), FormatUnusedAnno)
: "GLB of @Format(UNUSED) and @Format(FLOAT) is not @Format(UNUSED)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatUnusedAnno, FormatCharAndIntAnno),
FormatUnusedAnno)
: "GLB of @Format(UNUSED) and @Format(CHAR_AND_INT) is not @Format(UNUSED)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatUnusedAnno, FormatIntAndTimeAnno),
FormatUnusedAnno)
: "GLB of @Format(UNUSED) and @Format(INT_AND_TIME) is not @Format(UNUSED)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatUnusedAnno, FormatNullAnno), FormatUnusedAnno)
: "GLB of @Format(UNUSED) and @Format(NULL) is not @Format(UNUSED)!";
// GLB of GENERAL and others
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatGeneralAnno, FormatUnusedAnno),
FormatUnusedAnno)
: "GLB of @Format(GENERAL) and @Format(UNUSED) is not @Format(UNUSED)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatGeneralAnno, FormatGeneralAnno),
FormatGeneralAnno)
: "GLB of @Format(GENERAL) and @Format(GENERAL) is not @Format(GENERAL)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatGeneralAnno, FormatCharAnno), FormatGeneralAnno)
: "GLB of @Format(GENERAL) and @Format(CHAR) is not @Format(GENERAL)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatGeneralAnno, FormatIntAnno), FormatGeneralAnno)
: "GLB of @Format(GENERAL) and @Format(INT) is not @Format(GENERAL)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatGeneralAnno, FormatTimeAnno), FormatGeneralAnno)
: "GLB of @Format(GENERAL) and @Format(TIME) is not @Format(GENERAL)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatGeneralAnno, FormatFloatAnno),
FormatGeneralAnno)
: "GLB of @Format(GENERAL) and @Format(FLOAT) is not @Format(GENERAL)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatGeneralAnno, FormatCharAndIntAnno),
FormatGeneralAnno)
: "GLB of @Format(GENERAL) and @Format(CHAR_AND_INT) is not @Format(GENERAL)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatGeneralAnno, FormatIntAndTimeAnno),
FormatGeneralAnno)
: "GLB of @Format(GENERAL) and @Format(INT_AND_TIME) is not @Format(GENERAL)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatGeneralAnno, FormatNullAnno), FormatGeneralAnno)
: "GLB of @Format(GENERAL) and @Format(NULL) is not @Format(GENERAL)!";
// GLB of CHAR and others
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatCharAnno, FormatUnusedAnno), FormatUnusedAnno)
: "GLB of @Format(CHAR) and @Format(UNUSED) is not @Format(UNUSED)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatCharAnno, FormatGeneralAnno), FormatGeneralAnno)
: "GLB of @Format(CHAR) and @Format(GENERAL) is not @Format(GENERAL)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatCharAnno, FormatCharAnno), FormatCharAnno)
: "GLB of @Format(CHAR) and @Format(CHAR) is not @Format(CHAR)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatCharAnno, FormatIntAnno), FormatGeneralAnno)
: "GLB of @Format(CHAR) and @Format(INT) is not @Format(GENERAL)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatCharAnno, FormatTimeAnno), FormatGeneralAnno)
: "GLB of @Format(CHAR) and @Format(TIME) is not @Format(GENERAL)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatCharAnno, FormatFloatAnno), FormatGeneralAnno)
: "GLB of @Format(CHAR) and @Format(FLOAT) is not @Format(GENERAL)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatCharAnno, FormatCharAndIntAnno), FormatCharAnno)
: "GLB of @Format(CHAR) and @Format(CHAR_AND_INT) is not @Format(CHAR)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatCharAnno, FormatIntAndTimeAnno),
FormatGeneralAnno)
: "GLB of @Format(CHAR) and @Format(INT_AND_TIME) is not @Format(GENERAL)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatCharAnno, FormatNullAnno), FormatCharAnno)
: "GLB of @Format(CHAR) and @Format(NULL) is not @Format(CHAR)!";
// GLB of INT and others
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatIntAnno, FormatUnusedAnno), FormatUnusedAnno)
: "GLB of @Format(INT) and @Format(UNUSED) is not @Format(UNUSED)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatIntAnno, FormatGeneralAnno), FormatGeneralAnno)
: "GLB of @Format(INT) and @Format(GENERAL) is not @Format(GENERAL)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatIntAnno, FormatCharAnno), FormatGeneralAnno)
: "GLB of @Format(INT) and @Format(CHAR) is not @Format(GENERAL)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatIntAnno, FormatIntAnno), FormatIntAnno)
: "GLB of @Format(INT) and @Format(INT) is not @Format(INT)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatIntAnno, FormatTimeAnno), FormatGeneralAnno)
: "GLB of @Format(INT) and @Format(TIME) is not @Format(GENERAL)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatIntAnno, FormatFloatAnno), FormatGeneralAnno)
: "GLB of @Format(INT) and @Format(FLOAT) is not @Format(GENERAL)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatIntAnno, FormatCharAndIntAnno), FormatIntAnno)
: "GLB of @Format(INT) and @Format(CHAR_AND_INT) is not @Format(INT)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatIntAnno, FormatIntAndTimeAnno), FormatIntAnno)
: "GLB of @Format(INT) and @Format(INT_AND_TIME) is not @Format(INT)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatIntAnno, FormatNullAnno), FormatIntAnno)
: "GLB of @Format(INT) and @Format(NULL) is not @Format(INT)!";
// GLB of TIME and others
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatTimeAnno, FormatUnusedAnno), FormatUnusedAnno)
: "GLB of @Format(TIME) and @Format(UNUSED) is not @Format(UNUSED)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatTimeAnno, FormatGeneralAnno), FormatGeneralAnno)
: "GLB of @Format(TIME) and @Format(GENERAL) is not @Format(GENERAL)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatTimeAnno, FormatCharAnno), FormatGeneralAnno)
: "GLB of @Format(TIME) and @Format(CHAR) is not @Format(GENERAL)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatTimeAnno, FormatIntAnno), FormatGeneralAnno)
: "GLB of @Format(TIME) and @Format(INT) is not @Format(GENERAL)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatTimeAnno, FormatTimeAnno), FormatTimeAnno)
: "GLB of @Format(TIME) and @Format(TIME) is not @Format(TIME)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatTimeAnno, FormatFloatAnno), FormatGeneralAnno)
: "GLB of @Format(TIME) and @Format(FLOAT) is not @Format(GENERAL)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatTimeAnno, FormatCharAndIntAnno),
FormatGeneralAnno)
: "GLB of @Format(TIME) and @Format(CHAR_AND_INT) is not @Format(GENERAL)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatTimeAnno, FormatIntAndTimeAnno), FormatTimeAnno)
: "GLB of @Format(TIME) and @Format(INT_AND_TIME) is not @Format(TIME)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatTimeAnno, FormatNullAnno), FormatTimeAnno)
: "GLB of @Format(TIME) and @Format(NULL) is not @Format(TIME)!";
// GLB of FLOAT and others
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatFloatAnno, FormatUnusedAnno), FormatUnusedAnno)
: "GLB of @Format(FLOAT) and @Format(UNUSED) is not @Format(UNUSED)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatFloatAnno, FormatGeneralAnno),
FormatGeneralAnno)
: "GLB of @Format(FLOAT) and @Format(GENERAL) is not @Format(GENERAL)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatFloatAnno, FormatCharAnno), FormatGeneralAnno)
: "GLB of @Format(FLOAT) and @Format(CHAR) is not @Format(GENERAL)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatFloatAnno, FormatIntAnno), FormatGeneralAnno)
: "GLB of @Format(FLOAT) and @Format(INT) is not @Format(GENERAL)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatFloatAnno, FormatTimeAnno), FormatGeneralAnno)
: "GLB of @Format(FLOAT) and @Format(TIME) is not @Format(GENERAL)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatFloatAnno, FormatFloatAnno), FormatFloatAnno)
: "GLB of @Format(FLOAT) and @Format(FLOAT) is not @Format(FLOAT)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatFloatAnno, FormatCharAndIntAnno),
FormatGeneralAnno)
: "GLB of @Format(FLOAT) and @Format(CHAR_AND_INT) is not @Format(GENERAL)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatFloatAnno, FormatIntAndTimeAnno),
FormatGeneralAnno)
: "GLB of @Format(FLOAT) and @Format(INT_AND_TIME) is not @Format(GENERAL)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatFloatAnno, FormatNullAnno), FormatFloatAnno)
: "GLB of @Format(FLOAT) and @Format(NULL) is not @Format(FLOAT)!";
// GLB of CHAR_AND_INT and others
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatCharAndIntAnno, FormatUnusedAnno),
FormatUnusedAnno)
: "GLB of @Format(CHAR_AND_INT) and @Format(UNUSED) is not @Format(UNUSED)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatCharAndIntAnno, FormatGeneralAnno),
FormatGeneralAnno)
: "GLB of @Format(CHAR_AND_INT) and @Format(GENERAL) is not @Format(GENERAL)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatCharAndIntAnno, FormatCharAnno), FormatCharAnno)
: "GLB of @Format(CHAR_AND_INT) and @Format(CHAR) is not @Format(CHAR)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatCharAndIntAnno, FormatIntAnno), FormatIntAnno)
: "GLB of @Format(CHAR_AND_INT) and @Format(INT) is not @Format(INT)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatCharAndIntAnno, FormatTimeAnno),
FormatGeneralAnno)
: "GLB of @Format(CHAR_AND_INT) and @Format(TIME) is not @Format(GENERAL)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatCharAndIntAnno, FormatFloatAnno),
FormatGeneralAnno)
: "GLB of @Format(CHAR_AND_INT) and @Format(FLOAT) is not @Format(GENERAL)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatCharAndIntAnno, FormatCharAndIntAnno),
FormatCharAndIntAnno)
: "GLB of @Format(CHAR_AND_INT) and @Format(CHAR_AND_INT) is not @Format(CHAR_AND_INT)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatCharAndIntAnno, FormatIntAndTimeAnno),
FormatIntAnno)
: "GLB of @Format(CHAR_AND_INT) and @Format(INT_AND_TIME) is not @Format(INT)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatCharAndIntAnno, FormatNullAnno),
FormatCharAndIntAnno)
: "GLB of @Format(CHAR_AND_INT) and @Format(NULL) is not @Format(CHAR_AND_INT)!";
// GLB of INT_AND_TIME and others
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatIntAndTimeAnno, FormatUnusedAnno),
FormatUnusedAnno)
: "GLB of @Format(INT_AND_TIME) and @Format(UNUSED) is not @Format(UNUSED)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatIntAndTimeAnno, FormatGeneralAnno),
FormatGeneralAnno)
: "GLB of @Format(INT_AND_TIME) and @Format(GENERAL) is not @Format(GENERAL)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatIntAndTimeAnno, FormatCharAnno),
FormatGeneralAnno)
: "GLB of @Format(INT_AND_TIME) and @Format(CHAR) is not @Format(GENERAL)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatIntAndTimeAnno, FormatIntAnno), FormatIntAnno)
: "GLB of @Format(INT_AND_TIME) and @Format(INT) is not @Format(INT)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatIntAndTimeAnno, FormatTimeAnno), FormatTimeAnno)
: "GLB of @Format(INT_AND_TIME) and @Format(TIME) is not @Format(TIME)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatIntAndTimeAnno, FormatFloatAnno),
FormatGeneralAnno)
: "GLB of @Format(INT_AND_TIME) and @Format(FLOAT) is not @Format(GENERAL)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatIntAndTimeAnno, FormatCharAndIntAnno),
FormatIntAnno)
: "GLB of @Format(INT_AND_TIME) and @Format(CHAR_AND_INT) is not @Format(INT)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatIntAndTimeAnno, FormatIntAndTimeAnno),
FormatIntAndTimeAnno)
: "GLB of @Format(INT_AND_TIME) and @Format(INT_AND_TIME) is not @Format(INT_AND_TIME)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatIntAndTimeAnno, FormatNullAnno),
FormatIntAndTimeAnno)
: "GLB of @Format(INT_AND_TIME) and @Format(NULL) is not @Format(INT_AND_TIME)!";
// GLB of NULL and others
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatNullAnno, FormatUnusedAnno), FormatUnusedAnno)
: "GLB of @Format(NULL) and @Format(UNUSED) is not @Format(UNUSED)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatNullAnno, FormatGeneralAnno), FormatGeneralAnno)
: "GLB of @Format(NULL) and @Format(GENERAL) is not @Format(GENERAL)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatNullAnno, FormatCharAnno), FormatCharAnno)
: "GLB of @Format(NULL) and @Format(CHAR) is not @Format(CHAR)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatNullAnno, FormatIntAnno), FormatIntAnno)
: "GLB of @Format(NULL) and @Format(INT) is not @Format(INT)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatNullAnno, FormatTimeAnno), FormatTimeAnno)
: "GLB of @Format(NULL) and @Format(TIME) is not @Format(TIME)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatNullAnno, FormatFloatAnno), FormatFloatAnno)
: "GLB of @Format(NULL) and @Format(FLOAT) is not @Format(FLOAT)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatNullAnno, FormatCharAndIntAnno),
FormatCharAndIntAnno)
: "GLB of @Format(NULL) and @Format(CHAR_AND_INT) is not @Format(CHAR_AND_INT)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatNullAnno, FormatIntAndTimeAnno),
FormatIntAndTimeAnno)
: "GLB of @Format(NULL) and @Format(INT_AND_TIME) is not @Format(INT_AND_TIME)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatNullAnno, FormatNullAnno), FormatNullAnno)
: "GLB of @Format(NULL) and @Format(NULL) is not @Format(NULL)!";
// Now test with two ConversionCategory at a time:
ConversionCategory[] cc2 = new ConversionCategory[2];
cc2[0] = ConversionCategory.CHAR_AND_INT;
cc2[1] = ConversionCategory.FLOAT;
AnnotationMirror FormatTwoConvCat1 = treeUtil.categoriesToFormatAnnotation(cc2);
cc2[0] = ConversionCategory.INT;
cc2[1] = ConversionCategory.CHAR;
AnnotationMirror FormatTwoConvCat2 = treeUtil.categoriesToFormatAnnotation(cc2);
cc2[0] = ConversionCategory.INT;
cc2[1] = ConversionCategory.GENERAL;
AnnotationMirror FormatTwoConvCat3 = treeUtil.categoriesToFormatAnnotation(cc2);
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatTwoConvCat1, FormatTwoConvCat2),
FormatTwoConvCat3)
: "GLB of @Format([CHAR_AND_INT,FLOAT]) and @Format([INT,CHAR]) is not @Format([INT,GENERAL])!";
// Test that the GLB of two ConversionCategory arrays of different sizes is an array of the smallest size of the two:
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatGeneralAnno, FormatTwoConvCat1),
FormatGeneralAnno)
: "GLB of @I18nFormat(GENERAL) and @I18nFormat([CHAR_AND_INT,FLOAT]) is not @I18nFormat(GENERAL)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatTwoConvCat2, FormatNullAnno), FormatIntAnno)
: "GLB of @I18nFormat([INT,CHAR]) and @I18nFormat(NULL) is not @I18nFormat(INT)!";
// GLB of @UnknownFormat and others
assert AnnotationUtils.areSame(
qh.greatestLowerBound(UNKNOWNFORMAT, UNKNOWNFORMAT), UNKNOWNFORMAT)
: "GLB of @UnknownFormat and @UnknownFormat is not @UnknownFormat!";
assert AnnotationUtils.areSame(qh.greatestLowerBound(UNKNOWNFORMAT, FORMAT), FORMAT)
: "GLB of @UnknownFormat and @Format(null) is not @Format(null)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(UNKNOWNFORMAT, FormatUnusedAnno), FormatUnusedAnno)
: "GLB of @UnknownFormat and @Format(UNUSED) is not @Format(UNUSED)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(UNKNOWNFORMAT, INVALIDFORMAT), INVALIDFORMAT)
: "GLB of @UnknownFormat and @InvalidFormat(null) is not @InvalidFormat(null)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(UNKNOWNFORMAT, InvalidFormatWithMessage),
InvalidFormatWithMessage)
: "GLB of @UnknownFormat and @InvalidFormat(\"Message\") is not @InvalidFormat(\"Message\")!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(UNKNOWNFORMAT, FORMATBOTTOM), FORMATBOTTOM)
: "GLB of @UnknownFormat and @FormatBottom is not @FormatBottom!";
// GLB of @Format(null) and others
assert AnnotationUtils.areSame(qh.greatestLowerBound(FORMAT, UNKNOWNFORMAT), FORMAT)
: "GLB of @Format(null) and @UnknownFormat is not @Format(null)!";
// Computing the GLB of @Format(null) and @Format(null) should never occur in practice. Skipping this case as it causes an expected crash.
// Computing the GLB of @Format(null) and @Format with a value should never occur in practice. Skipping this case as it causes an expected crash.
assert AnnotationUtils.areSame(qh.greatestLowerBound(FORMAT, INVALIDFORMAT), FORMATBOTTOM)
: "GLB of @Format(null) and @InvalidFormat(null) is not @FormatBottom!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FORMAT, InvalidFormatWithMessage), FORMATBOTTOM)
: "GLB of @Format(null) and @InvalidFormat(\"Message\") is not @FormatBottom!";
assert AnnotationUtils.areSame(qh.greatestLowerBound(FORMAT, FORMATBOTTOM), FORMATBOTTOM)
: "GLB of @Format(null) and @FormatBottom is not @FormatBottom!";
// GLB of @Format(UNUSED) and others
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatUnusedAnno, UNKNOWNFORMAT), FormatUnusedAnno)
: "GLB of @Format(UNUSED) and @UnknownFormat is not @Format(UNUSED)!";
// Computing the GLB of @Format with a value and @Format(null) should never occur in practice. Skipping this case as it causes an expected crash.
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatUnusedAnno, FormatUnusedAnno), FormatUnusedAnno)
: "GLB of @Format(UNUSED) and @Format(UNUSED) is not @Format(UNUSED)!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatUnusedAnno, INVALIDFORMAT), FORMATBOTTOM)
: "GLB of @Format(UNUSED) and @InvalidFormat(null) is not @FormatBottom!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatUnusedAnno, InvalidFormatWithMessage),
FORMATBOTTOM)
: "GLB of @Format(UNUSED) and @InvalidFormat(\"Message\") is not @FormatBottom!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FormatUnusedAnno, FORMATBOTTOM), FORMATBOTTOM)
: "GLB of @Format(UNUSED) and @FormatBottom is not @FormatBottom!";
// GLB of @InvalidFormat(null) and others
assert AnnotationUtils.areSame(
qh.greatestLowerBound(INVALIDFORMAT, UNKNOWNFORMAT), INVALIDFORMAT)
: "GLB of @InvalidFormat(null) and @UnknownFormat is not @InvalidFormat(null)!";
assert AnnotationUtils.areSame(qh.greatestLowerBound(INVALIDFORMAT, FORMAT), FORMATBOTTOM)
: "GLB of @InvalidFormat(null) and @Format(null) is not @FormatBottom!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(INVALIDFORMAT, FormatUnusedAnno), FORMATBOTTOM)
: "GLB of @InvalidFormat(null) and @Format(UNUSED) is not @FormatBottom!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(INVALIDFORMAT, FORMATBOTTOM), FORMATBOTTOM)
: "GLB of @InvalidFormat(null) and @FormatBottom is not @FormatBottom!";
// GLB of @InvalidFormat("Message") and others
assert AnnotationUtils.areSame(
qh.greatestLowerBound(InvalidFormatWithMessage, UNKNOWNFORMAT),
InvalidFormatWithMessage)
: "GLB of @InvalidFormat(\"Message\") and @UnknownFormat is not @InvalidFormat(\"Message\")!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(InvalidFormatWithMessage, FORMAT), FORMATBOTTOM)
: "GLB of @InvalidFormat(\"Message\") and @Format(null) is not @FormatBottom!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(InvalidFormatWithMessage, FormatUnusedAnno),
FORMATBOTTOM)
: "GLB of @InvalidFormat(\"Message\") and @Format(UNUSED) is not @FormatBottom!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(InvalidFormatWithMessage, InvalidFormatWithMessage),
InvalidFormatWithMessage)
: "GLB of @InvalidFormat(\"Message\") and @InvalidFormat(\"Message\") is not @InvalidFormat(\"Message\")!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(InvalidFormatWithMessage, InvalidFormatWithMessage2),
InvalidFormatWithMessagesAnded)
: "GLB of @InvalidFormat(\"Message\") and @InvalidFormat(\"Message2\") is not @InvalidFormat(\"(\"Message\" and \"Message2\")\")!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(InvalidFormatWithMessage, FORMATBOTTOM), FORMATBOTTOM)
: "GLB of @InvalidFormat(\"Message\") and @FormatBottom is not @FormatBottom!";
// GLB of @FormatBottom and others
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FORMATBOTTOM, UNKNOWNFORMAT), FORMATBOTTOM)
: "GLB of @FormatBottom and @UnknownFormat is not @FormatBottom!";
assert AnnotationUtils.areSame(qh.greatestLowerBound(FORMATBOTTOM, FORMAT), FORMATBOTTOM)
: "GLB of @FormatBottom and @Format(null) is not @FormatBottom!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FORMATBOTTOM, FormatUnusedAnno), FORMATBOTTOM)
: "GLB of @FormatBottom and @Format(UNUSED) is not @FormatBottom!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FORMATBOTTOM, INVALIDFORMAT), FORMATBOTTOM)
: "GLB of @FormatBottom and @InvalidFormat(null) is not @FormatBottom!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FORMATBOTTOM, InvalidFormatWithMessage), FORMATBOTTOM)
: "GLB of @FormatBottom and @InvalidFormat(\"Message\") is not @FormatBottom!";
assert AnnotationUtils.areSame(
qh.greatestLowerBound(FORMATBOTTOM, FORMATBOTTOM), FORMATBOTTOM)
: "GLB of @FormatBottom and @FormatBottom is not @FormatBottom!";
// ** LUB tests **
// LUB of UNUSED and others
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatUnusedAnno, FormatUnusedAnno), FormatUnusedAnno)
: "LUB of @Format(UNUSED) and @Format(UNUSED) is not @Format(UNUSED)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatUnusedAnno, FormatGeneralAnno), FormatGeneralAnno)
: "LUB of @Format(UNUSED) and @Format(GENERAL) is not @Format(GENERAL)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatUnusedAnno, FormatCharAnno), FormatCharAnno)
: "LUB of @Format(UNUSED) and @Format(CHAR) is not @Format(CHAR)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatUnusedAnno, FormatIntAnno), FormatIntAnno)
: "LUB of @Format(UNUSED) and @Format(INT) is not @Format(INT)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatUnusedAnno, FormatTimeAnno), FormatTimeAnno)
: "LUB of @Format(UNUSED) and @Format(TIME) is not @Format(TIME)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatUnusedAnno, FormatFloatAnno), FormatFloatAnno)
: "LUB of @Format(UNUSED) and @Format(FLOAT) is not @Format(FLOAT)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatUnusedAnno, FormatCharAndIntAnno),
FormatCharAndIntAnno)
: "LUB of @Format(UNUSED) and @Format(CHAR_AND_INT) is not @Format(CHAR_AND_INT)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatUnusedAnno, FormatIntAndTimeAnno),
FormatIntAndTimeAnno)
: "LUB of @Format(UNUSED) and @Format(INT_AND_TIME) is not @Format(INT_AND_TIME)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatUnusedAnno, FormatNullAnno), FormatNullAnno)
: "LUB of @Format(UNUSED) and @Format(NULL) is not @Format(NULL)!";
// LUB of GENERAL and others
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatGeneralAnno, FormatUnusedAnno), FormatGeneralAnno)
: "LUB of @Format(GENERAL) and @Format(UNUSED) is not @Format(GENERAL)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatGeneralAnno, FormatGeneralAnno), FormatGeneralAnno)
: "LUB of @Format(GENERAL) and @Format(GENERAL) is not @Format(GENERAL)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatGeneralAnno, FormatCharAnno), FormatCharAnno)
: "LUB of @Format(GENERAL) and @Format(CHAR) is not @Format(CHAR)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatGeneralAnno, FormatIntAnno), FormatIntAnno)
: "LUB of @Format(GENERAL) and @Format(INT) is not @Format(INT)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatGeneralAnno, FormatTimeAnno), FormatTimeAnno)
: "LUB of @Format(GENERAL) and @Format(TIME) is not @Format(TIME)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatGeneralAnno, FormatFloatAnno), FormatFloatAnno)
: "LUB of @Format(GENERAL) and @Format(FLOAT) is not @Format(FLOAT)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatGeneralAnno, FormatCharAndIntAnno),
FormatCharAndIntAnno)
: "LUB of @Format(GENERAL) and @Format(CHAR_AND_INT) is not @Format(CHAR_AND_INT)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatGeneralAnno, FormatIntAndTimeAnno),
FormatIntAndTimeAnno)
: "LUB of @Format(GENERAL) and @Format(INT_AND_TIME) is not @Format(INT_AND_TIME)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatGeneralAnno, FormatNullAnno), FormatNullAnno)
: "LUB of @Format(GENERAL) and @Format(NULL) is not @Format(NULL)!";
// LUB of CHAR and others
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatCharAnno, FormatUnusedAnno), FormatCharAnno)
: "LUB of @Format(CHAR) and @Format(UNUSED) is not @Format(CHAR)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatCharAnno, FormatGeneralAnno), FormatCharAnno)
: "LUB of @Format(CHAR) and @Format(GENERAL) is not @Format(CHAR)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatCharAnno, FormatCharAnno), FormatCharAnno)
: "LUB of @Format(CHAR) and @Format(CHAR) is not @Format(CHAR)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatCharAnno, FormatIntAnno), FormatCharAndIntAnno)
: "LUB of @Format(CHAR) and @Format(INT) is not @Format(CHAR_AND_INT)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatCharAnno, FormatTimeAnno), FormatNullAnno)
: "LUB of @Format(CHAR) and @Format(TIME) is not @Format(NULL)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatCharAnno, FormatFloatAnno), FormatNullAnno)
: "LUB of @Format(CHAR) and @Format(FLOAT) is not @Format(NULL)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatCharAnno, FormatCharAndIntAnno),
FormatCharAndIntAnno)
: "LUB of @Format(CHAR) and @Format(CHAR_AND_INT) is not @Format(CHAR_AND_INT)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatCharAnno, FormatIntAndTimeAnno), FormatNullAnno)
: "LUB of @Format(CHAR) and @Format(INT_AND_TIME) is not @Format(NULL)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatCharAnno, FormatNullAnno), FormatNullAnno)
: "LUB of @Format(CHAR) and @Format(NULL) is not @Format(NULL)!";
// LUB of INT and others
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatIntAnno, FormatUnusedAnno), FormatIntAnno)
: "LUB of @Format(INT) and @Format(UNUSED) is not @Format(INT)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatIntAnno, FormatGeneralAnno), FormatIntAnno)
: "LUB of @Format(INT) and @Format(GENERAL) is not @Format(INT)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatIntAnno, FormatCharAnno), FormatCharAndIntAnno)
: "LUB of @Format(INT) and @Format(CHAR) is not @Format(CHAR_AND_INT)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatIntAnno, FormatIntAnno), FormatIntAnno)
: "LUB of @Format(INT) and @Format(INT) is not @Format(INT)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatIntAnno, FormatTimeAnno), FormatIntAndTimeAnno)
: "LUB of @Format(INT) and @Format(TIME) is not @Format(INT_AND_TIME)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatIntAnno, FormatFloatAnno), FormatNullAnno)
: "LUB of @Format(INT) and @Format(FLOAT) is not @Format(NULL)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatIntAnno, FormatCharAndIntAnno),
FormatCharAndIntAnno)
: "LUB of @Format(INT) and @Format(CHAR_AND_INT) is not @Format(CHAR_AND_INT)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatIntAnno, FormatIntAndTimeAnno),
FormatIntAndTimeAnno)
: "LUB of @Format(INT) and @Format(INT_AND_TIME) is not @Format(INT_AND_TIME)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatIntAnno, FormatNullAnno), FormatNullAnno)
: "LUB of @Format(INT) and @Format(NULL) is not @Format(NULL)!";
// LUB of TIME and others
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatTimeAnno, FormatUnusedAnno), FormatTimeAnno)
: "LUB of @Format(TIME) and @Format(UNUSED) is not @Format(TIME)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatTimeAnno, FormatGeneralAnno), FormatTimeAnno)
: "LUB of @Format(TIME) and @Format(GENERAL) is not @Format(TIME)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatTimeAnno, FormatCharAnno), FormatNullAnno)
: "LUB of @Format(TIME) and @Format(CHAR) is not @Format(NULL)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatTimeAnno, FormatIntAnno), FormatIntAndTimeAnno)
: "LUB of @Format(TIME) and @Format(INT) is not @Format(INT_AND_TIME)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatTimeAnno, FormatTimeAnno), FormatTimeAnno)
: "LUB of @Format(TIME) and @Format(TIME) is not @Format(TIME)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatTimeAnno, FormatFloatAnno), FormatNullAnno)
: "LUB of @Format(TIME) and @Format(FLOAT) is not @Format(NULL)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatTimeAnno, FormatCharAndIntAnno), FormatNullAnno)
: "LUB of @Format(TIME) and @Format(CHAR_AND_INT) is not @Format(NULL)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatTimeAnno, FormatIntAndTimeAnno),
FormatIntAndTimeAnno)
: "LUB of @Format(TIME) and @Format(INT_AND_TIME) is not @Format(INT_AND_TIME)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatTimeAnno, FormatNullAnno), FormatNullAnno)
: "LUB of @Format(TIME) and @Format(NULL) is not @Format(NULL)!";
// LUB of FLOAT and others
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatFloatAnno, FormatUnusedAnno), FormatFloatAnno)
: "LUB of @Format(FLOAT) and @Format(UNUSED) is not @Format(FLOAT)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatFloatAnno, FormatGeneralAnno), FormatFloatAnno)
: "LUB of @Format(FLOAT) and @Format(GENERAL) is not @Format(FLOAT)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatFloatAnno, FormatCharAnno), FormatNullAnno)
: "LUB of @Format(FLOAT) and @Format(CHAR) is not @Format(NULL)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatFloatAnno, FormatIntAnno), FormatNullAnno)
: "LUB of @Format(FLOAT) and @Format(INT) is not @Format(NULL)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatFloatAnno, FormatTimeAnno), FormatNullAnno)
: "LUB of @Format(FLOAT) and @Format(TIME) is not @Format(NULL)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatFloatAnno, FormatFloatAnno), FormatFloatAnno)
: "LUB of @Format(FLOAT) and @Format(FLOAT) is not @Format(FLOAT)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatFloatAnno, FormatCharAndIntAnno), FormatNullAnno)
: "LUB of @Format(FLOAT) and @Format(CHAR_AND_INT) is not @Format(NULL)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatFloatAnno, FormatIntAndTimeAnno), FormatNullAnno)
: "LUB of @Format(FLOAT) and @Format(INT_AND_TIME) is not @Format(NULL)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatFloatAnno, FormatNullAnno), FormatNullAnno)
: "LUB of @Format(FLOAT) and @Format(NULL) is not @Format(NULL)!";
// LUB of CHAR_AND_INT and others
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatCharAndIntAnno, FormatUnusedAnno),
FormatCharAndIntAnno)
: "LUB of @Format(CHAR_AND_INT) and @Format(UNUSED) is not @Format(CHAR_AND_INT)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatCharAndIntAnno, FormatGeneralAnno),
FormatCharAndIntAnno)
: "LUB of @Format(CHAR_AND_INT) and @Format(GENERAL) is not @Format(CHAR_AND_INT)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatCharAndIntAnno, FormatCharAnno),
FormatCharAndIntAnno)
: "LUB of @Format(CHAR_AND_INT) and @Format(CHAR) is not @Format(CHAR_AND_INT)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatCharAndIntAnno, FormatIntAnno),
FormatCharAndIntAnno)
: "LUB of @Format(CHAR_AND_INT) and @Format(INT) is not @Format(CHAR_AND_INT)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatCharAndIntAnno, FormatTimeAnno), FormatNullAnno)
: "LUB of @Format(CHAR_AND_INT) and @Format(TIME) is not @Format(NULL)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatCharAndIntAnno, FormatFloatAnno), FormatNullAnno)
: "LUB of @Format(CHAR_AND_INT) and @Format(FLOAT) is not @Format(NULL)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatCharAndIntAnno, FormatCharAndIntAnno),
FormatCharAndIntAnno)
: "LUB of @Format(CHAR_AND_INT) and @Format(CHAR_AND_INT) is not @Format(CHAR_AND_INT)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatCharAndIntAnno, FormatIntAndTimeAnno),
FormatNullAnno)
: "LUB of @Format(CHAR_AND_INT) and @Format(INT_AND_TIME) is not @Format(NULL)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatCharAndIntAnno, FormatNullAnno), FormatNullAnno)
: "LUB of @Format(CHAR_AND_INT) and @Format(NULL) is not @Format(NULL)!";
// LUB of INT_AND_TIME and others
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatIntAndTimeAnno, FormatUnusedAnno),
FormatIntAndTimeAnno)
: "LUB of @Format(INT_AND_TIME) and @Format(UNUSED) is not @Format(INT_AND_TIME)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatIntAndTimeAnno, FormatGeneralAnno),
FormatIntAndTimeAnno)
: "LUB of @Format(INT_AND_TIME) and @Format(GENERAL) is not @Format(INT_AND_TIME)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatIntAndTimeAnno, FormatCharAnno), FormatNullAnno)
: "LUB of @Format(INT_AND_TIME) and @Format(CHAR) is not @Format(NULL)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatIntAndTimeAnno, FormatIntAnno),
FormatIntAndTimeAnno)
: "LUB of @Format(INT_AND_TIME) and @Format(INT) is not @Format(INT_AND_TIME)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatIntAndTimeAnno, FormatTimeAnno),
FormatIntAndTimeAnno)
: "LUB of @Format(INT_AND_TIME) and @Format(TIME) is not @Format(INT_AND_TIME)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatIntAndTimeAnno, FormatFloatAnno), FormatNullAnno)
: "LUB of @Format(INT_AND_TIME) and @Format(FLOAT) is not @Format(NULL)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatIntAndTimeAnno, FormatCharAndIntAnno),
FormatNullAnno)
: "LUB of @Format(INT_AND_TIME) and @Format(CHAR_AND_INT) is not @Format(NULL)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatIntAndTimeAnno, FormatIntAndTimeAnno),
FormatIntAndTimeAnno)
: "LUB of @Format(INT_AND_TIME) and @Format(INT_AND_TIME) is not @Format(INT_AND_TIME)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatIntAndTimeAnno, FormatNullAnno), FormatNullAnno)
: "LUB of @Format(INT_AND_TIME) and @Format(NULL) is not @Format(NULL)!";
// LUB of NULL and others
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatNullAnno, FormatUnusedAnno), FormatNullAnno)
: "LUB of @Format(NULL) and @Format(UNUSED) is not @Format(NULL)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatNullAnno, FormatGeneralAnno), FormatNullAnno)
: "LUB of @Format(NULL) and @Format(GENERAL) is not @Format(NULL)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatNullAnno, FormatCharAnno), FormatNullAnno)
: "LUB of @Format(NULL) and @Format(CHAR) is not @Format(NULL)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatNullAnno, FormatIntAnno), FormatNullAnno)
: "LUB of @Format(NULL) and @Format(INT) is not @Format(NULL)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatNullAnno, FormatTimeAnno), FormatNullAnno)
: "LUB of @Format(NULL) and @Format(TIME) is not @Format(NULL)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatNullAnno, FormatFloatAnno), FormatNullAnno)
: "LUB of @Format(NULL) and @Format(FLOAT) is not @Format(NULL)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatNullAnno, FormatCharAndIntAnno), FormatNullAnno)
: "LUB of @Format(NULL) and @Format(CHAR_AND_INT) is not @Format(NULL)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatNullAnno, FormatIntAndTimeAnno), FormatNullAnno)
: "LUB of @Format(NULL) and @Format(INT_AND_TIME) is not @Format(NULL)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatNullAnno, FormatNullAnno), FormatNullAnno)
: "LUB of @Format(NULL) and @Format(NULL) is not @Format(NULL)!";
// Now test with two ConversionCategory at a time:
cc2[0] = ConversionCategory.CHAR_AND_INT;
cc2[1] = ConversionCategory.NULL;
AnnotationMirror FormatTwoConvCat4 = treeUtil.categoriesToFormatAnnotation(cc2);
cc2[0] = ConversionCategory.NULL;
cc2[1] = ConversionCategory.CHAR;
AnnotationMirror FormatTwoConvCat5 = treeUtil.categoriesToFormatAnnotation(cc2);
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatTwoConvCat1, FormatTwoConvCat2), FormatTwoConvCat4)
: "LUB of @Format([CHAR_AND_INT,FLOAT]) and @Format([INT,CHAR]) is not @Format([CHAR_AND_INT,NULL])!";
// Test that the LUB of two ConversionCategory arrays of different sizes is an array of the largest size of the two:
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatGeneralAnno, FormatTwoConvCat1), FormatTwoConvCat1)
: "LUB of @I18nFormat(GENERAL) and @I18nFormat([CHAR_AND_INT,FLOAT]) is not @I18nFormat([CHAR_AND_INT,FLOAT])!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatTwoConvCat2, FormatNullAnno), FormatTwoConvCat5)
: "LUB of @I18nFormat([INT,CHAR]) and @I18nFormat(NULL) is not @I18nFormat([NULL,CHAR])!";
// LUB of @UnknownFormat and others
assert AnnotationUtils.areSame(
qh.leastUpperBound(UNKNOWNFORMAT, UNKNOWNFORMAT), UNKNOWNFORMAT)
: "LUB of @UnknownFormat and @UnknownFormat is not @UnknownFormat!";
assert AnnotationUtils.areSame(qh.leastUpperBound(UNKNOWNFORMAT, FORMAT), UNKNOWNFORMAT)
: "LUB of @UnknownFormat and @Format(null) is not @UnknownFormat!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(UNKNOWNFORMAT, FormatUnusedAnno), UNKNOWNFORMAT)
: "LUB of @UnknownFormat and @Format(UNUSED) is not @UnknownFormat!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(UNKNOWNFORMAT, INVALIDFORMAT), UNKNOWNFORMAT)
: "LUB of @UnknownFormat and @InvalidFormat(null) is not @UnknownFormat!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(UNKNOWNFORMAT, InvalidFormatWithMessage), UNKNOWNFORMAT)
: "LUB of @UnknownFormat and @InvalidFormat(\"Message\") is not @UnknownFormat!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(UNKNOWNFORMAT, FORMATBOTTOM), UNKNOWNFORMAT)
: "LUB of @UnknownFormat and @FormatBottom is not @UnknownFormat!";
// LUB of @Format(null) and others
assert AnnotationUtils.areSame(qh.leastUpperBound(FORMAT, UNKNOWNFORMAT), UNKNOWNFORMAT)
: "LUB of @Format(null) and @UnknownFormat is not @UnknownFormat!";
// Computing the LUB of @Format(null) and @Format(null) should never occur in practice. Skipping this case as it causes an expected crash.
// Computing the LUB of @Format(null) and @Format with a value should never occur in practice. Skipping this case as it causes an expected crash.
assert AnnotationUtils.areSame(qh.leastUpperBound(FORMAT, INVALIDFORMAT), UNKNOWNFORMAT)
: "LUB of @Format(null) and @InvalidFormat(null) is not @UnknownFormat!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FORMAT, InvalidFormatWithMessage), UNKNOWNFORMAT)
: "LUB of @Format(null) and @InvalidFormat(\"Message\") is not @UnknownFormat!";
assert AnnotationUtils.areSame(qh.leastUpperBound(FORMAT, FORMATBOTTOM), FORMAT)
: "LUB of @Format(null) and @FormatBottom is not @Format(null)!";
// LUB of @Format(UNUSED) and others
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatUnusedAnno, UNKNOWNFORMAT), UNKNOWNFORMAT)
: "LUB of @Format(UNUSED) and @UnknownFormat is not @UnknownFormat!";
// Computing the LUB of @Format with a value and @Format(null) should never occur in practice. Skipping this case as it causes an expected crash.
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatUnusedAnno, FormatUnusedAnno), FormatUnusedAnno)
: "LUB of @Format(UNUSED) and @Format(UNUSED) is not @Format(UNUSED)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatUnusedAnno, INVALIDFORMAT), UNKNOWNFORMAT)
: "LUB of @Format(UNUSED) and @InvalidFormat(null) is not @UnknownFormat!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatUnusedAnno, InvalidFormatWithMessage),
UNKNOWNFORMAT)
: "LUB of @Format(UNUSED) and @InvalidFormat(\"Message\") is not @UnknownFormat!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FormatUnusedAnno, FORMATBOTTOM), FormatUnusedAnno)
: "LUB of @Format(UNUSED) and @FormatBottom is not @Format(UNUSED)!";
// LUB of @InvalidFormat(null) and others
assert AnnotationUtils.areSame(
qh.leastUpperBound(INVALIDFORMAT, UNKNOWNFORMAT), UNKNOWNFORMAT)
: "LUB of @InvalidFormat(null) and @UnknownFormat is not @UnknownFormat!";
assert AnnotationUtils.areSame(qh.leastUpperBound(INVALIDFORMAT, FORMAT), UNKNOWNFORMAT)
: "LUB of @InvalidFormat(null) and @Format(null) is not @UnknownFormat!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(INVALIDFORMAT, FormatUnusedAnno), UNKNOWNFORMAT)
: "LUB of @InvalidFormat(null) and @Format(UNUSED) is not @UnknownFormat!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(INVALIDFORMAT, FORMATBOTTOM), INVALIDFORMAT)
: "LUB of @InvalidFormat(null) and @FormatBottom is not @InvalidFormat(null)!";
// LUB of @InvalidFormat("Message") and others
assert AnnotationUtils.areSame(
qh.leastUpperBound(InvalidFormatWithMessage, UNKNOWNFORMAT), UNKNOWNFORMAT)
: "LUB of @InvalidFormat(\"Message\") and @UnknownFormat is not @UnknownFormat!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(InvalidFormatWithMessage, FORMAT), UNKNOWNFORMAT)
: "LUB of @InvalidFormat(\"Message\") and @Format(null) is not @UnknownFormat!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(InvalidFormatWithMessage, FormatUnusedAnno),
UNKNOWNFORMAT)
: "LUB of @InvalidFormat(\"Message\") and @Format(UNUSED) is not @UnknownFormat!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(InvalidFormatWithMessage, InvalidFormatWithMessage),
InvalidFormatWithMessage)
: "LUB of @InvalidFormat(\"Message\") and @InvalidFormat(\"Message\") is not @InvalidFormat(\"Message\")!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(InvalidFormatWithMessage, InvalidFormatWithMessage2),
InvalidFormatWithMessagesOred)
: "LUB of @InvalidFormat(\"Message\") and @InvalidFormat(\"Message2\") is not @InvalidFormat(\"(\"Message\" or \"Message2\")\")!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(InvalidFormatWithMessage, FORMATBOTTOM),
InvalidFormatWithMessage)
: "LUB of @InvalidFormat(\"Message\") and @FormatBottom is not @InvalidFormat(\"Message\")!";
// LUB of @FormatBottom and others
assert AnnotationUtils.areSame(
qh.leastUpperBound(FORMATBOTTOM, UNKNOWNFORMAT), UNKNOWNFORMAT)
: "LUB of @FormatBottom and @UnknownFormat is not @UnknownFormat!";
assert AnnotationUtils.areSame(qh.leastUpperBound(FORMATBOTTOM, FORMAT), FORMAT)
: "LUB of @FormatBottom and @Format(null) is not @Format(null)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FORMATBOTTOM, FormatUnusedAnno), FormatUnusedAnno)
: "LUB of @FormatBottom and @Format(UNUSED) is not @Format(UNUSED)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FORMATBOTTOM, INVALIDFORMAT), INVALIDFORMAT)
: "LUB of @FormatBottom and @InvalidFormat(null) is not @InvalidFormat(null)!";
assert AnnotationUtils.areSame(
qh.leastUpperBound(FORMATBOTTOM, InvalidFormatWithMessage),
InvalidFormatWithMessage)
: "LUB of @FormatBottom and @InvalidFormat(\"Message\") is not @InvalidFormat(\"Message\")!";
assert AnnotationUtils.areSame(qh.leastUpperBound(FORMATBOTTOM, FORMATBOTTOM), FORMATBOTTOM)
: "LUB of @FormatBottom and @FormatBottom is not @FormatBottom!";
}
}