// Copyright (c) 2018, 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 com.android.tools.r8.TestBase;
import org.junit.Test;

/** Regression test for b/120971047. */
public class KeptLambdaDesugaringTest extends TestBase {

  @Test
  public void test() throws Exception {
    testForR8(Backend.DEX)
        .addInnerClasses(KeptLambdaDesugaringTest.class)
        .addKeepRules("-keep class ** { *; }")
        .run(TestClass.class)
        .assertSuccessWithOutput("Hello world");
  }

  static class TestClass {

    public static void main(String[] args) {
      new A("Hello world").method();
    }
  }

  static class A {

    private final String message;

    public A(String message) {
      this.message = message;
    }

    public void method() {
      Runnable runnable = () -> {
        // The use of reflection will trigger Enqueuer.handleReflectiveBehavior.
        try {
          A.class.getDeclaredField("message");
        } catch (NoSuchFieldException e) {
          throw new RuntimeException(e);
        }
        System.out.print(message);
      };
      runnable.run();
    }
  }
}
