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

import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;

import com.android.tools.r8.NeverMerge;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.StringUtils;
import com.android.tools.r8.utils.codeinspector.ClassSubject;
import com.android.tools.r8.utils.codeinspector.CodeInspector;
import com.android.tools.r8.utils.codeinspector.MethodSubject;
import java.lang.reflect.Method;
import org.junit.Test;

@NeverMerge
interface I {
  default void m() {
    System.out.println("I::m");
  }
}

class C implements I {
}

class BridgeInliningTestRunner {
  public static void main(String[] args) throws Exception {
    C obj = new C();
    for (Method m : obj.getClass().getDeclaredMethods()) {
      m.invoke(obj, null);
    }
  }
}

public class BridgeInliningTest extends TestBase {
  private static final Class<?> MAIN = BridgeInliningTestRunner.class;
  private static final String EXPECTED_OUTPUT = StringUtils.lines("I::m");

  @Test
  public void test() throws Exception {
    testForR8(Backend.DEX)
        .addProgramClasses(I.class, C.class, MAIN)
        .setMinApi(AndroidApiLevel.L)
        .enableMergeAnnotations()
        .addKeepMainRule(MAIN)
        .addKeepRules("-keep interface **.I { m(); }")
        .run(MAIN)
        .assertSuccessWithOutput(EXPECTED_OUTPUT)
        .inspect(this::inspect);
  }

  private void inspect(CodeInspector codeInspector) {
    ClassSubject c = codeInspector.clazz(C.class);
    assertThat(c, isPresent());
    MethodSubject m = c.uniqueMethodWithName("m");
    assertThat(m, isPresent());
    assertTrue(m.getMethod().hasCode());
    // TODO(b/124017330): Verify that I$-CC.m() has been inlined into C.m().
    //assertTrue(
    //    m.iterateInstructions(i -> i.isConstString("I::m", JumboStringMode.ALLOW)).hasNext());
    //codeInspector.forAllClasses(classSubject -> {
    //  assertFalse(classSubject.getOriginalDescriptor().contains("$-CC"));
    //});
  }

}
