// Copyright (c) 2025, 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 autocloseable;

import static org.junit.Assert.assertEquals;

import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.dex.ApplicationReader;
import com.android.tools.r8.graph.AppInfo;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.DirectMappedDexApplication;
import com.android.tools.r8.ir.desugar.desugaredlibrary.retargeter.AutoCloseableRetargeterHelper;
import com.android.tools.r8.synthesis.SyntheticItems.GlobalSyntheticsStrategy;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.AndroidApp;
import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.timing.Timing;
import com.google.common.collect.Sets;
import java.nio.file.Path;
import java.util.Set;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

@RunWith(Parameterized.class)
public class AutoCloseableDesugaringClassesPresentAtKitKatTest extends TestBase {

  @Parameters(name = "{0}")
  public static TestParametersCollection data() {
    return getTestParameters().withNoneRuntime().build();
  }

  public AutoCloseableDesugaringClassesPresentAtKitKatTest(TestParameters parameters) {
    parameters.assertNoneRuntime();
  }

  @Test
  public void test() throws Exception {
    InternalOptions options = new InternalOptions();
    Path androidJarK = ToolHelper.getAndroidJar(AndroidApiLevel.K);
    AndroidApp app = AndroidApp.builder().addProgramFile(androidJarK).build();
    DirectMappedDexApplication libHolder =
        new ApplicationReader(app, options, Timing.empty()).read().toDirect();
    AppInfo initialAppInfo =
        AppInfo.createInitialAppInfo(libHolder, GlobalSyntheticsStrategy.forNonSynthesizing());
    AppView<AppInfo> appView = AppView.createForD8(initialAppInfo, Timing.empty());

    Set<DexType> missing = Sets.newIdentityHashSet();
    AutoCloseableRetargeterHelper.forEachAutoCloseableMissingSubimplementation(
        type -> {
          if (appView.definitionFor(type) == null) {
            missing.add(type);
          }
        },
        AndroidApiLevel.B,
        appView.dexItemFactory(),
        false);
    assertEquals(1, missing.size());
    // ForkJoinPool is missing at Android Api level 19 but that's ok since it implements
    // ExecutorService.close in a more optimized way. We rely on ExecutorService for the
    // emulated dispatch.
    assertEquals(
        options.dexItemFactory().javaUtilConcurrentForkJoinPoolType, missing.iterator().next());
  }
}
