70 lines
3.3 KiB
JavaScript
70 lines
3.3 KiB
JavaScript
import { test } from 'node:test';
|
|
import assert from 'node:assert/strict';
|
|
import { withChart, assertNoPageErrors } from './helpers.mjs';
|
|
|
|
test('every price overlay shares the candle price scale',
|
|
{ timeout: 180000 }, async () => {
|
|
await withChart(async page => {
|
|
const state = await page.evaluate(() => {
|
|
const c = window.__chart;
|
|
const series = [...c.levelSeries.entries()].map(([id, entry]) => ({
|
|
id,
|
|
scale: entry.series.options().priceScaleId,
|
|
context: window.ConfluenceChart.isContextLevel(c.levels.find(level => level.id === id)),
|
|
title: entry.series.options().title,
|
|
}));
|
|
const priceLines = [...c.priceLines.entries()].map(([id, entry]) => ({
|
|
id,
|
|
usesCandles: entry.host === c.candles,
|
|
}));
|
|
const average = c.levels.find(level => level.kind === 'ma');
|
|
const averageSeries = average ? c.levelSeries.get(average.id)?.series : null;
|
|
const value = average?.anchor_p ?? null;
|
|
return {
|
|
leftVisible: c.chart.priceScale('left').options().visible,
|
|
series,
|
|
priceLines,
|
|
coordinateDifference: averageSeries && value != null
|
|
? Math.abs(averageSeries.priceToCoordinate(value) - c.candles.priceToCoordinate(value))
|
|
: null,
|
|
leftLabels: document.querySelectorAll('.chart-context-label').length,
|
|
};
|
|
});
|
|
|
|
assert.equal(state.leftVisible, false, 'an independent left price scale is visible');
|
|
assert.ok(state.series.length > 0, 'no overlay series were available to check');
|
|
assert.ok(state.series.every(item => item.scale === 'right'),
|
|
`overlay series left the candle scale: ${JSON.stringify(state.series)}`);
|
|
assert.ok(state.series.filter(item => item.context).every(item => item.title === ''),
|
|
`long-term labels still clutter the right: ${JSON.stringify(state.series)}`);
|
|
assert.ok(state.leftLabels > 0, 'long-term labels are missing from the left side');
|
|
assert.ok(state.priceLines.every(item => item.usesCandles),
|
|
`a price line uses another scale: ${JSON.stringify(state.priceLines)}`);
|
|
assert.ok(state.coordinateDifference != null && state.coordinateDifference < 0.1,
|
|
`the same price differs by ${state.coordinateDifference}px between MA and candles`);
|
|
|
|
const intradayType = await page.evaluate(() => {
|
|
const c = window.__chart;
|
|
const average = c.levels.find(level => level.kind === 'ma');
|
|
return {
|
|
actual: c.levelSeries.get(average.id).series.options().lineType,
|
|
expected: LightweightCharts.LineType.WithSteps,
|
|
};
|
|
});
|
|
assert.equal(intradayType.actual, intradayType.expected,
|
|
'an intraday daily MA is not held as steps');
|
|
await page.click('.timeframes button:text-is("1d")');
|
|
await page.waitForTimeout(1500);
|
|
const dailyType = await page.evaluate(() => {
|
|
const c = window.__chart;
|
|
const average = c.levels.find(level => level.kind === 'ma');
|
|
return {
|
|
actual: c.levelSeries.get(average.id).series.options().lineType,
|
|
expected: LightweightCharts.LineType.Simple,
|
|
};
|
|
});
|
|
assert.equal(dailyType.actual, dailyType.expected,
|
|
'a daily MA is still rendered as a staircase');
|
|
assertNoPageErrors(page, assert);
|
|
});
|
|
});
|