summaryrefslogtreecommitdiff
path: root/js/mixins/dom_iterable_test.ts
diff options
context:
space:
mode:
Diffstat (limited to 'js/mixins/dom_iterable_test.ts')
-rw-r--r--js/mixins/dom_iterable_test.ts78
1 files changed, 78 insertions, 0 deletions
diff --git a/js/mixins/dom_iterable_test.ts b/js/mixins/dom_iterable_test.ts
new file mode 100644
index 000000000..a4791c1b8
--- /dev/null
+++ b/js/mixins/dom_iterable_test.ts
@@ -0,0 +1,78 @@
+// Copyright 2018 the Deno authors. All rights reserved. MIT license.
+import { test, assert, assertEqual } from "../test_util.ts";
+import { DomIterableMixin } from "./dom_iterable.ts";
+
+function setup() {
+ const dataSymbol = Symbol("data symbol");
+ class Base {
+ private [dataSymbol] = new Map<string, number>();
+
+ constructor(
+ data: Array<[string, number]> | IterableIterator<[string, number]>
+ ) {
+ for (const [key, value] of data) {
+ this[dataSymbol].set(key, value);
+ }
+ }
+ }
+
+ return {
+ Base,
+ DomIterable: DomIterableMixin<string, number, typeof Base>(Base, dataSymbol)
+ };
+}
+
+test(function testDomIterable() {
+ // tslint:disable-next-line:variable-name
+ const { DomIterable, Base } = setup();
+
+ const fixture: Array<[string, number]> = [["foo", 1], ["bar", 2]];
+
+ const domIterable = new DomIterable(fixture);
+
+ assertEqual(Array.from(domIterable.entries()), fixture);
+ assertEqual(Array.from(domIterable.values()), [1, 2]);
+ assertEqual(Array.from(domIterable.keys()), ["foo", "bar"]);
+
+ let result: Array<[string, number]> = [];
+ for (const [key, value] of domIterable) {
+ assert(key != null);
+ assert(value != null);
+ result.push([key, value]);
+ }
+ assertEqual(fixture, result);
+
+ result = [];
+ const scope = {};
+ function callback(value, key, parent) {
+ assertEqual(parent, domIterable);
+ assert(key != null);
+ assert(value != null);
+ assert(this === scope);
+ result.push([key, value]);
+ }
+ domIterable.forEach(callback, scope);
+ assertEqual(fixture, result);
+
+ assertEqual(DomIterable.name, Base.name);
+});
+
+test(function testDomIterableScope() {
+ // tslint:disable-next-line:variable-name
+ const { DomIterable } = setup();
+
+ const domIterable = new DomIterable([["foo", 1]]);
+
+ // tslint:disable-next-line:no-any
+ function checkScope(thisArg: any, expected: any) {
+ function callback() {
+ assertEqual(this, expected);
+ }
+ domIterable.forEach(callback, thisArg);
+ }
+
+ checkScope(0, Object(0));
+ checkScope("", Object(""));
+ checkScope(null, window);
+ checkScope(undefined, window);
+});