// 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 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';

import 'server_abstract.dart';

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

@reflectiveTest
class DocumentHighlightsTest extends AbstractLspAnalysisServerTest {
  test_functions() => _testMarkedContent('''
    [[main]]() {
      [[mai^n]]();
    }
    ''');

  test_localVariable() => _testMarkedContent('''
    main() {
      var [[f^oo]] = 1;
      print([[foo]]);
      [[foo]] = 2;
    }
    ''');

  test_nonDartFile() async {
    await initialize();
    await openFile(pubspecFileUri, simplePubspecContent);

    final highlights =
        await getDocumentHighlights(pubspecFileUri, startOfDocPos);

    // Non-Dart files should return empty results, not errors.
    expect(highlights, isEmpty);
  }

  test_noResult() => _testMarkedContent('''
    main() {
      // This one is in a ^ comment!
    }
    ''');

  test_onlySelf() => _testMarkedContent('''
    main() {
      [[prin^t]]();
    }
    ''');

  test_shadow_inner() => _testMarkedContent('''
    main() {
      var foo = 1;
      func() {
        var [[fo^o]] = 2;
        print([[foo]]);
      }
    }
    ''');

  test_shadow_outer() => _testMarkedContent('''
    main() {
      var [[foo]] = 1;
      func() {
        var foo = 2;
        print(foo);
      }
      print([[fo^o]]);
    }
    ''');

  test_topLevelVariable() => _testMarkedContent('''
    String [[foo]] = 'bar';
    main() {
      print([[foo]]);
      [[fo^o]] = 2;
    }
    ''');

  /// Tests highlights in a Dart file using the provided content.
  /// The content should be marked with a ^ where the highlights request should
  /// be invoked and with `[[double brackets]]` around each range expected to
  /// be highlighted (eg. all references to the symbol under ^).
  /// If the content does not include any `[[double brackets]]` then the response
  /// is expected to be `null`.
  _testMarkedContent(String content) async {
    final expectedRanges = rangesFromMarkers(content);

    await initialize();
    await openFile(mainFileUri, withoutMarkers(content));

    final pos = positionFromMarker(content);
    final highlights = await getDocumentHighlights(mainFileUri, pos);

    if (expectedRanges.isEmpty) {
      expect(highlights, isNull);
    } else {
      final highlightRanges = highlights.map((h) => h.range).toList();
      expect(highlightRanges, equals(expectedRanges));
    }
  }
}
