mirror of
https://github.com/MarijnDoeve/TijdVoorDeTest.git
synced 2026-07-05 23:20:18 +02:00
Compare commits
1 Commits
466f0aeb54
..
0.1.0
| Author | SHA1 | Date | |
|---|---|---|---|
| 404c0dcc26 |
+1
-1
@@ -8,7 +8,7 @@
|
|||||||
failOnNotice="true"
|
failOnNotice="true"
|
||||||
failOnWarning="true"
|
failOnWarning="true"
|
||||||
bootstrap="tests/bootstrap.php"
|
bootstrap="tests/bootstrap.php"
|
||||||
cacheDirectory=".phpunit.cache"
|
cacheDirectory="/tmp/phpunit.cache"
|
||||||
>
|
>
|
||||||
<php>
|
<php>
|
||||||
<ini name="display_errors" value="1" />
|
<ini name="display_errors" value="1" />
|
||||||
|
|||||||
@@ -18,39 +18,40 @@ class QuizSpreadsheetService
|
|||||||
{
|
{
|
||||||
public function generateTemplate(bool $fillExample = true): \Closure
|
public function generateTemplate(bool $fillExample = true): \Closure
|
||||||
{
|
{
|
||||||
$spreadsheet = new Spreadsheet();
|
$quiz = new Quiz();
|
||||||
|
|
||||||
$sheet = $spreadsheet->getActiveSheet();
|
|
||||||
|
|
||||||
$sheet->getStyle('1:1')->getFont()->setBold(true);
|
|
||||||
|
|
||||||
$sheet->setCellValue('A1', 'Question');
|
|
||||||
$sheet->getColumnDimension('A')->setWidth(30);
|
|
||||||
$sheet->getStyle('A:A')->getAlignment()->setWrapText(true);
|
|
||||||
|
|
||||||
$counter = 1;
|
|
||||||
foreach (range('B', 'L', 2) as $column) {
|
|
||||||
$sheet->setCellValue($column.'1', 'Answer '.$counter++);
|
|
||||||
$sheet->getColumnDimension($column)->setWidth(30);
|
|
||||||
$sheet->getStyle($column.':'.$column)->getAlignment()->setWrapText(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (range('C', 'M', 2) as $column) {
|
|
||||||
$sheet->setCellValue($column.'1', 'Correct');
|
|
||||||
$sheet->getColumnDimension($column)->setAutoSize(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($fillExample) {
|
if ($fillExample) {
|
||||||
$sheet->setCellValue('B2', 'Man');
|
$geslacht = new Question();
|
||||||
$sheet->setCellValue('C2', true);
|
$geslacht->question = 'Is de mol een man of een vrouw?';
|
||||||
|
$geslacht->ordering = 1;
|
||||||
|
$geslacht->addAnswer(new Answer('Man', true));
|
||||||
|
$geslacht->addAnswer(new Answer('Vrouw'));
|
||||||
|
$quiz->addQuestion($geslacht);
|
||||||
|
|
||||||
$sheet->setCellValue('D2', 'Vrouw');
|
$identiteit = new Question();
|
||||||
$sheet->setCellValue('E2', false);
|
$identiteit->question = 'Wie is de mol?';
|
||||||
|
$identiteit->ordering = 2;
|
||||||
|
foreach ([
|
||||||
|
['Emma', false],
|
||||||
|
['Jan', false],
|
||||||
|
['Sara', false],
|
||||||
|
['Piet', false],
|
||||||
|
['Lisa', true],
|
||||||
|
['Kees', false],
|
||||||
|
['Anna', false],
|
||||||
|
['Henk', false],
|
||||||
|
['Nina', false],
|
||||||
|
['Joost', false],
|
||||||
|
] as $i => [$name, $correct]) {
|
||||||
|
$answer = new Answer($name, $correct);
|
||||||
|
$answer->ordering = $i + 1;
|
||||||
|
$identiteit->addAnswer($answer);
|
||||||
|
}
|
||||||
|
|
||||||
$sheet->setCellValue('A2', 'Is de mol een man of een vrouw?');
|
$quiz->addQuestion($identiteit);
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->toXlsx($spreadsheet);
|
return $this->quizToXlsx($quiz);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @throws SpreadsheetDataException */
|
/** @throws SpreadsheetDataException */
|
||||||
@@ -102,7 +103,7 @@ class QuizSpreadsheetService
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (1 === $answerCounter) {
|
if (1 === $answerCounter) {
|
||||||
$errors[] = \sprintf('Question %d has no answers', $answerCounter);
|
$errors[] = \sprintf('Question %d has no answers', $question->ordering);
|
||||||
}
|
}
|
||||||
|
|
||||||
$quiz->addQuestion($question);
|
$quiz->addQuestion($question);
|
||||||
|
|||||||
@@ -5,6 +5,8 @@ declare(strict_types=1);
|
|||||||
namespace Tvdt\Tests\Service;
|
namespace Tvdt\Tests\Service;
|
||||||
|
|
||||||
use PhpOffice\PhpSpreadsheet\Reader;
|
use PhpOffice\PhpSpreadsheet\Reader;
|
||||||
|
use PhpOffice\PhpSpreadsheet\Spreadsheet;
|
||||||
|
use PhpOffice\PhpSpreadsheet\Writer;
|
||||||
use PHPUnit\Framework\Attributes\CoversClass;
|
use PHPUnit\Framework\Attributes\CoversClass;
|
||||||
use PHPUnit\Framework\Attributes\DataProvider;
|
use PHPUnit\Framework\Attributes\DataProvider;
|
||||||
use PHPUnit\Framework\TestCase;
|
use PHPUnit\Framework\TestCase;
|
||||||
@@ -69,12 +71,17 @@ final class QuizSpreadsheetServiceTest extends TestCase
|
|||||||
$quiz = new Quiz();
|
$quiz = new Quiz();
|
||||||
$this->subject->xlsxToQuiz($quiz, new File($path));
|
$this->subject->xlsxToQuiz($quiz, new File($path));
|
||||||
|
|
||||||
$this->assertCount(1, $quiz->questions);
|
$this->assertCount(2, $quiz->questions);
|
||||||
|
|
||||||
/** @var Question $question */
|
/** @var Question $first */
|
||||||
$question = $quiz->questions->first();
|
$first = $quiz->questions->first();
|
||||||
$this->assertSame('Is de mol een man of een vrouw?', $question->question);
|
$this->assertSame('Is de mol een man of een vrouw?', $first->question);
|
||||||
$this->assertCount(2, $question->answers);
|
$this->assertCount(2, $first->answers);
|
||||||
|
|
||||||
|
/** @var Question $second */
|
||||||
|
$second = $quiz->questions->last();
|
||||||
|
$this->assertSame('Wie is de mol?', $second->question);
|
||||||
|
$this->assertCount(10, $second->answers);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testQuizToXlsxEmptyQuizImportsWithNoQuestions(): void
|
public function testQuizToXlsxEmptyQuizImportsWithNoQuestions(): void
|
||||||
@@ -142,17 +149,44 @@ final class QuizSpreadsheetServiceTest extends TestCase
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @return array<string, array{int, string, int, string, int, int}> */
|
public function testXlsxToQuizStopsAtBlankRow(): void
|
||||||
public static function answerCountHeaderProvider(): array
|
{
|
||||||
|
$spreadsheet = new Spreadsheet();
|
||||||
|
$sheet = $spreadsheet->getActiveSheet();
|
||||||
|
$sheet->setCellValue('A1', 'Question');
|
||||||
|
$sheet->setCellValue('B1', 'Answer 1');
|
||||||
|
$sheet->setCellValue('C1', 'Correct');
|
||||||
|
$sheet->setCellValue('A2', 'First question');
|
||||||
|
$sheet->setCellValue('B2', 'Yes');
|
||||||
|
$sheet->setCellValue('C2', true);
|
||||||
|
// Row 3 intentionally blank — should halt parsing
|
||||||
|
$sheet->setCellValue('A4', 'Second question');
|
||||||
|
$sheet->setCellValue('B4', 'No');
|
||||||
|
$sheet->setCellValue('C4', false);
|
||||||
|
|
||||||
|
$path = $this->createTempPath('.xlsx');
|
||||||
|
ob_start();
|
||||||
|
new Writer\Xlsx($spreadsheet)->save('php://output');
|
||||||
|
file_put_contents($path, ob_get_clean());
|
||||||
|
|
||||||
|
$quiz = new Quiz();
|
||||||
|
$this->subject->xlsxToQuiz($quiz, new File($path));
|
||||||
|
|
||||||
|
$this->assertCount(1, $quiz->questions);
|
||||||
|
/** @var Question $first */
|
||||||
|
$first = $quiz->questions->first();
|
||||||
|
$this->assertSame('First question', $first->question);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @return \Iterator<string, array{int, string, int, string, int, int}> */
|
||||||
|
public static function answerCountHeaderProvider(): \Iterator
|
||||||
{
|
{
|
||||||
// Columns (0-based): Question=0, Answer1=1, Correct=2, Answer2=3, Correct=4, …
|
// Columns (0-based): Question=0, Answer1=1, Correct=2, Answer2=3, Correct=4, …
|
||||||
// Answer N is at index 1+2*(N-1) = 2N-1, Correct N at 2+2*(N-1) = 2N.
|
// Answer N is at index 1+2*(N-1) = 2N-1, Correct N at 2+2*(N-1) = 2N.
|
||||||
return [
|
yield '2 answers → 2 header pairs' => [2, 'Answer 2', 3, 'Correct', 4, 5];
|
||||||
'2 answers → 2 header pairs' => [2, 'Answer 2', 3, 'Correct', 4, 5],
|
yield '6 answers → 6 header pairs' => [6, 'Answer 6', 11, 'Correct', 12, 13];
|
||||||
'6 answers → 6 header pairs' => [6, 'Answer 6', 11, 'Correct', 12, 13],
|
yield '7 answers → 7 header pairs' => [7, 'Answer 7', 13, 'Correct', 14, 15];
|
||||||
'7 answers → 7 header pairs' => [7, 'Answer 7', 13, 'Correct', 14, 15],
|
yield '10 answers → 10 header pairs' => [10, 'Answer 10', 19, 'Correct', 20, 21];
|
||||||
'10 answers → 10 header pairs' => [10, 'Answer 10', 19, 'Correct', 20, 21],
|
|
||||||
];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[DataProvider('answerCountHeaderProvider')]
|
#[DataProvider('answerCountHeaderProvider')]
|
||||||
@@ -228,7 +262,7 @@ final class QuizSpreadsheetServiceTest extends TestCase
|
|||||||
{
|
{
|
||||||
$quiz = new Quiz();
|
$quiz = new Quiz();
|
||||||
foreach ($counts as $i => $count) {
|
foreach ($counts as $i => $count) {
|
||||||
$quiz->addQuestion($this->makeQuestion("Question $i", $count));
|
$quiz->addQuestion($this->makeQuestion('Question '.$i, $count));
|
||||||
}
|
}
|
||||||
|
|
||||||
return $quiz;
|
return $quiz;
|
||||||
@@ -240,7 +274,7 @@ final class QuizSpreadsheetServiceTest extends TestCase
|
|||||||
$question->question = $text;
|
$question->question = $text;
|
||||||
$question->ordering = 1;
|
$question->ordering = 1;
|
||||||
for ($i = 1; $i <= $answerCount; ++$i) {
|
for ($i = 1; $i <= $answerCount; ++$i) {
|
||||||
$question->addAnswer(new Answer("Answer $i", isRightAnswer: false));
|
$question->addAnswer(new Answer('Answer '.$i, isRightAnswer: false));
|
||||||
}
|
}
|
||||||
|
|
||||||
return $question;
|
return $question;
|
||||||
@@ -249,7 +283,7 @@ final class QuizSpreadsheetServiceTest extends TestCase
|
|||||||
/** @return array<int, string|null> */
|
/** @return array<int, string|null> */
|
||||||
private function readFirstRow(string $path): array
|
private function readFirstRow(string $path): array
|
||||||
{
|
{
|
||||||
$rows = (new Reader\Xlsx())->setReadDataOnly(true)->load($path)->getActiveSheet()->toArray(formatData: false);
|
$rows = new Reader\Xlsx()->setReadDataOnly(true)->load($path)->getActiveSheet()->toArray(formatData: false);
|
||||||
|
|
||||||
return $rows[0] ?? [];
|
return $rows[0] ?? [];
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user