packages/requirements/tests/Unit/Config/Markdown/Profile/BlockKindTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Config\Markdown\Profile;
6
7use League\CommonMark\Environment\Environment;
8use League\CommonMark\Exception\CommonMarkException;
9use League\CommonMark\Extension\CommonMark\CommonMarkCoreExtension;
10use League\CommonMark\Extension\CommonMark\Node\Block\ListBlock;
11use League\CommonMark\Node\Node;
12use League\CommonMark\Parser\MarkdownParser;
13use PHPUnit\Framework\Attributes\CoversClass;
14use PHPUnit\Framework\Attributes\DataProvider;
15use PHPUnit\Framework\Attributes\Small;
16use PHPUnit\Framework\TestCase;
17use Requirements\Config\Markdown\Profile\BlockKind;
18
19#[CoversClass(BlockKind::class)]
20#[Small]
21final class BlockKindTest extends TestCase
22{
23    /**
24     * @throws CommonMarkException
25     */
26    #[DataProvider('providerBlocks')]
27    public function testOfNamesBlockKind(string $markdown, string $kind): void
28    {
29        $environment = new Environment();
30        $environment->addExtension(new CommonMarkCoreExtension());
31        $node = (new MarkdownParser($environment))->parse($markdown)->firstChild();
32        self::assertInstanceOf(Node::class, $node);
33        self::assertSame($kind, BlockKind::of($node));
34    }
35
36    /**
37     * @return array<string, array{string, string}>
38     */
39    public static function providerBlocks(): array
40    {
41        return [
42            'paragraph' => ["Some text.\n", 'paragraph'],
43            'quote' => ["> Quoted.\n", 'quote'],
44            'dash bullet list' => ["- one\n- two\n", 'bullet-list'],
45            'star bullet list' => ["* one\n", 'bullet-list'],
46            'plus bullet list' => ["+ one\n", 'bullet-list'],
47            'dot ordered list' => ["1. one\n", 'ordered-list'],
48            'parenthesis ordered list' => ["3) three\n", 'ordered-list'],
49            'heading' => ["# Title\n", 'unsupported'],
50            'code fence' => ["```\ncode\n```\n", 'unsupported'],
51            'indented code' => ["    code\n", 'unsupported'],
52            'thematic break' => ["***\n", 'unsupported'],
53            'html comment' => ["<!-- note -->\n", 'unsupported'],
54        ];
55    }
56
57    /**
58     * @throws CommonMarkException
59     */
60    public function testOfNamesListItemUnsupported(): void
61    {
62        $environment = new Environment();
63        $environment->addExtension(new CommonMarkCoreExtension());
64        $list = (new MarkdownParser($environment))->parse("- one\n")->firstChild();
65        self::assertInstanceOf(ListBlock::class, $list);
66        $item = $list->firstChild();
67        self::assertInstanceOf(Node::class, $item);
68        self::assertSame('unsupported', BlockKind::of($item));
69    }
70}
71