57 lines
1.6 KiB
TypeScript
57 lines
1.6 KiB
TypeScript
/**
|
|
* @license
|
|
* Copyright Google LLC All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by an MIT-style license that can be
|
|
* found in the LICENSE file at https://angular.io/license
|
|
*/
|
|
|
|
/**
|
|
* Jasmine matcher to verify that a function contains the provided code fragments.
|
|
*/
|
|
export function functionContaining(expectedFragments: Array<string|RegExp>):
|
|
jasmine.AsymmetricMatcher<Function> {
|
|
let _actual: Function|null = null;
|
|
|
|
const matches = (code: string, fragment: string|RegExp): boolean => {
|
|
if (typeof fragment === 'string') {
|
|
return code.includes(fragment);
|
|
} else {
|
|
return fragment.test(code);
|
|
}
|
|
};
|
|
|
|
return {
|
|
asymmetricMatch(actual: Function): boolean {
|
|
_actual = actual;
|
|
|
|
if (typeof actual !== 'function') {
|
|
return false;
|
|
}
|
|
const code = actual.toString();
|
|
for (const fragment of expectedFragments) {
|
|
if (!matches(code, fragment)) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
},
|
|
jasmineToString(): string {
|
|
if (typeof _actual !== 'function') {
|
|
return `Expected function to contain code fragments ${
|
|
jasmine.pp(expectedFragments)} but got ${jasmine.pp(_actual)}`;
|
|
}
|
|
const errors: string[] = [];
|
|
const code = _actual.toString();
|
|
errors.push(
|
|
`The actual function with code:\n${code}\n\ndid not contain the following fragments:`);
|
|
for (const fragment of expectedFragments) {
|
|
if (!matches(code, fragment)) {
|
|
errors.push(`- ${fragment}`);
|
|
}
|
|
}
|
|
return errors.join('\n');
|
|
}
|
|
};
|
|
}
|