import 'dart:io' show exitCode;

import 'package:analyzer_cli/src/driver.dart' show Driver, outSink, errorSink;
import 'package:analyzer_cli/src/options.dart' show ExitHandler, exitHandler;
import 'package:path/path.dart';
import 'package:unittest/unittest.dart';

import 'utils.dart' show testDirectory;

main() {
  group('--x-package-warnings-prefix', () {
    _Runner runner;

    setUp(() {
      runner = new _Runner.setUp();
    });

    tearDown(() {
      runner.tearDown();
      runner = null;
    });

    test('shows only the hint whose package matches the prefix', () {
      runner.run([
        "--packages",
        join(testDirectory, 'data', 'package_prefix', 'packagelist'),
        "--x-package-warnings-prefix=f",
        join(testDirectory, 'data', 'package_prefix', 'main.dart')
      ]);
      expect(runner.stdout, contains('1 hint found'));
      expect(runner.stdout, contains('Unused import'));
      expect(runner.stdout,
          contains(join('package_prefix', 'pkg', 'foo', 'foo.dart')));
      expect(runner.stdout, isNot(contains('bar.dart')));
    });
  });
}

class _Runner {
  final _stdout = new StringBuffer();
  final _stderr = new StringBuffer();

  final StringSink _savedOutSink;
  final StringSink _savedErrorSink;
  final int _savedExitCode;
  final ExitHandler _savedExitHandler;

  _Runner.setUp()
      : _savedOutSink = outSink,
        _savedErrorSink = errorSink,
        _savedExitHandler = exitHandler,
        _savedExitCode = exitCode {
    outSink = _stdout;
    errorSink = _stderr;
    exitHandler = (_) {};
  }

  String get stderr => _stderr.toString();

  String get stdout => _stdout.toString();
  void run(List<String> args) {
    new Driver().start(args);
    if (stderr.isNotEmpty) {
      fail("Unexpected output to stderr:\n$stderr");
    }
  }

  void tearDown() {
    outSink = _savedOutSink;
    errorSink = _savedErrorSink;
    exitCode = _savedExitCode;
    exitHandler = _savedExitHandler;
  }
}
