Unverified Commit 001c499f authored by Tae Hyung Kim's avatar Tae Hyung Kim Committed by GitHub

[gen_l10n] Warn users when placeholder types are converted to 'num' when using...

[gen_l10n] Warn users when placeholder types are converted to 'num' when using pluralization (#108036)

* init

* asdf

* fix tests

* change warning slightly

* fix test again

* fix spacing and comment

* fix lint
parent f1df76e9
......@@ -252,9 +252,10 @@ class GenerateLocalizationsCommand extends FlutterCommand {
areResourceAttributesRequired: areResourceAttributesRequired,
untranslatedMessagesFile: untranslatedMessagesFile,
usesNullableGetter: usesNullableGetter,
logger: _logger,
)
..loadResources()
..writeOutputFiles(_logger);
..writeOutputFiles();
} on L10nException catch (e) {
throwToolExit(e.message);
}
......
......@@ -64,9 +64,10 @@ LocalizationsGenerator generateLocalizations({
areResourceAttributesRequired: options.areResourceAttributesRequired,
untranslatedMessagesFile: options.untranslatedMessagesFile?.toFilePath(),
usesNullableGetter: options.usesNullableGetter,
logger: logger,
)
..loadResources()
..writeOutputFiles(logger, isFromYaml: true);
..writeOutputFiles(isFromYaml: true);
} on L10nException catch (e) {
throwToolExit(e.message);
}
......@@ -698,6 +699,7 @@ class LocalizationsGenerator {
bool areResourceAttributesRequired = false,
String? untranslatedMessagesFile,
bool usesNullableGetter = true,
required Logger logger,
}) {
final Directory? projectDirectory = projectDirFromPath(fileSystem, projectPathString);
final Directory inputDirectory = inputDirectoryFromPath(fileSystem, inputPathString, projectDirectory);
......@@ -718,6 +720,7 @@ class LocalizationsGenerator {
untranslatedMessagesFile: _untranslatedMessagesFileFromPath(fileSystem, untranslatedMessagesFile),
inputsAndOutputsListFile: _inputsAndOutputsListFileFromPath(fileSystem, inputsAndOutputsListPath),
areResourceAttributesRequired: areResourceAttributesRequired,
logger: logger,
);
}
......@@ -739,6 +742,7 @@ class LocalizationsGenerator {
this.areResourceAttributesRequired = false,
this.untranslatedMessagesFile,
this.usesNullableGetter = true,
required this.logger,
});
final FileSystem _fs;
......@@ -859,6 +863,9 @@ class LocalizationsGenerator {
@visibleForTesting
final bool areResourceAttributesRequired;
/// Logger to be used during the execution of the script.
Logger logger;
static final RegExp _selectRE = RegExp(r'\{([\w\s,]*),\s*select\s*,\s*([\w\d]+\s*\{.*\})+\s*\}');
static bool _isNotReadable(FileStat fileStat) {
......@@ -1141,6 +1148,21 @@ class LocalizationsGenerator {
);
});
for (final Message message in messages) {
if (message.isPlural) {
if (message.placeholders.isEmpty) {
throw L10nException(
'Unable to find placeholders for the plural message: ${message.resourceId}.\n'
'Check to see if the plural message is in the proper ICU syntax format '
'and ensure that placeholders are properly specified.');
}
final Placeholder countPlaceholder = message.getCountPlaceholder();
if (countPlaceholder.type != null && countPlaceholder.type != 'num') {
logger.printWarning("Placeholders for plurals are automatically converted to type 'num' for the message: ${message.resourceId}.");
}
}
}
return classFileTemplate
.replaceAll('@(header)', header.isEmpty ? '' : '$header\n\n')
.replaceAll('@(language)', describeLocale(locale.toString()))
......@@ -1317,7 +1339,7 @@ class LocalizationsGenerator {
|| message.placeholdersRequireFormatting;
});
void writeOutputFiles(Logger logger, { bool isFromYaml = false }) {
void writeOutputFiles({ bool isFromYaml = false }) {
// First, generate the string contents of all necessary files.
final String generatedLocalizationsFile = _generateCode();
......
......@@ -61,12 +61,14 @@ void _standardFlutterDirectoryL10nSetup(FileSystem fs) {
void main() {
late MemoryFileSystem fs;
late BufferLogger logger;
late String defaultL10nPathString;
late String syntheticPackagePath;
late String syntheticL10nPackagePath;
setUp(() {
fs = MemoryFileSystem.test();
logger = BufferLogger.test();
defaultL10nPathString = fs.path.join('lib', 'l10n');
syntheticPackagePath = fs.path.join('.dart_tool', 'flutter_gen');
......@@ -123,9 +125,10 @@ void main() {
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles(BufferLogger.test());
..writeOutputFiles();
// Output files should be generated in the provided absolute path.
expect(
......@@ -171,6 +174,7 @@ void main() {
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
),
throwsA(isA<L10nException>().having(
(L10nException e) => e.message,
......@@ -197,6 +201,7 @@ void main() {
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
),
throwsA(isA<L10nException>().having(
(L10nException e) => e.message,
......@@ -268,6 +273,7 @@ void main() {
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
headerString: '/// Sample header',
logger: logger,
);
expect(generator.header, '/// Sample header');
......@@ -288,6 +294,7 @@ void main() {
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
headerFile: 'header.txt',
logger: logger,
);
expect(generator.header, '/// Sample header in a text file');
......@@ -306,9 +313,10 @@ void main() {
templateArbFileName: 'app_localizations_en.arb',
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles(BufferLogger.test());
..writeOutputFiles();
final Directory outputDirectory = fs.directory(syntheticL10nPackagePath);
expect(outputDirectory.childFile('output-localization-file.dart').existsSync(), isTrue);
......@@ -331,6 +339,7 @@ void main() {
templateArbFileName: 'app_localizations_en.arb',
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
).loadResources();
},
throwsA(isA<L10nException>().having(
......@@ -355,9 +364,10 @@ void main() {
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
untranslatedMessagesFile: fs.path.join('lib', 'l10n', 'unimplemented_message_translations.json'),
logger: logger,
)
..loadResources()
..writeOutputFiles(BufferLogger.test());
..writeOutputFiles();
final File unimplementedOutputFile = fs.file(
fs.path.join('lib', 'l10n', 'unimplemented_message_translations.json'),
......@@ -388,9 +398,10 @@ void main() {
classNameString: defaultClassNameString,
useSyntheticPackage: false,
untranslatedMessagesFile: fs.path.join('lib', 'l10n', 'unimplemented_message_translations.json'),
logger: logger,
)
..loadResources()
..writeOutputFiles(BufferLogger.test());
..writeOutputFiles();
final File unimplementedOutputFile = fs.file(
fs.path.join('lib', 'l10n', 'unimplemented_message_translations.json'),
......@@ -410,7 +421,6 @@ void main() {
'untranslated messages suggestion is printed when translation is missing: '
'command line message',
() {
final BufferLogger testLogger = BufferLogger.test();
fs.currentDirectory.childDirectory('lib').childDirectory('l10n')
..createSync(recursive: true)
..childFile(defaultTemplateArbFileName).writeAsStringSync(twoMessageArbFileString)
......@@ -424,16 +434,17 @@ void main() {
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
useSyntheticPackage: false,
logger: logger,
)
..loadResources()
..writeOutputFiles(testLogger);
..writeOutputFiles();
expect(
testLogger.statusText,
logger.statusText,
contains('To see a detailed report, use the --untranslated-messages-file'),
);
expect(
testLogger.statusText,
logger.statusText,
contains('flutter gen-l10n --untranslated-messages-file=desiredFileName.txt'),
);
},
......@@ -443,7 +454,6 @@ void main() {
'untranslated messages suggestion is printed when translation is missing: '
'l10n.yaml message',
() {
final BufferLogger testLogger = BufferLogger.test();
fs.currentDirectory.childDirectory('lib').childDirectory('l10n')
..createSync(recursive: true)
..childFile(defaultTemplateArbFileName).writeAsStringSync(twoMessageArbFileString)
......@@ -455,16 +465,17 @@ void main() {
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles(testLogger, isFromYaml: true);
..writeOutputFiles(isFromYaml: true);
expect(
testLogger.statusText,
logger.statusText,
contains('To see a detailed report, use the untranslated-messages-file'),
);
expect(
testLogger.statusText,
logger.statusText,
contains('untranslated-messages-file: desiredFileName.txt'),
);
},
......@@ -474,7 +485,6 @@ void main() {
'unimplemented messages suggestion is not printed when all messages '
'are fully translated',
() {
final BufferLogger testLogger = BufferLogger.test();
fs.currentDirectory.childDirectory('lib').childDirectory('l10n')
..createSync(recursive: true)
..childFile(defaultTemplateArbFileName).writeAsStringSync(twoMessageArbFileString)
......@@ -487,11 +497,12 @@ void main() {
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles(testLogger);
..writeOutputFiles();
expect(testLogger.statusText, '');
expect(logger.statusText, '');
},
);
......@@ -506,9 +517,10 @@ void main() {
classNameString: defaultClassNameString,
inputsAndOutputsListPath: syntheticL10nPackagePath,
untranslatedMessagesFile: fs.path.join('lib', 'l10n', 'unimplemented_message_translations.json'),
logger: logger,
)
..loadResources()
..writeOutputFiles(BufferLogger.test());
..writeOutputFiles();
final File inputsAndOutputsList = fs.file(
fs.path.join(syntheticL10nPackagePath, 'gen_l10n_inputs_and_outputs.json'),
......@@ -535,9 +547,10 @@ void main() {
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
useSyntheticPackage: false,
logger: logger,
)
..loadResources()
..writeOutputFiles(BufferLogger.test());
..writeOutputFiles();
final Directory outputDirectory = fs.directory('lib').childDirectory('l10n');
expect(outputDirectory.childFile('output-localization-file.dart').existsSync(), isTrue);
......@@ -572,9 +585,10 @@ void main() {
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
useSyntheticPackage: false,
logger: logger,
)
..loadResources()
..writeOutputFiles(BufferLogger.test());
..writeOutputFiles();
final Directory outputDirectory = fs.directory('lib').childDirectory('l10n').childDirectory('output');
expect(outputDirectory.existsSync(), isTrue);
......@@ -598,9 +612,10 @@ void main() {
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
useSyntheticPackage: false,
logger: logger,
)
..loadResources()
..writeOutputFiles(BufferLogger.test());
..writeOutputFiles();
final Directory outputDirectory = fs.directory('lib').childDirectory('l10n').childDirectory('output');
expect(outputDirectory.existsSync(), isTrue);
......@@ -624,9 +639,10 @@ void main() {
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
useSyntheticPackage: false,
logger: logger,
)
..loadResources()
..writeOutputFiles(BufferLogger.test());
..writeOutputFiles();
final Directory outputDirectory = fs.directory('lib').childDirectory('l10n').childDirectory('output');
expect(outputDirectory.existsSync(), isTrue);
......@@ -656,9 +672,10 @@ void main() {
classNameString: defaultClassNameString,
useSyntheticPackage: false,
usesNullableGetter: false,
logger: logger,
)
..loadResources()
..writeOutputFiles(BufferLogger.test());
..writeOutputFiles();
final Directory outputDirectory = fs.directory('lib').childDirectory('l10n').childDirectory('output');
expect(outputDirectory.existsSync(), isTrue);
......@@ -684,9 +701,10 @@ void main() {
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
inputsAndOutputsListPath: syntheticL10nPackagePath,
logger: logger,
)
..loadResources()
..writeOutputFiles(BufferLogger.test());
..writeOutputFiles();
final File inputsAndOutputsList = fs.file(
fs.path.join(syntheticL10nPackagePath, 'gen_l10n_inputs_and_outputs.json'),
......@@ -724,6 +742,7 @@ void main() {
classNameString: defaultClassNameString,
headerString: '/// Sample header for localizations file.',
headerFile: 'header.txt',
logger: logger,
);
},
throwsA(isA<L10nException>().having(
......@@ -754,6 +773,7 @@ void main() {
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
headerFile: 'header.tx', // Intentionally spelled incorrectly
logger: logger,
);
},
throwsA(isA<L10nException>().having(
......@@ -786,7 +806,7 @@ void main() {
final LocalizationsGenerator generator = generateLocalizations(
fileSystem: fs,
options: options,
logger: BufferLogger.test(),
logger: logger,
projectDir: fs.currentDirectory,
dependenciesDir: fs.currentDirectory,
);
......@@ -899,7 +919,7 @@ class AppLocalizationsEn extends AppLocalizations {
templateArbFile: Uri.file(defaultTemplateArbFileName, windows: false),
useSyntheticPackage: false,
),
logger: BufferLogger.test(),
logger: logger,
projectDir: fs.currentDirectory,
dependenciesDir: fs.currentDirectory,
);
......@@ -931,6 +951,7 @@ class AppLocalizationsEn extends AppLocalizations {
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources();
......@@ -956,6 +977,7 @@ class AppLocalizationsEn extends AppLocalizations {
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources();
......@@ -983,6 +1005,7 @@ class AppLocalizationsEn extends AppLocalizations {
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
preferredSupportedLocales: preferredSupportedLocale,
logger: logger,
)
..loadResources();
......@@ -1014,6 +1037,7 @@ class AppLocalizationsEn extends AppLocalizations {
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
preferredSupportedLocales: preferredSupportedLocale,
logger: logger,
).loadResources();
},
throwsA(isA<L10nException>().having(
......@@ -1043,6 +1067,7 @@ class AppLocalizationsEn extends AppLocalizations {
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources();
......@@ -1084,6 +1109,7 @@ class AppLocalizationsEn extends AppLocalizations {
templateArbFileName: 'first_file.arb',
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources();
......@@ -1126,6 +1152,7 @@ class AppLocalizationsEn extends AppLocalizations {
templateArbFileName: 'app_es.arb',
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
).loadResources();
},
throwsA(isA<L10nException>().having(
......@@ -1150,6 +1177,7 @@ class AppLocalizationsEn extends AppLocalizations {
templateArbFileName: 'app.arb',
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
).loadResources();
},
throwsA(isA<L10nException>().having(
......@@ -1182,6 +1210,7 @@ class AppLocalizationsEn extends AppLocalizations {
templateArbFileName: 'app_en.arb',
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
).loadResources(),
throwsA(isA<L10nException>().having(
(L10nException e) => e.message,
......@@ -1216,6 +1245,7 @@ class AppLocalizationsEn extends AppLocalizations {
templateArbFileName: 'app_en.arb',
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
).loadResources();
},
throwsA(isA<L10nException>().having(
......@@ -1241,6 +1271,7 @@ class AppLocalizationsEn extends AppLocalizations {
templateArbFileName: 'app_en_US.arb',
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
).loadResources();
},
throwsA(isA<L10nException>().having(
......@@ -1255,7 +1286,6 @@ class AppLocalizationsEn extends AppLocalizations {
group('writeOutputFiles', () {
testWithoutContext('message without placeholders - should generate code comment with description and template message translation', () {
_standardFlutterDirectoryL10nSetup(fs);
final BufferLogger testLogger = BufferLogger.test();
LocalizationsGenerator(
fileSystem: fs,
inputPathString: defaultL10nPathString,
......@@ -1263,9 +1293,10 @@ class AppLocalizationsEn extends AppLocalizations {
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles(testLogger);
..writeOutputFiles();
final File baseLocalizationsFile = fs.file(
fs.path.join(syntheticL10nPackagePath, 'output-localization-file.dart')
......@@ -1295,8 +1326,6 @@ class AppLocalizationsEn extends AppLocalizations {
l10nDirectory.childFile(esArbFileName)
.writeAsStringSync(singleEsMessageArbFileString);
final BufferLogger testLogger = BufferLogger.test();
LocalizationsGenerator(
fileSystem: fs,
inputPathString: defaultL10nPathString,
......@@ -1304,9 +1333,10 @@ class AppLocalizationsEn extends AppLocalizations {
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles(testLogger);
..writeOutputFiles();
final File baseLocalizationsFile = fs.file(
fs.path.join(syntheticL10nPackagePath, 'output-localization-file.dart')
......@@ -1345,7 +1375,6 @@ class AppLocalizationsEn extends AppLocalizations {
"price": "el precio de este artículo es: ${price}"
}''');
final BufferLogger testLogger = BufferLogger.test();
LocalizationsGenerator(
fileSystem: fs,
inputPathString: defaultL10nPathString,
......@@ -1353,9 +1382,10 @@ class AppLocalizationsEn extends AppLocalizations {
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles(testLogger);
..writeOutputFiles();
final File baseLocalizationsFile = fs.file(
fs.path.join(syntheticL10nPackagePath, 'output-localization-file.dart')
......@@ -1387,9 +1417,10 @@ class AppLocalizationsEn extends AppLocalizations {
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles(BufferLogger.test());
..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);
......@@ -1416,9 +1447,10 @@ class AppLocalizationsEn extends AppLocalizations {
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
preferredSupportedLocales: preferredSupportedLocale,
logger: logger,
)
..loadResources()
..writeOutputFiles(BufferLogger.test());
..writeOutputFiles();
final String localizationsFile = fs.file(
fs.path.join(syntheticL10nPackagePath, defaultOutputFileString),
......@@ -1443,9 +1475,10 @@ import 'output-localization-file_zh.dart';
templateArbFileName: defaultTemplateArbFileName,
outputFileString: 'output-localization-file.g.dart',
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles(BufferLogger.test());
..writeOutputFiles();
final String baseLocalizationsFile = fs.file(
fs.path.join(syntheticL10nPackagePath, 'output-localization-file.g.dart'),
......@@ -1477,9 +1510,10 @@ import 'output-localization-file.g.dart';
templateArbFileName: defaultTemplateArbFileName,
outputFileString: 'asdf',
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles(BufferLogger.test());
..writeOutputFiles();
},
throwsA(isA<L10nException>().having(
(L10nException e) => e.message,
......@@ -1502,9 +1536,10 @@ import 'output-localization-file.g.dart';
templateArbFileName: defaultTemplateArbFileName,
outputFileString: '.g.dart',
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles(BufferLogger.test());
..writeOutputFiles();
},
throwsA(isA<L10nException>().having(
(L10nException e) => e.message,
......@@ -1530,9 +1565,10 @@ import 'output-localization-file.g.dart';
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
useDeferredLoading: true,
logger: logger,
)
..loadResources()
..writeOutputFiles(BufferLogger.test());
..writeOutputFiles();
final String localizationsFile = fs.file(
fs.path.join(syntheticL10nPackagePath, defaultOutputFileString),
......@@ -1570,9 +1606,10 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles(BufferLogger.test());
..writeOutputFiles();
final String localizationsFile = fs.file(
fs.path.join(syntheticL10nPackagePath, 'output-localization-file_en.dart'),
......@@ -1608,9 +1645,10 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles(BufferLogger.test());
..writeOutputFiles();
},
throwsA(isA<L10nException>().having(
(L10nException e) => e.message,
......@@ -1651,9 +1689,10 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles(BufferLogger.test());
..writeOutputFiles();
final String localizationsFile = fs.file(
fs.path.join(syntheticL10nPackagePath, 'output-localization-file_en.dart'),
......@@ -1688,9 +1727,10 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles(BufferLogger.test());
..writeOutputFiles();
final String localizationsFile = fs.file(
fs.path.join(syntheticL10nPackagePath, 'output-localization-file_en.dart'),
......@@ -1725,9 +1765,10 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles(BufferLogger.test());
..writeOutputFiles();
},
throwsA(isA<L10nException>().having(
(L10nException e) => e.message,
......@@ -1765,9 +1806,10 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles(BufferLogger.test());
..writeOutputFiles();
final String localizationsFile = fs.file(
fs.path.join(syntheticL10nPackagePath, 'output-localization-file_en.dart'),
......@@ -1803,9 +1845,10 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles(BufferLogger.test());
..writeOutputFiles();
},
throwsA(isA<L10nException>().having(
(L10nException e) => e.message,
......@@ -1844,9 +1887,10 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles(BufferLogger.test());
..writeOutputFiles();
},
throwsA(isA<L10nException>().having(
(L10nException e) => e.message,
......@@ -1880,9 +1924,10 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles(BufferLogger.test());
..writeOutputFiles();
},
throwsA(isA<L10nException>().having(
(L10nException e) => e.message,
......@@ -1912,9 +1957,10 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles(BufferLogger.test());
..writeOutputFiles();
},
throwsA(isA<L10nException>().having(
(L10nException e) => e.message,
......@@ -1947,9 +1993,10 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles(BufferLogger.test());
..writeOutputFiles();
},
throwsA(isA<L10nException>().having(
(L10nException e) => e.message,
......@@ -1961,6 +2008,36 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
)),
);
});
testWithoutContext('should warn attempting to generate a plural message whose placeholder is not num or null', () {
const String pluralMessageWithIncorrectPlaceholderType = '''
{
"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": {
"placeholders": {
"count": {
"type": "int"
}
}
}
}''';
final Directory l10nDirectory = fs.currentDirectory.childDirectory('lib').childDirectory('l10n')
..createSync(recursive: true);
l10nDirectory.childFile(defaultTemplateArbFileName)
.writeAsStringSync(pluralMessageWithIncorrectPlaceholderType);
LocalizationsGenerator(
fileSystem: fs,
inputPathString: defaultL10nPathString,
outputPathString: defaultL10nPathString,
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles();
expect(logger.warningText, contains("Placeholders for plurals are automatically converted to type 'num'"));
});
});
group('select messages', () {
......@@ -1987,9 +2064,10 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles(BufferLogger.test());
..writeOutputFiles();
},
throwsA(isA<L10nException>().having(
(L10nException e) => e.message,
......@@ -2023,9 +2101,10 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles(BufferLogger.test());
..writeOutputFiles();
},
throwsA(isA<L10nException>().having(
(L10nException e) => e.message,
......@@ -2055,9 +2134,10 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles(BufferLogger.test());
..writeOutputFiles();
},
throwsA(isA<L10nException>().having(
(L10nException e) => e.message,
......@@ -2090,9 +2170,10 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles(BufferLogger.test());
..writeOutputFiles();
},
throwsA(isA<L10nException>().having(
(L10nException e) => e.message,
......@@ -2130,9 +2211,10 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles(BufferLogger.test());
..writeOutputFiles();
},
throwsA(isA<L10nException>().having(
(L10nException e) => e.message,
......@@ -2158,9 +2240,10 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles(BufferLogger.test());
..writeOutputFiles();
final String localizationsFile = fs.file(
fs.path.join(syntheticL10nPackagePath, 'output-localization-file_es.dart'),
......@@ -2198,9 +2281,10 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles(BufferLogger.test());
..writeOutputFiles();
final String localizationsFile = fs.file(
fs.path.join(syntheticL10nPackagePath, 'output-localization-file_es.dart'),
......@@ -2238,9 +2322,10 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles(BufferLogger.test());
..writeOutputFiles();
final String localizationsFile = fs.file(
fs.path.join(syntheticL10nPackagePath, 'output-localization-file_es.dart'),
......@@ -2258,9 +2343,10 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles(BufferLogger.test());
..writeOutputFiles();
final String localizationsFile = fs.file(
fs.path.join(syntheticL10nPackagePath, 'output-localization-file.dart'),
......@@ -2292,9 +2378,10 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
useDeferredLoading: true,
logger: logger,
)
..loadResources()
..writeOutputFiles(BufferLogger.test());
..writeOutputFiles();
final String localizationsFile = fs.file(
fs.path.join(syntheticL10nPackagePath, 'output-localization-file.dart'),
......@@ -2314,9 +2401,10 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles(BufferLogger.test());
..writeOutputFiles();
final String localizationsFile = fs.file(
fs.path.join(syntheticL10nPackagePath, 'output-localization-file.dart'),
......@@ -2438,9 +2526,10 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles(BufferLogger.test());
..writeOutputFiles();
final String localizationsFile = fs.file(
fs.path.join(syntheticL10nPackagePath, 'output-localization-file_es.dart'),
......@@ -2507,9 +2596,10 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles(BufferLogger.test());
..writeOutputFiles();
final String localizationsFile = fs.file(
fs.path.join(syntheticL10nPackagePath, 'output-localization-file_es.dart'),
......@@ -2553,9 +2643,10 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles(BufferLogger.test());
..writeOutputFiles();
},
throwsA(isA<L10nException>().having(
(L10nException e) => e.message,
......@@ -2590,9 +2681,10 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
areResourceAttributesRequired: true,
logger: logger,
)
..loadResources()
..writeOutputFiles(BufferLogger.test());
..writeOutputFiles();
},
throwsA(isA<L10nException>().having(
(L10nException e) => e.message,
......@@ -2625,9 +2717,10 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles(BufferLogger.test());
..writeOutputFiles();
},
throwsA(isA<L10nException>().having(
(L10nException e) => e.message,
......@@ -2659,9 +2752,10 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles(BufferLogger.test());
..writeOutputFiles();
},
throwsA(isA<L10nException>().having(
(L10nException e) => e.message,
......@@ -2692,9 +2786,10 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles(BufferLogger.test());
..writeOutputFiles();
},
throwsA(isA<L10nException>().having(
(L10nException e) => e.message,
......@@ -2726,9 +2821,10 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
templateArbFileName: 'app_invalid.arb',
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles(BufferLogger.test());
..writeOutputFiles();
},
throwsA(isA<L10nException>().having(
(L10nException e) => e.message,
......@@ -2747,9 +2843,10 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles(BufferLogger.test());
..writeOutputFiles();
final Directory outputDirectory = fs.directory(syntheticPackagePath);
final File pubspecFile = outputDirectory.childFile('pubspec.yaml');
......@@ -2777,9 +2874,10 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles(BufferLogger.test());
..writeOutputFiles();
// The original pubspec file should not be overwritten.
expect(pubspecFile.readAsStringSync(), 'abcd');
......@@ -2811,9 +2909,10 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles(BufferLogger.test());
..writeOutputFiles();
final String localizationsFile = fs.file(
fs.path.join(syntheticL10nPackagePath, 'output-localization-file_en.dart'),
......@@ -2839,9 +2938,10 @@ String orderNumber(int number) {
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles(BufferLogger.test());
..writeOutputFiles();
final String localizationsFile = fs.file(
fs.path.join(syntheticL10nPackagePath, 'output-localization-file.dart'),
......@@ -2883,9 +2983,10 @@ AppLocalizations lookupAppLocalizations(Locale locale) {
templateArbFileName: defaultTemplateArbFileName,
outputFileString: defaultOutputFileString,
classNameString: defaultClassNameString,
logger: logger,
)
..loadResources()
..writeOutputFiles(BufferLogger.test());
..writeOutputFiles();
final String localizationsFile = fs.file(
fs.path.join(syntheticL10nPackagePath, 'output-localization-file_en.dart'),
......
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