|
| 1 | +const { PriorityQueue } = require('../..'); |
| 2 | + |
| 3 | +describe('Priorty Queue (as MinHeap default)', () => { |
| 4 | + const num = 1; |
| 5 | + const obj = { a: 1, b: 2 }; |
| 6 | + let pq; |
| 7 | + |
| 8 | + describe('with default contructor', () => { |
| 9 | + beforeEach(() => { |
| 10 | + pq = new PriorityQueue(); |
| 11 | + }); |
| 12 | + |
| 13 | + describe('.enqueue', () => { |
| 14 | + it('should enqueue [priority, element]', () => { |
| 15 | + pq.enqueue([Infinity, 2]); |
| 16 | + pq.enqueue([0, 1]); |
| 17 | + pq.enqueue([100, { a: 1, b: 2 }]); |
| 18 | + expect(pq.size).toEqual(3); |
| 19 | + expect(pq.peek()).toEqual([0, 1]); |
| 20 | + }); |
| 21 | + }); |
| 22 | + |
| 23 | + describe('.dequeue', () => { |
| 24 | + it('should enqueue and dequeue elements on priority order', () => { |
| 25 | + pq.enqueue([100, obj]); |
| 26 | + pq.enqueue([Infinity, 2]); |
| 27 | + pq.enqueue([0, num]); |
| 28 | + |
| 29 | + expect(pq.dequeue()).toEqual([0, num]); |
| 30 | + expect(pq.size).toEqual(2); |
| 31 | + expect(pq.dequeue()).toEqual([100, obj]); |
| 32 | + expect(pq.dequeue()).toEqual([Infinity, 2]); |
| 33 | + expect(pq.size).toEqual(0); |
| 34 | + }); |
| 35 | + |
| 36 | + it('should handle case when priorty was forgotten', () => { |
| 37 | + expect(() => pq.enqueue({ a: 100 })).not.toThrow(); |
| 38 | + expect(() => pq.enqueue({ b: 200 })).toThrow(); |
| 39 | + }); |
| 40 | + }); |
| 41 | + }); |
| 42 | + |
| 43 | + describe('with default values', () => { |
| 44 | + it('should add values on creation', () => { |
| 45 | + pq = new PriorityQueue([[100, obj], [Infinity, 2], [0, num]]); |
| 46 | + expect(pq.size).toEqual(3); |
| 47 | + expect(pq.peek()).toEqual([0, num]); |
| 48 | + expect(pq.dequeue()).toEqual([0, num]); |
| 49 | + expect(pq.size).toEqual(2); |
| 50 | + }); |
| 51 | + }); |
| 52 | + |
| 53 | + describe('with custom comparator', () => { |
| 54 | + const alice = { name: 'Alice', grade: 80, assistance: 1 }; |
| 55 | + const bob = { name: 'Bob', grade: 93, assistance: 0.7 }; |
| 56 | + const ana = { name: 'Ana', grade: 98, assistance: 0.8 }; |
| 57 | + |
| 58 | + it('should become MaxPriortyQueue and compare objects', () => { |
| 59 | + pq = new PriorityQueue([], (a, b) => b.grade * b.assistance - a.grade * a.assistance); |
| 60 | + pq.enqueue(alice); |
| 61 | + pq.enqueue(ana); |
| 62 | + pq.enqueue(bob); |
| 63 | + expect(pq.size).toEqual(3); |
| 64 | + expect(pq.dequeue()).toEqual(alice); |
| 65 | + expect(pq.dequeue()).toEqual(ana); |
| 66 | + expect(pq.dequeue()).toEqual(bob); |
| 67 | + }); |
| 68 | + |
| 69 | + it('should handle errors', () => { |
| 70 | + pq = new PriorityQueue([], (a, b) => b.grade - a.grade); |
| 71 | + expect(() => pq.enqueue(alice)).not.toThrow(); |
| 72 | + expect(() => pq.enqueue({ name: 'Oops', error: 98 })).toThrow(); |
| 73 | + }); |
| 74 | + }); |
| 75 | +}); |
0 commit comments