[Test] Migrate tests of foreign annotations to new infrastructure

This commit includes:
- test runners for foreign annotation tests
- minor changes testdata related to changed directives syntax
- dropping tests with javac integration: old javac tests actually ran
    compiler without javac because of bug in configuration, so some
    nullability annotations features are not supported in javac mode.
    It's fine to drop it since javac mode is not fully supported
    by compiler
This commit is contained in:
Dmitriy Novozhilov
2020-12-22 16:08:14 +03:00
committed by TeamCityServer
parent ef3d966d53
commit 660c438ebe
176 changed files with 2451 additions and 2970 deletions
@@ -0,0 +1,81 @@
import org.jspecify.annotations.*;
@DefaultNonNull
public class AnnotatedBoundsOfWildcard {
public void superAsIs(Test<? super @NullnessUnspecified Base, ? super @NullnessUnspecified Base, ? super @NullnessUnspecified Base> a) {}
public void superNotNull(Test<? super Base, ? super Base, ? super Base> a) {}
public void superNullable(Test<? super @Nullable Base, ? super @Nullable Base, ? super @Nullable Base> a) {}
public void extendsAsIs(Test<? extends @NullnessUnspecified Base, ? extends @NullnessUnspecified Base, ? extends @NullnessUnspecified Base> a) {}
public void extendsNotNull(Test<? extends Base, ? extends Base, ? extends Base> a) {}
public void extendsNullable(Test<? extends @Nullable Base, ? extends @Nullable Base, ? extends @Nullable Base> a) {}
public void noBounds(Test<@NullnessUnspecified ?, @NullnessUnspecified ?, @NullnessUnspecified ?> a) {}
}
class Base {}
class Derived extends Base {}
@DefaultNonNull
class Test<T extends Object, E extends @Nullable Object, F extends @NullnessUnspecified Object> { }
@DefaultNonNull
class Use {
public void main(
Test<Derived, Derived, Derived> aNotNullNotNullNotNull,
Test<Derived, Derived, @Nullable Derived> aNotNullNotNullNull,
Test<Derived, @Nullable Derived, Derived> aNotNullNullNotNull,
Test<Derived, @Nullable Derived, @Nullable Derived> aNotNullNullNull,
Test<Object, Object, Object> aObjectNotNullNotNullNotNull,
Test<Object, Object, @Nullable Object> aObjectNotNullNotNullNull,
Test<Object, @Nullable Object, Object> aObjectNotNullNullNotNull,
Test<Object, @Nullable Object, @Nullable Object> aObjectNotNullNullNull,
AnnotatedBoundsOfWildcard b
) {
// jspecify_nullness_mismatch
b.superAsIs(aObjectNotNullNotNullNotNull);
// jspecify_nullness_mismatch
b.superAsIs(aObjectNotNullNotNullNull);
b.superAsIs(aObjectNotNullNullNotNull);
b.superAsIs(aObjectNotNullNullNull);
b.superNotNull(aObjectNotNullNotNullNotNull);
b.superNotNull(aObjectNotNullNotNullNull);
b.superNotNull(aObjectNotNullNullNotNull);
b.superNotNull(aObjectNotNullNullNull);
// jspecify_nullness_mismatch
b.superNullable(aObjectNotNullNotNullNotNull);
// jspecify_nullness_mismatch
b.superNullable(aObjectNotNullNotNullNull);
// jspecify_nullness_mismatch
b.superNullable(aObjectNotNullNullNotNull);
// jspecify_nullness_mismatch
b.superNullable(aObjectNotNullNullNull);
b.extendsAsIs(aNotNullNotNullNotNull);
b.extendsAsIs(aNotNullNotNullNull);
b.extendsAsIs(aNotNullNullNotNull);
b.extendsAsIs(aNotNullNullNull);
b.extendsNotNull(aNotNullNotNullNotNull);
// jspecify_nullness_mismatch
b.extendsNotNull(aNotNullNotNullNull);
// jspecify_nullness_mismatch
b.extendsNotNull(aNotNullNullNotNull);
// jspecify_nullness_mismatch
b.extendsNotNull(aNotNullNullNull);
b.extendsNullable(aNotNullNotNullNotNull);
b.extendsNullable(aNotNullNotNullNull);
b.extendsNullable(aNotNullNullNotNull);
b.extendsNullable(aNotNullNullNull);
b.noBounds(aNotNullNotNullNotNull);
b.noBounds(aNotNullNotNullNull);
b.noBounds(aNotNullNullNotNull);
b.noBounds(aNotNullNullNull);
}
}
@@ -0,0 +1,44 @@
import org.jspecify.annotations.*;
@DefaultNonNull
public class Defaults {
public Foo defaultField = null;
@Nullable public Foo field = null;
public Foo everythingNotNullable(Foo x) { return null; }
public @Nullable Foo everythingNullable(@Nullable Foo x) { return null; }
public @NullnessUnspecified Foo everythingUnknown(@NullnessUnspecified Foo x) { return null; }
public @Nullable Foo mixed(Foo x) { return null; }
public Foo explicitlyNullnessUnspecified(@NullnessUnspecified Foo x) { return null; }
}
class Foo {
public Object foo() { return null; }
}
class Use {
static void main(Defaults a, Foo x) {
// jspecify_nullness_mismatch
a.everythingNotNullable(null).foo();
a.everythingNotNullable(x).foo();
a.everythingNullable(null).foo();
a.everythingUnknown(null).foo();
// jspecify_nullness_mismatch
a.mixed(null).foo();
a.mixed(x).foo();
a.explicitlyNullnessUnspecified(x).foo();
a.explicitlyNullnessUnspecified(null).foo();
a.defaultField.foo();
a.field.foo();
}
}
@@ -0,0 +1,41 @@
import org.jspecify.annotations.*;
@DefaultNonNull
public class IgnoreAnnotations {
@Nullable public Derived field = null;
@Nullable
public Derived foo(Derived x, @NullnessUnspecified Base y) {
return null;
}
public Derived everythingNotNullable(Derived x) { return null; }
public @Nullable Derived everythingNullable(@Nullable Derived x) { return null; }
public @NullnessUnspecified Derived everythingUnknown(@NullnessUnspecified Derived x) { return null; }
}
class Base {
void foo() {}
}
class Derived extends Base { }
class Use {
static void main(IgnoreAnnotations a, Derived x) {
a.foo(x, null).foo();
// jspecify_nullness_mismatch
a.foo(null, x).foo();
a.field.foo();
// jspecify_nullness_mismatch
a.everythingNotNullable(null).foo();
a.everythingNotNullable(x).foo();
a.everythingNullable(null).foo();
a.everythingUnknown(null).foo();
}
}
@@ -0,0 +1,26 @@
import org.jspecify.annotations.*;
public class NonPlatformTypeParameter<T extends @Nullable Object> {
public void foo(T t) {}
public <E extends @Nullable Object> void bar(E e) {}
}
class Test {}
@DefaultNonNull
class Use {
public <T extends Test> void main(NonPlatformTypeParameter<@Nullable Object> a1, NonPlatformTypeParameter<Test> a2, T x) {
a1.foo(null);
a1.<@Nullable Test>bar(null);
// jspecify_nullness_mismatch
a1.<T>bar(null);
a1.<T>bar(x);
// jspecify_nullness_mismatch
a2.foo(null);
a2.<@Nullable Test>bar(null);
// jspecify_nullness_mismatch
a2.<T>bar(null);
a2.<T>bar(x);
}
}
@@ -0,0 +1,30 @@
import org.jspecify.annotations.*;
@DefaultNonNull
public class NullnessUnspecifiedTypeParameter<T> {
public void foo(T t) {}
public void bar(Test s, T t) {} // t should not become not nullable
}
class Test {}
class Use {
void main(NullnessUnspecifiedTypeParameter<Object> a1, NullnessUnspecifiedTypeParameter<@Nullable Object> a2, Test x) {
a1.foo(null);
a1.foo(1);
a2.foo(null);
a2.foo(1);
// jspecify_nullness_mismatch
a1.bar(null, null);
a1.bar(x, null);
a1.bar(x, 1);
// jspecify_nullness_mismatch
a2.bar(null, null);
a2.bar(x, null);
a2.bar(x, 1);
}
}
@@ -0,0 +1,40 @@
import org.jspecify.annotations.*;
@DefaultNotNull
public class SelfType<T extends SelfType<T>> {
public void foo(T t) {}
}
class B extends SelfType<B> {}
@DefaultNotNull
class C<E extends C<E>> extends SelfType<E> {}
class AK extends SelfType<AK> {}
class AKN extends SelfType<@Nullable AK> {}
class BK extends B {}
class CK extends C<CK> {}
class CKN extends C<@Nullable CK> {
public void main(AK ak, AKN akn, BK bk, CK ck, CKN ckn) {
ak.foo(ak);
// jspecify_nullness_mismatch
ak.foo(null);
// jspecify_nullness_mismatch
akn.foo(null);
bk.foo(bk);
// jspecify_nullness_mismatch
bk.foo(null);
ck.foo(ck);
// jspecify_nullness_mismatch
ck.foo(null);
// jspecify_nullness_mismatch
ckn.foo(null);
}
}
@@ -0,0 +1,33 @@
import org.jspecify.annotations.*;
@DefaultNonNull
public class Simple {
@Nullable public Derived field = null;
@Nullable
public Derived foo(Derived x, @NullnessUnspecified Base y) {
return null;
}
public Derived bar() {
return null;
}
}
class Base {}
class Derived extends Base {
void foo() {}
}
@DefaultNonNull
class Use {
static public void main(Simple a, Derived x) {
a.foo(x, null).foo();
// jspecify_nullness_mismatch
a.foo(null, x).foo();
a.bar().foo();
a.field.foo();
}
}
@@ -0,0 +1,53 @@
import org.jspecify.annotations.*;
@DefaultNonNull
public class TypeArgumentsFromParameterBounds<T extends Object, E extends @Nullable Object, F extends @NullnessUnspecified Object> { }
class A {
public void bar(TypeArgumentsFromParameterBounds<@Nullable Test, @Nullable Test, @Nullable Test> a) {}
}
@DefaultNonNull
class B {
public void bar(TypeArgumentsFromParameterBounds<Test, Test, Test> a) {}
}
class C {
public void bar(TypeArgumentsFromParameterBounds<Test, Test, Test> a) {}
}
class Test {}
@DefaultNonNull
class Use {
static public void main(
TypeArgumentsFromParameterBounds<Test, Test, Test> aNotNullNotNullNotNull,
TypeArgumentsFromParameterBounds<Test, Test, @Nullable Test> aNotNullNotNullNull,
TypeArgumentsFromParameterBounds<Test, @Nullable Test, Test> aNotNullNullNotNull,
TypeArgumentsFromParameterBounds<Test, @Nullable Test, @Nullable Test> aNotNullNullNull,
A a, B b, C c
) {
// jspecify_nullness_mismatch
a.bar(aNotNullNotNullNotNull);
// jspecify_nullness_mismatch
a.bar(aNotNullNotNullNull);
// jspecify_nullness_mismatch
a.bar(aNotNullNullNotNull);
a.bar(aNotNullNullNull);
b.bar(aNotNullNotNullNotNull);
// jspecify_nullness_mismatch
b.bar(aNotNullNotNullNull);
// jspecify_nullness_mismatch
b.bar(aNotNullNullNotNull);
// jspecify_nullness_mismatch
b.bar(aNotNullNullNull);
// jspecify_nullness_mismatch
c.bar(aNotNullNotNullNotNull);
// jspecify_nullness_mismatch
c.bar(aNotNullNotNullNull);
c.bar(aNotNullNullNotNull);
c.bar(aNotNullNullNull);
}
}
@@ -0,0 +1,44 @@
import org.jspecify.annotations.*;
@DefaultNonNull
class A<T> {
public void foo(@NullnessUnspecified T t) {}
public <E> void bar(E e) {}
}
@DefaultNonNull
class B<T> {
public void foo(T t) {}
public <E> void bar(E e) {}
}
class Test {}
@DefaultNonNull
public class TypeParameterBounds {
<T extends Test> void main(A<@Nullable Object> a1, A<Test> a2, B<@Nullable Object> b1, B<Test> b2, T x) {
// jspecify_nullness_mismatch
a1.foo(null);
// jspecify_nullness_mismatch
a1.<@Nullable T>bar(null);
a1.<T>bar(x);
// jspecify_nullness_mismatch
a2.foo(null);
// jspecify_nullness_mismatch
a2.<@Nullable T>bar(null);
a2.<T>bar(x);
// jspecify_nullness_mismatch
b1.foo(null);
// jspecify_nullness_mismatch
b1.<@Nullable T>bar(null);
b1.<T>bar(x);
// jspecify_nullness_mismatch
b2.foo(null);
// jspecify_nullness_mismatch
b2.<@Nullable T>bar(null);
b2.<T>bar(x);
}
}
@@ -0,0 +1,33 @@
import org.jspecify.annotations.*;
@DefaultNonNull
public class WildcardsWithDefault {
public void noBoundsNotNull(A<?, ?, ?> a) {}
public void noBoundsNullable(A<@Nullable ?, @Nullable ?, @Nullable ?> a) {}
}
class A <T extends Object, E extends @Nullable Object, F extends @NullnessUnspecified Object> {}
@DefaultNonNull
class Use {
public static void main(
A<Object, Object, Object> aNotNullNotNullNotNull,
A<Object, Object, @Nullable Object> aNotNullNotNullNull,
A<Object, @Nullable Object, Object> aNotNullNullNotNull,
A<Object, @Nullable Object, @Nullable Object> aNotNullNullNull,
WildcardsWithDefault b
) {
// jspecify_nullness_mismatch
b.noBoundsNotNull(aNotNullNotNullNotNull);
b.noBoundsNotNull(aNotNullNotNullNull);
// jspecify_nullness_mismatch
b.noBoundsNotNull(aNotNullNullNotNull);
// jspecify_nullness_mismatch
b.noBoundsNotNull(aNotNullNullNull);
b.noBoundsNullable(aNotNullNotNullNotNull);
b.noBoundsNullable(aNotNullNotNullNull);
b.noBoundsNullable(aNotNullNullNotNull);
b.noBoundsNullable(aNotNullNullNull);
}
}