// Copyright (c) 2016, 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/analyzer.dart';
import 'package:analyzer/src/command_line/arguments.dart';
import 'package:analyzer/src/summary/summary_sdk.dart';
import 'package:path/path.dart' as path;
import 'package:test/test.dart';

import '../../lib/src/analyzer/context.dart';
import '../../lib/src/analyzer/command.dart';
import '../../lib/src/analyzer/module_compiler.dart';
import '../testing.dart' show repoDirectory, testDirectory;

/// The `test/options` directory.
final optionsDir = path.join(testDirectory, 'options');

/// Summary file for testing.
final sdkSummaryFile = path.join(repoDirectory, 'gen', 'sdk', 'ddc_sdk.sum');

final sdkSummaryArgs = ['--$sdkSummaryPathOption', sdkSummaryFile];

main() {
  test('basic', () {
    var options = new AnalyzerOptions.basic();
    var compiler = new ModuleCompiler(options, analysisRoot: optionsDir);
    var processors = compiler.context.analysisOptions.errorProcessors;
    expect(processors, hasLength(1));
    expect(processors[0].code, CompileTimeErrorCode.UNDEFINED_CLASS.name);
  });

  test('basic sdk summary', () {
    expect(new File(sdkSummaryFile).existsSync(), isTrue);
    var options = new AnalyzerOptions.basic(dartSdkSummaryPath: sdkSummaryFile);
    var compiler = new ModuleCompiler(options, analysisRoot: optionsDir);
    var context = compiler.context;
    var sdk = context.sourceFactory.dartSdk;
    expect(sdk, new isInstanceOf<SummaryBasedDartSdk>());
    var processors = context.analysisOptions.errorProcessors;
    expect(processors, hasLength(1));
    expect(processors[0].code, CompileTimeErrorCode.UNDEFINED_CLASS.name);
  });

  test('fromArgs', () {
    var args = <String>[];
    //TODO(danrubel) remove sdkSummaryArgs once all SDKs have summary file
    args.addAll(sdkSummaryArgs);
    var argResults = ddcArgParser().parse(args);
    var options = new AnalyzerOptions.fromArguments(argResults);
    var compiler = new ModuleCompiler(options, analysisRoot: optionsDir);
    var processors = compiler.context.analysisOptions.errorProcessors;
    expect(processors, hasLength(1));
    expect(processors[0].code, CompileTimeErrorCode.UNDEFINED_CLASS.name);
  });

  test('fromArgs options file 2', () {
    var optionsFile2 = path.join(optionsDir, 'analysis_options_2.yaml');
    expect(new File(optionsFile2).existsSync(), isTrue);
    var args = <String>['--$analysisOptionsFileOption', optionsFile2];
    //TODO(danrubel) remove sdkSummaryArgs once all SDKs have summary file
    args.addAll(sdkSummaryArgs);
    var argResults = ddcArgParser().parse(args);
    var options = new AnalyzerOptions.fromArguments(argResults);
    var compiler = new ModuleCompiler(options, analysisRoot: optionsDir);
    var processors = compiler.context.analysisOptions.errorProcessors;
    expect(processors, hasLength(1));
    expect(processors[0].code, CompileTimeErrorCode.DUPLICATE_DEFINITION.name);
  });

  test('custom module name for summary', () {
    var args = <String>[
      '-snormal',
      '-scustom/path=module',
      '-sanother',
      '--summary=custom/path2=module2'
    ];

    var argResults = ddcArgParser().parse(args);
    var options = new AnalyzerOptions.fromArguments(argResults);
    expect(options.summaryPaths,
        orderedEquals(['normal', 'custom/path', 'another', 'custom/path2']));
    expect(options.customSummaryModules['custom/path'], equals('module'));
    expect(options.customSummaryModules['custom/path2'], equals('module2'));
    expect(options.customSummaryModules.containsKey('normal'), isFalse);
  });
}
