1<?php
2
3namespace dokuwiki\plugin\struct\test;
4
5/**
6 * @group plugin_struct
7 * @group plugins
8 *
9 */
10class Assignments_struct_test extends StructTest
11{
12
13    public function test_patternmatching()
14    {
15        $ass = mock\Assignments::getInstance();
16
17        $this->assertTrue($ass->matchPagePattern('some:ns:page', 'some:ns:page'));
18        $this->assertTrue($ass->matchPagePattern('some:ns:*', 'some:ns:page'));
19        $this->assertTrue($ass->matchPagePattern('some:**', 'some:ns:page'));
20        $this->assertTrue($ass->matchPagePattern('**', 'some:ns:page'));
21
22        $this->assertFalse($ass->matchPagePattern('some:ns:page', 'some:ns:other'));
23        $this->assertFalse($ass->matchPagePattern('some:ns:*', 'some:ns:deep:other'));
24
25        // some regexes
26        $this->assertTrue($ass->matchPagePattern('/page/', 'somepagehere'));
27        $this->assertFalse($ass->matchPagePattern('/:page/', 'somepagehere'));
28        $this->assertTrue($ass->matchPagePattern('/:page/', 'some:pagehere'));
29        $this->assertTrue($ass->matchPagePattern('/:page/', 'pagehere'));
30    }
31
32    /**
33     * check clearing works
34     */
35    public function test_clear()
36    {
37        $ass = mock\Assignments::getInstance();
38        $this->assertTrue($ass->clear());
39        $ass->addPattern('foo', 'foo');
40        $ass->assignPageSchema('foo', 'foo');
41        $this->assertTrue($ass->clear());
42
43        $this->assertEquals(array(), $ass->getAllPatterns());
44        $this->assertEquals(array(), $ass->getPageAssignments('foo', true));
45        $this->assertEquals(array(), $ass->getPageAssignments('foo', false));
46
47        // old page is still known
48        $this->assertEquals(array('foo' => array('foo' => false)), $ass->getPages());
49
50        // now it's gone
51        $ass->clear(true);
52        $this->assertEquals(array(), $ass->getPages());
53    }
54
55    /**
56     * basic usage
57     */
58    public function test_patternassigns()
59    {
60        $ass = mock\Assignments::getInstance();
61        $ass->clear(true);
62
63        $ass->addPattern('a:single:page', 'singlepage');
64        $ass->addPattern('the:namespace:*', 'singlens');
65        $ass->addPattern('another:namespace:**', 'deepns');
66
67        $this->assertEquals(
68            array(
69                array(
70                    'pattern' => 'a:single:page',
71                    'tbl' => 'singlepage'
72                ),
73                array(
74                    'pattern' => 'another:namespace:**',
75                    'tbl' => 'deepns'
76                ),
77                array(
78                    'pattern' => 'the:namespace:*',
79                    'tbl' => 'singlens'
80                )
81            ),
82            $ass->getAllPatterns()
83        );
84
85        $this->assertEquals(array(), $ass->getPageAssignments('foo'));
86        $this->assertEquals(array(), $ass->getPageAssignments('a:single'));
87        $this->assertEquals(array('singlepage'), $ass->getPageAssignments('a:single:page'));
88
89        $this->assertEquals(array(), $ass->getPageAssignments('the:foo'));
90        $this->assertEquals(array('singlens'), $ass->getPageAssignments('the:namespace:foo'));
91        $this->assertEquals(array(), $ass->getPageAssignments('the:namespace:foo:bar'));
92
93        $this->assertEquals(array(), $ass->getPageAssignments('another:foo'));
94        $this->assertEquals(array('deepns'), $ass->getPageAssignments('another:namespace:foo'));
95        $this->assertEquals(array('deepns'), $ass->getPageAssignments('another:namespace:foo:bar'));
96        $this->assertEquals(array('deepns'), $ass->getPageAssignments('another:namespace:foo:bar:baz'));
97
98        $ass->removePattern('a:single:page', 'singlepage');
99        $ass->removePattern('the:namespace:*', 'singlens');
100        $ass->removePattern('another:namespace:**', 'deepns');
101
102        $this->assertEquals(array(), $ass->getAllPatterns());
103    }
104
105    /**
106     * Check reevaluation of patterns for a specific page works
107     */
108    public function test_pagereassign()
109    {
110        $ass = mock\Assignments::getInstance();
111        $ass->clear(true);
112
113        // no assignment
114        $this->assertEquals(array(), $ass->getPageAssignments('wiki:syntax', false));
115
116        // fake assign the page to some schema
117        $ass->assignPageSchema('wiki:syntax', 'foo');
118        $this->assertEquals(array('foo'), $ass->getPageAssignments('wiki:syntax', false));
119
120        // reevaluate should deassign
121        $ass->reevaluatePageAssignments('wiki:syntax');
122        $this->assertEquals(array(), $ass->getPageAssignments('wiki:syntax', false));
123
124        // add a pattern and deliberately deassign the page
125        $ass->addPattern('wiki:*', 'foo');
126        $ass->deassignPageSchema('wiki:syntax', 'foo');
127        $this->assertEquals(array(), $ass->getPageAssignments('wiki:syntax', false));
128
129        // reevaluate should assign
130        $ass->reevaluatePageAssignments('wiki:syntax');
131        $this->assertEquals(array('foo'), $ass->getPageAssignments('wiki:syntax', false));
132    }
133
134    /**
135     * Check the direct page assignments
136     */
137    public function test_pageassign()
138    {
139        $ass = mock\Assignments::getInstance();
140        $ass->clear(true);
141
142        // no assignment
143        $this->assertEquals(array(), $ass->getPageAssignments('wiki:syntax', false));
144
145        // fake assign the page to some schema
146        $ass->assignPageSchema('wiki:syntax', 'foo');
147        $this->assertEquals(array('foo'), $ass->getPageAssignments('wiki:syntax', false));
148
149        // removing any pattern of the same schema should recheck all existing assignments
150        $ass->removePattern('anything', 'foo');
151        $this->assertEquals(array(), $ass->getPageAssignments('wiki:syntax', false));
152
153        // now the page is known to once have had data for that schema, a new pattern will reassign it
154        $ass->addPattern('wiki:*', 'foo');
155        $this->assertEquals(array('foo'), $ass->getPageAssignments('wiki:syntax', false));
156
157        // adding another pattern
158        $ass->addPattern('**', 'foo');
159        $this->assertEquals(array('foo'), $ass->getPageAssignments('wiki:syntax', false));
160
161        // removing one of the patterns, while the other still covers the same schema
162        $ass->removePattern('wiki:*', 'foo');
163        $this->assertEquals(array('foo'), $ass->getPageAssignments('wiki:syntax', false));
164
165        // new pattern will also update all known struct pages
166        $ass->addPattern('wiki:*', 'bar');
167        $this->assertEquals(array('bar', 'foo'), $ass->getPageAssignments('wiki:syntax', false));
168
169        // page should deassign again
170        $ass->addPattern('*', 'baz');
171        $ass->assignPageSchema('attoplevel', 'baz');
172        $ass->assignPageSchema('attoplevel', 'foo');
173        $ass->removePattern('*', 'baz');
174        $ass->removePattern('**', 'foo');
175
176        // check that all pages are known
177        $expect = array(
178            'attoplevel' => array(
179                'baz' => false,
180                'foo' => false
181            ),
182            'wiki:syntax' => array(
183                'bar' => true,
184                'foo' => false
185            )
186        );
187        $this->assertEquals($expect, $ass->getPages());
188
189        // limit to certain schema
190        $expect = array(
191            'attoplevel' => array(
192                'baz' => false,
193            ),
194        );
195        $this->assertEquals($expect, $ass->getPages('baz'));
196
197        // show current assignments only
198        $expect = array(
199            'wiki:syntax' => array(
200                'bar' => true,
201            )
202        );
203        $this->assertEquals($expect, $ass->getPages(null, true));
204    }
205}
206