// 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.desugar.desugaredlibrary.conversiontests;

import static org.junit.Assert.assertEquals;

import com.android.tools.r8.TestRuntime.DexRuntime;
import com.android.tools.r8.ToolHelper.DexVm;
import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
import com.android.tools.r8.ir.desugar.DesugaredLibraryWrapperSynthesizer;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.StringUtils;
import com.android.tools.r8.utils.codeinspector.CodeInspector;
import java.nio.file.Path;
import java.util.Arrays;
import org.junit.Test;

public class WrapperMergeTest extends DesugaredLibraryTestBase {

  @Test
  public void testWrapperMerge() throws Exception {
    // Multiple wrapper classes have to be merged here.
    Path path1 = testForD8()
        .addProgramClasses(Executor1.class)
        .setMinApi(AndroidApiLevel.B)
        .enableCoreLibraryDesugaring(AndroidApiLevel.B)
        .compile()
        .inspect(this::assertWrappers)
        .writeToZip();
    Path path2 = testForD8()
        .addProgramClasses(Executor2.class)
        .setMinApi(AndroidApiLevel.B)
        .enableCoreLibraryDesugaring(AndroidApiLevel.B)
        .compile()
        .inspect(this::assertWrappers)
        .writeToZip();
    testForD8()
        .addProgramFiles(path1, path2)
        .compile()
        .addDesugaredCoreLibraryRunClassPath(this::buildDesugaredLibrary, AndroidApiLevel.B)
        .run(new DexRuntime(DexVm.ART_9_0_0_HOST), Executor1.class)
        .assertSuccessWithOutput(StringUtils.lines("[1, 2, 3]"));
  }

  private void assertWrappers(CodeInspector inspector) {
    assertEquals(2,inspector.allClasses().stream().filter(c -> c.getOriginalName().contains(
        DesugaredLibraryWrapperSynthesizer.WRAPPER_PREFIX)).count());
  }

  static class Executor1 {

    public static void main(String[] args) {
      int[] ints = new int[3];
      Arrays.setAll(ints,x->x+1);
      System.out.println(Arrays.toString(ints));
    }
  }

  static class Executor2 {

    public static void main(String[] args) {
      int[] ints = new int[3];
      Arrays.setAll(ints,x->x+2);
      System.out.println(Arrays.toString(ints));
    }
  }

}
