HTML-D3

 view release on metacpan or  search on metacpan

t/function.t  view on Meta::CPAN


	diag('zoomable snippet length: ' . length($html)) if $ENV{TEST_VERBOSE};
};

subtest 'render_zoomable_line_chart_snippet - extra tooltip data' => sub {
	my @with_extra = (['Jan', 100, { City => 'London' }], ['Feb', 200]);
	my $html = HTML::D3->new()->render_zoomable_line_chart_snippet(\@with_extra)->{html};

	like($html, qr/"extra":\{/,                  '"extra" object present in D3 data');
	like($html, qr/Object\.entries\(d\.extra\)/, 'd.extra iterated in mouseover handler');
};

subtest 'render_zoomable_line_chart_snippet - no circular references' => sub {
	my $fragment = HTML::D3->new()->render_zoomable_line_chart_snippet(\@SIMPLE_DATA);
	memory_cycle_ok($fragment, 'zoomable snippet hashref has no circular references');
};

# ---------------------------------------------------------------------------
# Multi-series methods
# All four share the same data shape and the same "array of hashes" validation.
# ---------------------------------------------------------------------------

subtest 'render_multi_series_line_chart_with_tooltips' => sub {
	my $chart = HTML::D3->new(title => 'Multi Tooltip');

	throws_ok(
		sub { $chart->render_multi_series_line_chart_with_tooltips('bad') },
		qr/\Q$ERR_ARRAY_OF_HASH\E/,
		'dies on non-array data with correct message',
	);

	my $html = $chart->render_multi_series_line_chart_with_tooltips(\@MULTI_DATA);

	returns_ok($html, { type => 'string' }, 'returns a string scalar');
	like($html, qr/<!DOCTYPE html>/i,                    'contains DOCTYPE');
	like($html, qr/<svg id="chart"/,                     'SVG element present');
	like($html, qr/<div class="tooltip" id="tooltip">/,  'tooltip div present');
	like($html, qr/Series A/,                            'first series name present');
	like($html, qr/1000/,                                'data value present');
	unlike($html, qr{</b>},                              'raw </b> absent');
};

subtest 'render_multi_series_line_chart_with_animated_tooltips' => sub {
	my $chart = HTML::D3->new(title => 'Animated');

	throws_ok(
		sub { $chart->render_multi_series_line_chart_with_animated_tooltips('bad') },
		qr/\Q$ERR_ARRAY_OF_HASH\E/,
		'dies on non-array data',
	);

	my $html = $chart->render_multi_series_line_chart_with_animated_tooltips(\@MULTI_DATA);

	returns_ok($html, { type => 'string' }, 'returns a string scalar');
	like($html, qr/<!DOCTYPE html>/i,     'contains DOCTYPE');
	like($html, qr/translateY/,           'CSS translateY animation present');
	like($html, qr/<div class="tooltip"/, 'tooltip div present');
	unlike($html, qr{</b>},              'raw </b> absent');
};

subtest 'render_multi_series_line_chart_with_legends' => sub {
	my $chart = HTML::D3->new(title => 'Legends');

	throws_ok(
		sub { $chart->render_multi_series_line_chart_with_legends('bad') },
		qr/\Q$ERR_ARRAY_OF_HASH\E/,
		'dies on non-array data',
	);

	my $html = $chart->render_multi_series_line_chart_with_legends(\@MULTI_DATA);

	returns_ok($html, { type => 'string' }, 'returns a string scalar');
	like($html, qr/<!DOCTYPE html>/i,     'contains DOCTYPE');
	like($html, qr/\.legend\s*\{/,       'legend CSS class defined in stylesheet');
	like($html, qr/Series A/,            'first series name appears in legend area');
	unlike($html, qr{</b>},              'raw </b> absent');
};

subtest 'render_multi_series_line_chart_with_interactive_legends' => sub {
	my $chart = HTML::D3->new(title => 'Interactive Legends');

	throws_ok(
		sub { $chart->render_multi_series_line_chart_with_interactive_legends('bad') },
		qr/\Q$ERR_ARRAY_OF_HASH\E/,
		'dies on non-array data',
	);

	my $html = $chart->render_multi_series_line_chart_with_interactive_legends(\@MULTI_DATA);

	returns_ok($html, { type => 'string' }, 'returns a string scalar');
	like($html, qr/<!DOCTYPE html>/i,  'contains DOCTYPE');
	like($html, qr/isVisible/,         'visibility-toggle variable present');
	# The legend click handler must toggle opacity based on current visibility.
	like($html, qr/isVisible\s*\?\s*0\s*:\s*1/, 'opacity toggled based on isVisible');
	like($html, qr/\.legend\s*\{/,              'legend CSS class defined in stylesheet');
	unlike($html, qr{</b>},                     'raw </b> absent');
};

# ---------------------------------------------------------------------------

done_testing();



( run in 0.691 second using v1.01-cache-2.11-cpan-364913b4093 )