stock-indicators/test/indicator/weighted-moving-average.js
2025-03-31 11:20:04 +02:00

68 lines
2.4 KiB
JavaScript
Executable File

'use strict';
import chai from 'chai';
const assert = chai.assert;
import WMA from '../../lib/indicator/weighted-moving-average.js';
describe('WMA', () => {
let data = [90.91, 90.83, 90.28, 90.36, 90.90, 90.51];
let runTest = async (data, expectedResults, options = {}) => {
let wma = new WMA(options);
wma.setValues(data);
let results = await wma.calculate();
assert.isArray(results);
assert.isTrue(results.length == expectedResults.length);
results.forEach((item, idx) => {
assert.containsAllKeys(item, ['price', 'wma']);
assert.closeTo(item.wma, expectedResults[idx], 0.02);
assert.isTrue(item.price > 0);
});
};
let runTest_2 = async (opts, data, expectedResult) => {
let sma = new WMA(opts);
sma.setValues(data);
let results = await sma.calculate();
assert.isArray(results)
assert.isTrue(expectedResult.length == results.length);
results.forEach((item, idx) => {
assert.isObject(item);
assert.containsAllKeys(item, ['price', 'wma']);
assert.isNumber(item.price);
assert.isNumber(item.wma);
assert.closeTo(expectedResult[idx].wma, item.wma, 0.1);
assert.isTrue(item.price == data[opts.startIndex + opts.periods - 1 + idx]);
});
}
it('should calculate correctly and return results', (done) => {
(async () => {
let expectedResults = [90.62, 90.57];
await runTest(data, expectedResults, { periods: 5, sliceOffset: true });
let expectedResults2 = [0, 0, 0, 0].concat(expectedResults);
await runTest(data, expectedResults2, { periods: 5, sliceOffset: false });
done();
})();
});
it('should calculate correctly with starIndex and endIndex options and return result', (done) => {
(async function () {
let opts = { periods: 2, startIndex: 1, endIndex: data.length - 2, lazyEvaluation: true, sliceOffset: true };
let expectedResult = [
{ price: 90.28, wma: 90.46 },
{ price: 90.36, wma: 90.33 },
{ price: 90.9, wma: 90.72 }
];
await runTest_2(opts, data, expectedResult);
done();
})();
});
});