// Copyright (c) 2018, 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:analyzer/file_system/file_system.dart';
import 'package:analyzer/src/hint/sdk_constraint_extractor.dart';
import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';

main() {
  defineReflectiveSuite(() {
    defineReflectiveTests(SdkConstraintExtractorTest);
  });
}

@reflectiveTest
class SdkConstraintExtractorTest with ResourceProviderMixin {
  SdkConstraintExtractor extractorFor(String pubspecContent) {
    String pubspecPath = '/pkg/test/pubspec.yaml';
    File pubspecFile = newFile(pubspecPath, content: pubspecContent);
    return SdkConstraintExtractor(pubspecFile);
  }

  test_constraint_any() {
    SdkConstraintExtractor extractor = extractorFor('''
environment:
  sdk: any
''');
    expect(extractor.constraint().toString(), 'any');
  }

  test_constraint_caret() {
    SdkConstraintExtractor extractor = extractorFor('''
environment:
  sdk: ^2.1.0
''');
    expect(extractor.constraint().toString(), '^2.1.0');
  }

  test_constraint_compound() {
    SdkConstraintExtractor extractor = extractorFor('''
environment:
  sdk: '>=2.1.0 <3.0.0'
''');
    expect(extractor.constraint().toString(), '>=2.1.0 <3.0.0');
  }

  test_constraint_gt() {
    SdkConstraintExtractor extractor = extractorFor('''
environment:
  sdk: '>2.1.0'
''');
    expect(extractor.constraint().toString(), '>2.1.0');
  }

  test_constraint_gte() {
    SdkConstraintExtractor extractor = extractorFor('''
environment:
  sdk: '>=2.2.0-dev.3.0'
''');
    expect(extractor.constraint().toString(), '>=2.2.0-dev.3.0');
  }

  test_constraint_invalid_badConstraint() {
    SdkConstraintExtractor extractor = extractorFor('''
environment:
  sdk: latest
''');
    expect(extractor.constraint(), isNull);
  }

  test_constraint_invalid_noEnvironment() {
    SdkConstraintExtractor extractor = extractorFor('''
name: test
''');
    expect(extractor.constraint(), isNull);
  }

  test_constraint_invalid_noSdk() {
    SdkConstraintExtractor extractor = extractorFor('''
environment:
  os: 'Analytical Engine'
''');
    expect(extractor.constraint(), isNull);
  }

  test_constraint_invalid_notYaml() {
    SdkConstraintExtractor extractor = extractorFor('''
class C {}
''');
    expect(extractor.constraint(), isNull);
  }
}
