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

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

import com.android.tools.r8.CompilationMode;
import com.android.tools.r8.D8Command;
import com.android.tools.r8.OutputMode;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.ToolHelper.ArtCommandBuilder;
import com.android.tools.r8.ToolHelper.ProcessResult;
import java.nio.file.Files;
import java.nio.file.Path;
import org.junit.Test;

public class PreamblePositionTestRunner extends TestBase {

  private static final String TEST_CLASS = "PreamblePositionTestSource";
  private static final String TEST_PACKAGE = "com.android.tools.r8.debuginfo";

  @Test
  public void testBothBranchesDefaultConditionals() throws Exception {
    testBothBranches(false);
  }

  @Test
  public void testBothBranchesInvertConditionals() throws Exception {
    testBothBranches(true);
  }

  private void testBothBranches(boolean invertConditionals) throws Exception {
    Path testClassPath = temp.newFolder().toPath().resolve(TEST_CLASS + ".class");
    Path outputDexPath = temp.newFolder().toPath();

    Files.write(testClassPath, PreamblePositionTestSourceDump.dump());

    ToolHelper.runD8(
        D8Command.builder()
            .addProgramFiles(testClassPath)
            .setOutput(outputDexPath, OutputMode.DexIndexed)
            .setMode(CompilationMode.RELEASE),
        options -> {
          options.testing.invertConditionals = invertConditionals;
        });

    String fileName = TEST_CLASS + ".java";

    for (boolean testTrueBranch : new boolean[] {false, true}) {
      ArtCommandBuilder artCommandBuilder = new ArtCommandBuilder();
      artCommandBuilder.appendClasspath(outputDexPath.resolve("classes.dex").toString());
      artCommandBuilder.setMainClass(TEST_PACKAGE + "." + TEST_CLASS);
      if (!testTrueBranch) {
        artCommandBuilder.appendProgramArgument("1");
      }

      ProcessResult result = ToolHelper.runArtRaw(artCommandBuilder);

      assertNotEquals(result.exitCode, 0);
      if (testTrueBranch) {
        assertTrue(result.stderr.contains("<true-branch-exception>"));
        // Must have either explicit line = 0 or no line info at all.
        assertTrue(
            result.stderr.contains(fileName + ":0")
                || (result.stderr.contains("at " + TEST_PACKAGE + "." + TEST_CLASS + ".main")
                    && !result.stderr.contains(fileName + ":")));
      } else {
        assertTrue(result.stderr.contains("<false-branch-exception>"));
        assertTrue(
            result.stderr.contains(
                fileName + ":" + PreamblePositionTestSourceDump.FALSE_BRANCH_LINE_NUMBER));
      }
    }
  }
}
