xref: /plugin/bpmnio/_test/syntax_plugin_bpmnio_bpmnio.test.php (revision 36b712d809a9afeda77eb7dba8abf621818208c9)
1ae85f1faSJaap de Haan<?php
29ff8d41cSJaap de Haan
3ae85f1faSJaap de Haan/**
4ae85f1faSJaap de Haan * @group plugin_bpmnio
5ae85f1faSJaap de Haan * @group plugins
6ae85f1faSJaap de Haan */
79ff8d41cSJaap de Haanclass syntax_plugin_bpmnio_test extends DokuWikiTest
89ff8d41cSJaap de Haan{
9ae85f1faSJaap de Haan    protected $pluginsEnabled = array('bpmnio');
10ae85f1faSJaap de Haan
119ff8d41cSJaap de Haan    public function test_syntax_bpmn()
129ff8d41cSJaap de Haan    {
13ae85f1faSJaap de Haan        $info = array();
14ae85f1faSJaap de Haan        $expected = <<<OUT
15ae85f1faSJaap de Haan        <div class="plugin-bpmnio" id="__bpmn_js_1"><div class="bpmn_js_data">
16ae85f1faSJaap de Haan            ClhNTC4uLgo=
17*36b712d8SJaap de Haan        </div>
18*36b712d8SJaap de Haan        <div class="bpmn_js_links">
19*36b712d8SJaap de Haan            W10=
20ae85f1faSJaap de Haan        </div><div class="bpmn_js_canvas sectionedit1">
21ae85f1faSJaap de Haan            <div class="bpmn_js_container"></div>
22ae85f1faSJaap de Haan        </div><!-- EDIT{&quot;target&quot;:&quot;plugin_bpmnio_bpmn&quot;,&quot;secid&quot;:1,&quot;range&quot;:&quot;21-29&quot;} --></div>
23ae85f1faSJaap de Haan        OUT;
24ae85f1faSJaap de Haan
25ae85f1faSJaap de Haan        $input = <<<IN
26ae85f1faSJaap de Haan        <bpmnio type="bpmn">
27ae85f1faSJaap de Haan        XML...
28ae85f1faSJaap de Haan        </bpmnio>
29ae85f1faSJaap de Haan        IN;
30ae85f1faSJaap de Haan
31ae85f1faSJaap de Haan        $instructions = p_get_instructions($input);
32ae85f1faSJaap de Haan        $xhtml = p_render('xhtml', $instructions, $info);
33ae85f1faSJaap de Haan
34ae85f1faSJaap de Haan        $this->assertEquals($expected, $xhtml);
35ae85f1faSJaap de Haan    }
36ae85f1faSJaap de Haan
379ff8d41cSJaap de Haan    public function test_syntax_dmn()
389ff8d41cSJaap de Haan    {
39ae85f1faSJaap de Haan        $info = array();
40ae85f1faSJaap de Haan        $expected = <<<OUT
41ae85f1faSJaap de Haan        <div class="plugin-bpmnio" id="__dmn_js_1"><div class="dmn_js_data">
42ae85f1faSJaap de Haan            ClhNTC4uLgo=
43*36b712d8SJaap de Haan        </div>
44*36b712d8SJaap de Haan        <div class="dmn_js_links">
45*36b712d8SJaap de Haan            W10=
46ae85f1faSJaap de Haan        </div><div class="dmn_js_canvas sectionedit1">
47ae85f1faSJaap de Haan            <div class="dmn_js_container"></div>
48ae85f1faSJaap de Haan        </div><!-- EDIT{&quot;target&quot;:&quot;plugin_bpmnio_dmn&quot;,&quot;secid&quot;:1,&quot;range&quot;:&quot;20-28&quot;} --></div>
49ae85f1faSJaap de Haan        OUT;
50ae85f1faSJaap de Haan
51ae85f1faSJaap de Haan        $input = <<<IN
52ae85f1faSJaap de Haan        <bpmnio type="dmn">
53ae85f1faSJaap de Haan        XML...
54ae85f1faSJaap de Haan        </bpmnio>
55ae85f1faSJaap de Haan        IN;
56ae85f1faSJaap de Haan
57ae85f1faSJaap de Haan        $instructions = p_get_instructions($input);
58ae85f1faSJaap de Haan        $xhtml = p_render('xhtml', $instructions, $info);
59ae85f1faSJaap de Haan
60ae85f1faSJaap de Haan        $this->assertEquals($expected, $xhtml);
61ae85f1faSJaap de Haan    }
62242a8e5cSJaap de Haan
63242a8e5cSJaap de Haan    /**
64242a8e5cSJaap de Haan     * Test that type defaults to bpmn when not specified
65242a8e5cSJaap de Haan     */
669ff8d41cSJaap de Haan    public function test_syntax_default_type()
679ff8d41cSJaap de Haan    {
68242a8e5cSJaap de Haan        $info = array();
69242a8e5cSJaap de Haan
70242a8e5cSJaap de Haan        $input = <<<IN
71242a8e5cSJaap de Haan        <bpmnio>
72242a8e5cSJaap de Haan        XML...
73242a8e5cSJaap de Haan        </bpmnio>
74242a8e5cSJaap de Haan        IN;
75242a8e5cSJaap de Haan
76242a8e5cSJaap de Haan        $instructions = p_get_instructions($input);
77242a8e5cSJaap de Haan        $xhtml = p_render('xhtml', $instructions, $info);
78242a8e5cSJaap de Haan
79242a8e5cSJaap de Haan        $this->assertStringContainsString('bpmn_js_data', $xhtml);
80242a8e5cSJaap de Haan        $this->assertStringContainsString('bpmn_js_canvas', $xhtml);
81242a8e5cSJaap de Haan        $this->assertStringContainsString('bpmn_js_container', $xhtml);
82242a8e5cSJaap de Haan    }
83242a8e5cSJaap de Haan
84242a8e5cSJaap de Haan    /**
85242a8e5cSJaap de Haan     * Test empty content between tags
86242a8e5cSJaap de Haan     */
879ff8d41cSJaap de Haan    public function test_syntax_empty_content()
889ff8d41cSJaap de Haan    {
89242a8e5cSJaap de Haan        $info = array();
90242a8e5cSJaap de Haan
91242a8e5cSJaap de Haan        $input = <<<IN
92242a8e5cSJaap de Haan        <bpmnio type="bpmn">
93242a8e5cSJaap de Haan        </bpmnio>
94242a8e5cSJaap de Haan        IN;
95242a8e5cSJaap de Haan
96242a8e5cSJaap de Haan        $instructions = p_get_instructions($input);
97242a8e5cSJaap de Haan        $xhtml = p_render('xhtml', $instructions, $info);
98242a8e5cSJaap de Haan
99242a8e5cSJaap de Haan        // Should still produce the structure, with base64 of whitespace/empty
100242a8e5cSJaap de Haan        $this->assertStringContainsString('plugin-bpmnio', $xhtml);
101242a8e5cSJaap de Haan        $this->assertStringContainsString('bpmn_js_data', $xhtml);
102242a8e5cSJaap de Haan    }
103242a8e5cSJaap de Haan
104242a8e5cSJaap de Haan    /**
105242a8e5cSJaap de Haan     * Test that multiline XML content is properly base64-encoded
106242a8e5cSJaap de Haan     */
1079ff8d41cSJaap de Haan    public function test_syntax_multiline_content()
1089ff8d41cSJaap de Haan    {
109242a8e5cSJaap de Haan        $info = array();
110242a8e5cSJaap de Haan
111242a8e5cSJaap de Haan        $input = <<<IN
112242a8e5cSJaap de Haan        <bpmnio type="bpmn">
113242a8e5cSJaap de Haan        <?xml version="1.0"?>
114242a8e5cSJaap de Haan        <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL">
115242a8e5cSJaap de Haan        </definitions>
116242a8e5cSJaap de Haan        </bpmnio>
117242a8e5cSJaap de Haan        IN;
118242a8e5cSJaap de Haan
119242a8e5cSJaap de Haan        $instructions = p_get_instructions($input);
120242a8e5cSJaap de Haan        $xhtml = p_render('xhtml', $instructions, $info);
121242a8e5cSJaap de Haan
122242a8e5cSJaap de Haan        $this->assertStringContainsString('bpmn_js_data', $xhtml);
123242a8e5cSJaap de Haan        // Verify the data section contains valid base64
124242a8e5cSJaap de Haan        preg_match('/<div class="bpmn_js_data">\s*(.*?)\s*<\/div>/s', $xhtml, $matches);
125242a8e5cSJaap de Haan        $this->assertNotEmpty($matches[1]);
126242a8e5cSJaap de Haan        $decoded = base64_decode(trim($matches[1]), true);
127242a8e5cSJaap de Haan        $this->assertNotFalse($decoded, 'Content should be valid base64');
128242a8e5cSJaap de Haan        $this->assertStringContainsString('definitions', $decoded);
129242a8e5cSJaap de Haan    }
130242a8e5cSJaap de Haan
131242a8e5cSJaap de Haan    /**
132242a8e5cSJaap de Haan     * Test that the plugin produces section edit markers for inline content
133242a8e5cSJaap de Haan     */
1349ff8d41cSJaap de Haan    public function test_syntax_section_edit_bpmn()
1359ff8d41cSJaap de Haan    {
136242a8e5cSJaap de Haan        $info = array();
137242a8e5cSJaap de Haan
138242a8e5cSJaap de Haan        $input = <<<IN
139242a8e5cSJaap de Haan        <bpmnio type="bpmn">
140242a8e5cSJaap de Haan        Content
141242a8e5cSJaap de Haan        </bpmnio>
142242a8e5cSJaap de Haan        IN;
143242a8e5cSJaap de Haan
144242a8e5cSJaap de Haan        $instructions = p_get_instructions($input);
145242a8e5cSJaap de Haan        $xhtml = p_render('xhtml', $instructions, $info);
146242a8e5cSJaap de Haan
147242a8e5cSJaap de Haan        $this->assertStringContainsString('sectionedit', $xhtml);
148242a8e5cSJaap de Haan        $this->assertStringContainsString('plugin_bpmnio_bpmn', $xhtml);
149242a8e5cSJaap de Haan    }
150242a8e5cSJaap de Haan
151242a8e5cSJaap de Haan    /**
152242a8e5cSJaap de Haan     * Test that the plugin produces section edit markers for DMN inline content
153242a8e5cSJaap de Haan     */
1549ff8d41cSJaap de Haan    public function test_syntax_section_edit_dmn()
1559ff8d41cSJaap de Haan    {
156242a8e5cSJaap de Haan        $info = array();
157242a8e5cSJaap de Haan
158242a8e5cSJaap de Haan        $input = <<<IN
159242a8e5cSJaap de Haan        <bpmnio type="dmn">
160242a8e5cSJaap de Haan        Content
161242a8e5cSJaap de Haan        </bpmnio>
162242a8e5cSJaap de Haan        IN;
163242a8e5cSJaap de Haan
164242a8e5cSJaap de Haan        $instructions = p_get_instructions($input);
165242a8e5cSJaap de Haan        $xhtml = p_render('xhtml', $instructions, $info);
166242a8e5cSJaap de Haan
167242a8e5cSJaap de Haan        $this->assertStringContainsString('sectionedit', $xhtml);
168242a8e5cSJaap de Haan        $this->assertStringContainsString('plugin_bpmnio_dmn', $xhtml);
169242a8e5cSJaap de Haan    }
170242a8e5cSJaap de Haan
171242a8e5cSJaap de Haan    /**
172242a8e5cSJaap de Haan     * Test that unrecognized text outside <bpmnio> is not affected
173242a8e5cSJaap de Haan     */
1749ff8d41cSJaap de Haan    public function test_syntax_no_interference()
1759ff8d41cSJaap de Haan    {
176242a8e5cSJaap de Haan        $info = array();
177242a8e5cSJaap de Haan
178242a8e5cSJaap de Haan        $input = <<<IN
179242a8e5cSJaap de Haan        Hello World
180242a8e5cSJaap de Haan        <bpmnio type="bpmn">
181242a8e5cSJaap de Haan        XML...
182242a8e5cSJaap de Haan        </bpmnio>
183242a8e5cSJaap de Haan        Goodbye World
184242a8e5cSJaap de Haan        IN;
185242a8e5cSJaap de Haan
186242a8e5cSJaap de Haan        $instructions = p_get_instructions($input);
187242a8e5cSJaap de Haan        $xhtml = p_render('xhtml', $instructions, $info);
188242a8e5cSJaap de Haan
189242a8e5cSJaap de Haan        $this->assertStringContainsString('Hello World', $xhtml);
190242a8e5cSJaap de Haan        $this->assertStringContainsString('Goodbye World', $xhtml);
191242a8e5cSJaap de Haan        $this->assertStringContainsString('plugin-bpmnio', $xhtml);
192242a8e5cSJaap de Haan    }
193242a8e5cSJaap de Haan
19494260a7fSJaap de Haan    public function test_syntax_zoom_attribute()
19594260a7fSJaap de Haan    {
19694260a7fSJaap de Haan        $info = array();
19794260a7fSJaap de Haan
19894260a7fSJaap de Haan        $input = <<<IN
19994260a7fSJaap de Haan        <bpmnio type="bpmn" zoom="0.5">
20094260a7fSJaap de Haan        XML...
20194260a7fSJaap de Haan        </bpmnio>
20294260a7fSJaap de Haan        IN;
20394260a7fSJaap de Haan
20494260a7fSJaap de Haan        $instructions = p_get_instructions($input);
20594260a7fSJaap de Haan        $xhtml = p_render('xhtml', $instructions, $info);
20694260a7fSJaap de Haan
20794260a7fSJaap de Haan        $this->assertStringContainsString('data-zoom="0.5"', $xhtml);
20894260a7fSJaap de Haan    }
20994260a7fSJaap de Haan
21094260a7fSJaap de Haan    public function test_syntax_ignores_invalid_zoom_attribute()
21194260a7fSJaap de Haan    {
21294260a7fSJaap de Haan        $info = array();
21394260a7fSJaap de Haan
21494260a7fSJaap de Haan        $input = <<<IN
21594260a7fSJaap de Haan        <bpmnio type="bpmn" zoom="0">
21694260a7fSJaap de Haan        XML...
21794260a7fSJaap de Haan        </bpmnio>
21894260a7fSJaap de Haan        IN;
21994260a7fSJaap de Haan
22094260a7fSJaap de Haan        $instructions = p_get_instructions($input);
22194260a7fSJaap de Haan        $xhtml = p_render('xhtml', $instructions, $info);
22294260a7fSJaap de Haan
22394260a7fSJaap de Haan        $this->assertStringNotContainsString('data-zoom=', $xhtml);
22494260a7fSJaap de Haan    }
22594260a7fSJaap de Haan
226*36b712d8SJaap de Haan        public function test_syntax_builds_link_payload_for_named_elements()
227*36b712d8SJaap de Haan        {
228*36b712d8SJaap de Haan                $info = array();
229*36b712d8SJaap de Haan                io_mkdir_p(dirname(wikiFN('docs:start')));
230*36b712d8SJaap de Haan                io_saveFile(wikiFN('docs:start'), 'Read docs');
231*36b712d8SJaap de Haan
232*36b712d8SJaap de Haan                $input = <<<IN
233*36b712d8SJaap de Haan                <bpmnio type="bpmn">
234*36b712d8SJaap de Haan                <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL">
235*36b712d8SJaap de Haan                    <process id="Process_1">
236*36b712d8SJaap de Haan                        <task id="Task_1" name="[[:docs:start|Read docs]]" />
237*36b712d8SJaap de Haan                    </process>
238*36b712d8SJaap de Haan                </definitions>
239*36b712d8SJaap de Haan                </bpmnio>
240*36b712d8SJaap de Haan                IN;
241*36b712d8SJaap de Haan
242*36b712d8SJaap de Haan                $instructions = p_get_instructions($input);
243*36b712d8SJaap de Haan                $xhtml = p_render('xhtml', $instructions, $info);
244*36b712d8SJaap de Haan
245*36b712d8SJaap de Haan                preg_match('/<div class="bpmn_js_data">\s*(.*?)\s*<\/div>/s', $xhtml, $xmlMatch);
246*36b712d8SJaap de Haan                $this->assertNotEmpty($xmlMatch[1]);
247*36b712d8SJaap de Haan                $decodedXml = base64_decode(trim($xmlMatch[1]), true);
248*36b712d8SJaap de Haan                $this->assertNotFalse($decodedXml);
249*36b712d8SJaap de Haan                $this->assertStringContainsString('name="Read docs"', $decodedXml);
250*36b712d8SJaap de Haan                $this->assertStringNotContainsString('[[', $decodedXml);
251*36b712d8SJaap de Haan
252*36b712d8SJaap de Haan                preg_match('/<div class="bpmn_js_links">\s*(.*?)\s*<\/div>/s', $xhtml, $linkMatch);
253*36b712d8SJaap de Haan                $this->assertNotEmpty($linkMatch[1]);
254*36b712d8SJaap de Haan                $decodedLinks = base64_decode(trim($linkMatch[1]), true);
255*36b712d8SJaap de Haan                $this->assertNotFalse($decodedLinks);
256*36b712d8SJaap de Haan                $links = json_decode($decodedLinks, true);
257*36b712d8SJaap de Haan
258*36b712d8SJaap de Haan                $this->assertIsArray($links);
259*36b712d8SJaap de Haan                $this->assertArrayHasKey('Task_1', $links);
260*36b712d8SJaap de Haan                $this->assertEquals('/doku.php?id=docs%3Astart', $links['Task_1']['href']);
261*36b712d8SJaap de Haan                $this->assertEquals('docs:start', $links['Task_1']['target']);
262*36b712d8SJaap de Haan        }
263*36b712d8SJaap de Haan
264*36b712d8SJaap de Haan        public function test_syntax_keeps_unlinked_names_unchanged()
265*36b712d8SJaap de Haan        {
266*36b712d8SJaap de Haan                $info = array();
267*36b712d8SJaap de Haan
268*36b712d8SJaap de Haan                $input = <<<IN
269*36b712d8SJaap de Haan                <bpmnio type="dmn">
270*36b712d8SJaap de Haan                <?xml version="1.0" encoding="UTF-8"?>
271*36b712d8SJaap de Haan                <definitions xmlns="https://www.omg.org/spec/DMN/20191111/MODEL/" id="Definitions_1">
272*36b712d8SJaap de Haan                    <decision id="Decision_1" name="Approve Order" />
273*36b712d8SJaap de Haan                </definitions>
274*36b712d8SJaap de Haan                </bpmnio>
275*36b712d8SJaap de Haan                IN;
276*36b712d8SJaap de Haan
277*36b712d8SJaap de Haan                $instructions = p_get_instructions($input);
278*36b712d8SJaap de Haan                $xhtml = p_render('xhtml', $instructions, $info);
279*36b712d8SJaap de Haan
280*36b712d8SJaap de Haan                preg_match('/<div class="dmn_js_data">\s*(.*?)\s*<\/div>/s', $xhtml, $xmlMatch);
281*36b712d8SJaap de Haan                $decodedXml = base64_decode(trim($xmlMatch[1]), true);
282*36b712d8SJaap de Haan                $this->assertNotFalse($decodedXml);
283*36b712d8SJaap de Haan                $this->assertStringContainsString('Approve Order', $decodedXml);
284*36b712d8SJaap de Haan
285*36b712d8SJaap de Haan                preg_match('/<div class="dmn_js_links">\s*(.*?)\s*<\/div>/s', $xhtml, $linkMatch);
286*36b712d8SJaap de Haan                $decodedLinks = base64_decode(trim($linkMatch[1]), true);
287*36b712d8SJaap de Haan                $this->assertSame('[]', $decodedLinks);
288*36b712d8SJaap de Haan        }
289*36b712d8SJaap de Haan
290242a8e5cSJaap de Haan    /**
291242a8e5cSJaap de Haan     * Test the handle method directly for ENTER state
292242a8e5cSJaap de Haan     */
2939ff8d41cSJaap de Haan    public function test_handle_enter_state()
2949ff8d41cSJaap de Haan    {
295242a8e5cSJaap de Haan        $plugin = plugin_load('syntax', 'bpmnio_bpmnio');
296242a8e5cSJaap de Haan        $this->assertNotNull($plugin, 'Plugin should be loadable');
297242a8e5cSJaap de Haan
298242a8e5cSJaap de Haan        $handler = new Doku_Handler();
299242a8e5cSJaap de Haan        $result = $plugin->handle('<bpmnio type="bpmn">', DOKU_LEXER_ENTER, 0, $handler);
300242a8e5cSJaap de Haan
301242a8e5cSJaap de Haan        $this->assertEquals(DOKU_LEXER_ENTER, $result[0]);
302242a8e5cSJaap de Haan        $this->assertEquals('bpmn', $result[1]);
303242a8e5cSJaap de Haan    }
304242a8e5cSJaap de Haan
305242a8e5cSJaap de Haan    /**
306242a8e5cSJaap de Haan     * Test the handle method directly for EXIT state
307242a8e5cSJaap de Haan     */
3089ff8d41cSJaap de Haan    public function test_handle_exit_state()
3099ff8d41cSJaap de Haan    {
310242a8e5cSJaap de Haan        $plugin = plugin_load('syntax', 'bpmnio_bpmnio');
311242a8e5cSJaap de Haan        $handler = new Doku_Handler();
312242a8e5cSJaap de Haan        $result = $plugin->handle('</bpmnio>', DOKU_LEXER_EXIT, 0, $handler);
313242a8e5cSJaap de Haan
314242a8e5cSJaap de Haan        $this->assertEquals(DOKU_LEXER_EXIT, $result[0]);
315242a8e5cSJaap de Haan    }
316242a8e5cSJaap de Haan
317242a8e5cSJaap de Haan    /**
318242a8e5cSJaap de Haan     * Test that the plugin is correctly registered
319242a8e5cSJaap de Haan     */
3209ff8d41cSJaap de Haan    public function test_plugin_registration()
3219ff8d41cSJaap de Haan    {
322242a8e5cSJaap de Haan        $plugin = plugin_load('syntax', 'bpmnio_bpmnio');
323242a8e5cSJaap de Haan        $this->assertNotNull($plugin, 'Plugin should be loadable');
324242a8e5cSJaap de Haan        $this->assertEquals('block', $plugin->getPType());
325242a8e5cSJaap de Haan        $this->assertEquals('protected', $plugin->getType());
326242a8e5cSJaap de Haan        $this->assertEquals(0, $plugin->getSort());
327ae85f1faSJaap de Haan    }
32843854469SJaap de Haan}
329