File: ConverterTest.php

package info (click to toggle)
php-league-uri-src 7.5.1-7
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,712 kB
  • sloc: php: 16,698; javascript: 127; makefile: 43; xml: 36
file content (113 lines) | stat: -rw-r--r-- 4,889 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
<?php

/**
 * League.Uri (https://uri.thephpleague.com)
 *
 * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

declare(strict_types=1);

namespace League\Uri\KeyValuePair;

use PHPUnit\Framework\TestCase;

final class ConverterTest extends TestCase
{
    public function testItWilltConvertPairsToStringOrNull(): void
    {
        $converterWithAmpersand = Converter::new('&');
        self::assertSame('&', $converterWithAmpersand->separator());
        self::assertSame([], $converterWithAmpersand->encodingMap());
        self::assertSame('a=b', $converterWithAmpersand->toValue([['a', 'b']]));
        self::assertSame('a=b&b=c', $converterWithAmpersand->toValue([['a', 'b'], ['b', 'c']]));
        self::assertSame('a=&b', $converterWithAmpersand->toValue([['a', ''], ['b', null]]));
        self::assertSame('=&=', $converterWithAmpersand->toValue([['', ''], ['', '']]));
        self::assertSame('a==', $converterWithAmpersand->toValue([['a', '=']]));
        self::assertSame('&&', $converterWithAmpersand->toValue([['', null], ['', null], ['', null]]));
        self::assertNull($converterWithAmpersand->toValue([]));

        $converterWithSemiColon = Converter::new(';');
        self::assertSame(';', $converterWithSemiColon->separator());
        self::assertSame([], $converterWithSemiColon->encodingMap());
        self::assertSame('a=b', $converterWithSemiColon->toValue([['a', 'b']]));
        self::assertSame('a=b;b=c', $converterWithSemiColon->toValue([['a', 'b'], ['b', 'c']]));
        self::assertSame('a=;b', $converterWithSemiColon->toValue([['a', ''], ['b', null]]));
        self::assertSame('=;=', $converterWithSemiColon->toValue([['', ''], ['', '']]));
        self::assertSame('a==', $converterWithSemiColon->toValue([['a', '=']]));
        self::assertNull($converterWithSemiColon->toValue([]));
    }

    public function testItWillConvertPairsAndMapCharactersIfNeeded(): void
    {
        $converter = Converter::new('&')->withEncodingMap(['FOO' => 'bar']);
        self::assertSame('&', $converter->separator());
        self::assertSame(['FOO' => 'bar'], $converter->encodingMap());
        self::assertSame('toto=bar', $converter->toValue([['toto', 'FOO']]));
    }

    public function testEncodingDecodingMapDiffersWithEachSpecification(): void
    {
        $encoded = [['tata%2A%3F%2F%20_%2B', 'tata%2A%3F%2F%20_%2B']];

        $rfc3986 = Converter::fromRFC3986();
        self::assertSame([], $rfc3986->encodingMap());
        self::assertSame('tata%2A%3F%2F%20_%2B=tata%2A%3F%2F%20_%2B', $rfc3986->toValue($encoded));
        self::assertSame($encoded, $rfc3986->toPairs('tata%2A%3F%2F%20_%2B=tata%2A%3F%2F%20_%2B'));

        $rfc1738 = Converter::fromRFC1738();
        self::assertSame(['%20' => '+'], $rfc1738->encodingMap());
        self::assertSame('tata%2A%3F%2F+_%2B=tata%2A%3F%2F+_%2B', $rfc1738->toValue($encoded));
        self::assertSame($encoded, $rfc1738->toPairs('tata%2A%3F%2F+_%2B=tata%2A%3F%2F+_%2B'));

        $formData = Converter::fromFormData();
        self::assertSame(['%20' => '+', '%2A' => '*'], $formData->encodingMap());
        self::assertSame('tata*%3F%2F+_%2B=tata*%3F%2F+_%2B', $formData->toValue($encoded));
        self::assertSame($encoded, $formData->toPairs('tata*%3F%2F+_%2B=tata*%3F%2F+_%2B'));
    }

    public function testEncodingValueByType(): void
    {
        self::assertSame(
            'string=string;true=1;false=0;integer=42;float=42.0;null',
            Converter::new(';')->toValue([
                ['string', 'string'],
                ['true', true],
                ['false', false],
                ['integer', 42],
                ['float', 42.000000000],
                ['null', null],
            ])
        );
    }

    public function testDecodingValue(): void
    {
        self::assertSame(
            [
                ['string', 'string'],
                ['true', '1'],
                ['false', '0'],
                ['integer', '42'],
                ['float', '42.000000000'],
                ['null', null],
            ],
            Converter::new(';')->toPairs('string=string;true=1;false=0;integer=42;float=42.000000000;null')
        );
    }

    public function testDecodingByType(): void
    {
        $converter = Converter::new(';');
        self::assertSame([], $converter->toPairs(null));
        self::assertSame([['', null]], $converter->toPairs(''));
        self::assertSame([['42', null]], $converter->toPairs(42));
        self::assertSame([['42', null]], $converter->toPairs(42.000));
        self::assertSame([['0', null]], $converter->toPairs(false));
        self::assertSame([['1', null]], $converter->toPairs(true));
        self::assertSame([['string', null]], $converter->toPairs('string'));
    }
}