Skip to content

Commit bd7ebcf

Browse files
committed
Add tests for alternative type notations with delimiters or arrays
1 parent c773edd commit bd7ebcf

1 file changed

Lines changed: 94 additions & 0 deletions

File tree

webapp/tests/Unit/Service/ImportProblemServiceTest.php

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,53 @@ public function testTypesYamlTest(): void
132132
}
133133
}
134134

135+
#[DataProvider('provideAlternativeTypeNotations')]
136+
public function testTypesStringWithAlternativeChars(string $separator): void
137+
{
138+
$expectedTypes = ['pass-fail', 'interactive'];
139+
$typesAsString = implode($separator, $expectedTypes);
140+
$specVersion = 'draft';
141+
$yaml = <<<YAML
142+
name: test
143+
problem_format_version: $specVersion
144+
type: $typesAsString
145+
YAML;
146+
147+
$messages = [];
148+
$validationMode = 'xxx';
149+
$problem = new Problem();
150+
151+
$ret = ImportProblemService::parseYaml($yaml, $messages, $validationMode, PropertyAccess::createPropertyAccessor(), $problem);
152+
$messageString = var_export($messages, true);
153+
$this->assertTrue($ret, 'Parsing failed for type: ' . $typesAsString . ', messages: ' . $messageString);
154+
$problemTypes = $problem->getTypesAsStringArray();
155+
$this->assertEquals(
156+
$expectedTypes, $problemTypes,
157+
'Found: "' . implode(' ', $problemTypes) . '" vs Expected: "' . implode(' ', $expectedTypes) . '"'
158+
);
159+
}
160+
161+
/**
162+
* @param string[] $expectedTypes
163+
*/
164+
#[DataProvider('provideAlternativeArrayNotations')]
165+
public function testTypesSequenceStrings(string $yaml, array $expectedTypes): void
166+
{
167+
$messages = [];
168+
$validationMode = 'xxx';
169+
$problem = new Problem();
170+
$typesAsString = implode(', ', $expectedTypes);
171+
172+
$ret = ImportProblemService::parseYaml($yaml, $messages, $validationMode, PropertyAccess::createPropertyAccessor(), $problem);
173+
$messageString = var_export($messages, true);
174+
$this->assertTrue($ret, 'Parsing failed for type: ' . $typesAsString . ', messages: ' . $messageString);
175+
$problemTypes = $problem->getTypesAsStringArray();
176+
$this->assertEquals(
177+
$expectedTypes, $problemTypes,
178+
'Found: "' . implode(' ', $problemTypes) . '" vs Expected: "' . implode(' ', $expectedTypes) . '"'
179+
);
180+
}
181+
135182
public function testUnknownProblemType(): void
136183
{
137184
$yaml = <<<YAML
@@ -684,4 +731,51 @@ public static function problemSpecVersionProvider(): Generator
684731
yield ['icpc-legacy'];
685732
yield ['2025-09'];
686733
}
734+
735+
736+
public static function provideAlternativeTypeNotations(): Generator
737+
{
738+
yield ["\t"];
739+
yield [", "];
740+
yield ["; "];
741+
}
742+
743+
public static function provideAlternativeArrayNotations(): Generator
744+
{
745+
$specVersion = 'draft';
746+
$yamlBasic = <<<YAML
747+
name: test
748+
problem_format_version: $specVersion
749+
YAML;
750+
$simpleArray = <<<YAML
751+
$yamlBasic
752+
type:
753+
- pass-fail
754+
YAML;
755+
$mappedArray = <<<YAML
756+
$yamlBasic
757+
type:
758+
pass-fail: pass-fail
759+
YAML;
760+
$oneLineArray = <<<YAML
761+
$yamlBasic
762+
type: [pass-fail]
763+
YAML;
764+
$malformedArray = <<<YAML
765+
$yamlBasic
766+
type: [pass-fail, [multi-pass, interactive]]
767+
YAML;
768+
$combinedStringArray = <<<YAML
769+
$yamlBasic
770+
type:
771+
- pass-fail
772+
- multi-pass, interactive
773+
YAML;
774+
775+
foreach ([$simpleArray, $mappedArray, $oneLineArray] as $yamlFile) {
776+
yield [$yamlFile, ['pass-fail']];
777+
}
778+
yield [$malformedArray, ['pass-fail', 'multi-pass', 'interactive']];
779+
yield [$combinedStringArray, ['pass-fail', 'multi-pass', 'interactive']];
780+
}
687781
}

0 commit comments

Comments
 (0)