The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl

use strict;
use warnings;
use utf8;

use Test::More tests => 23;

use Template::Flute;
use Template::Flute::I18N;

my %lexicon = (
               "Enter your username..." => "Inserisci il nome utente...",
               "Submit result" => "Invia i risultati",
               "Title" => "Titolo",
               "Do-not-translate" => "FAIL",
              );

sub translate {
    my $text = shift;
    return $lexicon{$text};
};

my $i18n = Template::Flute::I18N->new(\&translate);
my $spec = '<specification></specification>';
my $template =<<HTML;
<html>
<body>
<div>
<h3>Title</h3>
<input placeholder=" Enter your username... ">
<input type="submit" data-role="button" data-icon="arrow-r"
         data-iconpos="right" data-iconpos="" data-theme="b"
         value=" Submit result">
<input type="hidden" name="blabla" value="Do-not-translate">
</div>
</body>
</html>
HTML

my $flute = Template::Flute->new(specification => $spec,
                                 template => $template,
                                 i18n => $i18n);
my $output = $flute->process();

like $output, qr/Titolo/, "Title translated";
like $output, qr/value=" Invia i risultati"/, "input submit translated";
like $output, qr/placeholder=" Inserisci il nome utente... "/,
  "placeholder translated";
like $output, qr/value="Do-not-translate"/, "hidden input preserved";

$flute = Template::Flute->new(specification => $spec,
                              template => $template,
                              translate_attributes => [],
                              i18n => $i18n);

$output = $flute->process;

like $output, qr/Titolo/, "Title translated";
unlike $output, qr/value=" Invia i risultati"/, "input submit not translated";
like $output, qr/value=" Submit result"/, "input submit not translated";
unlike $output, qr/placeholder=" Inserisci il nome utente... "/,
  "placeholder not translated";
like $output, qr/placeholder=" Enter your username\.\.\. "/,
  "placeholder not translated";
like $output, qr/value="Do-not-translate"/, "hidden input preserved";

$template =<<HTML;
<html>
<body>
<div>
<h3>Title</h3>
<input placeholder=" Enter your username... ">
<input type="submit" data-role="button" data-icon="arrow-r"
         data-iconpos="right" data-iconpos="" data-theme="b"
         value=" Submit result">
<input type="hidden" name="blabla" value="Do-not-translate">
<input type="submit" name="blabla" value="Do-not-translate">
<input value="Do-not-translate">
</div>
<p placeholder="Title">Title</p>
</body>
</html>
HTML


$flute = Template::Flute->new(specification => $spec,
                              template => $template,
                              translate_attributes => [qw/placeholder
                                                          input.value.type.hidden
                                                         /],
                              i18n => $i18n);

$output = $flute->process;

like $output, qr/Titolo/, "Title translated";
unlike $output, qr/value=" Invia i risultati"/, "input submit not translated";
like $output, qr/value=" Submit result"/, "input submit not translated";
like $output, qr/<input[^>]*placeholder=" Inserisci il nome utente\.\.\. "/,
  "placeholder translated";
like $output, qr/value="FAIL"/, "hidden input translated";
like $output, qr{<p placeholder="Titolo">Titolo</p>}, "Other placeholder translated as well";
like $output, qr{<input name="blabla" type="hidden" value="FAIL" />}, "input.value.type.hidden ok";
like $output, qr{<input name="blabla" type="submit" value="Do-not-translate" />}, "input.submit not translated";
like $output, qr{<input value="Do-not-translate" />}, "input not translated";


$flute = Template::Flute->new(specification => $spec,
                              template => $template,
                              translate_attributes => [qw/placeholder
                                                          input.value
                                                         /],
                              i18n => $i18n);

$output = $flute->process;

like $output, qr/value=" Invia i risultati"/, "input.value translated";
like $output, qr{<input name="blabla" type="hidden" value="FAIL" />}, "input.value.type.hidden ok";
like $output, qr{<input name="blabla" type="submit" value="FAIL" />}, "input.submit ok";
like $output, qr{<input value="FAIL" />}, "input translated";