From 8055d395f5642c6716df9110beeeaf39a28fd8b3 Mon Sep 17 00:00:00 2001
From: Shahar Dawn Or <mightyiampresence@gmail.com>
Date: Wed, 22 Jan 2020 13:08:59 +0700
Subject: [PATCH] chore(test): chai assert & karma-mocha-reporter (#541)

Closes #535.
---
 karma.conf.js              |   6 +-
 package-lock.json          | 168 +++++++++++++++++++++++++++++++++++++
 package.json               |   3 +
 src/test/attachto.ts       |   2 +-
 src/test/attributes.ts     |   2 +-
 src/test/core.ts           |  76 ++++++++---------
 src/test/dataset.ts        |   2 +-
 src/test/eventlisteners.ts |  20 ++---
 src/test/htmldomapi.ts     |   2 +-
 src/test/jsx.tsx           |   2 +-
 src/test/style.ts          |   2 +-
 src/test/thunk.ts          |   8 +-
 12 files changed, 234 insertions(+), 59 deletions(-)

diff --git a/karma.conf.js b/karma.conf.js
index 4219618..dde7e6c 100644
--- a/karma.conf.js
+++ b/karma.conf.js
@@ -22,6 +22,7 @@ module.exports = function (config) {
     files: [{ pattern: 'src/**/*' }],
     plugins: [
       'karma-mocha',
+      require('karma-mocha-reporter'),
       'karma-chrome-launcher',
       'karma-firefox-launcher',
       'karma-browserstack-launcher',
@@ -53,7 +54,10 @@ module.exports = function (config) {
         values: ['src/test/**/*'],
       },
     },
-    reporters: ['dots', 'karma-typescript', 'BrowserStack'],
+    reporters: ['mocha', 'karma-typescript', 'BrowserStack'],
+    mochaReporter: {
+      showDiff: true
+    },
     port: 9876,
     colors: true,
     autoWatch: true,
diff --git a/package-lock.json b/package-lock.json
index 216402a..41d9fc5 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -684,6 +684,12 @@
       "integrity": "sha512-491hfOvNr0+BGOHT2m36xJ+LK68IuOshvxV0VIrKOnzBDL11WlDa3PwO+drTYkwCdfzJRN9REcDPZVVcrx1ucw==",
       "dev": true
     },
+    "@types/chai": {
+      "version": "4.2.7",
+      "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.2.7.tgz",
+      "integrity": "sha512-luq8meHGYwvky0O7u0eQZdA7B4Wd9owUCqvbw2m3XCrCU8mplYOujMBbvyS547AxJkC+pGnd0Cm15eNxEUNU8g==",
+      "dev": true
+    },
     "@types/eslint-visitor-keys": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz",
@@ -1171,6 +1177,12 @@
       "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
       "dev": true
     },
+    "assertion-error": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
+      "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
+      "dev": true
+    },
     "assign-symbols": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
@@ -1824,6 +1836,20 @@
       "integrity": "sha512-fpZ81yYfzentuieinmGnphk0pLkOTMm6MZdVqwd77ROvhko6iujLNGrHH5E7utq3ygWklwfmwuG+A7P+NpqT6w==",
       "dev": true
     },
+    "chai": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz",
+      "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==",
+      "dev": true,
+      "requires": {
+        "assertion-error": "^1.1.0",
+        "check-error": "^1.0.2",
+        "deep-eql": "^3.0.1",
+        "get-func-name": "^2.0.0",
+        "pathval": "^1.1.0",
+        "type-detect": "^4.0.5"
+      }
+    },
     "chainsaw": {
       "version": "0.1.0",
       "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz",
@@ -1876,6 +1902,12 @@
       "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
       "dev": true
     },
+    "check-error": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
+      "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=",
+      "dev": true
+    },
     "chokidar": {
       "version": "2.1.5",
       "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.5.tgz",
@@ -2659,6 +2691,15 @@
       "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
       "dev": true
     },
+    "deep-eql": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz",
+      "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==",
+      "dev": true,
+      "requires": {
+        "type-detect": "^4.0.0"
+      }
+    },
     "deep-extend": {
       "version": "0.6.0",
       "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
@@ -4786,6 +4827,12 @@
       "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==",
       "dev": true
     },
+    "get-func-name": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz",
+      "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=",
+      "dev": true
+    },
     "get-stdin": {
       "version": "4.0.1",
       "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
@@ -6842,6 +6889,69 @@
         "minimist": "1.2.0"
       }
     },
+    "karma-mocha-reporter": {
+      "version": "2.2.5",
+      "resolved": "https://registry.npmjs.org/karma-mocha-reporter/-/karma-mocha-reporter-2.2.5.tgz",
+      "integrity": "sha1-FRIAlejtgZGG5HoLAS8810GJVWA=",
+      "dev": true,
+      "requires": {
+        "chalk": "^2.1.0",
+        "log-symbols": "^2.1.0",
+        "strip-ansi": "^4.0.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+          "dev": true
+        },
+        "ansi-styles": {
+          "version": "3.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+          "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+          "dev": true,
+          "requires": {
+            "color-convert": "^1.9.0"
+          }
+        },
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^3.2.1",
+            "escape-string-regexp": "^1.0.5",
+            "supports-color": "^5.3.0"
+          }
+        },
+        "has-flag": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+          "dev": true
+        },
+        "strip-ansi": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+          "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^3.0.0"
+          }
+        },
+        "supports-color": {
+          "version": "5.5.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
     "karma-typescript": {
       "version": "3.0.13",
       "resolved": "https://registry.npmjs.org/karma-typescript/-/karma-typescript-3.0.13.tgz",
@@ -7401,6 +7511,52 @@
         }
       }
     },
+    "log-symbols": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz",
+      "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==",
+      "dev": true,
+      "requires": {
+        "chalk": "^2.0.1"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "3.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+          "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+          "dev": true,
+          "requires": {
+            "color-convert": "^1.9.0"
+          }
+        },
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^3.2.1",
+            "escape-string-regexp": "^1.0.5",
+            "supports-color": "^5.3.0"
+          }
+        },
+        "has-flag": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "5.5.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
     "log4js": {
       "version": "3.0.6",
       "resolved": "https://registry.npmjs.org/log4js/-/log4js-3.0.6.tgz",
@@ -8621,6 +8777,12 @@
         }
       }
     },
+    "pathval": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz",
+      "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=",
+      "dev": true
+    },
     "pbkdf2": {
       "version": "3.0.17",
       "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz",
@@ -10429,6 +10591,12 @@
         "prelude-ls": "~1.1.2"
       }
     },
+    "type-detect": {
+      "version": "4.0.8",
+      "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
+      "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+      "dev": true
+    },
     "type-fest": {
       "version": "0.6.0",
       "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
diff --git a/package.json b/package.json
index 2a362b1..8ecf3fd 100644
--- a/package.json
+++ b/package.json
@@ -14,11 +14,13 @@
     "@commitlint/config-conventional": "^8.2.0",
     "@commitlint/travis-cli": "^8.2.0",
     "@types/assert": "^1.4.3",
+    "@types/chai": "^4.2.7",
     "@types/lodash.shuffle": "^4.2.6",
     "@types/mocha": "^5.2.7",
     "@typescript-eslint/eslint-plugin": "^2.7.0",
     "benchmark": "^2.1.4",
     "browserify": "^14.4.0",
+    "chai": "^4.2.0",
     "editorconfig-checker": "^3.0.3",
     "eslint": "^6.7.2",
     "eslint-config-standard-with-typescript": "^11.0.1",
@@ -37,6 +39,7 @@
     "karma-chrome-launcher": "^2.2.0",
     "karma-firefox-launcher": "^1.2.0",
     "karma-mocha": "^1.3.0",
+    "karma-mocha-reporter": "^2.2.5",
     "karma-typescript": "^3.0.13",
     "lodash.shuffle": "^4.2.0",
     "mocha": "^5.2.0",
diff --git a/src/test/attachto.ts b/src/test/attachto.ts
index 943d005..f664f79 100644
--- a/src/test/attachto.ts
+++ b/src/test/attachto.ts
@@ -1,4 +1,4 @@
-import assert from 'assert'
+import { assert } from 'chai'
 import { init } from '../snabbdom'
 import { RemoveHook } from '../hooks';
 import attachTo from '../helpers/attachto'
diff --git a/src/test/attributes.ts b/src/test/attributes.ts
index 775040f..5726974 100644
--- a/src/test/attributes.ts
+++ b/src/test/attributes.ts
@@ -1,4 +1,4 @@
-import assert from 'assert'
+import { assert } from 'chai'
 import { init } from '../snabbdom'
 import attributesModule from '../modules/attributes'
 import h from '../h'
diff --git a/src/test/core.ts b/src/test/core.ts
index ccb8e06..c4b9b01 100644
--- a/src/test/core.ts
+++ b/src/test/core.ts
@@ -1,4 +1,4 @@
-import assert from 'assert'
+import { assert } from 'chai'
 import shuffle from 'lodash.shuffle'
 
 import { init } from '../snabbdom'
@@ -78,7 +78,7 @@ describe('snabbdom', function () {
     });
     it('can create vnode with null props', function () {
       var vnode = h('a', null);
-      assert.deepStrictEqual(vnode.data, {});
+      assert.deepEqual(vnode.data, {});
       vnode = h('a', null, ['I am a string']);
       const children = vnode.children as [VNode]
       assert.strictEqual(children[0].text, 'I am a string');
@@ -373,10 +373,10 @@ describe('snabbdom', function () {
         elm.appendChild(text);
         var vnode = toVNode(elm, domApi);
         assert.strictEqual(vnode.sel, 'x-div#id.class.other');
-        assert.deepStrictEqual(vnode.data, { attrs: { data: 'value' } });
+        assert.deepEqual(vnode.data, { attrs: { data: 'value' } });
         const children = vnode.children as [VNode, VNode]
         assert.strictEqual(children[0].sel, 'x-h2#hx');
-        assert.deepStrictEqual(children[0].data, { attrs: { 'data-env': 'xyz' } });
+        assert.deepEqual(children[0].data, { attrs: { 'data-env': 'xyz' } });
         assert.strictEqual(children[1].text, 'Foobar');
       });
     });
@@ -407,7 +407,7 @@ describe('snabbdom', function () {
           elm = patch(vnode0, vnode1).elm;
           assert.strictEqual(elm.children.length, 2);
           elm = patch(vnode1, vnode2).elm;
-          assert.deepStrictEqual(map(inner, elm.children), ['1', '2', '3', '4', '5']);
+          assert.deepEqual(map(inner, elm.children), ['1', '2', '3', '4', '5']);
         });
         it('add elements in the middle', function () {
           var vnode1 = h('span', [1, 2, 4, 5].map(spanNum));
@@ -416,7 +416,7 @@ describe('snabbdom', function () {
           assert.strictEqual(elm.children.length, 4);
           assert.strictEqual(elm.children.length, 4);
           elm = patch(vnode1, vnode2).elm;
-          assert.deepStrictEqual(map(inner, elm.children), ['1', '2', '3', '4', '5']);
+          assert.deepEqual(map(inner, elm.children), ['1', '2', '3', '4', '5']);
         });
         it('add elements at begin and end', function () {
           var vnode1 = h('span', [2, 3, 4].map(spanNum));
@@ -424,7 +424,7 @@ describe('snabbdom', function () {
           elm = patch(vnode0, vnode1).elm;
           assert.strictEqual(elm.children.length, 3);
           elm = patch(vnode1, vnode2).elm;
-          assert.deepStrictEqual(map(inner, elm.children), ['1', '2', '3', '4', '5']);
+          assert.deepEqual(map(inner, elm.children), ['1', '2', '3', '4', '5']);
         });
         it('adds children to parent with no children', function () {
           var vnode1 = h('span', { key: 'span' });
@@ -432,13 +432,13 @@ describe('snabbdom', function () {
           elm = patch(vnode0, vnode1).elm;
           assert.strictEqual(elm.children.length, 0);
           elm = patch(vnode1, vnode2).elm;
-          assert.deepStrictEqual(map(inner, elm.children), ['1', '2', '3']);
+          assert.deepEqual(map(inner, elm.children), ['1', '2', '3']);
         });
         it('removes all children from parent', function () {
           var vnode1 = h('span', { key: 'span' }, [1, 2, 3].map(spanNum));
           var vnode2 = h('span', { key: 'span' });
           elm = patch(vnode0, vnode1).elm;
-          assert.deepStrictEqual(map(inner, elm.children), ['1', '2', '3']);
+          assert.deepEqual(map(inner, elm.children), ['1', '2', '3']);
           elm = patch(vnode1, vnode2).elm;
           assert.strictEqual(elm.children.length, 0);
         });
@@ -446,9 +446,9 @@ describe('snabbdom', function () {
           var vnode1 = h('span', { key: 'span' }, [1, 2, 3].map(spanNum));
           var vnode2 = h('span', { key: 'span' }, [spanNum(1), h('i', { key: 2 }, '2'), spanNum(3)]);
           elm = patch(vnode0, vnode1).elm;
-          assert.deepStrictEqual(map(inner, elm.children), ['1', '2', '3']);
+          assert.deepEqual(map(inner, elm.children), ['1', '2', '3']);
           elm = patch(vnode1, vnode2).elm;
-          assert.deepStrictEqual(map(inner, elm.children), ['1', '2', '3']);
+          assert.deepEqual(map(inner, elm.children), ['1', '2', '3']);
           assert.strictEqual(elm.children.length, 3);
           assert.strictEqual(elm.children[1].tagName, 'I');
         });
@@ -460,7 +460,7 @@ describe('snabbdom', function () {
           elm = patch(vnode0, vnode1).elm;
           assert.strictEqual(elm.children.length, 5);
           elm = patch(vnode1, vnode2).elm;
-          assert.deepStrictEqual(map(inner, elm.children), ['3', '4', '5']);
+          assert.deepEqual(map(inner, elm.children), ['3', '4', '5']);
         });
         it('removes elements from the end', function () {
           var vnode1 = h('span', [1, 2, 3, 4, 5].map(spanNum));
@@ -480,7 +480,7 @@ describe('snabbdom', function () {
           assert.strictEqual(elm.children.length, 5);
           elm = patch(vnode1, vnode2).elm;
           assert.strictEqual(elm.children.length, 4);
-          assert.deepStrictEqual(elm.children[0].innerHTML, '1');
+          assert.deepEqual(elm.children[0].innerHTML, '1');
           assert.strictEqual(elm.children[0].innerHTML, '1');
           assert.strictEqual(elm.children[1].innerHTML, '2');
           assert.strictEqual(elm.children[2].innerHTML, '4');
@@ -556,7 +556,7 @@ describe('snabbdom', function () {
           elm = patch(vnode0, vnode1).elm;
           assert.strictEqual(elm.children.length, 3);
           elm = patch(vnode1, vnode2).elm;
-          assert.deepStrictEqual(map(inner, elm.children), ['4', '6']);
+          assert.deepEqual(map(inner, elm.children), ['4', '6']);
         });
         it('handles moved and set to undefined element ending at the end', function () {
           var vnode1 = h('span', [2, 4, 5].map(spanNum));
@@ -586,7 +586,7 @@ describe('snabbdom', function () {
         elm = patch(vnode0, vnode1).elm;
         assert.strictEqual(elm.children.length, 8);
         elm = patch(vnode1, vnode2).elm;
-        assert.deepStrictEqual(map(inner, elm.children), ['8', '7', '6', '5', '4', '3', '2', '1']);
+        assert.deepEqual(map(inner, elm.children), ['8', '7', '6', '5', '4', '3', '2', '1']);
       });
       it('something', function () {
         var vnode1 = h('span', [0, 1, 2, 3, 4, 5].map(spanNum));
@@ -594,7 +594,7 @@ describe('snabbdom', function () {
         elm = patch(vnode0, vnode1).elm;
         assert.strictEqual(elm.children.length, 6);
         elm = patch(vnode1, vnode2).elm;
-        assert.deepStrictEqual(map(inner, elm.children), ['4', '3', '2', '1', '5', '0']);
+        assert.deepEqual(map(inner, elm.children), ['4', '3', '2', '1', '5', '0']);
       });
       it('handles random shuffles', function () {
         var n, i, arr = [], opacities: string[] = [], elms = 14, samples = 5;
@@ -630,7 +630,7 @@ describe('snabbdom', function () {
         elm = patch(vnode0, vnode1).elm;
         assert.strictEqual(elm.children.length, 6);
         elm = patch(vnode1, vnode2).elm;
-        assert.deepStrictEqual(map(inner, elm.children), ['2', '1', '0', '5', '4', '3']);
+        assert.deepEqual(map(inner, elm.children), ['2', '1', '0', '5', '4', '3']);
       });
       it('supports all null/undefined children', function () {
         var vnode1 = h('i', [0, 1, 2, 3, 4, 5].map(spanNum));
@@ -640,7 +640,7 @@ describe('snabbdom', function () {
         elm = patch(vnode1, vnode2).elm;
         assert.strictEqual(elm.children.length, 0);
         elm = patch(vnode2, vnode3).elm;
-        assert.deepStrictEqual(map(inner, elm.children), ['5', '4', '3', '2', '1', '0']);
+        assert.deepEqual(map(inner, elm.children), ['5', '4', '3', '2', '1', '0']);
       });
       it('handles random shuffles with null/undefined children', function () {
         var i, j, r, len, arr, maxArrLen = 15, samples = 5, vnode1 = vnode0, vnode2;
@@ -655,7 +655,7 @@ describe('snabbdom', function () {
           shuffle(arr);
           vnode2 = h('div', arr.map(spanNum));
           elm = patch(vnode1, vnode2).elm;
-          assert.deepStrictEqual(map(inner, elm.children), arr.filter(function (x) { return x != null; }));
+          assert.deepEqual(map(inner, elm.children), arr.filter(function (x) { return x != null; }));
         }
       });
     });
@@ -664,9 +664,9 @@ describe('snabbdom', function () {
         var vnode1 = h('div', [h('span', 'Hello')]);
         var vnode2 = h('div', [h('span', 'Hello'), h('span', 'World')]);
         elm = patch(vnode0, vnode1).elm;
-        assert.deepStrictEqual(map(inner, elm.children), ['Hello']);
+        assert.deepEqual(map(inner, elm.children), ['Hello']);
         elm = patch(vnode1, vnode2).elm;
-        assert.deepStrictEqual(map(inner, elm.children), ['Hello', 'World']);
+        assert.deepEqual(map(inner, elm.children), ['Hello', 'World']);
       });
       it('handles unmoved text nodes', function () {
         var vnode1 = h('div', ['Text', h('span', 'Span')]);
@@ -712,26 +712,26 @@ describe('snabbdom', function () {
         var vnode1 = h('div', [h('span', 'World')]);
         var vnode2 = h('div', [h('span', 'Hello'), h('span', 'World')]);
         elm = patch(vnode0, vnode1).elm;
-        assert.deepStrictEqual(map(inner, elm.children), ['World']);
+        assert.deepEqual(map(inner, elm.children), ['World']);
         elm = patch(vnode1, vnode2).elm;
-        assert.deepStrictEqual(map(inner, elm.children), ['Hello', 'World']);
+        assert.deepEqual(map(inner, elm.children), ['Hello', 'World']);
       });
       it('prepends element of different tag type', function () {
         var vnode1 = h('div', [h('span', 'World')]);
         var vnode2 = h('div', [h('div', 'Hello'), h('span', 'World')]);
         elm = patch(vnode0, vnode1).elm;
-        assert.deepStrictEqual(map(inner, elm.children), ['World']);
+        assert.deepEqual(map(inner, elm.children), ['World']);
         elm = patch(vnode1, vnode2).elm;
-        assert.deepStrictEqual(map(prop('tagName'), elm.children), ['DIV', 'SPAN']);
-        assert.deepStrictEqual(map(inner, elm.children), ['Hello', 'World']);
+        assert.deepEqual(map(prop('tagName'), elm.children), ['DIV', 'SPAN']);
+        assert.deepEqual(map(inner, elm.children), ['Hello', 'World']);
       });
       it('removes elements', function () {
         var vnode1 = h('div', [h('span', 'One'), h('span', 'Two'), h('span', 'Three')]);
         var vnode2 = h('div', [h('span', 'One'), h('span', 'Three')]);
         elm = patch(vnode0, vnode1).elm;
-        assert.deepStrictEqual(map(inner, elm.children), ['One', 'Two', 'Three']);
+        assert.deepEqual(map(inner, elm.children), ['One', 'Two', 'Three']);
         elm = patch(vnode1, vnode2).elm;
-        assert.deepStrictEqual(map(inner, elm.children), ['One', 'Three']);
+        assert.deepEqual(map(inner, elm.children), ['One', 'Three']);
       });
       it('removes a single text node', function () {
         var vnode1 = h('div', 'One');
@@ -747,13 +747,13 @@ describe('snabbdom', function () {
         patch(vnode0, vnode1);
         assert.strictEqual(elm.textContent, 'One');
         patch(vnode1, vnode2);
-        assert.deepStrictEqual(map(prop('textContent'), elm.childNodes), ['Two', 'Three']);
+        assert.deepEqual(map(prop('textContent'), elm.childNodes), ['Two', 'Three']);
       });
       it('removes a text node among other elements', function () {
         var vnode1 = h('div', ['One', h('span', 'Two')]);
         var vnode2 = h('div', [h('div', 'Three')]);
         patch(vnode0, vnode1);
-        assert.deepStrictEqual(map(prop('textContent'), elm.childNodes), ['One', 'Two']);
+        assert.deepEqual(map(prop('textContent'), elm.childNodes), ['One', 'Two']);
         patch(vnode1, vnode2);
         assert.strictEqual(elm.childNodes.length, 1);
         assert.strictEqual(elm.childNodes[0].tagName, 'DIV');
@@ -763,21 +763,21 @@ describe('snabbdom', function () {
         var vnode1 = h('div', [h('span', 'One'), h('div', 'Two'), h('b', 'Three')]);
         var vnode2 = h('div', [h('b', 'Three'), h('span', 'One'), h('div', 'Two')]);
         elm = patch(vnode0, vnode1).elm;
-        assert.deepStrictEqual(map(inner, elm.children), ['One', 'Two', 'Three']);
+        assert.deepEqual(map(inner, elm.children), ['One', 'Two', 'Three']);
         elm = patch(vnode1, vnode2).elm;
-        assert.deepStrictEqual(map(prop('tagName'), elm.children), ['B', 'SPAN', 'DIV']);
-        assert.deepStrictEqual(map(inner, elm.children), ['Three', 'One', 'Two']);
+        assert.deepEqual(map(prop('tagName'), elm.children), ['B', 'SPAN', 'DIV']);
+        assert.deepEqual(map(inner, elm.children), ['Three', 'One', 'Two']);
       });
       it('supports null/undefined children', function () {
         var vnode1 = h('i', [null, h('i', '1'), h('i', '2'), null]);
         var vnode2 = h('i', [h('i', '2'), undefined, undefined, h('i', '1'), undefined]);
         var vnode3 = h('i', [null, h('i', '1'), undefined, null, h('i', '2'), undefined, null]);
         elm = patch(vnode0, vnode1).elm;
-        assert.deepStrictEqual(map(inner, elm.children), ['1', '2']);
+        assert.deepEqual(map(inner, elm.children), ['1', '2']);
         elm = patch(vnode1, vnode2).elm;
-        assert.deepStrictEqual(map(inner, elm.children), ['2', '1']);
+        assert.deepEqual(map(inner, elm.children), ['2', '1']);
         elm = patch(vnode2, vnode3).elm;
-        assert.deepStrictEqual(map(inner, elm.children), ['1', '2']);
+        assert.deepEqual(map(inner, elm.children), ['1', '2']);
       });
       it('supports all null/undefined children', function () {
         var vnode1 = h('i', [h('i', '1'), h('i', '2')]);
@@ -787,7 +787,7 @@ describe('snabbdom', function () {
         elm = patch(vnode1, vnode2).elm;
         assert.strictEqual(elm.children.length, 0);
         elm = patch(vnode2, vnode3).elm;
-        assert.deepStrictEqual(map(inner, elm.children), ['2', '1']);
+        assert.deepEqual(map(inner, elm.children), ['2', '1']);
       });
     });
   });
@@ -1021,7 +1021,7 @@ describe('snabbdom', function () {
         ]);
         var vnode1 = h('div');
         patch(vnode0, vnode1);
-        assert.deepStrictEqual(result, ['pre', 'post']);
+        assert.deepEqual(result, ['pre', 'post']);
       });
       it('invokes global `destroy` hook for all removed children', function () {
         var result = [];
diff --git a/src/test/dataset.ts b/src/test/dataset.ts
index e0757d9..3e99e54 100644
--- a/src/test/dataset.ts
+++ b/src/test/dataset.ts
@@ -1,4 +1,4 @@
-import assert from 'assert'
+import { assert } from 'chai'
 
 import datasetModule from '../modules/dataset'
 import { init } from '../snabbdom'
diff --git a/src/test/eventlisteners.ts b/src/test/eventlisteners.ts
index d57b441..9ae15d9 100644
--- a/src/test/eventlisteners.ts
+++ b/src/test/eventlisteners.ts
@@ -1,4 +1,4 @@
-import assert from 'assert'
+import { assert } from 'chai'
 import { VNode } from '../vnode';
 
 import { init } from '../snabbdom'
@@ -38,21 +38,21 @@ describe('event listeners', function () {
     elm.click();
     elm = patch(vnode1, vnode2).elm;
     elm.click();
-    assert.deepStrictEqual(result, [1, 2]);
+    assert.deepEqual(result, [1, 2]);
   });
   it('does calls handler for function in array', function () {
-    var result: Event[] = [];
-    function clicked (ev: Event) { result.push(ev); }
+    var result: number[] = [];
+    function clicked (n: number) { result.push(n); }
     var vnode = h('div', { on: { click: [clicked, 1] as any } }, [
       h('a', 'Click my parent'),
     ]);
     elm = patch(vnode0, vnode).elm;
     elm.click();
-    assert.deepStrictEqual(result, [1]);
+    assert.deepEqual(result, [1]);
   });
   it('handles changed value in array', function () {
-    var result: Event[] = [];
-    function clicked (ev: Event) { result.push(ev); }
+    var result: number[] = [];
+    function clicked (n: number) { result.push(n); }
     var vnode1 = h('div', { on: { click: [clicked, 1] as any } }, [
       h('a', 'Click my parent'),
     ]);
@@ -68,10 +68,10 @@ describe('event listeners', function () {
     elm.click();
     elm = patch(vnode2, vnode3).elm;
     elm.click();
-    assert.deepStrictEqual(result, [1, 2, 3]);
+    assert.deepEqual(result, [1, 2, 3]);
   });
   it('handles changed several values in array', function () {
-    var result: Event[] = [];
+    var result: number[][] = [];
     function clicked () { result.push([].slice.call(arguments, 0, arguments.length - 2)); }
     var vnode1 = h('div', { on: { click: [clicked, 1, 2, 3] as any } }, [
       h('a', 'Click my parent'),
@@ -88,7 +88,7 @@ describe('event listeners', function () {
     elm.click();
     elm = patch(vnode2, vnode3).elm;
     elm.click();
-    assert.deepStrictEqual(result, [[1, 2, 3], [1, 2], [2, 3]]);
+    assert.deepEqual(result, [[1, 2, 3], [1, 2], [2, 3]]);
   });
   it('detach attached click event handler to element', function () {
     var result: Event[] = [];
diff --git a/src/test/htmldomapi.ts b/src/test/htmldomapi.ts
index a2dbda7..e6edfac 100644
--- a/src/test/htmldomapi.ts
+++ b/src/test/htmldomapi.ts
@@ -1,4 +1,4 @@
-import assert from 'assert'
+import { assert } from 'chai'
 
 import { init } from '../snabbdom'
 import h from '../h'
diff --git a/src/test/jsx.tsx b/src/test/jsx.tsx
index 2e04817..b856a6f 100644
--- a/src/test/jsx.tsx
+++ b/src/test/jsx.tsx
@@ -1,4 +1,4 @@
-import * as assert from 'assert';
+import { assert } from 'chai';
 import { jsx } from '../jsx';
 
 describe('snabbdom', function () {
diff --git a/src/test/style.ts b/src/test/style.ts
index 58536ee..7038b02 100644
--- a/src/test/style.ts
+++ b/src/test/style.ts
@@ -1,4 +1,4 @@
-import assert from 'assert'
+import { assert } from 'chai'
 
 import { init } from '../snabbdom'
 import styleModule from '../modules/style'
diff --git a/src/test/thunk.ts b/src/test/thunk.ts
index 945fc3b..dbc0f12 100644
--- a/src/test/thunk.ts
+++ b/src/test/thunk.ts
@@ -1,4 +1,4 @@
-import assert from 'assert'
+import { assert } from 'chai'
 
 import { init } from '../snabbdom'
 import h from '../h'
@@ -18,9 +18,9 @@ describe('thunk', function () {
       return h('span', 'Number is ' + n);
     }
     var vnode = thunk('span', 'num', numberInSpan, [22]);
-    assert.deepStrictEqual(vnode.sel, 'span');
-    assert.deepStrictEqual(vnode.data.key, 'num');
-    assert.deepStrictEqual(vnode.data.args, [22]);
+    assert.deepEqual(vnode.sel, 'span');
+    assert.deepEqual(vnode.data.key, 'num');
+    assert.deepEqual(vnode.data.args, [22]);
   });
   it('calls render function once on data change', function () {
     var called = 0;