The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

use strict;
use warnings;

use Test::More tests => 6;
use File::Temp qw/ tempdir /;
use File::Spec;

use HTML::Latemp::GenMakeHelpers;

{
my $finder = HTML::Latemp::GenMakeHelpers->new(
    'hosts' =>
    [
        {
            'id' => "src",
            'source_dir' => "t/sample-data/sample-site-1",
            'dest_dir' => "\$(HELLO)/src",
        },
    ],
);

my $host_outputs = $finder->process_host($finder->hosts()->[0]);

my $file_lists_expected = <<"EOF";
SRC_IMAGES = images/arrow-left-disabled.png images/arrow-left.png images/arrow-right-disabled.png images/arrow-right.png images/arrow-up-disabled.png images/arrow-up.png images/berlios-logo.png images/better-scm-logo.png images/get-firefox.png images/logo-wml.png images/somerights20.png images/valid-css.png images/valid-xhtml10.png images/valid-xhtml11.png print.css style.css subversion/Subversion-Win32-Installation-Guide.txt
SRC_DIRS = alternatives arch docs images irc site-map source subversion
SRC_DOCS = alternatives/index.html arch/index.html docs/index.html docs/nice_trys.html docs/shlomif-evolution.html index.html irc/index.html links.html mailing-list.html site-map/index.html source/index.html subversion/Svn-Win32-Inst-Guide.html subversion/compelling_alternative.html subversion/index.html
SRC_TTMLS =
EOF

my $rules_expected = <<'EOFGALOG';

SRC_SRC_DIR = t/sample-data/sample-site-1

SRC_DEST = $(HELLO)/src

SRC_TARGETS = $(SRC_DEST) $(SRC_DIRS_DEST) $(SRC_COMMON_DIRS_DEST) $(SRC_COMMON_IMAGES_DEST) $(SRC_COMMON_DOCS_DEST) $(SRC_COMMON_TTMLS_DEST) $(SRC_IMAGES_DEST) $(SRC_DOCS_DEST) $(SRC_TTMLS_DEST)

SRC_WML_FLAGS = $(WML_FLAGS) -DLATEMP_SERVER=src

SRC_TTML_FLAGS = $(TTML_FLAGS) -DLATEMP_SERVER=src

SRC_DOCS_DEST = $(patsubst %,$(SRC_DEST)/%,$(SRC_DOCS))

SRC_DIRS_DEST = $(patsubst %,$(SRC_DEST)/%,$(SRC_DIRS))

SRC_IMAGES_DEST = $(patsubst %,$(SRC_DEST)/%,$(SRC_IMAGES))

SRC_TTMLS_DEST = $(patsubst %,$(SRC_DEST)/%,$(SRC_TTMLS))

SRC_COMMON_IMAGES_DEST = $(patsubst %,$(SRC_DEST)/%,$(COMMON_IMAGES))

SRC_COMMON_DIRS_DEST = $(patsubst %,$(SRC_DEST)/%,$(COMMON_DIRS))

SRC_COMMON_TTMLS_DEST = $(patsubst %,$(SRC_DEST)/%,$(COMMON_TTMLS))

SRC_COMMON_DOCS_DEST = $(patsubst %,$(SRC_DEST)/%,$(COMMON_DOCS))

$(SRC_DOCS_DEST) : $(SRC_DEST)/% : $(SRC_SRC_DIR)/%.wml $(DOCS_COMMON_DEPS)
	 WML_LATEMP_PATH="$$(perl -MFile::Spec -e 'print File::Spec->rel2abs(shift)' '$@')" ; ( cd $(SRC_SRC_DIR) && wml -o "$${WML_LATEMP_PATH}" $(SRC_WML_FLAGS) -DLATEMP_FILENAME=$(patsubst $(SRC_DEST)/%,%,$(patsubst %.wml,%,$@)) $(patsubst $(SRC_SRC_DIR)/%,%,$<) )

$(SRC_TTMLS_DEST) : $(SRC_DEST)/% : $(SRC_SRC_DIR)/%.ttml $(TTMLS_COMMON_DEPS)
	ttml -o $@ $(SRC_TTML_FLAGS) -DLATEMP_FILENAME=$(patsubst $(SRC_DEST)/%,%,$(patsubst %.ttml,%,$@)) $<

$(SRC_DIRS_DEST) : $(SRC_DEST)/% :
	mkdir -p $@
	touch $@

$(SRC_IMAGES_DEST) : $(SRC_DEST)/% : $(SRC_SRC_DIR)/%
	cp -f $< $@

$(SRC_COMMON_IMAGES_DEST) : $(SRC_DEST)/% : $(COMMON_SRC_DIR)/%
	cp -f $< $@

$(SRC_COMMON_TTMLS_DEST) : $(SRC_DEST)/% : $(COMMON_SRC_DIR)/%.ttml $(TTMLS_COMMON_DEPS)
	ttml -o $@ $(SRC_TTML_FLAGS) -DLATEMP_FILENAME=$(patsubst $(SRC_DEST)/%,%,$(patsubst %.ttml,%,$@)) $<

$(SRC_COMMON_DOCS_DEST) : $(SRC_DEST)/% : $(COMMON_SRC_DIR)/%.wml $(DOCS_COMMON_DEPS)
	WML_LATEMP_PATH="$$(perl -MFile::Spec -e 'print File::Spec->rel2abs(shift)' '$@')" ; ( cd $(COMMON_SRC_DIR) && wml -o "$${WML_LATEMP_PATH}" $(SRC_WML_FLAGS) -DLATEMP_FILENAME=$(patsubst $(SRC_DEST)/%,%,$(patsubst %.wml,%,$@)) $(patsubst $(COMMON_SRC_DIR)/%,%,$<) )

$(SRC_COMMON_DIRS_DEST)  : $(SRC_DEST)/% :
	mkdir -p $@
	touch $@

$(SRC_DEST):
	mkdir -p $@
	touch $@
EOFGALOG

# TEST
is ($host_outputs->{'file_lists'}, $file_lists_expected, "File Lists");

# TEST
is_deeply ([split(/\n/, $host_outputs->{'rules'}, -1)],
    [split(/\n/, $rules_expected, -1)], "Rules");
}

{
my $finder = HTML::Latemp::GenMakeHelpers->new(
    'hosts' =>
    [
        {
            'id' => "src",
            'source_dir' => "t/sample-data/sample-site-1",
            'dest_dir' => "\$(HELLO)/src",
        },
    ],
    filename_lists_post_filter => sub {
        my ($args) = @_;
        my $filenames = $args->{filenames};
        if ($args->{host} eq 'src' and $args->{bucket} eq 'IMAGES')
        {
            return [ grep { $_ !~ m#arrow-right# } @$filenames ];
        }
        else
        {
            return $filenames;
        }
    },
);

my $host_outputs = $finder->process_host($finder->hosts()->[0]);

my $file_lists_expected = <<"EOF";
SRC_IMAGES = images/arrow-left-disabled.png images/arrow-left.png images/arrow-up-disabled.png images/arrow-up.png images/berlios-logo.png images/better-scm-logo.png images/get-firefox.png images/logo-wml.png images/somerights20.png images/valid-css.png images/valid-xhtml10.png images/valid-xhtml11.png print.css style.css subversion/Subversion-Win32-Installation-Guide.txt
SRC_DIRS = alternatives arch docs images irc site-map source subversion
SRC_DOCS = alternatives/index.html arch/index.html docs/index.html docs/nice_trys.html docs/shlomif-evolution.html index.html irc/index.html links.html mailing-list.html site-map/index.html source/index.html subversion/Svn-Win32-Inst-Guide.html subversion/compelling_alternative.html subversion/index.html
SRC_TTMLS =
EOF

my $rules_expected = <<'EOFGALOG';

SRC_SRC_DIR = t/sample-data/sample-site-1

SRC_DEST = $(HELLO)/src

SRC_TARGETS = $(SRC_DEST) $(SRC_DIRS_DEST) $(SRC_COMMON_DIRS_DEST) $(SRC_COMMON_IMAGES_DEST) $(SRC_COMMON_DOCS_DEST) $(SRC_COMMON_TTMLS_DEST) $(SRC_IMAGES_DEST) $(SRC_DOCS_DEST) $(SRC_TTMLS_DEST)

SRC_WML_FLAGS = $(WML_FLAGS) -DLATEMP_SERVER=src

SRC_TTML_FLAGS = $(TTML_FLAGS) -DLATEMP_SERVER=src

SRC_DOCS_DEST = $(patsubst %,$(SRC_DEST)/%,$(SRC_DOCS))

SRC_DIRS_DEST = $(patsubst %,$(SRC_DEST)/%,$(SRC_DIRS))

SRC_IMAGES_DEST = $(patsubst %,$(SRC_DEST)/%,$(SRC_IMAGES))

SRC_TTMLS_DEST = $(patsubst %,$(SRC_DEST)/%,$(SRC_TTMLS))

SRC_COMMON_IMAGES_DEST = $(patsubst %,$(SRC_DEST)/%,$(COMMON_IMAGES))

SRC_COMMON_DIRS_DEST = $(patsubst %,$(SRC_DEST)/%,$(COMMON_DIRS))

SRC_COMMON_TTMLS_DEST = $(patsubst %,$(SRC_DEST)/%,$(COMMON_TTMLS))

SRC_COMMON_DOCS_DEST = $(patsubst %,$(SRC_DEST)/%,$(COMMON_DOCS))

$(SRC_DOCS_DEST) : $(SRC_DEST)/% : $(SRC_SRC_DIR)/%.wml $(DOCS_COMMON_DEPS)
	 WML_LATEMP_PATH="$$(perl -MFile::Spec -e 'print File::Spec->rel2abs(shift)' '$@')" ; ( cd $(SRC_SRC_DIR) && wml -o "$${WML_LATEMP_PATH}" $(SRC_WML_FLAGS) -DLATEMP_FILENAME=$(patsubst $(SRC_DEST)/%,%,$(patsubst %.wml,%,$@)) $(patsubst $(SRC_SRC_DIR)/%,%,$<) )

$(SRC_TTMLS_DEST) : $(SRC_DEST)/% : $(SRC_SRC_DIR)/%.ttml $(TTMLS_COMMON_DEPS)
	ttml -o $@ $(SRC_TTML_FLAGS) -DLATEMP_FILENAME=$(patsubst $(SRC_DEST)/%,%,$(patsubst %.ttml,%,$@)) $<

$(SRC_DIRS_DEST) : $(SRC_DEST)/% :
	mkdir -p $@
	touch $@

$(SRC_IMAGES_DEST) : $(SRC_DEST)/% : $(SRC_SRC_DIR)/%
	cp -f $< $@

$(SRC_COMMON_IMAGES_DEST) : $(SRC_DEST)/% : $(COMMON_SRC_DIR)/%
	cp -f $< $@

$(SRC_COMMON_TTMLS_DEST) : $(SRC_DEST)/% : $(COMMON_SRC_DIR)/%.ttml $(TTMLS_COMMON_DEPS)
	ttml -o $@ $(SRC_TTML_FLAGS) -DLATEMP_FILENAME=$(patsubst $(SRC_DEST)/%,%,$(patsubst %.ttml,%,$@)) $<

$(SRC_COMMON_DOCS_DEST) : $(SRC_DEST)/% : $(COMMON_SRC_DIR)/%.wml $(DOCS_COMMON_DEPS)
	WML_LATEMP_PATH="$$(perl -MFile::Spec -e 'print File::Spec->rel2abs(shift)' '$@')" ; ( cd $(COMMON_SRC_DIR) && wml -o "$${WML_LATEMP_PATH}" $(SRC_WML_FLAGS) -DLATEMP_FILENAME=$(patsubst $(SRC_DEST)/%,%,$(patsubst %.wml,%,$@)) $(patsubst $(COMMON_SRC_DIR)/%,%,$<) )

$(SRC_COMMON_DIRS_DEST)  : $(SRC_DEST)/% :
	mkdir -p $@
	touch $@

$(SRC_DEST):
	mkdir -p $@
	touch $@
EOFGALOG

# TEST
is ($host_outputs->{'file_lists'}, $file_lists_expected, "File Lists");

# TEST
is_deeply ([split(/\n/, $host_outputs->{'rules'}, -1)],
    [split(/\n/, $rules_expected, -1)], "Rules");
}
{
    my $DIR = tempdir( CLEANUP => 1);
    my $finder = HTML::Latemp::GenMakeHelpers->new(
        'hosts' =>
        [
            {
                'id' => "common",
                'source_dir' => "t/sample-data/common-1",
                'dest_dir' => "\$(HELLO)/src",
            },
            {
                'id' => "src",
                'source_dir' => "t/sample-data/sample-site-1",
                'dest_dir' => "\$(HELLO)/src",
            },
        ],
        out_dir => $DIR,
    );
    $finder->process_all();

    # TEST
    ok (scalar (-f File::Spec->catfile($DIR, "include.mak")), "include.mak was written.");
    # TEST
    ok (scalar (-f File::Spec->catfile($DIR, "rules.mak")), "rules.mak was written.");
}