library KeyboardEventTest;
import '../../pkg/unittest/lib/unittest.dart';
import '../../pkg/unittest/lib/html_config.dart';
import 'dart:html';

// Test that we are correctly determining keyCode and charCode uniformly across
// browsers.

main() {

  useHtmlConfiguration();

  keydownHandlerTest(KeyEvent e) {
    expect(e.charCode, 0);
  }

  test('keyboardEvent constructor', () {
    var event = new KeyboardEvent('keyup');
  });
  test('keys', () {
    var subscription = KeyboardEventStream.onKeyDown(document.body).listen(
        keydownHandlerTest);
    var subscription2 = KeyEvent.keyDownEvent.forTarget(document.body).listen(
        keydownHandlerTest);
    var subscription3 = document.body.onKeyDown.listen(
        (e) => print('regular listener'));
    subscription.cancel();
    subscription2.cancel();
    subscription3.cancel();
  });

  test('constructKeyEvent', () {
    var stream = KeyEvent.keyPressEvent.forTarget(document.body);
    var subscription = stream.listen(expectAsync1((keyEvent) {
      expect(keyEvent.charCode, 97);
      expect(keyEvent.keyCode, 65);
    }));
    var k = new KeyEvent('keypress', keyCode: 65, charCode: 97);
    stream.add(k);
    subscription.cancel();
    // Capital "A":
    stream.add(new KeyEvent('keydown', keyCode: 16, charCode: 0));

    subscription = stream.listen(expectAsync1((keyEvent) {
      expect(keyEvent.charCode, 65);
      expect(keyEvent.keyCode, 65);
    }));
    stream.add(new KeyEvent('keypress', keyCode: 65, charCode: 65));
    subscription.cancel();
  });

  test('KeyEventSequence', () {
    // Press "?" by simulating "shift" and then the key that has "/" and "?" on
    // it.
    var streamDown = KeyEvent.keyDownEvent.forTarget(document.body);
    var streamPress = KeyEvent.keyPressEvent.forTarget(document.body);
    var streamUp = KeyEvent.keyUpEvent.forTarget(document.body);

    var subscription = streamDown.listen(expectAsync1((keyEvent) {
      expect(keyEvent.keyCode, isIn([16, 191]));
      expect(keyEvent.charCode, 0);
    }, count: 2));

    var subscription2 = streamPress.listen(expectAsync1((keyEvent) {
      expect(keyEvent.keyCode, 23);
      expect(keyEvent.charCode, 63);
    }));

    var subscription3 = streamUp.listen(expectAsync1((keyEvent) {
      expect(keyEvent.keyCode, isIn([16, 191]));
      expect(keyEvent.charCode, 0);
    }, count: 2));

    streamDown.add(new KeyEvent('keydown', keyCode: 16, charCode: 0));
    streamDown.add(new KeyEvent('keydown', keyCode: 191, charCode: 0));

    streamPress.add(new KeyEvent('keypress', keyCode: 23, charCode: 63));

    streamUp.add(new KeyEvent('keyup', keyCode: 191, charCode: 0));
    streamUp.add(new KeyEvent('keyup', keyCode: 16, charCode: 0));
    subscription.cancel();
    subscription2.cancel();
    subscription3.cancel();
  });

  test('KeyEventKeyboardEvent', () {
    window.onKeyDown.listen(expectAsync1((KeyboardEvent event) {
      expect(event.keyCode, 16);
    }));
    var streamDown = KeyEvent.keyDownEvent.forTarget(document.body);
    streamDown.add(new KeyEvent('keydown', keyCode: 16, charCode: 0));
  });
}


