|
| 1 | +/// <reference types="@types/jest" /> |
| 2 | + |
| 3 | +import { FakeMediaStreamTrack } from 'fake-mediastreamtrack'; |
| 4 | + |
| 5 | +import { deepEqual } from '../../src/lib/deepEqual'; |
| 6 | + |
| 7 | +describe('deepEqual', () => { |
| 8 | + describe('Primitives and simple types', () => { |
| 9 | + it.each` |
| 10 | + a | b | expected |
| 11 | + ${1} | ${1} | ${true} |
| 12 | + ${'string'} | ${'string'} | ${true} |
| 13 | + ${'a'} | ${'b'} | ${false} |
| 14 | + ${null} | ${null} | ${true} |
| 15 | + ${undefined} | ${undefined} | ${true} |
| 16 | + ${42} | ${'42'} | ${false} |
| 17 | + `('returns $expected for a: $a and b: $b', ({ a, b, expected }) => { |
| 18 | + expect(deepEqual(a, b)).toBe(expected); |
| 19 | + }); |
| 20 | + }); |
| 21 | + |
| 22 | + describe('Arrays', () => { |
| 23 | + it.each` |
| 24 | + a | b | expected |
| 25 | + ${[1, 2, 3]} | ${[1, 2, 3]} | ${true} |
| 26 | + ${[1, 2, 3]} | ${[3, 2, 1]} | ${false} |
| 27 | + ${[1, [2, 3]]} | ${[1, [2, 3]]} | ${true} |
| 28 | + ${[1, [2, 3]]} | ${[1, 2, 3]} | ${false} |
| 29 | + ${[]} | ${[]} | ${true} |
| 30 | + `('returns $expected for a: $a and b: $b', ({ a, b, expected }) => { |
| 31 | + expect(deepEqual(a, b)).toBe(expected); |
| 32 | + }); |
| 33 | + }); |
| 34 | + |
| 35 | + describe('Objects', () => { |
| 36 | + it.each` |
| 37 | + a | b | expected |
| 38 | + ${{ key: 'value' }} | ${{ key: 'value' }} | ${true} |
| 39 | + ${{ key: 'value' }} | ${{ key: 'different' }} | ${false} |
| 40 | + ${{ key1: 'value', key2: { nestedKey: 'nestedValue' } }} | ${{ key1: 'value', key2: { nestedKey: 'nestedValue' } }} | ${true} |
| 41 | + ${{ key1: 'value' }} | ${{ key2: 'value' }} | ${false} |
| 42 | + ${{}} | ${{}} | ${true} |
| 43 | + `('returns $expected for a: $a and b: $b', ({ a, b, expected }) => { |
| 44 | + expect(deepEqual(a, b)).toBe(expected); |
| 45 | + }); |
| 46 | + }); |
| 47 | + |
| 48 | + describe('MediaStream', () => { |
| 49 | + const streamA = new MediaStream(); |
| 50 | + afterEach(() => { |
| 51 | + streamA.getTracks().forEach((track) => { |
| 52 | + streamA.removeTrack(track); |
| 53 | + track.stop(); |
| 54 | + }); |
| 55 | + }); |
| 56 | + it('returns true when streams are equal', () => { |
| 57 | + expect(deepEqual(streamA, streamA)).toBe(true); |
| 58 | + }); |
| 59 | + it('returns true when equal stream has the same tracks', () => { |
| 60 | + const track = new FakeMediaStreamTrack({ kind: 'audio' }); |
| 61 | + streamA.addTrack(track); |
| 62 | + expect(deepEqual(streamA, streamA)).toBe(true); |
| 63 | + }); |
| 64 | + it('returns false when streams are not equal', () => { |
| 65 | + const streamB = new MediaStream(); |
| 66 | + expect(deepEqual(streamA, streamB)).toBe(false); |
| 67 | + }); |
| 68 | + it('returns false when amount of tracks differs', () => { |
| 69 | + const track = new FakeMediaStreamTrack({ kind: 'audio' }); |
| 70 | + // @ts-ignore |
| 71 | + const streamC = new MediaStream([], streamA.id); |
| 72 | + streamA.addTrack(track); |
| 73 | + expect(deepEqual(streamA, streamC)).toBe(false); |
| 74 | + }); |
| 75 | + it('returns false when track id differs', () => { |
| 76 | + const track1 = new FakeMediaStreamTrack({ kind: 'audio' }); |
| 77 | + const track2 = new FakeMediaStreamTrack({ kind: 'audio' }); |
| 78 | + // Uses mock from jest-setup.ts, but TypeScript still thinks this is a valid MediaStream |
| 79 | + // @ts-ignore |
| 80 | + const streamC = new MediaStream([], streamA.id); |
| 81 | + streamA.addTrack(track1); |
| 82 | + streamC.addTrack(track2); |
| 83 | + expect(deepEqual(streamA, streamC)).toBe(false); |
| 84 | + }); |
| 85 | + }); |
| 86 | + |
| 87 | + describe('MediaStreamTracks', () => { |
| 88 | + it.each` |
| 89 | + a | b | expected |
| 90 | + ${new FakeMediaStreamTrack({ id: '1', kind: 'audio', readyState: 'live' })} | ${new FakeMediaStreamTrack({ id: '1', kind: 'audio', readyState: 'live' })} | ${true} |
| 91 | + ${new FakeMediaStreamTrack({ id: '1', kind: 'audio', readyState: 'live' })} | ${new FakeMediaStreamTrack({ id: '2', kind: 'audio', readyState: 'live' })} | ${false} |
| 92 | + ${new FakeMediaStreamTrack({ id: '1', kind: 'audio', readyState: 'live' })} | ${new FakeMediaStreamTrack({ id: '1', kind: 'video', readyState: 'live' })} | ${false} |
| 93 | + ${new FakeMediaStreamTrack({ id: '1', kind: 'audio', readyState: 'live' })} | ${new FakeMediaStreamTrack({ id: '1', kind: 'audio', readyState: 'ended' })} | ${false} |
| 94 | + `('returns $expected for a: $a and b: $b', ({ a, b, expected }) => { |
| 95 | + expect(deepEqual(a, b)).toBe(expected); |
| 96 | + }); |
| 97 | + }); |
| 98 | + |
| 99 | + describe('Date objects', () => { |
| 100 | + it.each` |
| 101 | + a | b | expected |
| 102 | + ${new Date('2023-01-01')} | ${new Date('2023-01-01')} | ${true} |
| 103 | + ${new Date('2023-01-01')} | ${new Date('2022-01-01')} | ${false} |
| 104 | + ${new Date('2023-01-01')} | ${'2023-01-01'} | ${false} |
| 105 | + `('returns $expected for a: $a and b: $b', ({ a, b, expected }) => { |
| 106 | + expect(deepEqual(a, b)).toBe(expected); |
| 107 | + }); |
| 108 | + }); |
| 109 | + |
| 110 | + describe('RegExp objects', () => { |
| 111 | + it.each` |
| 112 | + a | b | expected |
| 113 | + ${/test/gi} | ${/test/gi} | ${true} |
| 114 | + ${/test/g} | ${/test/gi} | ${false} |
| 115 | + ${/test/g} | ${'/test/g'} | ${false} |
| 116 | + `('returns $expected for a: $a and b: $b', ({ a, b, expected }) => { |
| 117 | + expect(deepEqual(a, b)).toBe(expected); |
| 118 | + }); |
| 119 | + }); |
| 120 | + |
| 121 | + describe('Functions', () => { |
| 122 | + const funcA = () => 'test'; |
| 123 | + const funcB = () => 'test'; |
| 124 | + it.each` |
| 125 | + a | b | expected |
| 126 | + ${funcA} | ${funcA} | ${true} |
| 127 | + ${funcA} | ${funcB} | ${false} |
| 128 | + `('returns $expected for a: $a and b: $b', ({ a, b, expected }) => { |
| 129 | + expect(deepEqual(a, b)).toBe(expected); |
| 130 | + }); |
| 131 | + }); |
| 132 | + |
| 133 | + describe('Complex nested objects', () => { |
| 134 | + const complexObjA = { |
| 135 | + string: 'value', |
| 136 | + number: 42, |
| 137 | + bool: false, |
| 138 | + date: new Date('2023-01-01'), |
| 139 | + regex: /test/g, |
| 140 | + array: [1, { key: 'nested' }, [2, 3]], |
| 141 | + func: () => 'test', |
| 142 | + }; |
| 143 | + |
| 144 | + const complexObjB = { |
| 145 | + ...complexObjA, |
| 146 | + array: [1, { key: 'nested' }, [2, 3]], // Identical but different reference |
| 147 | + }; |
| 148 | + |
| 149 | + const complexObjC = { |
| 150 | + ...complexObjA, |
| 151 | + string: 'different', |
| 152 | + }; |
| 153 | + |
| 154 | + it.each` |
| 155 | + a | b | expected |
| 156 | + ${complexObjA} | ${complexObjB} | ${true} |
| 157 | + ${complexObjA} | ${complexObjC} | ${false} |
| 158 | + `('returns $expected for a: $a and b: $b', ({ a, b, expected }) => { |
| 159 | + expect(deepEqual(a, b)).toBe(expected); |
| 160 | + }); |
| 161 | + }); |
| 162 | +}); |
0 commit comments