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());
+ }
+}