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{"target":"plugin_bpmnio_bpmn","secid":1,"range":"21-29"} --></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{"target":"plugin_bpmnio_dmn","secid":1,"range":"20-28"} --></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