|  | // Copyright (c) 2011, 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 EventTest; | 
|  |  | 
|  | import "package:expect/expect.dart"; | 
|  | import 'package:unittest/unittest.dart'; | 
|  | import 'package:unittest/html_config.dart'; | 
|  | import 'dart:html'; | 
|  |  | 
|  | // TODO(nweiz): Make this private to testEvents when Frog supports closures with | 
|  | // optional arguments. | 
|  | eventTest(String name, Event eventFn(), void validate(Event), | 
|  | [String type = 'foo']) { | 
|  | test(name, () { | 
|  | final el = new Element.tag('div'); | 
|  | var fired = false; | 
|  | el.on[type].listen((ev) { | 
|  | fired = true; | 
|  | validate(ev); | 
|  | }); | 
|  | el.dispatchEvent(eventFn()); | 
|  | expect(fired, isTrue, reason: 'Expected event to be dispatched.'); | 
|  | }); | 
|  | } | 
|  |  | 
|  | main() { | 
|  | useHtmlConfiguration(); | 
|  |  | 
|  | // Issue 1005. | 
|  | // eventTest('AnimationEvent', () => new AnimationEvent('foo', 'color', 0.5), | 
|  | //     (ev) { | 
|  | //   expect(ev.animationName, 'color'); | 
|  | //   expect(ev.elapsedTime, 0.5); | 
|  | // }); | 
|  |  | 
|  | // Issue 1005. | 
|  | // eventTest('BeforeLoadEvent', | 
|  | //    () => new BeforeLoadEvent('foo', 'http://example.url'), | 
|  | //    (ev) { expect(ev.url, 'http://example.url'); }); | 
|  |  | 
|  | // Issue 1005. | 
|  | // eventTest('CloseEvent', | 
|  | //     () => new CloseEvent('foo', 5, 'reason', wasClean: true), | 
|  | //     (ev) { | 
|  | //   expect(ev.code, 5); | 
|  | //   expect(ev.reason, 'reason'); | 
|  | //   expect(ev.wasClean, isTrue); | 
|  | // }); | 
|  |  | 
|  | eventTest( | 
|  | 'CompositionEvent', | 
|  | () => | 
|  | new CompositionEvent('compositionstart', view: window, data: 'data'), | 
|  | (ev) { | 
|  | expect(ev.data, 'data'); | 
|  | }, 'compositionstart'); | 
|  |  | 
|  | // initCustomEvent is not yet implemented | 
|  | // eventTest('CustomEvent', | 
|  | //     () => new CustomEvent('foo', false, false, 'detail'), | 
|  | //     (ev) { expect(ev.detail, 'detail'); }); | 
|  |  | 
|  | // DeviceMotionEvent has no properties to itself, so just test that it doesn't | 
|  | // error out on creation and can be dispatched. | 
|  | // Suppress. DeviceMotion has no constructor, and I don't think it can be | 
|  | // created on a non-mobile device. Issue 23321 | 
|  | // eventTest('DeviceMotionEvent', () => new DeviceMotionEvent('foo'), (ev) {}); | 
|  |  | 
|  | // initDeviceOrientationEvent is not yet implemented | 
|  | // eventTest('DeviceOrientationEvent', | 
|  | //     () => new DeviceOrientationEvent('foo', 0.1, 0.2, 0.3), | 
|  | //     (ev) { | 
|  | //   expect(ev.alpha, 0.1); | 
|  | //   expect(ev.beta, 0.2); | 
|  | //   expect(ev.gamma, 0.3); | 
|  | // }); | 
|  |  | 
|  | // Issue 1005. | 
|  | // eventTest('ErrorEvent', | 
|  | //     () => new ErrorEvent('foo', 'message', 'filename', 10), | 
|  | //     (ev) { | 
|  | //   expect('message', ev.message); | 
|  | //   expect('filename', ev.filename); | 
|  | //   expect(ev.lineno, 10); | 
|  | // }); | 
|  |  | 
|  | eventTest( | 
|  | 'Event', () => new Event('foo', canBubble: false, cancelable: false), | 
|  | (ev) { | 
|  | expect(ev.type, equals('foo')); | 
|  | expect(ev.bubbles, isFalse); | 
|  | expect(ev.cancelable, isFalse); | 
|  | }); | 
|  |  | 
|  | eventTest( | 
|  | 'HashChangeEvent', | 
|  | () => new HashChangeEvent('foo', | 
|  | oldUrl: 'http://old.url', newUrl: 'http://new.url'), (ev) { | 
|  | expect(ev.oldUrl, equals('http://old.url')); | 
|  | expect(ev.newUrl, equals('http://new.url')); | 
|  | }); | 
|  |  | 
|  | // KeyboardEvent has its own test file, and has cross-browser issues. | 
|  |  | 
|  | eventTest( | 
|  | 'MouseEvent', | 
|  | () => new MouseEvent('foo', | 
|  | view: window, | 
|  | detail: 1, | 
|  | screenX: 2, | 
|  | screenY: 3, | 
|  | clientX: 4, | 
|  | clientY: 5, | 
|  | button: 6, | 
|  | ctrlKey: true, | 
|  | altKey: true, | 
|  | shiftKey: true, | 
|  | metaKey: true, | 
|  | relatedTarget: document.body), (ev) { | 
|  | expect(ev.detail, 1); | 
|  | expect(ev.screen.x, 2); | 
|  | expect(ev.screen.y, 3); | 
|  | expect(ev.client.x, 4); | 
|  | expect(ev.client.y, 5); | 
|  | expect(ev.offset.x, 4); // Same as clientX. | 
|  | expect(ev.offset.y, 5); // Same as clientY. | 
|  | expect(ev.button, 6); | 
|  | expect(ev.ctrlKey, isTrue); | 
|  | expect(ev.altKey, isTrue); | 
|  | expect(ev.shiftKey, isTrue); | 
|  | expect(ev.metaKey, isTrue); | 
|  | // TODO(alanknight): The target does not seem to get correctly set. | 
|  | // Issue 23438 | 
|  | //  expect(ev.relatedTarget, document.body); | 
|  | }); | 
|  |  | 
|  | // Issue 1005. | 
|  | // eventTest('OverflowEvent', | 
|  | //     () => new OverflowEvent(OverflowEvent.BOTH, true, true), | 
|  | //     (ev) { | 
|  | //   expect(ev.orient, OverflowEvent.BOTH); | 
|  | //   expect(ev.horizontalOverflow, isTrue); | 
|  | //   expect(ev.verticalOverflow, isTrue); | 
|  | // }, type: 'overflowchanged'); | 
|  |  | 
|  | // Issue 1005. | 
|  | // eventTest('PageTransitionEvent', | 
|  | //     () => new PageTransitionEvent('foo', persisted: true), | 
|  | //     (ev) { expect(ev.persisted, isTrue); }); | 
|  |  | 
|  | // initPopStateEvent is not yet implemented | 
|  | // eventTest('PopStateEvent', () => new PopStateEvent('foo', 'state'), | 
|  | //     (ev) { expect(ev.state, 'state'); } | 
|  |  | 
|  | // Issue 1005. | 
|  | // eventTest('ProgressEvent', | 
|  | //     // canBubble and cancelable are currently required to avoid dartc | 
|  | //     // complaining about the types of the named arguments. | 
|  | //     () => new ProgressEvent('foo', 5, canBubble: true, cancelable: true, | 
|  | //         lengthComputable: true, total: 10), | 
|  | //     (ev) { | 
|  | //   expect(ev.loaded, 5); | 
|  | //   expect(ev.lengthComputable, isTrue); | 
|  | //   expect(ev.total, 10); | 
|  | // }); | 
|  |  | 
|  | eventTest( | 
|  | 'StorageEvent', | 
|  | () => new StorageEvent('foo', | 
|  | key: 'key', | 
|  | url: 'http://example.url', | 
|  | storageArea: window.localStorage, | 
|  | canBubble: true, | 
|  | cancelable: true, | 
|  | oldValue: 'old', | 
|  | newValue: 'new'), (ev) { | 
|  | expect(ev.key, 'key'); | 
|  | expect(ev.url, 'http://example.url'); | 
|  | // Equality isn't preserved for storageArea | 
|  | expect(ev.storageArea, isNotNull); | 
|  | expect(ev.oldValue, 'old'); | 
|  | expect(ev.newValue, 'new'); | 
|  | }); | 
|  |  | 
|  | // Issue 1005. | 
|  | // eventTest('TransitionEvent', () => new TransitionEvent('foo', 'color', 0.5), | 
|  | //     (ev) { | 
|  | //   expect(ev.propertyName, 'color'); | 
|  | //   expect(ev.elapsedTime, 0.5); | 
|  | // }); | 
|  |  | 
|  | eventTest('UIEvent', () => new UIEvent('foo', view: window, detail: 12), | 
|  | (ev) { | 
|  | expect(window, ev.view); | 
|  | expect(12, ev.detail); | 
|  | }); | 
|  |  | 
|  | eventTest( | 
|  | 'WheelEvent', | 
|  | // TODO(alanknight): Can't pass window on Dartium. Add view: window | 
|  | // once going through JS. | 
|  | () => new WheelEvent("mousewheel", | 
|  | deltaX: 1, | 
|  | deltaY: 0, | 
|  | detail: 4, | 
|  | screenX: 3, | 
|  | screenY: 4, | 
|  | clientX: 5, | 
|  | clientY: 6, | 
|  | ctrlKey: true, | 
|  | altKey: true, | 
|  | shiftKey: true, | 
|  | metaKey: true), (ev) { | 
|  | expect(ev.deltaX, 1); | 
|  | expect(ev.deltaY, 0); | 
|  | expect(ev.screen.x, 3); | 
|  | expect(ev.screen.y, 4); | 
|  | expect(ev.client.x, 5); | 
|  | expect(ev.client.y, 6); | 
|  | expect(ev.ctrlKey, isTrue); | 
|  | expect(ev.altKey, isTrue); | 
|  | expect(ev.shiftKey, isTrue); | 
|  | expect(ev.metaKey, isTrue); | 
|  | }, 'mousewheel'); | 
|  | } |