Name: js-handler/node_modules/restify/node_modules/lru-cache/test/basic.js
| 1: | var test = require("tap").test |
| 2: | , LRU = require("../") |
| 3: | |
| 4: | test("basic", function (t) { |
| 5: | var cache = new LRU({max: 10}) |
| 6: | cache.set("key", "value") |
| 7: | t.equal(cache.get("key"), "value") |
| 8: | t.equal(cache.get("nada"), undefined) |
| 9: | t.equal(cache.length, 1) |
| 10: | t.equal(cache.max, 10) |
| 11: | t.end() |
| 12: | }) |
| 13: | |
| 14: | test("least recently set", function (t) { |
| 15: | var cache = new LRU(2) |
| 16: | cache.set("a", "A") |
| 17: | cache.set("b", "B") |
| 18: | cache.set("c", "C") |
| 19: | t.equal(cache.get("c"), "C") |
| 20: | t.equal(cache.get("b"), "B") |
| 21: | t.equal(cache.get("a"), undefined) |
| 22: | t.end() |
| 23: | }) |
| 24: | |
| 25: | test("lru recently gotten", function (t) { |
| 26: | var cache = new LRU(2) |
| 27: | cache.set("a", "A") |
| 28: | cache.set("b", "B") |
| 29: | cache.get("a") |
| 30: | cache.set("c", "C") |
| 31: | t.equal(cache.get("c"), "C") |
| 32: | t.equal(cache.get("b"), undefined) |
| 33: | t.equal(cache.get("a"), "A") |
| 34: | t.end() |
| 35: | }) |
| 36: | |
| 37: | test("del", function (t) { |
| 38: | var cache = new LRU(2) |
| 39: | cache.set("a", "A") |
| 40: | cache.del("a") |
| 41: | t.equal(cache.get("a"), undefined) |
| 42: | t.end() |
| 43: | }) |
| 44: | |
| 45: | test("max", function (t) { |
| 46: | var cache = new LRU(3) |
| 47: | |
| 48: | // test changing the max, verify that the LRU items get dropped. |
| 49: | cache.max = 100 |
| 50: | for (var i = 0; i < 100; i ++) cache.set(i, i) |
| 51: | t.equal(cache.length, 100) |
| 52: | for (var i = 0; i < 100; i ++) { |
| 53: | t.equal(cache.get(i), i) |
| 54: | } |
| 55: | cache.max = 3 |
| 56: | t.equal(cache.length, 3) |
| 57: | for (var i = 0; i < 97; i ++) { |
| 58: | t.equal(cache.get(i), undefined) |
| 59: | } |
| 60: | for (var i = 98; i < 100; i ++) { |
| 61: | t.equal(cache.get(i), i) |
| 62: | } |
| 63: | |
| 64: | // now remove the max restriction, and try again. |
| 65: | cache.max = "hello" |
| 66: | for (var i = 0; i < 100; i ++) cache.set(i, i) |
| 67: | t.equal(cache.length, 100) |
| 68: | for (var i = 0; i < 100; i ++) { |
| 69: | t.equal(cache.get(i), i) |
| 70: | } |
| 71: | // should trigger an immediate resize |
| 72: | cache.max = 3 |
| 73: | t.equal(cache.length, 3) |
| 74: | for (var i = 0; i < 97; i ++) { |
| 75: | t.equal(cache.get(i), undefined) |
| 76: | } |
| 77: | for (var i = 98; i < 100; i ++) { |
| 78: | t.equal(cache.get(i), i) |
| 79: | } |
| 80: | t.end() |
| 81: | }) |
| 82: | |
| 83: | test("reset", function (t) { |
| 84: | var cache = new LRU(10) |
| 85: | cache.set("a", "A") |
| 86: | cache.set("b", "B") |
| 87: | cache.reset() |
| 88: | t.equal(cache.length, 0) |
| 89: | t.equal(cache.max, 10) |
| 90: | t.equal(cache.get("a"), undefined) |
| 91: | t.equal(cache.get("b"), undefined) |
| 92: | t.end() |
| 93: | }) |
| 94: | |
| 95: | |
| 96: | // Note: `<cache>.dump()` is a debugging tool only. No guarantees are made |
| 97: | // about the format/layout of the response. |
| 98: | test("dump", function (t) { |
| 99: | var cache = new LRU(10) |
| 100: | var d = cache.dump(); |
| 101: | t.equal(Object.keys(d).length, 0, "nothing in dump for empty cache") |
| 102: | cache.set("a", "A") |
| 103: | var d = cache.dump() // { a: { key: "a", value: "A", lu: 0 } } |
| 104: | t.ok(d.a) |
| 105: | t.equal(d.a.key, "a") |
| 106: | t.equal(d.a.value, "A") |
| 107: | t.equal(d.a.lu, 0) |
| 108: | |
| 109: | cache.set("b", "B") |
| 110: | cache.get("b") |
| 111: | d = cache.dump() |
| 112: | t.ok(d.b) |
| 113: | t.equal(d.b.key, "b") |
| 114: | t.equal(d.b.value, "B") |
| 115: | t.equal(d.b.lu, 2) |
| 116: | |
| 117: | t.end() |
| 118: | }) |
| 119: | |
| 120: | |
| 121: | test("basic with weighed length", function (t) { |
| 122: | var cache = new LRU({ |
| 123: | max: 100, |
| 124: | length: function (item) { return item.size } |
| 125: | }) |
| 126: | cache.set("key", {val: "value", size: 50}) |
| 127: | t.equal(cache.get("key").val, "value") |
| 128: | t.equal(cache.get("nada"), undefined) |
| 129: | t.equal(cache.lengthCalculator(cache.get("key")), 50) |
| 130: | t.equal(cache.length, 50) |
| 131: | t.equal(cache.max, 100) |
| 132: | t.end() |
| 133: | }) |
| 134: | |
| 135: | |
| 136: | test("weighed length item too large", function (t) { |
| 137: | var cache = new LRU({ |
| 138: | max: 10, |
| 139: | length: function (item) { return item.size } |
| 140: | }) |
| 141: | t.equal(cache.max, 10) |
| 142: | |
| 143: | // should fall out immediately |
| 144: | cache.set("key", {val: "value", size: 50}) |
| 145: | |
| 146: | t.equal(cache.length, 0) |
| 147: | t.equal(cache.get("key"), undefined) |
| 148: | t.end() |
| 149: | }) |
| 150: | |
| 151: | test("least recently set with weighed length", function (t) { |
| 152: | var cache = new LRU({ |
| 153: | max:8, |
| 154: | length: function (item) { return item.length } |
| 155: | }) |
| 156: | cache.set("a", "A") |
| 157: | cache.set("b", "BB") |
| 158: | cache.set("c", "CCC") |
| 159: | cache.set("d", "DDDD") |
| 160: | t.equal(cache.get("d"), "DDDD") |
| 161: | t.equal(cache.get("c"), "CCC") |
| 162: | t.equal(cache.get("b"), undefined) |
| 163: | t.equal(cache.get("a"), undefined) |
| 164: | t.end() |
| 165: | }) |
| 166: | |
| 167: | test("lru recently gotten with weighed length", function (t) { |
| 168: | var cache = new LRU({ |
| 169: | max: 8, |
| 170: | length: function (item) { return item.length } |
| 171: | }) |
| 172: | cache.set("a", "A") |
| 173: | cache.set("b", "BB") |
| 174: | cache.set("c", "CCC") |
| 175: | cache.get("a") |
| 176: | cache.get("b") |
| 177: | cache.set("d", "DDDD") |
| 178: | t.equal(cache.get("c"), undefined) |
| 179: | t.equal(cache.get("d"), "DDDD") |
| 180: | t.equal(cache.get("b"), "BB") |
| 181: | t.equal(cache.get("a"), "A") |
| 182: | t.end() |
| 183: | }) |
| 184: | |
| 185: | test("set returns proper booleans", function(t) { |
| 186: | var cache = new LRU({ |
| 187: | max: 5, |
| 188: | length: function (item) { return item.length } |
| 189: | }) |
| 190: | |
| 191: | t.equal(cache.set("a", "A"), true) |
| 192: | |
| 193: | // should return false for max exceeded |
| 194: | t.equal(cache.set("b", "donuts"), false) |
| 195: | |
| 196: | t.equal(cache.set("b", "B"), true) |
| 197: | t.equal(cache.set("c", "CCCC"), true) |
| 198: | t.end() |
| 199: | }) |
| 200: | |
| 201: | test("drop the old items", function(t) { |
| 202: | var cache = new LRU({ |
| 203: | max: 5, |
| 204: | maxAge: 50 |
| 205: | }) |
| 206: | |
| 207: | cache.set("a", "A") |
| 208: | |
| 209: | setTimeout(function () { |
| 210: | cache.set("b", "b") |
| 211: | t.equal(cache.get("a"), "A") |
| 212: | }, 25) |
| 213: | |
| 214: | setTimeout(function () { |
| 215: | cache.set("c", "C") |
| 216: | // timed out |
| 217: | t.notOk(cache.get("a")) |
| 218: | }, 60) |
| 219: | |
| 220: | setTimeout(function () { |
| 221: | t.notOk(cache.get("b")) |
| 222: | t.equal(cache.get("c"), "C") |
| 223: | }, 90) |
| 224: | |
| 225: | setTimeout(function () { |
| 226: | t.notOk(cache.get("c")) |
| 227: | t.end() |
| 228: | }, 155) |
| 229: | }) |
| 230: | |
| 231: | test("disposal function", function(t) { |
| 232: | var disposed = false |
| 233: | var cache = new LRU({ |
| 234: | max: 1, |
| 235: | dispose: function (k, n) { |
| 236: | disposed = n |
| 237: | } |
| 238: | }) |
| 239: | |
| 240: | cache.set(1, 1) |
| 241: | cache.set(2, 2) |
| 242: | t.equal(disposed, 1) |
| 243: | cache.set(3, 3) |
| 244: | t.equal(disposed, 2) |
| 245: | cache.reset() |
| 246: | t.equal(disposed, 3) |
| 247: | t.end() |
| 248: | }) |
| 249: | |
| 250: | test("disposal function on too big of item", function(t) { |
| 251: | var disposed = false |
| 252: | var cache = new LRU({ |
| 253: | max: 1, |
| 254: | length: function (k) { |
| 255: | return k.length |
| 256: | }, |
| 257: | dispose: function (k, n) { |
| 258: | disposed = n |
| 259: | } |
| 260: | }) |
| 261: | var obj = [ 1, 2 ] |
| 262: | |
| 263: | t.equal(disposed, false) |
| 264: | cache.set("obj", obj) |
| 265: | t.equal(disposed, obj) |
| 266: | t.end() |
| 267: | }) |
| 268: | |
| 269: | test("has()", function(t) { |
| 270: | var cache = new LRU({ |
| 271: | max: 1, |
| 272: | maxAge: 10 |
| 273: | }) |
| 274: | |
| 275: | cache.set('foo', 'bar') |
| 276: | t.equal(cache.has('foo'), true) |
| 277: | cache.set('blu', 'baz') |
| 278: | t.equal(cache.has('foo'), false) |
| 279: | t.equal(cache.has('blu'), true) |
| 280: | setTimeout(function() { |
| 281: | t.equal(cache.has('blu'), false) |
| 282: | t.end() |
| 283: | }, 15) |
| 284: | }) |
| 285: | |
| 286: | test("stale", function(t) { |
| 287: | var cache = new LRU({ |
| 288: | maxAge: 10, |
| 289: | stale: true |
| 290: | }) |
| 291: | |
| 292: | cache.set('foo', 'bar') |
| 293: | t.equal(cache.get('foo'), 'bar') |
| 294: | t.equal(cache.has('foo'), true) |
| 295: | setTimeout(function() { |
| 296: | t.equal(cache.has('foo'), false) |
| 297: | t.equal(cache.get('foo'), 'bar') |
| 298: | t.equal(cache.get('foo'), undefined) |
| 299: | t.end() |
| 300: | }, 15) |
| 301: | }) |
| 302: | |
| 303: | test("lru update via set", function(t) { |
| 304: | var cache = LRU({ max: 2 }); |
| 305: | |
| 306: | cache.set('foo', 1); |
| 307: | cache.set('bar', 2); |
| 308: | cache.del('bar'); |
| 309: | cache.set('baz', 3); |
| 310: | cache.set('qux', 4); |
| 311: | |
| 312: | t.equal(cache.get('foo'), undefined) |
| 313: | t.equal(cache.get('bar'), undefined) |
| 314: | t.equal(cache.get('baz'), 3) |
| 315: | t.equal(cache.get('qux'), 4) |
| 316: | t.end() |
| 317: | }) |
| 318: | |
| 319: | test("least recently set w/ peek", function (t) { |
| 320: | var cache = new LRU(2) |
| 321: | cache.set("a", "A") |
| 322: | cache.set("b", "B") |
| 323: | t.equal(cache.peek("a"), "A") |
| 324: | cache.set("c", "C") |
| 325: | t.equal(cache.get("c"), "C") |
| 326: | t.equal(cache.get("b"), "B") |
| 327: | t.equal(cache.get("a"), undefined) |
| 328: | t.end() |
| 329: | }) |
