// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS 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:pub/src/exit_codes.dart';
import 'package:test/test.dart';

import '../test_pub.dart';

// TODO(sigurdm) consider rewriting all validator tests as integration tests.
// That would make them more robust, and test actual end2end behaviour.

// Prefer using expectValidation.
Future<void> expectValidationDeprecated(
  ValidatorCreator fn, {
  hints,
  warnings,
  errors,
  int? size,
}) async {
  final validator = await validatePackage(fn, size);
  expect(validator.errors, errors ?? isEmpty);
  expect(validator.warnings, warnings ?? isEmpty);
  expect(validator.hints, hints ?? isEmpty);
}

Future<void> expectValidation({
  error,
  int exitCode = 0,
  Map<String, String> environment = const {},
}) async {
  await runPub(
    error: error ?? contains('Package has 0 warnings.'),
    args: ['publish', '--dry-run'],
    // workingDirectory: d.path(appPath),
    exitCode: exitCode,
    environment: environment,
  );
}

Future<void> expectValidationWarning(
  error, {
  int count = 1,
  Map<String, String> environment = const {},
}) async {
  if (error is String) error = contains(error);
  final s = count == 1 ? '' : 's';
  await expectValidation(
    error: allOf([error, contains('Package has $count warning$s')]),
    exitCode: DATA,
    environment: environment,
  );
}

Future<void> expectValidationHint(
  hint, {
  int count = 1,
  Map<String, String> environment = const {},
}) async {
  if (hint is String) hint = contains(hint);
  final s = count == 1 ? '' : 's';
  await expectValidation(
    error: allOf([hint, contains('and $count hint$s')]),
    environment: environment,
  );
}

Future<void> expectValidationError(
  String text, {
  Map<String, String> environment = const {},
}) async {
  await expectValidation(
    error: allOf([
      contains(text),
      contains('Package validation found the following error:')
    ]),
    exitCode: DATA,
    environment: environment,
  );
}
