Fixes the API checking algorithm.

Fixes https://github.com/BentoBoxWorld/BentoBox/issues/1176
This commit is contained in:
tastybento 2020-02-07 18:25:40 -08:00
parent d972dd10c1
commit 332967950f
2 changed files with 116 additions and 11 deletions

View File

@ -27,6 +27,7 @@ import org.bukkit.generator.ChunkGenerator;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import be.maximvdw.placeholderapi.internal.utils.NumberUtils;
import world.bentobox.bentobox.BentoBox;
import world.bentobox.bentobox.api.addons.Addon;
import world.bentobox.bentobox.api.addons.Addon.State;
@ -213,24 +214,27 @@ public class AddonsManager {
plugin.logWarning("NOTE: DO NOT report this as a bug from BentoBox.");
}
private boolean isAddonCompatibleWithBentoBox(@NonNull Addon addon) {
return isAddonCompatibleWithBentoBox(addon, plugin.getDescription().getVersion());
}
/**
* Checks if the addon does not explicitly rely on API from a more recent BentoBox version.
* @param addon instance of the Addon.
* @param plugin version string - used for testing
* @return {@code true} if the addon relies on available BentoBox API, {@code false} otherwise.
* @since 1.11.0
*/
private boolean isAddonCompatibleWithBentoBox(@NonNull Addon addon) {
// We have to use lists instead of arrays for dynamic changes and optimization (appending something to an array is O(n) whereas O(1) with lists).
List<String> apiVersion = Arrays.asList(addon.getDescription().getApiVersion().split("\\."));
List<String> bentoboxVersion = Arrays.asList(plugin.getDescription().getVersion().split("\\."));
boolean isAddonCompatibleWithBentoBox(@NonNull Addon addon, String pluginVersion) {
String[] apiVersion = addon.getDescription().getApiVersion().split("\\D");
String[] bentoboxVersion = pluginVersion.split("\\D");
while (bentoboxVersion.size() < apiVersion.size()) {
bentoboxVersion.add("0");
}
for (int i = 0; i < apiVersion.size(); i++) {
int apiNumber = Integer.parseInt(apiVersion.get(i));
int bentoboxNumber = Integer.parseInt(bentoboxVersion.get(i));
for (int i = 0; i < apiVersion.length; i++) {
int bentoboxNumber = 0;
if (i < bentoboxVersion.length && NumberUtils.isInteger(bentoboxVersion[i])) {
bentoboxNumber = Integer.parseInt(bentoboxVersion[i]);
}
int apiNumber = NumberUtils.isInteger(apiVersion[i]) ? Integer.parseInt(apiVersion[i]) : -1;
if (bentoboxNumber < apiNumber) {
return false;
}

View File

@ -31,6 +31,7 @@ import org.powermock.reflect.Whitebox;
import world.bentobox.bentobox.BentoBox;
import world.bentobox.bentobox.Settings;
import world.bentobox.bentobox.api.addons.Addon;
import world.bentobox.bentobox.api.addons.AddonDescription;
import world.bentobox.bentobox.database.DatabaseSetup.DatabaseType;
import world.bentobox.bentobox.database.objects.DataObject;
@ -234,5 +235,105 @@ public class AddonsManagerTest {
assertFalse(am.getDataObjects().isEmpty());
assertTrue(am.getDataObjects().size() == 1);
}
/**
* Test method for {@link world.bentobox.bentobox.managers.AddonsManager#isAddonCompatibleWithBentoBox(Addon)}.
*/
@Test
public void testIsAddonCompatibleWithBentoBoxSnapshotNoAPIVersion() {
Addon addon = mock(Addon.class);
AddonDescription addonDesc = new AddonDescription.Builder("main.class", "Addon-name", "1.0.1").build();
when(addon.getDescription()).thenReturn(addonDesc);
assertTrue(am.isAddonCompatibleWithBentoBox(addon, "1.0.1-SNAPSHOT-b1642"));
}
/**
* Test method for {@link world.bentobox.bentobox.managers.AddonsManager#isAddonCompatibleWithBentoBox(Addon)}.
*/
@Test
public void testIsAddonCompatibleWithBentoBoxReleaseAPIVersion() {
Addon addon = mock(Addon.class);
AddonDescription addonDesc = new AddonDescription.Builder("main.class", "Addon-name", "1.0.1").apiVersion("1.0.1").build();
when(addon.getDescription()).thenReturn(addonDesc);
assertTrue(am.isAddonCompatibleWithBentoBox(addon, "1.0.1"));
}
/**
* Test method for {@link world.bentobox.bentobox.managers.AddonsManager#isAddonCompatibleWithBentoBox(Addon)}.
*/
@Test
public void testIsAddonCompatibleWithBentoBoxSnapshotAPIVersion() {
Addon addon = mock(Addon.class);
AddonDescription addonDesc = new AddonDescription.Builder("main.class", "Addon-name", "1.0.1").apiVersion("1.0.1").build();
when(addon.getDescription()).thenReturn(addonDesc);
assertTrue(am.isAddonCompatibleWithBentoBox(addon, "1.0.1-SNAPSHOT-b1642"));
}
/**
* Test method for {@link world.bentobox.bentobox.managers.AddonsManager#isAddonCompatibleWithBentoBox(Addon)}.
*/
@Test
public void testIsAddonCompatibleWithBentoBoxReleaseNoAPIVersion() {
Addon addon = mock(Addon.class);
AddonDescription addonDesc = new AddonDescription.Builder("main.class", "Addon-name", "1.0.1").build();
when(addon.getDescription()).thenReturn(addonDesc);
assertTrue(am.isAddonCompatibleWithBentoBox(addon, "1.0.1"));
}
/**
* Test method for {@link world.bentobox.bentobox.managers.AddonsManager#isAddonCompatibleWithBentoBox(Addon)}.
*/
@Test
public void testIsAddonCompatibleWithBentoBoxSnapshotAPIVersionVariableDigits() {
Addon addon = mock(Addon.class);
AddonDescription addonDesc = new AddonDescription.Builder("main.class", "Addon-name", "1.0.1").apiVersion("1.2.1").build();
when(addon.getDescription()).thenReturn(addonDesc);
assertFalse(am.isAddonCompatibleWithBentoBox(addon, "1.2-SNAPSHOT-b1642"));
}
/**
* Test method for {@link world.bentobox.bentobox.managers.AddonsManager#isAddonCompatibleWithBentoBox(Addon)}.
*/
@Test
public void testIsAddonCompatibleWithBentoBoxOldSnapshot() {
Addon addon = mock(Addon.class);
AddonDescription addonDesc = new AddonDescription.Builder("main.class", "Addon-name", "1.0.0").apiVersion("1.11.1").build();
when(addon.getDescription()).thenReturn(addonDesc);
assertFalse(am.isAddonCompatibleWithBentoBox(addon, "1.0.1-SNAPSHOT-b1642"));
}
/**
* Test method for {@link world.bentobox.bentobox.managers.AddonsManager#isAddonCompatibleWithBentoBox(Addon)}.
*/
@Test
public void testIsAddonCompatibleWithBentoBoxOldRelease() {
Addon addon = mock(Addon.class);
AddonDescription addonDesc = new AddonDescription.Builder("main.class", "Addon-name", "1.0.0").apiVersion("1.11.1").build();
when(addon.getDescription()).thenReturn(addonDesc);
assertFalse(am.isAddonCompatibleWithBentoBox(addon, "1.0.1"));
}
/**
* Test method for {@link world.bentobox.bentobox.managers.AddonsManager#isAddonCompatibleWithBentoBox(Addon)}.
*/
@Test
public void testIsAddonCompatibleWithBentoBoxOldReleaseLong() {
Addon addon = mock(Addon.class);
AddonDescription addonDesc = new AddonDescription.Builder("main.class", "Addon-name", "1.0.0").apiVersion("1.11.1").build();
when(addon.getDescription()).thenReturn(addonDesc);
assertTrue(am.isAddonCompatibleWithBentoBox(addon, "1.11.1.11.1.1"));
}
/**
* Test method for {@link world.bentobox.bentobox.managers.AddonsManager#isAddonCompatibleWithBentoBox(Addon)}.
*/
@Test
public void testIsAddonCompatibleWithBentoBoxOldReleaseLongAPI() {
Addon addon = mock(Addon.class);
AddonDescription addonDesc = new AddonDescription.Builder("main.class", "Addon-name", "1.0.0").apiVersion("1.11.1.0.0.0.1").build();
when(addon.getDescription()).thenReturn(addonDesc);
assertFalse(am.isAddonCompatibleWithBentoBox(addon, "1.11.1"));
}
}