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');
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								}
							 |