1<?php
2
3namespace Sabre\VObject\Component;
4
5use
6    Sabre\VObject\Component,
7    Sabre\VObject\Reader;
8
9class VTodoTest extends \PHPUnit_Framework_TestCase {
10
11    /**
12     * @dataProvider timeRangeTestData
13     */
14    public function testInTimeRange(VTodo $vtodo,$start,$end,$outcome) {
15
16        $this->assertEquals($outcome, $vtodo->isInTimeRange($start, $end));
17
18    }
19
20    public function timeRangeTestData() {
21
22        $tests = array();
23
24        $calendar = new VCalendar();
25
26        $vtodo = $calendar->createComponent('VTODO');
27        $vtodo->DTSTART = '20111223T120000Z';
28        $tests[] = array($vtodo, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true);
29        $tests[] = array($vtodo, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false);
30
31        $vtodo2 = clone $vtodo;
32        $vtodo2->DURATION = 'P1D';
33        $tests[] = array($vtodo2, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true);
34        $tests[] = array($vtodo2, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false);
35
36        $vtodo3 = clone $vtodo;
37        $vtodo3->DUE = '20111225';
38        $tests[] = array($vtodo3, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true);
39        $tests[] = array($vtodo3, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false);
40
41        $vtodo4 = $calendar->createComponent('VTODO');
42        $vtodo4->DUE = '20111225';
43        $tests[] = array($vtodo4, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true);
44        $tests[] = array($vtodo4, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false);
45
46        $vtodo5 = $calendar->createComponent('VTODO');
47        $vtodo5->COMPLETED = '20111225';
48        $tests[] = array($vtodo5, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true);
49        $tests[] = array($vtodo5, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false);
50
51        $vtodo6 = $calendar->createComponent('VTODO');
52        $vtodo6->CREATED = '20111225';
53        $tests[] = array($vtodo6, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true);
54        $tests[] = array($vtodo6, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false);
55
56        $vtodo7 = $calendar->createComponent('VTODO');
57        $vtodo7->CREATED = '20111225';
58        $vtodo7->COMPLETED = '20111226';
59        $tests[] = array($vtodo7, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true);
60        $tests[] = array($vtodo7, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false);
61
62        $vtodo7 = $calendar->createComponent('VTODO');
63        $tests[] = array($vtodo7, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true);
64        $tests[] = array($vtodo7, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), true);
65
66        return $tests;
67
68    }
69
70    public function testValidate() {
71
72        $input = <<<HI
73BEGIN:VCALENDAR
74VERSION:2.0
75PRODID:YoYo
76BEGIN:VTODO
77UID:1234-21355-123156
78DTSTAMP:20140402T183400Z
79END:VTODO
80END:VCALENDAR
81HI;
82
83        $obj = Reader::read($input);
84
85        $warnings = $obj->validate();
86        $messages = array();
87        foreach($warnings as $warning) {
88            $messages[] = $warning['message'];
89        }
90
91        $this->assertEquals(array(), $messages);
92
93    }
94
95    public function testValidateInvalid() {
96
97        $input = <<<HI
98BEGIN:VCALENDAR
99VERSION:2.0
100PRODID:YoYo
101BEGIN:VTODO
102END:VTODO
103END:VCALENDAR
104HI;
105
106        $obj = Reader::read($input);
107
108        $warnings = $obj->validate();
109        $messages = array();
110        foreach($warnings as $warning) {
111            $messages[] = $warning['message'];
112        }
113
114        $this->assertEquals(array(
115            "UID MUST appear exactly once in a VTODO component",
116            "DTSTAMP MUST appear exactly once in a VTODO component",
117        ), $messages);
118
119    }
120
121    public function testValidateDUEDTSTARTMisMatch() {
122
123        $input = <<<HI
124BEGIN:VCALENDAR
125VERSION:2.0
126PRODID:YoYo
127BEGIN:VTODO
128UID:FOO
129DTSTART;VALUE=DATE-TIME:20140520T131600Z
130DUE;VALUE=DATE:20140520
131DTSTAMP;VALUE=DATE-TIME:20140520T131600Z
132END:VTODO
133END:VCALENDAR
134HI;
135
136        $obj = Reader::read($input);
137
138        $warnings = $obj->validate();
139        $messages = array();
140        foreach($warnings as $warning) {
141            $messages[] = $warning['message'];
142        }
143
144        $this->assertEquals(array(
145            "The value type (DATE or DATE-TIME) must be identical for DUE and DTSTART",
146        ), $messages);
147
148    }
149
150    public function testValidateDUEbeforeDTSTART() {
151
152        $input = <<<HI
153BEGIN:VCALENDAR
154VERSION:2.0
155PRODID:YoYo
156BEGIN:VTODO
157UID:FOO
158DTSTART;VALUE=DATE:20140520
159DUE;VALUE=DATE:20140518
160DTSTAMP;VALUE=DATE-TIME:20140520T131600Z
161END:VTODO
162END:VCALENDAR
163HI;
164
165        $obj = Reader::read($input);
166
167        $warnings = $obj->validate();
168        $messages = array();
169        foreach($warnings as $warning) {
170            $messages[] = $warning['message'];
171        }
172
173        $this->assertEquals(array(
174            "DUE must occur after DTSTART",
175        ), $messages);
176
177    }
178
179}
180
181