74 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
		
		
			
		
	
	
			74 lines
		
	
	
		
			2.0 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
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Template string function that can be used to strip indentation from a given string literal. */
							 | 
						||
| 
								 | 
							
								export function dedent(strings: TemplateStringsArray, ...values: any[]) {
							 | 
						||
| 
								 | 
							
								  let joinedString = '';
							 | 
						||
| 
								 | 
							
								  for (let i = 0; i < values.length; i++) {
							 | 
						||
| 
								 | 
							
								    joinedString += `${strings[i]}${values[i]}`;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  joinedString += strings[strings.length - 1];
							 | 
						||
| 
								 | 
							
								  const lines = joinedString.split('\n');
							 | 
						||
| 
								 | 
							
								  while (isBlank(lines[0])) {
							 | 
						||
| 
								 | 
							
								    lines.shift();
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  while (isBlank(lines[lines.length - 1])) {
							 | 
						||
| 
								 | 
							
								    lines.pop();
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  let minWhitespacePrefix = lines.reduce(
							 | 
						||
| 
								 | 
							
								      (min, line) => Math.min(min, numOfWhiteSpaceLeadingChars(line)), Number.MAX_SAFE_INTEGER);
							 | 
						||
| 
								 | 
							
								  return lines.map((line) => line.substring(minWhitespacePrefix)).join('\n');
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * Tests to see if the line is blank.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * A blank line is such which contains only whitespace.
							 | 
						||
| 
								 | 
							
								 * @param text string to test for blank-ness.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								function isBlank(text: string): boolean {
							 | 
						||
| 
								 | 
							
								  return /^\s*$/.test(text);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * Returns number of whitespace leading characters.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param text
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								function numOfWhiteSpaceLeadingChars(text: string): number {
							 | 
						||
| 
								 | 
							
								  return text.match(/^\s*/)![0].length;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * Jasmine AsymmetricMatcher which can be used to assert `.debug` properties.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * ```
							 | 
						||
| 
								 | 
							
								 * expect(obj).toEqual({
							 | 
						||
| 
								 | 
							
								 *   create: debugMatch('someValue')
							 | 
						||
| 
								 | 
							
								 * })
							 | 
						||
| 
								 | 
							
								 * ```
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * In the above example it will assert that `obj.create.debug === 'someValue'`.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param expected Expected value.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								export function debugMatch<T>(expected: T): any {
							 | 
						||
| 
								 | 
							
								  const matcher = function() {};
							 | 
						||
| 
								 | 
							
								  let actual: any = null;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  matcher.asymmetricMatch = function(objectWithDebug: any) {
							 | 
						||
| 
								 | 
							
								    return jasmine.matchersUtil.equals(actual = objectWithDebug.debug, expected);
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								  matcher.jasmineToString = function() {
							 | 
						||
| 
								 | 
							
								    return `<${JSON.stringify(actual)} != ${JSON.stringify(expected)}>`;
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								  return matcher;
							 | 
						||
| 
								 | 
							
								}
							 |