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 )