// Copyright 2018 The Bazel Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//    http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package com.google.devtools.coverageoutputgenerator;

import static com.google.common.truth.Truth.assertThat;
import static com.google.devtools.coverageoutputgenerator.LcovMergerTestUtils.assertMergedFunctionsExecution;
import static com.google.devtools.coverageoutputgenerator.LcovMergerTestUtils.assertMergedLineNumbers;
import static com.google.devtools.coverageoutputgenerator.LcovMergerTestUtils.assertMergedLines;
import static com.google.devtools.coverageoutputgenerator.LcovMergerTestUtils.assertMergedSourceFile;
import static com.google.devtools.coverageoutputgenerator.LcovMergerTestUtils.assertTracefile1;
import static com.google.devtools.coverageoutputgenerator.LcovMergerTestUtils.createLinesExecution1;
import static com.google.devtools.coverageoutputgenerator.LcovMergerTestUtils.createLinesExecution2;
import static com.google.devtools.coverageoutputgenerator.LcovMergerTestUtils.createSourceFile1;
import static com.google.devtools.coverageoutputgenerator.LcovMergerTestUtils.createSourceFile2;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;

/** Unit tests for {@link SourceFileCoverage}. */
@RunWith(JUnit4.class)
public class SourceFileCoverageTest {

  private int[] linesExecution1;
  private int[] linesExecution2;
  private SourceFileCoverage sourceFile1;
  private SourceFileCoverage sourceFile2;

  @Before
  public void initializeExecutionCountTracefiles() {
    linesExecution1 = createLinesExecution1();
    linesExecution2 = createLinesExecution2();

    sourceFile1 = createSourceFile1(linesExecution1);
    sourceFile2 = createSourceFile2(linesExecution2);
  }

  @Test
  public void testCopyConstructor() {
    assertTracefile1(new SourceFileCoverage(sourceFile1));
  }

  @Test
  public void testMergeFunctionNameToLineNumber() {
    assertMergedLineNumbers(SourceFileCoverage.mergeLineNumbers(sourceFile1, sourceFile2));
  }

  @Test
  public void testMergeFunctionNameToExecutionCount() {
    assertMergedFunctionsExecution(
        SourceFileCoverage.mergeFunctionsExecution(sourceFile1, sourceFile2));
  }

  @Test
  public void testMergeLineNumberToLineExecution() {
    assertMergedLines(
        SourceFileCoverage.mergeLines(sourceFile1, sourceFile2), linesExecution1, linesExecution2);
  }

  @Test
  public void testMerge() throws Exception {
    assertMergedSourceFile(
        SourceFileCoverage.merge(sourceFile1, sourceFile2), linesExecution1, linesExecution2);
  }

  @Test
  public void testIncompatibleBaBranchMergeDrops() throws Exception {
    sourceFile1 = new SourceFileCoverage("source");
    sourceFile2 = new SourceFileCoverage("source");
    sourceFile1.addBranch(800, BranchCoverage.create(800, 2));
    sourceFile1.addBranch(800, BranchCoverage.create(800, 1));
    sourceFile2.addBranch(800, BranchCoverage.create(800, 2));
    sourceFile2.addBranch(800, BranchCoverage.create(800, 2));
    sourceFile2.addBranch(800, BranchCoverage.create(800, 1));

    SourceFileCoverage merged = SourceFileCoverage.merge(sourceFile1, sourceFile2);

    assertThat(merged.getAllBranches())
        .containsExactly(BranchCoverage.create(800, 2), BranchCoverage.create(800, 1));
  }

  @Test
  public void testIncompatibleBrdaBranchMergeDrops() throws Exception {
    sourceFile1 = new SourceFileCoverage("source");
    sourceFile2 = new SourceFileCoverage("source");
    sourceFile1.addBranch(800, BranchCoverage.createWithBlockAndBranch(800, "0", "0", true, 1));
    sourceFile1.addBranch(800, BranchCoverage.createWithBlockAndBranch(800, "0", "1", true, 0));
    sourceFile2.addBranch(800, BranchCoverage.createWithBlockAndBranch(800, "1", "0", true, 3));
    sourceFile2.addBranch(800, BranchCoverage.createWithBlockAndBranch(800, "1", "1", true, 4));

    SourceFileCoverage merged = SourceFileCoverage.merge(sourceFile1, sourceFile2);

    assertThat(merged.getAllBranches())
        .containsExactly(
            BranchCoverage.createWithBlockAndBranch(800, "0", "0", true, 1),
            BranchCoverage.createWithBlockAndBranch(800, "0", "1", true, 0));
  }

  @Test
  public void testDifferentLinesReportedAreMergeable() throws Exception {
    sourceFile1 = new SourceFileCoverage("source");
    sourceFile2 = new SourceFileCoverage("source");
    sourceFile1.addBranch(1, BranchCoverage.createWithBlockAndBranch(1, "0", "0", true, 1));
    sourceFile1.addBranch(1, BranchCoverage.createWithBlockAndBranch(1, "0", "1", true, 1));
    sourceFile1.addLine(1, LineCoverage.create(1, 2, ""));
    sourceFile1.addLine(2, LineCoverage.create(2, 1, ""));
    sourceFile1.addLine(3, LineCoverage.create(3, 1, ""));

    sourceFile2.addBranch(30, BranchCoverage.createWithBlockAndBranch(30, "0", "0", true, 3));
    sourceFile2.addBranch(30, BranchCoverage.createWithBlockAndBranch(30, "0", "1", true, 0));
    sourceFile2.addBranch(30, BranchCoverage.createWithBlockAndBranch(30, "0", "2", true, 1));
    sourceFile2.addLine(30, LineCoverage.create(30, 4, ""));
    sourceFile2.addLine(31, LineCoverage.create(31, 3, ""));
    sourceFile2.addLine(32, LineCoverage.create(32, 0, ""));
    sourceFile2.addLine(33, LineCoverage.create(33, 1, ""));

    SourceFileCoverage merged = SourceFileCoverage.merge(sourceFile1, sourceFile2);
    assertThat(merged.getAllBranches())
        .containsExactly(
            BranchCoverage.createWithBlockAndBranch(1, "0", "0", true, 1),
            BranchCoverage.createWithBlockAndBranch(1, "0", "1", true, 1),
            BranchCoverage.createWithBlockAndBranch(30, "0", "0", true, 3),
            BranchCoverage.createWithBlockAndBranch(30, "0", "1", true, 0),
            BranchCoverage.createWithBlockAndBranch(30, "0", "2", true, 1));

    assertThat(merged.getAllLineExecution())
        .containsExactly(
            LineCoverage.create(1, 2, ""),
            LineCoverage.create(2, 1, ""),
            LineCoverage.create(3, 1, ""),
            LineCoverage.create(30, 4, ""),
            LineCoverage.create(31, 3, ""),
            LineCoverage.create(32, 0, ""),
            LineCoverage.create(33, 1, ""));
  }
}
