* @copyright 2007-2022 Kjell-Inge Gustafsson, kigkonsult, All rights reserved * @link https://kigkonsult.se * @license Subject matter of licence is the software iCalcreator. * The above copyright, link, package and version notices, * this licence notice and the invariant [rfc5545] PRODID result use * as implemented and invoked in iCalcreator shall be included in * all copies or substantial portions of the iCalcreator. * * iCalcreator is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of * the License, or (at your option) any later version. * * iCalcreator is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with iCalcreator. If not, see . */ namespace Kigkonsult\Icalcreator; use Exception; use UnexpectedValueException; use Kigkonsult\Icalcreator\Util\Util; /** * Class ParseTest, * * Testing Vcalendar parse + eol-htab * * @since 2.41.31 - 2022-03-11 */ class ParseTest extends DtBase { /** * parseExceptionsTest provider * * @return mixed[] */ public function parseExceptionsTestProvider() : array { $dataArr = []; $dataArr[] = [ 0, "" ]; $dataArr[] = [ 1, [] ]; $dataArr[] = [ 2, "\r\n" ]; $dataArr[] = [ 3, [ "\r\n" ] ]; $dataArr[] = [ 4, "BEGIN:VCALENDAR\r\n" ]; $dataArr[] = [ 5, [ "BEGIN:VCALENDAR\r\n" ] ]; $dataArr[] = [ 6, "END:VCALENDAR\r\n" ]; $dataArr[] = [ 7, [ "END:VCALENDAR\r\n" ] ]; $dataArr[] = [ 8, "BEGIN:VCALENDAR\r\nEND:VCALENDAR\r\n" ]; $dataArr[] = [ 9, [ "BEGIN:VCALENDAR\r\n", "END:VCALENDAR\r\n" ] ]; /* is accepted BUT content skipped $dataArr[] = [ 10, "grodan boll" ]; */ return $dataArr; } /** * @test * @dataProvider parseExceptionsTestProvider * @param int $case * @param string|string[] $value */ public function parseExceptionsTest( int $case, string|array $value ) : void { $calendar = new Vcalendar(); $ok = false; try { $calendar->parse( $value ); echo $calendar->createCalendar() . PHP_EOL; // test ### } catch ( UnexpectedValueException $e ) { $ok = true; } $this->assertTrue( $ok, __FUNCTION__ . ' error in case #' . $case ); } /** * parseCalendarTest provider * * @return mixed[] */ public function parseCalendarTestProvider() : array { $dataArr = []; $dataArr[] = [ 601, "BEGIN:VCALENDAR\r\n" . "VERSION:2.0\r\n" . "PRODID:-//ShopReply Inc//CalReply 1.0//EN\r\n" . "METHOD:REFRESH\r\n" . "SOURCE;x-a=first;VALUE=uri:message://https://www.masked.de/account/subscripti\r\n" . " on/delivery/8878/%3Fweek=2021-W03\r\n" . "X-WR-CALNAME:ESPN Daily Calendar\r\n" . "X-WR-RELCALID:657d63b8-df1d-e611-8b88-06bb54d48d13\r\n" . "X-PUBLISH-TTL:P1D\r\n" . "X-TEST:601\r\n" . "BEGIN:VTIMEZONE\r\n" . "TZID:America/New_York\r\n" . "TZURL;x-a=first;VALUE=uri:message//:https://www.masked.de/account/subscriptio\r\n" . " n/delivery/8878/%3Fweek=2021-W03\r\n" . "BEGIN:STANDARD\r\n" . "DTSTART:20070101T020000\r\n" . "RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU;\r\n" . "TZOFFSETFROM:-0400\r\n" . "TZOFFSETTO:-0500\r\n" . "END:STANDARD\r\n" . "BEGIN:DAYLIGHT\r\n" . "DTSTART:20070101T020000\r\n" . "RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU;\r\n" . "TZOFFSETFROM:-0500\r\n" . "TZOFFSETTO:-0400\r\n" . "END:DAYLIGHT\r\n" . "END:VTIMEZONE\r\n" . "BEGIN:VEVENT\r\n" . "UID:e2317772-f3a2-42cf-a5ac-e639fb6b2af0\r\n" . "CLASS:PUBLIC\r\n" . "TRANSP:TRANSPARENT\r\n" . "SUMMARY:⚽ English FA Cup on ESPN+\r\n" . "DTSTART;TZID=\"America/New_York\":20190316T081500\r\n" . "DTEND;TZID=\"America/New_York\":20190316T091500\r\n" . 'DESCRIPTION:Watch live: http://bit.ly/FACuponEPlus\n\nNot an ESPN+ subscrib' . "\r\n\t" . 'er? Start your free trial here: http://bit.ly/ESPNPlusSignup\n\nShare - http:' . "\r\n\t" . '//calrep.ly/2pLaM0n\n\nYou may unsubscribe by following - https://espn.calrep' . "\r\n\t" . 'lyapp.com/unsubscribe/9bba908612a34be1881bc5098e8adbda\n\nPowered by CalReply' . "\r\n\t" . " - http://calrep.ly/poweredby\r\n" . 'LOCATION:England\'s biggest soccer competition continues.\n\n• Watford vs. C' . "\r\n\t" . 'rystal Palace (8:15 a.m. ET)\n• Swansea City vs. Manchester City (1:20 p.m.)\\' . "\r\n\t" . 'n• Wolverhampton vs. Manchester United (3:55 p.m.)\n\nWatch live: http://bit.' . "\r\n\t" . "ly/FACuponEPlus\r\n" . "DTSTAMP:20190315T211012Z\r\n" . "LAST-MODIFIED:20190315T211012Z\r\n" . "SEQUENCE:1\r\n" . "URL;x-a=first;VALUE=uri:message//:https://www.masked.de/account/subscription/\r\n" . " delivery/8878/%3Fweek=2021-W03\r\n" . "BEGIN:VALARM\r\n" . "ACTION:DISPLAY\r\n" . "DESCRIPTION:Reminder\r\n" . "TRIGGER:-PT15M\r\n" . "END:VALARM\r\n" . "END:VEVENT\r\n" . "END:VCALENDAR\r\n", "UID:e2317772-f3a2-42cf-a5ac-e639fb6b2af0" ]; // rfc 9073 8.1. Example 1, extended with VLOCATION inside PARTICIPANT $dataArr[] = [ 611, "BEGIN:VCALENDAR\r\n" . "X-TEST:611\r\n" . "BEGIN:VEVENT\r\n" . "CREATED:20200215T145739Z\r\n" . "DESCRIPTION: Piano Sonata No 3\n\r\n" . " Piano Sonata No 30\r\n" . "DTSTAMP:20200215T145739Z\r\n" . "DTSTART;TZID=America/New_York:20200315T150000Z\r\n" . "DTEND;TZID=America/New_York:20200315T163000Z\r\n" . "LAST-MODIFIED:20200216T145739Z\r\n" . "SUMMARY:Beethoven Piano Sonatas\r\n" . "UID:123456\r\n" . "IMAGE;VALUE=URI;DISPLAY=BADGE;FMTTYPE=image/png:h\r\n" . " ttp://example.com/images/concert.png\r\n" . "BEGIN:PARTICIPANT\r\n" . "PARTICIPANT-TYPE:SPONSOR\r\n" . "UID:dG9tQGZvb2Jhci5xlLmNvbQ\r\n" . "STRUCTURED-DATA;VALUE=URI:http://example.com/vevent.participant1.sponsor.vcf\r\n" . "END:PARTICIPANT\r\n" . "BEGIN:PARTICIPANT\r\n" . "PARTICIPANT-TYPE:PERFORMER:\r\n" . "UID:em9lQGZvb2GFtcGxlLmNvbQ\r\n" . "STRUCTURED-DATA;VALUE=URI:http://www.example.com/vevent.participant2/johndoe.vcf\r\n" . "BEGIN:VLOCATION\r\n" . "UID:123456-abcdef-123456780\r\n" . "NAME:The curators office\r\n" . "STRUCTURED-DATA;VALUE=URI:http://dir.example.com/vevent.participant2.vlocation1/office.vcf\r\n" . "END:VLOCATION\r\n" . "END:PARTICIPANT\r\n" . "BEGIN:VLOCATION\r\n" . "UID:123456-abcdef-98765432\r\n" . "NAME:The venue\r\n" . "STRUCTURED-DATA;VALUE=URI:http://dir.example.com/vevent.vlocation1/big-hall.vcf\r\n" . "END:VLOCATION\r\n" . "BEGIN:VLOCATION\r\n" . "UID:123456-abcdef-87654321\r\n" . "NAME:Parking for the venue\r\n" . "STRUCTURED-DATA;VALUE=URI:http://dir.example.com/vevent.vlocation2/parking.vcf\r\n" . "END:VLOCATION\r\n" . "END:VEVENT\r\n" . "END:VCALENDAR\r\n", 'STRUCTURED-DATA;VALUE=URI:http://dir.example.com/vevent.vlocation2/parking.vcf' ]; // rfc 9073 8.2. Example 2 $dataArr[] = [ 621, "BEGIN:VCALENDAR\r\n" . "X-TEST:621\r\n" . "BEGIN:VEVENT\r\n" . "CREATED:20200215T145739Z\r\n" . "DTSTAMP:20200215T145739Z\r\n" . "DTSTART;TZID=America/New_York:20200315T150000Z\r\n" . "DTEND;TZID=America/New_York:20200315T163000Z\r\n" . "LAST-MODIFIED:20200216T145739Z\r\n" . "SUMMARY:Conference planning\r\n" . "UID:123456\r\n" . "ORGANIZER:mailto:a@example.com\r\n" . "ATTENDEE;PARTSTAT=ACCEPTED;CN=A:mailto:a@example1.com\r\n" . "ATTENDEE;RSVP=TRUE;CN=B:mailto:b@example2.com\r\n" . "X-TEST:621\r\n" . "BEGIN:PARTICIPANT\r\n" . "PARTICIPANT-TYPE:ACTIVE:\r\n" . "UID:v39lQGZvb2GFtcGxlLmNvbQ\r\n" . "STRUCTURED-DATA;VALUE=URI:http://www.example.com/people/b.vcf\r\n" . "LOCATION:At home\r\n" . "END:PARTICIPANT\r\n" . "END:VEVENT\r\n" . "END:VCALENDAR\r\n", 'STRUCTURED-DATA;VALUE=URI:http://www.example.com/people/b.vcf' ]; // rfc 9073 6.6. Structured-Data $dataArr[] = [ 631, "BEGIN:VCALENDAR\r\n" . "X-TEST:631\r\n" . "BEGIN:VEVENT\r\n" . "CREATED:20200215T145739Z\r\n" . "DTSTAMP:20200215T145739Z\r\n" . "DTSTART;TZID=America/New_York:20200315T150000Z\r\n" . "DTEND;TZID=America/New_York:20200315T163000Z\r\n" . "LAST-MODIFIED:20200216T145739Z\r\n" . "SUMMARY:Conference planning\r\n" . "UID:123456\r\n" . "BEGIN:PARTICIPANT\r\n" . "PARTICIPANT-TYPE:ACTIVE:\r\n" . "UID:v39lQGZvb2GFtcGxlLmNvbQ\r\n" . "STRUCTURED-DATA;VALUE=TEXT;FMTTYPE=application/ld+json;SCHEMA=\"https://schema.org/Sp\r\n" . " ortsEvent\":{\n \r\n" . " \"@context\": \"http://schema.org\"\\,\n \r\n" . " \"@type\": \"SportsEvent\"\\,\n \r\n" . " \"homeTeam\": \"Pittsburgh Pirates\"\\,\n \r\n" . " \"awayTeam\": \"San Francisco Giants\"\n \r\n" . " }\n\r\n" . "END:PARTICIPANT\r\n" . "END:VEVENT\r\n" . "END:VCALENDAR\r\n", 'SUMMARY:Conference planning' ]; // rfc 9074 7.2. Example VALARM "snoozing", "re-snoozing", and dismissal of an alarm // all in one but VEVENTs/VALARMs with different UIDs $dataArr[] = [ 641, "BEGIN:VCALENDAR\r\n" . "X-TEST:641\r\n" . "BEGIN:VEVENT\r\n" . "CREATED:20210302T151004Z\r\n" . "UID:AC67C078-CED3-4BF5-9726-832C3749F621\r\n" . "DTSTAMP:20210302T151516Z\r\n" . "DTSTART;TZID=America/New_York:20210302T103000\r\n" . "DTEND;TZID=America/New_York:20210302T113000\r\n" . "SUMMARY:Meeting\r\n" . "BEGIN:VALARM\r\n" . "UID:8297C37D-BA2D-4476-91AE-C1EAA364F8E1\r\n" . "TRIGGER:-PT15M\r\n" . "DESCRIPTION:Event reminder\r\n" . "ACTION:DISPLAY\r\n" . "ACKNOWLEDGED:20210302T151514Z\r\n" . "END:VALARM\r\n" . "BEGIN:VALARM\r\n" . "UID:DE7B5C34-83FF-47FE-BE9E-FF41AE6DD097\r\n" . "TRIGGER;VALUE=DATE-TIME:20210302T152000Z\r\n" . "RELATED-TO;RELTYPE=SNOOZE:8297C37D-BA2D-4476-91AE-C1EAA364F8E1\r\n" . "DESCRIPTION:Event reminder\r\n" . "ACTION:DISPLAY\r\n" . "END:VALARM\r\n" . "END:VEVENT\r\n" . "BEGIN:VEVENT\r\n" . "CREATED:20210302T151004Z\r\n" . "UID:AC67C078-CED3-4BF5-9726-832C3749F622\r\n" . "DTSTAMP:20210302T152026Z\r\n" . "DTSTART;TZID=America/New_York:20210302T103000\r\n" . "DTEND;TZID=America/New_York:20210302T113000\r\n" . "SUMMARY:Meeting\r\n" . "BEGIN:VALARM\r\n" . "UID:8297C37D-BA2D-4476-91AE-C1EAA364F8E2\r\n" . "TRIGGER:-PT15M\r\n" . "DESCRIPTION:Event reminder\r\n" . "ACTION:DISPLAY\r\n" . "ACKNOWLEDGED:20210302T152024Z\r\n" . "END:VALARM\r\n" . "BEGIN:VALARM\r\n" . "UID:87D690A7-B5E8-4EB4-8500-491F50AFE394\r\n" . "TRIGGER;VALUE=DATE-TIME:20210302T152500Z\r\n" . "RELATED-TO;RELTYPE=SNOOZE:8297C37D-BA2D-4476-91AE-C1EAA364F8E2\r\n" . "DESCRIPTION:Event reminder\r\n" . "ACTION:DISPLAY\r\n" . "END:VALARM\r\n" . "END:VEVENT\r\n" . "BEGIN:VEVENT\r\n" . "CREATED:20210302T151004Z\r\n" . "UID:AC67C078-CED3-4BF5-9726-832C3749F623\r\n" . "DTSTAMP:20210302T152508Z\r\n" . "DTSTART;TZID=America/New_York:20210302T103000\r\n" . "DTEND;TZID=America/New_York:20210302T113000\r\n" . "SUMMARY:Meeting\r\n" . "BEGIN:VALARM\r\n" . "UID:8297C37D-BA2D-4476-91AE-C1EAA364F8E3\r\n" . "TRIGGER:-PT15M\r\n" . "DESCRIPTION:Event reminder\r\n" . "ACTION:DISPLAY\r\n" . "ACKNOWLEDGED:20210302T152507Z\r\n" . "END:VALARM\r\n" . "BEGIN:VALARM\r\n" . "UID:87D690A7-B5E8-4EB4-8500-491F50AFE394\r\n" . "TRIGGER;VALUE=DATE-TIME:20210302T152500Z\r\n" . "RELATED-TO;RELTYPE=SNOOZE:8297C37D-BA2D-4476-91AE-C1EAA364F8E3\r\n" . "DESCRIPTION:Event reminder\r\n" . "ACTION:DISPLAY\r\n" . "ACKNOWLEDGED:20210302T152507Z\r\n" . "END:VALARM\r\n" . "END:VEVENT\r\n" . "END:VCALENDAR\r\n", 'RELATED-TO;RELTYPE=SNOOZE:8297C37D-BA2D-4476-91AE-C1EAA364F8E3' ]; // rfc 9074 8.2. Example VALARM with PROXIMITY and VLOCATION $dataArr[] = [ 641, "BEGIN:VCALENDAR\r\n" . "X-TEST:641\r\n" . "BEGIN:VEVENT\r\n" . "CREATED:20200215T145739Z\r\n" . "DTSTAMP:20200215T145739Z\r\n" . "DTSTART;TZID=America/New_York:20200315T150000Z\r\n" . "DTEND;TZID=America/New_York:20200315T163000Z\r\n" . "LAST-MODIFIED:20200216T145739Z\r\n" . "SUMMARY:Conference planning\r\n" . "UID:123456\r\n" . "BEGIN:VALARM\r\n" . "UID:77D80D14-906B-4257-963F-85B1E734DBB6\r\n" . "ACTION:DISPLAY\r\n" . "TRIGGER;VALUE=DATE-TIME:19760401T005545Z\r\n" . "DESCRIPTION:Remember to buy milk\r\n" . "PROXIMITY:DEPART\r\n" . "BEGIN:VLOCATION\r\n" . "UID:123456-abcdef-98765432\r\n" . "NAME:Office1\r\n" . "URL:geo:40.443,-79.945;u=10\r\n" . "END:VLOCATION\r\n" . "BEGIN:VLOCATION\r\n" . "UID:987654-ghijkl-1234567890\r\n" . "NAME:Office2\r\n" . "URL:geo:40.443,-79.945;u=10\r\n" . "END:VLOCATION\r\n" . "END:VALARM\r\n" . "END:VEVENT\r\n" . "END:VCALENDAR\r\n", 'URL:geo:40.443,-79.945;u=10' ]; return $dataArr; } /** * Testing Vcalendar parse eol-htab, also test of empty unique_id, parse input as string * * @test * @dataProvider parseCalendarTestProvider * @param int $case * @param string $value * @param string $expectedvalue * @throws Exception */ public function parseCalendarTest1( int $case, string $value, string $expectedvalue ) : void { $calendar = new Vcalendar(); $calendar->parse( $value ); $this->parseCalendarTest( $case, $calendar, $expectedvalue ); } /** * Testing Vcalendar parse eol-htab, also test of empty unique_id, parse input as array * * @test * @dataProvider parseCalendarTestProvider * @param int $case * @param string $value * @param string $expectedvalue * @throws Exception */ public function parseCalendarTest2( int $case, string $value, string $expectedvalue ) : void { $calendar = new Vcalendar(); $calendar->parse( explode( Util::$CRLF, $value )); $this->parseCalendarTest( $case, $calendar, $expectedvalue ); } /** * Testing Vcalendar OLD Vcalendar->createCalendar() and NEW Formatter\Vcalendar::format() * * @test * @dataProvider parseCalendarTestProvider * @param int $case * @param string $value * @param string $expectedvalue * @throws Exception */ public function parseCalendarTest3( int $case, string $value, string $expectedvalue ) : void { $calendar = new Vcalendar(); $calendar->parse( explode( Util::$CRLF, $value )); $this->assertSame( $calendar->createCalendar(), \Kigkonsult\Icalcreator\Formatter\Vcalendar::format( $calendar ) ); } /** * parseCompTest provider * * @return mixed[] */ public function parseCompTestProvider() : array { $dataArr = []; $dataArr[] = [ 701, "DTSTAMP:19970324T120035Z" ]; $dataArr[] = [ 703, "SEQUENCE:0" ]; $dataArr[] = [ 705, "ORGANIZER:mailto:jdoe@host1.com" ]; $dataArr[] = [ 707, [ "ATTENDEE;RSVP=TRUE:mailto:jsmith@host1.com", "ATTENDEE;RSVP=TRUE:mailto:jsmith@host2.com", "ATTENDEE;RSVP=TRUE:mailto:jsmith@host3.com", "ATTENDEE;RSVP=TRUE:mailto:jsmith@host4.com" ] ]; $dataArr[] = [ 709, "DTSTART:19970324T123000Z" ]; $dataArr[] = [ 711, "DTEND:19970324T210000Z" ]; $dataArr[] = [ 713, "CATEGORIES:MEETING,PROJECT" ]; $dataArr[] = [ 715, "CLASS:PUBLIC" ]; $dataArr[] = [ 717, "SUMMARY:Calendaring Interoperability Planning Meeting" ]; $dataArr[] = [ 719, "STATUS:TENTATIVE" ]; $dataArr[] = [ 721, 'DESCRIPTION:Project xyz Review Meeting Minutes\n' . ' Agenda\n' . ' 1. Review of project version 1.0 requirements.\n' . ' 2. Definition of project processes.\n' . ' 3. Review of project schedule.\n' . ' Participants: John Smith, Jane Doe, Jim Dandy\n' . ' - It was decided that the requirements need to be signed off by product marketing.\n' . ' - Project processes were accepted.\n' . ' - Project schedule needs to account for scheduled holidays and employee vacation time. Check with HR for specific dates.\n' . ' - New schedule will be distributed by Friday.\n' . ' - Next weeks meeting is cancelled. No meeting until 3/23.' ]; $dataArr[] = [ 723, [ 'COMMENT:Project xyz Review Meeting Minutes\n' . ' Agenda\n' . ' 1. Review of project version 1.0 requirements.\n' . ' 2. Definition of project processes.\n' . ' 3. Review of project schedule.\n' . ' Participants: John Smith, Jane Doe, Jim Dandy\n' . ' - It was decided that the requirements need to be signed off by product marketing.\n' . ' - Project processes were accepted.\n' . ' - Project schedule needs to account for scheduled holidays and employee vacation time. Check with HR for specific dates.\n' . ' - New schedule will be distributed by Friday.\n' . ' - Next weeks meeting is cancelled. No meeting until 3/23.' ] ]; $dataArr[] = [ 725, 'LOCATION:LDB Lobby' ]; $dataArr[] = [ 727, "ATTACH;FMTTYPE=application/postscript:ftp://xyz.com/pub/conf/bkgrnd.ps" ]; $dataArr[] = [ 729, [ "BEGIN:VALARM", "ACTION:AUDIO", "TRIGGER;VALUE=DATE-TIME:19970224T070000Z", "ATTACH;FMTTYPE=audio/basic:http://host.com/pub/audio-files/ssbanner.aud", "REPEAT:4", "DURATION:PT1H", "X-alarm:non-standard ALARM property", "END:VALARM" ] ]; $dataArr[] = [ 731, "X-XOMMENT:non-standard property will be displayed, comma escaped" ]; $dataArr[] = [ 733, 'STRUCTURED-DATA;VALUE=TEXT;FMTTYPE=application/ld+json;SCHEMA="https://schema.org/Sp' . 'ortsEvent":{\n' . '\'@type\': \'SportsEvent\',\n' . '\'homeTeam\': \'Pittsburgh Pirates\',\n' . '\'awayTeam\': \'San Francisco Giants\'\n' . '}' ]; $dataArr[] = [ 735, 'DESCRIPTION;ALTREP="https://username:password@hostname.domin.com:9090/path?arg=value#anchor":Description here...' ]; return $dataArr; } /** * Testing CalendarCompomponent parse, rfc5545 rendered properties * * @test * @dataProvider parseCompTestProvider * @param int $case * @param string|array $value * @throws Exception */ public function parseCompTest( int $case, string|array $value ) : void { $calendar = new Vcalendar(); if( is_array( $value )) { $vevent = $calendar->newVevent(); $vevent->parse( $value ); $this->parseCalendarTest( $case . '-a', $calendar, $value[1] ?? $value[0] ); $vevent = $calendar->newVevent(); $vevent->parse( implode( Util::$CRLF, $value )); $this->parseCalendarTest( $case . '-s', $calendar, $value[1] ?? $value[0] ); } else { $vevent = $calendar->newVevent(); $vevent->parse( explode( Util::$CRLF, $value )); $this->parseCalendarTest( $case . '-a', $calendar, $value ); $vevent = $calendar->newVevent(); $vevent->parse( $value ); $this->parseCalendarTest( $case . '-s', $calendar, $value ); } } /** * parseCompPortnrTest provider * * @return mixed[] */ public function parseCompPortnrTestProvider() : array { $dataArr = []; // quoted ALTREP value $dataArr[] = [ 811, 'DESCRIPTION;ALTREP="https://811username:password@hostname.domin.com:9090/path?arg=value#anchor":Description here...', null ]; // quoted ALTREP value AND other param $dataArr[] = [ 812, 'DESCRIPTION;ALTREP="https://812username:password@hostname.domin.com:9090/path?arg=value#anchor";LANGUAGE=EN:Description here...', null ]; // unquoted ALTREP value /* $dataArr[] = [ 821, 'DESCRIPTION;ALTREP=https://821username:password@hostname.domain.com:9090/path?arg=value#anchor:Description here...', 'DESCRIPTION;ALTREP="https://821username:password@hostname.domin.com:9090/path?arg=value#anchor":Description here...' ]; // unquoted ALTREP value AND other param $dataArr[] = [ 831, 'DESCRIPTION;ALTREP=https://831username:password@hostname.domain.com:9090/path?arg=value#anchor;LANGUAGE=EN:Description here...', 'DESCRIPTION;ALTREP="https://831username:password@hostname.domin.com:9090/path?arg=value#anchor";LANGUAGE=EN:Description here...' ]; */ return $dataArr; } /** * Testing CalendarCompomponent parse, rfc5545 rendered property with portnr * * Known bug here: property parse with param ALTREP (etc?) with unquoted url with ..>user.passwd@<.. before hostname * * @test * @dataProvider parseCompPortnrTestProvider * @param int $case * @param string $value * @param string|null $expected * @throws Exception */ public function parseCompPortnrTest( int $case, string $value, ? string $expected = null ) : void { $calendar = new Vcalendar(); $calendar->newVevent() ->parse( $value ); $this->parseCalendarTest( $case, $calendar, $expected ?? $value ); } }