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

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

import com.android.tools.r8.ClassFileConsumer;
import com.android.tools.r8.CompilationFailedException;
import com.android.tools.r8.CompilationMode;
import com.android.tools.r8.ProgramConsumer;
import com.android.tools.r8.R8Command;
import com.android.tools.r8.R8Command.Builder;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.ToolHelper.ProcessResult;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.utils.ThrowingConsumer;
import java.nio.file.Path;
import org.junit.Test;

public class DebugInfoTestRunner extends TestBase {
  static final Class CLASS = DebugInfoTest.class;

  @Test
  public void test() throws Exception {
    ProcessResult runInput =
        ToolHelper.runJava(ToolHelper.getClassPathForTests(), CLASS.getCanonicalName());
    assertEquals(0, runInput.exitCode);
    Path out1 = temp.getRoot().toPath().resolve("out1.zip");
    build(
        builder -> builder.addClassProgramData(ToolHelper.getClassAsBytes(CLASS), Origin.unknown()),
        new ClassFileConsumer.ArchiveConsumer(out1));
    ProcessResult run1 = ToolHelper.runJava(out1, CLASS.getCanonicalName());
    assertEquals(runInput.toString(), run1.toString());
    Path out2 = temp.getRoot().toPath().resolve("out2.zip");
    boolean invalidDebugInfo = false;
    try {
      build(builder -> builder.addProgramFiles(out1), new ClassFileConsumer.ArchiveConsumer(out2));
    } catch (CompilationFailedException e) {
      invalidDebugInfo = e.getCause().getMessage().contains("Invalid debug info");
    }
    // TODO(b/77522100): Change to assertFalse when fixed.
    assertTrue(invalidDebugInfo);
    if (!invalidDebugInfo) {
      ProcessResult run2 = ToolHelper.runJava(out2, CLASS.getCanonicalName());
      assertEquals(runInput.toString(), run2.toString());
    }
  }

  private void build(ThrowingConsumer<Builder, Exception> input, ProgramConsumer consumer)
      throws Exception {
    Builder builder =
        R8Command.builder()
            .setMode(CompilationMode.DEBUG)
            .addLibraryFiles(ToolHelper.getJava8RuntimeJar())
            .setProgramConsumer(consumer);
    input.accept(builder);
    ToolHelper.runR8(builder.build(), o -> o.invalidDebugInfoFatal = true);
  }
}
