Skip to content

Commit

Permalink
Feature: support Redump revisions for revision preferences (#501)
Browse files Browse the repository at this point in the history
  • Loading branch information
emmercm authored Jul 24, 2023
1 parent 8569246 commit 37e3b89
Show file tree
Hide file tree
Showing 2 changed files with 109 additions and 55 deletions.
20 changes: 17 additions & 3 deletions src/types/releaseCandidate.ts
Original file line number Diff line number Diff line change
Expand Up @@ -172,10 +172,24 @@ export default class ReleaseCandidate {
}

getRevision(): number {
const matches = this.getName().match(/\(Rev\s*([0-9.]+)\)/i);
if (matches && matches?.length >= 2 && !Number.isNaN(matches[1])) {
return Number(matches[1]);
// Numeric revision
const numberMatches = this.getName().match(/\(Rev\s*([0-9.]+)\)/i);
if (numberMatches && numberMatches?.length >= 2 && !Number.isNaN(numberMatches[1])) {
return Number(numberMatches[1]);
}

// Letter revision
const letterMatches = this.getName().match(/\(Rev\s*([A-Z])\)/i);
if (letterMatches && letterMatches?.length >= 2) {
return letterMatches[1].toUpperCase().charCodeAt(0) - 'A'.charCodeAt(0) + 1;
}

// Ring code revision
const ringCodeMatches = this.getName().match(/\(RE([0-9]+)\)/i);
if (ringCodeMatches && ringCodeMatches?.length >= 2 && !Number.isNaN(ringCodeMatches[1])) {
return Number(ringCodeMatches[1]);
}

return 0;
}

Expand Down
144 changes: 92 additions & 52 deletions test/modules/candidateFilter.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1094,74 +1094,114 @@ describe('sort', () => {
});

describe('prefer revision newer', () => {
it('should return the first candidate when option is false', async () => {
await expectPreferredCandidates({ preferRevisionNewer: false, single: true }, [
await buildReleaseCandidatesWithRegionLanguage(['one'], 'USA', 'EN'),
await buildReleaseCandidatesWithRegionLanguage(['two', 'two (Rev 1)'], 'USA', 'EN'),
await buildReleaseCandidatesWithRegionLanguage(['three', 'three (Rev 1)', 'three (Rev2)'], 'USA', 'EN'),
await buildReleaseCandidatesWithRegionLanguage(['four (Rev 1.1)', 'four (Rev 1.2)'], 'USA', 'EN'),
await buildReleaseCandidatesWithRegionLanguage(['five (Rev 13.37)'], 'USA', 'EN'),
], ['one (USA) (EN)', 'two (USA) (EN)', 'three (USA) (EN)', 'four (Rev 1.1) (USA) (EN)', 'five (Rev 13.37) (USA) (EN)']);
test.each([
[['one'], 'one'],
[['two', 'two (Rev 1)'], 'two'],
[['three', 'three (Rev 1)', 'three (Rev2)'], 'three'],
[['four (Rev 1.1)', 'four (Rev 1.2)'], 'four (Rev 1.1)'],
[['five (Rev 13.37)'], 'five (Rev 13.37)'],
[['six (Rev B)', 'six (Rev A)', 'six (Rev C)'], 'six (Rev B)'],
[['seven (RE2)', 'seven (RE3)', 'seven'], 'seven (RE2)'],
])('should return the first candidate when option is false: %s', async (names, expectedName) => {
await expectPreferredCandidates(
{ preferRevisionNewer: false, single: true },
[await buildReleaseCandidatesWithRegionLanguage(names)],
[expectedName],
);
});

it('should return the first candidate when none matching', async () => {
await expectPreferredCandidates({ preferRevisionNewer: true, single: true }, [
await buildReleaseCandidatesWithRegionLanguage(['one'], 'USA', 'EN'),
await buildReleaseCandidatesWithRegionLanguage(['two', 'two two'], 'USA', 'EN'),
], ['one (USA) (EN)', 'two (USA) (EN)']);
test.each([
[['one'], 'one'],
[['two', 'two two'], 'two'],
])('should return the first candidate when none matching: %s', async (names, expectedName) => {
await expectPreferredCandidates(
{ preferRevisionNewer: true, single: true },
[await buildReleaseCandidatesWithRegionLanguage(names)],
[expectedName],
);
});

it('should return the first matching candidate when some matching', async () => {
await expectPreferredCandidates({ preferRevisionNewer: true, single: true }, [
await buildReleaseCandidatesWithRegionLanguage(['one'], 'USA', 'EN'),
await buildReleaseCandidatesWithRegionLanguage(['two', 'two (Rev 1)'], 'USA', 'EN'),
await buildReleaseCandidatesWithRegionLanguage(['three', 'three (Rev 1)', 'three (Rev2)'], 'USA', 'EN'),
await buildReleaseCandidatesWithRegionLanguage(['four (Rev 1.1)', 'four (Rev 1.2)'], 'USA', 'EN'),
await buildReleaseCandidatesWithRegionLanguage(['five (Rev 13.37)'], 'USA', 'EN'),
], ['one (USA) (EN)', 'two (Rev 1) (USA) (EN)', 'three (Rev2) (USA) (EN)', 'four (Rev 1.2) (USA) (EN)', 'five (Rev 13.37) (USA) (EN)']);
test.each([
[['one'], 'one'],
[['two', 'two (Rev 1)'], 'two (Rev 1)'],
[['three', 'three (Rev 1)', 'three (Rev2)'], 'three (Rev2)'],
[['four (Rev 1.1)', 'four (Rev 1.2)'], 'four (Rev 1.2)'],
[['five (Rev 13.37)'], 'five (Rev 13.37)'],
[['six (Rev B)', 'six (Rev A)', 'six (Rev C)'], 'six (Rev C)'],
[['seven (RE2)', 'seven (RE3)', 'seven'], 'seven (RE3)'],
])('should return the first matching candidate when some matching: %s', async (names, expectedName) => {
await expectPreferredCandidates(
{ preferRevisionNewer: true, single: true },
[await buildReleaseCandidatesWithRegionLanguage(names)],
[expectedName],
);
});

it('should return the first candidate when all matching', async () => {
await expectPreferredCandidates({ preferRevisionNewer: true, single: true }, [
await buildReleaseCandidatesWithRegionLanguage(['one (Rev 1.1)', 'one (Rev 1.2)'], 'USA', 'EN'),
await buildReleaseCandidatesWithRegionLanguage(['two (Rev 13.37)'], 'USA', 'EN'),
], ['one (Rev 1.2) (USA) (EN)', 'two (Rev 13.37) (USA) (EN)']);
test.each([
[['one (Rev 1.1)', 'one (Rev 1.2)'], 'one (Rev 1.2)'],
[['two (Rev 13.37)'], 'two (Rev 13.37)'],
])('should return the first candidate when all matching: %s', async (names, expectedName) => {
await expectPreferredCandidates(
{ preferRevisionNewer: true, single: true },
[await buildReleaseCandidatesWithRegionLanguage(names)],
[expectedName],
);
});
});

describe('prefer revision older', () => {
it('should return the first candidate when option is false', async () => {
await expectPreferredCandidates({ preferRevisionOlder: false, single: true }, [
await buildReleaseCandidatesWithRegionLanguage(['one'], 'USA', 'EN'),
await buildReleaseCandidatesWithRegionLanguage(['two', 'two (Rev 1)'], 'USA', 'EN'),
await buildReleaseCandidatesWithRegionLanguage(['three', 'three (Rev 1)', 'three (Rev2)'], 'USA', 'EN'),
await buildReleaseCandidatesWithRegionLanguage(['four (Rev 1.1)', 'four (Rev 1.2)'], 'USA', 'EN'),
await buildReleaseCandidatesWithRegionLanguage(['five (Rev 13.37)'], 'USA', 'EN'),
], ['one (USA) (EN)', 'two (USA) (EN)', 'three (USA) (EN)', 'four (Rev 1.1) (USA) (EN)', 'five (Rev 13.37) (USA) (EN)']);
test.each([
[['one'], 'one'],
[['two', 'two (Rev 1)'], 'two'],
[['three', 'three (Rev 1)', 'three (Rev2)'], 'three'],
[['four (Rev 1.1)', 'four (Rev 1.2)'], 'four (Rev 1.1)'],
[['five (Rev 13.37)'], 'five (Rev 13.37)'],
[['six (Rev B)', 'six (Rev A)', 'six (Rev C)'], 'six (Rev B)'],
[['seven (RE2)', 'seven (RE3)', 'seven'], 'seven (RE2)'],
])('should return the first candidate when option is false: %s', async (names, expectedName) => {
await expectPreferredCandidates(
{ preferRevisionOlder: false, single: true },
[await buildReleaseCandidatesWithRegionLanguage(names)],
[expectedName],
);
});

it('should return the first candidate when none matching', async () => {
await expectPreferredCandidates({ preferRevisionOlder: true, single: true }, [
await buildReleaseCandidatesWithRegionLanguage(['one'], 'USA', 'EN'),
await buildReleaseCandidatesWithRegionLanguage(['two', 'two two'], 'USA', 'EN'),
], ['one (USA) (EN)', 'two (USA) (EN)']);
test.each([
[['one'], 'one'],
[['two', 'two two'], 'two'],
])('should return the first candidate when none matching: %s', async (names, expectedName) => {
await expectPreferredCandidates(
{ preferRevisionOlder: true, single: true },
[await buildReleaseCandidatesWithRegionLanguage(names)],
[expectedName],
);
});

it('should return the first matching candidate when some matching', async () => {
await expectPreferredCandidates({ preferRevisionOlder: true, single: true }, [
await buildReleaseCandidatesWithRegionLanguage(['one'], 'USA', 'EN'),
await buildReleaseCandidatesWithRegionLanguage(['two', 'two (Rev 1)'], 'USA', 'EN'),
await buildReleaseCandidatesWithRegionLanguage(['three', 'three (Rev 1)', 'three (Rev2)'], 'USA', 'EN'),
await buildReleaseCandidatesWithRegionLanguage(['four (Rev 1.1)', 'four (Rev 1.2)'], 'USA', 'EN'),
await buildReleaseCandidatesWithRegionLanguage(['five (Rev 13.37)'], 'USA', 'EN'),
], ['one (USA) (EN)', 'two (USA) (EN)', 'three (USA) (EN)', 'four (Rev 1.1) (USA) (EN)', 'five (Rev 13.37) (USA) (EN)']);
test.each([
[['one'], 'one'],
[['two', 'two (Rev 1)'], 'two'],
[['three', 'three (Rev 1)', 'three (Rev2)'], 'three'],
[['four (Rev 1.2)', 'four (Rev 1.1)'], 'four (Rev 1.1)'],
[['five (Rev 13.37)'], 'five (Rev 13.37)'],
[['six (Rev B)', 'six (Rev A)', 'six (Rev C)'], 'six (Rev A)'],
[['seven (RE2)', 'seven (RE3)', 'seven'], 'seven'],
])('should return the first matching candidate when some matching: %s', async (names, expectedName) => {
await expectPreferredCandidates(
{ preferRevisionOlder: true, single: true },
[await buildReleaseCandidatesWithRegionLanguage(names)],
[expectedName],
);
});

it('should return the first candidate when all matching', async () => {
await expectPreferredCandidates({ preferRevisionOlder: true, single: true }, [
await buildReleaseCandidatesWithRegionLanguage(['one (Rev 1.1)', 'one (Rev 1.2)'], 'USA', 'EN'),
await buildReleaseCandidatesWithRegionLanguage(['two (Rev 13.37)'], 'USA', 'EN'),
], ['one (Rev 1.1) (USA) (EN)', 'two (Rev 13.37) (USA) (EN)']);
test.each([
[['one (Rev 1.2)', 'one (Rev 1.1)'], 'one (Rev 1.1)'],
[['two (Rev 13.37)'], 'two (Rev 13.37)'],
])('should return the first candidate when all matching: %s', async (names, expectedName) => {
await expectPreferredCandidates(
{ preferRevisionOlder: true, single: true },
[await buildReleaseCandidatesWithRegionLanguage(names)],
[expectedName],
);
});
});

Expand Down

0 comments on commit 37e3b89

Please sign in to comment.