The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package TestFor::Code::TidyAll::SpacesInPaths;

use strict;
use warnings;

use Test::Class::Most parent => 'TestFor::Code::TidyAll::Plugin';

use Code::TidyAll::Util qw(tempdir_simple);

sub _extra_path {
    (
        'node_modules/.bin',
        'php5/usr/bin',
    );
}

sub test_css_unminifier : Tests {
    my $self = shift;

    return unless $self->require_executable('node');
    return unless $self->require_executable('cssunminifier');

    my $file   = $self->_spaces_dir->child('foo bar.css');
    my $source = "body {\nfont-family:helvetica;\nfont-size:15pt;\n}";
    $file->spew($source);

    $self->tidyall(
        plugin_conf => {
            CSSUnminifier => { select => '**/*.css' },
        },
        source_file => $file,
        expect_tidy => "body {\n    font-family: helvetica;\n    font-size: 15pt;\n}\n"
    );
}

sub test_js_plugins : Tests {
    my $self = shift;

    return unless $self->require_executable('node');
    return unless $self->require_executable('js-beautify') || $ENV{TRAVIS};
    return unless $self->require_executable('jshint');
    return unless $self->require_executable('jslint');

    my $file = $self->_spaces_dir->child('foo bar.js');
    $file->spew('var my_object = {};');

    $self->tidyall(
        plugin_conf => {
            ( $ENV{TRAVIS} ? () : ( JSBeautify => { select => '**/*.js' } ) ),
            JSHint => { select => '**/*.js' },
            JSLint => { select => '**/*.js' },
        },
        source_file => $file,
        expect_ok   => 1,
    );
}

sub test_mason_tidy : Tests {
    my $self = shift;

    my $file   = $self->_spaces_dir->child('foo bar.mason');
    my $source = "%if(\$foo) {\n%bar(1,2);\n%}";
    $file->spew($source);

    $self->tidyall(
        plugin_conf => {
            MasonTidy => {
                argv   => '-m 1 ',
                select => '**/*.mason'
            },
        },
        source_file => $file,
        expect_tidy => "% if (\$foo) {\n%     bar( 1, 2 );\n% }",
    );
}

sub test_perl_plugins : Tests {
    my $self = shift;

    my $file   = $self->_spaces_dir->child('foo bar.pl');
    my $source = <<'EOF';
use strict;
use warnings;

my $foo = 42;
print $foo or die $!;

__END__

=pod

=head1 NAME

Some useless junk

=cut
EOF

    $file->spew($source);

    my %plugins = (
        PerlCritic => {
            argv   => '--gentle',
            select => '**/*.pl'
        },
        PerlTidy      => { select => '**/*.pl' },
        PerlTidySweet => { select => '**/*.pl' },
        PodChecker    => { select => '**/*.pl' },
        PodTidy       => { select => '**/*.pl' },
    );

    # No ispell on Windows
    $plugins{PodSpell} = { select => '**/*.pl' }
        unless $^O eq 'MSWin32';

    $self->tidyall(
        plugin_conf => \%plugins,
        source_file => $file,
        expect_ok   => 1,
    );
}

sub test_php_code_sniffer : Tests {
    my $self = shift;

    return unless $self->require_executable('php');
    return unless $self->require_executable('phpcs');

    my $file   = $self->_spaces_dir->child('foo bar.php');
    my $source = '<?php function foo() { $bar = 5 } ?>';
    $file->spew($source);

    $self->tidyall(
        plugin_conf => {
            PHPCodeSniffer => {
                argv   => '--severity=6',
                select => '**/*.php'
            },
        },
        source_file => $file,
        expect_ok   => 1,
    );
}

sub _spaces_dir {
    my $self = shift;

    return $self->{spaces_dir} ||= do {
        my $dir = $self->{root_dir}->child('has spaces');
        $dir->mkpath( { mode => 0755 } );
        $dir;
    };
}

1;