package net.thucydides.core.reports.history; import org.joda.time.DateTime; public class ProgressSnapshot implements Comparable<ProgressSnapshot> { private final DateTime time; private final String requirementType; private final int total; private final int estimated; private final int completed; private final int failed; private final String buildId; private ProgressSnapshot(DateTime time, String requirementType, int total, int completed, int estimated, int failed, String buildId) { this.time = time; this.requirementType = requirementType; this.total = total; this.completed = completed; this.estimated = estimated; this.failed = failed; this.buildId = buildId; } public static ProgressSnapshotBuilder forRequirementType(String requirementType) { return new ProgressSnapshotBuilder(requirementType); } public static ProgressSnapshot copyOf(ProgressSnapshot progressSnapshot) { return new ProgressSnapshot(progressSnapshot.time, progressSnapshot.requirementType, progressSnapshot.total, progressSnapshot.completed, progressSnapshot.estimated, progressSnapshot.failed, progressSnapshot.buildId); } public static class ProgressSnapshotBuilder { private final String requirementType; private int completed; private int estimated; private int total; private int failing; private DateTime time; private boolean useEstimatedValue = false; public ProgressSnapshotBuilder(String requirementType) { this.requirementType = requirementType; this.time = DateTime.now(); } public ProgressSnapshotBuilder atTime(DateTime time) { this.time = time; return this; } public ResultCountBuilder with(int count) { return new ResultCountBuilder(count, this); } public ResultCountBuilder and(int count) { return new ResultCountBuilder(count, this); } public ProgressSnapshotBuilder outOf(int totalRequirements) { this.total = totalRequirements; return this; } public ProgressSnapshot forBuild(String buildId) { return new ProgressSnapshot(time, requirementType, total, completed, useEstimatedValue ? estimated : completed, failing, buildId); } public static class ResultCountBuilder { private final int count; private final ProgressSnapshotBuilder snapshotBuilder; public ResultCountBuilder(int count, ProgressSnapshotBuilder snapshotBuilder) { this.count = count; this.snapshotBuilder = snapshotBuilder; } public ProgressSnapshotBuilder completed() { snapshotBuilder.completed = count; return snapshotBuilder; } public ProgressSnapshotBuilder estimated() { snapshotBuilder.estimated = count; snapshotBuilder.useEstimatedValue = true; return snapshotBuilder; } public ProgressSnapshotBuilder failed() { snapshotBuilder.failing = count; return snapshotBuilder; } } } public DateTime getTime() { return time; } public String getRequirementType() { return requirementType; } public int getTotal() { return total; } public int getCompleted() { return completed; } public int getEstimated() { return estimated; } public int getFailed() { return failed; } public String getBuildId() { return buildId; } public String getFormattedTime() { return time.toString("yyyy/MM/dd hh:mm:ss"); } public int compareTo(ProgressSnapshot other) { if (this == other) { return 0; } else { return this.getTime().compareTo(other.getTime()); } } }