more storyline handling stuff

This commit is contained in:
John Bintz 2009-11-05 22:29:29 -05:00
parent 55950e3a0a
commit 3fda650af7
2 changed files with 163 additions and 19 deletions

View File

@ -5,6 +5,7 @@ require_once('ComicPressDBInterface.inc');
class ComicPressStoryline { class ComicPressStoryline {
var $_structure, $root_category; var $_structure, $root_category;
var $_category_search;
function read_from_options() { function read_from_options() {
$this->create_structure($this->get_flattened_storyline()); $this->create_structure($this->get_flattened_storyline());
@ -78,6 +79,8 @@ class ComicPressStoryline {
$leaf = end($parts); $leaf = end($parts);
$all_leaves[] = $leaf; $all_leaves[] = $leaf;
$data['level'] = count($parts) - 1;
if (count($parts) > 2) { if (count($parts) > 2) {
$parent = $parts[count($parts) - 2]; $parent = $parts[count($parts) - 2];
@ -351,6 +354,65 @@ class ComicPressStoryline {
} }
return $output; return $output;
} }
function &include_all() {
$this->_category_search = array_keys($this->_structure);
return $this;
}
function &exclude_all() {
$this->_category_search = array();
return $this;
}
function _find_children($parent) {
$children = array($parent);
do {
$found_children = false;
foreach ($this->_structure as $category_id => $info) {
if (!in_array($category_id, $children)) {
if (in_array($info['parent'], $children)) {
$children[] = $category_id;
$found_children = true;
}
}
}
} while ($found_children);
return $children;
}
function &include_children($parent = null) {
$this->_category_search = array_unique(array_merge($this->_category_search, $this->_find_children($parent)));
sort($this->_category_search);
return $this;
}
function &exclude_children($parent = null) {
$this->_category_search = array_diff($this->_category_search, $this->_find_children($parent));
sort($this->_category_search);
return $this;
}
function _find_level_or_above($level = null) {
$found = array();
foreach ($this->_structure as $category_id => $info) {
if ($info['level'] <= $level) { $found[] = $category_id; }
}
return $found;
}
function &include_level_or_above($level = null) {
$this->_category_search = array_unique(array_merge($this->_category_search, $this->_find_level_or_above($level)));
sort($this->_category_search);
return $this;
}
function &exclude_level_or_above($level = null) {
$this->_category_search = array_diff($this->_category_search, $this->_find_level_or_above($level));
sort($this->_category_search);
return $this;
}
} }
?> ?>

View File

@ -35,46 +35,46 @@ class ComicPressStorylineTest extends PHPUnit_Framework_TestCase {
), ),
array( array(
array('0/1'), array('0/1'),
array('1' => array()), array('1' => array('level' => 1)),
1 1
), ),
array( array(
array('0/1', '0/1/2'), array('0/1', '0/1/2'),
array('1' => array('next' => 2), '2' => array('parent' => 1, 'previous' => 1)), array('1' => array('next' => 2, 'level' => 1), '2' => array('parent' => 1, 'previous' => 1, 'level' => 2)),
1 1
), ),
array( array(
array('0/1', '0/1/2', '0/1/3'), array('0/1', '0/1/2', '0/1/3'),
array( array(
'1' => array('next' => 2), '1' => array('next' => 2, 'level' => 1),
'2' => array('parent' => 1, 'previous' => 1, 'next' => 3), '2' => array('parent' => 1, 'previous' => 1, 'next' => 3, 'level' => 2),
'3' => array('parent' => 1, 'previous' => 2), '3' => array('parent' => 1, 'previous' => 2, 'level' => 2),
), ),
1 1
), ),
array( array(
array('0/1', '0/1/2', '0/1/2/3', '0/1/2/4', '0/1/5'), array('0/1', '0/1/2', '0/1/2/3', '0/1/2/4', '0/1/5'),
array( array(
'1' => array('next' => 2), '1' => array('next' => 2, 'level' => 1),
'2' => array('parent' => 1, 'next' => 3, 'previous' => 1), '2' => array('parent' => 1, 'next' => 3, 'previous' => 1, 'level' => 2),
'3' => array('parent' => 2, 'next' => 4, 'previous' => 2), '3' => array('parent' => 2, 'next' => 4, 'previous' => 2, 'level' => 3),
'4' => array('parent' => 2, 'next' => 5, 'previous' => 3), '4' => array('parent' => 2, 'next' => 5, 'previous' => 3, 'level' => 3),
'5' => array('parent' => 1, 'previous' => 4), '5' => array('parent' => 1, 'previous' => 4, 'level' => 2),
), ),
1 1
), ),
array( array(
array('0/1', '0/1/2', '0/1/2/3', '0/1/2/4', '0/1/5', '0/1/5/6', '0/1/5/7', '0/1/5/8', '0/1/9'), array('0/1', '0/1/2', '0/1/2/3', '0/1/2/4', '0/1/5', '0/1/5/6', '0/1/5/7', '0/1/5/8', '0/1/9'),
array( array(
'1' => array('next' => 2), '1' => array('next' => 2, 'level' => 1),
'2' => array('parent' => 1, 'next' => 3, 'previous' => 1), '2' => array('parent' => 1, 'next' => 3, 'previous' => 1, 'level' => 2),
'3' => array('parent' => 2, 'next' => 4, 'previous' => 2), '3' => array('parent' => 2, 'next' => 4, 'previous' => 2, 'level' => 3),
'4' => array('parent' => 2, 'next' => 5, 'previous' => 3), '4' => array('parent' => 2, 'next' => 5, 'previous' => 3, 'level' => 3),
'5' => array('parent' => 1, 'next' => 6, 'previous' => 4), '5' => array('parent' => 1, 'next' => 6, 'previous' => 4, 'level' => 2),
'6' => array('parent' => 5, 'next' => 7, 'previous' => 5), '6' => array('parent' => 5, 'next' => 7, 'previous' => 5, 'level' => 3),
'7' => array('parent' => 5, 'next' => 8, 'previous' => 6), '7' => array('parent' => 5, 'next' => 8, 'previous' => 6, 'level' => 3),
'8' => array('parent' => 5, 'next' => 9, 'previous' => 7), '8' => array('parent' => 5, 'next' => 9, 'previous' => 7, 'level' => 3),
'9' => array('parent' => 1, 'previous' => 8), '9' => array('parent' => 1, 'previous' => 8, 'level' => 2),
), ),
1 1
), ),
@ -311,6 +311,88 @@ class ComicPressStorylineTest extends PHPUnit_Framework_TestCase {
$this->assertEquals($expected_result, $this->css->_length_sort($data)); $this->assertEquals($expected_result, $this->css->_length_sort($data));
} }
function testIncludeAll() {
$this->css->_structure = array(
'1' => array('next' => 2),
'2' => array('parent' => 1, 'previous' => 1, 'next' => 3),
'3' => array('parent' => 2, 'next' => 4, 'previous' => 2),
'4' => array('parent' => 2, 'previous' => 3)
);
$this->assertEquals($this->css, $this->css->include_all());
$this->assertEquals(array(1,2,3,4), $this->css->_category_search);
}
function testExcludeAll() {
$this->css->_category_search = array(1,2,3,4);
$this->assertEquals($this->css, $this->css->exclude_all());
$this->assertEquals(array(), $this->css->_category_search);
}
function testFindChildren() {
$this->css->_structure = array(
'1' => array('next' => 2),
'2' => array('parent' => 1, 'previous' => 1, 'next' => 3),
'3' => array('parent' => 2, 'next' => 4, 'previous' => 2),
'4' => array('parent' => 2, 'previous' => 3)
);
$this->assertEquals(array(2,3,4), $this->css->_find_children(2));
}
function testIncludeChildren() {
$css = $this->getMock('ComicPressStoryline', array('_find_children'));
$css->expects($this->once())->method('_find_children')->will($this->returnValue(array(2,3,4)));
$css->_category_search = array(4,5);
$css->include_children(2);
$this->assertEquals(array(2,3,4,5), $css->_category_search);
}
function testExcludeChildren() {
$css = $this->getMock('ComicPressStoryline', array('_find_children'));
$css->expects($this->once())->method('_find_children')->will($this->returnValue(array(2,3,4)));
$css->_category_search = array(4, 5, 6);
$css->exclude_children(2);
$this->assertEquals(array(5, 6), $css->_category_search);
}
function testFindLevelOrAbove() {
$this->css->_structure = array(
'1' => array('next' => 2, 'level' => 1),
'2' => array('parent' => 1, 'previous' => 1, 'next' => 3, 'level' => 2),
'3' => array('parent' => 2, 'next' => 4, 'previous' => 2, 'level' => 3),
'4' => array('parent' => 2, 'previous' => 3, 'level' => 3)
);
$this->assertEquals(array(1, 2), $this->css->_find_level_or_above(2));
}
function testIncludeLevelOrAbove() {
$css = $this->getMock('ComicPressStoryline', array('_find_level_or_above'));
$css->expects($this->once())->method('_find_level_or_above')->will($this->returnValue(array(2,3,4)));
$css->_category_search = array(4,5);
$css->include_level_or_above(2);
$this->assertEquals(array(2,3,4,5), $css->_category_search);
}
function testExcludeLevelOrAbove() {
$css = $this->getMock('ComicPressStoryline', array('_find_level_or_above'));
$css->expects($this->once())->method('_find_level_or_above')->will($this->returnValue(array(2,3,4)));
$css->_category_search = array(4, 5, 6);
$css->exclude_level_or_above(2);
$this->assertEquals(array(5, 6), $css->_category_search);
}
} }
?> ?>