From 830f05c90ab005bad3868537bd71589be3ec803c Mon Sep 17 00:00:00 2001 From: LamGC Date: Thu, 5 May 2022 16:13:48 +0800 Subject: [PATCH] =?UTF-8?q?refactor(utils):=20=E5=8A=A0=E5=BC=BA=20getPrio?= =?UTF-8?q?rity=20=E6=96=B9=E6=B3=95=E7=9A=84=E4=BC=98=E5=85=88=E5=80=BC?= =?UTF-8?q?=E5=88=A4=E6=96=AD.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 加强优先级判断, 有利于后续使用时防止出现意外情况的问题. 顺便补充一手单元测试. --- scalabot-app/src/main/kotlin/util/Utils.kt | 9 ++++- .../src/test/kotlin/util/UtilsKtTest.kt | 40 ++++++++++++++++++- 2 files changed, 45 insertions(+), 4 deletions(-) diff --git a/scalabot-app/src/main/kotlin/util/Utils.kt b/scalabot-app/src/main/kotlin/util/Utils.kt index 0d74fd0..4d9d566 100644 --- a/scalabot-app/src/main/kotlin/util/Utils.kt +++ b/scalabot-app/src/main/kotlin/util/Utils.kt @@ -56,9 +56,14 @@ internal fun File.deepListFiles( * @return 获取 Finder 的优先级. * @throws NoSuchFieldException 如果 Finder 没有添加 [FinderRules] 注解时抛出该异常. */ -internal fun ExtensionPackageFinder.getPriority() = - this::class.java.getDeclaredAnnotation(FinderRules::class.java)?.priority +internal fun ExtensionPackageFinder.getPriority(): Int { + val value = this::class.java.getDeclaredAnnotation(FinderRules::class.java)?.priority ?: throw NoSuchFieldException("Finder did not add `FinderRules` annotation") + if (value < 0) { + throw IllegalArgumentException("Priority cannot be lower than 0. (Class: ${this::class.java})") + } + return value +} /** * 为 [AutoCloseable] 对象注册 Jvm Shutdown 钩子. diff --git a/scalabot-app/src/test/kotlin/util/UtilsKtTest.kt b/scalabot-app/src/test/kotlin/util/UtilsKtTest.kt index d9934a1..ac88b55 100644 --- a/scalabot-app/src/test/kotlin/util/UtilsKtTest.kt +++ b/scalabot-app/src/test/kotlin/util/UtilsKtTest.kt @@ -1,9 +1,18 @@ package net.lamgc.scalabot.util +import net.lamgc.scalabot.ExtensionPackageFinder +import net.lamgc.scalabot.FinderPriority +import net.lamgc.scalabot.FinderRules +import net.lamgc.scalabot.FoundExtensionPackage +import org.eclipse.aether.artifact.Artifact import org.eclipse.aether.artifact.DefaultArtifact -import org.junit.jupiter.api.Assertions.* -import org.junit.jupiter.api.Test +import org.junit.jupiter.api.assertThrows +import java.io.File import java.nio.charset.StandardCharsets +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertFalse +import kotlin.test.assertTrue internal class UtilsKtTest { @@ -22,4 +31,31 @@ internal class UtilsKtTest { assertEquals("48656c6c6f20576f726c64", "Hello World".toByteArray(StandardCharsets.UTF_8).toHexString()) } + @Test + fun `ExtensionPackageFinder - getPriority`() { + open class BaseTestFinder : ExtensionPackageFinder { + override fun findByArtifact(extensionArtifact: Artifact, extensionsPath: File): Set { + throw IllegalStateException("Calling this class is not allowed.") + } + } + + @FinderRules(FinderPriority.ALTERNATE) + class StandardTestFinder : BaseTestFinder() + assertEquals( + FinderPriority.ALTERNATE, StandardTestFinder().getPriority(), + "获取到的优先值与预期不符" + ) + + @FinderRules(-1) + class OutOfRangePriorityFinder : BaseTestFinder() + assertThrows("getPriority 方法没有对超出范围的优先值抛出异常.") { + OutOfRangePriorityFinder().getPriority() + } + + class NoAnnotationFinder : BaseTestFinder() + assertThrows { + NoAnnotationFinder().getPriority() + } + + } } \ No newline at end of file