/*
 * Copyright 2013-present Facebook, Inc.
 *
 * 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.facebook.buck.event.listener;

import static org.junit.Assert.assertEquals;

import com.facebook.buck.model.BuildTargetFactory;
import com.facebook.buck.test.TestCaseSummary;
import com.facebook.buck.test.TestResultSummary;
import com.facebook.buck.test.TestResults;
import com.facebook.buck.util.Ansi;
import com.facebook.buck.util.environment.Platform;
import com.google.common.base.Joiner;
import com.google.common.base.Throwables;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;

import org.junit.Before;
import org.junit.Test;

public class TestResultFormatterTest {

  private TestResultFormatter formatter;
  private TestResultSummary successTest;
  private TestResultSummary failingTest;
  private String stackTrace;

  @Before
  public void createFormatter() {
    formatter = new TestResultFormatter(new Ansi(Platform.LINUX));
  }

  @Before
  public void createTestResults() {
    stackTrace = Throwables.getStackTraceAsString(new Exception("Ouch"));

    successTest = new TestResultSummary(
        "com.example.FooTest",
        "successTest",
        true,
        500,
         /*message*/ null,
         /*stacktrace*/ null,
         "good stdout",
         "good stderr");

    failingTest = new TestResultSummary(
        "com.example.FooTest",
        "failTest",
        false,
        200,
        "Unexpected fish found",
        stackTrace,
        "bad stdout",
        "bad stderr");
  }

  @Test
  public void shouldShowTargetsForTestsThatAreAboutToBeRun() {
    ImmutableList.Builder<String> builder = ImmutableList.builder();

    formatter.runStarted(builder, false, ImmutableList.of("//:example", "//foo:bar"));

    assertEquals("TESTING //:example //foo:bar", toString(builder));
  }

  @Test
  public void shouldShowThatAllTestAreBeingRunWhenRunIsStarted() {
    ImmutableList.Builder<String> builder = ImmutableList.builder();

    formatter.runStarted(builder, true, ImmutableList.of("//:example", "//foo:bar"));

    assertEquals("TESTING ALL TESTS", toString(builder));
  }

  @Test
  public void shouldIndicateThatNoTestRanIfNoneRan() {
    ImmutableList.Builder<String> builder = ImmutableList.builder();

    formatter.runComplete(builder, ImmutableList.<TestResults>of());

    assertEquals("NO TESTS RAN", toString(builder));
  }

  @Test
  public void allTestsPassingShouldBeAcknowledged() {
    TestCaseSummary summary = new TestCaseSummary(
        "com.example.FooTest", ImmutableList.of(successTest));
    TestResults results = new TestResults(ImmutableList.of(summary));
    ImmutableList.Builder<String> builder = ImmutableList.builder();

    formatter.runComplete(builder, ImmutableList.of(results));

    assertEquals("TESTS PASSED", toString(builder));
  }

  @Test
  public void shouldReportTheNumberOfFailingTests() {
    TestCaseSummary summary = new TestCaseSummary(
        "com.example.FooTest", ImmutableList.of(successTest, failingTest));
    TestResults results = new TestResults(
        BuildTargetFactory.newInstance("//foo:bar"),
        ImmutableList.of(summary),
        /* contacts */ ImmutableSet.<String>of());
    ImmutableList.Builder<String> builder = ImmutableList.builder();

    formatter.runComplete(builder, ImmutableList.of(results));

    String expectedOutput = Joiner.on('\n').join(
        "TESTS FAILED: 1 Failures",
        "Failed target: //foo:bar",
        "FAIL com.example.FooTest");
    assertEquals(expectedOutput, toString(builder));
  }

  @Test
  public void shouldReportMinimalInformationForAPassingTest() {
    TestCaseSummary summary = new TestCaseSummary(
        "com.example.FooTest", ImmutableList.of(successTest));
    TestResults results = new TestResults(ImmutableList.of(summary));
    ImmutableList.Builder<String> builder = ImmutableList.builder();

    formatter.reportResult(builder, results);

    assertEquals("PASS  500ms  1 Passed   0 Failed   com.example.FooTest",
        toString(builder));
  }

  @Test
  public void shouldOutputStackTraceStdOutAndStdErrOfFailingTest() {
    TestCaseSummary summary = new TestCaseSummary(
        "com.example.FooTest", ImmutableList.of(failingTest));
    TestResults results = new TestResults(ImmutableList.of(summary));
    ImmutableList.Builder<String> builder = ImmutableList.builder();

    formatter.reportResult(builder, results);

    String expected = String.format(Joiner.on('\n').join(
        "FAIL  200ms  0 Passed   1 Failed   com.example.FooTest",
        "FAILURE %s: %s",
        "%s",
        "====STANDARD OUT====",
        "%s",
        "====STANDARD ERR====",
        "%s"),
        failingTest.getTestName(),
        failingTest.getMessage(),
        stackTrace.toString(),
        failingTest.getStdOut(),
        failingTest.getStdErr());

    assertEquals(expected, toString(builder));
  }

  private String toString(ImmutableList.Builder<String> builder) {
    return Joiner.on('\n').join(builder.build());
  }
}
