#--- format.t -----------------------------------------------------------------
# function: Test ToC formatting.

use strict;
use Test;

BEGIN { plan tests => 6; }

use HTML::Toc;
use HTML::TocGenerator;
use HTML::TocInsertor;

my ($output, $content, $filename);
my $toc          = HTML::Toc->new;
my $tocGenerator = HTML::TocGenerator->new;
my $tocInsertor  = HTML::TocInsertor->new;

$toc->setOptions({
	'doLinkToToken'  => 0,
	'levelIndent'       => 0,
	'insertionPoint'    => 'before <h1>',
	'header'            => '',
	'footer'            => '',
});


BEGIN {
		# Create test file
	$filename = "file$$.htm";
	die "$filename is already there" if -e $filename;
	open(FILE, ">$filename") || die "Can't create $filename: $!";
	print FILE <<'EOT'; close(FILE);
<h1>Header</h1>
EOT
}


END {
		# Remove test file
	unlink($filename) or warn "Can't unlink $filename: $!";
}


#--- 1. templateLevelBegin ----------------------------------------------------

$toc->setOptions({
	'templateLevelBegin' => '"<ul class=toc_$groupId$level>\n"'
});
$tocInsertor->insert($toc, "<h1>Header</h1>", {'output' => \$output});
ok($output, "<ul class=toc_h1>\n<li>Header\n</ul><h1>Header</h1>");
$toc->setOptions({'templateLevelBegin' => undef});


#--- 2. levelToToc -----------------------------------------------------------

$tocGenerator->generate($toc, "<h1>Header1</h1>\n<h2>Header2</h2>");
$toc->setOptions({'levelToToc' => '1'});
ok($toc->format(), "<ul>\n<li>Header1\n</ul>");
$toc->setOptions({'levelToToc' => '.*'});


#--- 3. groupToToc -----------------------------------------------------------

$toc->setOptions({
	'tokenToToc' => [{
		'level' => 1,
		'tokenBegin' => '<h1 class=-foo>'
	}, {
		'groupId' => 'foo',
		'level' => 1,
		'tokenBegin' => '<h1 class=foo>'
	}]
});
$tocGenerator->generate($toc, "<h1>Header1</h1>\n<h1 class=foo>Foo</h1>");
$toc->setOptions({'groupToToc' => 'foo'});
ok($toc->format(), "<ul>\n<li>Foo\n</ul>");
$toc->setOptions({'groupToToc' => '.*'});


#--- 4. header & footer -------------------------------------------------------

$toc->setOptions({
	'tokenToToc' => [{
		'level'      => 1,
		'tokenBegin' => '<h1>'
	}],
	'header' => '<!-- TocHeader -->',
	'footer' => '<!-- TocFooter -->',
});
$tocInsertor->insert($toc, "<h1>Header1</h1>", {'output' => \$output});
ok("$output\n", <<EOT);
<!-- TocHeader --><ul>
<li>Header1
</ul><!-- TocFooter --><h1>Header1</h1>
EOT


	# Test 'doSingleStepLevel' => 1
TestSingleStepLevel1();
	# Test 'doSingleStepLevel' => 0
TestSingleStepLevel0();


#--- 5. TestSingleStepLevel1 --------------------------------------------------

sub TestSingleStepLevel1 {
	my $toc          = new HTML::Toc;
	my $tocGenerator = new HTML::TocGenerator;
	
		# Generate ToC
	$tocGenerator->generate($toc, <<EOT);
<h1>Header 1</h1>
<h3>Header 3</h3>
EOT
		# Compare output
	ok($toc->format(), <<EOT);

<!-- Table of Contents generated by Perl - HTML::Toc -->
<ul>
   <li><a href=#h-1>Header 1</a>
   <ul>
      <ul>
         <li><a href=#h-1.0.1>Header 3</a>
      </ul>
   </ul>
</ul>
<!-- End of generated Table of Contents -->
EOT
}  # TestSingleStepLevel1()


#--- 6. TestSingleStepLevel0 --------------------------------------------------

sub TestSingleStepLevel0 {
	my $toc          = new HTML::Toc;
	my $tocGenerator = new HTML::TocGenerator;
	
		# Set ToC options
	$toc->setOptions({'doSingleStepLevel' => 0});
		# Generate ToC
	$tocGenerator->generate($toc, <<EOT);
<h1>Header 1</h1>
<h3>Header 3</h3>
EOT
	 	# Compare output
	ok($toc->format(), <<EOT);

<!-- Table of Contents generated by Perl - HTML::Toc -->
<ul>
   <li><a href=#h-1>Header 1</a>
   <ul>
      <li><a href=#h-1.0.1>Header 3</a>
   </ul>
</ul>
<!-- End of generated Table of Contents -->
EOT
}  # TestSingleStepLevel0()
