Fix parsing of patch version

Add test for all version formats on master.

Bug: 145284180
Change-Id: I87920249df2695c3dddc9efca9036828d7a042ef
diff --git a/src/main/java/com/android/tools/r8/Version.java b/src/main/java/com/android/tools/r8/Version.java
index 98c654c..d01ede5 100644
--- a/src/main/java/com/android/tools/r8/Version.java
+++ b/src/main/java/com/android/tools/r8/Version.java
@@ -27,12 +27,16 @@
    * @return Major version or -1 for an unreleased build.
    */
   public static int getMajorVersion() {
-    if (LABEL.equals("master")) {
+    return getMajorVersion(LABEL);
+  }
+
+  static int getMajorVersion(String label) {
+    if (label.equals("master")) {
       return -1;
     }
     int start = 0;
-    int end = LABEL.indexOf('.');
-    return Integer.parseInt(LABEL.substring(start, end));
+    int end = label.indexOf('.');
+    return Integer.parseInt(label.substring(start, end));
   }
 
   /**
@@ -41,12 +45,16 @@
    * @return Minor version or -1 for an unreleased build.
    */
   public static int getMinorVersion() {
-    if (LABEL.equals("master")) {
+    return getMinorVersion(LABEL);
+  }
+
+  static int getMinorVersion(String label) {
+    if (label.equals("master")) {
       return -1;
     }
-    int start = LABEL.indexOf('.') + 1;
-    int end = LABEL.indexOf('.', start);
-    return Integer.parseInt(LABEL.substring(start, end));
+    int start = label.indexOf('.') + 1;
+    int end = label.indexOf('.', start);
+    return Integer.parseInt(label.substring(start, end));
   }
 
   /**
@@ -55,13 +63,17 @@
    * @return Patch version or -1 for an unreleased build.
    */
   public static int getPatchVersion() {
-    if (LABEL.equals("master")) {
+    return getPatchVersion(LABEL);
+  }
+
+  static int getPatchVersion(String label) {
+    if (label.equals("master")) {
       return -1;
     }
-    int skip = LABEL.indexOf('.') + 1;
-    int start = LABEL.indexOf('.', skip) + 1;
-    int end = LABEL.indexOf('.', start);
-    return Integer.parseInt(LABEL.substring(start, end));
+    int skip = label.indexOf('.') + 1;
+    int start = label.indexOf('.', skip) + 1;
+    int end = label.indexOf('-', start);
+    return Integer.parseInt(label.substring(start, end != -1 ? end : label.length()));
   }
 
   /**
@@ -71,12 +83,16 @@
    *     unreleased build.
    */
   public static String getPreReleaseString() {
-    if (LABEL.equals("master")) {
+    return getPreReleaseString(LABEL);
+  }
+
+  static String getPreReleaseString(String label) {
+    if (label.equals("master")) {
       return null;
     }
-    int start = LABEL.indexOf('-') + 1;
+    int start = label.indexOf('-') + 1;
     if (start > 0) {
-      return LABEL.substring(start);
+      return label.substring(start);
     }
     return "";
   }
@@ -87,8 +103,10 @@
    * @return True if the build is not a release or if it is a development release.
    */
   public static boolean isDevelopmentVersion() {
-    return LABEL.equals("master")
-        || LABEL.endsWith("-dev")
-        || VersionProperties.INSTANCE.isEngineering();
+    return isDevelopmentVersion(LABEL, VersionProperties.INSTANCE.isEngineering());
+  }
+
+  static boolean isDevelopmentVersion(String label, boolean isEngineering) {
+    return label.equals("master") || label.endsWith("-dev") || isEngineering;
   }
 }
diff --git a/src/test/java/com/android/tools/r8/VersionTests.java b/src/test/java/com/android/tools/r8/VersionTests.java
index ba5ee78..dffaa2b 100644
--- a/src/test/java/com/android/tools/r8/VersionTests.java
+++ b/src/test/java/com/android/tools/r8/VersionTests.java
@@ -5,6 +5,7 @@
 
 import static com.android.tools.r8.Version.LABEL;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
@@ -62,4 +63,30 @@
   public void testDevelopmentPredicate() {
     assertEquals(LABEL.equals("master") || LABEL.contains("-dev"), Version.isDevelopmentVersion());
   }
+
+  @Test
+  public void testLabelParsing() {
+    assertEquals(-1, Version.getMajorVersion("master"));
+    assertEquals(-1, Version.getMinorVersion("master"));
+    assertEquals(-1, Version.getPatchVersion("master"));
+    assertNull(Version.getPreReleaseString("master"));
+    // 'master' is checked before 'isEngineering'.
+    assertTrue(Version.isDevelopmentVersion("master", false));
+    assertTrue(Version.isDevelopmentVersion("master", true));
+
+    assertEquals(1, Version.getMajorVersion("1.2.3-dev"));
+    assertEquals(2, Version.getMinorVersion("1.2.3-dev"));
+    assertEquals(3, Version.getPatchVersion("1.2.3-dev"));
+    assertEquals("dev", Version.getPreReleaseString("1.2.3-dev"));
+    // '-dev' suffix is checked before 'isEngineering'.
+    assertTrue(Version.isDevelopmentVersion("1.2.3-dev", false));
+    assertTrue(Version.isDevelopmentVersion("1.2.3-dev", true));
+
+    assertEquals(1, Version.getMajorVersion("1.2.3"));
+    assertEquals(2, Version.getMinorVersion("1.2.3"));
+    assertEquals(3, Version.getPatchVersion("1.2.3"));
+    assertEquals("", Version.getPreReleaseString("1.2.3"));
+    assertFalse(Version.isDevelopmentVersion("1.2.3", false));
+    assertTrue(Version.isDevelopmentVersion("1.2.3", true));
+  }
 }