'use strict'; const common = require('../common'); const assert = require('assert'); // This test ensures that assert.CallTracker.calls() works as intended. const tracker = new assert.CallTracker(); function bar() {} const err = { code: 'ERR_INVALID_ARG_TYPE', }; // Ensures calls() throws on invalid input types. assert.throws(() => { const callsbar = tracker.calls(bar, '1'); callsbar(); }, err ); assert.throws(() => { const callsbar = tracker.calls(bar, 0.1); callsbar(); }, { code: 'ERR_OUT_OF_RANGE' } ); assert.throws(() => { const callsbar = tracker.calls(bar, true); callsbar(); }, err ); assert.throws(() => { const callsbar = tracker.calls(bar, () => {}); callsbar(); }, err ); assert.throws(() => { const callsbar = tracker.calls(bar, null); callsbar(); }, err ); // Expects an error as tracker.calls() cannot be called within a process exit // handler. process.on('exit', () => { assert.throws(() => tracker.calls(bar, 1), { code: 'ERR_UNAVAILABLE_DURING_EXIT', }); }); const msg = 'Expected to throw'; function func() { throw new Error(msg); } const callsfunc = tracker.calls(func, 1); // Expects callsfunc() to call func() which throws an error. assert.throws( () => callsfunc(), { message: msg } ); { const tracker = new assert.CallTracker(); const callsNoop = tracker.calls(1); callsNoop(); tracker.verify(); } { const tracker = new assert.CallTracker(); const callsNoop = tracker.calls(undefined, 1); callsNoop(); tracker.verify(); } { function func() {} const tracker = new assert.CallTracker(); const callsfunc = tracker.calls(func); assert.strictEqual(callsfunc.length, 0); } { function func(a, b, c = 2) {} const tracker = new assert.CallTracker(); const callsfunc = tracker.calls(func); assert.strictEqual(callsfunc.length, 2); } { function func(a, b, c = 2) {} delete func.length; const tracker = new assert.CallTracker(); const callsfunc = tracker.calls(func); assert.strictEqual(Object.hasOwn(callsfunc, 'length'), false); } { const ArrayIteratorPrototype = Reflect.getPrototypeOf( Array.prototype.values() ); const { next } = ArrayIteratorPrototype; ArrayIteratorPrototype.next = common.mustNotCall( '%ArrayIteratorPrototype%.next' ); Object.prototype.get = common.mustNotCall('%Object.prototype%.get'); const customPropertyValue = Symbol(); function func(a, b, c = 2) { return a + b + c; } func.customProperty = customPropertyValue; Object.defineProperty(func, 'length', { get: common.mustNotCall() }); const tracker = new assert.CallTracker(); const callsfunc = tracker.calls(func); assert.strictEqual(Object.hasOwn(callsfunc, 'length'), true); assert.strictEqual(callsfunc.customProperty, customPropertyValue); assert.strictEqual(callsfunc(1, 2, 3), 6); ArrayIteratorPrototype.next = next; delete Object.prototype.get; }