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); }); });