// Copyright (c) 2014, 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.

library test.services.completion.dart.keyword;

import 'package:analysis_server/src/protocol.dart';
import 'package:analysis_server/src/services/completion/keyword_computer.dart';
import 'package:analysis_testing/reflective_tests.dart';
import 'package:analyzer/src/generated/scanner.dart';
import 'package:unittest/unittest.dart';

import 'completion_test_util.dart';

main() {
  groupSep = ' | ';
  runReflectiveTests(KeywordComputerTest);
}

@ReflectiveTestCase()
class KeywordComputerTest extends AbstractCompletionTest {

  void assertSuggestKeywords(List<String> names) {
    Keyword.values.forEach((Keyword keyword) {
      if (names.contains(keyword.syntax)) {
        assertSuggest(CompletionSuggestionKind.KEYWORD, keyword.syntax);
      } else {
        assertNotSuggested(keyword.syntax);
      }
    });
  }

  @override
  void setUp() {
    super.setUp();
    computer = new KeywordComputer();
  }

  test_after_class() {
    addTestSource('class A {} ^');
    expect(computeFast(), isTrue);
    assertSuggestKeywords(
        ['abstract', 'class', 'const', 'final', 'typedef', 'var']);
  }

  test_before_import() {
    addTestSource('^ import foo;');
    expect(computeFast(), isTrue);
    assertSuggestKeywords(['export', 'import', 'library', 'part']);
  }

  test_class() {
    addTestSource('class A ^');
    expect(computeFast(), isTrue);
    assertSuggestKeywords(['extends', 'implements']);
  }

  test_class_extends() {
    addTestSource('class A extends foo ^');
    expect(computeFast(), isTrue);
    assertSuggestKeywords(['implements', 'with']);
  }

  test_class_extends_name() {
    addTestSource('class A extends ^');
    expect(computeFast(), isTrue);
    assertSuggestKeywords([]);
  }

  test_class_implements() {
    addTestSource('class A ^ implements foo');
    expect(computeFast(), isTrue);
    assertSuggestKeywords(['extends']);
  }

  test_class_implements_name() {
    addTestSource('class A implements ^');
    expect(computeFast(), isTrue);
    assertSuggestKeywords([]);
  }

  test_class_name() {
    addTestSource('class ^');
    expect(computeFast(), isTrue);
    assertSuggestKeywords([]);
  }

  test_class_with_name() {
    addTestSource('class A extends foo with ^');
    expect(computeFast(), isTrue);
    assertSuggestKeywords([]);
  }

  test_empty() {
    addTestSource('^');
    expect(computeFast(), isTrue);
    assertSuggestKeywords(
        [
            'abstract',
            'class',
            'const',
            'export',
            'final',
            'import',
            'library',
            'part',
            'typedef',
            'var']);
  }

  test_library() {
    addTestSource('library foo;^');
    expect(computeFast(), isTrue);
    assertSuggestKeywords(
        [
            'abstract',
            'class',
            'const',
            'export',
            'final',
            'import',
            'part',
            'typedef',
            'var']);
  }

  test_library_name() {
    addTestSource('library ^');
    expect(computeFast(), isTrue);
    assertSuggestKeywords([]);
  }

  test_part_of() {
    addTestSource('part of foo;^');
    expect(computeFast(), isTrue);
    assertSuggestKeywords(
        [
            'abstract',
            'class',
            'const',
            'export',
            'final',
            'import',
            'part',
            'typedef',
            'var']);
  }
}
