// 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.integration.analysis.outline;

import 'package:analysis_testing/reflective_tests.dart';
import 'package:unittest/unittest.dart';

import '../integration_tests.dart';

@ReflectiveTestCase()
class Test extends AbstractAnalysisServerIntegrationTest {
  test_outline() {
    String pathname = sourcePath('test.dart');
    String text =
        r'''
class Class1 {
  int field;

  void method() {
  }

  static staticMethod() {
  }

  get getter {
    return null;
  }

  set setter(value) {
  }
}

class Class2 {
}
''';
    writeFile(pathname, text);
    standardAnalysisSetup();
    sendAnalysisSetSubscriptions({
      'OUTLINE': [pathname]
    });
    Map outline;
    onAnalysisOutline.listen((params) {
      expect(params['file'], equals(pathname));
      outline = params['outline'];
    });
    return analysisFinished.then((_) {
      expect(outline['element']['kind'], equals('COMPILATION_UNIT'));
      expect(outline['offset'], equals(0));
      expect(outline['length'], equals(text.length));
      List classes = outline['children'];
      expect(classes, hasLength(2));
      expect(classes[0]['element']['name'], equals('Class1'));
      expect(classes[1]['element']['name'], equals('Class2'));
      checkConnected(classes);
      List members = classes[0]['children'];
      expect(members, hasLength(5));
      expect(members[0]['element']['name'], equals('field'));
      expect(members[1]['element']['name'], equals('method'));
      expect(members[2]['element']['name'], equals('staticMethod'));
      expect(members[3]['element']['name'], equals('getter'));
      expect(members[4]['element']['name'], equals('setter'));
      checkConnected(members);
    });
  }

  /**
   * Verify that the range of source text covered by the given outline objects
   * is connected (the end of each object in the list corresponds to the start
   * of the next).
   */
  void checkConnected(List outlineObjects) {
    for (int i = 0; i < outlineObjects.length - 1; i++) {
      expect(outlineObjects[i + 1]['offset'], equals(outlineObjects[i]['offset']
          + outlineObjects[i]['length']));
    }
  }
}

main() {
  runReflectiveTests(Test);
}
