// Copyright (c) 2019, 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:io';

import 'package:analyzer/dart/analysis/features.dart';
import 'package:analyzer/dart/analysis/results.dart';
import 'package:analyzer/dart/analysis/utilities.dart';
import 'package:analyzer/file_system/memory_file_system.dart';
import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
import 'package:path/path.dart' as p;
import 'package:pub_semver/pub_semver.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';

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

@reflectiveTest
class UtilitiesTest with ResourceProviderMixin {
  FeatureSet get defaultFeatureSet =>
      FeatureSet.forTesting(sdkVersion: '2.2.2');

  test_parseFile_default_resource_provider() {
    String content = '''
void main() => print('Hello, world!');
    ''';
    ParseStringResult result = _withTemporaryFile(content,
        (path) => parseFile(path: path, featureSet: defaultFeatureSet));
    expect(result.content, content);
    expect(result.errors, isEmpty);
    expect(result.lineInfo, isNotNull);
    expect(result.unit.toString(),
        equals("void main() => print('Hello, world!');"));
  }

  test_parseFile_errors_noThrow() {
    String content = '''
void main() => print('Hello, world!')
''';
    ParseStringResult result = _withMemoryFile(
        content,
        (resourceProvider, path) => parseFile(
            path: path,
            featureSet: defaultFeatureSet,
            resourceProvider: resourceProvider,
            throwIfDiagnostics: false));
    expect(result.content, content);
    expect(result.errors, hasLength(1));
    expect(result.lineInfo, isNotNull);
    expect(result.unit.toString(),
        equals("void main() => print('Hello, world!');"));
  }

  test_parseFile_errors_path() {
    String content = '''
void main() => print('Hello, world!')
''';
    late String expectedPath;
    ParseStringResult result =
        _withMemoryFile(content, (resourceProvider, path) {
      expectedPath = path;
      return parseFile(
          path: path,
          featureSet: defaultFeatureSet,
          resourceProvider: resourceProvider,
          throwIfDiagnostics: false);
    });
    expect(result.errors, hasLength(1));
    expect(result.errors[0].source.fullName, expectedPath);
  }

  test_parseFile_errors_throw() {
    String content = '''
void main() => print('Hello, world!')
''';
    expect(
        () => _withMemoryFile(
            content,
            (resourceProvider, path) => parseFile(
                path: path,
                featureSet: defaultFeatureSet,
                resourceProvider: resourceProvider)),
        throwsA(const TypeMatcher<ArgumentError>()));
  }

  test_parseFile_featureSet_nnbd_off() {
    String content = '''
int? f() => 1;
''';
    var featureSet = FeatureSet.fromEnableFlags2(
      sdkLanguageVersion: Version.parse('2.9.0'),
      flags: [],
    );
    expect(featureSet.isEnabled(Feature.non_nullable), isFalse);
    ParseStringResult result = _withMemoryFile(
        content,
        (resourceProvider, path) => parseFile(
            path: path,
            resourceProvider: resourceProvider,
            throwIfDiagnostics: false,
            featureSet: featureSet));
    expect(result.content, content);
    expect(result.errors, hasLength(1));
    expect(result.lineInfo, isNotNull);
    expect(result.unit.toString(), equals('int? f() => 1;'));
  }

  test_parseFile_featureSet_nnbd_on() {
    String content = '''
int? f() => 1;
''';
    var featureSet =
        FeatureSet.forTesting(additionalFeatures: [Feature.non_nullable]);
    ParseStringResult result = _withMemoryFile(
        content,
        (resourceProvider, path) => parseFile(
            path: path,
            resourceProvider: resourceProvider,
            throwIfDiagnostics: false,
            featureSet: featureSet));
    expect(result.content, content);
    expect(result.errors, isEmpty);
    expect(result.lineInfo, isNotNull);
    expect(result.unit.toString(), equals('int? f() => 1;'));
  }

  test_parseFile_noErrors() {
    String content = '''
void main() => print('Hello, world!');
''';
    ParseStringResult result = _withMemoryFile(
        content,
        (resourceProvider, path) => parseFile(
            path: path,
            featureSet: defaultFeatureSet,
            resourceProvider: resourceProvider));
    expect(result.content, content);
    expect(result.errors, isEmpty);
    expect(result.lineInfo, isNotNull);
    expect(result.unit.toString(),
        equals("void main() => print('Hello, world!');"));
  }

  test_parseString_errors_noThrow() {
    String content = '''
void main() => print('Hello, world!')
''';
    ParseStringResult result =
        parseString(content: content, throwIfDiagnostics: false);
    expect(result.content, content);
    expect(result.errors, hasLength(1));
    expect(result.lineInfo, isNotNull);
    expect(result.unit.toString(),
        equals("void main() => print('Hello, world!');"));
  }

  test_parseString_errors_path() {
    String content = '''
void main() => print('Hello, world!')
''';
    var path = 'foo/bar';
    ParseStringResult result = parseString(
        content: content, path: 'foo/bar', throwIfDiagnostics: false);
    expect(result.errors, hasLength(1));
    var error = result.errors[0];
    expect(error.source.fullName, path);
  }

  test_parseString_errors_throw() {
    String content = '''
void main() => print('Hello, world!')
''';
    expect(() => parseString(content: content),
        throwsA(const TypeMatcher<ArgumentError>()));
  }

  test_parseString_featureSet_nnbd_off() {
    String content = '''
int? f() => 1;
''';
    var featureSet = FeatureSet.fromEnableFlags2(
      sdkLanguageVersion: Version.parse('2.9.0'),
      flags: [],
    );
    expect(featureSet.isEnabled(Feature.non_nullable), isFalse);
    ParseStringResult result = parseString(
        content: content, throwIfDiagnostics: false, featureSet: featureSet);
    expect(result.content, content);
    expect(result.errors, hasLength(1));
    expect(result.lineInfo, isNotNull);
    expect(result.unit.toString(), equals('int? f() => 1;'));
  }

  test_parseString_featureSet_nnbd_on() {
    String content = '''
int? f() => 1;
''';
    var featureSet =
        FeatureSet.forTesting(additionalFeatures: [Feature.non_nullable]);
    ParseStringResult result = parseString(
        content: content, throwIfDiagnostics: false, featureSet: featureSet);
    expect(result.content, content);
    expect(result.errors, isEmpty);
    expect(result.lineInfo, isNotNull);
    expect(result.unit.toString(), equals('int? f() => 1;'));
  }

  test_parseString_languageVersion() {
    var content = '''
// @dart = 2.7
class A {}
''';
    var result = parseString(
      content: content,
      throwIfDiagnostics: false,
      featureSet: FeatureSet.latestLanguageVersion(),
    );

    var languageVersion = result.unit.languageVersionToken!;
    expect(languageVersion.major, 2);
    expect(languageVersion.minor, 7);
  }

  test_parseString_languageVersion_null() {
    var content = '''
class A {}
''';
    var result = parseString(
      content: content,
      throwIfDiagnostics: false,
      featureSet: FeatureSet.latestLanguageVersion(),
    );

    expect(result.unit.languageVersionToken, isNull);
  }

  test_parseString_lineInfo() {
    String content = '''
main() {
  print('Hello, world!');
}
''';
    ParseStringResult result = parseString(content: content);
    expect(result.lineInfo, same(result.unit.lineInfo));
    expect(result.lineInfo.lineStarts, [0, 9, 35, 37]);
  }

  test_parseString_noErrors() {
    String content = '''
void main() => print('Hello, world!');
''';
    ParseStringResult result = parseString(content: content);
    expect(result.content, content);
    expect(result.errors, isEmpty);
    expect(result.lineInfo, isNotNull);
    expect(result.unit.toString(),
        equals("void main() => print('Hello, world!');"));
  }

  T _withMemoryFile<T>(
      String content,
      T Function(MemoryResourceProvider resourceProvider, String path)
          callback) {
    var resourceProvider = MemoryResourceProvider();
    var path =
        resourceProvider.pathContext.fromUri(Uri.parse('file:///test.dart'));
    resourceProvider.newFile(path, content);
    return callback(resourceProvider, path);
  }

  T _withTemporaryFile<T>(String content, T Function(String path) callback) {
    var tempDir = Directory.systemTemp.createTempSync();
    try {
      var file = File(p.join(tempDir.path, 'test.dart'));
      file.writeAsStringSync(content);
      return callback(file.path);
    } finally {
      tempDir.deleteSync(recursive: true);
    }
  }
}
