From 38c45739d3c4b0e671002804f8037c2f61413455 Mon Sep 17 00:00:00 2001 From: John McNamara Date: Sat, 22 Jun 2024 14:51:00 +0100 Subject: [PATCH] chart: add x2_axis tests --- t/regression/chart_line07.t | 95 +++++++++++++++++++++ t/regression/chart_line08.t | 97 ++++++++++++++++++++++ t/regression/xlsx_files/chart_line07.xlsx | Bin 0 -> 9447 bytes t/regression/xlsx_files/chart_line08.xlsx | Bin 0 -> 9446 bytes 4 files changed, 192 insertions(+) create mode 100644 t/regression/chart_line07.t create mode 100644 t/regression/chart_line08.t create mode 100644 t/regression/xlsx_files/chart_line07.xlsx create mode 100644 t/regression/xlsx_files/chart_line08.xlsx diff --git a/t/regression/chart_line07.t b/t/regression/chart_line07.t new file mode 100644 index 00000000..b0bd3819 --- /dev/null +++ b/t/regression/chart_line07.t @@ -0,0 +1,95 @@ +############################################################################### +# +# Tests the output of Excel::Writer::XLSX against Excel generated files. +# +# Copyright 2000-2024, John McNamara, jmcnamara@cpan.org +# +# SPDX-License-Identifier: Artistic-1.0-Perl OR GPL-1.0-or-later +# + +use lib 't/lib'; +use TestFunctions qw(_compare_xlsx_files _is_deep_diff); +use strict; +use warnings; + +use Test::More tests => 1; + +############################################################################### +# +# Tests setup. +# +my $filename = 'chart_line07.xlsx'; +my $dir = 't/regression/'; +my $got_filename = $dir . "ewx_$filename"; +my $exp_filename = $dir . 'xlsx_files/' . $filename; + +my $ignore_members = []; + +my $ignore_elements = { 'xl/charts/chart1.xml' => [ 'new( $got_filename ); +my $worksheet = $workbook->add_worksheet(); +my $chart = $workbook->add_chart( type => 'line', embedded => 1 ); + +# For testing, copy the randomly generated axis ids in the target xlsx file. +$chart->{_axis_ids} = [ 77034624, 77036544 ]; +$chart->{_axis2_ids} = [ 95388032, 103040896 ]; + +my $data = [ + [ 1, 2, 3, 4, 5 ], + [ 10, 40, 50, 20, 10 ], + [ 1, 2, 3, 4, 5, 6, 7 ], + [ 30, 10, 20, 40, 30, 10, 20 ], + +]; + +$worksheet->write( 'A1', $data ); + + +$chart->add_series( + categories => '=Sheet1!$A$1:$A$5', + values => '=Sheet1!$B$1:$B$5', +); + +$chart->add_series( + categories => '=Sheet1!$C$1:$C$7', + values => '=Sheet1!$D$1:$D$7', + y2_axis => 1, +); + +$chart->set_x2_axis( label_position => 'next_to' ); + +$worksheet->insert_chart( 'E9', $chart ); + +$workbook->close(); + + +############################################################################### +# +# Compare the generated and existing Excel files. +# + +my ( $got, $expected, $caption ) = _compare_xlsx_files( + + $got_filename, + $exp_filename, + $ignore_members, + $ignore_elements, +); + +_is_deep_diff( $got, $expected, $caption ); + + +############################################################################### +# +# Cleanup. +# +unlink $got_filename; + +__END__ diff --git a/t/regression/chart_line08.t b/t/regression/chart_line08.t new file mode 100644 index 00000000..9a20cbe4 --- /dev/null +++ b/t/regression/chart_line08.t @@ -0,0 +1,97 @@ +############################################################################### +# +# Tests the output of Excel::Writer::XLSX against Excel generated files. +# +# Copyright 2000-2024, John McNamara, jmcnamara@cpan.org +# +# SPDX-License-Identifier: Artistic-1.0-Perl OR GPL-1.0-or-later +# + +use lib 't/lib'; +use TestFunctions qw(_compare_xlsx_files _is_deep_diff); +use strict; +use warnings; + +use Test::More tests => 1; + +############################################################################### +# +# Tests setup. +# +my $filename = 'chart_line08.xlsx'; +my $dir = 't/regression/'; +my $got_filename = $dir . "ewx_$filename"; +my $exp_filename = $dir . 'xlsx_files/' . $filename; + +my $ignore_members = []; + +my $ignore_elements = {}; + +############################################################################### +# +# Test the creation of a simple Excel::Writer::XLSX file. +# +use Excel::Writer::XLSX; + +my $workbook = Excel::Writer::XLSX->new( $got_filename ); +my $worksheet = $workbook->add_worksheet(); +my $chart = $workbook->add_chart( type => 'line', embedded => 1 ); + +# For testing, copy the randomly generated axis ids in the target xlsx file. +$chart->{_axis_ids} = [ 77034624, 77036544 ]; +$chart->{_axis2_ids} = [ 95388032, 103040896 ]; + +my $data = [ + [ 1, 2, 3, 4, 5 ], + [ 10, 40, 50, 20, 10 ], + [ 1, 2, 3, 4, 5, 6, 7 ], + [ 30, 10, 20, 40, 30, 10, 20 ], + +]; + +$worksheet->write( 'A1', $data ); + + +$chart->add_series( + categories => '=Sheet1!$A$1:$A$5', + values => '=Sheet1!$B$1:$B$5', +); + +$chart->add_series( + categories => '=Sheet1!$C$1:$C$7', + values => '=Sheet1!$D$1:$D$7', + y2_axis => 1, +); + + +$chart->set_x2_axis( label_position => 'next_to', visible => 1, position => 'top' ); +$chart->set_y2_axis( crossing => 'max' ); + +$worksheet->insert_chart( 'E9', $chart ); + +$workbook->close(); + + +############################################################################### +# +# Compare the generated and existing Excel files. +# + +my ( $got, $expected, $caption ) = _compare_xlsx_files( + + $got_filename, + $exp_filename, + $ignore_members, + $ignore_elements, +); + +_is_deep_diff( $got, $expected, $caption ); + + +############################################################################### +# +# Cleanup. +# +unlink $got_filename; + +__END__ diff --git a/t/regression/xlsx_files/chart_line07.xlsx b/t/regression/xlsx_files/chart_line07.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..a090bbe520f49c3501077538f0df6d5b4f5d8df6 GIT binary patch literal 9447 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 E2L+)*XaE2J literal 0 HcmV?d00001 diff --git a/t/regression/xlsx_files/chart_line08.xlsx b/t/regression/xlsx_files/chart_line08.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..50f2dd49d31783fe4edb13fd25878c19decfc32e GIT binary patch literal 9446 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 EKL>nE?EnA( literal 0 HcmV?d00001