Skip to content

Commit 84b3922

Browse files
Jake ChampionJakeChampion
authored andcommitted
refactor: extract out the assertion helpers into a module for re-use across the test applications
1 parent f37920d commit 84b3922

File tree

9 files changed

+141
-940
lines changed

9 files changed

+141
-940
lines changed
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
// Testing/Assertion functions //
2+
3+
export function pass(message = '') {
4+
return new Response(message)
5+
}
6+
7+
export function fail(message = '') {
8+
return new Response(message, { status: 500 })
9+
}
10+
11+
export function assert(actual, expected, code) {
12+
if (!deepEqual(actual, expected)) {
13+
return fail(`Expected \`${code}\` to equal \`${JSON.stringify(expected)}\` - Found \`${JSON.stringify(actual)}\``)
14+
}
15+
}
16+
17+
export async function assertResolves(func) {
18+
try {
19+
await func()
20+
} catch (error) {
21+
return fail(`Expected \`${func.toString()}\` to resolve - Found it rejected: ${error.name}: ${error.message}`)
22+
}
23+
}
24+
25+
export async function assertRejects(func, errorClass, errorMessage) {
26+
try {
27+
await func()
28+
return fail(`Expected \`${func.toString()}\` to reject - Found it did not reject`)
29+
} catch (error) {
30+
if (errorClass) {
31+
if ((error instanceof errorClass) === false) {
32+
return fail(`Expected \`${func.toString()}\` to reject instance of \`${errorClass.name}\` - Found instance of \`${error.name}\``)
33+
}
34+
}
35+
36+
if (errorMessage) {
37+
if (error.message !== errorMessage) {
38+
return fail(`Expected \`${func.toString()}\` to reject error message of \`${errorMessage}\` - Found \`${error.message}\``)
39+
}
40+
}
41+
}
42+
}
43+
44+
45+
export function assertThrows(func, errorClass, errorMessage) {
46+
try {
47+
func()
48+
return fail(`Expected \`${func.toString()}\` to throw - Found it did not throw`)
49+
} catch (error) {
50+
if (errorClass) {
51+
if ((error instanceof errorClass) === false) {
52+
return fail(`Expected \`${func.toString()}\` to throw instance of \`${errorClass.name}\` - Found instance of \`${error.name}\``)
53+
}
54+
}
55+
56+
if (errorMessage) {
57+
if (error.message !== errorMessage) {
58+
return fail(`Expected \`${func.toString()}\` to throw error message of \`${errorMessage}\` - Found \`${error.message}\``)
59+
}
60+
}
61+
}
62+
}
63+
64+
export function assertDoesNotThrow(func) {
65+
try {
66+
func()
67+
} catch (error) {
68+
return fail(`Expected \`${func.toString()}\` to not throw - Found it did throw: ${error.name}: ${error.message}`)
69+
}
70+
}
71+
72+
export function deepEqual(a, b) {
73+
var aKeys;
74+
var bKeys;
75+
var typeA;
76+
var typeB;
77+
var key;
78+
var i;
79+
80+
typeA = typeof a;
81+
typeB = typeof b;
82+
if (a === null || typeA !== 'object') {
83+
if (b === null || typeB !== 'object') {
84+
return a === b;
85+
}
86+
return false;
87+
}
88+
// Case: `a` is of type 'object'
89+
if (typeB !== 'object') {
90+
return false;
91+
}
92+
if (Object.getPrototypeOf(a) !== Object.getPrototypeOf(b)) {
93+
return false;
94+
}
95+
if (a instanceof Date) {
96+
return a.getTime() === b.getTime();
97+
}
98+
if (a instanceof RegExp) {
99+
return a.source === b.source && a.flags === b.flags;
100+
}
101+
if (a instanceof Error) {
102+
if (a.message !== b.message || a.name !== b.name) {
103+
return false;
104+
}
105+
}
106+
107+
aKeys = Object.keys(a);
108+
bKeys = Object.keys(b);
109+
if (aKeys.length !== bKeys.length) {
110+
return false;
111+
}
112+
aKeys.sort();
113+
bKeys.sort();
114+
115+
// Cheap key test:
116+
for (i = 0; i < aKeys.length; i++) {
117+
if (aKeys[i] !== bKeys[i]) {
118+
return false;
119+
}
120+
}
121+
// Possibly expensive deep equality test for each corresponding key:
122+
for (i = 0; i < aKeys.length; i++) {
123+
key = aKeys[i];
124+
if (!deepEqual(a[key], b[key])) {
125+
return false;
126+
}
127+
}
128+
return typeA === typeB;
129+
}

integration-tests/js-compute/fixtures/btoa/bin/index.js

Lines changed: 1 addition & 131 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
/* eslint-env serviceworker */
22
/// <reference path="../../../../../types/index.d.ts" />
3+
import { pass, fail, assert, assertThrows } from "../../../assertions.js";
34

45
addEventListener("fetch", () => {
56
try {
@@ -752,134 +753,3 @@ addEventListener("fetch", () => {
752753
return fail(error.message)
753754
}
754755
});
755-
756-
757-
// Testing/Assertion functions //
758-
759-
function pass(message = '') {
760-
return new Response(message)
761-
}
762-
763-
function fail(message = '') {
764-
return new Response(message, { status: 500 })
765-
}
766-
767-
function assert(actual, expected, code) {
768-
if (!deepEqual(actual, expected)) {
769-
return fail(`Expected \`${code}\` to equal \`${JSON.stringify(expected)}\` - Found \`${JSON.stringify(actual)}\``)
770-
}
771-
}
772-
773-
function assertThrows(func, errorClass, errorMessage) {
774-
try {
775-
func()
776-
return fail(`Expected \`${func.toString()}\` to throw - Found it did not throw`)
777-
} catch (error) {
778-
if (errorClass) {
779-
if ((error instanceof errorClass) === false) {
780-
return fail(`Expected \`${func.toString()}\` to throw instance of \`${errorClass.name}\` - Found instance of \`${error.name}\``)
781-
}
782-
}
783-
784-
if (errorMessage) {
785-
if (error.message !== errorMessage) {
786-
return fail(`Expected \`${func.toString()}\` to throw error message of \`${errorMessage}\` - Found \`${error.message}\``)
787-
}
788-
}
789-
}
790-
}
791-
792-
// eslint-disable-next-line no-unused-vars
793-
function assertDoesNotThrow(func) {
794-
try {
795-
func()
796-
} catch (error) {
797-
return fail(`Expected \`${func.toString()}\` to not throw - Found it did throw: ${error.name}: ${error.message}`)
798-
}
799-
}
800-
801-
/**
802-
* Tests for deep equality between two values.
803-
*
804-
* @param {*} a - first comparison value
805-
* @param {*} b - second comparison value
806-
* @returns {boolean} boolean indicating if `a` is deep equal to `b`
807-
*
808-
* @example
809-
* var bool = deepEqual( [ 1, 2, 3 ], [ 1, 2, 3 ] );
810-
* // returns true
811-
*
812-
* @example
813-
* var bool = deepEqual( [ 1, 2, 3 ], [ 1, 2, '3' ] );
814-
* // returns false
815-
*
816-
* @example
817-
* var bool = deepEqual( { 'a': 2 }, { 'a': [ 2 ] } );
818-
* // returns false
819-
*
820-
* @example
821-
* var bool = deepEqual( [], {} );
822-
* // returns false
823-
*
824-
* @example
825-
* var bool = deepEqual( null, null );
826-
* // returns true
827-
*/
828-
function deepEqual(a, b) {
829-
var aKeys;
830-
var bKeys;
831-
var typeA;
832-
var typeB;
833-
var key;
834-
var i;
835-
836-
typeA = typeof a;
837-
typeB = typeof b;
838-
if (a === null || typeA !== 'object') {
839-
if (b === null || typeB !== 'object') {
840-
return a === b;
841-
}
842-
return false;
843-
}
844-
// Case: `a` is of type 'object'
845-
if (typeB !== 'object') {
846-
return false;
847-
}
848-
if (Object.getPrototypeOf(a) !== Object.getPrototypeOf(b)) {
849-
return false;
850-
}
851-
if (a instanceof Date) {
852-
return a.getTime() === b.getTime();
853-
}
854-
if (a instanceof RegExp) {
855-
return a.source === b.source && a.flags === b.flags;
856-
}
857-
if (a instanceof Error) {
858-
if (a.message !== b.message || a.name !== b.name) {
859-
return false;
860-
}
861-
}
862-
863-
aKeys = Object.keys(a);
864-
bKeys = Object.keys(b);
865-
if (aKeys.length !== bKeys.length) {
866-
return false;
867-
}
868-
aKeys.sort();
869-
bKeys.sort();
870-
871-
// Cheap key test:
872-
for (i = 0; i < aKeys.length; i++) {
873-
if (aKeys[i] !== bKeys[i]) {
874-
return false;
875-
}
876-
}
877-
// Possibly expensive deep equality test for each corresponding key:
878-
for (i = 0; i < aKeys.length; i++) {
879-
key = aKeys[i];
880-
if (!deepEqual(a[key], b[key])) {
881-
return false;
882-
}
883-
}
884-
return typeA === typeB;
885-
}

0 commit comments

Comments
 (0)