diff --git a/FactorioDataWrapper/pom.xml b/FactorioDataWrapper/pom.xml index d6e9293..f91fc80 100644 --- a/FactorioDataWrapper/pom.xml +++ b/FactorioDataWrapper/pom.xml @@ -5,6 +5,7 @@ 0.0.1-SNAPSHOT src + test lua @@ -40,5 +41,11 @@ guava 21.0 + + junit + junit + 4.13.2 + test + diff --git a/FactorioDataWrapper/src/com/demod/factorio/ModInfo.java b/FactorioDataWrapper/src/com/demod/factorio/ModInfo.java index b6d8d20..b732aaf 100644 --- a/FactorioDataWrapper/src/com/demod/factorio/ModInfo.java +++ b/FactorioDataWrapper/src/com/demod/factorio/ModInfo.java @@ -10,7 +10,7 @@ public class ModInfo { public static final Pattern DEPENDENCY_REGEX = Pattern - .compile("^(?:(\\?|\\(\\?\\)|!|~) *)?(.+?)(?: *([<>=]=?) *([0-9.]+))?$"); + .compile("^(?:(\\?|\\(\\?\\)|!|~|\\+) *)?(.+?)(?: *([<>=]=?) *([0-9.]+))?$"); public static class Dependency { private final DepPrefix prefix; @@ -67,7 +67,8 @@ public boolean doesNotAffectLoadOrder() { } public boolean isRequired() { - return this.prefix == DepPrefix.REQUIRED || this.prefix == DepPrefix.DOES_NOT_AFFECT_LOAD_ORDER; + return this.prefix == DepPrefix.REQUIRED || this.prefix == DepPrefix.DOES_NOT_AFFECT_LOAD_ORDER + || this.prefix == DepPrefix.REQUIRED_LOAD_AFTER; } } @@ -81,6 +82,8 @@ public static enum DepPrefix { HIDDEN_OPTIONAL, // ~ for a dependency that does not affect load order DOES_NOT_AFFECT_LOAD_ORDER, + // + for a required dependency that loads after the mod declaring it (Factorio 2.1) + REQUIRED_LOAD_AFTER, // no prefix for a hard requirement for the other mod. REQUIRED,; @@ -97,6 +100,8 @@ private static DepPrefix fromSymbol(String symbol) { return HIDDEN_OPTIONAL; case "~": return DOES_NOT_AFFECT_LOAD_ORDER; + case "+": + return REQUIRED_LOAD_AFTER; default: throw new RuntimeException("Invalid dependency symbol: " + symbol); } diff --git a/FactorioDataWrapper/test/com/demod/factorio/ModInfoDependencyTest.java b/FactorioDataWrapper/test/com/demod/factorio/ModInfoDependencyTest.java new file mode 100644 index 0000000..2f02e1e --- /dev/null +++ b/FactorioDataWrapper/test/com/demod/factorio/ModInfoDependencyTest.java @@ -0,0 +1,77 @@ +package com.demod.factorio; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +import com.demod.factorio.ModInfo.DepOp; +import com.demod.factorio.ModInfo.DepPrefix; +import com.demod.factorio.ModInfo.Dependency; + +public class ModInfoDependencyTest { + + @Test + public void parsesRequiredDependencyWithoutPrefix() { + Dependency dependency = Dependency.parse("flib >= 0.16.2"); + + assertEquals("flib", dependency.getName()); + assertEquals(DepPrefix.REQUIRED, dependency.getPrefix()); + assertEquals(DepOp.GTE, dependency.getOp()); + assertEquals("0.16.2", dependency.getVersion()); + assertTrue(dependency.isRequired()); + } + + @Test + public void parsesLoadAfterDependencyWithPlusPrefix() { + Dependency dependency = Dependency.parse("+ ChangeInserterDropLane >= 1.3.0"); + + assertEquals("ChangeInserterDropLane", dependency.getName()); + assertEquals(DepPrefix.REQUIRED_LOAD_AFTER, dependency.getPrefix()); + assertEquals(DepOp.GTE, dependency.getOp()); + assertEquals("1.3.0", dependency.getVersion()); + assertTrue(dependency.isRequired()); + assertFalse(dependency.isOptional()); + assertFalse(dependency.isIncompatible()); + } + + @Test + public void parsesIncompatibleDependency() { + Dependency dependency = Dependency.parse("! Annotorio"); + + assertEquals("Annotorio", dependency.getName()); + assertEquals(DepPrefix.INCOMPATIBLE, dependency.getPrefix()); + assertNull(dependency.getVersion()); + assertTrue(dependency.isIncompatible()); + } + + @Test + public void parsesHiddenOptionalDependency() { + Dependency dependency = Dependency.parse("(?) space-age"); + + assertEquals("space-age", dependency.getName()); + assertEquals(DepPrefix.HIDDEN_OPTIONAL, dependency.getPrefix()); + assertTrue(dependency.isOptional()); + } + + @Test + public void parsesOptionalDependencyWithVersion() { + Dependency dependency = Dependency.parse("? Aircraft >= 1.6.6"); + + assertEquals("Aircraft", dependency.getName()); + assertEquals(DepPrefix.OPTIONAL, dependency.getPrefix()); + assertEquals(DepOp.GTE, dependency.getOp()); + assertEquals("1.6.6", dependency.getVersion()); + } + + @Test + public void parsesLoadOrderIndependentDependency() { + Dependency dependency = Dependency.parse("~ base >= 2.0.0"); + + assertEquals("base", dependency.getName()); + assertEquals(DepPrefix.DOES_NOT_AFFECT_LOAD_ORDER, dependency.getPrefix()); + assertTrue(dependency.isRequired()); + } +}