| OLD | NEW | 
|    1 /* |    1 /* | 
|    2  * This file is part of Adblock Plus <https://adblockplus.org/>, |    2  * This file is part of Adblock Plus <https://adblockplus.org/>, | 
|    3  * Copyright (C) 2006-present eyeo GmbH |    3  * Copyright (C) 2006-present eyeo GmbH | 
|    4  * |    4  * | 
|    5  * Adblock Plus is free software: you can redistribute it and/or modify |    5  * Adblock Plus is free software: you can redistribute it and/or modify | 
|    6  * it under the terms of the GNU General Public License version 3 as |    6  * it under the terms of the GNU General Public License version 3 as | 
|    7  * published by the Free Software Foundation. |    7  * published by the Free Software Foundation. | 
|    8  * |    8  * | 
|    9  * Adblock Plus is distributed in the hope that it will be useful, |    9  * Adblock Plus is distributed in the hope that it will be useful, | 
|   10  * but WITHOUT ANY WARRANTY; without even the implied warranty of |   10  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|   11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the |   11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
|   12  * GNU General Public License for more details. |   12  * GNU General Public License for more details. | 
|   13  * |   13  * | 
|   14  * You should have received a copy of the GNU General Public License |   14  * You should have received a copy of the GNU General Public License | 
|   15  * along with Adblock Plus.  If not, see <http://www.gnu.org/licenses/>. |   15  * along with Adblock Plus.  If not, see <http://www.gnu.org/licenses/>. | 
|   16  */ |   16  */ | 
|   17  |   17  | 
|   18 "use strict"; |   18 "use strict"; | 
|   19  |   19  | 
 |   20 const assert = require("assert"); | 
|   20 const {createSandbox} = require("./_common"); |   21 const {createSandbox} = require("./_common"); | 
|   21  |   22  | 
|   22 let Cache = null; |   23 let Cache = null; | 
|   23  |   24  | 
|   24 exports.setUp = function(callback) |   25 describe("Caching", () => | 
|   25 { |   26 { | 
|   26   let sandboxedRequire = createSandbox(); |   27   beforeEach(() => | 
|   27   ( |   28   { | 
|   28     {Cache} = sandboxedRequire("../lib/caching") |   29     let sandboxedRequire = createSandbox(); | 
|   29   ); |   30     ( | 
 |   31       {Cache} = sandboxedRequire("../lib/caching") | 
 |   32     ); | 
 |   33   }); | 
|   30  |   34  | 
|   31   callback(); |   35   it("Cache", () => | 
|   32 }; |   36   { | 
 |   37     // A capacity must be specificed and it must be coercable to a positive | 
 |   38     // number greater than or equal to one. | 
 |   39     assert.throws(() => { new Cache(); }, | 
 |   40                   "capacity must be a positive number."); | 
 |   41     assert.throws(() => { new Cache(0); }, | 
 |   42                   "capacity must be a positive number."); | 
 |   43     assert.throws(() => { new Cache(-1); }, | 
 |   44                   "capacity must be a positive number."); | 
 |   45     assert.throws(() => { new Cache(0.1); }, | 
 |   46                   "capacity must be a positive number."); | 
 |   47     assert.throws(() => { new Cache(Number.MIN_VALUE); }, | 
 |   48                 "capacity must be a positive number."); | 
 |   49     assert.throws(() => { new Cache(-Infinity); }, | 
 |   50                 "capacity must be a positive number."); | 
 |   51     assert.throws(() => { new Cache("ten"); }, | 
 |   52                 "capacity must be a positive number."); | 
 |   53     assert.doesNotThrow(() => { new Cache(1); }, | 
 |   54                       "capacity must be a positive number."); | 
 |   55     assert.doesNotThrow(() => { new Cache(1.1); }, | 
 |   56                       "capacity must be a positive number."); | 
 |   57     assert.doesNotThrow(() => { new Cache(10); }, | 
 |   58                       "capacity must be a positive number."); | 
 |   59     assert.doesNotThrow(() => { new Cache(Number.MAX_VALUE); }, | 
 |   60                       "capacity must be a positive number."); | 
 |   61     assert.doesNotThrow(() => { new Cache(Infinity); }, | 
 |   62                       "capacity must be a positive number."); | 
 |   63     assert.doesNotThrow(() => { new Cache("10"); }, | 
 |   64                       "capacity must be a positive number."); | 
|   33  |   65  | 
|   34 exports.testCache = function(test) |   66     let cache = new Cache(100); | 
|   35 { |  | 
|   36   // A capacity must be specificed and it must be coercable to a positive |  | 
|   37   // number greater than or equal to one. |  | 
|   38   test.throws(() => { new Cache(); }, "capacity must be a positive number."); |  | 
|   39   test.throws(() => { new Cache(0); }, "capacity must be a positive number."); |  | 
|   40   test.throws(() => { new Cache(-1); }, "capacity must be a positive number."); |  | 
|   41   test.throws(() => { new Cache(0.1); }, "capacity must be a positive number."); |  | 
|   42   test.throws(() => { new Cache(Number.MIN_VALUE); }, |  | 
|   43               "capacity must be a positive number."); |  | 
|   44   test.throws(() => { new Cache(-Infinity); }, |  | 
|   45               "capacity must be a positive number."); |  | 
|   46   test.throws(() => { new Cache("ten"); }, |  | 
|   47               "capacity must be a positive number."); |  | 
|   48   test.doesNotThrow(() => { new Cache(1); }, |  | 
|   49                     "capacity must be a positive number."); |  | 
|   50   test.doesNotThrow(() => { new Cache(1.1); }, |  | 
|   51                     "capacity must be a positive number."); |  | 
|   52   test.doesNotThrow(() => { new Cache(10); }, |  | 
|   53                     "capacity must be a positive number."); |  | 
|   54   test.doesNotThrow(() => { new Cache(Number.MAX_VALUE); }, |  | 
|   55                     "capacity must be a positive number."); |  | 
|   56   test.doesNotThrow(() => { new Cache(Infinity); }, |  | 
|   57                     "capacity must be a positive number."); |  | 
|   58   test.doesNotThrow(() => { new Cache("10"); }, |  | 
|   59                     "capacity must be a positive number."); |  | 
|   60  |   67  | 
|   61   let cache = new Cache(100); |   68     cache.set("1", "one"); | 
 |   69     assert.equal(cache.get("1"), "one"); | 
|   62  |   70  | 
|   63   cache.set("1", "one"); |   71     cache.set(2, "two"); | 
|   64   test.equal(cache.get("1"), "one"); |   72     assert.equal(cache.get(2), "two"); | 
|   65  |   73  | 
|   66   cache.set(2, "two"); |   74     // No type coercion. | 
|   67   test.equal(cache.get(2), "two"); |   75     assert.equal(cache.get("2"), undefined); | 
|   68  |   76  | 
|   69   // No type coercion. |   77     // Neither key nor value can be undefined. | 
|   70   test.equal(cache.get("2"), undefined); |   78     assert.throws(() => { cache.set(undefined, "three"); }, | 
 |   79                 "key must not be undefined."); | 
 |   80     assert.throws(() => { cache.set(4, undefined); }, | 
 |   81                 "value must not be undefined."); | 
|   71  |   82  | 
|   72   // Neither key nor value can be undefined. |   83     // Keys and values can be null. | 
|   73   test.throws(() => { cache.set(undefined, "three"); }, |   84     cache.set(null, "five"); | 
|   74               "key must not be undefined."); |   85     cache.set(5, null); | 
|   75   test.throws(() => { cache.set(4, undefined); }, |  | 
|   76               "value must not be undefined."); |  | 
|   77  |   86  | 
|   78   // Keys and values can be null. |   87     cache.clear(); | 
|   79   cache.set(null, "five"); |  | 
|   80   cache.set(5, null); |  | 
|   81  |   88  | 
|   82   cache.clear(); |   89     assert.equal(cache.get("1"), undefined); | 
 |   90     assert.equal(cache.get(2), undefined); | 
 |   91     assert.equal(cache.get(null), undefined); | 
 |   92     assert.equal(cache.get(5), undefined); | 
|   83  |   93  | 
|   84   test.equal(cache.get("1"), undefined); |   94     // Fill to capacity. | 
|   85   test.equal(cache.get(2), undefined); |   95     for (let i = 0; i < 100; i++) | 
|   86   test.equal(cache.get(null), undefined); |   96       cache.set(i, i); | 
|   87   test.equal(cache.get(5), undefined); |  | 
|   88  |   97  | 
|   89   // Fill to capacity. |   98     // All entries exist. | 
|   90   for (let i = 0; i < 100; i++) |   99     for (let i = 0; i < 100; i++) | 
|   91     cache.set(i, i); |  100       assert.equal(cache.get(i), i); | 
|   92  |  101  | 
|   93   // All entries exist. |  102     // Add an existing entry again. | 
|   94   for (let i = 0; i < 100; i++) |  103     cache.set(0, 0); | 
|   95     test.equal(cache.get(i), i); |  | 
|   96  |  104  | 
|   97   // Add an existing entry again. |  105     // All entries still exist. | 
|   98   cache.set(0, 0); |  106     for (let i = 0; i < 100; i++) | 
 |  107       assert.equal(cache.get(i), i); | 
|   99  |  108  | 
|  100   // All entries still exist. |  109     // Exceed capacity. | 
|  101   for (let i = 0; i < 100; i++) |  110     cache.set(100, 100); | 
|  102     test.equal(cache.get(i), i); |  | 
|  103  |  111  | 
|  104   // Exceed capacity. |  112     // Only the last entry exists. | 
|  105   cache.set(100, 100); |  113     for (let i = 0; i <= 100; i++) | 
|  106  |  114       assert.equal(cache.get(i), i == 100 ? 100 : undefined); | 
|  107   // Only the last entry exists. |  115   }); | 
|  108   for (let i = 0; i <= 100; i++) |  116 }); | 
|  109     test.equal(cache.get(i), i == 100 ? 100 : undefined); |  | 
|  110  |  | 
|  111   test.done(); |  | 
|  112 }; |  | 
| OLD | NEW |