#! /bin/sh
. "${srcdir=.}/init.sh"; path_prepend_ . ../src

# Test msgexec on a PO file with contexts.

# This test fails on mingw (in a Cygwin environment), due to the combination
# of two reasons:
# 1. The value of the environment variable MSGEXEC_MSGCTXT is stored
#    in UTF-8 encoding (i.e. the PO file's encoding); it should be stored
#    in the GetACP() encoding instead. This problem is inherent in msgexec,
#    and msgexec warns about it - but in this test, we filter the warnings
#    away.
# 2. The child process is Cygwin's sh.exe, and is affected by a Cygwin bug:
#    the values returned by getenv() in the child process, when the parent
#    process is a mingw program, are in the GetOEMCP() encoding (should be
#    in the GetACP() encoding). This has been reported at
#    <https://cygwin.com/ml/cygwin/2009-08/msg00430.html>.

cat <<\EOF > mex-test4.po
msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

#. A menu item
msgctxt "File|"
msgid "Open"
msgstr "Ouvrir"

#. A menu item
msgctxt "File|"
msgid "New"
msgstr "Nouveau"

#. Denote a lock's state
msgctxt "Lock state"
msgid "Open"
msgstr "Ouvert"

#. Denote a lock's state
msgctxt "Lock state"
msgid "Closed"
msgstr "Fermé"

#. A product
msgctxt "Audi"
msgid "car"
msgstr "voiture"

#. A product
msgctxt "Océ"
msgid "copier"
msgstr "photocopieur"

#~ msgid "Save As"
#~ msgstr "Enregistrer l'as"

#. A menu item
#~ msgctxt "File|"
#~ msgid "Save As"
#~ msgstr "Enregistrer sous"
EOF

cat <<\EOF > mex-test4.sh
#! /bin/sh
echo "========================= $MSGEXEC_LOCATION =========================" | LC_ALL=C tr -d '\r'
if test -n "${MSGEXEC_MSGCTXT+set}"; then
  echo "context: $MSGEXEC_MSGCTXT" | LC_ALL=C tr -d '\r'
fi
cat <<MEOF
$MSGEXEC_MSGID
---
MEOF
cat
echo | LC_ALL=C tr -d '\r'
exit 0
EOF
chmod a+x mex-test4.sh

: ${MSGEXEC=msgexec}
LC_ALL=C \
${MSGEXEC} -i mex-test4.po ./mex-test4.sh > mex-test4.out 2> mex-test4.err
result=$?
cat mex-test4.err | grep -v 'warning: Locale charset' | grep -v '^ '
test $result = 0 || { Exit 1; }

cat <<\EOF > mex-test4.ok
========================= mex-test4.po:2 =========================

---
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

========================= mex-test4.po:9 =========================
context: File|
Open
---
Ouvrir
========================= mex-test4.po:14 =========================
context: File|
New
---
Nouveau
========================= mex-test4.po:19 =========================
context: Lock state
Open
---
Ouvert
========================= mex-test4.po:24 =========================
context: Lock state
Closed
---
Fermé
========================= mex-test4.po:29 =========================
context: Audi
car
---
voiture
========================= mex-test4.po:34 =========================
context: Océ
copier
---
photocopieur
========================= mex-test4.po:37 =========================
Save As
---
Enregistrer l'as
========================= mex-test4.po:42 =========================
context: File|
Save As
---
Enregistrer sous
EOF

: ${DIFF=diff}
${DIFF} mex-test4.ok mex-test4.out
result=$?

exit $result
