// Copyright (c) 2012, 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:expect/expect.dart';
import 'dart:async';
import "package:async_helper/async_helper.dart";
import 'dart:io';
import '../../../sdk/lib/_internal/compiler/implementation/filenames.dart';
import '../../../sdk/lib/_internal/compiler/implementation/mirrors/mirrors.dart';
import '../../../sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirror.dart';
import '../../../sdk/lib/_internal/compiler/implementation/source_file_provider.dart';
import 'mock_compiler.dart';

const String SOURCE = 'source';
Uri SOURCE_URI = new Uri(scheme: SOURCE, path: SOURCE);

Future<MirrorSystem> createMirrorSystem(String source) {
  MockCompiler compiler = new MockCompiler(
      analyzeOnly: true,
      analyzeAll: true,
      preserveComments: true);
    compiler.registerSource(SOURCE_URI, source);
    compiler.librariesToAnalyzeWhenRun = <Uri>[SOURCE_URI];
  return compiler.runCompiler(null).then((_) {
    return new Dart2JsMirrorSystem(compiler);
  });
}

void validateDeclarationComment(String code,
                                String text,
                                String trimmedText,
                                bool isDocComment,
                                List<String> declarationNames) {
  asyncTest(() => createMirrorSystem(code).then((mirrors) {
    LibraryMirror library = mirrors.libraries[SOURCE_URI];
    Expect.isNotNull(library);
    for (String declarationName in declarationNames) {
      DeclarationMirror declaration = library.members[declarationName];
      Expect.isNotNull(declaration);
      List<InstanceMirror> metadata = declaration.metadata;
      Expect.isNotNull(metadata);
      Expect.equals(1, metadata.length);
      Expect.isTrue(metadata[0] is CommentInstanceMirror);
      CommentInstanceMirror commentMetadata = metadata[0];
      Expect.equals(text, commentMetadata.text);
      Expect.equals(trimmedText, commentMetadata.trimmedText);
      Expect.equals(isDocComment, commentMetadata.isDocComment);
    }
  }));
}

void testDeclarationComment(String declaration, List<String> declarationNames) {
  String text = 'Single line comment';
  String comment = '// $text';
  String code = '$comment\n$declaration';
  validateDeclarationComment(code, comment, text, false, declarationNames);

  comment = '/// $text';
  code = '$comment\n$declaration';
  validateDeclarationComment(code, comment, text, true, declarationNames);

  text = 'Multiline comment';
  comment = '/* $text*/';
  code = '$comment$declaration';
  validateDeclarationComment(code, comment, text, false, declarationNames);

  comment = '/** $text*/';
  code = '$comment$declaration';
  validateDeclarationComment(code, comment, text, true, declarationNames);
}

void main() {
  testDeclarationComment('var field;', ['field']);
  testDeclarationComment('int field;', ['field']);
  testDeclarationComment('int field = 0;', ['field']);
  testDeclarationComment('int field1, field2;', ['field1', 'field2']);
  testDeclarationComment('final field = 0;', ['field']);
  testDeclarationComment('final int field = 0;', ['field']);
  testDeclarationComment('final field1 = 0, field2 = 0;', ['field1', 'field2']);
  testDeclarationComment('final int field1 = 0, field2 = 0;',
                         ['field1', 'field2']);
  testDeclarationComment('const field = 0;', ['field']);
  testDeclarationComment('const int field = 0;', ['field']);
  testDeclarationComment('const field1 = 0, field2 = 0;', ['field1', 'field2']);
  testDeclarationComment('const int field1 = 0, field2 = 0;',
                         ['field1', 'field2']);
}
