@ryusei/light
Version:
<div align="center"> <a href="https://light.ryuseijs.com"> <img alt="RyuseiLight" src="https://light.ryuseijs.com/images/svg/logo.svg" width="70"> </a>
59 lines (50 loc) • 1.9 kB
text/typescript
import { RyuseiLight } from '../../../src/js';
import { CATEGORY_SPACE } from '../../../src/js/constants/categories';
import { Token } from '../../../src/js/types';
/**
* The jest matcher to check if the code is tokenized to expected tokens or not.
*
* @since 0.0.12
*
* @param received - A received string.
* @param lang - A language name.
* @param expectedTokens - Expected tokens by an array.
* @param ignoreSpaces - Optional. Whether to ignore whitespaces or not. The default value is true.
* @param infoProperty - Optional. A info property name for the 3rd parameter. The default value is an empty string.
*/
export function toBeTokenized(
received: string,
lang: string,
expectedTokens: Token[],
ignoreSpaces = true,
infoProperty = ''
): jest.CustomMatcherResult {
if ( ! RyuseiLight.has( lang ) ) {
throw new Error( `Language ${ lang } has not been registered.` );
}
let tokens = RyuseiLight.tokenize( received.trim(), lang )
.reduce( ( accumulator, line ) => {
return accumulator.concat( line );
}, [] );
if ( ignoreSpaces ) {
tokens = tokens.filter( token => token[ 0 ] !== CATEGORY_SPACE );
}
if ( infoProperty ) {
tokens = tokens.map( token => [ token[ 0 ], token[ 1 ], token[ 2 ][ infoProperty ] ] );
} else {
tokens = tokens.map( token => [ token[ 0 ], token[ 1 ] ] );
}
const pass = expectedTokens.length === tokens.length && expectedTokens.every( ( token, index ) => {
return token.every( ( param, paramIndex ) => param === tokens[ index ][ paramIndex ] );
} );
const message = pass
? () => `The code was successfully tokenized to ${ this.utils.printReceived( expectedTokens ) }`
: () => `Tokenization failed:
Expect: ${ this.utils.printReceived( expectedTokens ) }
Actual: ${ this.utils.printExpected( tokens ) }
`;
return {
pass,
message,
}
}