| /* |
| * Copyright (C) 2010 The Android Open Source Project |
| * |
| * 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 vogar; |
| |
| import com.google.common.collect.Lists; |
| import com.google.common.collect.Ordering; |
| import java.util.ArrayList; |
| import java.util.List; |
| import java.util.SortedMap; |
| |
| /** |
| * Contains an outcome for a test, along with some metadata pertaining to the history of this test, |
| * including a list of previous outcomes, an outcome corresponding to the tag Vogar is being run |
| * with, if applicable, and the expectation for this test, so that result value information is |
| * available. |
| */ |
| public final class AnnotatedOutcome { |
| public static Ordering<AnnotatedOutcome> ORDER_BY_NAME = new Ordering<AnnotatedOutcome>() { |
| @Override public int compare(AnnotatedOutcome a, AnnotatedOutcome b) { |
| return a.getName().compareTo(b.getName()); |
| } |
| }; |
| |
| private final Expectation expectation; |
| private final Outcome outcome; |
| /** a list of previous outcomes for the same action, sorted in chronological order */ |
| private final SortedMap<Long, Outcome> previousOutcomes; |
| /** will be null if not comparing to a tag */ |
| private final String tagName; |
| private final Outcome tagOutcome; |
| private final boolean hasMetadata; |
| |
| AnnotatedOutcome(Outcome outcome, Expectation expectation, |
| SortedMap<Long, Outcome> previousOutcomes, String tagName, Outcome tagOutcome, |
| boolean hasMetadata) { |
| if (previousOutcomes == null) { |
| throw new NullPointerException(); |
| } |
| this.expectation = expectation; |
| this.outcome = outcome; |
| this.previousOutcomes = previousOutcomes; |
| this.tagName = tagName; |
| this.tagOutcome = tagOutcome; |
| this.hasMetadata = hasMetadata; |
| } |
| |
| public Outcome getOutcome() { |
| return outcome; |
| } |
| |
| public String getName() { |
| return outcome.getName(); |
| } |
| |
| public ResultValue getResultValue() { |
| return outcome.getResultValue(expectation); |
| } |
| |
| public List<ResultValue> getPreviousResultValues() { |
| List<ResultValue> previousResultValues = new ArrayList<ResultValue>(); |
| for (Outcome previousOutcome : previousOutcomes.values()) { |
| previousResultValues.add(previousOutcome.getResultValue(expectation)); |
| } |
| return previousResultValues; |
| } |
| |
| /** |
| * Returns the most recent result value of a run of this test (before the current run). |
| */ |
| public ResultValue getMostRecentResultValue(ResultValue defaultValue) { |
| List<ResultValue> previousResultValues = getPreviousResultValues(); |
| return previousResultValues.isEmpty() ? |
| defaultValue : |
| previousResultValues.get(previousResultValues.size() - 1); |
| } |
| |
| public boolean hasTag() { |
| return tagOutcome != null; |
| } |
| |
| public String getTagName() { |
| return tagName; |
| } |
| |
| public ResultValue getTagResultValue() { |
| return tagOutcome == null ? null : tagOutcome.getResultValue(expectation); |
| } |
| |
| /** |
| * Returns true if the outcome is noteworthy given the result value and previous history. |
| */ |
| public boolean isNoteworthy() { |
| return getResultValue() != ResultValue.OK || recentlyChanged() || changedSinceTag(); |
| } |
| |
| public boolean outcomeChanged() { |
| List<Outcome> previousOutcomesList = getOutcomeList(); |
| return previousOutcomesList.isEmpty() |
| || !outcome.equals(previousOutcomesList.get(previousOutcomesList.size() - 1)); |
| } |
| |
| private ArrayList<Outcome> getOutcomeList() { |
| return new ArrayList<Outcome>(previousOutcomes.values()); |
| } |
| |
| /** |
| * Returns true if the outcome recently changed in result value. |
| */ |
| private boolean recentlyChanged() { |
| List<ResultValue> previousResultValues = getPreviousResultValues(); |
| if (previousResultValues.isEmpty()) { |
| return false; |
| } |
| return previousResultValues.get(previousResultValues.size() - 1) != getResultValue(); |
| } |
| |
| private boolean changedSinceTag() { |
| ResultValue tagResultValue = getTagResultValue(); |
| return tagResultValue != null && tagResultValue != getResultValue(); |
| } |
| |
| /** |
| * Returns a Long representing the time the outcome was last run. Returns {@code defaultValue} |
| * if the outcome is not known to have run before. |
| */ |
| public Long lastRun(Long defaultValue) { |
| if (!hasMetadata) { |
| return defaultValue; |
| } |
| List<Long> runTimes = Lists.newArrayList(previousOutcomes.keySet()); |
| return runTimes.isEmpty() ? defaultValue : runTimes.get(runTimes.size() - 1); |
| } |
| } |