// 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.

// @dart = 2.9

library wheel_event_test;

import 'dart:async';
import 'dart:html';

import 'package:expect/minitest.dart';

Future testWheelEvent() async {
  final done = new Completer();
  var element = new DivElement();
  var eventType = Element.mouseWheelEvent.getEventType(element);

  element.onMouseWheel.listen((e) {
    try {
      expect(e.screen.x, 100);
      expect(e.deltaX, 0);
      expect(e.deltaY.toDouble(), 240.0);
      expect(e.deltaMode, WheelEvent.DOM_DELTA_PAGE);
      done.complete();
    } catch (e) {
      done.completeError(e);
    }
  });
  var event = new WheelEvent(eventType,
      deltaX: 0,
      deltaY: 240,
      deltaMode: WheelEvent.DOM_DELTA_PAGE,
      screenX: 100);
  element.dispatchEvent(event);
  await done.future;
}

Future testWheelEventWithDeltaZ() async {
  final done = new Completer();
  var element = new DivElement();
  var eventType = Element.mouseWheelEvent.getEventType(element);

  element.onMouseWheel.listen((e) {
    try {
      expect(e.deltaX, 0);
      expect(e.deltaY, 0);
      expect(e.screen.x, 0);
      expect(e.deltaZ.toDouble(), 1.0);
      done.complete();
    } catch (e) {
      done.completeError(e);
    }
  });
  var event = new WheelEvent(eventType, deltaZ: 1.0);
  element.dispatchEvent(event);
  await done.future;
}

Future testWheelEventStream() async {
  final done = new Completer();
  var element = new DivElement();
  var eventType = Element.mouseWheelEvent.getEventType(element);

  element.onMouseWheel.listen((e) {
    try {
      expect(e.screen.x, 100);
      expect(e.deltaX.toDouble(), 240.0);
      expect(e.deltaY, 0);
      done.complete();
    } catch (e) {
      done.completeError(e);
    }
  });
  var event = new WheelEvent(eventType, deltaX: 240, deltaY: 0, screenX: 100);
  element.dispatchEvent(event);
  await done.future;
}

main() async {
  await testWheelEvent();
  await testWheelEventWithDeltaZ();
  await testWheelEventStream();
}
