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

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

import com.android.tools.r8.ir.desugar.InterfaceMethodRewriter;
import com.android.tools.r8.utils.AndroidApp;
import com.android.tools.r8.utils.codeinspector.ClassSubject;
import com.android.tools.r8.utils.codeinspector.CodeInspector;
import com.google.common.collect.ImmutableList;
import org.junit.Test;

public class AnnotationCompanionClassTest extends JasminTestBase {

  private JasminBuilder buildClass() {
    JasminBuilder builder = new JasminBuilder(JasminBuilder.ClassFileVersion.JDK_1_4);
    JasminBuilder.ClassBuilder clazz =
        builder.addInterface("MyAnnotation", "java/lang/annotation/Annotation");

    clazz.setAccess("public interface abstract annotation");

    clazz.addStaticMethod(
        "staticMethod", ImmutableList.of(), "V",
        ".limit stack 0",
        ".limit locals 0",
        "  return");
    return builder;
  }

  @Test
  public void test() throws Exception {
    JasminBuilder builder = buildClass();
    AndroidApp androidApp = compileWithD8(builder);

    CodeInspector codeInspector = new CodeInspector(androidApp);
    ClassSubject clazz =
        codeInspector.clazz("MyAnnotation" + InterfaceMethodRewriter.COMPANION_CLASS_NAME_SUFFIX);
    assertThat(clazz, isPresent());
    assertFalse(clazz.isAnnotation());
  }
}
