You are here

public function LocaleJavascriptTranslationTest::testFileParsing in Drupal 8

Same name and namespace in other branches
  1. 9 core/modules/locale/tests/src/Functional/LocaleJavascriptTranslationTest.php \Drupal\Tests\locale\Functional\LocaleJavascriptTranslationTest::testFileParsing()
  2. 10 core/modules/locale/tests/src/Functional/LocaleJavascriptTranslationTest.php \Drupal\Tests\locale\Functional\LocaleJavascriptTranslationTest::testFileParsing()

File

core/modules/locale/tests/src/Functional/LocaleJavascriptTranslationTest.php, line 29

Class

LocaleJavascriptTranslationTest
Tests parsing js files for translatable strings.

Namespace

Drupal\Tests\locale\Functional

Code

public function testFileParsing() {

  // This test is for ensuring that the regular expression in
  // _locale_parse_js_file() finds translatable source strings in all valid
  // JavaScript syntax regardless of the coding style used, especially with
  // respect to optional whitespace, line breaks, etc.
  // - We test locale_test.es6.js, because that is the one that contains a
  //   variety of whitespace styles.
  // - We also test the transpiled locale_test.js as an extra double-check
  //   that JavaScript transpilation doesn't change what
  //   _locale_parse_js_file() finds.
  $files[] = __DIR__ . '/../../locale_test.es6.js';
  $files[] = __DIR__ . '/../../locale_test.js';
  foreach ($files as $filename) {

    // Parse the file to look for source strings.
    _locale_parse_js_file($filename);

    // Get all of the source strings that were found.
    $strings = $this->container
      ->get('locale.storage')
      ->getStrings([
      'type' => 'javascript',
      'name' => $filename,
    ]);
    $source_strings = [];
    foreach ($strings as $string) {
      $source_strings[$string->source] = $string->context;
    }
    $etx = PoItem::DELIMITER;

    // List of all strings that should be in the file.
    $test_strings = [
      'Standard Call t' => '',
      'Whitespace Call t' => '',
      'Single Quote t' => '',
      "Single Quote \\'Escaped\\' t" => '',
      'Single Quote Concat strings t' => '',
      'Double Quote t' => '',
      "Double Quote \\\"Escaped\\\" t" => '',
      'Double Quote Concat strings t' => '',
      'Context !key Args t' => 'Context string',
      'Context Unquoted t' => 'Context string unquoted',
      'Context Single Quoted t' => 'Context string single quoted',
      'Context Double Quoted t' => 'Context string double quoted',
      "Standard Call plural{$etx}Standard Call @count plural" => '',
      "Whitespace Call plural{$etx}Whitespace Call @count plural" => '',
      "Single Quote plural{$etx}Single Quote @count plural" => '',
      "Single Quote \\'Escaped\\' plural{$etx}Single Quote \\'Escaped\\' @count plural" => '',
      "Double Quote plural{$etx}Double Quote @count plural" => '',
      "Double Quote \\\"Escaped\\\" plural{$etx}Double Quote \\\"Escaped\\\" @count plural" => '',
      "Context !key Args plural{$etx}Context !key Args @count plural" => 'Context string',
      "Context Unquoted plural{$etx}Context Unquoted @count plural" => 'Context string unquoted',
      "Context Single Quoted plural{$etx}Context Single Quoted @count plural" => 'Context string single quoted',
      "Context Double Quoted plural{$etx}Context Double Quoted @count plural" => 'Context string double quoted',
      "No count argument plural - singular{$etx}No count argument plural - plural" => '',
    ];

    // Assert that all strings were found properly.
    foreach ($test_strings as $str => $context) {
      $args = [
        '%source' => $str,
        '%context' => $context,
      ];

      // Make sure that the string was found in the file.
      $this
        ->assertTrue(isset($source_strings[$str]), new FormattableMarkup('Found source string: %source', $args));

      // Make sure that the proper context was matched.
      $message = $context ? new FormattableMarkup('Context for %source is %context', $args) : new FormattableMarkup('Context for %source is blank', $args);
      $this
        ->assertTrue(isset($source_strings[$str]) && $source_strings[$str] === $context, $message);
    }
    $this
      ->assertEqual(count($source_strings), count($test_strings), 'Found correct number of source strings.');
  }
}