Unverified Commit 48ba9c41 authored by Tae Hyung Kim's avatar Tae Hyung Kim Committed by GitHub

Refactor generate_localizations_test.dart (#128974)

The file was becoming harder to deal with as it manually sets up a /lib/l10n directory with a `MemoryFileSystem` in every single test. This PR wraps this process in a helper function `setupLocalizations` and also provides a helper function `getGeneratedFileContent` which helps fetch the respective output file given the locale string.
parent e5ec07ba
...@@ -70,6 +70,67 @@ void main() { ...@@ -70,6 +70,67 @@ void main() {
late String syntheticPackagePath; late String syntheticPackagePath;
late String syntheticL10nPackagePath; late String syntheticL10nPackagePath;
LocalizationsGenerator setupLocalizations(
Map<String, String> localeToArbFile,
{
String? yamlFile,
String? outputPathString,
String? outputFileString,
String? headerString,
String? headerFile,
String? untranslatedMessagesFile,
bool useSyntheticPackage = true,
bool isFromYaml = false,
bool usesNullableGetter = true,
String? inputsAndOutputsListPath,
List<String>? preferredSupportedLocales,
bool useDeferredLoading = false,
bool useEscaping = false,
bool areResourceAttributeRequired = false,
bool suppressWarnings = false,
void Function(Directory)? setup,
}
) {
final Directory l10nDirectory = fs.currentDirectory.childDirectory('lib').childDirectory('l10n')
..createSync(recursive: true);
for (final String locale in localeToArbFile.keys) {
l10nDirectory.childFile('app_$locale.arb')
.writeAsStringSync(localeToArbFile[locale]!);
}
if (setup != null) {
setup(l10nDirectory);
}
return LocalizationsGenerator(
fileSystem: fs,
inputPathString: l10nDirectory.path,
outputPathString: outputPathString ?? l10nDirectory.path,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: outputFileString ?? defaultOutputFileString,
classNameString: defaultClassNameString,
headerString: headerString,
headerFile: headerFile,
logger: logger,
untranslatedMessagesFile: untranslatedMessagesFile,
useSyntheticPackage: useSyntheticPackage,
inputsAndOutputsListPath: inputsAndOutputsListPath,
usesNullableGetter: usesNullableGetter,
preferredSupportedLocales: preferredSupportedLocales,
useDeferredLoading: useDeferredLoading,
useEscaping: useEscaping,
areResourceAttributesRequired: areResourceAttributeRequired,
suppressWarnings: suppressWarnings,
)
..loadResources()
..writeOutputFiles(isFromYaml: isFromYaml);
}
String getGeneratedFileContent({String? locale}) {
final String fileName = locale == null ? 'output-localization-file.dart' : 'output-localization-file_$locale.dart';
return fs.file(
fs.path.join(syntheticL10nPackagePath, fileName)
).readAsStringSync();
}
setUp(() { setUp(() {
fs = MemoryFileSystem.test(); fs = MemoryFileSystem.test();
logger = BufferLogger.test(); logger = BufferLogger.test();
...@@ -269,61 +330,28 @@ void main() { ...@@ -269,61 +330,28 @@ void main() {
}); });
testWithoutContext('correctly adds a headerString when it is set', () { testWithoutContext('correctly adds a headerString when it is set', () {
_standardFlutterDirectoryL10nSetup(fs); final LocalizationsGenerator generator = setupLocalizations(<String, String>{
'en': singleMessageArbFileString,
final LocalizationsGenerator generator = LocalizationsGenerator( 'es': singleEsMessageArbFileString,
fileSystem: fs, }, headerString: '/// Sample header');
inputPathString: defaultL10nPathString,
outputPathString: defaultL10nPathString,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
headerString: '/// Sample header',
logger: logger,
);
expect(generator.header, '/// Sample header'); expect(generator.header, '/// Sample header');
}); });
testWithoutContext('correctly adds a headerFile when it is set', () { testWithoutContext('correctly adds a headerFile when it is set', () {
fs.currentDirectory.childDirectory('lib').childDirectory('l10n') final LocalizationsGenerator generator = setupLocalizations(<String, String>{
..createSync(recursive: true) 'en': singleMessageArbFileString,
..childFile(defaultTemplateArbFileName).writeAsStringSync(singleMessageArbFileString) 'es': singleEsMessageArbFileString,
..childFile(esArbFileName).writeAsStringSync(singleEsMessageArbFileString) }, headerFile: 'header.txt', setup: (Directory l10nDirectory) {
..childFile('header.txt').writeAsStringSync('/// Sample header in a text file'); l10nDirectory.childFile('header.txt').writeAsStringSync('/// Sample header in a text file');
});
final LocalizationsGenerator generator = LocalizationsGenerator(
fileSystem: fs,
inputPathString: defaultL10nPathString,
outputPathString: defaultL10nPathString,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
headerFile: 'header.txt',
logger: logger,
);
expect(generator.header, '/// Sample header in a text file'); expect(generator.header, '/// Sample header in a text file');
}); });
testWithoutContext('sets templateArbFileName with more than one underscore correctly', () { testWithoutContext('sets templateArbFileName with more than one underscore correctly', () {
final Directory l10nDirectory = fs.currentDirectory.childDirectory('lib').childDirectory('l10n') setupLocalizations(<String, String>{
..createSync(recursive: true); 'en': singleMessageArbFileString,
l10nDirectory.childFile('app_localizations_en.arb') 'es': singleEsMessageArbFileString,
.writeAsStringSync(singleMessageArbFileString); });
l10nDirectory.childFile('app_localizations_es.arb')
.writeAsStringSync(singleEsMessageArbFileString);
LocalizationsGenerator(
fileSystem: fs,
inputPathString: defaultL10nPathString,
templateArbFileName: 'app_localizations_en.arb',
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles();
final Directory outputDirectory = fs.directory(syntheticL10nPackagePath); final Directory outputDirectory = fs.directory(syntheticL10nPackagePath);
expect(outputDirectory.childFile('output-localization-file.dart').existsSync(), isTrue); expect(outputDirectory.childFile('output-localization-file.dart').existsSync(), isTrue);
expect(outputDirectory.childFile('output-localization-file_en.dart').existsSync(), isTrue); expect(outputDirectory.childFile('output-localization-file_en.dart').existsSync(), isTrue);
...@@ -331,22 +359,13 @@ void main() { ...@@ -331,22 +359,13 @@ void main() {
}); });
testWithoutContext('filenames with invalid locales should not be recognized', () { testWithoutContext('filenames with invalid locales should not be recognized', () {
final Directory l10nDirectory = fs.currentDirectory.childDirectory('lib').childDirectory('l10n')
..createSync(recursive: true);
l10nDirectory.childFile('app_localizations_en.arb')
.writeAsStringSync(singleMessageArbFileString);
l10nDirectory.childFile('app_localizations_en_CA_foo.arb')
.writeAsStringSync(singleMessageArbFileString);
expect( expect(
() { () {
LocalizationsGenerator( // This attempts to create 'app_localizations_en_CA_foo.arb'.
fileSystem: fs, setupLocalizations(<String, String>{
inputPathString: defaultL10nPathString, 'en': singleMessageArbFileString,
templateArbFileName: 'app_localizations_en.arb', 'en_CA_foo': singleMessageArbFileString,
outputFileString: defaultOutputFileString, });
classNameString: defaultClassNameString,
logger: logger,
).loadResources();
}, },
throwsA(isA<L10nException>().having( throwsA(isA<L10nException>().having(
(L10nException e) => e.message, (L10nException e) => e.message,
...@@ -357,28 +376,12 @@ void main() { ...@@ -357,28 +376,12 @@ void main() {
}); });
testWithoutContext('correctly creates an untranslated messages file (useSyntheticPackage = true)', () { testWithoutContext('correctly creates an untranslated messages file (useSyntheticPackage = true)', () {
fs.currentDirectory.childDirectory('lib').childDirectory('l10n') final String untranslatedMessagesFilePath = fs.path.join('lib', 'l10n', 'unimplemented_message_translations.json');
..createSync(recursive: true) setupLocalizations(<String, String>{
..childFile(defaultTemplateArbFileName).writeAsStringSync(twoMessageArbFileString) 'en': twoMessageArbFileString,
..childFile(esArbFileName).writeAsStringSync(singleEsMessageArbFileString); 'es': singleEsMessageArbFileString,
}, untranslatedMessagesFile: untranslatedMessagesFilePath);
LocalizationsGenerator( final String unimplementedOutputString = fs.file(untranslatedMessagesFilePath).readAsStringSync();
fileSystem: fs,
inputPathString: defaultL10nPathString,
outputPathString: defaultL10nPathString,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
untranslatedMessagesFile: fs.path.join('lib', 'l10n', 'unimplemented_message_translations.json'),
logger: logger,
)
..loadResources()
..writeOutputFiles();
final File unimplementedOutputFile = fs.file(
fs.path.join('lib', 'l10n', 'unimplemented_message_translations.json'),
);
final String unimplementedOutputString = unimplementedOutputFile.readAsStringSync();
try { try {
// Since ARB file is essentially JSON, decoding it should not fail. // Since ARB file is essentially JSON, decoding it should not fail.
json.decode(unimplementedOutputString); json.decode(unimplementedOutputString);
...@@ -390,29 +393,12 @@ void main() { ...@@ -390,29 +393,12 @@ void main() {
}); });
testWithoutContext('correctly creates an untranslated messages file (useSyntheticPackage = false)', () { testWithoutContext('correctly creates an untranslated messages file (useSyntheticPackage = false)', () {
fs.currentDirectory.childDirectory('lib').childDirectory('l10n') final String untranslatedMessagesFilePath = fs.path.join('lib', 'l10n', 'unimplemented_message_translations.json');
..createSync(recursive: true) setupLocalizations(<String, String>{
..childFile(defaultTemplateArbFileName).writeAsStringSync(twoMessageArbFileString) 'en': twoMessageArbFileString,
..childFile(esArbFileName).writeAsStringSync(singleEsMessageArbFileString); 'es': singleMessageArbFileString,
}, useSyntheticPackage: false, untranslatedMessagesFile: untranslatedMessagesFilePath);
LocalizationsGenerator( final String unimplementedOutputString = fs.file(untranslatedMessagesFilePath).readAsStringSync();
fileSystem: fs,
inputPathString: defaultL10nPathString,
outputPathString: defaultL10nPathString,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
useSyntheticPackage: false,
untranslatedMessagesFile: fs.path.join('lib', 'l10n', 'unimplemented_message_translations.json'),
logger: logger,
)
..loadResources()
..writeOutputFiles();
final File unimplementedOutputFile = fs.file(
fs.path.join('lib', 'l10n', 'unimplemented_message_translations.json'),
);
final String unimplementedOutputString = unimplementedOutputFile.readAsStringSync();
try { try {
// Since ARB file is essentially JSON, decoding it should not fail. // Since ARB file is essentially JSON, decoding it should not fail.
json.decode(unimplementedOutputString); json.decode(unimplementedOutputString);
...@@ -427,24 +413,10 @@ void main() { ...@@ -427,24 +413,10 @@ void main() {
'untranslated messages suggestion is printed when translation is missing: ' 'untranslated messages suggestion is printed when translation is missing: '
'command line message', 'command line message',
() { () {
fs.currentDirectory.childDirectory('lib').childDirectory('l10n') setupLocalizations(<String, String>{
..createSync(recursive: true) 'en': twoMessageArbFileString,
..childFile(defaultTemplateArbFileName).writeAsStringSync(twoMessageArbFileString) 'es': singleEsMessageArbFileString,
..childFile(esArbFileName).writeAsStringSync(singleEsMessageArbFileString); });
LocalizationsGenerator(
fileSystem: fs,
inputPathString: defaultL10nPathString,
outputPathString: defaultL10nPathString,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
useSyntheticPackage: false,
logger: logger,
)
..loadResources()
..writeOutputFiles();
expect( expect(
logger.statusText, logger.statusText,
contains('To see a detailed report, use the --untranslated-messages-file'), contains('To see a detailed report, use the --untranslated-messages-file'),
...@@ -460,22 +432,10 @@ void main() { ...@@ -460,22 +432,10 @@ void main() {
'untranslated messages suggestion is printed when translation is missing: ' 'untranslated messages suggestion is printed when translation is missing: '
'l10n.yaml message', 'l10n.yaml message',
() { () {
fs.currentDirectory.childDirectory('lib').childDirectory('l10n') setupLocalizations(<String, String>{
..createSync(recursive: true) 'en': twoMessageArbFileString,
..childFile(defaultTemplateArbFileName).writeAsStringSync(twoMessageArbFileString) 'es': singleEsMessageArbFileString,
..childFile(esArbFileName).writeAsStringSync(singleEsMessageArbFileString); }, isFromYaml: true);
LocalizationsGenerator(
fileSystem: fs,
inputPathString: defaultL10nPathString,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles(isFromYaml: true);
expect( expect(
logger.statusText, logger.statusText,
contains('To see a detailed report, use the untranslated-messages-file'), contains('To see a detailed report, use the untranslated-messages-file'),
...@@ -491,45 +451,26 @@ void main() { ...@@ -491,45 +451,26 @@ void main() {
'unimplemented messages suggestion is not printed when all messages ' 'unimplemented messages suggestion is not printed when all messages '
'are fully translated', 'are fully translated',
() { () {
fs.currentDirectory.childDirectory('lib').childDirectory('l10n') setupLocalizations(<String, String>{
..createSync(recursive: true) 'en': twoMessageArbFileString,
..childFile(defaultTemplateArbFileName).writeAsStringSync(twoMessageArbFileString) 'es': twoMessageArbFileString,
..childFile(esArbFileName).writeAsStringSync(twoMessageArbFileString); });
expect(logger.statusText, equals(''));
LocalizationsGenerator(
fileSystem: fs,
inputPathString: defaultL10nPathString,
outputPathString: defaultL10nPathString,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles();
expect(logger.statusText, '');
}, },
); );
testWithoutContext('untranslated messages file included in generated JSON list of outputs', () { testWithoutContext('untranslated messages file included in generated JSON list of outputs', () {
_standardFlutterDirectoryL10nSetup(fs); final String untranslatedMessagesFilePath = fs.path.join('lib', 'l10n', 'unimplemented_message_translations.json');
setupLocalizations(
LocalizationsGenerator( <String, String>{
fileSystem: fs, 'en': twoMessageArbFileString,
inputPathString: defaultL10nPathString, 'es': singleEsMessageArbFileString,
templateArbFileName: defaultTemplateArbFileName, },
outputFileString: defaultOutputFileString, untranslatedMessagesFile: untranslatedMessagesFilePath,
classNameString: defaultClassNameString,
inputsAndOutputsListPath: syntheticL10nPackagePath, inputsAndOutputsListPath: syntheticL10nPackagePath,
untranslatedMessagesFile: fs.path.join('lib', 'l10n', 'unimplemented_message_translations.json'), );
logger: logger,
)
..loadResources()
..writeOutputFiles();
final File inputsAndOutputsList = fs.file( final File inputsAndOutputsList = fs.file(
fs.path.join(syntheticL10nPackagePath, 'gen_l10n_inputs_and_outputs.json'), fs.path.join(syntheticL10nPackagePath, 'gen_l10n_inputs_and_outputs.json')
); );
expect(inputsAndOutputsList.existsSync(), isTrue); expect(inputsAndOutputsList.existsSync(), isTrue);
final Map<String, dynamic> jsonResult = json.decode( final Map<String, dynamic> jsonResult = json.decode(
...@@ -635,30 +576,18 @@ void main() { ...@@ -635,30 +576,18 @@ void main() {
'generates nullable localizations class getter via static `of` method ' 'generates nullable localizations class getter via static `of` method '
'by default', 'by default',
() { () {
_standardFlutterDirectoryL10nSetup(fs); final LocalizationsGenerator generator = setupLocalizations(<String, String>{
'en': singleMessageArbFileString,
LocalizationsGenerator( 'es': singleEsMessageArbFileString,
fileSystem: fs, });
inputPathString: defaultL10nPathString, expect(generator.outputDirectory.existsSync(), isTrue);
outputPathString: fs.path.join('lib', 'l10n', 'output'), expect(generator.outputDirectory.childFile('output-localization-file.dart').existsSync(), isTrue);
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
useSyntheticPackage: false,
logger: logger,
)
..loadResources()
..writeOutputFiles();
final Directory outputDirectory = fs.directory('lib').childDirectory('l10n').childDirectory('output');
expect(outputDirectory.existsSync(), isTrue);
expect(outputDirectory.childFile('output-localization-file.dart').existsSync(), isTrue);
expect( expect(
outputDirectory.childFile('output-localization-file.dart').readAsStringSync(), generator.outputDirectory.childFile('output-localization-file.dart').readAsStringSync(),
contains('static AppLocalizations? of(BuildContext context)'), contains('static AppLocalizations? of(BuildContext context)'),
); );
expect( expect(
outputDirectory.childFile('output-localization-file.dart').readAsStringSync(), generator.outputDirectory.childFile('output-localization-file.dart').readAsStringSync(),
contains('return Localizations.of<AppLocalizations>(context, AppLocalizations);'), contains('return Localizations.of<AppLocalizations>(context, AppLocalizations);'),
); );
}, },
...@@ -667,51 +596,28 @@ void main() { ...@@ -667,51 +596,28 @@ void main() {
testWithoutContext( testWithoutContext(
'can generate non-nullable localizations class getter via static `of` method ', 'can generate non-nullable localizations class getter via static `of` method ',
() { () {
_standardFlutterDirectoryL10nSetup(fs); final LocalizationsGenerator generator = setupLocalizations(<String, String>{
'en': singleMessageArbFileString,
LocalizationsGenerator( 'es': singleEsMessageArbFileString,
fileSystem: fs, }, usesNullableGetter: false);
inputPathString: defaultL10nPathString, expect(generator.outputDirectory.existsSync(), isTrue);
outputPathString: fs.path.join('lib', 'l10n', 'output'), expect(generator.outputDirectory.childFile('output-localization-file.dart').existsSync(), isTrue);
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
useSyntheticPackage: false,
usesNullableGetter: false,
logger: logger,
)
..loadResources()
..writeOutputFiles();
final Directory outputDirectory = fs.directory('lib').childDirectory('l10n').childDirectory('output');
expect(outputDirectory.existsSync(), isTrue);
expect(outputDirectory.childFile('output-localization-file.dart').existsSync(), isTrue);
expect( expect(
outputDirectory.childFile('output-localization-file.dart').readAsStringSync(), generator.outputDirectory.childFile('output-localization-file.dart').readAsStringSync(),
contains('static AppLocalizations of(BuildContext context)'), contains('static AppLocalizations of(BuildContext context)'),
); );
expect( expect(
outputDirectory.childFile('output-localization-file.dart').readAsStringSync(), generator.outputDirectory.childFile('output-localization-file.dart').readAsStringSync(),
contains('return Localizations.of<AppLocalizations>(context, AppLocalizations)!;'), contains('return Localizations.of<AppLocalizations>(context, AppLocalizations)!;'),
); );
}, },
); );
testWithoutContext('creates list of inputs and outputs when file path is specified', () { testWithoutContext('creates list of inputs and outputs when file path is specified', () {
_standardFlutterDirectoryL10nSetup(fs); setupLocalizations(<String, String>{
'en': singleMessageArbFileString,
LocalizationsGenerator( 'es': singleEsMessageArbFileString,
fileSystem: fs, }, inputsAndOutputsListPath: syntheticL10nPackagePath);
inputPathString: defaultL10nPathString,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
inputsAndOutputsListPath: syntheticL10nPackagePath,
logger: logger,
)
..loadResources()
..writeOutputFiles();
final File inputsAndOutputsList = fs.file( final File inputsAndOutputsList = fs.file(
fs.path.join(syntheticL10nPackagePath, 'gen_l10n_inputs_and_outputs.json'), fs.path.join(syntheticL10nPackagePath, 'gen_l10n_inputs_and_outputs.json'),
); );
...@@ -731,24 +637,18 @@ void main() { ...@@ -731,24 +637,18 @@ void main() {
}); });
testWithoutContext('setting both a headerString and a headerFile should fail', () { testWithoutContext('setting both a headerString and a headerFile should fail', () {
fs.currentDirectory.childDirectory('lib').childDirectory('l10n')
..createSync(recursive: true)
..childFile(defaultTemplateArbFileName).writeAsStringSync(singleMessageArbFileString)
..childFile(esArbFileName).writeAsStringSync(singleEsMessageArbFileString)
..childFile('header.txt').writeAsStringSync('/// Sample header in a text file');
expect( expect(
() { () {
LocalizationsGenerator( setupLocalizations(
fileSystem: fs, <String, String>{
inputPathString: defaultL10nPathString, 'en': singleMessageArbFileString,
outputPathString: defaultL10nPathString, 'es': singleEsMessageArbFileString,
templateArbFileName: defaultTemplateArbFileName, },
outputFileString: defaultOutputFileString, headerString: '/// Sample header in a text file',
classNameString: defaultClassNameString,
headerString: '/// Sample header for localizations file.',
headerFile: 'header.txt', headerFile: 'header.txt',
logger: logger, setup: (Directory l10nDirectory) {
l10nDirectory.childFile('header.txt').writeAsStringSync('/// Sample header in a text file');
},
); );
}, },
throwsA(isA<L10nException>().having( throwsA(isA<L10nException>().having(
...@@ -760,27 +660,12 @@ void main() { ...@@ -760,27 +660,12 @@ void main() {
}); });
testWithoutContext('setting a headerFile that does not exist should fail', () { testWithoutContext('setting a headerFile that does not exist should fail', () {
final Directory l10nDirectory = fs.currentDirectory.childDirectory('lib').childDirectory('l10n')
..createSync(recursive: true);
l10nDirectory.childFile(defaultTemplateArbFileName)
.writeAsStringSync(singleMessageArbFileString);
l10nDirectory.childFile(esArbFileName)
.writeAsStringSync(singleEsMessageArbFileString);
l10nDirectory.childFile('header.txt')
.writeAsStringSync('/// Sample header in a text file');
expect( expect(
() { () {
LocalizationsGenerator( setupLocalizations(<String, String>{
fileSystem: fs, 'en': singleMessageArbFileString,
inputPathString: defaultL10nPathString, 'es': singleEsMessageArbFileString,
outputPathString: defaultL10nPathString, }, headerFile: 'header.txt');
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
headerFile: 'header.tx', // Intentionally spelled incorrectly
logger: logger,
);
}, },
throwsA(isA<L10nException>().having( throwsA(isA<L10nException>().having(
(L10nException e) => e.message, (L10nException e) => e.message,
...@@ -1323,28 +1208,13 @@ class AppLocalizationsEn extends AppLocalizations { ...@@ -1323,28 +1208,13 @@ class AppLocalizationsEn extends AppLocalizations {
group('writeOutputFiles', () { group('writeOutputFiles', () {
testWithoutContext('multiple messages with syntax error all log their errors', () { testWithoutContext('multiple messages with syntax error all log their errors', () {
final Directory l10nDirectory = fs.currentDirectory.childDirectory('lib').childDirectory('l10n') try {
..createSync(recursive: true); setupLocalizations(<String, String>{
l10nDirectory.childFile(defaultTemplateArbFileName) 'en': r'''
.writeAsStringSync(r'''
{ {
"msg1": "{", "msg1": "{",
"msg2": "{ {" "msg2": "{ {"
}'''); }'''});
l10nDirectory.childFile(esArbFileName)
.writeAsStringSync(singleEsMessageArbFileString);
try {
LocalizationsGenerator(
fileSystem: fs,
inputPathString: defaultL10nPathString,
outputPathString: defaultL10nPathString,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles();
} on L10nException catch (error) { } on L10nException catch (error) {
expect(error.message, equals('Found syntax errors.')); expect(error.message, equals('Found syntax errors.'));
expect(logger.errorText, contains(''' expect(logger.errorText, contains('''
...@@ -1358,147 +1228,62 @@ class AppLocalizationsEn extends AppLocalizations { ...@@ -1358,147 +1228,62 @@ class AppLocalizationsEn extends AppLocalizations {
}); });
testWithoutContext('no description generates generic comment', () { testWithoutContext('no description generates generic comment', () {
final Directory l10nDirectory = fs.currentDirectory.childDirectory('lib').childDirectory('l10n') setupLocalizations(<String, String>{
..createSync(recursive: true); 'en': r'''
l10nDirectory.childFile(defaultTemplateArbFileName)
.writeAsStringSync(r'''
{ {
"helloWorld": "Hello world!" "helloWorld": "Hello world!"
}'''); }'''
l10nDirectory.childFile(esArbFileName) });
.writeAsStringSync(singleEsMessageArbFileString); expect(getGeneratedFileContent(), contains('/// No description provided for @helloWorld.'));
LocalizationsGenerator(
fileSystem: fs,
inputPathString: defaultL10nPathString,
outputPathString: defaultL10nPathString,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles();
final File baseLocalizationsFile = fs.file(
fs.path.join(syntheticL10nPackagePath, 'output-localization-file.dart')
);
expect(baseLocalizationsFile.existsSync(), isTrue);
final String baseLocalizationsFileContents = fs.file(
fs.path.join(syntheticL10nPackagePath, 'output-localization-file.dart')
).readAsStringSync();
expect(baseLocalizationsFileContents, contains('/// No description provided for @helloWorld.'));
}); });
testWithoutContext('multiline descriptions are correctly formatted as comments', () { testWithoutContext('multiline descriptions are correctly formatted as comments', () {
final Directory l10nDirectory = fs.currentDirectory.childDirectory('lib').childDirectory('l10n') setupLocalizations(<String, String>{
..createSync(recursive: true); 'en': r'''
l10nDirectory.childFile(defaultTemplateArbFileName)
.writeAsStringSync(r'''
{ {
"helloWorld": "Hello world!", "helloWorld": "Hello world!",
"@helloWorld": { "@helloWorld": {
"description": "The generic example string in every language.\nUse this for tests!" "description": "The generic example string in every language.\nUse this for tests!"
} }
}'''); }'''});
l10nDirectory.childFile(esArbFileName) expect(getGeneratedFileContent(), contains('''
.writeAsStringSync(singleEsMessageArbFileString);
LocalizationsGenerator(
fileSystem: fs,
inputPathString: defaultL10nPathString,
outputPathString: defaultL10nPathString,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles();
final File baseLocalizationsFile = fs.file(
fs.path.join(syntheticL10nPackagePath, 'output-localization-file.dart')
);
expect(baseLocalizationsFile.existsSync(), isTrue);
final String baseLocalizationsFileContents = fs.file(
fs.path.join(syntheticL10nPackagePath, 'output-localization-file.dart')
).readAsStringSync();
expect(baseLocalizationsFileContents, contains('''
/// The generic example string in every language. /// The generic example string in every language.
/// Use this for tests!''')); /// Use this for tests!'''));
}); });
testWithoutContext('message without placeholders - should generate code comment with description and template message translation', () { testWithoutContext('message without placeholders - should generate code comment with description and template message translation', () {
_standardFlutterDirectoryL10nSetup(fs); setupLocalizations(<String, String> {
LocalizationsGenerator( 'en': singleMessageArbFileString,
fileSystem: fs, 'es': singleEsMessageArbFileString,
inputPathString: defaultL10nPathString, });
outputPathString: defaultL10nPathString, final String content = getGeneratedFileContent();
templateArbFileName: defaultTemplateArbFileName, expect(content, contains('/// Title for the application.'));
outputFileString: defaultOutputFileString, expect(content, contains('''
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles();
final File baseLocalizationsFile = fs.file(
fs.path.join(syntheticL10nPackagePath, 'output-localization-file.dart')
);
expect(baseLocalizationsFile.existsSync(), isTrue);
final String baseLocalizationsFileContents = fs.file(
fs.path.join(syntheticL10nPackagePath, 'output-localization-file.dart')
).readAsStringSync();
expect(baseLocalizationsFileContents, contains('/// Title for the application.'));
expect(baseLocalizationsFileContents, contains('''
/// In en, this message translates to: /// In en, this message translates to:
/// **'Title'**''')); /// **'Title'**'''));
}); });
testWithoutContext('template message translation handles newline characters', () { testWithoutContext('template message translation handles newline characters', () {
final Directory l10nDirectory = fs.currentDirectory.childDirectory('lib').childDirectory('l10n') setupLocalizations(<String, String>{
..createSync(recursive: true); 'en': r'''
l10nDirectory.childFile(defaultTemplateArbFileName)
.writeAsStringSync(r'''
{ {
"title": "Title \n of the application", "title": "Title \n of the application",
"@title": { "@title": {
"description": "Title for the application." "description": "Title for the application."
} }
}'''); }''',
l10nDirectory.childFile(esArbFileName) 'es': singleEsMessageArbFileString
.writeAsStringSync(singleEsMessageArbFileString); });
final String content = getGeneratedFileContent();
LocalizationsGenerator( expect(content, contains('/// Title for the application.'));
fileSystem: fs, expect(content, contains(r'''
inputPathString: defaultL10nPathString,
outputPathString: defaultL10nPathString,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles();
final File baseLocalizationsFile = fs.file(
fs.path.join(syntheticL10nPackagePath, 'output-localization-file.dart')
);
expect(baseLocalizationsFile.existsSync(), isTrue);
final String baseLocalizationsFileContents = fs.file(
fs.path.join(syntheticL10nPackagePath, 'output-localization-file.dart')
).readAsStringSync();
expect(baseLocalizationsFileContents, contains('/// Title for the application.'));
expect(baseLocalizationsFileContents, contains(r'''
/// In en, this message translates to: /// In en, this message translates to:
/// **'Title \n of the application'**''')); /// **'Title \n of the application'**'''));
}); });
testWithoutContext('message with placeholders - should generate code comment with description and template message translation', () { testWithoutContext('message with placeholders - should generate code comment with description and template message translation', () {
final Directory l10nDirectory = fs.currentDirectory.childDirectory('lib').childDirectory('l10n') setupLocalizations(<String, String>{
..createSync(recursive: true); 'en': r'''
l10nDirectory.childFile(defaultTemplateArbFileName)
.writeAsStringSync(r'''
{ {
"price": "The price of this item is: ${price}", "price": "The price of this item is: ${price}",
"@price": { "@price": {
...@@ -1510,94 +1295,41 @@ class AppLocalizationsEn extends AppLocalizations { ...@@ -1510,94 +1295,41 @@ class AppLocalizationsEn extends AppLocalizations {
} }
} }
} }
}'''); }''',
l10nDirectory.childFile(esArbFileName) 'es': r'''
.writeAsStringSync(r'''
{ {
"price": "el precio de este artículo es: ${price}" "price": "El precio de este artículo es: ${price}"
}'''); }'''
});
LocalizationsGenerator( final String content = getGeneratedFileContent();
fileSystem: fs, expect(content, contains('/// The price of an online shopping cart item.'));
inputPathString: defaultL10nPathString, expect(content, contains(r'''
outputPathString: defaultL10nPathString,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles();
final File baseLocalizationsFile = fs.file(
fs.path.join(syntheticL10nPackagePath, 'output-localization-file.dart')
);
expect(baseLocalizationsFile.existsSync(), isTrue);
final String baseLocalizationsFileContents = fs.file(
fs.path.join(syntheticL10nPackagePath, 'output-localization-file.dart')
).readAsStringSync();
expect(baseLocalizationsFileContents, contains('/// The price of an online shopping cart item.'));
expect(baseLocalizationsFileContents, contains(r'''
/// In en, this message translates to: /// In en, this message translates to:
/// **'The price of this item is: \${price}'**''')); /// **'The price of this item is: \${price}'**'''));
}); });
testWithoutContext('should generate a file per language', () { testWithoutContext('should generate a file per language', () {
const String singleEnCaMessageArbFileString = ''' setupLocalizations(<String, String>{
'en': singleMessageArbFileString,
'en_CA': '''
{ {
"title": "Canadian Title" "title": "Canadian Title"
}'''; }'''
fs.currentDirectory.childDirectory('lib').childDirectory('l10n')..createSync(recursive: true) });
..childFile(defaultTemplateArbFileName).writeAsStringSync(singleMessageArbFileString) expect(getGeneratedFileContent(locale: 'en'), contains('class AppLocalizationsEn extends AppLocalizations'));
..childFile('app_en_CA.arb').writeAsStringSync(singleEnCaMessageArbFileString); expect(getGeneratedFileContent(locale: 'en'), contains('class AppLocalizationsEnCa extends AppLocalizationsEn'));
expect(() => getGeneratedFileContent(locale: 'en_US'), throwsException);
LocalizationsGenerator(
fileSystem: fs,
inputPathString: defaultL10nPathString,
outputPathString: defaultL10nPathString,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles();
expect(fs.isFileSync(fs.path.join(syntheticL10nPackagePath, 'output-localization-file_en.dart')), true);
expect(fs.isFileSync(fs.path.join(syntheticL10nPackagePath, 'output-localization-file_en_US.dart')), false);
final String englishLocalizationsFile = fs.file(
fs.path.join(syntheticL10nPackagePath, 'output-localization-file_en.dart')
).readAsStringSync();
expect(englishLocalizationsFile, contains('class AppLocalizationsEnCa extends AppLocalizationsEn'));
expect(englishLocalizationsFile, contains('class AppLocalizationsEn extends AppLocalizations'));
}); });
testWithoutContext('language imports are sorted when preferredSupportedLocaleString is given', () { testWithoutContext('language imports are sorted when preferredSupportedLocaleString is given', () {
fs.currentDirectory.childDirectory('lib').childDirectory('l10n')..createSync(recursive: true) const List<String> preferredSupportedLocales = <String>['zh'];
..childFile(defaultTemplateArbFileName).writeAsStringSync(singleMessageArbFileString) setupLocalizations(<String, String>{
..childFile('app_zh.arb').writeAsStringSync(singleZhMessageArbFileString) 'en': singleMessageArbFileString,
..childFile('app_es.arb').writeAsStringSync(singleEsMessageArbFileString); 'zh': singleZhMessageArbFileString,
'es': singleEsMessageArbFileString,
const List<String> preferredSupportedLocale = <String>['zh']; }, preferredSupportedLocales: preferredSupportedLocales);
LocalizationsGenerator( final String content = getGeneratedFileContent();
fileSystem: fs, expect(content, contains(
inputPathString: defaultL10nPathString,
outputPathString: defaultL10nPathString,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
preferredSupportedLocales: preferredSupportedLocale,
logger: logger,
)
..loadResources()
..writeOutputFiles();
final String localizationsFile = fs.file(
fs.path.join(syntheticL10nPackagePath, defaultOutputFileString),
).readAsStringSync();
expect(localizationsFile, contains(
''' '''
import 'output-localization-file_en.dart'; import 'output-localization-file_en.dart';
import 'output-localization-file_es.dart'; import 'output-localization-file_es.dart';
...@@ -1607,21 +1339,9 @@ import 'output-localization-file_zh.dart'; ...@@ -1607,21 +1339,9 @@ import 'output-localization-file_zh.dart';
// Regression test for https://github.com/flutter/flutter/issues/88356 // Regression test for https://github.com/flutter/flutter/issues/88356
testWithoutContext('full output file suffix is retained', () { testWithoutContext('full output file suffix is retained', () {
fs.currentDirectory.childDirectory('lib').childDirectory('l10n')..createSync(recursive: true) setupLocalizations(<String, String>{
..childFile(defaultTemplateArbFileName).writeAsStringSync(singleMessageArbFileString); 'en': singleMessageArbFileString,
}, outputFileString: 'output-localization-file.g.dart');
LocalizationsGenerator(
fileSystem: fs,
inputPathString: defaultL10nPathString,
outputPathString: defaultL10nPathString,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: 'output-localization-file.g.dart',
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles();
final String baseLocalizationsFile = fs.file( final String baseLocalizationsFile = fs.file(
fs.path.join(syntheticL10nPackagePath, 'output-localization-file.g.dart'), fs.path.join(syntheticL10nPackagePath, 'output-localization-file.g.dart'),
).readAsStringSync(); ).readAsStringSync();
...@@ -1640,118 +1360,69 @@ import 'output-localization-file.g.dart'; ...@@ -1640,118 +1360,69 @@ import 'output-localization-file.g.dart';
}); });
testWithoutContext('throws an exception when invalid output file name is passed in', () { testWithoutContext('throws an exception when invalid output file name is passed in', () {
fs.currentDirectory.childDirectory('lib').childDirectory('l10n')..createSync(recursive: true) expect(
..childFile(defaultTemplateArbFileName).writeAsStringSync(singleMessageArbFileString); () {
setupLocalizations(<String, String>{
expect( 'en': singleMessageArbFileString,
() { }, outputFileString: 'asdf');
LocalizationsGenerator( },
fileSystem: fs, throwsA(isA<L10nException>().having(
inputPathString: defaultL10nPathString, (L10nException e) => e.message,
outputPathString: defaultL10nPathString, 'message',
templateArbFileName: defaultTemplateArbFileName, allOf(
outputFileString: 'asdf', contains('output-localization-file'),
classNameString: defaultClassNameString, contains('asdf'),
logger: logger, contains('is invalid'),
) contains('The file name must have a .dart extension.'),
..loadResources() ),
..writeOutputFiles(); )),
}, );
throwsA(isA<L10nException>().having( expect(
(L10nException e) => e.message, () {
'message', setupLocalizations(<String, String>{
allOf( 'en': singleMessageArbFileString,
contains('output-localization-file'), }, outputFileString: '.g.dart');
contains('asdf'), },
contains('is invalid'), throwsA(isA<L10nException>().having(
contains('The file name must have a .dart extension.'), (L10nException e) => e.message,
), 'message',
)), allOf(
); contains('output-localization-file'),
contains('.g.dart'),
expect( contains('is invalid'),
() { contains('The base name cannot be empty.'),
LocalizationsGenerator( ),
fileSystem: fs, )),
inputPathString: defaultL10nPathString, );
outputPathString: defaultL10nPathString, });
templateArbFileName: defaultTemplateArbFileName,
outputFileString: '.g.dart',
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles();
},
throwsA(isA<L10nException>().having(
(L10nException e) => e.message,
'message',
allOf(
contains('output-localization-file'),
contains('.g.dart'),
contains('is invalid'),
contains('The base name cannot be empty.'),
),
)),
);
});
testWithoutContext('imports are deferred and loaded when useDeferredImports are set', () { testWithoutContext('imports are deferred and loaded when useDeferredImports are set', () {
fs.currentDirectory.childDirectory('lib').childDirectory('l10n')..createSync(recursive: true) setupLocalizations(<String, String>{
..childFile(defaultTemplateArbFileName).writeAsStringSync(singleMessageArbFileString); 'en': singleMessageArbFileString,
}, useDeferredLoading: true);
LocalizationsGenerator( final String content = getGeneratedFileContent();
fileSystem: fs, expect(content, contains(
inputPathString: defaultL10nPathString,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
useDeferredLoading: true,
logger: logger,
)
..loadResources()
..writeOutputFiles();
final String localizationsFile = fs.file(
fs.path.join(syntheticL10nPackagePath, defaultOutputFileString),
).readAsStringSync();
expect(localizationsFile, contains(
''' '''
import 'output-localization-file_en.dart' deferred as output-localization-file_en; import 'output-localization-file_en.dart' deferred as output-localization-file_en;
''')); '''));
expect(localizationsFile, contains('output-localization-file_en.loadLibrary()')); expect(content, contains('output-localization-file_en.loadLibrary()'));
}); });
group('placeholder tests', () { group('placeholder tests', () {
testWithoutContext('should automatically infer placeholders that are not explicitly defined', () { testWithoutContext('should automatically infer placeholders that are not explicitly defined', () {
const String messageWithoutDefinedPlaceholder = ''' setupLocalizations(<String, String>{
'en': '''
{ {
"helloWorld": "Hello {name}" "helloWorld": "Hello {name}"
}'''; }'''
});
final Directory l10nDirectory = fs.currentDirectory.childDirectory('lib').childDirectory('l10n') final String content = getGeneratedFileContent(locale: 'en');
..createSync(recursive: true); expect(content, contains('String helloWorld(Object name) {'));
l10nDirectory.childFile(defaultTemplateArbFileName)
.writeAsStringSync(messageWithoutDefinedPlaceholder);
LocalizationsGenerator(
fileSystem: fs,
inputPathString: defaultL10nPathString,
outputPathString: defaultL10nPathString,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles();
final String localizationsFile = fs.file(
fs.path.join(syntheticL10nPackagePath, 'output-localization-file_en.dart'),
).readAsStringSync();
expect(localizationsFile, contains('String helloWorld(Object name) {'));
}); });
testWithoutContext('placeholder parameter list should be consistent between languages', () { testWithoutContext('placeholder parameter list should be consistent between languages', () {
const String messageEn = ''' setupLocalizations(<String, String>{
'en': '''
{ {
"helloWorld": "Hello {name}", "helloWorld": "Hello {name}",
"@helloWorld": { "@helloWorld": {
...@@ -1759,42 +1430,22 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e ...@@ -1759,42 +1430,22 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
"name": {} "name": {}
} }
} }
}'''; }''',
const String messageEs = ''' 'es': '''
{ {
"helloWorld": "Hola" "helloWorld": "Hola"
} }
'''; ''',
final Directory l10nDirectory = fs.currentDirectory.childDirectory('lib').childDirectory('l10n') });
..createSync(recursive: true); expect(getGeneratedFileContent(locale: 'en'), contains('String helloWorld(Object name) {'));
l10nDirectory.childFile(defaultTemplateArbFileName) expect(getGeneratedFileContent(locale: 'es'), contains('String helloWorld(Object name) {'));
.writeAsStringSync(messageEn);
l10nDirectory.childFile('app_es.arb')
.writeAsStringSync(messageEs);
LocalizationsGenerator(
fileSystem: fs,
inputPathString: defaultL10nPathString,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles();
final String localizationsFileEn = fs.file(
fs.path.join(syntheticL10nPackagePath, 'output-localization-file_en.dart'),
).readAsStringSync();
final String localizationsFileEs = fs.file(
fs.path.join(syntheticL10nPackagePath, 'output-localization-file_es.dart'),
).readAsStringSync();
expect(localizationsFileEn, contains('String helloWorld(Object name) {'));
expect(localizationsFileEs, contains('String helloWorld(Object name) {'));
}); });
}); });
group('DateTime tests', () { group('DateTime tests', () {
testWithoutContext('imports package:intl', () { testWithoutContext('imports package:intl', () {
const String singleDateMessageArbFileString = ''' setupLocalizations(<String, String>{
'en': '''
{ {
"@@locale": "en", "@@locale": "en",
"springBegins": "Spring begins on {springStartDate}", "springBegins": "Spring begins on {springStartDate}",
...@@ -1807,35 +1458,19 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e ...@@ -1807,35 +1458,19 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
} }
} }
} }
}'''; }'''
fs.currentDirectory.childDirectory('lib').childDirectory('l10n')..createSync(recursive: true) });
..childFile(defaultTemplateArbFileName).writeAsStringSync(singleDateMessageArbFileString); expect(getGeneratedFileContent(locale: 'en'), contains(intlImportDartCode));
LocalizationsGenerator(
fileSystem: fs,
inputPathString: defaultL10nPathString,
outputPathString: defaultL10nPathString,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles();
final String localizationsFile = fs.file(
fs.path.join(syntheticL10nPackagePath, 'output-localization-file_en.dart'),
).readAsStringSync();
expect(localizationsFile, contains(intlImportDartCode));
}); });
testWithoutContext('throws an exception when improperly formatted date is passed in', () { testWithoutContext('throws an exception when improperly formatted date is passed in', () {
const String singleDateMessageArbFileString = ''' expect(
() {
setupLocalizations(<String, String>{
'en': '''
{ {
"@@locale": "en",
"springBegins": "Spring begins on {springStartDate}", "springBegins": "Spring begins on {springStartDate}",
"@springBegins": { "@springBegins": {
"description": "The first day of spring",
"placeholders": { "placeholders": {
"springStartDate": { "springStartDate": {
"type": "DateTime", "type": "DateTime",
...@@ -1843,24 +1478,8 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e ...@@ -1843,24 +1478,8 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
} }
} }
} }
}'''; }'''
final Directory l10nDirectory = fs.currentDirectory.childDirectory('lib').childDirectory('l10n') });
..createSync(recursive: true);
l10nDirectory.childFile(defaultTemplateArbFileName)
.writeAsStringSync(singleDateMessageArbFileString);
expect(
() {
LocalizationsGenerator(
fileSystem: fs,
inputPathString: defaultL10nPathString,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles();
}, },
throwsA(isA<L10nException>().having( throwsA(isA<L10nException>().having(
(L10nException e) => e.message, (L10nException e) => e.message,
...@@ -1875,12 +1494,11 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e ...@@ -1875,12 +1494,11 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
}); });
testWithoutContext('use standard date format whenever possible', () { testWithoutContext('use standard date format whenever possible', () {
const String singleDateMessageArbFileString = ''' setupLocalizations(<String, String>{
'en': '''
{ {
"@@locale": "en",
"springBegins": "Spring begins on {springStartDate}", "springBegins": "Spring begins on {springStartDate}",
"@springBegins": { "@springBegins": {
"description": "The first day of spring",
"placeholders": { "placeholders": {
"springStartDate": { "springStartDate": {
"type": "DateTime", "type": "DateTime",
...@@ -1889,31 +1507,15 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e ...@@ -1889,31 +1507,15 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
} }
} }
} }
}'''; }'''
final Directory l10nDirectory = fs.currentDirectory.childDirectory('lib').childDirectory('l10n') });
..createSync(recursive: true); final String content = getGeneratedFileContent(locale: 'en');
l10nDirectory.childFile(defaultTemplateArbFileName) expect(content, contains('DateFormat.yMd(localeName)'));
.writeAsStringSync(singleDateMessageArbFileString);
LocalizationsGenerator(
fileSystem: fs,
inputPathString: defaultL10nPathString,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles();
final String localizationsFile = fs.file(
fs.path.join(syntheticL10nPackagePath, 'output-localization-file_en.dart'),
).readAsStringSync();
expect(localizationsFile, contains('DateFormat.yMd(localeName)'));
}); });
testWithoutContext('handle arbitrary formatted date', () { testWithoutContext('handle arbitrary formatted date', () {
const String singleDateMessageArbFileString = ''' setupLocalizations(<String, String>{
'en': '''
{ {
"@@locale": "en", "@@locale": "en",
"springBegins": "Spring begins on {springStartDate}", "springBegins": "Spring begins on {springStartDate}",
...@@ -1927,31 +1529,17 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e ...@@ -1927,31 +1529,17 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
} }
} }
} }
}'''; }'''
final Directory l10nDirectory = fs.currentDirectory.childDirectory('lib').childDirectory('l10n') });
..createSync(recursive: true); final String content = getGeneratedFileContent(locale: 'en');
l10nDirectory.childFile(defaultTemplateArbFileName) expect(content, contains(r"DateFormat('asdf o\'clock', localeName)"));
.writeAsStringSync(singleDateMessageArbFileString);
LocalizationsGenerator(
fileSystem: fs,
inputPathString: defaultL10nPathString,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles();
final String localizationsFile = fs.file(
fs.path.join(syntheticL10nPackagePath, 'output-localization-file_en.dart'),
).readAsStringSync();
expect(localizationsFile, contains(r"DateFormat('asdf o\'clock', localeName)"));
}); });
testWithoutContext('throws an exception when no format attribute is passed in', () { testWithoutContext('throws an exception when no format attribute is passed in', () {
const String singleDateMessageArbFileString = ''' expect(
() {
setupLocalizations(<String, String>{
'en': '''
{ {
"springBegins": "Spring begins on {springStartDate}", "springBegins": "Spring begins on {springStartDate}",
"@springBegins": { "@springBegins": {
...@@ -1962,25 +1550,8 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e ...@@ -1962,25 +1550,8 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
} }
} }
} }
}'''; }'''
final Directory l10nDirectory = fs.currentDirectory.childDirectory('lib').childDirectory('l10n') });
..createSync(recursive: true);
l10nDirectory.childFile(defaultTemplateArbFileName)
.writeAsStringSync(singleDateMessageArbFileString);
expect(
() {
LocalizationsGenerator(
fileSystem: fs,
inputPathString: defaultL10nPathString,
outputPathString: defaultL10nPathString,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles();
}, },
throwsA(isA<L10nException>().having( throwsA(isA<L10nException>().having(
(L10nException e) => e.message, (L10nException e) => e.message,
...@@ -1993,7 +1564,8 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e ...@@ -1993,7 +1564,8 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
group('NumberFormat tests', () { group('NumberFormat tests', () {
testWithoutContext('imports package:intl', () { testWithoutContext('imports package:intl', () {
const String singleDateMessageArbFileString = ''' setupLocalizations(<String, String>{
'en': '''
{ {
"courseCompletion": "You have completed {progress} of the course.", "courseCompletion": "You have completed {progress} of the course.",
"@courseCompletion": { "@courseCompletion": {
...@@ -2005,32 +1577,17 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e ...@@ -2005,32 +1577,17 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
} }
} }
} }
}'''; }'''
fs.currentDirectory.childDirectory('lib').childDirectory('l10n') });
..createSync(recursive: true) final String content = getGeneratedFileContent(locale: 'en');
..childFile(defaultTemplateArbFileName).writeAsStringSync( expect(content, contains(intlImportDartCode));
singleDateMessageArbFileString);
LocalizationsGenerator(
fileSystem: fs,
inputPathString: defaultL10nPathString,
outputPathString: defaultL10nPathString,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles();
final String localizationsFile = fs.file(
fs.path.join(syntheticL10nPackagePath, 'output-localization-file_en.dart'),
).readAsStringSync();
expect(localizationsFile, contains(intlImportDartCode));
}); });
testWithoutContext('throws an exception when improperly formatted number is passed in', () { testWithoutContext('throws an exception when improperly formatted number is passed in', () {
const String singleDateMessageArbFileString = ''' expect(
() {
setupLocalizations(<String, String>{
'en': '''
{ {
"courseCompletion": "You have completed {progress} of the course.", "courseCompletion": "You have completed {progress} of the course.",
"@courseCompletion": { "@courseCompletion": {
...@@ -2042,25 +1599,8 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e ...@@ -2042,25 +1599,8 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
} }
} }
} }
}'''; }'''
final Directory l10nDirectory = fs.currentDirectory.childDirectory('lib').childDirectory('l10n') });
..createSync(recursive: true);
l10nDirectory.childFile(defaultTemplateArbFileName)
.writeAsStringSync(singleDateMessageArbFileString);
expect(
() {
LocalizationsGenerator(
fileSystem: fs,
inputPathString: defaultL10nPathString,
outputPathString: defaultL10nPathString,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles();
}, },
throwsA(isA<L10nException>().having( throwsA(isA<L10nException>().having(
(L10nException e) => e.message, (L10nException e) => e.message,
...@@ -2076,29 +1616,24 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e ...@@ -2076,29 +1616,24 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
}); });
group('plural messages', () { group('plural messages', () {
testWithoutContext('intl package import should be omitted in subclass files when no plurals are included', () {
setupLocalizations(<String, String>{
'en': singleMessageArbFileString,
'es': singleEsMessageArbFileString,
});
expect(getGeneratedFileContent(locale: 'es'), isNot(contains(intlImportDartCode)));
});
testWithoutContext('warnings are generated when plural parts are repeated', () { testWithoutContext('warnings are generated when plural parts are repeated', () {
const String pluralMessageWithOverriddenParts = ''' setupLocalizations(<String, String>{
'en': '''
{ {
"helloWorlds": "{count,plural, =0{Hello}zero{hello} other{hi}}", "helloWorlds": "{count,plural, =0{Hello}zero{hello} other{hi}}",
"@helloWorlds": { "@helloWorlds": {
"description": "Properly formatted but has redundant zero cases." "description": "Properly formatted but has redundant zero cases."
} }
}'''; }'''
final Directory l10nDirectory = fs.currentDirectory.childDirectory('lib').childDirectory('l10n') });
..createSync(recursive: true);
l10nDirectory.childFile(defaultTemplateArbFileName)
.writeAsStringSync(pluralMessageWithOverriddenParts);
LocalizationsGenerator(
fileSystem: fs,
inputPathString: defaultL10nPathString,
outputPathString: defaultL10nPathString,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles();
expect(logger.hadWarningOutput, isTrue); expect(logger.hadWarningOutput, isTrue);
expect(logger.warningText, contains(''' expect(logger.warningText, contains('''
[app_en.arb:helloWorlds] ICU Syntax Warning: The plural part specified below is overridden by a later plural part. [app_en.arb:helloWorlds] ICU Syntax Warning: The plural part specified below is overridden by a later plural part.
...@@ -2107,26 +1642,13 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e ...@@ -2107,26 +1642,13 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
}); });
testWithoutContext('undefined plural cases throws syntax error', () { testWithoutContext('undefined plural cases throws syntax error', () {
const String pluralMessageWithUndefinedParts = ''' try {
setupLocalizations(<String, String>{
'en': '''
{ {
"count": "{count,plural, =0{None} =1{One} =2{Two} =3{Undefined Behavior!} other{Hmm...}}" "count": "{count,plural, =0{None} =1{One} =2{Two} =3{Undefined Behavior!} other{Hmm...}}"
}'''; }'''
final Directory l10nDirectory = fs.currentDirectory.childDirectory('lib').childDirectory('l10n') });
..createSync(recursive: true);
l10nDirectory.childFile(defaultTemplateArbFileName)
.writeAsStringSync(pluralMessageWithUndefinedParts);
try {
LocalizationsGenerator(
fileSystem: fs,
inputPathString: defaultL10nPathString,
outputPathString: defaultL10nPathString,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles();
} on L10nException catch (error) { } on L10nException catch (error) {
expect(error.message, contains('Found syntax errors.')); expect(error.message, contains('Found syntax errors.'));
expect(logger.hadErrorOutput, isTrue); expect(logger.hadErrorOutput, isTrue);
...@@ -2139,62 +1661,30 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e ...@@ -2139,62 +1661,30 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
}); });
testWithoutContext('should automatically infer plural placeholders that are not explicitly defined', () { testWithoutContext('should automatically infer plural placeholders that are not explicitly defined', () {
const String pluralMessageWithoutPlaceholdersAttribute = ''' setupLocalizations(<String, String>{
'en': '''
{ {
"helloWorlds": "{count,plural, =0{Hello}=1{Hello World}=2{Hello two worlds}few{Hello {count} worlds}many{Hello all {count} worlds}other{Hello other {count} worlds}}", "helloWorlds": "{count,plural, =0{Hello}=1{Hello World}=2{Hello two worlds}few{Hello {count} worlds}many{Hello all {count} worlds}other{Hello other {count} worlds}}",
"@helloWorlds": { "@helloWorlds": {
"description": "Improperly formatted since it has no placeholder attribute." "description": "Improperly formatted since it has no placeholder attribute."
} }
}'''; }'''
});
final Directory l10nDirectory = fs.currentDirectory.childDirectory('lib').childDirectory('l10n') expect(getGeneratedFileContent(locale: 'en'), contains('String helloWorlds(num count) {'));
..createSync(recursive: true);
l10nDirectory.childFile(defaultTemplateArbFileName)
.writeAsStringSync(pluralMessageWithoutPlaceholdersAttribute);
LocalizationsGenerator(
fileSystem: fs,
inputPathString: defaultL10nPathString,
outputPathString: defaultL10nPathString,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles();
final String localizationsFile = fs.file(
fs.path.join(syntheticL10nPackagePath, 'output-localization-file_en.dart'),
).readAsStringSync();
expect(localizationsFile, contains('String helloWorlds(num count) {'));
}); });
testWithoutContext('should throw attempting to generate a plural message with incorrect format for placeholders', () { testWithoutContext('should throw attempting to generate a plural message with incorrect format for placeholders', () {
const String pluralMessageWithIncorrectPlaceholderFormat = ''' expect(
() {
setupLocalizations(<String, String>{
'en': '''
{ {
"helloWorlds": "{count,plural, =0{Hello}=1{Hello World}=2{Hello two worlds}few{Hello {count} worlds}many{Hello all {count} worlds}other{Hello other {count} worlds}}", "helloWorlds": "{count,plural, =0{Hello}=1{Hello World}=2{Hello two worlds}few{Hello {count} worlds}many{Hello all {count} worlds}other{Hello other {count} worlds}}",
"@helloWorlds": { "@helloWorlds": {
"placeholders": "Incorrectly a string, should be a map." "placeholders": "Incorrectly a string, should be a map."
} }
}'''; }'''
});
final Directory l10nDirectory = fs.currentDirectory.childDirectory('lib').childDirectory('l10n')
..createSync(recursive: true);
l10nDirectory.childFile(defaultTemplateArbFileName)
.writeAsStringSync(pluralMessageWithIncorrectPlaceholderFormat);
expect(
() {
LocalizationsGenerator(
fileSystem: fs,
inputPathString: defaultL10nPathString,
outputPathString: defaultL10nPathString,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles();
}, },
throwsA(isA<L10nException>().having( throwsA(isA<L10nException>().having(
(L10nException e) => e.message, (L10nException e) => e.message,
...@@ -2210,62 +1700,30 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e ...@@ -2210,62 +1700,30 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
group('select messages', () { group('select messages', () {
testWithoutContext('should automatically infer select placeholders that are not explicitly defined', () { testWithoutContext('should automatically infer select placeholders that are not explicitly defined', () {
const String selectMessageWithoutPlaceholdersAttribute = ''' setupLocalizations(<String, String>{
'en': '''
{ {
"genderSelect": "{gender, select, female {She} male {He} other {they} }", "genderSelect": "{gender, select, female {She} male {He} other {they} }",
"@genderSelect": { "@genderSelect": {
"description": "Improperly formatted since it has no placeholder attribute." "description": "Improperly formatted since it has no placeholder attribute."
} }
}'''; }'''
});
final Directory l10nDirectory = fs.currentDirectory.childDirectory('lib').childDirectory('l10n') expect(getGeneratedFileContent(locale: 'en'), contains('String genderSelect(String gender) {'));
..createSync(recursive: true);
l10nDirectory.childFile(defaultTemplateArbFileName)
.writeAsStringSync(selectMessageWithoutPlaceholdersAttribute);
LocalizationsGenerator(
fileSystem: fs,
inputPathString: defaultL10nPathString,
outputPathString: defaultL10nPathString,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles();
final String localizationsFile = fs.file(
fs.path.join(syntheticL10nPackagePath, 'output-localization-file_en.dart'),
).readAsStringSync();
expect(localizationsFile, contains('String genderSelect(String gender) {'));
}); });
testWithoutContext('should throw attempting to generate a select message with incorrect format for placeholders', () { testWithoutContext('should throw attempting to generate a select message with incorrect format for placeholders', () {
const String selectMessageWithIncorrectPlaceholderFormat = ''' expect(
() {
setupLocalizations(<String, String>{
'en': '''
{ {
"genderSelect": "{gender, select, female {She} male {He} other {they} }", "genderSelect": "{gender, select, female {She} male {He} other {they} }",
"@genderSelect": { "@genderSelect": {
"placeholders": "Incorrectly a string, should be a map." "placeholders": "Incorrectly a string, should be a map."
} }
}'''; }'''
});
final Directory l10nDirectory = fs.currentDirectory.childDirectory('lib').childDirectory('l10n')
..createSync(recursive: true);
l10nDirectory.childFile(defaultTemplateArbFileName)
.writeAsStringSync(selectMessageWithIncorrectPlaceholderFormat);
expect(
() {
LocalizationsGenerator(
fileSystem: fs,
inputPathString: defaultL10nPathString,
outputPathString: defaultL10nPathString,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles();
}, },
throwsA(isA<L10nException>().having( throwsA(isA<L10nException>().having(
(L10nException e) => e.message, (L10nException e) => e.message,
...@@ -2279,7 +1737,9 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e ...@@ -2279,7 +1737,9 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
}); });
testWithoutContext('should throw attempting to generate a select message with an incorrect message', () { testWithoutContext('should throw attempting to generate a select message with an incorrect message', () {
const String selectMessageWithoutPlaceholdersAttribute = ''' try {
setupLocalizations(<String, String>{
'en': '''
{ {
"genderSelect": "{gender, select,}", "genderSelect": "{gender, select,}",
"@genderSelect": { "@genderSelect": {
...@@ -2287,24 +1747,8 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e ...@@ -2287,24 +1747,8 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
"gender": {} "gender": {}
} }
} }
}'''; }'''
});
final Directory l10nDirectory = fs.currentDirectory.childDirectory('lib').childDirectory('l10n')
..createSync(recursive: true);
l10nDirectory.childFile(defaultTemplateArbFileName)
.writeAsStringSync(selectMessageWithoutPlaceholdersAttribute);
try {
LocalizationsGenerator(
fileSystem: fs,
inputPathString: defaultL10nPathString,
outputPathString: defaultL10nPathString,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles();
} on L10nException { } on L10nException {
expect(logger.errorText, contains(''' expect(logger.errorText, contains('''
[app_en.arb:genderSelect] ICU Syntax Error: Select expressions must have an "other" case. [app_en.arb:genderSelect] ICU Syntax Error: Select expressions must have an "other" case.
...@@ -2321,30 +1765,16 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e ...@@ -2321,30 +1765,16 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
testWithoutContext('syntax/code-gen errors properly logs errors per message', () { testWithoutContext('syntax/code-gen errors properly logs errors per message', () {
// TODO(thkim1011): Fix error handling so that long indents don't get truncated. // TODO(thkim1011): Fix error handling so that long indents don't get truncated.
// See https://github.com/flutter/flutter/issues/120490. // See https://github.com/flutter/flutter/issues/120490.
const String messagesWithSyntaxErrors = ''' try {
setupLocalizations(<String, String>{
'en': '''
{ {
"hello": "Hello { name", "hello": "Hello { name",
"plural": "This is an incorrectly formatted plural: { count, plural, zero{No frog} one{One frog} other{{count} frogs}", "plural": "This is an incorrectly formatted plural: { count, plural, zero{No frog} one{One frog} other{{count} frogs}",
"explanationWithLexingError": "The 'string above is incorrect as it forgets to close the brace", "explanationWithLexingError": "The 'string above is incorrect as it forgets to close the brace",
"pluralWithInvalidCase": "{ count, plural, woohoo{huh?} other{lol} }" "pluralWithInvalidCase": "{ count, plural, woohoo{huh?} other{lol} }"
}'''; }'''
try { }, useEscaping: true);
final Directory l10nDirectory = fs.currentDirectory.childDirectory('lib').childDirectory('l10n')
..createSync(recursive: true);
l10nDirectory.childFile(defaultTemplateArbFileName)
.writeAsStringSync(messagesWithSyntaxErrors);
LocalizationsGenerator(
fileSystem: fs,
inputPathString: defaultL10nPathString,
outputPathString: defaultL10nPathString,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
useEscaping: true,
logger: logger,
)
..loadResources()
..writeOutputFiles();
} on L10nException { } on L10nException {
expect(logger.errorText, contains(''' expect(logger.errorText, contains('''
[app_en.arb:hello] ICU Syntax Error: Expected "}" but found no tokens. [app_en.arb:hello] ICU Syntax Error: Expected "}" but found no tokens.
...@@ -2363,33 +1793,11 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e ...@@ -2363,33 +1793,11 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
}); });
testWithoutContext('errors thrown in multiple languages are all shown', () { testWithoutContext('errors thrown in multiple languages are all shown', () {
const String messageEn = '''
{
"hello": "Hello { name"
}''';
const String messageEs = '''
{
"hello": "Hola { name"
}''';
try { try {
final Directory l10nDirectory = fs.currentDirectory.childDirectory('lib').childDirectory('l10n') setupLocalizations(<String, String>{
..createSync(recursive: true); 'en': '{ "hello": "Hello { name" }',
l10nDirectory.childFile(defaultTemplateArbFileName) 'es': '{ "hello": "Hola { name" }',
.writeAsStringSync(messageEn); });
l10nDirectory.childFile('app_es.arb')
.writeAsStringSync(messageEs);
LocalizationsGenerator(
fileSystem: fs,
inputPathString: defaultL10nPathString,
outputPathString: defaultL10nPathString,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
useEscaping: true,
logger: logger,
)
..loadResources()
..writeOutputFiles();
} on L10nException { } on L10nException {
expect(logger.errorText, contains(''' expect(logger.errorText, contains('''
[app_en.arb:hello] ICU Syntax Error: Expected "}" but found no tokens. [app_en.arb:hello] ICU Syntax Error: Expected "}" but found no tokens.
...@@ -2402,28 +1810,6 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e ...@@ -2402,28 +1810,6 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
}); });
}); });
testWithoutContext('intl package import should be omitted in subclass files when no plurals are included', () {
fs.currentDirectory.childDirectory('lib').childDirectory('l10n')..createSync(recursive: true)
..childFile(defaultTemplateArbFileName).writeAsStringSync(singleMessageArbFileString)
..childFile('app_es.arb').writeAsStringSync(singleEsMessageArbFileString);
LocalizationsGenerator(
fileSystem: fs,
inputPathString: defaultL10nPathString,
outputPathString: defaultL10nPathString,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles();
final String localizationsFile = fs.file(
fs.path.join(syntheticL10nPackagePath, 'output-localization-file_es.dart'),
).readAsStringSync();
expect(localizationsFile, isNot(contains(intlImportDartCode)));
});
testWithoutContext('intl package import should be kept in subclass files when plurals are included', () { testWithoutContext('intl package import should be kept in subclass files when plurals are included', () {
const String pluralMessageArb = ''' const String pluralMessageArb = '''
...@@ -2437,96 +1823,52 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e ...@@ -2437,96 +1823,52 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
} }
} }
'''; ''';
const String pluralMessageEsArb = ''' const String pluralMessageEsArb = '''
{ {
"helloWorlds": "{count,plural, =0{ES - Hello} =1{ES - Hello World} =2{ES - Hello two worlds} few{ES - Hello {count} worlds} many{ES - Hello all {count} worlds} other{ES - Hello other {count} worlds}}" "helloWorlds": "{count,plural, =0{ES - Hello} =1{ES - Hello World} =2{ES - Hello two worlds} few{ES - Hello {count} worlds} many{ES - Hello all {count} worlds} other{ES - Hello other {count} worlds}}"
} }
'''; ''';
setupLocalizations(<String, String>{
fs.currentDirectory.childDirectory('lib').childDirectory('l10n')..createSync(recursive: true) 'en': pluralMessageArb,
..childFile(defaultTemplateArbFileName).writeAsStringSync(pluralMessageArb) 'es': pluralMessageEsArb,
..childFile('app_es.arb').writeAsStringSync(pluralMessageEsArb); });
expect(getGeneratedFileContent(locale: 'en'), contains(intlImportDartCode));
LocalizationsGenerator( expect(getGeneratedFileContent(locale: 'es'), contains(intlImportDartCode));
fileSystem: fs,
inputPathString: defaultL10nPathString,
outputPathString: defaultL10nPathString,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles();
final String localizationsFile = fs.file(
fs.path.join(syntheticL10nPackagePath, 'output-localization-file_es.dart'),
).readAsStringSync();
expect(localizationsFile, contains(intlImportDartCode));
}); });
testWithoutContext('intl package import should be kept in subclass files when select is included', () { testWithoutContext('intl package import should be kept in subclass files when select is included', () {
const String selectMessageArb = ''' const String selectMessageArb = '''
{ {
"genderSelect": "{gender, select, female {She} male {He} other {they} }", "genderSelect": "{gender, select, female {She} male {He} other {they} }",
"@genderSelect": { "@genderSelect": {
"description": "A select message", "description": "A select message",
"placeholders": { "placeholders": {
"gender": {} "gender": {}
} }
} }
} }
'''; ''';
const String selectMessageEsArb = '''
const String selectMessageEsArb = ''' {
{ "genderSelect": "{gender, select, female {ES - She} male {ES - He} other {ES - they} }"
"genderSelect": "{gender, select, female {ES - She} male {ES - He} other {ES - they} }" }
} ''';
'''; setupLocalizations(<String, String>{
'en': selectMessageArb,
fs.currentDirectory.childDirectory('lib').childDirectory('l10n')..createSync(recursive: true) 'es': selectMessageEsArb,
..childFile(defaultTemplateArbFileName).writeAsStringSync(selectMessageArb) });
..childFile('app_es.arb').writeAsStringSync(selectMessageEsArb); expect(getGeneratedFileContent(locale: 'en'), contains(intlImportDartCode));
expect(getGeneratedFileContent(locale: 'es'), contains(intlImportDartCode));
LocalizationsGenerator(
fileSystem: fs,
inputPathString: defaultL10nPathString,
outputPathString: defaultL10nPathString,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles();
final String localizationsFile = fs.file(
fs.path.join(syntheticL10nPackagePath, 'output-localization-file_es.dart'),
).readAsStringSync();
expect(localizationsFile, contains(intlImportDartCode));
}); });
testWithoutContext('check indentation on generated files', () { testWithoutContext('check indentation on generated files', () {
_standardFlutterDirectoryL10nSetup(fs); setupLocalizations(<String, String>{
'en': singleMessageArbFileString,
LocalizationsGenerator( 'es': singleEsMessageArbFileString,
fileSystem: fs, });
inputPathString: defaultL10nPathString,
outputPathString: defaultL10nPathString,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles();
final String localizationsFile = fs.file(
fs.path.join(syntheticL10nPackagePath, 'output-localization-file.dart'),
).readAsStringSync();
// Tests a few of the lines in the generated code. // Tests a few of the lines in the generated code.
// Localizations lookup code // Localizations lookup code
final String localizationsFile = getGeneratedFileContent();
expect(localizationsFile.contains(' switch (locale.languageCode) {'), true); expect(localizationsFile.contains(' switch (locale.languageCode) {'), true);
expect(localizationsFile.contains(" case 'en': return AppLocalizationsEn();"), true); expect(localizationsFile.contains(" case 'en': return AppLocalizationsEn();"), true);
expect(localizationsFile.contains(" case 'es': return AppLocalizationsEs();"), true); expect(localizationsFile.contains(" case 'es': return AppLocalizationsEs();"), true);
...@@ -2540,50 +1882,19 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e ...@@ -2540,50 +1882,19 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
}); });
testWithoutContext('foundation package import should be omitted from file template when deferred loading = true', () { testWithoutContext('foundation package import should be omitted from file template when deferred loading = true', () {
fs.currentDirectory.childDirectory('lib').childDirectory('l10n')..createSync(recursive: true) setupLocalizations(<String, String>{
..childFile(defaultTemplateArbFileName).writeAsStringSync(singleMessageArbFileString) 'en': singleMessageArbFileString,
..childFile('app_es.arb').writeAsStringSync(singleEsMessageArbFileString); 'es': singleEsMessageArbFileString,
}, useDeferredLoading: true);
LocalizationsGenerator( expect(getGeneratedFileContent(), isNot(contains(foundationImportDartCode)));
fileSystem: fs,
inputPathString: defaultL10nPathString,
outputPathString: defaultL10nPathString,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
useDeferredLoading: true,
logger: logger,
)
..loadResources()
..writeOutputFiles();
final String localizationsFile = fs.file(
fs.path.join(syntheticL10nPackagePath, 'output-localization-file.dart'),
).readAsStringSync();
expect(localizationsFile, isNot(contains(foundationImportDartCode)));
}); });
testWithoutContext('foundation package import should be kept in file template when deferred loading = false', () { testWithoutContext('foundation package import should be kept in file template when deferred loading = false', () {
fs.currentDirectory.childDirectory('lib').childDirectory('l10n')..createSync(recursive: true) setupLocalizations(<String, String>{
..childFile(defaultTemplateArbFileName).writeAsStringSync(singleMessageArbFileString) 'en': singleMessageArbFileString,
..childFile('app_es.arb').writeAsStringSync(singleEsMessageArbFileString); 'es': singleEsMessageArbFileString,
});
LocalizationsGenerator( expect(getGeneratedFileContent(), contains(foundationImportDartCode));
fileSystem: fs,
inputPathString: defaultL10nPathString,
outputPathString: defaultL10nPathString,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles();
final String localizationsFile = fs.file(
fs.path.join(syntheticL10nPackagePath, 'output-localization-file.dart'),
).readAsStringSync();
expect(localizationsFile, contains(foundationImportDartCode));
}); });
testWithoutContext('check for string interpolation rules', () { testWithoutContext('check for string interpolation rules', () {
...@@ -2688,27 +1999,11 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e ...@@ -2688,27 +1999,11 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
"nine": "m{nine}" "nine": "m{nine}"
} }
'''; ''';
setupLocalizations(<String, String>{
fs.currentDirectory.childDirectory('lib').childDirectory('l10n')..createSync(recursive: true) 'en': enArbCheckList,
..childFile(defaultTemplateArbFileName).writeAsStringSync(enArbCheckList) 'es': esArbCheckList,
..childFile('app_es.arb').writeAsStringSync(esArbCheckList); });
final String localizationsFile = getGeneratedFileContent(locale: 'es');
LocalizationsGenerator(
fileSystem: fs,
inputPathString: defaultL10nPathString,
outputPathString: defaultL10nPathString,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles();
final String localizationsFile = fs.file(
fs.path.join(syntheticL10nPackagePath, 'output-localization-file_es.dart'),
).readAsStringSync();
expect(localizationsFile, contains(r'$one')); expect(localizationsFile, contains(r'$one'));
expect(localizationsFile, contains(r'$two')); expect(localizationsFile, contains(r'$two'));
expect(localizationsFile, contains(r'${three}')); expect(localizationsFile, contains(r'${three}'));
...@@ -2758,27 +2053,11 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e ...@@ -2758,27 +2053,11 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
"second": "{count,plural, =0{test {count}} other{ {count}}}" "second": "{count,plural, =0{test {count}} other{ {count}}}"
} }
'''; ''';
setupLocalizations(<String, String>{
fs.currentDirectory.childDirectory('lib').childDirectory('l10n')..createSync(recursive: true) 'en': enArbCheckList,
..childFile(defaultTemplateArbFileName).writeAsStringSync(enArbCheckList) 'es': esArbCheckList,
..childFile('app_es.arb').writeAsStringSync(esArbCheckList); });
final String localizationsFile = getGeneratedFileContent(locale: 'es');
LocalizationsGenerator(
fileSystem: fs,
inputPathString: defaultL10nPathString,
outputPathString: defaultL10nPathString,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles();
final String localizationsFile = fs.file(
fs.path.join(syntheticL10nPackagePath, 'output-localization-file_es.dart'),
).readAsStringSync();
expect(localizationsFile, contains(r'test $count test')); expect(localizationsFile, contains(r'test $count test'));
expect(localizationsFile, contains(r'哈$count哈')); expect(localizationsFile, contains(r'哈$count哈'));
expect(localizationsFile, contains(r'm${count}m')); expect(localizationsFile, contains(r'm${count}m'));
...@@ -2803,24 +2082,9 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e ...@@ -2803,24 +2082,9 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
"description": "Title for the Stocks application" "description": "Title for the Stocks application"
}, },
}'''; }''';
final Directory l10nDirectory = fs.currentDirectory.childDirectory('lib').childDirectory('l10n')
..createSync(recursive: true);
l10nDirectory.childFile(defaultTemplateArbFileName)
.writeAsStringSync(arbFileWithTrailingComma);
expect( expect(
() { () {
LocalizationsGenerator( setupLocalizations(<String, String>{ 'en': arbFileWithTrailingComma });
fileSystem: fs,
inputPathString: defaultL10nPathString,
outputPathString: defaultL10nPathString,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles();
}, },
throwsA(isA<L10nException>().having( throwsA(isA<L10nException>().having(
(L10nException e) => e.message, (L10nException e) => e.message,
...@@ -2840,25 +2104,12 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e ...@@ -2840,25 +2104,12 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
{ {
"title": "Stocks" "title": "Stocks"
}'''; }''';
final Directory l10nDirectory = fs.currentDirectory.childDirectory('lib').childDirectory('l10n')
..createSync(recursive: true);
l10nDirectory.childFile(defaultTemplateArbFileName)
.writeAsStringSync(arbFileWithMissingResourceAttribute);
expect( expect(
() { () {
LocalizationsGenerator( setupLocalizations(
fileSystem: fs, <String, String>{ 'en': arbFileWithMissingResourceAttribute },
inputPathString: defaultL10nPathString, areResourceAttributeRequired: true,
outputPathString: defaultL10nPathString, );
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
areResourceAttributesRequired: true,
logger: logger,
)
..loadResources()
..writeOutputFiles();
}, },
throwsA(isA<L10nException>().having( throwsA(isA<L10nException>().having(
(L10nException e) => e.message, (L10nException e) => e.message,
...@@ -2877,25 +2128,8 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e ...@@ -2877,25 +2128,8 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
"description": "Title for the Stocks application" "description": "Title for the Stocks application"
} }
}'''; }''';
final Directory l10nDirectory = fs.currentDirectory.childDirectory('lib').childDirectory('l10n')
..createSync(recursive: true);
l10nDirectory.childFile(defaultTemplateArbFileName)
.writeAsStringSync(nonAlphaNumericArbFile);
expect( expect(
() { () => setupLocalizations(<String, String>{ 'en': nonAlphaNumericArbFile }),
LocalizationsGenerator(
fileSystem: fs,
inputPathString: defaultL10nPathString,
outputPathString: defaultL10nPathString,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles();
},
throwsA(isA<L10nException>().having( throwsA(isA<L10nException>().having(
(L10nException e) => e.message, (L10nException e) => e.message,
'message', 'message',
...@@ -2912,25 +2146,8 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e ...@@ -2912,25 +2146,8 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
"description": "Title for the Stocks application" "description": "Title for the Stocks application"
} }
}'''; }''';
final Directory l10nDirectory = fs.currentDirectory.childDirectory('lib').childDirectory('l10n')
..createSync(recursive: true);
l10nDirectory.childFile(defaultTemplateArbFileName)
.writeAsStringSync(nonAlphaNumericArbFile);
expect( expect(
() { () => setupLocalizations(<String, String>{ 'en': nonAlphaNumericArbFile }),
LocalizationsGenerator(
fileSystem: fs,
inputPathString: defaultL10nPathString,
outputPathString: defaultL10nPathString,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles();
},
throwsA(isA<L10nException>().having( throwsA(isA<L10nException>().having(
(L10nException e) => e.message, (L10nException e) => e.message,
'message', 'message',
...@@ -2947,24 +2164,8 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e ...@@ -2947,24 +2164,8 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
"description": "Title for the Stocks application" "description": "Title for the Stocks application"
} }
}'''; }''';
final Directory l10nDirectory = fs.currentDirectory.childDirectory('lib').childDirectory('l10n')
..createSync(recursive: true);
l10nDirectory.childFile(defaultTemplateArbFileName)
.writeAsStringSync(nonAlphaNumericArbFile);
expect( expect(
() { () => setupLocalizations(<String, String>{ 'en': nonAlphaNumericArbFile }),
LocalizationsGenerator(
fileSystem: fs,
inputPathString: defaultL10nPathString,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles();
},
throwsA(isA<L10nException>().having( throwsA(isA<L10nException>().having(
(L10nException e) => e.message, (L10nException e) => e.message,
'message', 'message',
...@@ -2981,21 +2182,7 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e ...@@ -2981,21 +2182,7 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
"description": "Title for the application" "description": "Title for the application"
} }
}'''; }''';
final Directory l10nDirectory = fs.currentDirectory.childDirectory('lib').childDirectory('l10n') setupLocalizations(<String, String>{ 'en': dollarArbFile });
..createSync(recursive: true);
l10nDirectory.childFile(defaultTemplateArbFileName)
.writeAsStringSync(dollarArbFile);
LocalizationsGenerator(
fileSystem: fs,
inputPathString: defaultL10nPathString,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles();
}); });
}); });
...@@ -3035,18 +2222,9 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e ...@@ -3035,18 +2222,9 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
}); });
testWithoutContext('should generate a valid pubspec.yaml file when using synthetic package if it does not already exist', () { testWithoutContext('should generate a valid pubspec.yaml file when using synthetic package if it does not already exist', () {
_standardFlutterDirectoryL10nSetup(fs); setupLocalizations(<String, String>{
LocalizationsGenerator( 'en': singleMessageArbFileString,
fileSystem: fs, });
inputPathString: defaultL10nPathString,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles();
final Directory outputDirectory = fs.directory(syntheticPackagePath); final Directory outputDirectory = fs.directory(syntheticPackagePath);
final File pubspecFile = outputDirectory.childFile('pubspec.yaml'); final File pubspecFile = outputDirectory.childFile('pubspec.yaml');
expect(pubspecFile.existsSync(), isTrue); expect(pubspecFile.existsSync(), isTrue);
...@@ -3062,22 +2240,12 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e ...@@ -3062,22 +2240,12 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
}); });
testWithoutContext('should not overwrite existing pubspec.yaml file when using synthetic package', () { testWithoutContext('should not overwrite existing pubspec.yaml file when using synthetic package', () {
_standardFlutterDirectoryL10nSetup(fs);
final File pubspecFile = fs.file(fs.path.join(syntheticPackagePath, 'pubspec.yaml')) final File pubspecFile = fs.file(fs.path.join(syntheticPackagePath, 'pubspec.yaml'))
..createSync(recursive: true) ..createSync(recursive: true)
..writeAsStringSync('abcd'); ..writeAsStringSync('abcd');
setupLocalizations(<String, String>{
LocalizationsGenerator( 'en': singleMessageArbFileString,
fileSystem: fs, });
inputPathString: defaultL10nPathString,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles();
// The original pubspec file should not be overwritten. // The original pubspec file should not be overwritten.
expect(pubspecFile.readAsStringSync(), 'abcd'); expect(pubspecFile.readAsStringSync(), 'abcd');
}); });
...@@ -3095,57 +2263,20 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e ...@@ -3095,57 +2263,20 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
} }
} }
}'''; }''';
setupLocalizations(<String, String>{
final Directory l10nDirectory = fs.currentDirectory.childDirectory('lib').childDirectory('l10n') 'en': arbFile,
..createSync(recursive: true); });
l10nDirectory.childFile(defaultTemplateArbFileName) expect(getGeneratedFileContent(locale: 'en'), containsIgnoringWhitespace(r'''
.writeAsStringSync(arbFile);
LocalizationsGenerator(
fileSystem: fs,
inputPathString: defaultL10nPathString,
outputPathString: defaultL10nPathString,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles();
final String localizationsFile = fs.file(
fs.path.join(syntheticL10nPackagePath, 'output-localization-file_en.dart'),
).readAsStringSync();
expect(localizationsFile, containsIgnoringWhitespace(r'''
String orderNumber(int number) { String orderNumber(int number) {
return 'This is order #$number.'; return 'This is order #$number.';
} }
''')); '''));
expect(localizationsFile, isNot(contains(intlImportDartCode))); expect(getGeneratedFileContent(locale: 'en'), isNot(contains(intlImportDartCode)));
}); });
testWithoutContext('app localizations lookup is a public method', () { testWithoutContext('app localizations lookup is a public method', () {
final Directory l10nDirectory = fs.currentDirectory.childDirectory('lib').childDirectory('l10n') setupLocalizations(<String, String>{ 'en': singleMessageArbFileString });
..createSync(recursive: true); expect(getGeneratedFileContent(), containsIgnoringWhitespace(r'''
l10nDirectory.childFile(defaultTemplateArbFileName)
.writeAsStringSync(singleMessageArbFileString);
LocalizationsGenerator(
fileSystem: fs,
inputPathString: defaultL10nPathString,
outputPathString: defaultL10nPathString,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles();
final String localizationsFile = fs.file(
fs.path.join(syntheticL10nPackagePath, 'output-localization-file.dart'),
).readAsStringSync();
expect(localizationsFile, containsIgnoringWhitespace(r'''
AppLocalizations lookupAppLocalizations(Locale locale) { AppLocalizations lookupAppLocalizations(Locale locale) {
''')); '''));
}); });
...@@ -3158,29 +2289,8 @@ AppLocalizations lookupAppLocalizations(Locale locale) { ...@@ -3158,29 +2289,8 @@ AppLocalizations lookupAppLocalizations(Locale locale) {
"description": "A message with a single quote." "description": "A message with a single quote."
} }
}'''; }''';
setupLocalizations(<String, String>{ 'en': arbFile }, useEscaping: true);
final Directory l10nDirectory = fs.currentDirectory.childDirectory('lib').childDirectory('l10n') expect(getGeneratedFileContent(locale: 'en'), contains(r"Flutter\'s amazing"));
..createSync(recursive: true);
l10nDirectory.childFile(defaultTemplateArbFileName)
.writeAsStringSync(arbFile);
LocalizationsGenerator(
fileSystem: fs,
inputPathString: defaultL10nPathString,
outputPathString: defaultL10nPathString,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
useEscaping: true,
)
..loadResources()
..writeOutputFiles();
final String localizationsFile = fs.file(
fs.path.join(syntheticL10nPackagePath, 'output-localization-file_en.dart'),
).readAsStringSync();
expect(localizationsFile, contains(r"Flutter\'s amazing"));
}); });
testWithoutContext('suppress warnings flag actually suppresses warnings', () { testWithoutContext('suppress warnings flag actually suppresses warnings', () {
...@@ -3194,22 +2304,10 @@ AppLocalizations lookupAppLocalizations(Locale locale) { ...@@ -3194,22 +2304,10 @@ AppLocalizations lookupAppLocalizations(Locale locale) {
} }
} }
}'''; }''';
final Directory l10nDirectory = fs.currentDirectory.childDirectory('lib').childDirectory('l10n') setupLocalizations(
..createSync(recursive: true); <String, String>{ 'en': pluralMessageWithOverriddenParts },
l10nDirectory.childFile(defaultTemplateArbFileName)
.writeAsStringSync(pluralMessageWithOverriddenParts);
LocalizationsGenerator(
fileSystem: fs,
inputPathString: defaultL10nPathString,
outputPathString: defaultL10nPathString,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
suppressWarnings: true, suppressWarnings: true,
) );
..loadResources()
..writeOutputFiles();
expect(logger.hadWarningOutput, isFalse); expect(logger.hadWarningOutput, isFalse);
}); });
...@@ -3229,27 +2327,8 @@ AppLocalizations lookupAppLocalizations(Locale locale) { ...@@ -3229,27 +2327,8 @@ AppLocalizations lookupAppLocalizations(Locale locale) {
} }
} }
}'''; }''';
setupLocalizations(<String, String>{ 'en': arbFile });
final Directory l10nDirectory = fs.currentDirectory.childDirectory('lib').childDirectory('l10n') final String localizationsFile = getGeneratedFileContent(locale: 'en');
..createSync(recursive: true);
l10nDirectory.childFile(defaultTemplateArbFileName)
.writeAsStringSync(arbFile);
LocalizationsGenerator(
fileSystem: fs,
inputPathString: defaultL10nPathString,
outputPathString: defaultL10nPathString,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles();
final String localizationsFile = fs.file(
fs.path.join(syntheticL10nPackagePath, 'output-localization-file_en.dart'),
).readAsStringSync();
expect(localizationsFile, containsIgnoringWhitespace(r''' expect(localizationsFile, containsIgnoringWhitespace(r'''
String treeHeight(double height) { String treeHeight(double height) {
''')); '''));
...@@ -3267,25 +2346,7 @@ NumberFormat.decimalPatternDigits( ...@@ -3267,25 +2346,7 @@ NumberFormat.decimalPatternDigits(
{ {
"dollarSignWithSelect": "$nice_bug\nHello Bug! Manifistation #1 {selectPlaceholder, select, case{message} other{messageOther}}" "dollarSignWithSelect": "$nice_bug\nHello Bug! Manifistation #1 {selectPlaceholder, select, case{message} other{messageOther}}"
}'''; }''';
final Directory l10nDirectory = fs.currentDirectory.childDirectory('lib').childDirectory('l10n') setupLocalizations(<String, String>{ 'en': dollarSignWithSelect });
..createSync(recursive: true); expect(getGeneratedFileContent(locale: 'en'), contains(r'\$nice_bug\nHello Bug! Manifistation #1 $_temp0'));
l10nDirectory.childFile(defaultTemplateArbFileName)
.writeAsStringSync(dollarSignWithSelect);
LocalizationsGenerator(
fileSystem: fs,
inputPathString: defaultL10nPathString,
outputPathString: defaultL10nPathString,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
suppressWarnings: true,
)
..loadResources()
..writeOutputFiles();
final String localizationsFile = fs.file(
fs.path.join(syntheticL10nPackagePath, 'output-localization-file_en.dart'),
).readAsStringSync();
expect(localizationsFile, contains(r'\$nice_bug\nHello Bug! Manifistation #1 $_temp0'));
}); });
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment