// Copyright (c) 2020, 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.classmerging.horizontal;

import com.android.tools.r8.NeverClassInline;
import com.android.tools.r8.TestParameters;
import org.junit.Test;

public class GenericStaticFieldTest extends HorizontalClassMergingTestBase {
  public GenericStaticFieldTest(TestParameters parameters) {
    super(parameters);
  }

  @Test
  public void testR8() throws Exception {
    testForR8(parameters.getBackend())
        .addInnerClasses(getClass())
        .addKeepMainRule(Main.class)
        .addKeepRules("-keepattributes Signatures")
        .enableNeverClassInliningAnnotations()
        .setMinApi(parameters)
        // .addHorizontallyMergedClassesInspectorIf(
        //    enableHorizontalClassMerging, inspector ->
        // inspector.assertMergedInto(EmptyClassTest.B.class, EmptyClassTest.A.class))
        .run(parameters.getRuntime(), Main.class)
        .assertSuccessWithOutputLines("false", "false")
        .inspect(codeInspector -> {});
  }

  @NeverClassInline
  public static class A<Z extends Object> {
    public A(Z z) {
      if (System.currentTimeMillis() < 0) {
        z.toString();
      }
    }
  }

  @NeverClassInline
  public static class B {}

  @NeverClassInline
  public static class Foo {
    public static A<Object> field;
    public static A<B> field2;

    public Foo() {
      field = new A<Object>(new Object());
    }
  }

  @NeverClassInline
  public static class Foo2 {
    public static A<Object> field;

    public Foo2() {
      field = new A<Object>(new Object());
    }
  }

  public static class Main {
    public static void main(String[] args) {
      Foo foo = new Foo();
      Foo2 foo2 = new Foo2();
      System.out.println(foo.field.equals(System.out));
      System.out.println(foo2.field.equals(System.out));
    }
  }
}
