1#!/usr/local/bin/perl
2use 5.008;
3use lib (split(/:/, $ENV{GITPERLLIB}));
4use strict;
5use warnings;
6use POSIX qw(:locale_h);
7use Test::More tests => 13;
8use Git::I18N;
9
10my $has_gettext_library = $Git::I18N::__HAS_LIBRARY;
11
12ok(1, "Testing Git::I18N with " .
13	 ($has_gettext_library
14	  ? (defined $Locale::Messages::VERSION
15		 ? "Locale::Messages version $Locale::Messages::VERSION"
16		 # Versions of Locale::Messages before 1.17 didn't have a
17		 # $VERSION variable.
18		 : "Locale::Messages version <1.17")
19	  : "NO Perl gettext library"));
20ok(1, "Git::I18N is located at $INC{'Git/I18N.pm'}");
21
22{
23	my $exports = @Git::I18N::EXPORT;
24	ok($exports, "sanity: Git::I18N has $exports export(s)");
25}
26is_deeply(\@Git::I18N::EXPORT, \@Git::I18N::EXPORT_OK, "sanity: Git::I18N exports everything by default");
27
28# prototypes
29{
30	# Add prototypes here when modifying the public interface to add
31	# more gettext wrapper functions.
32	my %prototypes = (qw(
33		__	$
34		__n	$$$
35		N__	$
36	));
37	while (my ($sub, $proto) = each %prototypes) {
38		is(prototype(\&{"Git::I18N::$sub"}), $proto, "sanity: $sub has a $proto prototype");
39	}
40}
41
42# Test basic passthrough in the C locale
43{
44	local $ENV{LANGUAGE} = 'C';
45	local $ENV{LC_ALL}   = 'C';
46	local $ENV{LANG}     = 'C';
47
48	my ($got, $expect) = (('TEST: A Perl test string') x 2);
49
50	is(__($got), $expect, "Passing a string through __() in the C locale works");
51
52	my ($got_singular, $got_plural, $expect_singular, $expect_plural) =
53		(('TEST: 1 file', 'TEST: n files') x 2);
54
55	is(__n($got_singular, $got_plural, 1), $expect_singular,
56		"Get singular string through __n() in C locale");
57	is(__n($got_singular, $got_plural, 2), $expect_plural,
58		"Get plural string through __n() in C locale");
59
60	is(N__($got), $expect, "Passing a string through N__() in the C locale works");
61}
62
63# Test a basic message on different locales
64SKIP: {
65	unless ($ENV{GETTEXT_LOCALE}) {
66		# Can't reliably test __() with a non-C locales because the
67		# required locales may not be installed on the system.
68		#
69		# We test for these anyway as part of the shell
70		# tests. Skipping these here will eliminate failures on odd
71		# platforms with incomplete locale data.
72
73		skip "GETTEXT_LOCALE must be set by lib-gettext.sh for exhaustive Git::I18N tests", 2;
74	}
75
76	# The is_IS UTF-8 locale passed from lib-gettext.sh
77	my $is_IS_locale = $ENV{is_IS_locale};
78
79	my $test = sub {
80		my ($got, $expect, $msg, $locale) = @_;
81		# Maybe this system doesn't have the locale we're trying to
82		# test.
83		my $locale_ok = setlocale(LC_ALL, $locale);
84		is(__($got), $expect, "$msg a gettext library + <$locale> locale <$got> turns into <$expect>");
85	};
86
87	my $env_C = sub {
88		$ENV{LANGUAGE} = 'C';
89		$ENV{LC_ALL}   = 'C';
90	};
91
92	my $env_is = sub {
93		$ENV{LANGUAGE} = 'is';
94		$ENV{LC_ALL}   = $is_IS_locale;
95	};
96
97	# Translation's the same as the original
98	my ($got, $expect) = (('TEST: A Perl test string') x 2);
99
100	if ($has_gettext_library) {
101		{
102			local %ENV; $env_C->();
103			$test->($got, $expect, "With", 'C');
104		}
105
106		{
107			my ($got, $expect) = ($got, 'TILRAUN: Perl tilraunastrengur');
108			local %ENV; $env_is->();
109			$test->($got, $expect, "With", $is_IS_locale);
110		}
111	} else {
112		{
113			local %ENV; $env_C->();
114			$test->($got, $expect, "Without", 'C');
115		}
116
117		{
118			local %ENV; $env_is->();
119			$test->($got, $expect, "Without", 'is');
120		}
121	}
122}
123