content: /*
   * Copyright (C) 2017 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 androidx.test.orchestrator.listeners;
  
  import androidx.test.orchestrator.junit.ParcelableDescription;
  import androidx.test.orchestrator.junit.ParcelableFailure;
  import java.io.PrintStream;
  import java.text.NumberFormat;
  import java.util.List;
  
  /**
   * Reimplementation of org.junit.TextListener that accepts {@link
   * androidx.test.orchestrator.AndroidTestOrchestrator} compatible objects.
   *
   * <p>{@link OrchestrationResultPrinter} is a near line by line copy of
   * InstrumentationResultPrinter, and since InstrumentationResultPrinter relies on
   * org.junit.internal.TextListener, this class exists for the {@link OrchestrationResultPrinter} to
   * rely on, until such time as we can resolve b/35394729 and unify their expertise.
   */
  public class TextListener
      extends androidx.test.orchestrator.listeners.OrchestrationRunListener {
  
    private final PrintStream writer;
  
    public TextListener(PrintStream writer) {
      this.writer = writer;
    }
  
    public void testRunFinished(OrchestrationResult result) {
      printHeader(result.getRunTime());
      printFailures(result);
      printFooter(result);
    }
  
    @Override
    public void testStarted(ParcelableDescription description) {
      writer.append('.');
    }
  
    @Override
    public void testFailure(ParcelableFailure failure) {
      writer.append('E');
    }
  
    @Override
    public void testIgnored(ParcelableDescription description) {
      writer.append('I');
    }
  
    private PrintStream getWriter() {
      return writer;
    }
  
    protected void printHeader(long runTime) {
      getWriter().println();
      getWriter().println("Time: " + elapsedTimeAsString(runTime));
    }
  
    protected void printFailures(OrchestrationResult result) {
      List<ParcelableFailure> failures = result.getFailures();
      if (failures.isEmpty()) {
        return;
      }
      if (failures.size() == 1) {
        getWriter().println("There was " + failures.size() + " failure:");
      } else {
        getWriter().println("There were " + failures.size() + " failures:");
      }
      int i = 1;
      for (ParcelableFailure each : failures) {
        printFailure(each, "" + i++);
      }
    }
  
    protected void printFailure(ParcelableFailure each, String prefix) {
      getWriter().println(prefix + ") " + each.getDescription().getDisplayName());
      getWriter().print(each.getTrace());
    }
  
    protected void printFooter(OrchestrationResult result) {
      if (result.wasSuccessful()) {
        getWriter().println();
        getWriter().print("OK");
        getWriter()
            .println(
                " (" + result.getRunCount() + " test" + (result.getRunCount() == 1 ? "" : "s") + ")");
  
      } else {
        getWriter().println();
        getWriter().println("FAILURES!!!");
        getWriter()
            .println(
                "Tests found: "
                    + result.getExpectedCount()
                    + ", Tests run: "
                    + result.getRunCount()
                    + ",  Failures: "
                    + result.getFailureCount());
      }
      getWriter().println();
    }
  
    /** Returns the formatted string of the elapsed time. Duplicated from BaseTestRunner. Fix it. */
    protected String elapsedTimeAsString(long runTime) {
      return NumberFormat.getInstance().format((double) runTime / 1000);
    }
  }
  