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

import com.google.auto.value.AutoValue;

/**
 * Stores branch coverage information.
 */
@AutoValue
abstract class BranchCoverage {

  static BranchCoverage create(int lineNumber, int nrOfExecutions) {
    return new AutoValue_BranchCoverage(
        lineNumber, /*blockNumber=*/ "", /*branchNumber=*/ "", nrOfExecutions);
  }

  static BranchCoverage createWithBlockAndBranch(
      int lineNumber, String blockNumber, String branchNumber, int nrOfExecutions) {
    return new AutoValue_BranchCoverage(lineNumber, blockNumber, branchNumber, nrOfExecutions);
  }

  /**
   * Merges two given instances of {@link BranchCoverage}.
   *
   * Calling {@code lineNumber()}, {@code blockNumber()} and {@code branchNumber()} must return the
   * same values for {@code first} and {@code second}.
   */
  static BranchCoverage merge(BranchCoverage first, BranchCoverage second) {
    assert first.lineNumber() == second.lineNumber();
    assert first.blockNumber().equals(second.blockNumber());
    assert first.branchNumber().equals(second.branchNumber());

    return createWithBlockAndBranch(
        first.lineNumber(),
        first.blockNumber(),
        first.branchNumber(),
        first.nrOfExecutions() + second.nrOfExecutions());
  }

  abstract int lineNumber();
  // The two numbers below should be -1 for non-gcc emitted coverage (e.g. Java).
  abstract String blockNumber();  // internal gcc internal ID for the branch
  abstract String branchNumber(); // internal gcc internal ID for the branch
  abstract int nrOfExecutions();

  boolean wasExecuted() {
    return nrOfExecutions() > 0;
  }
}
