"""Visible geometry and evidence boundaries of the terminal volume plot.""" from fenris.activity_plot import VolumePoint, volume_plot from fenris.themes import get_graph_colors def plot(points, selected=-1, width=48, height=10): return volume_plot(points, width, height, selected, get_graph_colors("chalktone")) def test_trace_fits_viewport_and_uses_time_not_sample_index(): points = [VolumePoint(t, v, str(t)) for t, v in ((0, 0), (3, 50), (30, 100))] text, columns, unit = plot(points) assert unit == "B" assert len(text.plain.splitlines()) == 10 assert all(len(line) <= 48 for line in text.plain.splitlines()) assert columns[1] - columns[0] < (columns[2] - columns[0]) / 5 assert any(0x2801 <= ord(c) <= 0x28ff for c in text.plain) assert not any(c in text.plain for c in "█▒░") assert "100.00" in text.plain and "0.00" in text.plain def test_gap_breaks_trace_while_measured_zero_stays_on_axis(): text, columns, _ = plot([ VolumePoint(0, 0, "00:00"), VolumePoint(1, None, "00:03", "gap"), VolumePoint(2, 100, "00:06"), ]) rows = text.plain.splitlines() assert "?" in rows[-2] # No invented intermediate dots on either side of the missing measurement. for row in rows[:-2]: assert all(c == " " for c in row[columns[0] + 1:columns[-1]]) assert 0x2801 <= ord(rows[-3][columns[0]]) <= 0x28ff def test_partial_and_unallocated_totals_are_isolated_and_labelled(): text, columns, unit = plot([ VolumePoint(0, 1_000_000, "01", "partial"), VolumePoint(1, 2_000_000, "02", "unallocated"), VolumePoint(2, 3_000_000, "03"), ]) assert unit == "MB" assert "~" in text.plain and "u" in text.plain for row in text.plain.splitlines()[:-2]: assert all(c == " " for c in row[columns[0] + 1:columns[1]]) def test_many_intervals_and_selection_fit_small_plot_without_losing_points(): points = [VolumePoint(i, i % 9 * 1_000_000, str(i)) for i in range(180)] text, columns, _ = plot(points, selected=100, width=32, height=6) assert len(columns) == len(points) assert text.plain.splitlines()[-2][columns[100]] == "▼" assert all(len(row) == 32 for row in text.plain.splitlines())