xref: /netbsd-src/external/gpl2/gettext/dist/gettext-tools/tests/format-scheme-2 (revision 946379e7b37692fc43f68eb0d1c10daa0a7f3b6c)
1*946379e7Schristos#! /bin/sh
2*946379e7Schristos
3*946379e7Schristos# Test checking of Lisp format strings.
4*946379e7Schristos
5*946379e7Schristostmpfiles=""
6*946379e7Schristostrap 'rm -fr $tmpfiles' 1 2 3 15
7*946379e7Schristos
8*946379e7Schristostmpfiles="$tmpfiles f-sc-2.data"
9*946379e7Schristoscat <<\EOF > f-sc-2.data
10*946379e7Schristos# Valid: ~~ doesn't count
11*946379e7Schristosmsgid  "abc~~def"
12*946379e7Schristosmsgstr "xyz"
13*946379e7Schristos# Invalid: invalid msgstr
14*946379e7Schristosmsgid  "abc~~def"
15*946379e7Schristosmsgstr "xyz~"
16*946379e7Schristos# Valid: ~! doesn't count
17*946379e7Schristosmsgid  "abc~!def"
18*946379e7Schristosmsgstr "xyz"
19*946379e7Schristos# Valid: ~Q doesn't count
20*946379e7Schristosmsgid  "abc~Qdef"
21*946379e7Schristosmsgstr "xyz"
22*946379e7Schristos# Valid: same argument
23*946379e7Schristosmsgid  "abc~Ddef"
24*946379e7Schristosmsgstr "xyz~D"
25*946379e7Schristos# Valid: same arguments
26*946379e7Schristosmsgid  "abc~1000000@*~Ddef"
27*946379e7Schristosmsgstr "~1000000@*xyz~D"
28*946379e7Schristos# Valid: permutation
29*946379e7Schristosmsgid  "abc~D~C~Fdef"
30*946379e7Schristosmsgstr "xyz~2@*~F~2:*~C~2:*~D"
31*946379e7Schristos# Invalid: too few arguments
32*946379e7Schristosmsgid  "abc~1@*~Sdef~0@*~S"
33*946379e7Schristosmsgstr "xyz~S"
34*946379e7Schristos# Invalid: too many arguments
35*946379e7Schristosmsgid  "abc~Ddef"
36*946379e7Schristosmsgstr "xyz~Duvw~C"
37*946379e7Schristos# Invalid: missing non-final argument
38*946379e7Schristosmsgid  "abc~1@*~Sdef~0@*~F"
39*946379e7Schristosmsgstr "xyz~1@*~S"
40*946379e7Schristos# Invalid: added non-final argument
41*946379e7Schristosmsgid  "abc~1@*~Ddef"
42*946379e7Schristosmsgstr "xyz~F~D"
43*946379e7Schristos# Valid: formatting variations
44*946379e7Schristosmsgid  "abc~Sdef"
45*946379e7Schristosmsgstr "xyz~:S"
46*946379e7Schristos# Valid: formatting variations
47*946379e7Schristosmsgid  "abc~4Sdef"
48*946379e7Schristosmsgstr "xyz~7S"
49*946379e7Schristos# Valid: type compatibility
50*946379e7Schristosmsgid  "abc~Sdef"
51*946379e7Schristosmsgstr "xyz~Y"
52*946379e7Schristos# Valid: type compatibility
53*946379e7Schristosmsgid  "abc~Ddef"
54*946379e7Schristosmsgstr "xyz~B"
55*946379e7Schristos# Valid: type compatibility
56*946379e7Schristosmsgid  "abc~Ddef"
57*946379e7Schristosmsgstr "xyz~O"
58*946379e7Schristos# Valid: type compatibility
59*946379e7Schristosmsgid  "abc~Ddef"
60*946379e7Schristosmsgstr "xyz~X"
61*946379e7Schristos# Valid: type compatibility
62*946379e7Schristosmsgid  "abc~Ddef"
63*946379e7Schristosmsgstr "xyz~R"
64*946379e7Schristos# Valid: optional plural
65*946379e7Schristosmsgid  "~D egg~:P"
66*946379e7Schristosmsgstr "~D Eier"
67*946379e7Schristos# Valid: type compatibility
68*946379e7Schristosmsgid  "abc~Fdef"
69*946379e7Schristosmsgstr "xyz~E"
70*946379e7Schristos# Valid: type compatibility
71*946379e7Schristosmsgid  "abc~Fdef"
72*946379e7Schristosmsgstr "xyz~G"
73*946379e7Schristos# Valid: type compatibility
74*946379e7Schristosmsgid  "abc~Fdef"
75*946379e7Schristosmsgstr "xyz~$"
76*946379e7Schristos# Invalid: type incompatibility
77*946379e7Schristosmsgid  "abc~Fdef"
78*946379e7Schristosmsgstr "xyz~D"
79*946379e7Schristos# Invalid: type incompatibility
80*946379e7Schristosmsgid  "abc~Ddef"
81*946379e7Schristosmsgstr "xyz~C"
82*946379e7Schristos# Invalid: type incompatibility
83*946379e7Schristosmsgid  "abc~Fdef"
84*946379e7Schristosmsgstr "xyz~C"
85*946379e7Schristos# Invalid: type incompatibility
86*946379e7Schristosmsgid  "abc~Sdef"
87*946379e7Schristosmsgstr "xyz~D"
88*946379e7Schristos# Invalid: type incompatibility
89*946379e7Schristosmsgid  "abc~Sdef"
90*946379e7Schristosmsgstr "xyz~F"
91*946379e7Schristos# Invalid: type incompatibility
92*946379e7Schristosmsgid  "abc~Sdef"
93*946379e7Schristosmsgstr "xyz~C"
94*946379e7Schristos# Invalid: type incompatibility
95*946379e7Schristosmsgid  "abc~Fdef"
96*946379e7Schristosmsgstr "xyz~I"
97*946379e7Schristos# Invalid: type incompatibility
98*946379e7Schristosmsgid  "abc~Ddef"
99*946379e7Schristosmsgstr "xyz~I"
100*946379e7Schristos# Invalid: type incompatibility
101*946379e7Schristosmsgid  "abc~Sdef"
102*946379e7Schristosmsgstr "xyz~I"
103*946379e7Schristos# Invalid: type incompatibility
104*946379e7Schristosmsgid  "abc~Cdef"
105*946379e7Schristosmsgstr "xyz~I"
106*946379e7Schristos# Valid: extra formatting
107*946379e7Schristosmsgid  "abc~Ddef~S"
108*946379e7Schristosmsgstr "xyz~D~_d~/ef~%~S"
109*946379e7Schristos# Valid: extra force-output
110*946379e7Schristosmsgid  "abc~Ddef~S"
111*946379e7Schristosmsgstr "xyz~Ddef~S~!"
112*946379e7Schristos# Valid: FORMAT-GOTO doesn't consume an argument by itself
113*946379e7Schristosmsgid  "abc~5@*~Ddef~C"
114*946379e7Schristosmsgstr "xyz~6@*~C~2@*uvw~5@*~R"
115*946379e7Schristos# Valid: ~? and ~K are equivalent
116*946379e7Schristosmsgid  "abc~?"
117*946379e7Schristosmsgstr "xyz~K"
118*946379e7Schristos# Invalid: @ matters
119*946379e7Schristosmsgid  "abc~?"
120*946379e7Schristosmsgstr "xyz~@?"
121*946379e7Schristos# Valid: case conversion is optional
122*946379e7Schristosmsgid  "abc~(~S~)"
123*946379e7Schristosmsgstr "xyz~S"
124*946379e7Schristos# Valid: case conversion is optional
125*946379e7Schristosmsgid  "abc~(~D~^ ~D~)"
126*946379e7Schristosmsgstr "xyz~D~^ ~D"
127*946379e7Schristos# Invalid: ~^ matters
128*946379e7Schristosmsgid  "abc~(~D~^ ~D~)"
129*946379e7Schristosmsgstr "xyz~(~D ~D~)"
130*946379e7Schristos# Valid: case conversion is optional, and it doesn't catch ~^
131*946379e7Schristosmsgid  "abc~(~D~^ ~D~)def~C"
132*946379e7Schristosmsgstr "xyz~D~^ ~Duvw~C"
133*946379e7Schristos# Valid: synonymous conditionals
134*946379e7Schristosmsgid  "abc~@[~D~]def~C"
135*946379e7Schristosmsgstr "xyz~:[~;~:*~D~]~C"
136*946379e7Schristos# Valid: synonymous conditionals
137*946379e7Schristosmsgid  "abc~Ddef"
138*946379e7Schristosmsgstr "abc~[null~;eins~:;~:*~D~]def"
139*946379e7Schristos# Valid: conditionals are optional and don't catch ~^
140*946379e7Schristosmsgid  "abc~:[~;~]~^~D~C"
141*946379e7Schristosmsgstr "xyz~:[uvw~^~R~;~:*~S~^~D~]~C"
142*946379e7Schristos# Invalid: ~:[ requires an argument, ~1@* doesn't
143*946379e7Schristosmsgid  "abc~1@*~^~D~C"
144*946379e7Schristosmsgstr "xyz~:[uvw~^~R~;~:*~S~^~D~]~C"
145*946379e7Schristos# Invalid: ~{~} is special
146*946379e7Schristosmsgid  "abc~{ ~}"
147*946379e7Schristosmsgstr "xyz~{~}"
148*946379e7Schristos# Invalid: @ matters
149*946379e7Schristosmsgid  "abc~{~S~}"
150*946379e7Schristosmsgstr "xyz~@{~S~}"
151*946379e7Schristos# Invalid: @ matters
152*946379e7Schristosmsgid  "abc~:{~S~}"
153*946379e7Schristosmsgstr "xyz~@:{~S~}"
154*946379e7Schristos# Invalid: : matters
155*946379e7Schristosmsgid  "abc~{~S~}"
156*946379e7Schristosmsgstr "xyz~:{~S~}"
157*946379e7Schristos# Invalid: : matters
158*946379e7Schristosmsgid  "abc~@{~S~}"
159*946379e7Schristosmsgstr "xyz~@:{~S~}"
160*946379e7Schristos# Invalid: @: matters
161*946379e7Schristosmsgid  "abc~{~S~}"
162*946379e7Schristosmsgstr "xyz~@:{~S~}"
163*946379e7Schristos# Valid: permutation inside iteration
164*946379e7Schristosmsgid  "abc~{~D ~C~}"
165*946379e7Schristosmsgstr "xyz~{~1@*~C~2:*~D~1*~}"
166*946379e7Schristos# Invalid: permutation inside iteration, but wrong position at iteration end
167*946379e7Schristosmsgid  "abc~{~D ~C~}"
168*946379e7Schristosmsgstr "xyz~{~1@*~C~2:*~D~}"
169*946379e7Schristos# Invalid: ~^ inside iteration matters
170*946379e7Schristosmsgid  "abc~{~D ~^~C~}"
171*946379e7Schristosmsgstr "xyz~{~D ~C~}"
172*946379e7Schristos# Invalid: ~^ inside iteration depends on position
173*946379e7Schristosmsgid  "abc~{~D ~^~C~}"
174*946379e7Schristosmsgstr "xyz~{~1@*~C~^~2:*~D~1*~}"
175*946379e7Schristos# Invalid: ~^ inside iteration depends on position
176*946379e7Schristosmsgid  "abc~{~D ~^~C~}"
177*946379e7Schristosmsgstr "xyz~{~1@*~C~2:*~^~D~1*~}"
178*946379e7Schristos# Invalid: ~^ inside iteration depends on position
179*946379e7Schristosmsgid  "abc~{~D ~^~C~}"
180*946379e7Schristosmsgstr "xyz~{~1@*~C~2:*~D~^~1*~}"
181*946379e7Schristos# Invalid: ~^ inside iteration depends on position
182*946379e7Schristosmsgid  "abc~{~D ~^~C~}"
183*946379e7Schristosmsgstr "xyz~{~1@*~C~2:*~D~1*~^~}"
184*946379e7SchristosEOF
185*946379e7Schristos
186*946379e7Schristos: ${MSGFMT=msgfmt}
187*946379e7Schristosn=0
188*946379e7Schristoswhile read comment; do
189*946379e7Schristos  read msgid_line
190*946379e7Schristos  read msgstr_line
191*946379e7Schristos  n=`expr $n + 1`
192*946379e7Schristos  tmpfiles="$tmpfiles f-sc-2-$n.po f-sc-2-$n.mo"
193*946379e7Schristos  cat <<EOF > f-sc-2-$n.po
194*946379e7Schristos#, scheme-format
195*946379e7Schristos${msgid_line}
196*946379e7Schristos${msgstr_line}
197*946379e7SchristosEOF
198*946379e7Schristos  fail=
199*946379e7Schristos  if echo "$comment" | grep 'Valid:' > /dev/null; then
200*946379e7Schristos    if ${MSGFMT} --check-format -o f-sc-2-$n.mo f-sc-2-$n.po; then
201*946379e7Schristos      :
202*946379e7Schristos    else
203*946379e7Schristos      fail=yes
204*946379e7Schristos    fi
205*946379e7Schristos  else
206*946379e7Schristos    ${MSGFMT} --check-format -o f-sc-2-$n.mo f-sc-2-$n.po 2> /dev/null
207*946379e7Schristos    if test $? = 1; then
208*946379e7Schristos      :
209*946379e7Schristos    else
210*946379e7Schristos      fail=yes
211*946379e7Schristos    fi
212*946379e7Schristos  fi
213*946379e7Schristos  if test -n "$fail"; then
214*946379e7Schristos    echo "Format string checking error:" 1>&2
215*946379e7Schristos    cat f-sc-2-$n.po 1>&2
216*946379e7Schristos    exit 1
217*946379e7Schristos  fi
218*946379e7Schristos  rm -f f-sc-2-$n.po f-sc-2-$n.mo
219*946379e7Schristosdone < f-sc-2.data
220*946379e7Schristos
221*946379e7Schristosrm -fr $tmpfiles
222*946379e7Schristos
223*946379e7Schristosexit 0
224