lib: update isDeepStrictEqual to support options · nodejs/node@fed1dac
@@ -478,3 +478,163 @@ test('Assert class non strict with simple diff', () => {
478478);
479479}
480480});
481+482+// Shared setup for skipPrototype tests
483+{
484+const message = 'Expected values to be strictly deep-equal:\n' +
485+'+ actual - expected\n' +
486+'\n' +
487+' [\n' +
488+' 1,\n' +
489+' 2,\n' +
490+' 3,\n' +
491+' 4,\n' +
492+' 5,\n' +
493+'+ 6,\n' +
494+'- 9,\n' +
495+' 7\n' +
496+' ]\n';
497+498+function CoolClass(name) { this.name = name; }
499+500+function AwesomeClass(name) { this.name = name; }
501+502+class Modern { constructor(value) { this.value = value; } }
503+class Legacy { constructor(value) { this.value = value; } }
504+505+const cool = new CoolClass('Assert is inspiring');
506+const awesome = new AwesomeClass('Assert is inspiring');
507+const modern = new Modern(42);
508+const legacy = new Legacy(42);
509+510+test('Assert class strict with skipPrototype', () => {
511+const assertInstance = new Assert({ skipPrototype: true });
512+513+assert.throws(
514+() => assertInstance.deepEqual([1, 2, 3, 4, 5, 6, 7], [1, 2, 3, 4, 5, 9, 7]),
515+{ message }
516+);
517+518+assertInstance.deepEqual(cool, awesome);
519+assertInstance.deepStrictEqual(cool, awesome);
520+assertInstance.deepEqual(modern, legacy);
521+assertInstance.deepStrictEqual(modern, legacy);
522+523+const cool2 = new CoolClass('Soooo coooool');
524+assert.throws(
525+() => assertInstance.deepStrictEqual(cool, cool2),
526+{ code: 'ERR_ASSERTION' }
527+);
528+529+const nested1 = { obj: new CoolClass('test'), arr: [1, 2, 3] };
530+const nested2 = { obj: new AwesomeClass('test'), arr: [1, 2, 3] };
531+assertInstance.deepStrictEqual(nested1, nested2);
532+533+const arr = new Uint8Array([1, 2, 3]);
534+const buf = Buffer.from([1, 2, 3]);
535+assertInstance.deepStrictEqual(arr, buf);
536+});
537+538+test('Assert class non strict with skipPrototype', () => {
539+const assertInstance = new Assert({ strict: false, skipPrototype: true });
540+541+assert.throws(
542+() => assertInstance.deepStrictEqual([1, 2, 3, 4, 5, 6, 7], [1, 2, 3, 4, 5, 9, 7]),
543+{ message }
544+);
545+546+assertInstance.deepStrictEqual(cool, awesome);
547+assertInstance.deepStrictEqual(modern, legacy);
548+});
549+550+test('Assert class skipPrototype with complex objects', () => {
551+const assertInstance = new Assert({ skipPrototype: true });
552+553+function ComplexAwesomeClass(name, age) {
554+this.name = name;
555+this.age = age;
556+this.settings = {
557+theme: 'dark',
558+lang: 'en'
559+};
560+}
561+562+function ComplexCoolClass(name, age) {
563+this.name = name;
564+this.age = age;
565+this.settings = {
566+theme: 'dark',
567+lang: 'en'
568+};
569+}
570+571+const awesome1 = new ComplexAwesomeClass('Foo', 30);
572+const cool1 = new ComplexCoolClass('Foo', 30);
573+574+assertInstance.deepStrictEqual(awesome1, cool1);
575+576+const cool2 = new ComplexCoolClass('Foo', 30);
577+cool2.settings.theme = 'light';
578+579+assert.throws(
580+() => assertInstance.deepStrictEqual(awesome1, cool2),
581+{ code: 'ERR_ASSERTION' }
582+);
583+});
584+585+test('Assert class skipPrototype with arrays and special objects', () => {
586+const assertInstance = new Assert({ skipPrototype: true });
587+588+const arr1 = [1, 2, 3];
589+const arr2 = new Array(1, 2, 3);
590+assertInstance.deepStrictEqual(arr1, arr2);
591+592+const date1 = new Date('2023-01-01');
593+const date2 = new Date('2023-01-01');
594+assertInstance.deepStrictEqual(date1, date2);
595+596+const regex1 = /test/g;
597+const regex2 = new RegExp('test', 'g');
598+assertInstance.deepStrictEqual(regex1, regex2);
599+600+const date3 = new Date('2023-01-02');
601+assert.throws(
602+() => assertInstance.deepStrictEqual(date1, date3),
603+{ code: 'ERR_ASSERTION' }
604+);
605+});
606+607+test('Assert class skipPrototype with notDeepStrictEqual', () => {
608+const assertInstance = new Assert({ skipPrototype: true });
609+610+assert.throws(
611+() => assertInstance.notDeepStrictEqual(cool, awesome),
612+{ code: 'ERR_ASSERTION' }
613+);
614+615+const notAwesome = new AwesomeClass('Not so awesome');
616+assertInstance.notDeepStrictEqual(cool, notAwesome);
617+618+const defaultAssertInstance = new Assert({ skipPrototype: false });
619+defaultAssertInstance.notDeepStrictEqual(cool, awesome);
620+});
621+622+test('Assert class skipPrototype with mixed types', () => {
623+const assertInstance = new Assert({ skipPrototype: true });
624+625+const obj1 = { value: 42, nested: { prop: 'test' } };
626+627+function CustomObj(value, nested) {
628+this.value = value;
629+this.nested = nested;
630+}
631+632+const obj2 = new CustomObj(42, { prop: 'test' });
633+assertInstance.deepStrictEqual(obj1, obj2);
634+635+assert.throws(
636+() => assertInstance.deepStrictEqual({ num: 42 }, { num: '42' }),
637+{ code: 'ERR_ASSERTION' }
638+);
639+});
640+}