// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'dart:async';

import 'package:file/file.dart';

import '../src/common.dart';
import 'test_data/gen_l10n_project.dart';
import 'test_driver.dart';
import 'test_utils.dart';

final GenL10nProject project = GenL10nProject();

// Verify that the code generated by gen_l10n executes correctly.
// It can fail if gen_l10n produces a lib/l10n/app_localizations.dart that:
// - Does not analyze cleanly.
// - Can't be processed by the intl_translation:generate_from_arb tool.
// The generate_from_arb step can take close to a minute on a lightly
// loaded workstation, so the test could time out on a heavily loaded bot.
void main() {
  Directory tempDir;
  FlutterRunTestDriver flutter;

  setUp(() async {
    tempDir = createResolvedTempDirectorySync('gen_l10n_test.');
  });

  tearDown(() async {
    await flutter.stop();
    tryToDelete(tempDir);
  });

  Future<StringBuffer> runApp() async {
    // Run the app defined in GenL10nProject.main and wait for it to
    // send '#l10n END' to its stdout.
    final Completer<void> l10nEnd = Completer<void>();
    final StringBuffer stdout = StringBuffer();
    final StreamSubscription<String> subscription = flutter.stdout.listen((String line) {
      if (line.contains('#l10n')) {
        stdout.writeln(line.substring(line.indexOf('#l10n')));
      }
      if (line.contains('#l10n END')) {
        l10nEnd.complete();
      }
    });
    await flutter.run();
    await l10nEnd.future;
    await subscription.cancel();
    return stdout;
  }

  void expectOutput(StringBuffer stdout) {
    expect(stdout.toString(),
      '#l10n 0 (--- supportedLocales tests ---)\n'
      '#l10n 1 (supportedLocales[0]: languageCode: en, countryCode: null, scriptCode: null)\n'
      '#l10n 2 (supportedLocales[1]: languageCode: en, countryCode: CA, scriptCode: null)\n'
      '#l10n 3 (supportedLocales[2]: languageCode: en, countryCode: GB, scriptCode: null)\n'
      '#l10n 4 (supportedLocales[3]: languageCode: es, countryCode: null, scriptCode: null)\n'
      '#l10n 5 (supportedLocales[4]: languageCode: es, countryCode: 419, scriptCode: null)\n'
      '#l10n 6 (supportedLocales[5]: languageCode: zh, countryCode: null, scriptCode: null)\n'
      '#l10n 7 (supportedLocales[6]: languageCode: zh, countryCode: null, scriptCode: Hans)\n'
      '#l10n 8 (supportedLocales[7]: languageCode: zh, countryCode: null, scriptCode: Hant)\n'
      '#l10n 9 (supportedLocales[8]: languageCode: zh, countryCode: TW, scriptCode: Hant)\n'
      '#l10n 10 (--- countryCode (en_CA) tests ---)\n'
      '#l10n 11 (CA Hello World)\n'
      '#l10n 12 (Hello CA fallback World)\n'
      '#l10n 13 (--- countryCode (en_GB) tests ---)\n'
      '#l10n 14 (GB Hello World)\n'
      '#l10n 15 (Hello GB fallback World)\n'
      '#l10n 16 (--- zh ---)\n'
      '#l10n 17 (你好世界)\n'
      '#l10n 18 (你好)\n'
      '#l10n 19 (你好世界)\n'
      '#l10n 20 (你好2个其他世界)\n'
      '#l10n 21 (Hello 世界)\n'
      '#l10n 22 (--- scriptCode: zh_Hans ---)\n'
      '#l10n 23 (简体你好世界)\n'
      '#l10n 24 (--- scriptCode - zh_Hant ---)\n'
      '#l10n 25 (繁體你好世界)\n'
      '#l10n 26 (--- scriptCode - zh_Hant_TW ---)\n'
      '#l10n 27 (台灣繁體你好世界)\n'
      '#l10n 28 (--- General formatting tests ---)\n'
      '#l10n 29 (Hello World)\n'
      '#l10n 30 (Hello _NEWLINE_ World)\n'
      '#l10n 31 (Hello World)\n'
      '#l10n 32 (Hello World)\n'
      '#l10n 33 (Hello World on Friday, January 1, 1960)\n'
      '#l10n 34 (Hello world argument on 1/1/1960 at 00:00)\n'
      '#l10n 35 (Hello World from 1960 to 2020)\n'
      '#l10n 36 (Hello for 123)\n'
      '#l10n 37 (Hello for price USD123.00)\n'
      '#l10n 38 (Hello)\n'
      '#l10n 39 (Hello World)\n'
      '#l10n 40 (Hello two worlds)\n'
      '#l10n 41 (Hello)\n'
      '#l10n 42 (Hello new World)\n'
      '#l10n 43 (Hello two new worlds)\n'
      '#l10n 44 (Hello on Friday, January 1, 1960)\n'
      '#l10n 45 (Hello World, on Friday, January 1, 1960)\n'
      '#l10n 46 (Hello two worlds, on Friday, January 1, 1960)\n'
      '#l10n 47 (Hello other 0 worlds, with a total of 100 citizens)\n'
      '#l10n 48 (Hello World of 101 citizens)\n'
      '#l10n 49 (Hello two worlds with 102 total citizens)\n'
      '#l10n 50 ([Hello] -World- #123#)\n'
      '#l10n 51 (\$!)\n'
      '#l10n 52 (One \$)\n'
      '#l10n 53 (Flutter\'s amazing!)\n'
      '#l10n 54 (Flutter\'s amazing, times 2!)\n'
      '#l10n 55 (Flutter is "amazing"!)\n'
      '#l10n 56 (Flutter is "amazing", times 2!)\n'
      '#l10n 57 (--- es ---)\n'
      '#l10n 58 (ES - Hello world)\n'
      '#l10n 59 (ES - Hello _NEWLINE_ World)\n'
      '#l10n 60 (ES - Hello Mundo)\n'
      '#l10n 61 (ES - Hola Mundo)\n'
      '#l10n 62 (ES - Hello World on viernes, 1 de enero de 1960)\n'
      '#l10n 63 (ES - Hello world argument on 1/1/1960 at 0:00)\n'
      '#l10n 64 (ES - Hello World from 1960 to 2020)\n'
      '#l10n 65 (ES - Hello for 123)\n'
      // Note that the space between "123.00" and "EUR" is a
      // non-breaking space (U+00A0) and not a regular space(U+0020)
      '#l10n 66 (ES - Hello for el precio 123,00 EUR)\n'
      '#l10n 67 (ES - Hello)\n'
      '#l10n 68 (ES - Hello World)\n'
      '#l10n 69 (ES - Hello two worlds)\n'
      '#l10n 70 (ES - Hello)\n'
      '#l10n 71 (ES - Hello nuevo World)\n'
      '#l10n 72 (ES - Hello two nuevo worlds)\n'
      '#l10n 73 (ES - Hello on viernes, 1 de enero de 1960)\n'
      '#l10n 74 (ES - Hello World, on viernes, 1 de enero de 1960)\n'
      '#l10n 75 (ES - Hello two worlds, on viernes, 1 de enero de 1960)\n'
      '#l10n 76 (ES - Hello other 0 worlds, with a total of 100 citizens)\n'
      '#l10n 77 (ES - Hello World of 101 citizens)\n'
      '#l10n 78 (ES - Hello two worlds with 102 total citizens)\n'
      '#l10n 79 (ES - [Hola] -Mundo- #123#)\n'
      '#l10n 80 (ES - \$!)\n'
      '#l10n 81 (ES - One \$)\n'
      '#l10n 82 (ES - Flutter\'s amazing!)\n'
      '#l10n 83 (ES - Flutter\'s amazing, times 2!)\n'
      '#l10n 84 (ES - Flutter is "amazing"!)\n'
      '#l10n 85 (ES - Flutter is "amazing", times 2!)\n'
      '#l10n 86 (--- es_419 ---)\n'
      '#l10n 87 (ES 419 - Hello World)\n'
      '#l10n 88 (ES 419 - Hello)\n'
      '#l10n 89 (ES 419 - Hello World)\n'
      '#l10n 90 (ES 419 - Hello two worlds)\n'
      '#l10n END\n'
    );
  }

  // TODO(jsimmons): need a localization test that uses deferred loading
  // (see https://github.com/flutter/flutter/issues/61911)
  testWithoutContext('generated l10n classes produce expected localized strings', () async {
    await project.setUpIn(tempDir);
    flutter = FlutterRunTestDriver(tempDir);
    final StringBuffer stdout = await runApp();
    expectOutput(stdout);
  });
}
