97 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			97 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| var test = require("tap").test;
 | |
| var Heap = require('./binaryheap');
 | |
| 
 | |
| test("check order", function (t) {
 | |
|   var input = [5, 8, 3, 2, 7, 4, 14];
 | |
|   var output = [2, 3, 4, 5, 7, 8, 14];
 | |
| 
 | |
|   var heap = new Heap(true);
 | |
|   input.forEach(function (i) {
 | |
|     heap.insert({key: i}, i);
 | |
|   });
 | |
| 
 | |
|   console.log('foo');
 | |
| 
 | |
|   t.equal(heap.length, input.length, "heap size matches input");
 | |
| 
 | |
|   var o = [];
 | |
| 
 | |
|   for (var i = 0; i < input.length; i++)
 | |
|     o.push(heap.pop().key)
 | |
| 
 | |
|   t.equal(o.length, output.length, "heap sorted length matches");
 | |
|   t.equivalent(o, output, "heap sorted matches expected output");
 | |
| 
 | |
|   heap = new Heap(false);
 | |
|   output.reverse();
 | |
| 
 | |
|   input.forEach(function (i) {
 | |
|     heap.insert({key: i}, i);
 | |
|   });
 | |
| 
 | |
|   t.equal(heap.length, input.length, "heap size matches input");
 | |
| 
 | |
|   var o = [];
 | |
| 
 | |
|   for (var i = 0; i < input.length; i++)
 | |
|     o.push(heap.pop().key)
 | |
| 
 | |
|   t.equal(o.length, output.length, "heap sorted length matches");
 | |
|   t.equivalent(o, output, "heap sorted matches expected output");
 | |
| 
 | |
|   t.end();
 | |
| });
 | |
| 
 | |
| var tree_count = 9;
 | |
| 
 | |
| function getDot() {
 | |
|   var tree = require('fs').createWriteStream('tree.'+ ++tree_count + '.dot');
 | |
|   return tree;
 | |
| };
 | |
| 
 | |
| function printHeap(heap) {
 | |
|   //rm -f *.dot *.gif && node test && for i in $(ls tree.*.dot); do dot -Tgif $i -o $(basename $i .dot).gif; done && gifsicle --delay=100 --loop *.gif > anim.gif
 | |
|   //var ds = getDot();
 | |
|   //heap.print(ds);
 | |
|   //ds.end();
 | |
| };
 | |
| 
 | |
| 
 | |
| test("remove arbitrary elements", function (t) {
 | |
|   var heap = new Heap();
 | |
| 
 | |
|   var elems = {
 | |
|     a: { key: 5 },
 | |
|     b: { key: 7 },
 | |
|     c: { key: 3 },
 | |
|     d: { key: 14 },
 | |
|     e: { key: 8 },
 | |
|     f: { key: 30 },
 | |
|     g: { key: 23 },
 | |
|     h: { key: 1 },
 | |
|   };
 | |
| 
 | |
|   Object.keys(elems).forEach(function (key) {
 | |
|     heap.insert(elems[key], elems[key].key);
 | |
|     printHeap(heap);
 | |
|   });
 | |
| 
 | |
|   heap.remove(elems.e);
 | |
|   printHeap(heap);
 | |
| 
 | |
|   t.equal(heap.length, heap.count(heap.root), "length and count should match");
 | |
|   t.equal(heap.length, Object.keys(elems).length - 1, "should only remove one ndoe");
 | |
|   printHeap(heap);
 | |
| 
 | |
|   heap.remove(elems.a);
 | |
|   t.equal(heap.length, heap.count(heap.root), "length and count should match");
 | |
|   printHeap(heap);
 | |
| 
 | |
| 
 | |
|   heap.remove(elems.b);
 | |
|   t.equal(heap.length, heap.count(heap.root), "length and count should match");
 | |
|   printHeap(heap);
 | |
| 
 | |
|   t.end();
 | |
| });
 |