1<?php
2
3namespace Sabre\CardDAV;
4
5require_once 'Sabre/CardDAV/AbstractPluginTest.php';
6
7class ValidateFilterTest extends AbstractPluginTest {
8
9    /**
10     * @dataProvider data
11     */
12    function testFilter($input, $filters, $test, $result, $message = null) {
13
14        if ($result) {
15            $this->assertTrue($this->plugin->validateFilters($input, $filters, $test), $message);
16        } else {
17            $this->assertFalse($this->plugin->validateFilters($input, $filters, $test), $message);
18        }
19
20    }
21
22    function data() {
23
24        $body1 = <<<HELLO
25BEGIN:VCARD
26VERSION:3.0
27ORG:Company;
28TITLE:Title
29TEL;TYPE=IPHONE;TYPE=pref:(222) 22 22 22
30TEL;TYPE=HOME:(33) 333 66 66
31TEL;TYPE=WORK:(444) 44 44 44
32TEL;TYPE=MAIN:(55) 555 55 55
33ITEM4.TEL:(111) 11 11 11
34ITEM5.TEL:(6) 66 66 66 66
35ITEM6.TEL:(77) 777 77 77
36UID:3151DE6A-BC35-4612-B340-B53A034A2B27
37ITEM1.EMAIL:1111@111.com
38ITEM2.EMAIL:bbbbb@bbbb.com
39ITEM3.EMAIL:ccccc@ccccc.com
40FN:First Last
41N:Last;First;Middle;Dr
42BDAY:1985-07-20
43ADR;TYPE=HOME:;;Street;City;;3556;Montenegro
44ADR;TYPE=WORK:;;Street\\nStreet2;Harkema;;35444;Australia
45URL:http://google.com
46END:VCARD
47HELLO;
48
49        // Check if TITLE is defined
50        $filter1 =
51            array('name' => 'title', 'is-not-defined' => false, 'param-filters' => array(), 'text-matches' => array());
52
53        // Check if FOO is defined
54        $filter2 =
55            array('name' => 'foo', 'is-not-defined' => false, 'param-filters' => array(), 'text-matches' => array());
56
57        // Check if TITLE is not defined
58        $filter3 =
59            array('name' => 'title', 'is-not-defined' => true, 'param-filters' => array(), 'text-matches' => array());
60
61        // Check if FOO is not defined
62        $filter4 =
63            array('name' => 'foo', 'is-not-defined' => true, 'param-filters' => array(), 'text-matches' => array());
64
65        // Check if TEL[TYPE] is defined
66        $filter5 =
67            array(
68                'name' => 'tel',
69                'is-not-defined' => false,
70                'test' => 'anyof',
71                'param-filters' => array(
72                    array(
73                        'name' => 'type',
74                        'is-not-defined' => false,
75                        'text-match' => null
76                    ),
77                ),
78                'text-matches' => array(),
79            );
80
81        // Check if TEL[FOO] is defined
82        $filter6 = $filter5;
83        $filter6['param-filters'][0]['name'] = 'FOO';
84
85        // Check if TEL[TYPE] is not defined
86        $filter7 = $filter5;
87        $filter7['param-filters'][0]['is-not-defined'] = true;
88
89        // Check if TEL[FOO] is not defined
90        $filter8 = $filter5;
91        $filter8['param-filters'][0]['name'] = 'FOO';
92        $filter8['param-filters'][0]['is-not-defined'] = true;
93
94        // Combining property filters
95        $filter9 = $filter5;
96        $filter9['param-filters'][] = $filter6['param-filters'][0];
97
98        $filter10 = $filter5;
99        $filter10['param-filters'][] = $filter6['param-filters'][0];
100        $filter10['test'] = 'allof';
101
102        // Check if URL contains 'google'
103        $filter11 =
104            array(
105                'name' => 'url',
106                'is-not-defined' => false,
107                'test' => 'anyof',
108                'param-filters' => array(),
109                'text-matches' => array(
110                    array(
111                        'match-type' => 'contains',
112                        'value' => 'google',
113                        'negate-condition' => false,
114                        'collation' => 'i;octet',
115                    ),
116                ),
117            );
118
119        // Check if URL contains 'bing'
120        $filter12 = $filter11;
121        $filter12['text-matches'][0]['value'] = 'bing';
122
123        // Check if URL does not contain 'google'
124        $filter13 = $filter11;
125        $filter13['text-matches'][0]['negate-condition'] = true;
126
127        // Check if URL does not contain 'bing'
128        $filter14 = $filter11;
129        $filter14['text-matches'][0]['value'] = 'bing';
130        $filter14['text-matches'][0]['negate-condition'] = true;
131
132        // Param filter with text
133        $filter15 = $filter5;
134        $filter15['param-filters'][0]['text-match'] = array(
135            'match-type' => 'contains',
136            'value' => 'WORK',
137            'collation' => 'i;octet',
138            'negate-condition' => false,
139        );
140        $filter16 = $filter15;
141        $filter16['param-filters'][0]['text-match']['negate-condition'] = true;
142
143
144        // Param filter + text filter
145        $filter17 = $filter5;
146        $filter17['test'] = 'anyof';
147        $filter17['text-matches'][] = array(
148            'match-type' => 'contains',
149            'value' => '444',
150            'collation' => 'i;octet',
151            'negate-condition' => false,
152        );
153
154        $filter18 = $filter17;
155        $filter18['text-matches'][0]['negate-condition'] = true;
156
157        $filter18['test'] = 'allof';
158
159        return array(
160
161            // Basic filters
162            array($body1, array($filter1), 'anyof',true),
163            array($body1, array($filter2), 'anyof',false),
164            array($body1, array($filter3), 'anyof',false),
165            array($body1, array($filter4), 'anyof',true),
166
167            // Combinations
168            array($body1, array($filter1, $filter2), 'anyof',true),
169            array($body1, array($filter1, $filter2), 'allof',false),
170            array($body1, array($filter1, $filter4), 'anyof',true),
171            array($body1, array($filter1, $filter4), 'allof',true),
172            array($body1, array($filter2, $filter3), 'anyof',false),
173            array($body1, array($filter2, $filter3), 'allof',false),
174
175            // Basic parameters
176            array($body1, array($filter5), 'anyof', true, 'TEL;TYPE is defined, so this should return true'),
177            array($body1, array($filter6), 'anyof', false, 'TEL;FOO is not defined, so this should return false'),
178
179            array($body1, array($filter7), 'anyof', false, 'TEL;TYPE is defined, so this should return false'),
180            array($body1, array($filter8), 'anyof', true, 'TEL;TYPE is not defined, so this should return true'),
181
182            // Combined parameters
183            array($body1, array($filter9), 'anyof', true),
184            array($body1, array($filter10), 'anyof', false),
185
186            // Text-filters
187            array($body1, array($filter11), 'anyof', true),
188            array($body1, array($filter12), 'anyof', false),
189            array($body1, array($filter13), 'anyof', false),
190            array($body1, array($filter14), 'anyof', true),
191
192            // Param filter with text-match
193            array($body1, array($filter15), 'anyof', true),
194            array($body1, array($filter16), 'anyof', false),
195
196            // Param filter + text filter
197            array($body1, array($filter17), 'anyof', true),
198            array($body1, array($filter18), 'anyof', false),
199            array($body1, array($filter18), 'anyof', false),
200        );
201
202    }
203
204}
205