// 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.checkdiscarded;

import com.android.tools.r8.CompilationFailedException;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.checkdiscarded.testclasses.Main;
import com.android.tools.r8.checkdiscarded.testclasses.UnusedClass;
import com.android.tools.r8.checkdiscarded.testclasses.UsedClass;
import com.android.tools.r8.checkdiscarded.testclasses.WillBeGone;
import com.android.tools.r8.checkdiscarded.testclasses.WillStay;
import com.android.tools.r8.utils.InternalOptions;
import com.google.common.collect.ImmutableList;
import java.util.List;
import org.junit.Assert;
import org.junit.Test;

public class CheckDiscardedTest extends TestBase {

  private void run(boolean obfuscate, Class annotation, boolean checkMembers, boolean shouldFail)
      throws Exception {
    List<Class<?>> classes = ImmutableList.of(UnusedClass.class, UsedClass.class, Main.class);
    String proguardConfig = keepMainProguardConfiguration(Main.class, true, obfuscate)
        + checkDiscardRule(checkMembers, annotation);
    try {
      compileWithR8(classes, proguardConfig, this::noInlining);
    } catch (CompilationFailedException e) {
      Assert.assertTrue(shouldFail);
      return;
    }
    Assert.assertFalse(shouldFail);
  }

  private void noInlining(InternalOptions options) {
    options.enableInlining = false;
  }

  private String checkDiscardRule(boolean member, Class annotation) {
    if (member) {
      return "-checkdiscard class * { @" + annotation.getCanonicalName() + " *; }";
    } else {
      return "-checkdiscard @" + annotation.getCanonicalName() + " class *";
    }
  }

  @Test
  public void classesAreGone() throws Exception {
    run(false, WillBeGone.class, false, false);
    run(true, WillBeGone.class, false, false);
  }

  @Test
  public void classesAreNotGone() throws Exception {
    run(false, WillStay.class, false, true);
    run(true, WillStay.class, false, true);
  }

  @Test
  public void membersAreGone() throws Exception {
    run(false, WillBeGone.class, true, false);
    run(true, WillBeGone.class, true, false);
  }

  @Test
  public void membersAreNotGone() throws Exception {
    run(false, WillStay.class, true, true);
    run(true, WillStay.class, true, true);
  }

}
