// 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 'dart:async';

import 'package:path/path.dart' as path;
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';

import '../support/integration_tests.dart';

void main() {
  defineReflectiveSuite(() {
    defineReflectiveTests(OptionsPackagesIntegrationTest);
  });
}

@reflectiveTest
class OptionsPackagesIntegrationTest
    extends AbstractAnalysisServerIntegrationTest {
  @override
  Future startServer({int? diagnosticPort, int? servicesPort}) {
    var fooPath = sourcePath('foo');
    writeFile(
      path.join(fooPath, 'lib', 'foo.dart'),
      'var my_foo = 0;',
    );

    var packagesPath = sourcePath('my_packages.json');
    writeFile(packagesPath, '''
{
  "configVersion": 2,
  "packages": [
    {
      "name": "foo",
      "rootUri": "${path.toUri(fooPath)}",
      "packageUri": "lib/",
      "languageVersion": "2.12"
    }
  ]
}
''');

    return server.start(
      dartSdkPath: dartSdkPath,
      diagnosticPort: diagnosticPort,
      servicesPort: servicesPort,
      packagesFile: packagesPath,
    );
  }

  Future<void> test_it() {
    var pathname = sourcePath('test.dart');
    writeFile(pathname, '''
import 'package:foo/foo.dart';
void f() {
  my_foo;
}
''');
    standardAnalysisSetup();
    return analysisFinished.then((_) {
      var errors = existingErrorsForFile(pathname);
      expect(errors, isEmpty);
    });
  }
}
