// Copyright (c) 2019, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8;

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;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

@RunWith(Parameterized.class)
public class VersionTests extends TestBase {

  @Parameters(name = "{0}")
  public static TestParametersCollection data() {
    return getTestParameters().withNoneRuntime().build();
  }

  public VersionTests(TestParameters parameters) {
    parameters.assertNoneRuntime();
  }

  @Test
  public void testSemVerInfo() {
    int majorVersion = Version.getMajorVersion();
    int minorVersion = Version.getMinorVersion();
    int patchVersion = Version.getPatchVersion();
    String preReleaseString = Version.getPreReleaseString();
    if (LABEL.equals("main")) {
      assertEquals(-1, majorVersion);
      assertEquals(-1, minorVersion);
      assertEquals(-1, patchVersion);
      assertNull(preReleaseString);
      assertTrue(Version.getVersionString().startsWith("main"));
    } else {
      assertTrue(majorVersion > 0);
      assertTrue(minorVersion >= 0);
      assertTrue(patchVersion >= 0);
      assertNotNull(preReleaseString);
      assertTrue(
          Version.getVersionString()
              .startsWith(
                  ""
                      + majorVersion
                      + "."
                      + minorVersion
                      + "."
                      + patchVersion
                      + (preReleaseString.isEmpty() ? "" : "-" + preReleaseString)));
    }
  }

  @Test
  public void testDevelopmentPredicate() {
    if (LABEL.equals("main") || LABEL.contains("-dev")) {
      assertTrue(Version.isDevelopmentVersion());
    } else {
      // This is a release branch, but Version.isDevelopmentVersion will still return true
      // since this is not the release archive with the r8-version.properties file.
      assertFalse(Version.isDevelopmentVersion(LABEL, false));
    }
  }

  @Test
  public void testLabelParsing() {
    assertEquals(-1, Version.getMajorVersion("main"));
    assertEquals(-1, Version.getMinorVersion("main"));
    assertEquals(-1, Version.getPatchVersion("main"));
    assertNull(Version.getPreReleaseString("main"));
    // 'main' is checked before 'isEngineering'.
    assertTrue(Version.isDevelopmentVersion("main", false));
    assertTrue(Version.isDevelopmentVersion("main", 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));
  }
}
