xref: /plugin/bpmnio/_test/syntax_plugin_bpmnio_bpmnio.test.php (revision 242a8e5c8fdb14becaae50d3af24fc80cf14b6f4)
1ae85f1faSJaap de Haan<?php
2ae85f1faSJaap de Haan/**
3ae85f1faSJaap de Haan * @group plugin_bpmnio
4ae85f1faSJaap de Haan * @group plugins
5ae85f1faSJaap de Haan */
6ae85f1faSJaap de Haanclass syntax_plugin_bpmnio_test extends DokuWikiTest {
7ae85f1faSJaap de Haan
8ae85f1faSJaap de Haan    protected $pluginsEnabled = array('bpmnio');
9ae85f1faSJaap de Haan
10ae85f1faSJaap de Haan    public function test_syntax_bpmn() {
11ae85f1faSJaap de Haan        $info = array();
12ae85f1faSJaap de Haan        $expected = <<<OUT
13ae85f1faSJaap de Haan        <div class="plugin-bpmnio" id="__bpmn_js_1"><div class="bpmn_js_data">
14ae85f1faSJaap de Haan            ClhNTC4uLgo=
15ae85f1faSJaap de Haan        </div><div class="bpmn_js_canvas sectionedit1">
16ae85f1faSJaap de Haan            <div class="bpmn_js_container"></div>
17ae85f1faSJaap de Haan        </div><!-- EDIT{&quot;target&quot;:&quot;plugin_bpmnio_bpmn&quot;,&quot;secid&quot;:1,&quot;range&quot;:&quot;21-29&quot;} --></div>
18ae85f1faSJaap de Haan        OUT;
19ae85f1faSJaap de Haan
20ae85f1faSJaap de Haan        $input = <<<IN
21ae85f1faSJaap de Haan        <bpmnio type="bpmn">
22ae85f1faSJaap de Haan        XML...
23ae85f1faSJaap de Haan        </bpmnio>
24ae85f1faSJaap de Haan        IN;
25ae85f1faSJaap de Haan
26ae85f1faSJaap de Haan        $instructions = p_get_instructions($input);
27ae85f1faSJaap de Haan        $xhtml = p_render('xhtml', $instructions, $info);
28ae85f1faSJaap de Haan
29ae85f1faSJaap de Haan        $this->assertEquals($expected, $xhtml);
30ae85f1faSJaap de Haan    }
31ae85f1faSJaap de Haan
32d5f7db03SJaap de Haan    public function test_syntax_dmn() {
33ae85f1faSJaap de Haan        $info = array();
34ae85f1faSJaap de Haan        $expected = <<<OUT
35ae85f1faSJaap de Haan        <div class="plugin-bpmnio" id="__dmn_js_1"><div class="dmn_js_data">
36ae85f1faSJaap de Haan            ClhNTC4uLgo=
37ae85f1faSJaap de Haan        </div><div class="dmn_js_canvas sectionedit1">
38ae85f1faSJaap de Haan            <div class="dmn_js_container"></div>
39ae85f1faSJaap de Haan        </div><!-- EDIT{&quot;target&quot;:&quot;plugin_bpmnio_dmn&quot;,&quot;secid&quot;:1,&quot;range&quot;:&quot;20-28&quot;} --></div>
40ae85f1faSJaap de Haan        OUT;
41ae85f1faSJaap de Haan
42ae85f1faSJaap de Haan        $input = <<<IN
43ae85f1faSJaap de Haan        <bpmnio type="dmn">
44ae85f1faSJaap de Haan        XML...
45ae85f1faSJaap de Haan        </bpmnio>
46ae85f1faSJaap de Haan        IN;
47ae85f1faSJaap de Haan
48ae85f1faSJaap de Haan        $instructions = p_get_instructions($input);
49ae85f1faSJaap de Haan        $xhtml = p_render('xhtml', $instructions, $info);
50ae85f1faSJaap de Haan
51ae85f1faSJaap de Haan        $this->assertEquals($expected, $xhtml);
52ae85f1faSJaap de Haan    }
53*242a8e5cSJaap de Haan
54*242a8e5cSJaap de Haan    /**
55*242a8e5cSJaap de Haan     * Test that type defaults to bpmn when not specified
56*242a8e5cSJaap de Haan     */
57*242a8e5cSJaap de Haan    public function test_syntax_default_type() {
58*242a8e5cSJaap de Haan        $info = array();
59*242a8e5cSJaap de Haan
60*242a8e5cSJaap de Haan        $input = <<<IN
61*242a8e5cSJaap de Haan        <bpmnio>
62*242a8e5cSJaap de Haan        XML...
63*242a8e5cSJaap de Haan        </bpmnio>
64*242a8e5cSJaap de Haan        IN;
65*242a8e5cSJaap de Haan
66*242a8e5cSJaap de Haan        $instructions = p_get_instructions($input);
67*242a8e5cSJaap de Haan        $xhtml = p_render('xhtml', $instructions, $info);
68*242a8e5cSJaap de Haan
69*242a8e5cSJaap de Haan        $this->assertStringContainsString('bpmn_js_data', $xhtml);
70*242a8e5cSJaap de Haan        $this->assertStringContainsString('bpmn_js_canvas', $xhtml);
71*242a8e5cSJaap de Haan        $this->assertStringContainsString('bpmn_js_container', $xhtml);
72*242a8e5cSJaap de Haan    }
73*242a8e5cSJaap de Haan
74*242a8e5cSJaap de Haan    /**
75*242a8e5cSJaap de Haan     * Test empty content between tags
76*242a8e5cSJaap de Haan     */
77*242a8e5cSJaap de Haan    public function test_syntax_empty_content() {
78*242a8e5cSJaap de Haan        $info = array();
79*242a8e5cSJaap de Haan
80*242a8e5cSJaap de Haan        $input = <<<IN
81*242a8e5cSJaap de Haan        <bpmnio type="bpmn">
82*242a8e5cSJaap de Haan        </bpmnio>
83*242a8e5cSJaap de Haan        IN;
84*242a8e5cSJaap de Haan
85*242a8e5cSJaap de Haan        $instructions = p_get_instructions($input);
86*242a8e5cSJaap de Haan        $xhtml = p_render('xhtml', $instructions, $info);
87*242a8e5cSJaap de Haan
88*242a8e5cSJaap de Haan        // Should still produce the structure, with base64 of whitespace/empty
89*242a8e5cSJaap de Haan        $this->assertStringContainsString('plugin-bpmnio', $xhtml);
90*242a8e5cSJaap de Haan        $this->assertStringContainsString('bpmn_js_data', $xhtml);
91*242a8e5cSJaap de Haan    }
92*242a8e5cSJaap de Haan
93*242a8e5cSJaap de Haan    /**
94*242a8e5cSJaap de Haan     * Test that multiline XML content is properly base64-encoded
95*242a8e5cSJaap de Haan     */
96*242a8e5cSJaap de Haan    public function test_syntax_multiline_content() {
97*242a8e5cSJaap de Haan        $info = array();
98*242a8e5cSJaap de Haan
99*242a8e5cSJaap de Haan        $input = <<<IN
100*242a8e5cSJaap de Haan        <bpmnio type="bpmn">
101*242a8e5cSJaap de Haan        <?xml version="1.0"?>
102*242a8e5cSJaap de Haan        <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL">
103*242a8e5cSJaap de Haan        </definitions>
104*242a8e5cSJaap de Haan        </bpmnio>
105*242a8e5cSJaap de Haan        IN;
106*242a8e5cSJaap de Haan
107*242a8e5cSJaap de Haan        $instructions = p_get_instructions($input);
108*242a8e5cSJaap de Haan        $xhtml = p_render('xhtml', $instructions, $info);
109*242a8e5cSJaap de Haan
110*242a8e5cSJaap de Haan        $this->assertStringContainsString('bpmn_js_data', $xhtml);
111*242a8e5cSJaap de Haan        // Verify the data section contains valid base64
112*242a8e5cSJaap de Haan        preg_match('/<div class="bpmn_js_data">\s*(.*?)\s*<\/div>/s', $xhtml, $matches);
113*242a8e5cSJaap de Haan        $this->assertNotEmpty($matches[1]);
114*242a8e5cSJaap de Haan        $decoded = base64_decode(trim($matches[1]), true);
115*242a8e5cSJaap de Haan        $this->assertNotFalse($decoded, 'Content should be valid base64');
116*242a8e5cSJaap de Haan        $this->assertStringContainsString('definitions', $decoded);
117*242a8e5cSJaap de Haan    }
118*242a8e5cSJaap de Haan
119*242a8e5cSJaap de Haan    /**
120*242a8e5cSJaap de Haan     * Test that the plugin produces section edit markers for inline content
121*242a8e5cSJaap de Haan     */
122*242a8e5cSJaap de Haan    public function test_syntax_section_edit_bpmn() {
123*242a8e5cSJaap de Haan        $info = array();
124*242a8e5cSJaap de Haan
125*242a8e5cSJaap de Haan        $input = <<<IN
126*242a8e5cSJaap de Haan        <bpmnio type="bpmn">
127*242a8e5cSJaap de Haan        Content
128*242a8e5cSJaap de Haan        </bpmnio>
129*242a8e5cSJaap de Haan        IN;
130*242a8e5cSJaap de Haan
131*242a8e5cSJaap de Haan        $instructions = p_get_instructions($input);
132*242a8e5cSJaap de Haan        $xhtml = p_render('xhtml', $instructions, $info);
133*242a8e5cSJaap de Haan
134*242a8e5cSJaap de Haan        $this->assertStringContainsString('sectionedit', $xhtml);
135*242a8e5cSJaap de Haan        $this->assertStringContainsString('plugin_bpmnio_bpmn', $xhtml);
136*242a8e5cSJaap de Haan    }
137*242a8e5cSJaap de Haan
138*242a8e5cSJaap de Haan    /**
139*242a8e5cSJaap de Haan     * Test that the plugin produces section edit markers for DMN inline content
140*242a8e5cSJaap de Haan     */
141*242a8e5cSJaap de Haan    public function test_syntax_section_edit_dmn() {
142*242a8e5cSJaap de Haan        $info = array();
143*242a8e5cSJaap de Haan
144*242a8e5cSJaap de Haan        $input = <<<IN
145*242a8e5cSJaap de Haan        <bpmnio type="dmn">
146*242a8e5cSJaap de Haan        Content
147*242a8e5cSJaap de Haan        </bpmnio>
148*242a8e5cSJaap de Haan        IN;
149*242a8e5cSJaap de Haan
150*242a8e5cSJaap de Haan        $instructions = p_get_instructions($input);
151*242a8e5cSJaap de Haan        $xhtml = p_render('xhtml', $instructions, $info);
152*242a8e5cSJaap de Haan
153*242a8e5cSJaap de Haan        $this->assertStringContainsString('sectionedit', $xhtml);
154*242a8e5cSJaap de Haan        $this->assertStringContainsString('plugin_bpmnio_dmn', $xhtml);
155*242a8e5cSJaap de Haan    }
156*242a8e5cSJaap de Haan
157*242a8e5cSJaap de Haan    /**
158*242a8e5cSJaap de Haan     * Test that unrecognized text outside <bpmnio> is not affected
159*242a8e5cSJaap de Haan     */
160*242a8e5cSJaap de Haan    public function test_syntax_no_interference() {
161*242a8e5cSJaap de Haan        $info = array();
162*242a8e5cSJaap de Haan
163*242a8e5cSJaap de Haan        $input = <<<IN
164*242a8e5cSJaap de Haan        Hello World
165*242a8e5cSJaap de Haan        <bpmnio type="bpmn">
166*242a8e5cSJaap de Haan        XML...
167*242a8e5cSJaap de Haan        </bpmnio>
168*242a8e5cSJaap de Haan        Goodbye World
169*242a8e5cSJaap de Haan        IN;
170*242a8e5cSJaap de Haan
171*242a8e5cSJaap de Haan        $instructions = p_get_instructions($input);
172*242a8e5cSJaap de Haan        $xhtml = p_render('xhtml', $instructions, $info);
173*242a8e5cSJaap de Haan
174*242a8e5cSJaap de Haan        $this->assertStringContainsString('Hello World', $xhtml);
175*242a8e5cSJaap de Haan        $this->assertStringContainsString('Goodbye World', $xhtml);
176*242a8e5cSJaap de Haan        $this->assertStringContainsString('plugin-bpmnio', $xhtml);
177*242a8e5cSJaap de Haan    }
178*242a8e5cSJaap de Haan
179*242a8e5cSJaap de Haan    /**
180*242a8e5cSJaap de Haan     * Test the handle method directly for ENTER state
181*242a8e5cSJaap de Haan     */
182*242a8e5cSJaap de Haan    public function test_handle_enter_state() {
183*242a8e5cSJaap de Haan        $plugin = plugin_load('syntax', 'bpmnio_bpmnio');
184*242a8e5cSJaap de Haan        $this->assertNotNull($plugin, 'Plugin should be loadable');
185*242a8e5cSJaap de Haan
186*242a8e5cSJaap de Haan        $handler = new Doku_Handler();
187*242a8e5cSJaap de Haan        $result = $plugin->handle('<bpmnio type="bpmn">', DOKU_LEXER_ENTER, 0, $handler);
188*242a8e5cSJaap de Haan
189*242a8e5cSJaap de Haan        $this->assertEquals(DOKU_LEXER_ENTER, $result[0]);
190*242a8e5cSJaap de Haan        $this->assertEquals('bpmn', $result[1]);
191*242a8e5cSJaap de Haan    }
192*242a8e5cSJaap de Haan
193*242a8e5cSJaap de Haan    /**
194*242a8e5cSJaap de Haan     * Test the handle method directly for EXIT state
195*242a8e5cSJaap de Haan     */
196*242a8e5cSJaap de Haan    public function test_handle_exit_state() {
197*242a8e5cSJaap de Haan        $plugin = plugin_load('syntax', 'bpmnio_bpmnio');
198*242a8e5cSJaap de Haan        $handler = new Doku_Handler();
199*242a8e5cSJaap de Haan        $result = $plugin->handle('</bpmnio>', DOKU_LEXER_EXIT, 0, $handler);
200*242a8e5cSJaap de Haan
201*242a8e5cSJaap de Haan        $this->assertEquals(DOKU_LEXER_EXIT, $result[0]);
202*242a8e5cSJaap de Haan    }
203*242a8e5cSJaap de Haan
204*242a8e5cSJaap de Haan    /**
205*242a8e5cSJaap de Haan     * Test that the plugin is correctly registered
206*242a8e5cSJaap de Haan     */
207*242a8e5cSJaap de Haan    public function test_plugin_registration() {
208*242a8e5cSJaap de Haan        $plugin = plugin_load('syntax', 'bpmnio_bpmnio');
209*242a8e5cSJaap de Haan        $this->assertNotNull($plugin, 'Plugin should be loadable');
210*242a8e5cSJaap de Haan        $this->assertEquals('block', $plugin->getPType());
211*242a8e5cSJaap de Haan        $this->assertEquals('protected', $plugin->getType());
212*242a8e5cSJaap de Haan        $this->assertEquals(0, $plugin->getSort());
213ae85f1faSJaap de Haan    }
214