// 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/dart/analysis/analysis_context.dart';
import 'package:analyzer/dart/analysis/context_root.dart';
import 'package:analyzer/dart/analysis/declared_variables.dart';
import 'package:analyzer/src/dart/analysis/context_builder.dart';
import 'package:analyzer/src/dart/analysis/context_root.dart';
import 'package:analyzer/src/test_utilities/mock_sdk.dart';
import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
import 'package:analyzer/src/workspace/basic.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';

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

@reflectiveTest
class ContextBuilderImplTest with ResourceProviderMixin {
  late final ContextBuilderImpl contextBuilder;
  late final ContextRoot contextRoot;

  void assertEquals(DeclaredVariables actual, DeclaredVariables expected) {
    Iterable<String> actualNames = actual.variableNames;
    Iterable<String> expectedNames = expected.variableNames;
    expect(actualNames, expectedNames);
    for (String name in expectedNames) {
      expect(actual.get(name), expected.get(name));
    }
  }

  void setUp() {
    var folder = newFolder('/home/test');
    contextBuilder = ContextBuilderImpl(resourceProvider: resourceProvider);
    var workspace = BasicWorkspace.find(resourceProvider, {}, folder.path);
    contextRoot = ContextRootImpl(resourceProvider, folder, workspace);
  }

  test_createContext_declaredVariables() {
    MockSdk(resourceProvider: resourceProvider);
    DeclaredVariables declaredVariables =
        DeclaredVariables.fromMap({'foo': 'true'});
    var context = contextBuilder.createContext(
      contextRoot: contextRoot,
      declaredVariables: declaredVariables,
      sdkPath: resourceProvider.convertPath(sdkRoot),
    );
    expect(context.analysisOptions, isNotNull);
    expect(context.contextRoot, contextRoot);
    assertEquals(context.driver.declaredVariables, declaredVariables);
  }

  test_createContext_declaredVariables_sdkPath() {
    DeclaredVariables declaredVariables =
        DeclaredVariables.fromMap({'bar': 'true'});
    MockSdk sdk = MockSdk(resourceProvider: resourceProvider);
    var context = contextBuilder.createContext(
      contextRoot: contextRoot,
      declaredVariables: declaredVariables,
      sdkPath: resourceProvider.convertPath(sdkRoot),
    );
    expect(context.analysisOptions, isNotNull);
    expect(context.contextRoot, contextRoot);
    assertEquals(context.driver.declaredVariables, declaredVariables);
    expect(context.driver.sourceFactory.dartSdk!.mapDartUri('dart:core'),
        sdk.mapDartUri('dart:core'));
  }

  test_createContext_defaults() {
    MockSdk(resourceProvider: resourceProvider);
    AnalysisContext context = contextBuilder.createContext(
      contextRoot: contextRoot,
      sdkPath: resourceProvider.convertPath(sdkRoot),
    );
    expect(context.analysisOptions, isNotNull);
    expect(context.contextRoot, contextRoot);
  }

  test_createContext_sdkPath() {
    MockSdk sdk = MockSdk(resourceProvider: resourceProvider);
    var context = contextBuilder.createContext(
      contextRoot: contextRoot,
      sdkPath: resourceProvider.convertPath(sdkRoot),
    );
    expect(context.analysisOptions, isNotNull);
    expect(context.contextRoot, contextRoot);
    expect(context.driver.sourceFactory.dartSdk!.mapDartUri('dart:core'),
        sdk.mapDartUri('dart:core'));
  }

  test_createContext_sdkRoot() {
    MockSdk(resourceProvider: resourceProvider);
    var context = contextBuilder.createContext(
        contextRoot: contextRoot,
        sdkPath: resourceProvider.convertPath(sdkRoot));
    expect(context.analysisOptions, isNotNull);
    expect(context.contextRoot, contextRoot);
    expect(context.sdkRoot?.path, resourceProvider.convertPath(sdkRoot));
  }
}
