Index: test/codegen/lib/html/event_test.dart |
diff --git a/test/codegen/lib/html/event_test.dart b/test/codegen/lib/html/event_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..14c92f1db563f2e468a96d654cc75c497ff850aa |
--- /dev/null |
+++ b/test/codegen/lib/html/event_test.dart |
@@ -0,0 +1,199 @@ |
+// 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'); |
+} |