// 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/minitest.dart';
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);
    });
  });
}
