#--- manual.t -----------------------------------------------------------------
# function: Test HTML::ToC generating a manual.

use strict;
use Test;

BEGIN { plan tests => 1; }

use Data::Dumper;
use File::Find;
use HTML::Toc;
use HTML::TocGenerator;
use HTML::TocInsertor;
use HTML::TocUpdator;


	# Create objects
my $toc          = HTML::Toc->new();
my $tocGenerator = HTML::TocGenerator->new();
my @fileList;


#--- TestSiteMap() ------------------------------------------------------------
# function: Test specifying numbered list.

sub TestSiteMap {
		# Set ToC options
	$toc->setOptions({
		'doLinkToFile'       => 1,
		'templateAnchorName' => '""',
		'templateAnchorHref' => '"<a href=$file"."#".$groupId.$level.">"',
		'doLinkTocToToken'   => 1,
		'tokenToToc'         => [{
			'groupId'         => 'dir',
			'level'           => 1,
			'tokenBegin'      => '<title>',
			'tokenEnd'        => '</title>',
			'fileSpec'        => '\./[^/]+$'
		}, {
			'groupId'         => 'dir',
			'level'           => 2,
			'tokenBegin'      => '<title>',
			'tokenEnd'        => '</title>',
			'fileSpec'        => '\./[^/]+?/[^/]+$'
		}, {
			'groupId'         => 'dir',
			'level'           => 3,
			'tokenBegin'      => '<title>',
			'tokenEnd'        => '</title>',
			'fileSpec'        => '\./[^/]+?/[^/]+?/[^/]+$'
		}]
	});
		# Change current directory
	chdir("t/SiteMap");
		# Find files, filling 'fileList'
	find({wanted => \&WantedSiteMap, no_chdir => 1}, '.');
		# Generate ToC of case-insensitively sorted file list
	$tocGenerator->extendFromFile(
		$toc, [sort {uc($a) cmp uc($b)} @fileList]
	);
		# Restore current directory
	chdir("../..");
		# Test ToC
	ok($toc->format(), <<EOT);

<!-- Table of Contents generated by Perl - HTML::Toc -->
<ul>
   <li><a href=./index.htm#>Main</a>
   <ul>
      <li><a href=./SubDir1/index.htm#>Sub1</a>
      <ul>
         <li><a href=./SubDir1/SubSubDir1/index.htm#>SubSub1</a>
      </ul>
      <li><a href=./SubDir2/index.htm#>Sub2</a>
      <ul>
         <li><a href=./SubDir2/SubSubDir1/index.htm#>SubSub1</a>
         <li><a href=./SubDir2/SubSubDir2/index.htm#>SubSub2</a>
      </ul>
      <li><a href=./SubDir3/index.htm#>Sub3</a>
   </ul>
</ul>
<!-- End of generated Table of Contents -->
EOT
}  # TestSiteMap()


#--- WantedSiteMap() ----------------------------------------------------------
# function: 'Wanted' function, used by File::Find of 'TestSiteMap()'.

sub WantedSiteMap {
		# Add file to 'fileList' if extension matches '.htm'
	push (@fileList, $File::Find::name) if (m/\.htm$/);
} # WantedSiteMap()


	# Test site map
TestSiteMap();
