1<?php
2
3namespace Rubix\ML\Tests\Persisters\Serializers;
4
5use Rubix\ML\Encoding;
6use Rubix\ML\Persistable;
7use Rubix\ML\Classifiers\DummyClassifier;
8use Rubix\ML\Persisters\Serializers\Native;
9use Rubix\ML\Persisters\Serializers\Serializer;
10use PHPUnit\Framework\TestCase;
11use Rubix\ML\Exceptions\RuntimeException;
12use stdClass;
13
14use function serialize;
15
16/**
17 * @group Serializers
18 * @covers \Rubix\ML\Persisters\Serializers\Native
19 */
20class NativeTest extends TestCase
21{
22    /**
23     * @var \Rubix\ML\Persistable
24     */
25    protected $persistable;
26
27    /**
28     * @var \Rubix\ML\Persisters\Serializers\Native
29     */
30    protected $serializer;
31
32    /**
33     * @before
34     */
35    protected function setUp() : void
36    {
37        $this->serializer = new Native();
38
39        $this->persistable = new DummyClassifier();
40    }
41
42    /**
43     * @test
44     */
45    public function build() : void
46    {
47        $this->assertInstanceOf(Native::class, $this->serializer);
48        $this->assertInstanceOf(Serializer::class, $this->serializer);
49    }
50
51    /**
52     * @test
53     */
54    public function serializeUnserialize() : void
55    {
56        $data = $this->serializer->serialize($this->persistable);
57
58        $this->assertInstanceOf(Encoding::class, $data);
59
60        $persistable = $this->serializer->unserialize($data);
61
62        $this->assertInstanceOf(DummyClassifier::class, $persistable);
63        $this->assertInstanceOf(Persistable::class, $persistable);
64    }
65
66    /**
67     * @return array<mixed>
68     */
69    public function deserializeInvalidData() : array
70    {
71        return [
72            [3],
73            [new stdClass()],
74        ];
75    }
76
77    /**
78     * @test
79     *
80     * @param mixed $obj
81     *
82     * @dataProvider deserializeInvalidData
83     */
84    public function deserializeBadData($obj) : void
85    {
86        $data = new Encoding(serialize($obj));
87
88        $this->expectException(RuntimeException::class);
89
90        $this->serializer->unserialize($data);
91    }
92}
93