#include <QtTest/QtTest>

#include "ConsoleOutput.h"
#include "ConsoleOutput_test.h"

using namespace std;

namespace HeadlessSpecRunner {
  ConsoleOutputTest::ConsoleOutputTest() : QObject() {
  }

  void ConsoleOutputTest::testPassed() {
    stringstream buffer;
    HeadlessSpecRunner::ConsoleOutput output;

    output.consoleLogUsed = true;
    output.outputIO = &buffer;
    output.passed("test");
    QVERIFY(buffer.str() == ".");
    QVERIFY(output.successes.size() == 1);
    QVERIFY(output.failures.size() == 0);
    QVERIFY(output.consoleLogUsed == false);
  }

  void ConsoleOutputTest::testFailed() {
    stringstream buffer;
    HeadlessSpecRunner::ConsoleOutput output;

    output.consoleLogUsed = true;
    output.outputIO = &buffer;
    output.failed("test");
    QVERIFY(buffer.str() == "F");
    QVERIFY(output.successes.size() == 0);
    QVERIFY(output.failures.size() == 1);
    QVERIFY(output.consoleLogUsed == false);
  }

  void ConsoleOutputTest::testErrorLog() {
    stringstream buffer;
    HeadlessSpecRunner::ConsoleOutput output;

    output.outputIO = &buffer;
    output.errorLog("message", 1, "source");
    QVERIFY(buffer.str() == "[error] source:1 : message\n");
  }

  void ConsoleOutputTest::testInternalLog() {
    stringstream buffer;
    HeadlessSpecRunner::ConsoleOutput output;

    output.outputIO = &buffer;
    output.internalLog("note", "message");
    QVERIFY(buffer.str() == "[note] message\n");
  }

  void ConsoleOutputTest::testConsoleLog() {
    stringstream buffer;
    HeadlessSpecRunner::ConsoleOutput output;

    output.consoleLogUsed = false;
    output.outputIO = &buffer;
    output.consoleLog("log");
    QVERIFY(buffer.str() == "\n[console] log\n");
  }

  void ConsoleOutputTest::testConsoleLogUsed() {
    stringstream buffer;
    HeadlessSpecRunner::ConsoleOutput output;

    output.consoleLogUsed = true;
    output.outputIO = &buffer;
    output.consoleLog("log");
    QVERIFY(buffer.str() == "[console] log\n");
  }

  void ConsoleOutputTest::testLogSpecFilename() {
    stringstream buffer;
    HeadlessSpecRunner::ConsoleOutput output;

    output.outputIO = &buffer;
    output.logSpecFilename("whatever");
    QVERIFY(buffer.str() == "\n\nwhatever\n");
  }

  void ConsoleOutputTest::testLogSpecResult() {
    stringstream buffer;
    HeadlessSpecRunner::ConsoleOutput output;

    output.outputIO = &buffer;
    output.logSpecResult("whatever");
    QVERIFY(buffer.str() == "  whatever\n");
  }

  void ConsoleOutputTest::testReportResultsFailedSingular() {
    stringstream buffer;
    HeadlessSpecRunner::ConsoleOutput output;

    output.outputIO = &buffer;
    output.reportFailure("1", "1", "1");
    QVERIFY(buffer.str() == "\nFAIL: 1 test, 1 failure, 1 sec.\n");
  }

  void ConsoleOutputTest::testReportResultsFailedPlural() {
    stringstream buffer;
    HeadlessSpecRunner::ConsoleOutput output;

    output.outputIO = &buffer;
    output.reportFailure("2", "2", "2");
    QVERIFY(buffer.str() == "\nFAIL: 2 tests, 2 failures, 2 secs.\n");
  }

  void ConsoleOutputTest::testReportResultsSucceeded() {
    stringstream buffer;
    HeadlessSpecRunner::ConsoleOutput output;

    output.outputIO = &buffer;
    output.reportSuccess("2", "2", "2");
    QVERIFY(buffer.str() == "\nPASS: 2 tests, 2 failures, 2 secs.\n");
  }

  void ConsoleOutputTest::testReportResultsSucceededWithJSErrors() {
    stringstream buffer;
    HeadlessSpecRunner::ConsoleOutput output;

    output.outputIO = &buffer;
    output.reportSuccessWithJSErrors("2", "2", "2");
    QVERIFY(buffer.str() == "\nPASS with JS errors: 2 tests, 2 failures, 2 secs.\n");
  }
}

QTEST_MAIN(HeadlessSpecRunner::ConsoleOutputTest);