library single_library_test;

import 'dart:io';

import 'package:path/path.dart' as path;
import 'package:unittest/unittest.dart';

import '../lib/docgen.dart';

const String DART_LIBRARY_1 = '''
  library testLib;
  import 'temp2.dart';
  import 'temp3.dart';
  export 'temp2.dart';
  export 'temp3.dart';

  /**
   * Doc comment for class [A].
   *
   * Multiline Test
   */
  /*
   * Normal comment for class A.
   */
  class A {

    int _someNumber;

    A() {
      _someNumber = 12;
    }

    A.customConstructor();

    /**
     * Test for linking to parameter [A]
     */
    void doThis(int A) {
      print(A);
    }
  }
''';

const String DART_LIBRARY_2 = '''
  library testLib2.foo;
  import 'temp.dart';

  /**
   * Doc comment for class [B].
   *
   * Multiline Test
   */

  /*
   * Normal comment for class B.
   */
  class B extends A {

    B();
    B.fooBar();

    /**
     * Test for linking to super
     */
    int doElse(int b) {
      print(b);
    }

    /**
     * Test for linking to parameter [c]
     */
    void doThis(int c) {
      print(a);
    }
  }

  int testFunc(int a) {
  }
''';

const String DART_LIBRARY_3 = '''
  library testLib.bar;
  import 'temp.dart';

  /*
   * Normal comment for class C.
   */
  class C {
  }
''';

Directory TEMP_DIRNAME;

List writeLibFiles() {
  TEMP_DIRNAME = Directory.systemTemp.createTempSync('single_library_');
  var fileName = path.join(TEMP_DIRNAME.path, 'temp.dart');
  var file = new File(fileName);
  file.writeAsStringSync(DART_LIBRARY_1);

  var fileName2 = path.join(TEMP_DIRNAME.path, 'temp2.dart');
  file = new File(fileName2);
  file.writeAsStringSync(DART_LIBRARY_2);

  var fileName3 = path.join(TEMP_DIRNAME.path, 'temp3.dart');
  file = new File(fileName3);
  file.writeAsStringSync(DART_LIBRARY_3);
  return [new Uri.file(fileName), new Uri.file(fileName3),
      new Uri.file(fileName3)];
}

main() {
  group('Generate docs for', () {
    test('multiple libraries.', () {
      var files = writeLibFiles();
      getMirrorSystem(files)
        .then(expectAsync1((mirrorSystem) {
          var testLibraryUri = files[0];
          var library = new Library(mirrorSystem.libraries[testLibraryUri]);

          /// Testing fixReference
          // Testing Doc comment for class [B].
          var libraryMirror = mirrorSystem.libraries[testLibraryUri];
          var classDocComment = library.fixReference('B').children.first.text;
          expect(classDocComment, 'testLib.B');

          // Test for linking to parameter [c]
          var importedLib = libraryMirror.libraryDependencies.firstWhere(
            (dep) => dep.isImport).targetLibrary;
          var aClassMirror = importedLib.classes.values.first;
          expect(aClassMirror.qualifiedName, 'testLib2.foo.B');
          var exportedClass = Indexable.getDocgenObject(aClassMirror, library);
          expect(exportedClass is Class, isTrue);


          var method = exportedClass.methods['doThis'];
          expect(method is Method, isTrue);
          var methodParameterDocComment = method.fixReference(
              'c').children.first.text;
          expect(methodParameterDocComment, 'testLib.B.doThis.c');


          expect(method.fixReference('A').children.first.text, 'testLib.A');
          // Testing trying to refer to doThis function
          expect(method.fixReference('doThis').children.first.text,
              'testLib.B.doThis');

          // Testing trying to refer to doThis function
          expect(method.fixReference('doElse').children.first.text,
              'testLib.B.doElse');


          // Test a third library referencing another exported library in a
          // separate file.
          importedLib = libraryMirror.libraryDependencies.firstWhere(
            (dep) => dep.isImport && dep.targetLibrary.qualifiedName ==
            'testLib.bar').targetLibrary;
          aClassMirror = importedLib.classes.values.first;
          expect(aClassMirror.qualifiedName, 'testLib.bar.C');
          exportedClass = Indexable.getDocgenObject(aClassMirror, library);
          expect(exportedClass is Class, isTrue);
          expect(exportedClass.docName, 'testLib.C');

          methodParameterDocComment = exportedClass.fixReference(
              'B').children.first.text;
          expect(methodParameterDocComment, 'testLib.B');

          methodParameterDocComment = exportedClass.fixReference(
              'testFunc').children.first.text;
          expect(methodParameterDocComment, 'testLib.testFunc');

        })).whenComplete(() => TEMP_DIRNAME.deleteSync(recursive: true));
    });
  });
}
