// 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.assertFalse;
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/123778921): why are I and C not merged without merge annotations?
    //assertTrue(
    //    m.iterateInstructions(i -> i.isConstString("I::m", JumboStringMode.ALLOW)).hasNext());

    // TODO(b/123778921): No companion class is in the output.
    //codeInspector.forAllClasses(classSubject -> {
    //  assertFalse(classSubject.getOriginalDescriptor().contains("$-CC"));
    //});
  }

}
