diff --git a/src/lib/utils/contest.ts b/src/lib/utils/contest.ts index e22a5e76c..b4e701361 100644 --- a/src/lib/utils/contest.ts +++ b/src/lib/utils/contest.ts @@ -459,12 +459,19 @@ export function getJoiContestLabel(contestId: string): string { let newLabel = base.toUpperCase(); newLabel += addJoiSubTypeIfNeeds(subType); - newLabel += SPACE; - newLabel += addJoiDivisionNameIfNeeds(division, qual); + + if (division !== undefined) { + newLabel += SPACE; + newLabel += addJoiDivisionNameIfNeeds(division, qual); + } + newLabel += SPACE; newLabel += addJoiYear(yearSuffix, yearPrefix); - newLabel += SPACE; - newLabel += addJoiQualRoundNameIfNeeds(qualRound); + + if (qualRound !== undefined) { + newLabel += SPACE; + newLabel += addJoiQualRoundNameIfNeeds(qualRound); + } return newLabel; }, @@ -485,7 +492,9 @@ function addJoiSubTypeIfNeeds(subType: string): string { function addJoiDivisionNameIfNeeds(division: string, qual: string): string { if (division === 'yo') { - if (qual === '1') { + if (qual === undefined) { + return '予選'; + } else if (qual === '1') { return '一次予選'; } else if (qual === '2') { return '二次予選'; diff --git a/src/test/lib/utils/contest.test.ts b/src/test/lib/utils/contest.test.ts index 9657bd9e4..d14c19f13 100644 --- a/src/test/lib/utils/contest.test.ts +++ b/src/test/lib/utils/contest.test.ts @@ -374,18 +374,6 @@ describe('Contest', () => { }); }); - // TODO(#issue): Skipped until notational inconsistencies are resolved. - // Current issues: - // 1. Contest names use inconsistent formats - // 2. Need to standardize naming conventions across all contests - describe.skip('when contest_id contains joi', () => { - TestCasesForContestNameLabel.joi.forEach(({ name, value }) => { - runTests(`${name}`, [value], ({ contestId, expected }: TestCaseForContestNameLabel) => { - expect(getContestNameLabel(contestId)).toEqual(expected); - }); - }); - }); - describe('when contest_id contains chokudai_S', () => { TestCasesForContestNameLabel.atCoderOthers.forEach(({ name, value }) => { runTests(`${name}`, [value], ({ contestId, expected }: TestCaseForContestNameLabel) => { @@ -446,6 +434,18 @@ describe('Contest', () => { }); }); + describe('when contest_id contains joi', () => { + TestCasesForContestNameAndTaskIndex.joi.forEach(({ name, value }) => { + runTests( + `${name}`, + [value], + ({ contestId, taskTableIndex, expected }: TestCaseForContestNameAndTaskIndex) => { + expect(addContestNameToTaskIndex(contestId, taskTableIndex)).toEqual(expected); + }, + ); + }); + }); + describe('when contest_id is tessoku-book', () => { TestCasesForContestNameAndTaskIndex.tessokuBook.forEach(({ name, value }) => { runTests( diff --git a/src/test/lib/utils/test_cases/contest_name_and_task_index.ts b/src/test/lib/utils/test_cases/contest_name_and_task_index.ts index 40af31246..003962d45 100644 --- a/src/test/lib/utils/test_cases/contest_name_and_task_index.ts +++ b/src/test/lib/utils/test_cases/contest_name_and_task_index.ts @@ -1,6 +1,7 @@ import { createTestCase, zip } from '../../common/test_helpers'; import { getPastContestLabel, + getJoiContestLabel, getAtCoderUniversityContestLabel, getAojContestLabel, PAST_TRANSLATIONS, @@ -147,6 +148,159 @@ export const past = Object.entries(PAST_TEST_DATA).flatMap(([contestId, tasks]) generatePastTestCases(Array(tasks.tasks.length).fill(contestId), tasks.tasks), ); +const generateJoiTestCases = ( + contestIds: string[], + taskIndices: string[], +): { name: string; value: TestCaseForContestNameAndTaskIndex }[] => { + return zip(contestIds, taskIndices).map(([contestId, taskIndex]) => { + const testCase = createTestCaseForContestNameAndTaskIndex(`JOI, ${contestId} ${taskIndex}`)({ + contestId: `${contestId}`, + taskTableIndex: `${taskIndex}`, + expected: `${getJoiContestLabel(contestId)} - ${taskIndex}`, + }); + + return testCase; + }); +}; + +const JOI_TEST_DATA = { + joi2006yo: { + contestId: 'joi2006yo', + tasks: ['A', 'B', 'C', 'D', 'E'], + }, + joi2007yo: { + contestId: 'joi2007yo', + tasks: ['A', 'B', 'E', 'F'], + }, + joi2018yo: { + contestId: 'joi2018yo', + tasks: ['A', 'B', 'F'], + }, + joi2024yo1c: { + contestId: 'joi2024yo1c', + tasks: ['A', 'B', 'C', 'D'], + }, + joi2025yo1a: { + contestId: 'joi2025yo1a', + tasks: ['A', 'B', 'D'], + }, + joi2025yo1b: { + contestId: 'joi2025yo1b', + tasks: ['A', 'B', 'D'], + }, + joi2023yo2: { + contestId: 'joi2023yo2', + tasks: ['A', 'B', 'C', 'D', 'E'], + }, + joi2024yo2: { + contestId: 'joi2024yo2', + tasks: ['A', 'B', 'E'], + }, + joi2006ho: { + contestId: 'joi2006ho', + tasks: ['A', 'B', 'C', 'D', 'E'], + }, + joi2007ho: { + contestId: 'joi2007ho', + tasks: ['A', 'B', 'E'], + }, + joi2023ho: { + contestId: 'joi2023ho', + tasks: ['A', 'B', 'E'], + }, + joi2024ho: { + contestId: 'joi2024ho', + tasks: ['A', 'B', 'E'], + }, + joisc2007: { + contestId: 'joisc2007', + tasks: ['anagra', 'buildi', 'salt', 'score'], + }, + joisc2008: { + contestId: 'joisc2008', + tasks: ['belt', 'typhoon'], + }, + joisc2022: { + contestId: 'joisc2022', + tasks: ['A', 'B', 'K', 'L'], + }, + joisp2023: { + contestId: 'joisp2023', + tasks: ['A', 'B', 'K', 'L'], + }, + joisp2024: { + contestId: 'joisp2024', + tasks: ['A', 'B', 'K', 'L'], + }, + joiopen2024: { + contestId: 'joiopen2024', + tasks: ['A', 'B', 'C'], + }, + 'joig2021-open': { + contestId: 'joig2021-open', + tasks: ['A', 'B', 'C', 'D', 'E', 'F'], + }, + 'joig2022-open': { + contestId: 'joig2022-open', + tasks: ['A', 'B', 'F'], + }, + 'joig2023-open': { + contestId: 'joig2023-open', + tasks: ['A', 'B', 'F'], + }, + joigsc2022: { + contestId: 'joigsc2022', + tasks: ['A', 'B', 'H'], + }, + joigsp2023: { + contestId: 'joigsp2023', + tasks: ['A', 'B', 'H'], + }, + joigsp2024: { + contestId: 'joigsp2024', + tasks: ['A', 'B', 'H'], + }, +}; + +export const joi = Object.entries(JOI_TEST_DATA).flatMap(([contestId, tasks]) => + generateJoiTestCases(Array(tasks.tasks.length).fill(contestId), tasks.tasks), +); + +// export const joi = [ +// createTestCaseForContestNameLabel('JOI 2018 qual')({ +// contestId: 'joi2018yo', +// expected: '', +// }), +// createTestCaseForContestNameLabel('JOI 2024 qual 1A')({ +// contestId: 'joi2024yo1a', +// expected: '', +// }), +// createTestCaseForContestNameLabel('JOI 2024 qual 1B')({ +// contestId: 'joi2024yo1b', +// expected: '', +// }), +// createTestCaseForContestNameLabel('JOI 2024 qual 1C')({ +// contestId: 'joi2024yo1c', +// expected: '', +// }), +// createTestCaseForContestNameLabel('JOIG 2021 open')({ +// contestId: 'joig2021-open', +// expected: '', +// }), +// createTestCaseForContestNameLabel('JOIG 2022 open')({ +// contestId: 'joig2022-open', +// expected: '', +// }), +// createTestCaseForContestNameLabel('JOIG 2023 open')({ +// contestId: 'joig2023-open', +// expected: '', +// }), +// createTestCaseForContestNameLabel('JOIG 2024 open')({ +// contestId: 'joig2024-open', +// expected: '', +// }), +// ]; + export const tessokuBook = [ createTestCaseForContestNameAndTaskIndex('Tessoku Book, Task A01')({ contestId: 'tessoku-book', diff --git a/src/test/lib/utils/test_cases/contest_name_labels.ts b/src/test/lib/utils/test_cases/contest_name_labels.ts index ba03db349..9c7a8fa97 100644 --- a/src/test/lib/utils/test_cases/contest_name_labels.ts +++ b/src/test/lib/utils/test_cases/contest_name_labels.ts @@ -28,54 +28,6 @@ export const aclPractice = [ }), ]; -// Note: Not yet implemented, because notational distortion needs to be corrected for each contest. -export const joi = [ - createTestCaseForContestNameLabel('JOIG 2024 open')({ - contestId: 'joig2024-open', - expected: '', - }), - createTestCaseForContestNameLabel('JOIG 2023 open')({ - contestId: 'joig2023-open', - expected: '', - }), - createTestCaseForContestNameLabel('JOIG 2022 open')({ - contestId: 'joig2022-open', - expected: '', - }), - createTestCaseForContestNameLabel('JOIG 2021 open')({ - contestId: 'joig2021-open', - expected: '', - }), - createTestCaseForContestNameLabel('JOI 2024 qual 1A')({ - contestId: 'joi2024yo1a', - expected: '', - }), - createTestCaseForContestNameLabel('JOI 2024 qual 1B')({ - contestId: 'joi2024yo1b', - expected: '', - }), - createTestCaseForContestNameLabel('JOI 2024 qual 1C')({ - contestId: 'joi2024yo1c', - expected: '', - }), - createTestCaseForContestNameLabel('JOI 2023 qual 1A')({ - contestId: 'joi2023yo1a', - expected: '', - }), - createTestCaseForContestNameLabel('JOI 2023 qual 1B')({ - contestId: 'joi2023yo1b', - expected: '', - }), - createTestCaseForContestNameLabel('JOI 2023 qual 1C')({ - contestId: 'joi2023yo1c', - expected: '', - }), - createTestCaseForContestNameLabel('JOI 2018 qual')({ - contestId: 'joi2018yo', - expected: '', - }), -]; - export const atCoderOthers = [ createTestCaseForContestNameLabel('Chokudai SpeedRun 001')({ contestId: 'chokudai_S001', diff --git a/src/test/lib/utils/test_cases/contest_type.ts b/src/test/lib/utils/test_cases/contest_type.ts index 2095c4516..352987ea0 100644 --- a/src/test/lib/utils/test_cases/contest_type.ts +++ b/src/test/lib/utils/test_cases/contest_type.ts @@ -88,17 +88,42 @@ export const aclPractice = [ ]; const joiContestData = [ - { name: 'JOIG 2024 open', contestId: 'joig2024-open' }, - { name: 'JOIG 2023 open', contestId: 'joig2023-open' }, - { name: 'JOIG 2022 open', contestId: 'joig2022-open' }, - { name: 'JOIG 2021 open', contestId: 'joig2021-open' }, + { name: 'JOI 2006 qual', contestId: 'joi2006yo' }, + { name: 'JOI 2007 qual', contestId: 'joi2007yo' }, + { name: 'JOI 2018 qual', contestId: 'joi2018yo' }, + { name: 'JOI 2019 qual', contestId: 'joi2019yo' }, { name: 'JOI 2024 qual 1A', contestId: 'joi2024yo1a' }, { name: 'JOI 2024 qual 1B', contestId: 'joi2024yo1b' }, { name: 'JOI 2024 qual 1C', contestId: 'joi2024yo1c' }, - { name: 'JOI 2023 qual 1A', contestId: 'joi2023yo1a' }, - { name: 'JOI 2023 qual 1B', contestId: 'joi2023yo1b' }, - { name: 'JOI 2023 qual 1C', contestId: 'joi2023yo1c' }, - { name: 'JOI 2018 qual', contestId: 'joi2018yo' }, + { name: 'JOI 2025 qual 1A', contestId: 'joi2025yo1a' }, + { name: 'JOI 2025 qual 1B', contestId: 'joi2025yo1b' }, + { name: 'JOI 2025 qual 1C', contestId: 'joi2025yo1c' }, + { name: 'JOI 2020 qual 2', contestId: 'joi2020yo2' }, + { name: 'JOI 2023 qual 2', contestId: 'joi2023yo2' }, + { name: 'JOI 2024 qual 2', contestId: 'joi2024yo2' }, + { name: 'JOI 2006 final', contestId: 'joi2006ho' }, + { name: 'JOI 2007 final', contestId: 'joi2007ho' }, + { name: 'JOI 2019 final', contestId: 'joi2019ho' }, + { name: 'JOI 2020 final', contestId: 'joi2020ho' }, + { name: 'JOI 2022 final', contestId: 'joi2022ho' }, + { name: 'JOI 2023 final', contestId: 'joi2023ho' }, + { name: 'JOI 2024 final', contestId: 'joi2024ho' }, + { name: 'JOI 2007 Spring', contestId: 'joisc2007' }, + { name: 'JOI 2008 Spring', contestId: 'joisc2008' }, + { name: 'JOI 2020 Spring', contestId: 'joisc2020' }, + { name: 'JOI 2022 Spring', contestId: 'joisc2022' }, + { name: 'JOI 2023 Spring', contestId: 'joisp2023' }, + { name: 'JOI 2024 Spring', contestId: 'joisp2024' }, + { name: 'JOI Open 2022', contestId: 'joiopen2022' }, + { name: 'JOI Open 2023', contestId: 'joiopen2023' }, + { name: 'JOI Open 2024', contestId: 'joiopen2024' }, + { name: 'JOIG 2021 open', contestId: 'joig2021-open' }, + { name: 'JOIG 2022 open', contestId: 'joig2022-open' }, + { name: 'JOIG 2023 open', contestId: 'joig2023-open' }, + { name: 'JOIG 2024 open', contestId: 'joig2024-open' }, + { name: 'JOIG 2022 Spring', contestId: 'joigsc2022' }, + { name: 'JOIG 2023 Spring', contestId: 'joigsp2023' }, + { name: 'JOIG 2024 Spring', contestId: 'joigsp2024' }, ]; export const joi = joiContestData.map(({ name, contestId }) =>