$test->fromArray($source);
$t->is(get_class($test['Child 4']), 'ioMenuItemTest', 'The child menus correctly use their menu class.');
$t->info('    e) Test ::createFromArray().');
$source['class'] = 'ioMenu';
$newMenu = ioMenuItem::createFromArray($source);
$t->is(get_class($newMenu), 'ioMenu', 'The new menu is created with the correct class.');
$t->is($newMenu->getName(), 'Parent 2', 'The new menu has the correct name.');
$t->is(get_class($newMenu['Child 4']), 'ioMenuItemTest', 'The child menus correctly use their menu class.');
// reset some settings
$menu['Parent 2']->isCurrent(false);
$menu['Parent 2']->setAttribute('class', null);
$t->info('8 - Test the render() method.');
check_test_tree($t, $menu);
print_test_tree($t);
$t->info('### Set the menu to compressed format. Functional tests asserts with uncompressed.');
ioMenuItem::$renderCompressed = true;
$t->info('  8.1 - Render the menu in a few basic ways');
$rendered = '<ul class="root"><li class="first">Parent 1<ul class="menu_level_1"><li class="first">Child 1</li><li>Child 2</li><li class="last">Child 3</li></ul></li><li class="last">Parent 2<ul class="menu_level_1"><li class="first last">Child 4<ul class="menu_level_2"><li class="first last">Grandchild 1</li></ul></li></ul></li></ul>';
$t->is($menu->render(), $rendered, 'The full menu renders correctly.');
$t->is((string) $menu, $rendered, 'The __toString() method renders correctly.');
$t->info('  8.2 - Set a title and class on pt2, and see that it renders.');
$pt2->setAttribute('class', 'parent2_class');
$pt2->setAttribute('title', 'parent2 title');
$rendered = '<ul class="root"><li class="first">Parent 1<ul class="menu_level_1"><li class="first">Child 1</li><li>Child 2</li><li class="last">Child 3</li></ul></li><li class="parent2_class last" title="parent2 title">Parent 2<ul class="menu_level_1"><li class="first last">Child 4<ul class="menu_level_2"><li class="first last">Grandchild 1</li></ul></li></ul></li></ul>';
$t->is($menu->render(), $rendered, 'The menu renders with the title and class attributes.');
$t->info('  8.3 - Set ch2 menu as current, look for "current" and "current_ancestor" classes.');
$ch2->isCurrent(true);
$rendered = '<ul class="root"><li class="current_ancestor first">Parent 1<ul class="menu_level_1"><li class="first">Child 1</li><li class="current">Child 2</li><li class="last">Child 3</li></ul></li><li class="parent2_class last" title="parent2 title">Parent 2<ul class="menu_level_1"><li class="first last">Child 4<ul class="menu_level_2"><li class="first last">Grandchild 1</li></ul></li></ul></li></ul>';
$t->is($menu->render(), $rendered, 'The menu renders with the current and current_ancestor classes.');
$t->info('  8.4 - Make ch4 hidden due to not having proper credentials');
$ch4->requiresAuth(true);