// Copyright (c) 2013, 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.

library interactive_test;

import 'dart:async';
import 'dart:html';
import 'package:expect/legacy/minitest.dart'; // ignore: deprecated_member_use_from_same_package
import 'utils.dart';

main() {
  group('KeyEvent', () {
    keydownHandlerTest(KeyEvent e) {
      document.body!.innerHtml =
          '${document.body!.innerHtml}KeyDOWN: CharCode: ${e.charCode}, '
          'KeyCode: ${e.keyCode}<br />';
      expect(e.charCode, 0);
    }

    keypressHandlerTest(KeyEvent e) {
      document.body!.innerHtml =
          '${document.body!.innerHtml}KeyPRESS: CharCode: ${e.charCode}, '
          'KeyCode: ${e.keyCode}<br />';
    }

    keyupHandlerTest(KeyEvent e) {
      document.body!.innerHtml =
          '${document.body!.innerHtml}KeyUP: CharCode: ${e.charCode}, KeyCode:'
          ' ${e.keyCode}<br />';
      expect(e.charCode, 0);
    }

    keyupHandlerTest2(KeyEvent e) {
      document.body!.innerHtml =
          '${document.body!.innerHtml}A second KeyUP handler: CharCode: '
          '${e.charCode}, KeyCode: ${e.keyCode}<br />';
      expect(e.charCode, 0);
    }

    test('keys', () {
      document.body!.innerHtml =
          '${document.body!.innerHtml}To test keyboard event values, press '
          'some keys on your keyboard.<br /><br />The charcode for keydown and '
          'keyup should be 0, and the keycode should (generally) be populated '
          'with a value. Keycode and charcode should both have values for the '
          'keypress event.';
      KeyboardEventStream.onKeyDown(document.body!).listen(keydownHandlerTest);
      KeyboardEventStream.onKeyPress(document.body!)
          .listen(keypressHandlerTest);
      KeyboardEventStream.onKeyUp(document.body!).listen(keyupHandlerTest);
      KeyboardEventStream.onKeyUp(document.body!).listen(keyupHandlerTest2);
    });
  });
}
