001package com.streamconverter.sloc;
002
003import java.io.Serial;
004import java.io.Serializable;
005
006/**
007 * モジュールごとの SLOC(実行可能行数)情報。
008 *
009 * <p>パイプライン内コマンド間の中間データとして {@link java.io.ObjectOutputStream} / {@link java.io.ObjectInputStream}
010 * で受け渡しされる。
011 *
012 * @param name モジュール名
013 * @param lines 総行数(missed + covered)
014 * @param covered カバー済み行数
015 * @param missed 未カバー行数
016 */
017public record ModuleSloc(String name, int lines, int covered, int missed) implements Serializable {
018  @Serial private static final long serialVersionUID = 1L;
019
020  /** 合計行を表す {@link #name()} の標準値。 */
021  public static final String TOTAL_NAME = "Total";
022
023  public ModuleSloc {
024    if (name == null || name.isBlank()) {
025      throw new IllegalArgumentException("name must not be null or blank");
026    }
027    if (covered < 0) {
028      throw new IllegalArgumentException("covered must be >= 0, got: " + covered);
029    }
030    if (missed < 0) {
031      throw new IllegalArgumentException("missed must be >= 0, got: " + missed);
032    }
033    if (lines != missed + covered) {
034      throw new IllegalArgumentException(
035          "lines must equal missed + covered ("
036              + missed
037              + " + "
038              + covered
039              + " = "
040              + (missed + covered)
041              + "), got: "
042              + lines);
043    }
044  }
045}