Skip to content

Commit

Permalink
Feature: validate language and region option values (#1117)
Browse files Browse the repository at this point in the history
  • Loading branch information
emmercm committed May 8, 2024
1 parent 822d001 commit 56ad757
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 26 deletions.
36 changes: 32 additions & 4 deletions src/modules/argumentsParser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -536,9 +536,16 @@ export default class ArgumentsParser {
alias: 'L',
description: `List of comma-separated languages to filter to (supported: ${Internationalization.LANGUAGES.join(', ')})`,
type: 'string',
coerce: (val: string) => val.split(','),
coerce: (val: string) => val.toUpperCase().split(','),
requiresArg: true,
})
.check((checkArgv) => {
const invalidLangs = checkArgv['filter-language']?.filter((lang) => !Internationalization.LANGUAGES.includes(lang));
if (invalidLangs !== undefined && invalidLangs.length > 0) {
throw new Error(`Invalid --filter-language language${invalidLangs.length !== 1 ? 's' : ''}: ${invalidLangs.join(', ')}`);
}
return true;
})
.option('language-filter', {
type: 'string',
coerce: (val: string) => {
Expand All @@ -554,9 +561,16 @@ export default class ArgumentsParser {
alias: 'R',
description: `List of comma-separated regions to filter to (supported: ${Internationalization.REGION_CODES.join(', ')})`,
type: 'string',
coerce: (val: string) => val.split(','),
coerce: (val: string) => val.toUpperCase().split(','),
requiresArg: true,
})
.check((checkArgv) => {
const invalidRegions = checkArgv['filter-region']?.filter((lang) => !Internationalization.REGION_CODES.includes(lang));
if (invalidRegions !== undefined && invalidRegions.length > 0) {
throw new Error(`Invalid --filter-region region${invalidRegions.length !== 1 ? 's' : ''}: ${invalidRegions.join(', ')}`);
}
return true;
})
.option('region-filter', {
type: 'string',
coerce: (val: string) => {
Expand Down Expand Up @@ -675,19 +689,33 @@ export default class ArgumentsParser {
alias: 'l',
description: `List of comma-separated languages in priority order (supported: ${Internationalization.LANGUAGES.join(', ')})`,
type: 'string',
coerce: (val: string) => val.split(','),
coerce: (val: string) => val.toUpperCase().split(','),
requiresArg: true,
implies: 'single',
})
.check((checkArgv) => {
const invalidLangs = checkArgv['prefer-language']?.filter((lang) => !Internationalization.LANGUAGES.includes(lang));
if (invalidLangs !== undefined && invalidLangs.length > 0) {
throw new Error(`Invalid --prefer-language language${invalidLangs.length !== 1 ? 's' : ''}: ${invalidLangs.join(', ')}`);
}
return true;
})
.option('prefer-region', {
group: groupRomPriority,
alias: 'r',
description: `List of comma-separated regions in priority order (supported: ${Internationalization.REGION_CODES.join(', ')})`,
type: 'string',
coerce: (val: string) => val.split(','),
coerce: (val: string) => val.toUpperCase().split(','),
requiresArg: true,
implies: 'single',
})
.check((checkArgv) => {
const invalidRegions = checkArgv['prefer-region']?.filter((lang) => !Internationalization.REGION_CODES.includes(lang));
if (invalidRegions !== undefined && invalidRegions.length > 0) {
throw new Error(`Invalid --prefer-region region${invalidRegions.length !== 1 ? 's' : ''}: ${invalidRegions.join(', ')}`);
}
return true;
})
.option('prefer-revision-newer', {
group: groupRomPriority,
description: 'Prefer newer ROM revisions over older',
Expand Down
52 changes: 30 additions & 22 deletions test/modules/argumentsParser.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -676,21 +676,25 @@ describe('options', () => {
it('should parse "prefer-language"', () => {
expect(() => argumentsParser.parse([...dummyCommandAndRequiredArgs, '--prefer-language'])).toThrow(/not enough arguments/i);
expect(() => argumentsParser.parse([...dummyCommandAndRequiredArgs, '--prefer-language', 'EN'])).toThrow(/dependent|implication/i);
expect(argumentsParser.parse([...dummyCommandAndRequiredArgs, '-l', 'EN', '--single']).getPreferLanguages()).toEqual(['EN']);
expect(argumentsParser.parse([...dummyCommandAndRequiredArgs, '--prefer-language', 'EN', '--single']).getPreferLanguages()).toEqual(['EN']);
expect(argumentsParser.parse([...dummyCommandAndRequiredArgs, '--prefer-language', 'EN,it', '--single']).getPreferLanguages()).toEqual(['EN', 'IT']);
expect(argumentsParser.parse([...dummyCommandAndRequiredArgs, '--prefer-language', 'en,IT,JA', '--single']).getPreferLanguages()).toEqual(['EN', 'IT', 'JA']);
expect(argumentsParser.parse([...dummyCommandAndRequiredArgs, '--prefer-language', 'EN,en', '--single']).getPreferLanguages()).toEqual(['EN']);
expect(() => argumentsParser.parse([...dummyCommandAndRequiredArgs, '--single', '--prefer-language', 'XX'])).toThrow(/invalid/i);
expect(() => argumentsParser.parse([...dummyCommandAndRequiredArgs, '--single', '--prefer-language', 'EN,XX'])).toThrow(/invalid/i);
expect(argumentsParser.parse([...dummyCommandAndRequiredArgs, '--single', '-l', 'EN']).getPreferLanguages()).toEqual(['EN']);
expect(argumentsParser.parse([...dummyCommandAndRequiredArgs, '--single', '--prefer-language', 'EN']).getPreferLanguages()).toEqual(['EN']);
expect(argumentsParser.parse([...dummyCommandAndRequiredArgs, '--single', '--prefer-language', 'EN,it']).getPreferLanguages()).toEqual(['EN', 'IT']);
expect(argumentsParser.parse([...dummyCommandAndRequiredArgs, '--single', '--prefer-language', 'en,IT,JA']).getPreferLanguages()).toEqual(['EN', 'IT', 'JA']);
expect(argumentsParser.parse([...dummyCommandAndRequiredArgs, '--single', '--prefer-language', 'EN,en']).getPreferLanguages()).toEqual(['EN']);
});

it('should parse "prefer-region"', () => {
expect(() => argumentsParser.parse([...dummyCommandAndRequiredArgs, '--prefer-region'])).toThrow(/not enough arguments/i);
expect(() => argumentsParser.parse([...dummyCommandAndRequiredArgs, '--prefer-region', 'USA'])).toThrow(/dependent|implication/i);
expect(argumentsParser.parse([...dummyCommandAndRequiredArgs, '-r', 'USA', '--single']).getPreferRegions()).toEqual(['USA']);
expect(argumentsParser.parse([...dummyCommandAndRequiredArgs, '--prefer-region', 'USA', '--single']).getPreferRegions()).toEqual(['USA']);
expect(argumentsParser.parse([...dummyCommandAndRequiredArgs, '--prefer-region', 'USA,eur', '--single']).getPreferRegions()).toEqual(['USA', 'EUR']);
expect(argumentsParser.parse([...dummyCommandAndRequiredArgs, '--prefer-region', 'usa,EUR,JPN', '--single']).getPreferRegions()).toEqual(['USA', 'EUR', 'JPN']);
expect(argumentsParser.parse([...dummyCommandAndRequiredArgs, '--prefer-region', 'USA,usa', '--single']).getPreferRegions()).toEqual(['USA']);
expect(() => argumentsParser.parse([...dummyCommandAndRequiredArgs, '--single', '--prefer-region', 'XX'])).toThrow(/invalid/i);
expect(() => argumentsParser.parse([...dummyCommandAndRequiredArgs, '--single', '--prefer-region', 'EN,XX'])).toThrow(/invalid/i);
expect(argumentsParser.parse([...dummyCommandAndRequiredArgs, '--single', '-r', 'USA']).getPreferRegions()).toEqual(['USA']);
expect(argumentsParser.parse([...dummyCommandAndRequiredArgs, '--single', '--prefer-region', 'USA']).getPreferRegions()).toEqual(['USA']);
expect(argumentsParser.parse([...dummyCommandAndRequiredArgs, '--single', '--prefer-region', 'USA,eur']).getPreferRegions()).toEqual(['USA', 'EUR']);
expect(argumentsParser.parse([...dummyCommandAndRequiredArgs, '--single', '--prefer-region', 'usa,EUR,JPN']).getPreferRegions()).toEqual(['USA', 'EUR', 'JPN']);
expect(argumentsParser.parse([...dummyCommandAndRequiredArgs, '--single', '--prefer-region', 'USA,usa']).getPreferRegions()).toEqual(['USA']);
});

it('should parse "prefer-revision-newer"', () => {
Expand Down Expand Up @@ -818,22 +822,26 @@ describe('options', () => {
}
});

it('should parse "language-filter"', () => {
expect(() => argumentsParser.parse([...dummyCommandAndRequiredArgs, '--language-filter'])).toThrow(/not enough arguments/i);
it('should parse "filter-language"', () => {
expect(() => argumentsParser.parse([...dummyCommandAndRequiredArgs, '--filter-language'])).toThrow(/not enough arguments/i);
expect(() => argumentsParser.parse([...dummyCommandAndRequiredArgs, '--filter-language', 'XX'])).toThrow(/invalid/i);
expect(() => argumentsParser.parse([...dummyCommandAndRequiredArgs, '--filter-language', 'EN,XX'])).toThrow(/invalid/i);
expect(argumentsParser.parse([...dummyCommandAndRequiredArgs, '-L', 'EN']).getFilterLanguage()).toEqual(new Set(['EN']));
expect(argumentsParser.parse([...dummyCommandAndRequiredArgs, '--language-filter', 'EN']).getFilterLanguage()).toEqual(new Set(['EN']));
expect(argumentsParser.parse([...dummyCommandAndRequiredArgs, '--language-filter', 'EN,it']).getFilterLanguage()).toEqual(new Set(['EN', 'IT']));
expect(argumentsParser.parse([...dummyCommandAndRequiredArgs, '--language-filter', 'en,IT,JA']).getFilterLanguage()).toEqual(new Set(['EN', 'IT', 'JA']));
expect(argumentsParser.parse([...dummyCommandAndRequiredArgs, '--language-filter', 'EN,en']).getFilterLanguage()).toEqual(new Set(['EN']));
expect(argumentsParser.parse([...dummyCommandAndRequiredArgs, '--filter-language', 'EN']).getFilterLanguage()).toEqual(new Set(['EN']));
expect(argumentsParser.parse([...dummyCommandAndRequiredArgs, '--filter-language', 'EN,it']).getFilterLanguage()).toEqual(new Set(['EN', 'IT']));
expect(argumentsParser.parse([...dummyCommandAndRequiredArgs, '--filter-language', 'en,IT,JA']).getFilterLanguage()).toEqual(new Set(['EN', 'IT', 'JA']));
expect(argumentsParser.parse([...dummyCommandAndRequiredArgs, '--filter-language', 'EN,en']).getFilterLanguage()).toEqual(new Set(['EN']));
});

it('should parse "region-filter"', () => {
expect(() => argumentsParser.parse([...dummyCommandAndRequiredArgs, '--region-filter'])).toThrow(/not enough arguments/i);
it('should parse "filter-region"', () => {
expect(() => argumentsParser.parse([...dummyCommandAndRequiredArgs, '--filter-region'])).toThrow(/not enough arguments/i);
expect(() => argumentsParser.parse([...dummyCommandAndRequiredArgs, '--filter-region', 'XYZ'])).toThrow(/invalid/i);
expect(() => argumentsParser.parse([...dummyCommandAndRequiredArgs, '--filter-region', 'USA,XYZ'])).toThrow(/invalid/i);
expect(argumentsParser.parse([...dummyCommandAndRequiredArgs, '-R', 'USA']).getFilterRegion()).toEqual(new Set(['USA']));
expect(argumentsParser.parse([...dummyCommandAndRequiredArgs, '--region-filter', 'USA']).getFilterRegion()).toEqual(new Set(['USA']));
expect(argumentsParser.parse([...dummyCommandAndRequiredArgs, '--region-filter', 'USA,eur']).getFilterRegion()).toEqual(new Set(['USA', 'EUR']));
expect(argumentsParser.parse([...dummyCommandAndRequiredArgs, '--region-filter', 'usa,EUR,JPN']).getFilterRegion()).toEqual(new Set(['USA', 'EUR', 'JPN']));
expect(argumentsParser.parse([...dummyCommandAndRequiredArgs, '--region-filter', 'USA,usa']).getFilterRegion()).toEqual(new Set(['USA']));
expect(argumentsParser.parse([...dummyCommandAndRequiredArgs, '--filter-region', 'USA']).getFilterRegion()).toEqual(new Set(['USA']));
expect(argumentsParser.parse([...dummyCommandAndRequiredArgs, '--filter-region', 'USA,eur']).getFilterRegion()).toEqual(new Set(['USA', 'EUR']));
expect(argumentsParser.parse([...dummyCommandAndRequiredArgs, '--filter-region', 'usa,EUR,JPN']).getFilterRegion()).toEqual(new Set(['USA', 'EUR', 'JPN']));
expect(argumentsParser.parse([...dummyCommandAndRequiredArgs, '--filter-region', 'USA,usa']).getFilterRegion()).toEqual(new Set(['USA']));
});

it('should parse "no-bios"', () => {
Expand Down

0 comments on commit 56ad757

Please sign in to comment.