From df7e7660b1b303a2b8d130041be56cbd31746b69 Mon Sep 17 00:00:00 2001 From: Brayan Oliveira <69634269+BrayanDSO@users.noreply.github.com> Date: Sun, 1 May 2022 14:39:18 -0300 Subject: [PATCH] Use JUnit5 on tests 1. Extract JUnit version to a constant, so all 3 testImplementations uses the same version 2. Add JUnitPlatform use to `build.gradle` 3. Fix imports to `kotlin.test.junit5.JUnit5Asserter` 4. Fix `AbstractFlashcardViewerTest.getSignalFromUrlTest` - It is currently the only parameterized test that uses jupiter-params. It wasn't being discovered before, so it haven't raised any exception. - Now that it's discovered, it needed to be fixed --- AnkiDroid/build.gradle | 12 ++++-- .../ichi2/anki/AbstractFlashcardViewerTest.kt | 41 +++++++++---------- .../com/ichi2/anki/BackupManagerSimpleTest.kt | 6 +-- .../com/ichi2/anki/CardTemplateEditorTest.kt | 10 ++--- .../test/java/com/ichi2/anki/ReviewerTest.kt | 4 +- .../java/com/ichi2/anki/TemporaryModelTest.kt | 2 +- .../anki/cardviewer/CardAppearanceTest.kt | 2 +- .../java/com/ichi2/testutils/AnkiAssertKt.kt | 4 +- .../java/com/ichi2/utils/StringUtilTest.kt | 2 +- build.gradle | 1 + .../lint/rules/JUnitNullAssertionDetector.kt | 2 +- 11 files changed, 46 insertions(+), 40 deletions(-) diff --git a/AnkiDroid/build.gradle b/AnkiDroid/build.gradle index 89d816e9447c..d534eb31480a 100644 --- a/AnkiDroid/build.gradle +++ b/AnkiDroid/build.gradle @@ -1,5 +1,5 @@ plugins { - // Gradle plugin portal + // Gradle plugin portal id 'com.github.triplet.play' version '3.7.0' } @@ -70,6 +70,11 @@ android { keyPassword System.getenv("KEYPWD") } } + testOptions { + unitTests.all { + useJUnitPlatform() + } + } buildTypes { debug { debuggable true @@ -278,7 +283,8 @@ dependencies { // A path for a testing library is typically under rsdroid-testing/assets testImplementation "io.github.david-allison-1:anki-android-backend-testing:$ankidroid_backend_version" // A path for a testing library which provide Parameterized Test - testImplementation "org.junit.jupiter:junit-jupiter-params:5.7.2" + testImplementation "org.junit.jupiter:junit-jupiter:$junit_version" + testImplementation "org.junit.jupiter:junit-jupiter-params:$junit_version" // May need a resolution strategy for support libs to our versions implementation "ch.acra:acra-http:$acra_version" @@ -310,7 +316,7 @@ dependencies { api project(":api") - testImplementation 'org.junit.vintage:junit-vintage-engine:5.8.2' + testImplementation "org.junit.vintage:junit-vintage-engine:$junit_version" testImplementation 'org.mockito:mockito-inline:4.5.1' testImplementation "org.mockito.kotlin:mockito-kotlin:4.0.0" testImplementation "org.hamcrest:hamcrest:$hamcrest_version" diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/AbstractFlashcardViewerTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/AbstractFlashcardViewerTest.kt index a127e0145f2d..df1016bba2e3 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/AbstractFlashcardViewerTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/AbstractFlashcardViewerTest.kt @@ -17,19 +17,20 @@ import com.ichi2.anki.AbstractFlashcardViewer.WebViewSignalParserUtils.RELINQUIS import com.ichi2.anki.AbstractFlashcardViewer.WebViewSignalParserUtils.SHOW_ANSWER import com.ichi2.anki.AbstractFlashcardViewer.WebViewSignalParserUtils.SIGNAL_NOOP import com.ichi2.anki.AbstractFlashcardViewer.WebViewSignalParserUtils.TYPE_FOCUS +import com.ichi2.anki.AbstractFlashcardViewer.WebViewSignalParserUtils.getSignalFromUrl import com.ichi2.anki.cardviewer.ViewerCommand import com.ichi2.anki.reviewer.AutomaticAnswer import com.ichi2.anki.reviewer.AutomaticAnswerAction import com.ichi2.anki.reviewer.AutomaticAnswerSettings import com.ichi2.anki.servicelayer.LanguageHintService import com.ichi2.libanki.StdModels -import com.ichi2.libanki.Tuple import com.ichi2.testutils.AnkiAssert.assertDoesNotThrow import org.hamcrest.MatcherAssert.assertThat import org.hamcrest.Matchers.* import org.junit.Assert.* import org.junit.Test import org.junit.jupiter.params.ParameterizedTest +import org.junit.jupiter.params.provider.Arguments import org.junit.jupiter.params.provider.MethodSource import org.junit.runner.RunWith import org.mockito.Mockito.* @@ -72,27 +73,10 @@ class AbstractFlashcardViewerTest : RobolectricTest() { } } - /*** - * @param testcase A tuple with string and int as a testcase. The string is the input url and - * the int is the actual answer. - */ @ParameterizedTest - @MethodSource("testcaseProvider") - fun getSignalFromUrlTest(testcase: Tuple) { - assertEquals(testcase.first, testcase.second) - } - - fun testcaseProvider(): Stream> { - return Stream.of( - Tuple("signal:show_answer", SHOW_ANSWER), - Tuple("signal:typefocus", TYPE_FOCUS), - Tuple("signal:relinquishFocus", RELINQUISH_FOCUS), - Tuple("signal:answer_ease1", ANSWER_ORDINAL_1), - Tuple("signal:answer_ease2", ANSWER_ORDINAL_2), - Tuple("signal:answer_ease3", ANSWER_ORDINAL_3), - Tuple("signal:answer_ease4", ANSWER_ORDINAL_4), - Tuple("signal:answer_ease0", SIGNAL_NOOP) - ) + @MethodSource("getSignalFromUrlTest_args") + fun getSignalFromUrlTest(url: String, signal: Int) { + assertEquals(getSignalFromUrl(url), signal) } @Test @@ -268,4 +252,19 @@ class AbstractFlashcardViewerTest : RobolectricTest() { advanceRobolectricLooperWithSleep() return multimediaController } + companion object { + @JvmStatic + fun getSignalFromUrlTest_args(): Stream { + return Stream.of( + Arguments.of("signal:show_answer", SHOW_ANSWER), + Arguments.of("signal:typefocus", TYPE_FOCUS), + Arguments.of("signal:relinquishFocus", RELINQUISH_FOCUS), + Arguments.of("signal:answer_ease1", ANSWER_ORDINAL_1), + Arguments.of("signal:answer_ease2", ANSWER_ORDINAL_2), + Arguments.of("signal:answer_ease3", ANSWER_ORDINAL_3), + Arguments.of("signal:answer_ease4", ANSWER_ORDINAL_4), + Arguments.of("signal:answer_ease0", SIGNAL_NOOP) + ) + } + } } diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/BackupManagerSimpleTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/BackupManagerSimpleTest.kt index 7174f4305851..65713aa85824 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/BackupManagerSimpleTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/BackupManagerSimpleTest.kt @@ -29,9 +29,9 @@ import java.io.File import kotlin.test.assertEquals import kotlin.test.assertNotNull import kotlin.test.assertNull -import kotlin.test.junit.JUnitAsserter.assertEquals -import kotlin.test.junit.JUnitAsserter.assertNotNull -import kotlin.test.junit.JUnitAsserter.assertNull +import kotlin.test.junit5.JUnit5Asserter.assertEquals +import kotlin.test.junit5.JUnit5Asserter.assertNotNull +import kotlin.test.junit5.JUnit5Asserter.assertNull /** * Test for [BackupManager] without [RobolectricTest]. For performance diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/CardTemplateEditorTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/CardTemplateEditorTest.kt index fda83c759de1..20103679fea1 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/CardTemplateEditorTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/CardTemplateEditorTest.kt @@ -34,11 +34,11 @@ import org.robolectric.Robolectric import org.robolectric.Shadows.shadowOf import org.robolectric.shadows.ShadowActivity import timber.log.Timber -import kotlin.test.junit.JUnitAsserter.assertEquals -import kotlin.test.junit.JUnitAsserter.assertNotEquals -import kotlin.test.junit.JUnitAsserter.assertNotNull -import kotlin.test.junit.JUnitAsserter.assertNull -import kotlin.test.junit.JUnitAsserter.assertTrue +import kotlin.test.junit5.JUnit5Asserter.assertEquals +import kotlin.test.junit5.JUnit5Asserter.assertNotEquals +import kotlin.test.junit5.JUnit5Asserter.assertNotNull +import kotlin.test.junit5.JUnit5Asserter.assertNull +import kotlin.test.junit5.JUnit5Asserter.assertTrue @RunWith(AndroidJUnit4::class) class CardTemplateEditorTest : RobolectricTest() { diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/ReviewerTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/ReviewerTest.kt index acfd67ca78bc..205106bb8f28 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/ReviewerTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/ReviewerTest.kt @@ -41,8 +41,8 @@ import org.junit.runner.RunWith import org.robolectric.ParameterizedRobolectricTestRunner import timber.log.Timber import java.util.* -import kotlin.test.junit.JUnitAsserter.assertNotNull -import kotlin.test.junit.JUnitAsserter.assertNull +import kotlin.test.junit5.JUnit5Asserter.assertNotNull +import kotlin.test.junit5.JUnit5Asserter.assertNull @KotlinCleanup("`is` -> equalTo()") @KotlinCleanup("redundant `val col = col`") diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/TemporaryModelTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/TemporaryModelTest.kt index 53967f952f24..e93fe5d0be0c 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/TemporaryModelTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/TemporaryModelTest.kt @@ -26,7 +26,7 @@ import org.junit.runner.RunWith import timber.log.Timber import java.io.IOException import java.io.Serializable -import kotlin.test.junit.JUnitAsserter.assertNotNull +import kotlin.test.junit5.JUnit5Asserter.assertNotNull @RunWith(AndroidJUnit4::class) class TemporaryModelTest : RobolectricTest() { diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/cardviewer/CardAppearanceTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/cardviewer/CardAppearanceTest.kt index 0900a3e6f8d6..662dd2b99114 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/cardviewer/CardAppearanceTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/cardviewer/CardAppearanceTest.kt @@ -23,7 +23,7 @@ import org.junit.Test import org.mockito.Mockito import org.mockito.kotlin.doReturn import org.mockito.kotlin.whenever -import kotlin.test.junit.JUnitAsserter.assertTrue +import kotlin.test.junit5.JUnit5Asserter.assertTrue class CardAppearanceTest { diff --git a/AnkiDroid/src/test/java/com/ichi2/testutils/AnkiAssertKt.kt b/AnkiDroid/src/test/java/com/ichi2/testutils/AnkiAssertKt.kt index 5e79425ca0b5..4b9814a20a34 100644 --- a/AnkiDroid/src/test/java/com/ichi2/testutils/AnkiAssertKt.kt +++ b/AnkiDroid/src/test/java/com/ichi2/testutils/AnkiAssertKt.kt @@ -17,7 +17,7 @@ package com.ichi2.testutils import org.junit.Assert -import kotlin.test.junit.JUnitAsserter +import kotlin.test.junit5.JUnit5Asserter /** assertThrows, allowing for lambda shorthand * @@ -64,5 +64,5 @@ fun assertFalse(message: String? = null, actual: Boolean) { // This exists in JUnit, but we want to avoid JUnit as their `assertNotNull` does not use contracts // So, we want a method in a different namespace for `assertFalse` // JUnitAsserter doesn't contain it, so we add it in - JUnitAsserter.assertTrue(message, !actual) + JUnit5Asserter.assertTrue(message, !actual) } diff --git a/AnkiDroid/src/test/java/com/ichi2/utils/StringUtilTest.kt b/AnkiDroid/src/test/java/com/ichi2/utils/StringUtilTest.kt index 89c098c43958..1efa6757d99d 100644 --- a/AnkiDroid/src/test/java/com/ichi2/utils/StringUtilTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/utils/StringUtilTest.kt @@ -24,7 +24,7 @@ import org.hamcrest.Matchers.nullValue import org.hamcrest.Matchers.sameInstance import org.junit.Test import kotlin.test.assertEquals -import kotlin.test.junit.JUnitAsserter.assertNull +import kotlin.test.junit5.JUnit5Asserter.assertNull class StringUtilTest { @Test diff --git a/build.gradle b/build.gradle index 3c1faabd4dc5..1fceddaf40dd 100644 --- a/build.gradle +++ b/build.gradle @@ -9,6 +9,7 @@ buildscript { ext.acra_version = '5.7.0' ext.ankidroid_backend_version = '0.1.10' ext.hamcrest_version = '2.2' + ext.junit_version = '5.8.2' repositories { google() diff --git a/lint-rules/src/main/java/com/ichi2/anki/lint/rules/JUnitNullAssertionDetector.kt b/lint-rules/src/main/java/com/ichi2/anki/lint/rules/JUnitNullAssertionDetector.kt index 2b028c994ff7..4f4b6b46eeeb 100644 --- a/lint-rules/src/main/java/com/ichi2/anki/lint/rules/JUnitNullAssertionDetector.kt +++ b/lint-rules/src/main/java/com/ichi2/anki/lint/rules/JUnitNullAssertionDetector.kt @@ -54,7 +54,7 @@ class JUnitNullAssertionDetector : Detector(), SourceCodeScanner { val ID = "LegacyNullAssertionDetector" @VisibleForTesting - val DESCRIPTION = "Use kotlin.test.assert[Not]Null OR kotlin.test.junit.JUnitAsserter instead of JUnit in Kotlin" + val DESCRIPTION = "Use kotlin.test.assert[Not]Null OR kotlin.test.junit5.JUnit5Asserter instead of JUnit in Kotlin" private const val EXPLANATION = "JUnitAsserter's methods use contracts, removing the need for `!!` " + "afterwards. Use JUnitAsserter if passing in a message, kotlin.test top level functions otherwise" private val implementation = Implementation(JUnitNullAssertionDetector::class.java, JAVA_FILE_SCOPE)