From dbf86efede28c87e893fc5be1aa993ffa814150d Mon Sep 17 00:00:00 2001 From: John McNamara Date: Sat, 22 Jun 2024 18:06:20 +0100 Subject: [PATCH] worksheet: add extra test for sheet name quoting --- t/regression/quote_name05.t | 91 ++++++++++++++++++++++ t/regression/quote_name06.t | 91 ++++++++++++++++++++++ t/regression/quote_name07.t | 91 ++++++++++++++++++++++ t/regression/xlsx_files/quote_name05.xlsx | Bin 0 -> 9411 bytes t/regression/xlsx_files/quote_name06.xlsx | Bin 0 -> 9425 bytes t/regression/xlsx_files/quote_name07.xlsx | Bin 0 -> 9431 bytes 6 files changed, 273 insertions(+) create mode 100644 t/regression/quote_name05.t create mode 100644 t/regression/quote_name06.t create mode 100644 t/regression/quote_name07.t create mode 100644 t/regression/xlsx_files/quote_name05.xlsx create mode 100644 t/regression/xlsx_files/quote_name06.xlsx create mode 100644 t/regression/xlsx_files/quote_name07.xlsx diff --git a/t/regression/quote_name05.t b/t/regression/quote_name05.t new file mode 100644 index 00000000..4bee641d --- /dev/null +++ b/t/regression/quote_name05.t @@ -0,0 +1,91 @@ +############################################################################### +# +# 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 = 'quote_name05.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 => 'column', embedded => 1 ); + +# For testing, copy the randomly generated axis ids in the target xlsx file. +$chart->{_axis_ids} = [ 54437760, 59195776 ]; + +my $data = [ + [ 1, 2, 3, 4, 5 ], + [ 2, 4, 6, 8, 10 ], + [ 3, 6, 9, 12, 15 ], + +]; + +$worksheet->write( 'A1', $data ); +$worksheet->repeat_rows( 0, 1 ); +$worksheet->set_portrait(); +$worksheet->{_vertical_dpi} = 200; + +$chart->add_series( values => [ 'Sheet1', 0, 4, 0, 0 ] ); +$chart->add_series( values => [ 'Sheet1', 0, 4, 1, 1 ] ); +$chart->add_series( values => [ 'Sheet1', 0, 4, 2, 2 ] ); + +$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/quote_name06.t b/t/regression/quote_name06.t new file mode 100644 index 00000000..821263a8 --- /dev/null +++ b/t/regression/quote_name06.t @@ -0,0 +1,91 @@ +############################################################################### +# +# 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 = 'quote_name06.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(q{Sheet-1}); +my $chart = $workbook->add_chart( type => 'column', embedded => 1 ); + +# For testing, copy the randomly generated axis ids in the target xlsx file. +$chart->{_axis_ids} = [ 62284544, 83429248 ]; + +my $data = [ + [ 1, 2, 3, 4, 5 ], + [ 2, 4, 6, 8, 10 ], + [ 3, 6, 9, 12, 15 ], + +]; + +$worksheet->write( 'A1', $data ); +$worksheet->repeat_rows( 0, 1 ); +$worksheet->set_portrait(); +$worksheet->{_vertical_dpi} = 200; + +$chart->add_series( values => [ q{Sheet-1}, 0, 4, 0, 0 ] ); +$chart->add_series( values => [ q{Sheet-1}, 0, 4, 1, 1 ] ); +$chart->add_series( values => [ q{Sheet-1}, 0, 4, 2, 2 ] ); + +$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/quote_name07.t b/t/regression/quote_name07.t new file mode 100644 index 00000000..31bb02e2 --- /dev/null +++ b/t/regression/quote_name07.t @@ -0,0 +1,91 @@ +############################################################################### +# +# 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 = 'quote_name07.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(q{Sheet'1}); +my $chart = $workbook->add_chart( type => 'column', embedded => 1 ); + +# For testing, copy the randomly generated axis ids in the target xlsx file. +$chart->{_axis_ids} = [ 48135552, 54701056 ]; + +my $data = [ + [ 1, 2, 3, 4, 5 ], + [ 2, 4, 6, 8, 10 ], + [ 3, 6, 9, 12, 15 ], + +]; + +$worksheet->write( 'A1', $data ); +$worksheet->repeat_rows( 0, 1 ); +$worksheet->set_portrait(); +$worksheet->{_vertical_dpi} = 200; + +$chart->add_series( values => [ q{Sheet'1}, 0, 4, 0, 0 ] ); +$chart->add_series( values => [ q{Sheet'1}, 0, 4, 1, 1 ] ); +$chart->add_series( values => [ q{Sheet'1}, 0, 4, 2, 2 ] ); + +$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/quote_name05.xlsx b/t/regression/xlsx_files/quote_name05.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..dc05926505dae2d2ddef30704942263ff8bb08af GIT binary patch literal 9411 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 XP*=i0viL`pj}Nd$8iFkSkGuZ?`amsg literal 0 HcmV?d00001 diff --git a/t/regression/xlsx_files/quote_name06.xlsx b/t/regression/xlsx_files/quote_name06.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..1b49fd8db67aea094d0d3ec37118214da2e82dd3 GIT binary patch literal 9425 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 literal 0 HcmV?d00001