diff --git a/error-prone-contrib/src/main/java/tech/picnic/errorprone/bugpatterns/LexicographicalAnnotationListing.java b/error-prone-contrib/src/main/java/tech/picnic/errorprone/bugpatterns/LexicographicalAnnotationListing.java
index 3924d8556b..d608cd79f0 100644
--- a/error-prone-contrib/src/main/java/tech/picnic/errorprone/bugpatterns/LexicographicalAnnotationListing.java
+++ b/error-prone-contrib/src/main/java/tech/picnic/errorprone/bugpatterns/LexicographicalAnnotationListing.java
@@ -36,6 +36,10 @@
*
The idea behind this checker is that maintaining a sorted sequence simplifies conflict
* resolution, and can even avoid it if two branches add the same annotation.
*/
+// XXX: Currently this checker only flags method-level annotations. It should likely also flag
+// type-, field- and parameter-level annotations.
+// XXX: Duplicate entries are often a mistake. Consider introducing a similar `BugChecker` that
+// flags duplicates.
@AutoService(BugChecker.class)
@BugPattern(
summary = "Sort annotations lexicographically where possible",
diff --git a/error-prone-contrib/src/main/java/tech/picnic/errorprone/refasterrules/JUnitToAssertJRules.java b/error-prone-contrib/src/main/java/tech/picnic/errorprone/refasterrules/JUnitToAssertJRules.java
index 7eeda27c3c..23c3bc16d1 100644
--- a/error-prone-contrib/src/main/java/tech/picnic/errorprone/refasterrules/JUnitToAssertJRules.java
+++ b/error-prone-contrib/src/main/java/tech/picnic/errorprone/refasterrules/JUnitToAssertJRules.java
@@ -26,6 +26,7 @@
import org.junit.jupiter.api.function.Executable;
import org.junit.jupiter.api.function.ThrowingSupplier;
import tech.picnic.errorprone.refaster.annotation.OnlineDocumentation;
+import tech.picnic.errorprone.refaster.annotation.TypeMigration;
/**
* Refaster rules to replace JUnit assertions with AssertJ equivalents.
@@ -40,6 +41,264 @@
// `() -> toString()` match both `ThrowingSupplier` and `ThrowingCallable`, but `() -> "constant"`
// is only compatible with the former.
@OnlineDocumentation
+@TypeMigration(
+ of = Assertions.class,
+ unmigratedMethods = {
+ "assertAll(Collection)",
+ "assertAll(Executable[])",
+ "assertAll(Stream)",
+ "assertAll(String, Collection)",
+ "assertAll(String, Executable[])",
+ "assertAll(String, Stream)",
+ "assertArrayEquals(boolean[], boolean[])",
+ "assertArrayEquals(boolean[], boolean[], String)",
+ "assertArrayEquals(boolean[], boolean[], Supplier)",
+ "assertArrayEquals(byte[], byte[])",
+ "assertArrayEquals(byte[], byte[], String)",
+ "assertArrayEquals(byte[], byte[], Supplier)",
+ "assertArrayEquals(char[], char[])",
+ "assertArrayEquals(char[], char[], String)",
+ "assertArrayEquals(char[], char[], Supplier)",
+ "assertArrayEquals(double[], double[])",
+ "assertArrayEquals(double[], double[], double)",
+ "assertArrayEquals(double[], double[], double, String)",
+ "assertArrayEquals(double[], double[], double, Supplier)",
+ "assertArrayEquals(double[], double[], String)",
+ "assertArrayEquals(double[], double[], Supplier)",
+ "assertArrayEquals(float[], float[])",
+ "assertArrayEquals(float[], float[], float)",
+ "assertArrayEquals(float[], float[], float, String)",
+ "assertArrayEquals(float[], float[], float, Supplier)",
+ "assertArrayEquals(float[], float[], String)",
+ "assertArrayEquals(float[], float[], Supplier)",
+ "assertArrayEquals(int[], int[])",
+ "assertArrayEquals(int[], int[], String)",
+ "assertArrayEquals(int[], int[], Supplier)",
+ "assertArrayEquals(long[], long[])",
+ "assertArrayEquals(long[], long[], String)",
+ "assertArrayEquals(long[], long[], Supplier)",
+ "assertArrayEquals(Object[], Object[])",
+ "assertArrayEquals(Object[], Object[], String)",
+ "assertArrayEquals(Object[], Object[], Supplier)",
+ "assertArrayEquals(short[], short[])",
+ "assertArrayEquals(short[], short[], String)",
+ "assertArrayEquals(short[], short[], Supplier)",
+ "assertEquals(Byte, Byte)",
+ "assertEquals(Byte, byte)",
+ "assertEquals(byte, Byte)",
+ "assertEquals(byte, byte)",
+ "assertEquals(Byte, Byte, String)",
+ "assertEquals(Byte, byte, String)",
+ "assertEquals(byte, Byte, String)",
+ "assertEquals(byte, byte, String)",
+ "assertEquals(Byte, Byte, Supplier)",
+ "assertEquals(Byte, byte, Supplier)",
+ "assertEquals(byte, Byte, Supplier)",
+ "assertEquals(byte, byte, Supplier)",
+ "assertEquals(char, char)",
+ "assertEquals(char, char, String)",
+ "assertEquals(char, char, Supplier)",
+ "assertEquals(char, Character)",
+ "assertEquals(char, Character, String)",
+ "assertEquals(char, Character, Supplier)",
+ "assertEquals(Character, char)",
+ "assertEquals(Character, char, String)",
+ "assertEquals(Character, char, Supplier)",
+ "assertEquals(Character, Character)",
+ "assertEquals(Character, Character, String)",
+ "assertEquals(Character, Character, Supplier)",
+ "assertEquals(Double, Double)",
+ "assertEquals(Double, double)",
+ "assertEquals(double, Double)",
+ "assertEquals(double, double)",
+ "assertEquals(double, double, double)",
+ "assertEquals(double, double, double, String)",
+ "assertEquals(double, double, double, Supplier)",
+ "assertEquals(Double, Double, String)",
+ "assertEquals(Double, double, String)",
+ "assertEquals(double, Double, String)",
+ "assertEquals(double, double, String)",
+ "assertEquals(Double, Double, Supplier)",
+ "assertEquals(Double, double, Supplier)",
+ "assertEquals(double, Double, Supplier)",
+ "assertEquals(double, double, Supplier)",
+ "assertEquals(Float, Float)",
+ "assertEquals(Float, float)",
+ "assertEquals(float, Float)",
+ "assertEquals(float, float)",
+ "assertEquals(float, float, float)",
+ "assertEquals(float, float, float, String)",
+ "assertEquals(float, float, float, Supplier)",
+ "assertEquals(Float, Float, String)",
+ "assertEquals(Float, float, String)",
+ "assertEquals(float, Float, String)",
+ "assertEquals(float, float, String)",
+ "assertEquals(Float, Float, Supplier)",
+ "assertEquals(Float, float, Supplier)",
+ "assertEquals(float, Float, Supplier)",
+ "assertEquals(float, float, Supplier)",
+ "assertEquals(int, int)",
+ "assertEquals(int, int, String)",
+ "assertEquals(int, int, Supplier)",
+ "assertEquals(int, Integer)",
+ "assertEquals(int, Integer, String)",
+ "assertEquals(int, Integer, Supplier)",
+ "assertEquals(Integer, int)",
+ "assertEquals(Integer, int, String)",
+ "assertEquals(Integer, int, Supplier)",
+ "assertEquals(Integer, Integer)",
+ "assertEquals(Integer, Integer, String)",
+ "assertEquals(Integer, Integer, Supplier)",
+ "assertEquals(Long, Long)",
+ "assertEquals(Long, long)",
+ "assertEquals(long, Long)",
+ "assertEquals(long, long)",
+ "assertEquals(Long, Long, String)",
+ "assertEquals(Long, long, String)",
+ "assertEquals(long, Long, String)",
+ "assertEquals(long, long, String)",
+ "assertEquals(Long, Long, Supplier)",
+ "assertEquals(Long, long, Supplier)",
+ "assertEquals(long, Long, Supplier)",
+ "assertEquals(long, long, Supplier)",
+ "assertEquals(Object, Object)",
+ "assertEquals(Object, Object, String)",
+ "assertEquals(Object, Object, Supplier)",
+ "assertEquals(Short, Short)",
+ "assertEquals(Short, short)",
+ "assertEquals(short, Short)",
+ "assertEquals(short, short)",
+ "assertEquals(Short, Short, String)",
+ "assertEquals(Short, short, String)",
+ "assertEquals(short, Short, String)",
+ "assertEquals(short, short, String)",
+ "assertEquals(Short, Short, Supplier)",
+ "assertEquals(Short, short, Supplier)",
+ "assertEquals(short, Short, Supplier)",
+ "assertEquals(short, short, Supplier)",
+ "assertFalse(BooleanSupplier)",
+ "assertFalse(BooleanSupplier, String)",
+ "assertFalse(BooleanSupplier, Supplier)",
+ "assertIterableEquals(Iterable>, Iterable>)",
+ "assertIterableEquals(Iterable>, Iterable>, String)",
+ "assertIterableEquals(Iterable>, Iterable>, Supplier)",
+ "assertLinesMatch(List, List)",
+ "assertLinesMatch(List, List, String)",
+ "assertLinesMatch(List, List, Supplier)",
+ "assertLinesMatch(Stream, Stream)",
+ "assertLinesMatch(Stream, Stream, String)",
+ "assertLinesMatch(Stream, Stream, Supplier)",
+ "assertNotEquals(Byte, Byte)",
+ "assertNotEquals(Byte, byte)",
+ "assertNotEquals(byte, Byte)",
+ "assertNotEquals(byte, byte)",
+ "assertNotEquals(Byte, Byte, String)",
+ "assertNotEquals(Byte, byte, String)",
+ "assertNotEquals(byte, Byte, String)",
+ "assertNotEquals(byte, byte, String)",
+ "assertNotEquals(Byte, Byte, Supplier)",
+ "assertNotEquals(Byte, byte, Supplier)",
+ "assertNotEquals(byte, Byte, Supplier)",
+ "assertNotEquals(byte, byte, Supplier)",
+ "assertNotEquals(char, char)",
+ "assertNotEquals(char, char, String)",
+ "assertNotEquals(char, char, Supplier)",
+ "assertNotEquals(char, Character)",
+ "assertNotEquals(char, Character, String)",
+ "assertNotEquals(char, Character, Supplier)",
+ "assertNotEquals(Character, char)",
+ "assertNotEquals(Character, char, String)",
+ "assertNotEquals(Character, char, Supplier)",
+ "assertNotEquals(Character, Character)",
+ "assertNotEquals(Character, Character, String)",
+ "assertNotEquals(Character, Character, Supplier)",
+ "assertNotEquals(Double, Double)",
+ "assertNotEquals(Double, double)",
+ "assertNotEquals(double, Double)",
+ "assertNotEquals(double, double)",
+ "assertNotEquals(double, double, double)",
+ "assertNotEquals(double, double, double, String)",
+ "assertNotEquals(double, double, double, Supplier)",
+ "assertNotEquals(Double, Double, String)",
+ "assertNotEquals(Double, double, String)",
+ "assertNotEquals(double, Double, String)",
+ "assertNotEquals(double, double, String)",
+ "assertNotEquals(Double, Double, Supplier)",
+ "assertNotEquals(Double, double, Supplier)",
+ "assertNotEquals(double, Double, Supplier)",
+ "assertNotEquals(double, double, Supplier)",
+ "assertNotEquals(Float, Float)",
+ "assertNotEquals(Float, float)",
+ "assertNotEquals(float, Float)",
+ "assertNotEquals(float, float)",
+ "assertNotEquals(float, float, float)",
+ "assertNotEquals(float, float, float, String)",
+ "assertNotEquals(float, float, float, Supplier)",
+ "assertNotEquals(Float, Float, String)",
+ "assertNotEquals(Float, float, String)",
+ "assertNotEquals(float, Float, String)",
+ "assertNotEquals(float, float, String)",
+ "assertNotEquals(Float, Float, Supplier)",
+ "assertNotEquals(Float, float, Supplier)",
+ "assertNotEquals(float, Float, Supplier)",
+ "assertNotEquals(float, float, Supplier)",
+ "assertNotEquals(int, int)",
+ "assertNotEquals(int, int, String)",
+ "assertNotEquals(int, int, Supplier)",
+ "assertNotEquals(int, Integer)",
+ "assertNotEquals(int, Integer, String)",
+ "assertNotEquals(int, Integer, Supplier)",
+ "assertNotEquals(Integer, int)",
+ "assertNotEquals(Integer, int, String)",
+ "assertNotEquals(Integer, int, Supplier)",
+ "assertNotEquals(Integer, Integer)",
+ "assertNotEquals(Integer, Integer, String)",
+ "assertNotEquals(Integer, Integer, Supplier)",
+ "assertNotEquals(Long, Long)",
+ "assertNotEquals(Long, long)",
+ "assertNotEquals(long, Long)",
+ "assertNotEquals(long, long)",
+ "assertNotEquals(Long, Long, String)",
+ "assertNotEquals(Long, long, String)",
+ "assertNotEquals(long, Long, String)",
+ "assertNotEquals(long, long, String)",
+ "assertNotEquals(Long, Long, Supplier)",
+ "assertNotEquals(Long, long, Supplier)",
+ "assertNotEquals(long, Long, Supplier)",
+ "assertNotEquals(long, long, Supplier)",
+ "assertNotEquals(Object, Object)",
+ "assertNotEquals(Object, Object, String)",
+ "assertNotEquals(Object, Object, Supplier)",
+ "assertNotEquals(Short, Short)",
+ "assertNotEquals(Short, short)",
+ "assertNotEquals(short, Short)",
+ "assertNotEquals(short, short)",
+ "assertNotEquals(Short, Short, String)",
+ "assertNotEquals(Short, short, String)",
+ "assertNotEquals(short, Short, String)",
+ "assertNotEquals(short, short, String)",
+ "assertNotEquals(Short, Short, Supplier)",
+ "assertNotEquals(Short, short, Supplier)",
+ "assertNotEquals(short, Short, Supplier)",
+ "assertNotEquals(short, short, Supplier)",
+ "assertTimeout(Duration, Executable)",
+ "assertTimeout(Duration, Executable, String)",
+ "assertTimeout(Duration, Executable, Supplier)",
+ "assertTimeout(Duration, ThrowingSupplier)",
+ "assertTimeout(Duration, ThrowingSupplier, String)",
+ "assertTimeout(Duration, ThrowingSupplier, Supplier)",
+ "assertTimeoutPreemptively(Duration, Executable)",
+ "assertTimeoutPreemptively(Duration, Executable, String)",
+ "assertTimeoutPreemptively(Duration, Executable, Supplier)",
+ "assertTimeoutPreemptively(Duration, ThrowingSupplier)",
+ "assertTimeoutPreemptively(Duration, ThrowingSupplier, String)",
+ "assertTimeoutPreemptively(Duration, ThrowingSupplier, Supplier)",
+ "assertTimeoutPreemptively(Duration, ThrowingSupplier, Supplier, TimeoutFailureFactory)",
+ "assertTrue(BooleanSupplier)",
+ "assertTrue(BooleanSupplier, String)",
+ "assertTrue(BooleanSupplier, Supplier)",
+ "fail(Supplier)"
+ })
final class JUnitToAssertJRules {
private JUnitToAssertJRules() {}
diff --git a/error-prone-contrib/src/main/java/tech/picnic/errorprone/refasterrules/TestNGToAssertJRules.java b/error-prone-contrib/src/main/java/tech/picnic/errorprone/refasterrules/TestNGToAssertJRules.java
index 89b0973563..e96628984e 100644
--- a/error-prone-contrib/src/main/java/tech/picnic/errorprone/refasterrules/TestNGToAssertJRules.java
+++ b/error-prone-contrib/src/main/java/tech/picnic/errorprone/refasterrules/TestNGToAssertJRules.java
@@ -29,6 +29,7 @@
import org.testng.Assert;
import org.testng.Assert.ThrowingRunnable;
import tech.picnic.errorprone.refaster.annotation.OnlineDocumentation;
+import tech.picnic.errorprone.refaster.annotation.TypeMigration;
/**
* Refaster rules that replace TestNG assertions with equivalent AssertJ assertions.
@@ -48,32 +49,107 @@
* List