diff --git a/src/us/kolmafia/multitool/Multitool.java b/src/us/kolmafia/multitool/Multitool.java index f645ca0..d836563 100644 --- a/src/us/kolmafia/multitool/Multitool.java +++ b/src/us/kolmafia/multitool/Multitool.java @@ -146,17 +146,10 @@ private static ToolData processTool(String toolName) { int localVersion = 0; for (String systemJarName : locals) { String jarName = systemJarName.toLowerCase(); - int i = jarName.indexOf(toolName); - String hold = jarName.substring(i + toolName.length() + 1); - i = hold.indexOf(".jar"); - hold = hold.substring(0, i); - if (hold.contains("-m")) { - i = hold.indexOf("-m"); - hold = hold.substring(0, i); - retVal.setLocalModificationFound(true); - } + VersionData verDat = getVersionDataFromFilename(jarName, toolName); runMe = systemJarName; - localVersion = Integer.parseInt(hold); + localVersion = verDat.getVersion(); + retVal.setLocalModificationFound(verDat.isModified()); } retVal.setCurrentVersion(localVersion); retVal.setNeedToDownload(localVersion < version); @@ -216,7 +209,7 @@ private static int getLatestReleaseVersion(String tool) { /** * Uses an opened input stream to determine the latest version of a tool in a remote repository. - * Caller needs to Closes the input stream. + * Caller needs to close the input stream. * * @param is Successfully opened input stream to remote repository. * @return latest version in repository or zero @@ -304,4 +297,33 @@ public static void initLogOrExit() { System.exit(0); } } + + static VersionData getVersionDataFromFilename(String jarName, String toolName) { + VersionData noResult = new VersionData(0, false); + jarName = jarName.toLowerCase(); + toolName = toolName.toLowerCase(); + String dotJar = ".jar"; + if (!jarName.startsWith(toolName)) return noResult; + if (!jarName.endsWith(dotJar)) return noResult; + boolean mod = false; + int i = jarName.indexOf(toolName); + String hold = jarName.substring(i + toolName.length()); + if (!hold.startsWith("-")) return noResult; + hold = hold.substring(1); + i = hold.indexOf(".jar"); + hold = hold.substring(0, i); + if (hold.contains("-m")) { + i = hold.indexOf("-m"); + hold = hold.substring(0, i); + mod = true; + } + boolean isNumeric = hold.chars().allMatch(Character::isDigit); + if (!isNumeric) return noResult; + try { + int verVal = Integer.parseInt(hold); + return new VersionData(verVal, mod); + } catch (NumberFormatException e) { + return noResult; + } + } } diff --git a/src/us/kolmafia/multitool/VersionData.java b/src/us/kolmafia/multitool/VersionData.java new file mode 100644 index 0000000..d7cda04 --- /dev/null +++ b/src/us/kolmafia/multitool/VersionData.java @@ -0,0 +1,19 @@ +package us.kolmafia.multitool; + +public class VersionData { + private final int version; + private final boolean modified; + + public VersionData(int ver, boolean mod) { + this.version = ver; + this.modified = mod; + } + + public int getVersion() { + return version; + } + + public boolean isModified() { + return modified; + } +} diff --git a/test/us/kolmafia/multitool/MultitoolTest.java b/test/us/kolmafia/multitool/MultitoolTest.java index 9b7796c..4bf704a 100644 --- a/test/us/kolmafia/multitool/MultitoolTest.java +++ b/test/us/kolmafia/multitool/MultitoolTest.java @@ -11,6 +11,7 @@ import static us.kolmafia.multitool.Constants.ROOT_LOCATION; import static us.kolmafia.multitool.Multitool.cleanPath; import static us.kolmafia.multitool.Multitool.cwd; +import static us.kolmafia.multitool.Multitool.getVersionDataFromFilename; import static us.kolmafia.multitool.Multitool.getVersionFromInputStream; import static us.kolmafia.multitool.Multitool.initLogOrExit; import static us.kolmafia.multitool.Multitool.logFileName; @@ -28,6 +29,8 @@ import java.util.List; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; class MultitoolTest { @@ -50,14 +53,7 @@ public void itShouldFindNoFiles() { private boolean validateDestination(Path destination) { File dFile = destination.toFile(); - boolean retVal = dFile.exists(); - if (retVal) { - retVal = dFile.isDirectory(); - if (retVal) { - retVal = dFile.canWrite(); - } - } - return retVal; + return dFile.exists() && dFile.isDirectory() && dFile.canWrite(); } @Test @@ -80,7 +76,7 @@ public void itShouldFindFilesThatWerePutThere() { try { copy(sPath, dPath, StandardCopyOption.REPLACE_EXISTING); } catch (IOException e) { - throw new RuntimeException(e); + fail(e.getMessage()); } } inDir = processDirectory(KOLMAFIA_NAME); @@ -131,4 +127,22 @@ public void itShouldGetKoLmafiaVersion() { } assertEquals(28465, getVersionFromInputStream(fs)); } + + @ParameterizedTest + @CsvSource({ + "kolmafia, kolmafia, 0, false", + "kolmafia-123, kolmafia, 0, false", + "kolmafia123.jar, kolmafia, 0, false", + "kolmafia-123.jar, kolmafia, 123, false", + "kolmafia-123-m.jar, kolmafia, 123, true", + "kolmafia-123-.jar, kolmafia, 0, false", + "kolmafia-latest.jar, kolmafia, 0, false", + "notatool-123.jar, kolmafia, 0, false" + }) + public void itShouldGetVersions( + String jarName, String toolName, int expectedVersion, boolean expectedmod) { + VersionData vd = getVersionDataFromFilename(jarName, toolName); + assertEquals(expectedVersion, vd.getVersion()); + assertEquals(expectedmod, vd.isModified()); + } } diff --git a/test/us/kolmafia/multitool/VersionDataTest.java b/test/us/kolmafia/multitool/VersionDataTest.java new file mode 100644 index 0000000..53867c3 --- /dev/null +++ b/test/us/kolmafia/multitool/VersionDataTest.java @@ -0,0 +1,14 @@ +package us.kolmafia.multitool; + +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.Test; + +class VersionDataTest { + @Test + public void itShouldGetWhatWasSet() { + VersionData vd = new VersionData(1066, true); + assertEquals(1066, vd.getVersion()); + assertTrue(vd.isModified()); + } +}