// 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. import 'dart:html'; import 'package:expect/minitest.dart'; 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() { // 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'); }