// Copyright (c) 2021, 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:test/test.dart';

import '../utils.dart';

const int errorExitCode = 64;

void main() {
  group('doc', defineDocTests, timeout: longTimeout);
}

void defineDocTests() {
  test('--help', () async {
    final p = project();
    final result = await p.run(['doc', '--help']);
    expect(
      result.stdout,
      contains('Usage: dart doc [arguments] [<directory>]'),
    );
    expect(result.exitCode, 0);
  });

  test('Passing multiple directories fails', () async {
    final p = project();
    final result = await p.run(['doc', 'foo', 'bar']);
    expect(result.stderr,
        contains("'dart doc' only supports one input directory.'"));
    expect(result.exitCode, errorExitCode);
  });

  test('defaults to documenting cwd', () async {
    final p = project(mainSrc: 'void main() { print("Hello, World"); }');
    p.file('lib/foo.dart', '''
/// This is Foo. It uses [Bar].
class Foo {
  Bar bar;
}

/// Bar is very nice.
class Bar {
  _i = 42;
}
''');
    final result = await p.run(['doc'], workingDir: p.dirPath);
    expect(result.stdout, contains('Documenting dartdev_temp'));
    expect(result.exitCode, 0);
  });

  test('Document a library', () async {
    final p = project(mainSrc: 'void main() { print("Hello, World"); }');
    p.file('lib/foo.dart', '''
/// This is Foo. It uses [Bar].
class Foo {
  Bar bar;
}

/// Bar is very nice.
class Bar {
  _i = 42;
}
''');
    final result = await p.run(['doc', '--validate-links', p.dirPath]);
    expect(result.stdout, contains('Documenting dartdev_temp'));
    expect(result.exitCode, 0);
  });

  test('Document a library dry-run', () async {
    final p = project(mainSrc: 'void main() { print("Hello, World"); }');
    p.file('lib/foo.dart', '''
/// This is Foo.
class Foo {
  int i = 42;
}
''');
    final result = await p.run(['doc', '--dry-run', '--verbose', p.dirPath]);
    expect(result.stdout, contains('Using the following options: [--input='));
    // TODO(devoncarew): We should update package:dartdoc to emit some
    // "Documenting ..." text here.
    expect(result.stdout, isNot(contains('Documenting dartdev_temp')));
    expect(result.exitCode, 0);
  });

  test('Errors cause error code', () async {
    final p = project(mainSrc: 'void main() { print("Hello, World"); }');
    p.file('lib/foo.dart', '''
/// This is Foo. It uses [TypeThatIsntDeclared].
class Foo {
  int i = 42;
}
''');
    p.file('dartdoc_options.yaml', '''
dartdoc:
  errors:
    - unresolved-doc-reference
''');
    final result = await p.run(['doc', p.dirPath]);
    expect(result.exitCode, 1);
  });

  test('Document a library with broken link is flagged', () async {
    final source = '''
/// This is Foo. It uses [Baz].
class Foo {
  int i = 42;
}
''';

    final p = project(mainSrc: 'void main() { print("Hello, World"); }');
    p.file('lib/foo.dart', source);
    final result = await p.run(['doc', '--validate-links', p.dirPath]);
    // TODO (mit): Update this test to actually test for the
    // --validate-links flag.
    expect(result.stdout, contains('Documenting dartdev_temp'));
  });
}
