MediumJavaScriptTypeScript

Implement expect.extend()

TestingJavaScriptUtilities

Jest lets you register custom matchers via expect.extend({ myMatcher }).

Implement solve(op, ...args) supporting:

OpArgsDescription
'extend'(name, fnBody)Register a custom matcher. fnBody is the source of a function (received, ...expected) that returns { pass, message }.
'match'(name, received, ...expected)Run the registered matcher. Returns its { pass, message }.
'list'Returns array of registered matcher names.
solve('extend', 'toBeEven', 'return { pass: received % 2 === 0, message: received + " is not even" }')
solve('match', 'toBeEven', 4)   // { pass: true, message: '4 is not even' }
solve('match', 'toBeEven', 3)   // { pass: false, message: '3 is not even' }
solve('list')                   // ['toBeEven']

If a matcher is not registered, return { pass: false, message: 'Unknown matcher: <name>' }.

Sample tests

Test #1extend registers a matcher (returns undefined → null)
Input: ["extend","toBeEven","return { pass: received % 2 === 0, message: received + \" is not even\" }"]
Output: null
Test #2even number passes toBeEven
Input: ["match","toBeEven",4]
Output: {"pass":true,"message":"4 is not even"}
Test #3odd number fails toBeEven
Input: ["match","toBeEven",3]
Output: {"pass":false,"message":"3 is not even"}
Test #4list returns registered matcher names
Input: ["list"]
Output: ["toBeEven"]