|  | 
|  | 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