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

import static org.junit.Assert.assertEquals;

import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
import com.android.tools.r8.utils.StringUtils;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

// Test if the static method of the lambda implementation (SINGLE_CALLER) is inlined into the
// interface method of the lambda class.
@RunWith(Parameterized.class)
public class DesugaredLambdaImplementationInliningTest extends TestBase {

  static final String EXPECTED =
      StringUtils.lines(
          "Running desugared stateless lambda.",
          "Running desugared stateful lambda: lambda-state.");

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

  final TestParameters parameters;

  public DesugaredLambdaImplementationInliningTest(TestParameters parameters) {
    this.parameters = parameters;
  }

  @Test
  public void test() throws Exception {
    class Counter {
      private int i = 0;
    }
    Counter counter = new Counter();
    testForR8Compat(parameters.getBackend())
        .addProgramClasses(TestClass.class)
        .addKeepMainRule(TestClass.class)
        .noMinification()
        .setMinApi(parameters.getApiLevel())
        .run(parameters.getRuntime(), TestClass.class)
        .assertSuccessWithOutput(EXPECTED)
        .inspector()
        .clazz(TestClass.class)
        .forAllMethods(
            fms -> {
              if (fms.isStatic() && !fms.getOriginalName().equals("main")) {
                ++counter.i;
              }
            });
    // On CF the lambdas remain.
    assertEquals(parameters.isDexRuntime() ? 0 : 2, counter.i);
  }

  static class TestClass {
    public static void main(String[] args) {
      Runnable runnable = () -> System.out.println("Running desugared stateless lambda.");
      runnable.run();

      String s = "lambda-state";
      runnable = () -> System.out.println("Running desugared stateful lambda: " + s + ".");
      runnable.run();
    }
  }
}
