@c9up/technical-indicators-napi
Version:
A Rust-based indicator and Charts library compiled to napi.
79 lines (63 loc) • 2.79 kB
JavaScript
import { test } from '@japa/runner'
import { ichimoku, lowHighOpenCloseVolumeDateToArray } from '../../index.js'
import { generateTestData } from './lib.mjs'
test.group('Ichimoku Cloud Indicator', () => {
test('should calculate basic Ichimoku values', ({ assert }) => {
// Generate 100 days of data to ensure enough points for all calculations
const testData = generateTestData(100)
const result = ichimoku(testData)
assert.properties(result[0], [
'tenkanSen',
'kijunSen',
'senkouSpanA',
'senkouSpanB',
'chikouSpan'
])
// Check array lengths
assert.equal(result.length, testData.length)
})
test('should handle minimal data set', ({ assert }) => {
const minimalData = generateTestData(53) // Minimum required for 52-period calculations
const result = ichimoku(minimalData)
// Verify initial values are NaN
assert.isTrue(isNaN(result[0].tenkanSen))
assert.isTrue(isNaN(result[0].kijunSen))
assert.isTrue(isNaN(result[0].senkouSpanA))
assert.isTrue(isNaN(result[0].senkouSpanB))
})
test('should calculate correct Tenkan-sen values', ({ assert }) => {
const testData = generateTestData(100)
const lhocvd = lowHighOpenCloseVolumeDateToArray(testData)
const result = ichimoku(testData)
// First 8 values should be NaN (9-period calculation)
for (let i = 0; i < 8; i++) {
assert.isTrue(isNaN(result[i].tenkanSen))
}
const expectedMax = Math.max(...lhocvd.highs.slice(0, 9));
const expectedMin = Math.min(...lhocvd.lows.slice(0, 9));
const expectedTenkan = (expectedMax + expectedMin) / 2;
assert.approximately(result[8].tenkanSen, expectedTenkan, 0.01);
})
test('should verify Senkou Span displacement', ({ assert }) => {
const testData = generateTestData(60)
const result = ichimoku(testData)
// First 26 values should be NaN due to displacement
for (let i = 0; i < 26; i++) {
assert.isTrue(isNaN(result[i].senkouSpanA))
assert.isTrue(isNaN(result[i].senkouSpanB))
}
})
test('should calculate correct Chikou Span', ({ assert }) => {
const testData = generateTestData(80)
const result = ichimoku(testData)
console.log(result)
// Last 26 values should be NaN
for (let i = 0; i < 26; i++) {
assert.isTrue(Number.isNaN(result[i].chikouSpan));
}
// Other values should match closing prices shifted backwards
for (let i = 26; i < testData.length; i++) {
assert.equal(result[i].chikouSpan, testData[i - 26].close);
}
})
})