1<?php
2
3namespace Sabre\VObject;
4
5/**
6 * PHPUnit Assertions.
7 *
8 * This trait can be added to your unittest to make it easier to test iCalendar
9 * and/or vCards.
10 *
11 * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
12 * @author Evert Pot (http://evertpot.com/)
13 * @license http://sabre.io/license/ Modified BSD License
14 */
15trait PHPUnitAssertions
16{
17    /**
18     * This method tests whether two vcards or icalendar objects are
19     * semantically identical.
20     *
21     * It supports objects being supplied as strings, streams or
22     * Sabre\VObject\Component instances.
23     *
24     * PRODID is removed from both objects as this is often changes and would
25     * just get in the way.
26     *
27     * CALSCALE will automatically get removed if it's set to GREGORIAN.
28     *
29     * Any property that has the value **ANY** will be treated as a wildcard.
30     *
31     * @param resource|string|Component $expected
32     * @param resource|string|Component $actual
33     * @param string                    $message
34     */
35    public function assertVObjectEqualsVObject($expected, $actual, $message = '')
36    {
37        $getObj = function ($input) {
38            if (is_resource($input)) {
39                $input = stream_get_contents($input);
40            }
41            if (is_string($input)) {
42                $input = Reader::read($input);
43            }
44            if (!$input instanceof Component) {
45                $this->fail('Input must be a string, stream or VObject component');
46            }
47            unset($input->PRODID);
48            if ($input instanceof Component\VCalendar && 'GREGORIAN' === (string) $input->CALSCALE) {
49                unset($input->CALSCALE);
50            }
51
52            return $input;
53        };
54
55        $expected = $getObj($expected)->serialize();
56        $actual = $getObj($actual)->serialize();
57
58        // Finding wildcards in expected.
59        preg_match_all('|^([A-Z]+):\\*\\*ANY\\*\\*\r$|m', $expected, $matches, PREG_SET_ORDER);
60
61        foreach ($matches as $match) {
62            $actual = preg_replace(
63                '|^'.preg_quote($match[1], '|').':(.*)\r$|m',
64                $match[1].':**ANY**'."\r",
65                $actual
66            );
67        }
68
69        $this->assertEquals(
70            $expected,
71            $actual,
72            $message
73        );
74    }
75}
76