// Copyright (c) 2017, 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.compatproguard;

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 com.android.tools.r8.compatproguard.CompatProguard.CompatProguardOptions;
import org.junit.Test;

public class CompatProguardTest {

  private CompatProguardOptions parseArgs(String... args) {
    return CompatProguard.CompatProguardOptions.parse(args);
  }

  @Test
  public void testDefaultDataResources() throws Exception {
    CompatProguardOptions options = parseArgs();
    assertNull(options.output);
    assertEquals(1, options.minApi);
    assertFalse(options.forceProguardCompatibility);
    assertTrue(options.includeDataResources);
    assertFalse(options.multiDex);
    assertNull(options.mainDexList);
    assertEquals(0, options.proguardConfig.size());
  }

  @Test
  public void testShortLine() throws Exception {
    CompatProguardOptions options = parseArgs("-");
    assertEquals(1, options.proguardConfig.size());
  }

  @Test
  public void testProguardOptions() throws Exception {
    CompatProguardOptions options;

    options = parseArgs("-xxx");
    assertEquals(1, options.proguardConfig.size());
    options = parseArgs("-xxx", "xxx");
    assertEquals(1, options.proguardConfig.size());
    options = parseArgs("-xxx",  "-yyy");
    assertEquals(2, options.proguardConfig.size());
    options = parseArgs("-xxx", "xxx", "-yyy", "yyy");
    assertEquals(2, options.proguardConfig.size());
  }

  @Test
  public void testInjarsAndOutput() throws Exception {
    CompatProguardOptions options;
    String injars = "input.jar";
    String output = "outputdir";
    options = parseArgs("-injars", injars, "--output", output);
    assertEquals(output, options.output);
    assertEquals(1, options.proguardConfig.size());
    options = parseArgs("--output", output, "-injars", injars);
    assertEquals(1, options.proguardConfig.size());
  }

  @Test
  public void testMainDexList() throws Exception {
    CompatProguardOptions options;
    String mainDexList = "maindexlist.txt";

    options = parseArgs("--main-dex-list", mainDexList);
    assertEquals(mainDexList, options.mainDexList);
    options = parseArgs("--main-dex-list=" + mainDexList);
    assertEquals(mainDexList, options.mainDexList);
    options = parseArgs("--main-dex-list", mainDexList, "--minimal-main-dex");
    assertEquals(mainDexList, options.mainDexList);
    options = parseArgs("--minimal-main-dex", "--main-dex-list=" + mainDexList);
    assertEquals(mainDexList, options.mainDexList);
  }

  @Test
  public void testInclude() throws Exception {
    CompatProguardOptions options = parseArgs("-include --my-include-file.txt");
    assertEquals(1, options.proguardConfig.size());
    assertEquals("-include --my-include-file.txt", options.proguardConfig.get(0));
  }

  @Test
  public void testNoLocalsOption() throws Exception {
    CompatProguardOptions options = parseArgs("--no-locals");
    assertEquals(0, options.proguardConfig.size());
  }

  @Test
  public void testNoDataResources() throws Exception {
    CompatProguardOptions options = parseArgs("--no-data-resources");
    assertFalse(options.includeDataResources);
  }

  @Test
  public void testDisableVerticalClassMerging() throws Exception {
    CompatProguardOptions enabledOptions = parseArgs();
    assertFalse(enabledOptions.disableVerticalClassMerging);

    CompatProguardOptions disabledOptions = parseArgs("--no-vertical-class-merging");
    assertTrue(disabledOptions.disableVerticalClassMerging);
  }
}
