// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

import 'package:test/test.dart';

import 'package:pub/src/exit_codes.dart' as exit_codes;

import '../test_pub.dart';

/// Runs separate integration tests for "pub build", "pub serve", and
/// "pub build --format json" and validates that in all cases, it fails with
/// an expected error message and exits with [exitCode].
///
/// The integrations assume set up is already done, so you will likely want to
/// call [setUp] before this.
///
/// If [error] is provided, then both pub build and pub serve should exit with
/// that message. Otherwise, [buildError] is the expected error from pub build
/// and [serveError] from pub serve.
void pubBuildAndServeShouldFail(String description,
    {List<String> args,
    String error,
    String buildError,
    String serveError,
    int exitCode}) {
  if (error != null) {
    assert(buildError == null);
    buildError = error;

    assert(serveError == null);
    serveError = error;
  }

  // Usage errors also print the usage, so validate that.
  Object buildExpectation = buildError;
  Object serveExpectation = serveError;
  if (exitCode == exit_codes.USAGE) {
    buildExpectation =
        allOf(contains(buildExpectation), contains("Usage: pub build"));
    serveExpectation =
        allOf(contains(serveExpectation), contains("Usage: pub serve"));
  } else {
    buildExpectation = contains(buildExpectation);
    serveExpectation = contains(serveExpectation);
  }

  test("build fails $description", () {
    return runPub(
        args: ["build"]..addAll(args),
        error: buildExpectation,
        exitCode: exitCode);
  });

  test("build --format json fails $description", () {
    return runPub(
        args: ["build", "--format", "json"]..addAll(args),
        outputJson: {
          "error": buildError // No usage in JSON output.
        },
        exitCode: exitCode);
  });

  test("serve fails $description", () {
    return runPub(
        args: ["serve"]..addAll(args),
        error: serveExpectation,
        exitCode: exitCode);
  });
}
