package tests::I18NTest; use strict; use base qw/ Lire::Test::TestCase tests::TestStoreFixture /; use Lire::I18N qw/ set_fh_encoding ensure_utf8 ensure_local_codeset local_codeset mark_unicode dgettext dgettext_para /; use File::Temp qw/ tempfile /; use Config; use POSIX qw/ setlocale LC_MESSAGES LC_CTYPE /; use Lire::Utils qw/file_content/; sub new { my $self = shift()->SUPER::new( @_ ); $self->init(); $self->init_i18n(); eval { require 5.8.0; die "no PerlIO" unless $Config{'useperlio'}; require Encode; Encode->import( qw/ is_utf8 _utf8_off / ); }; $self->{'encode_support'} = ! $@; $self->{'latin1str'} = 'test accentué'; $self->{'utf8str'} = 'test accentué'; return $self; } sub set_up { my $self = shift->SUPER::set_up(); $self->{'_old_ctypes'} = setlocale( LC_CTYPE ); $self->set_up_locale(); setlocale( LC_CTYPE, 'fr_CA.ISO-8859-1' ); ( $self->{'tmp_fh'}, $self->{'tmp_filename'} ) = tempfile(); return $self; } sub tear_down { my $self = shift->SUPER::tear_down(); $self->tear_down_locale(); unlink( $self->{'tmp_filename'} ); setlocale( LC_CTYPE, $self->{'_old_ctypes'} ) if $self->{'_old_ctypes'}; return $self; } sub test_USE_ENCODING { my $self = $_[0]; $self->assert_equals( $self->{'encode_support'}, $Lire::I18N::USE_ENCODING ); } sub test_set_fh_encoding { my $self = $_[0]; return unless $self->{'encode_support'}; my $fh = $self->{'tmp_fh'}; $self->assert_died( sub { set_fh_encoding() }, qr/missing 'fh' parameter/ ); $self->assert_died( sub { set_fh_encoding( $fh ) }, qr/missing 'encoding' parameter/ ); { local $SIG{__WARN__} = sub { $self->annotate( $@ ) }; $self->assert_died( sub { set_fh_encoding( $fh, 'wawa' ) }, qr/error setting encoding on FH:/ ); } set_fh_encoding( $fh, 'utf8' ); print $fh $self->{'latin1str'}; close $fh; $self->assert_str_equals( $self->{'utf8str'}, file_content( $self->{'tmp_filename'} ) ); setlocale( LC_CTYPE, 'fr_CA.utf-8' ); open( $fh, "> $self->{'tmp_filename'}" ) or $self->error( "can't write to write $self->{'tmp_filename'}: $!" ); set_fh_encoding( $fh, 'utf8' ); print $fh $self->{'utf8str'}; close $fh; $self->assert_str_equals( $self->{'utf8str'}, file_content( $self->{'tmp_filename'} ) ); } sub test_local_codset { my $self = $_[0]; $self->assert_str_equals( 'iso-8859-1', local_codeset() ); setlocale( LC_CTYPE, 'fr_CA.UTF8' ); $self->assert_str_equals( 'utf8', local_codeset() ); } sub test_set_fh_encoding_no_support { my $self = $_[0]; local $Lire::I18N::USE_ENCODING = 0; my $fh = $self->{'tmp_fh'}; set_fh_encoding( $fh, 'utf8' ); print $fh $self->{'latin1str'}; close $fh; $self->assert_str_equals( $self->{'latin1str'}, file_content( $self->{'tmp_filename'} ) ); } sub test_ensure_utf8 { my $self = $_[0]; return unless $self->{'encode_support'}; my $iso_string = ensure_utf8( "cha\x{ee}ne iso accentu\x{e9}e" ); my $uni_string = ensure_utf8( "unicode string: \x{0100} (A bar)" ); $self->assert( is_utf8( $iso_string ), "\$iso_string not marked as utf-8" ); $self->assert( is_utf8( $uni_string ), "\$uni_string not marked as utf-8" ); _utf8_off( $iso_string ); $self->assert_str_equals( "cha\x{c3}\x{ae}ne iso accentu\x{c3}\x{a9}e", $iso_string ); _utf8_off( $uni_string ); $self->assert_str_equals( "unicode string: \x{c4}\x{80} (A bar)", $uni_string ); setlocale( LC_CTYPE, 'fr_CA.UTF-8' ); my $string = ensure_utf8( $self->{'utf8str'} ); $self->assert( is_utf8( $string ), 'string should be utf8' ); _utf8_off( $string ); $self->assert_str_equals( $self->{'utf8str'}, $string ); } sub test_ensure_utf8_no_support { my $self = $_[0]; local $Lire::I18N::USE_ENCODING = 0; my @warnings =(); local $SIG{__WARN__} = sub { push @warnings, @_ }; $self->assert_null( ensure_utf8( undef ), "ensure_utf8( undef) returned non-undef" ); $self->annotate( join( "\n", @warnings) ); $self->assert_equals( 0, scalar @warnings ); my $iso_string = ensure_utf8( "cha\x{ee}ne iso accentu\x{e9}e" ); my $uni_string = ensure_utf8( "unicode string: \x{0100} (A bar)" ); $self->assert_str_equals( "Eacute: ?", ensure_utf8( "Eacute: \xe9" ) ); $self->assert_str_equals( "cha?ne iso accentu?e", $iso_string ); $self->assert_str_equals( "unicode string: ? (A bar)", $uni_string ); } sub test_ensure_local_codeset { my $self = $_[0]; return unless $self->{'encode_support'}; my $uni_string = ensure_utf8( "Caractères accentués." ); $self->assert( is_utf8( $uni_string ), "\$uni_string not marked as utf-8" ); $self->assert_str_equals( "Caractères accentués.", $uni_string ); my $s = ensure_local_codeset( $uni_string ); $self->assert( !is_utf8( $s ), "\$s marked as utf-8" ); $self->assert_str_equals( "Caractères accentués.", $s ); $s = ensure_local_codeset( $s ); $self->assert_str_equals( "Caractères accentués.", $s ); } sub test_dgettext { my $self = $_[0]; return unless $self->{'encode_support'}; my $uni_string = ensure_utf8( "Caractères accentués." ); my $s = dgettext( 'lire-test', $uni_string ); $self->assert_str_equals( "Caractères accentués.", $s ); } sub test_mark_unicode { my $self = $_[0]; return unless $self->{'encode_support'}; my $byte_string = "cha\x{c3}\x{ae}ne iso accentu\x{c3}\x{a9}e"; $self->assert( !is_utf8( $byte_string ), "\$byte_string marked as utf-8" ); my $uni_string = mark_unicode( $byte_string ); $self->assert( is_utf8( $uni_string ), "\$byte_string not marked as utf-8" ); $self->assert_str_equals( "cha\x{ee}ne iso accentu\x{e9}e", $uni_string ); } sub test_mark_unicode_no_support { my $self = $_[0]; local $Lire::I18N::USE_ENCODING = 0; my $byte_string = "cha\x{c3}\x{ae}ne iso accentu\x{c3}\x{a9}e"; # 22 bytes, 20 characters $self->assert_equals( 22, length( $byte_string) ); my $uni_string = mark_unicode( $byte_string ); $self->assert_str_equals( $byte_string, $uni_string ); } sub test_dgettext_para { my $self = $_[0]; no warnings 'redefine'; my $domain; my $string; my $old_dgettext = \&Lire::I18N::dgettext; my $dgettext = sub { $domain = shift; $string = "@_"; return $old_dgettext->( $domain, $string ); }; local *Lire::I18N::dgettext = $dgettext; $self->assert_null( dgettext_para( 'lire-test', undef ) , 'dgettext_para should have returned undef' ); $self->assert_str_equals( ' JPEG Files', dgettext_para( 'lire-test', ' JPEG Files' ) ); $self->assert_str_equals( "JPEG Files", dgettext_para( 'lire-test', "JPEG Files" ) ); $self->assert_str_equals( "\n Connection identifier.\n \n ", dgettext_para( 'lire-test', "\n Connection identifier.\n \n ", ) ); setlocale( LC_MESSAGES, 'fr_CA.iso8859-1' ); dgettext_para( 'lire-test', " Wawa files \n" ); $self->assert_str_equals( 'Wawa files', $string ); $self->assert_str_equals( "\n Fichiers JPEG \n", dgettext_para( 'lire-test', "\n JPEG Files \n" ) ); $self->assert_str_equals( "Fichiers JPEG", dgettext_para( 'lire-test', "JPEG Files" ) ); return; } 1;