-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
4 changed files
with
229 additions
and
71 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,64 +1,118 @@ | ||
const { ObjectPool } = require("."); | ||
"use strict"; | ||
|
||
const ObjectPool = require("."); | ||
|
||
describe("GIVEN ObjectPool instance", () => { | ||
let pool; | ||
|
||
const resolveArgument = "[Promise resolved]"; | ||
|
||
function factory() { | ||
return new Promise((resolve) => { | ||
setTimeout(() => resolve(resolveArgument), 500); | ||
}); | ||
} | ||
|
||
beforeEach(() => { | ||
pool = new ObjectPool(() => true); | ||
pool = new ObjectPool(factory); | ||
}); | ||
|
||
it("THEN It should create", () => { | ||
expect(pool).toBeTruthy(); | ||
}); | ||
|
||
describe("WHEN pool.next is called", () => { | ||
it("THEN even if objects size is 0", () => { | ||
expect(pool.objects.size).toBe(0); | ||
describe("WHEN pool.get is called", () => { | ||
it("THEN even if pool.size is 0", () => { | ||
expect(pool.size).toBe(0); | ||
}); | ||
|
||
it("THEN It should return new instance of object", () => { | ||
expect(pool.next()).toBe(true); | ||
it("THEN It should return new instance of factory call", () => { | ||
expect(typeof pool.get()).toBe(typeof factory()); | ||
}); | ||
|
||
it("THEN events.next should be emitted", async (done) => { | ||
pool.events.on("next", () => done()); | ||
it("THEN events.get should be emitted", async (done) => { | ||
pool.events.on("get", () => done()); | ||
|
||
pool.next(); | ||
pool.get(); | ||
}); | ||
}); | ||
|
||
describe("WHEN pool.back is called", () => { | ||
it("THEN objects size should be greater than 0 afterwards", () => { | ||
pool.back(false); | ||
describe("WHEN pool.put is called", () => { | ||
it("THEN pool.size should be greater than 0 afterwards", () => { | ||
pool.put(false); | ||
|
||
expect(pool.size).toBeGreaterThan(0); | ||
}); | ||
|
||
it("THEN events.put should be emitted", async (done) => { | ||
pool.events.on("put", () => done()); | ||
|
||
expect(pool.objects.size).toBeGreaterThan(0); | ||
pool.put(null); | ||
}); | ||
}); | ||
|
||
describe("WHEN promise is `put` and then `get` again", () => { | ||
it("THEN it still works as expected", async (done) => { | ||
const once = pool.get(); | ||
const value = await once; | ||
|
||
setTimeout(() => { | ||
pool.put(once); | ||
|
||
const again = pool.get(); | ||
|
||
expect(typeof again).toBe(typeof once); | ||
expect(typeof value).toBe(typeof resolveArgument); | ||
|
||
expect(value).toBe(resolveArgument); | ||
|
||
it("THEN events.back should be emitted", async (done) => { | ||
pool.events.on("back", () => done()); | ||
expect(Promise.resolve(once)).toBe(once); | ||
expect(Promise.resolve(again)).toBe(again); | ||
|
||
pool.back(null); | ||
done(); | ||
}, 1000); | ||
}); | ||
}); | ||
|
||
describe("WHEN pool.empty is called on non-empty pool", () => { | ||
describe("WHEN pool.size is set to 0 on non-empty pool", () => { | ||
// prepare with data | ||
beforeEach(() => { | ||
pool.back(null); | ||
pool.back(null); | ||
pool.back(null); | ||
pool.put(null); | ||
pool.put(null); | ||
pool.put(null); | ||
}); | ||
|
||
it("THEN events.remove should be emitted for each item", async (done) => { | ||
let count = pool.objects.size; | ||
it("THEN events.delete should be emitted for each item", async (done) => { | ||
let count = pool.size; | ||
|
||
pool.events.on("remove", () => { | ||
pool.events.on("delete", () => { | ||
if (!--count) { | ||
done() | ||
done(); | ||
} | ||
}); | ||
|
||
pool.empty(); | ||
pool.size = 0; | ||
}); | ||
}); | ||
|
||
describe("WHEN pool.size is set", () => { | ||
const initialSize = 5; | ||
|
||
// prepare with data | ||
beforeEach(() => { | ||
pool.size = initialSize; | ||
}); | ||
|
||
it("THEN pool size adjusts and is being filled accordingly", () => { | ||
pool.size = initialSize * 10; | ||
|
||
expect(pool.size).toBe(initialSize * 10); | ||
}); | ||
|
||
it("THEN pool size adjusts and is being trimmed accordingly", () => { | ||
pool.size = 1; | ||
|
||
expect(pool.size).toBe(1); | ||
}); | ||
}); | ||
}); |
Oops, something went wrong.