// Copyright 2015 Google. All rights reserved. Use of this source code is
// governed by a BSD-style license that can be found in the LICENSE file.

@TestOn('vm')
library wip.console_test;

import 'dart:async';

import 'package:test/test.dart';
import 'package:webkit_inspection_protocol/webkit_inspection_protocol.dart';

import 'test_setup.dart';

void main() {
  group('WipConsole', () {
    WipConsole? console; // ignore: deprecated_member_use
    List<ConsoleMessageEvent> events = [];
    var subs = [];

    Future checkMessages(int expectedCount) async {
      // make sure all messages have been delivered
      await new Future.delayed(const Duration(seconds: 1));
      expect(events, hasLength(expectedCount));
      for (int i = 0; i < expectedCount; i++) {
        if (i == 0) {
          // Clearing adds this message.
          expect(events[i].text, 'console.clear');
        } else {
          expect(events[i].text, 'message $i');
        }
      }
    }

    setUp(() async {
      // ignore: deprecated_member_use
      console = (await wipConnection).console;
      events.clear();
      subs.add(console!.onMessage.listen(events.add));
    });

    tearDown(() async {
      await console!.disable();
      console = null;
      await closeConnection();
      subs.forEach((s) => s.cancel());
      subs.clear();
    });

    test('receives new console messages', () async {
      await console!.enable();
      await navigateToPage('console_test.html');
      await checkMessages(4);
    });

    test('receives old console messages', () async {
      await navigateToPage('console_test.html');
      await console!.enable();
      await checkMessages(4);
    });

    test('does not receive messages if not enabled', () async {
      await navigateToPage('console_test.html');
      await checkMessages(0);
    });
  });
}
