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 )