File tree 5 files changed +122
-0
lines changed
5 files changed +122
-0
lines changed Original file line number Diff line number Diff line change
1
+ <?php
2
+
3
+ declare (strict_types=1 );
4
+
5
+ namespace PetrKnap \Binary ;
6
+
7
+ use Stringable ;
8
+
9
+ interface BinariableInterface extends Stringable
10
+ {
11
+ /**
12
+ * @return string binary representation of this instance
13
+ *
14
+ * @throws Exception\CouldNotConvertToBinary
15
+ */
16
+ public function toBinary (): string ;
17
+ }
Original file line number Diff line number Diff line change
1
+ <?php
2
+
3
+ declare (strict_types=1 );
4
+
5
+ namespace PetrKnap \Binary ;
6
+
7
+ use PetrKnap \Shorts \Exception \NotImplemented ;
8
+
9
+ trait BinariableTrait
10
+ {
11
+ /**
12
+ * Unfortunately PHP uses string for binary data, so the magic clashes.
13
+ */
14
+ public function __toString (): string
15
+ {
16
+ if (!($ this instanceof BinariableInterface)) {
17
+ NotImplemented::throw (BinariableInterface::class);
18
+ }
19
+
20
+ $ binary = $ this ->toBinary ();
21
+ trigger_error (
22
+ 'Returned binary string ' ,
23
+ error_level: E_USER_NOTICE ,
24
+ );
25
+ return $ binary ;
26
+ }
27
+ }
Original file line number Diff line number Diff line change
1
+ <?php
2
+
3
+ declare (strict_types=1 );
4
+
5
+ namespace PetrKnap \Binary \Exception ;
6
+
7
+ interface BinariableException extends BinaryException
8
+ {
9
+ }
Original file line number Diff line number Diff line change
1
+ <?php
2
+
3
+ declare (strict_types=1 );
4
+
5
+ namespace PetrKnap \Binary \Exception ;
6
+
7
+ use PetrKnap \Shorts \Exception \CouldNotProcessData ;
8
+
9
+ /**
10
+ * @extends CouldNotProcessData<object>
11
+ */
12
+ final class CouldNotConvertToBinary extends CouldNotProcessData implements BinariableException
13
+ {
14
+ }
Original file line number Diff line number Diff line change
1
+ <?php
2
+
3
+ declare (strict_types=1 );
4
+
5
+ namespace PetrKnap \Binary ;
6
+
7
+ use PHPUnit \Framework \TestCase ;
8
+
9
+ final class BinariableTest extends TestCase
10
+ {
11
+ public const DATA = b'data ' ;
12
+
13
+ public function testExplicitConversionWorks (): void
14
+ {
15
+ self ::assertSame (
16
+ self ::DATA ,
17
+ self ::getBinariable ()->toBinary (),
18
+ );
19
+ }
20
+
21
+ public function testNativeConversionWorks (): void
22
+ {
23
+ self ::assertSame (
24
+ self ::DATA ,
25
+ (string ) self ::getBinariable (),
26
+ );
27
+ }
28
+
29
+ public function testNativeComparisonWorks (): void
30
+ {
31
+ self ::assertTrue (self ::DATA == self ::getBinariable ());
32
+ }
33
+
34
+ public function testUnionTypingWorks (): void
35
+ {
36
+ $ function = static fn (BinariableInterface |string $ parameter ): string => (string ) $ parameter ;
37
+
38
+ self ::assertSame (
39
+ self ::DATA ,
40
+ $ function (self ::getBinariable ()),
41
+ );
42
+ }
43
+
44
+ private function getBinariable (): BinariableInterface
45
+ {
46
+ return new class () implements BinariableInterface {
47
+ use BinariableTrait;
48
+
49
+ public function toBinary (): string
50
+ {
51
+ return BinariableTest::DATA ;
52
+ }
53
+ };
54
+ }
55
+ }
You can’t perform that action at this time.
0 commit comments