// Copyright (c) 2018, 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.debug;

import static org.junit.Assert.assertEquals;

import com.android.tools.r8.ByteDataView;
import com.android.tools.r8.ClassFileConsumer.ArchiveConsumer;
import com.android.tools.r8.CompilationMode;
import com.android.tools.r8.OutputMode;
import com.android.tools.r8.R8Command;
import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.ToolHelper.DexVm;
import com.android.tools.r8.ToolHelper.ProcessResult;
import com.android.tools.r8.debug.DebugTestBase.JUnit3Wrapper.DebuggeeState;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.utils.DescriptorUtils;
import com.google.common.collect.ImmutableList;
import java.io.IOException;
import java.nio.file.Path;
import java.util.stream.Stream;
import org.junit.Assume;
import org.junit.Test;

public class ArrayDimensionGreaterThanSevenTestRunner extends DebugTestBase {

  private static final Class CLASS = ArrayDimensionGreaterThanSevenTest.class;
  private static final String NAME = CLASS.getCanonicalName();

  private DebugTestConfig getR8CfConfig(String s)
      throws IOException, com.android.tools.r8.CompilationFailedException {
    Path cfOut = temp.getRoot().toPath().resolve(s);
    ToolHelper.runR8(
        R8Command.builder()
            .addClassProgramData(ToolHelper.getClassAsBytes(CLASS), Origin.unknown())
            .setMode(CompilationMode.DEBUG)
            .addLibraryFiles(ToolHelper.getJava8RuntimeJar())
            .setOutput(cfOut, OutputMode.ClassFile)
            .setDisableTreeShaking(true)
            .setDisableMinification(true)
            .addProguardConfiguration(ImmutableList.of("-keepattributes *"), Origin.unknown())
            .build());
    return new CfDebugTestConfig(cfOut);
  }

  private Stream<DebuggeeState> createStream(DebugTestConfig config) throws Exception {
    return streamDebugTest(config, NAME, ANDROID_FILTER);
  }

  @Test
  // Once R8 does not use expanded frames this can be enabled again.
  public void test() throws Exception {
    // TODO(b/199700280): Reenable on 12.0.0 when we have the libjdwp.so file include and the flags
    // fixed.
    Assume.assumeTrue(
        "Skipping test " + testName.getMethodName() + " because debugging not enabled in 12.0.0",
        !ToolHelper.getDexVm().isEqualTo(DexVm.ART_12_0_0_HOST));
    Assume.assumeTrue(ToolHelper.getDexVm().isNewerThan(DexVm.ART_5_1_1_HOST)
        && !ToolHelper.isWindows());
    DebugTestConfig cfConfig = new CfDebugTestConfig().addPaths(ToolHelper.getClassPathForTests());
    DebugTestConfig d8Config = new D8DebugTestConfig().compileAndAddClasses(temp, CLASS);
    DebugTestConfig r8CfConfig = getR8CfConfig("r8cf.jar");
    new DebugStreamComparator()
        .add("CF", createStream(cfConfig))
        .add("R8/CF", createStream(r8CfConfig))
        .add("D8", createStream(d8Config))
        .compare();
  }

  @Test
  // Verify that ASM fails when using expanded frames directly.
  // See b/111296969
  // Right now the test passes because the dump uses up to 7 dimensions
  // But we need to update it to check for the 31-32 boundary
  public void runTestOnAsmDump() throws Exception {
    Path out = temp.getRoot().toPath().resolve("out.jar");
    ArchiveConsumer consumer = new ArchiveConsumer(out);
    consumer.accept(
        ByteDataView.of(ArrayDimensionGreaterThanSevenTestDump.dump()),
        DescriptorUtils.javaTypeToDescriptor(NAME),
        null);
    consumer.finished(null);
    ProcessResult result = ToolHelper.runJava(out, NAME);
    assertEquals("Assumes ASM can go up to 7 dimensions", 0, result.exitCode);
  }
}
