Skip to content

Commit

Permalink
Merge pull request #2307 from splitbrain/geshi_features
Browse files Browse the repository at this point in the history
Geshi Option parsing
  • Loading branch information
splitbrain committed Apr 15, 2018
2 parents 8a00500 + a851f92 commit 0387686
Show file tree
Hide file tree
Showing 8 changed files with 465 additions and 13 deletions.
20 changes: 20 additions & 0 deletions _test/core/DokuWikiTest.php
Expand Up @@ -171,4 +171,24 @@ protected function waitForTick($init = false) {
$last = $now;
return $now;
}

/**
* Allow for testing inaccessible methods (private or protected)
*
* This makes it easier to test protected methods without needing to create intermediate
* classes inheriting and changing the access.
*
* @link https://stackoverflow.com/a/8702347/172068
* @param object $obj Object in which to call the method
* @param string $func The method to call
* @param array $args The arguments to call the method with
* @return mixed
* @throws ReflectionException when the given obj/func does not exist
*/
protected static function callInaccessibleMethod($obj, $func, array $args) {
$class = new \ReflectionClass($obj);
$method = $class->getMethod($func);
$method->setAccessible(true);
return $method->invokeArgs($obj, $args);
}
}
56 changes: 56 additions & 0 deletions _test/tests/inc/parser/handler_parse_highlight_options.test.php
@@ -0,0 +1,56 @@
<?php

class TestOfDoku_Handler_ParseHighlightOptions extends DokuWikiTest {

public function dataProvider() {
return [
['', null],
['something weird', null],
['enable_line_numbers', ['enable_line_numbers' => true]],
['enable_line_numbers=1', ['enable_line_numbers' => true]],
['enable_line_numbers="1"', ['enable_line_numbers' => true]],
['enable_line_numbers=0', ['enable_line_numbers' => false]],
['enable_line_numbers="0"', ['enable_line_numbers' => false]],
['enable_line_numbers=false', ['enable_line_numbers' => false]],
['enable_line_numbers="false"', ['enable_line_numbers' => false]],
['highlight_lines_extra', ['highlight_lines_extra' => [1]]],
['highlight_lines_extra=17', ['highlight_lines_extra' => [17]]],
['highlight_lines_extra=17,19', ['highlight_lines_extra' => [17, 19]]],
['highlight_lines_extra="17,19"', ['highlight_lines_extra' => [17, 19]]],
['highlight_lines_extra="17,19,17"', ['highlight_lines_extra' => [17, 19]]],
['start_line_numbers_at', ['start_line_numbers_at' => 1]],
['start_line_numbers_at=12', ['start_line_numbers_at' => 12]],
['start_line_numbers_at="12"', ['start_line_numbers_at' => 12]],
['enable_keyword_links', ['enable_keyword_links' => true]],
['enable_keyword_links=1', ['enable_keyword_links' => true]],
['enable_keyword_links="1"', ['enable_keyword_links' => true]],
['enable_keyword_links=0', ['enable_keyword_links' => false]],
['enable_keyword_links="0"', ['enable_keyword_links' => false]],
['enable_keyword_links=false', ['enable_keyword_links' => false]],
['enable_keyword_links="false"', ['enable_keyword_links' => false]],
[
'enable_line_numbers weird nothing highlight_lines_extra=17,19 start_line_numbers_at="12" enable_keyword_links=false',
[
'enable_line_numbers' => true,
'highlight_lines_extra' => [17, 19],
'start_line_numbers_at' => 12,
'enable_keyword_links' => false
]
],
];
}

/**
* @dataProvider dataProvider
* @param string $input options to parse
* @param array|null $expect expected outcome
* @throws ReflectionException
*/
public function testOptionParser($input, $expect) {
$h = new Doku_Handler();

$output = $this->callInaccessibleMethod($h, 'parse_highlight_options', [$input]);

$this->assertEquals($expect, $output);
}
}
281 changes: 281 additions & 0 deletions _test/tests/inc/parser/parser_code.test.php
@@ -1,6 +1,11 @@
<?php
require_once 'parser.inc.php';

/**
* Tests to ensure functionality of the <code> syntax tag.
*
* @group parser_code
*/
class TestOfDoku_Parser_Code extends TestOfDoku_Parser {

function setUp() {
Expand Down Expand Up @@ -68,5 +73,281 @@ function testCodeToken() {
);
$this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}

function testCodeOptionsArray_OneOption() {
$this->P->parse('Foo <code C [enable_line_numbers]>Test</code> Bar');
$calls = array (
array('document_start',array()),
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('p_close',array()),
array('code',array('Test','C', null,
array('enable_line_numbers' => 1)
)),
array('p_open',array()),
array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
$this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}

function testCodeOptionsArray_TwoOptions() {
$this->P->parse('Foo <code C [enable_line_numbers highlight_lines_extra="3"]>Test</code> Bar');
$calls = array (
array('document_start',array()),
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('p_close',array()),
array('code',array('Test','C', null,
array('enable_line_numbers' => true,
'highlight_lines_extra' => array(3)
))),
array('p_open',array()),
array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
$this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}

function testCodeOptionsArray_UnknownOption() {
$this->P->parse('Foo <code C [unknown="I will be deleted/ignored!"]>Test</code> Bar');
$calls = array (
array('document_start',array()),
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('p_close',array()),
array('code',array('Test','C', null, null)),
array('p_open',array()),
array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
$this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}

function testCodeOptionsArray_EnableLineNumbers1() {
$this->P->parse('Foo <code C [enable_line_numbers]>Test</code> Bar');
$calls = array (
array('document_start',array()),
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('p_close',array()),
array('code',array('Test','C', null,
array('enable_line_numbers' => true)
)),
array('p_open',array()),
array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
$this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}

function testCodeOptionsArray_EnableLineNumbers2() {
$this->P->parse('Foo <code C [enable_line_numbers="1"]>Test</code> Bar');
$calls = array (
array('document_start',array()),
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('p_close',array()),
array('code',array('Test','C', null,
array('enable_line_numbers' => true)
)),
array('p_open',array()),
array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
$this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}

function testCodeOptionsArray_EnableLineNumbers3() {
$this->P->parse('Foo <code C [enable_line_numbers="0"]>Test</code> Bar');
$calls = array (
array('document_start',array()),
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('p_close',array()),
array('code',array('Test','C', null,
array('enable_line_numbers' => false)
)),
array('p_open',array()),
array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
$this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}

function testCodeOptionsArray_EnableLineNumbers4() {
$this->P->parse('Foo <code C [enable_line_numbers=""]>Test</code> Bar');
$calls = array (
array('document_start',array()),
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('p_close',array()),
array('code',array('Test','C', null,
array('enable_line_numbers' => true)
)),
array('p_open',array()),
array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
$this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}

function testCodeOptionsArray_HighlightLinesExtra1() {
$this->P->parse('Foo <code C [enable_line_numbers highlight_lines_extra="42, 123, 456, 789"]>Test</code> Bar');
$calls = array (
array('document_start',array()),
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('p_close',array()),
array('code',array('Test','C', null,
array('enable_line_numbers' => true,
'highlight_lines_extra' => array(42, 123, 456, 789)
))),
array('p_open',array()),
array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
$this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}

function testCodeOptionsArray_HighlightLinesExtra2() {
$this->P->parse('Foo <code C [enable_line_numbers highlight_lines_extra]>Test</code> Bar');
$calls = array (
array('document_start',array()),
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('p_close',array()),
array('code',array('Test','C', null,
array('enable_line_numbers' => true,
'highlight_lines_extra' => array(1))
)),
array('p_open',array()),
array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
$this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}

function testCodeOptionsArray_HighlightLinesExtra3() {
$this->P->parse('Foo <code C [enable_line_numbers highlight_lines_extra=""]>Test</code> Bar');
$calls = array (
array('document_start',array()),
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('p_close',array()),
array('code',array('Test','C', null,
array('enable_line_numbers' => true,
'highlight_lines_extra' => array(1))
)),
array('p_open',array()),
array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
$this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}

function testCodeOptionsArray_StartLineNumbersAt1() {
$this->P->parse('Foo <code C [enable_line_numbers [enable_line_numbers start_line_numbers_at="42"]]>Test</code> Bar');
$calls = array (
array('document_start',array()),
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('p_close',array()),
array('code',array('Test','C', null,
array('enable_line_numbers' => true,
'start_line_numbers_at' => 42)
)),
array('p_open',array()),
array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
$this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}

function testCodeOptionsArray_StartLineNumbersAt2() {
$this->P->parse('Foo <code C [enable_line_numbers [enable_line_numbers start_line_numbers_at]]>Test</code> Bar');
$calls = array (
array('document_start',array()),
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('p_close',array()),
array('code',array('Test','C', null,
array('enable_line_numbers' => true,
'start_line_numbers_at' => 1)
)),
array('p_open',array()),
array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
$this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}

function testCodeOptionsArray_StartLineNumbersAt3() {
$this->P->parse('Foo <code C [enable_line_numbers [enable_line_numbers start_line_numbers_at=""]]>Test</code> Bar');
$calls = array (
array('document_start',array()),
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('p_close',array()),
array('code',array('Test','C', null,
array('enable_line_numbers' => true,
'start_line_numbers_at' => 1)
)),
array('p_open',array()),
array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
$this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}

function testCodeOptionsArray_EnableKeywordLinks1() {
$this->P->parse('Foo <code C [enable_keyword_links="false"]>Test</code> Bar');
$calls = array (
array('document_start',array()),
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('p_close',array()),
array('code',array('Test','C', null,
array('enable_keyword_links' => false)
)),
array('p_open',array()),
array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
$this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}

function testCodeOptionsArray_EnableKeywordLinks2() {
$this->P->parse('Foo <code C [enable_keyword_links="true"]>Test</code> Bar');
$calls = array (
array('document_start',array()),
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('p_close',array()),
array('code',array('Test','C', null,
array('enable_keyword_links' => true)
)),
array('p_open',array()),
array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
$this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}

}

0 comments on commit 0387686

Please sign in to comment.