# Copyright 2018 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Unit tests for translation_helper.py."""

import unittest
import os
import sys

import translation_helper

here = os.path.realpath(__file__)
testdata_path = os.path.normpath(os.path.join(here, '..', '..', 'testdata'))


class TcHelperTest(unittest.TestCase):
  def test_get_translatable_grds(self):
    grds = translation_helper.get_translatable_grds(
      testdata_path,
      ['test.grd', 'not_translated.grd', 'internal.grd'],
      os.path.join(
        testdata_path, 'translation_expectations_without_unlisted_file.pyl'
      ),
      False,
    )
    self.assertEqual(1, len(grds))

    # There should be no references to not_translated.grd (mentioning the
    # filename here so that it doesn't appear unused).
    grd = grds[0]
    self.assertEqual(os.path.join(testdata_path, 'test.grd'), grd.path)
    self.assertEqual(testdata_path, grd.dir)
    self.assertEqual('test.grd', grd.name)
    self.assertEqual([os.path.join(testdata_path, 'part.grdp')], grd.grdp_paths)
    self.assertEqual([], grd.structure_paths)
    self.assertEqual(
      [os.path.join(testdata_path, 'test_en-GB.xtb')], grd.xtb_paths
    )
    self.assertEqual(
      {'en-GB': os.path.join(testdata_path, 'test_en-GB.xtb')},
      grd.lang_to_xtb_path,
    )
    self.assertTrue(grd.appears_translatable)
    self.assertEqual(['en-GB'], grd.expected_languages)

  # The expectations list an untranslatable file (not_translated.grd), but the
  # grd list doesn't contain it.
  def test_missing_untranslatable(self):
    TRANSLATION_EXPECTATIONS = os.path.join(
      testdata_path, 'translation_expectations_without_unlisted_file.pyl'
    )
    with self.assertRaises(Exception) as context:
      translation_helper.get_translatable_grds(
        testdata_path,
        ['test.grd', 'internal.grd'],
        TRANSLATION_EXPECTATIONS,
        False,
      )
    self.assertEqual(
      '%s needs to be updated. Please fix these issues:\n'
      ' - not_translated.grd is listed in the translation expectations, '
      'but this grd file does not exist.' % TRANSLATION_EXPECTATIONS,
      str(context.exception),
    )

  def test_missing_untranslatable_cog(self):
    TRANSLATION_EXPECTATIONS = os.path.join(
      testdata_path, 'translation_expectations_with_nonextant_grd.pyl'
    )
    with self.assertRaises(Exception) as context:
      translation_helper.get_translatable_grds(
        testdata_path,
        # In cog, all_grd_paths is an empty list, and is generated from the
        # expectations file, filtering by whether the file exists.
        [],
        TRANSLATION_EXPECTATIONS,
        True,
      )
    self.assertEqual(
      '%s needs to be updated. Please fix these issues:\n'
      ' - does_not_exist.grd is listed in the translation expectations, '
      'but this grd file does not exist.' % TRANSLATION_EXPECTATIONS,
      str(context.exception),
    )

  # The expectations list an internal file (internal.grd), but the grd list
  # doesn't contain it.
  def test_missing_internal(self):
    TRANSLATION_EXPECTATIONS = os.path.join(
      testdata_path,
      'translation_expectations_without_unlisted_file.pyl',
    )
    with self.assertRaises(Exception) as context:
      translation_helper.get_translatable_grds(
        testdata_path,
        ['test.grd', 'not_translated.grd'],
        TRANSLATION_EXPECTATIONS,
        False,
      )
    self.assertEqual(
      '%s needs to be updated. Please fix these issues:\n'
      ' - internal.grd is listed in translation expectations as an internal '
      'file to be ignored, but this grd file does not exist.'
      % TRANSLATION_EXPECTATIONS,
      str(context.exception),
    )

  def test_missing_internal_cog(self):
    TRANSLATION_EXPECTATIONS = os.path.join(
      testdata_path, 'translation_expectations_with_nonextant_internal_grd.pyl'
    )
    with self.assertRaises(Exception) as context:
      translation_helper.get_translatable_grds(
        testdata_path,
        # In cog, all_grd_paths is an empty list, and is generated from the
        # expectations file, filtering by whether the file exists.
        [],
        TRANSLATION_EXPECTATIONS,
        True,
      )
    self.assertEqual(
      '%s needs to be updated. Please fix these issues:\n'
      ' - internal_does_not_exist.grd is listed in translation expectations '
      'as an internal file to be ignored, but this grd file does not exist.'
      % TRANSLATION_EXPECTATIONS,
      str(context.exception),
    )

  # TODO: Add Cog test.
  # The expectations list a translatable file (test.grd), but the grd list
  # doesn't contain it.
  def test_missing_translatable(self):
    TRANSLATION_EXPECTATIONS = os.path.join(
      testdata_path, 'translation_expectations_without_unlisted_file.pyl'
    )
    with self.assertRaises(Exception) as context:
      translation_helper.get_translatable_grds(
        testdata_path,
        ['not_translated.grd', 'internal.grd'],
        TRANSLATION_EXPECTATIONS,
        False,
      )
    self.assertEqual(
      '%s needs to be updated. Please fix these issues:\n'
      ' - test.grd is listed in the translation expectations, but this grd '
      'file does not exist.' % TRANSLATION_EXPECTATIONS,
      str(context.exception),
    )

  def test_missing_translatable_cog(self):
    TRANSLATION_EXPECTATIONS = os.path.join(
      testdata_path,
      'translation_expectations_with_nonextant_translatable_grd.pyl',
    )
    with self.assertRaises(Exception) as context:
      translation_helper.get_translatable_grds(
        testdata_path,
        # In cog, all_grd_paths is an empty list, and is generated from the
        # expectations file, filtering by whether the file exists.
        [],
        TRANSLATION_EXPECTATIONS,
        True,
      )
    self.assertEqual(
      '%s needs to be updated. Please fix these issues:\n'
      ' - translatable_does_not_exist.grd is listed in the translation '
      'expectations, but this grd file does not exist.'
      % TRANSLATION_EXPECTATIONS,
      str(context.exception),
    )

  # The grd list contains a file (part.grdp) that's not listed in translation
  # expectations.
  def test_expectations_not_updated(self):
    TRANSLATION_EXPECTATIONS = os.path.join(
      testdata_path, 'translation_expectations_without_unlisted_file.pyl'
    )
    with self.assertRaises(Exception) as context:
      translation_helper.get_translatable_grds(
        testdata_path,
        ['test.grd', 'part.grdp', 'not_translated.grd', 'internal.grd'],
        TRANSLATION_EXPECTATIONS,
        False,
      )
    self.assertEqual(
      '%s needs to be updated. Please fix these issues:\n'
      ' - part.grdp appears to be translatable (because it contains <file> '
      'or <message> elements), but is not listed in the translation '
      'expectations.' % TRANSLATION_EXPECTATIONS,
      str(context.exception),
    )


if __name__ == '__main__':
  unittest.main()
