App-Music-ChordPro
view release on metacpan or search on metacpan
t/174_transpose.t view on Meta::CPAN
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
BEGIN { -d "t" && chdir "t" }
use lib ( "../script", "../lib", "../lib/ChordPro/lib" );
use ChordPro;
use Test::More;
plan tests => 13;
my $data1 = <<EOD;
{title: Transpose}
{key: D}
{C: | D | %{key.print} | %{key.sound} | [D] | }
EOD
my @argv = ( "--no-default-configs",
"--generate", "Text",
"--define", "keys.flats=1",
"--backend-option", "expand=1" );
sub test {
my $t = shift;
my $decapo = ( $t & 0x01 ) ? 1 : 0;
my $capo = ( $t & 0x02 ) ? 2 : 0;
my $xpose = ( $t & 0x04 ) ? 2 : 0; # local
my $transpose = ( $t & 0x08 ) ? 2 : 0; # global
return if $decapo && !$capo;
my $data = $data1;
if ( $xpose ) {
$data =~ s/(\{C:)/{transpose $xpose}\n$1/;
}
if ( $capo ) {
$data =~ s/(\{C:)/{capo $capo}\n$1/;
}
@ARGV = ( @argv,
$transpose ? "--transpose=$transpose" : (),
$decapo ? "--decapo" : (),
"--output", '*', \$data );
my $res = ::run(); # --output=*
for ( @$res ) {
next unless /^-- \|\s+/;
my $line = $';
my @a = split( / +\| +/, $line );
unshift( @a,
$transpose || "-",
$xpose || "-",
$capo || "-",
$capo?$decapo?"t":"f":"-" );
return sprintf( "| %-3.3s| %-3.3s| %-3.3s| %-3.3s|".
" %-3.3s| %-3.3s| %-3.3s| %-4.4s |", @a);
}
}
my @xp = split(/[\n\r]+/, <<EOD);
| - | - | - | - | D | D | D | [D] |
| - | - | - | - | D | D | D | [D] |
| - | - | 2 | f | D | D | E | [D] |
| - | - | 2 | t | D | E | E | [E] |
| - | 2 | - | - | D | E | E | [E] |
| - | 2 | - | - | D | D | E | [E] |
| - | 2 | 2 | f | D | E | Gb | [E] |
| - | 2 | 2 | t | D | Gb | Gb | [F#] |
| 2 | - | - | - | D | E | E | [E] |
| 2 | - | - | - | D | E | E | [E] |
| 2 | - | 2 | f | D | E | Gb | [E] |
| 2 | - | 2 | t | D | Gb | Gb | [F#] |
| 2 | 2 | - | - | D | Gb | Gb | [F#] |
| 2 | 2 | - | - | D | E | Gb | [F#] |
| 2 | 2 | 2 | f | D | Gb | Ab | [F#] |
| 2 | 2 | 2 | t | D | Ab | Ab | [G#] |
EOD
ok( @xp == 16, "Number of tests = 12" );
( run in 1.351 second using v1.01-cache-2.11-cpan-5b529ec07f3 )