// Copyright (c) 2016, 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 'dart:html';
import 'package:test/test.dart';
import 'package:observatory/src/elements/isolate_reconnect.dart';
import 'package:observatory/src/elements/nav/notify.dart';
import '../mocks.dart';

main() {
  IsolateReconnectElement.tag.ensureRegistration();

  final nTag = NavNotifyElement.tag.name;

  EventRepositoryMock events;
  NotificationRepositoryMock notifications;
  Uri uri;
  const vm = const VMMock(isolates: const [
    const IsolateMock(id: 'i-1-id'),
    const IsolateMock(id: 'i-2-id')
  ]);
  const missing = 'missing-id';
  setUp(() {
    events = new EventRepositoryMock();
    notifications = new NotificationRepositoryMock();
    uri = new Uri(path: 'path');
  });
  test('instantiation', () {
    final e =
        new IsolateReconnectElement(vm, events, notifications, missing, uri);
    expect(e, isNotNull, reason: 'element correctly created');
    expect(e.vm, equals(vm));
    expect(e.missing, equals(missing));
    expect(e.uri, equals(uri));
  });
  test('elements created after attachment', () async {
    final e =
        new IsolateReconnectElement(vm, events, notifications, missing, uri);
    document.body.append(e);
    await e.onRendered.first;
    expect(e.children.length, isNonZero, reason: 'has elements');
    expect(e.querySelector(nTag), isNotNull, reason: 'has notifications');
    expect(
        e.querySelectorAll('.isolate-link').length, equals(vm.isolates.length),
        reason: 'has links');
    e.remove();
    await e.onRendered.first;
    expect(e.children.length, isZero, reason: 'is empty');
  });
  group('updates', () {
    test('are correctly listen', () async {
      final e =
          new IsolateReconnectElement(vm, events, notifications, missing, uri);
      expect(events.onVMUpdateHasListener, isFalse);
      document.body.append(e);
      await e.onRendered.first;
      expect(events.onVMUpdateHasListener, isTrue);
      e.remove();
      await e.onRendered.first;
      expect(events.onVMUpdateHasListener, isFalse);
    });
    test('have effects', () async {
      final e =
          new IsolateReconnectElement(vm, events, notifications, missing, uri);
      const vm2 = const VMMock(isolates: const [
        const IsolateMock(id: 'i-1-id'),
        const IsolateMock(id: 'i-2-id'),
        const IsolateMock(id: 'i-3-id')
      ]);
      document.body.append(e);
      await e.onRendered.first;
      expect(e.querySelectorAll('.isolate-link').length,
          equals(vm.isolates.length));
      events.add(new VMUpdateEventMock(vm: vm2));
      await e.onRendered.first;
      expect(e.querySelectorAll('.isolate-link').length,
          equals(vm2.isolates.length));
      e.remove();
      await e.onRendered.first;
    });
  });
}
