From 574d43f1a6af6529d07cd1b4803349c9557ae001 Mon Sep 17 00:00:00 2001 From: Andre Staltz Date: Wed, 25 Oct 2023 14:13:15 +0300 Subject: [PATCH] fix algorithm wantRange plus test it --- lib/algorithm.js | 24 ++++++++++++++++------- test/want-range.test.js | 43 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+), 7 deletions(-) create mode 100644 test/want-range.test.js diff --git a/lib/algorithm.js b/lib/algorithm.js index 3b94b38..0794bec 100644 --- a/lib/algorithm.js +++ b/lib/algorithm.js @@ -72,10 +72,14 @@ class Algorithm { #wantNewestRange(localHaveRange, remoteHaveRange, count) { const [minLocalHave, maxLocalHave] = localHaveRange const [minRemoteHave, maxRemoteHave] = remoteHaveRange - if (maxRemoteHave <= maxLocalHave) return EMPTY_RANGE + if (maxRemoteHave < minLocalHave) return EMPTY_RANGE const maxWant = maxRemoteHave const size = Math.max(maxWant - maxLocalHave, count) - const minWant = Math.max(maxWant - size, minRemoteHave) + const minWant = Math.max( + maxWant - size + 1, + maxLocalHave - size + 1, + minRemoteHave + ) return [minWant, maxWant] } @@ -88,12 +92,18 @@ class Algorithm { wantRange(localHave, remoteHave, goal) { if (!goal) return EMPTY_RANGE if (isEmptyRange(remoteHave)) return EMPTY_RANGE - if (goal.type === 'all' || goal.type === 'set' || goal.type === 'record') { - return this.#wantAllRange(localHave, remoteHave) - } else if (goal.type === 'newest') { - return this.#wantNewestRange(localHave, remoteHave, goal.count) + + switch (goal.type) { + case 'all': + return this.#wantAllRange(localHave, remoteHave) + + case 'newest': + return this.#wantNewestRange(localHave, remoteHave, goal.count) + + case 'none': + default: + return EMPTY_RANGE } - return EMPTY_RANGE } /** diff --git a/test/want-range.test.js b/test/want-range.test.js new file mode 100644 index 0000000..aa129b7 --- /dev/null +++ b/test/want-range.test.js @@ -0,0 +1,43 @@ +const test = require('node:test') +const assert = require('node:assert') +const p = require('node:util').promisify +const Algorithm = require('../lib/algorithm') + +test('want-range for goal=newest-3', async (t) => { + const algo = new Algorithm({ db: null }) + const goal = { type: 'newest', count: 3 } + + assert.deepStrictEqual(algo.wantRange([2, 4], [1, 3], goal), [2, 3]) + assert.deepStrictEqual(algo.wantRange([2, 4], [1, 5], goal), [3, 5]) + assert.deepStrictEqual(algo.wantRange([1, 3], [2, 4], goal), [2, 4]) + assert.deepStrictEqual(algo.wantRange([1, 5], [2, 4], goal), [3, 4]) + assert.deepStrictEqual(algo.wantRange([1, 3], [4, 6], goal), [4, 6]) + assert.deepStrictEqual(algo.wantRange([4, 6], [1, 3], goal), [1, 0]) + assert.deepStrictEqual(algo.wantRange([1, 3], [6, 7], goal), [6, 7]) +}) + +test('want-range for goal=all', async (t) => { + const algo = new Algorithm({ db: null }) + const goal = { type: 'all' } + + assert.deepStrictEqual(algo.wantRange([2, 4], [1, 3], goal), [1, 3]) + assert.deepStrictEqual(algo.wantRange([2, 4], [1, 5], goal), [1, 5]) + assert.deepStrictEqual(algo.wantRange([1, 3], [2, 4], goal), [2, 4]) + assert.deepStrictEqual(algo.wantRange([1, 5], [2, 4], goal), [2, 4]) + assert.deepStrictEqual(algo.wantRange([1, 3], [4, 6], goal), [4, 6]) + assert.deepStrictEqual(algo.wantRange([4, 6], [1, 3], goal), [1, 3]) + assert.deepStrictEqual(algo.wantRange([1, 3], [6, 7], goal), [6, 7]) +}) + +test('want-range for goal=record', async (t) => { + const algo = new Algorithm({ db: null }) + const goal = { type: 'record' } + + assert.deepStrictEqual(algo.wantRange([2, 4], [1, 3], goal), [2, 3]) + assert.deepStrictEqual(algo.wantRange([2, 4], [1, 5], goal), [2, 5]) + assert.deepStrictEqual(algo.wantRange([1, 3], [2, 4], goal), [2, 4]) + assert.deepStrictEqual(algo.wantRange([1, 5], [2, 4], goal), [2, 4]) + assert.deepStrictEqual(algo.wantRange([1, 3], [4, 6], goal), [4, 6]) + assert.deepStrictEqual(algo.wantRange([4, 6], [1, 3], goal), [1, 0]) + assert.deepStrictEqual(algo.wantRange([1, 3], [6, 7], goal), [6, 7]) +})