// 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/models.dart' as M;
import 'package:observatory/src/elements/stack_trace_tree_config.dart';

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

  group('instantiation', () {
    test('default', () {
      final e = new StackTraceTreeConfigElement();
      expect(e, isNotNull, reason: 'element correctly created');
      expect(e.showMode, isTrue);
      expect(e.showDirection, isTrue);
      expect(e.showFilter, isTrue);
      expect(e.filter, equals(''));
      expect(e.mode, equals(ProfileTreeMode.function));
      expect(e.direction, equals(M.ProfileTreeDirection.exclusive));
    });
    test('showMode', () {
      final e = new StackTraceTreeConfigElement(showMode: false);
      expect(e, isNotNull, reason: 'element correctly created');
      expect(e.showMode, isFalse);
      expect(e.showDirection, isTrue);
      expect(e.showFilter, isTrue);
      expect(e.filter, equals(''));
      expect(e.mode, equals(ProfileTreeMode.function));
      expect(e.direction, equals(M.ProfileTreeDirection.exclusive));
    });
    test('showDirection', () {
      final e = new StackTraceTreeConfigElement(showDirection: false);
      expect(e, isNotNull, reason: 'element correctly created');
      expect(e.showMode, isTrue);
      expect(e.showDirection, isFalse);
      expect(e.showFilter, isTrue);
      expect(e.filter, equals(''));
      expect(e.mode, equals(ProfileTreeMode.function));
      expect(e.direction, equals(M.ProfileTreeDirection.exclusive));
    });
    test('showFilter', () {
      final e = new StackTraceTreeConfigElement(showFilter: false);
      expect(e, isNotNull, reason: 'element correctly created');
      expect(e.showMode, isTrue);
      expect(e.showDirection, isTrue);
      expect(e.showFilter, isFalse);
      expect(e.filter, equals(''));
      expect(e.mode, equals(ProfileTreeMode.function));
      expect(e.direction, equals(M.ProfileTreeDirection.exclusive));
    });
    test('filter', () {
      final filter = 'filter-string';
      final e = new StackTraceTreeConfigElement(filter: filter);
      expect(e, isNotNull, reason: 'element correctly created');
      expect(e.showMode, isTrue);
      expect(e.showDirection, isTrue);
      expect(e.showFilter, isTrue);
      expect(e.filter, equals(filter));
      expect(e.mode, equals(ProfileTreeMode.function));
      expect(e.direction, equals(M.ProfileTreeDirection.exclusive));
    });
    test('mode', () {
      final e = new StackTraceTreeConfigElement(mode: ProfileTreeMode.code);
      expect(e, isNotNull, reason: 'element correctly created');
      expect(e.showMode, isTrue);
      expect(e.showDirection, isTrue);
      expect(e.showFilter, isTrue);
      expect(e.filter, equals(''));
      expect(e.mode, equals(ProfileTreeMode.code));
      expect(e.direction, equals(M.ProfileTreeDirection.exclusive));
    });
    test('default', () {
      final e = new StackTraceTreeConfigElement(
          direction: M.ProfileTreeDirection.inclusive);
      expect(e, isNotNull, reason: 'element correctly created');
      expect(e.showMode, isTrue);
      expect(e.showDirection, isTrue);
      expect(e.showFilter, isTrue);
      expect(e.filter, equals(''));
      expect(e.mode, equals(ProfileTreeMode.function));
      expect(e.direction, equals(M.ProfileTreeDirection.inclusive));
    });
  });
  group('elements', () {
    test('created after attachment', () async {
      final e = new StackTraceTreeConfigElement();
      document.body.append(e);
      await e.onRendered.first;
      expect(e.children.length, isNonZero, reason: 'has elements');
      e.remove();
      await e.onRendered.first;
      expect(e.children.length, isZero, reason: 'is empty');
    });
    test('react to mode change', () async {
      final e = new StackTraceTreeConfigElement();
      document.body.append(e);
      await e.onRendered.first;
      expect(e.mode, equals(ProfileTreeMode.function));
      e.mode = ProfileTreeMode.code;
      await e.onRendered.first;
      expect(e.mode, equals(ProfileTreeMode.code));
      e.remove();
      await e.onRendered.first;
      expect(e.children.length, isZero, reason: 'is empty');
    });
    test('react to direction change', () async {
      final e = new StackTraceTreeConfigElement();
      document.body.append(e);
      await e.onRendered.first;
      expect(e.direction, equals(M.ProfileTreeDirection.exclusive));
      e.direction = M.ProfileTreeDirection.inclusive;
      await e.onRendered.first;
      expect(e.direction, equals(M.ProfileTreeDirection.inclusive));
      e.remove();
      await e.onRendered.first;
      expect(e.children.length, isZero, reason: 'is empty');
    });
    test('react to filter change', () async {
      final filter = 'filter-string';
      final e = new StackTraceTreeConfigElement();
      document.body.append(e);
      await e.onRendered.first;
      expect(e.filter, equals(''));
      e.filter = filter;
      await e.onRendered.first;
      expect(e.filter, equals(filter));
      e.remove();
      await e.onRendered.first;
      expect(e.children.length, isZero, reason: 'is empty');
    });
  });
  group('events', () {
    test('onModeChange', () async {
      final e = new StackTraceTreeConfigElement();
      document.body.append(e);
      await e.onRendered.first;
      expect(e.mode, equals(ProfileTreeMode.function));
      e.onModeChange.listen(expectAsync1((_) {
        expect(e.mode, equals(ProfileTreeMode.code));
      }, count: 1));
      final select = (e.querySelector('.mode-select') as SelectElement);
      select.selectedIndex = select.options.indexOf((select.options.toSet()
            ..removeAll(select.selectedOptions))
          .toList()
          .first);
      select.dispatchEvent(new Event("change"));
      e.remove();
      await e.onRendered.first;
    });
    test('onDirectionChange', () async {
      final e = new StackTraceTreeConfigElement();
      document.body.append(e);
      await e.onRendered.first;
      expect(e.direction, equals(M.ProfileTreeDirection.exclusive));
      e.onDirectionChange.listen(expectAsync1((_) {
        expect(e.direction, equals(M.ProfileTreeDirection.inclusive));
      }, count: 1));
      final select = (e.querySelector('.direction-select') as SelectElement);
      select.selectedIndex = select.options.indexOf((select.options.toSet()
            ..removeAll(select.selectedOptions))
          .toList()
          .first);
      select.dispatchEvent(new Event("change"));
      e.remove();
      await e.onRendered.first;
    });
    test('onFilterChange', () async {
      final e = new StackTraceTreeConfigElement();
      document.body.append(e);
      await e.onRendered.first;
      expect(e.direction, equals(M.ProfileTreeDirection.exclusive));
      e.onFilterChange.listen(expectAsync1((_) {
        expect(e.filter, equals('value'));
      }, count: 1));
      var input = (e.querySelector('input') as TextInputElement);
      input.value = 'value';
      input.dispatchEvent(new Event("change"));
      e.remove();
      await e.onRendered.first;
    });
  });
}
