# Before `make install' is performed this script should be runnable with
# `make test'. After `make install' it should work as `perl test.pl'
#########################

# change 'tests => 1' to 'tests => last_test_to_print';

sub result {
    my($i, $state) = @_;
    if ($state) {
	print "ok $i\n";
    } else {
	print "ng $i\n";
	exit $i;
    }
}

sub sortFunc {
    my($a, $b) = @_;
    my($va, $vb);

    $va = $a->objValue();
    $vb = $b->objValue();
    return $va <=> $vb;
}

use Test;
BEGIN { plan tests => 13 };
use ClearSilver;
ok(1); # If we made it this far, we're ok.

$testnum = 2;
#
# test new()
#
$hdf = ClearSilver::HDF->new();
$hdf ? result($testnum, 1) : result($testnum, 0);
$testnum++;

#
# test reading file
#
$ret = $hdf->readFile("test.hdf");
$ret ? result($testnum, 1) : result($testnum, 0);
$testnum++;

#
# test getObj() 
#
$lev2_node = $hdf->getObj("TopNode.2nd1");
$lev2_node ? result($testnum, 1) : result($testnum, 0);
$testnum++;


#
# test objName()
#
$lev2_name = $lev2_node->objName();
($lev2_name eq "2nd1") ? result($testnum, 1) : result($testnum, 0);
$testnum++;

#
# test objChild() & objValue()
# 
$lev3_node = $lev2_node->objChild();
if (!$lev3_node) {
    result($testnum, 0);
}
$val = $lev3_node->objValue();
($val eq "value1") ?  result($testnum, 1) : result($testnum, 0);
$testnum++;

#
# test objNext()
#
$next_node = $lev3_node->objNext();
if (!$lev3_node) {
    result($testnum, 0);
}
$nam = $next_node->objName();
($nam eq "Entry2") ? result($testnum, 1) : result($testnum, 0); 
$testnum++;

#
# test getChild()
#
$lev2_node = $hdf->getChild("TopNode.2nd1");
$lev2_node ? result($testnum, 1) : result($testnum, 0); 
$testnum++;

#
# test setValue() & getValue()
#
$hdf->setValue("Data.1", "Value1");
$str = $hdf->getValue("Data.1", "default");
($str eq "Value1") ? result($testnum, 1) : result($testnum, 0); 
$testnum++;

$str = $hdf->getValue("Data.2", "default"); # doesn't exist
($str eq "default") ? result($testnum, 1) : result($testnum, 0);     
$testnum++;

#
# test copy tree
# 
$copy = ClearSilver::HDF->new();
$ret = $copy->copy("", $hdf);
$ret ? result($testnum, 0) : result($testnum, 1);
$testnum++;
$str = $copy->getValue("Data.1", "default");
print $str
($str eq "Value1") ? result($testnum, 1) : result($testnum, 0);     
$testnum++;
  
#
# test setSymlink()
#
$ret = $copy->setSymlink( "BottomNode" ,"TopNode");
$ret ? result($testnum, 1) : result($testnum, 0);
$testnum++;
$tmp = $copy->getObj("BottomNode.2nd1");
$tmp ? result($testnum, 1) : result($testnum, 0);
$testnum++;

#
# test removeTree()
#
$ret = $copy->removeTree("TopNode");
$ret ? result($testnum, 1) : result($testnum, 0);
$testnum++;
$tmp = $copy->getObj("TopNode.2nd1");
$tmp ? result($testnum, 0) : result($testnum, 1);
$testnum++;

#
# test sortObj()
#
$sort_top = $hdf->getObj("Sort.Data");
$sort_top->sortObj("sortFunc");
$child = $sort_top->objChild();
$name = $child->objName();
($name eq "entry3") ? result($testnum, 1) : result($testnum, 0); 
$testnum++;


#
# test CS
#
$cs = ClearSilver::CS->new($hdf);
$cs ? result($testnum, 1) : result($testnum, 0);
$testnum++;

#
# parseString() and render()
#
$ret = $cs->parseString("<?cs var:TopNode.2nd1.Entry3 ?>");
if (!$ret) {
    result($testnum, 0);
}
$ret = $cs->render();
($ret eq "value3") ? result($testnum, 1) : result($testnum, 0);
$testnum++;

#
# parseFile()
#
$ret = $cs->parseFile("test.cs");
if (!$ret) {
    result($testnum, 0);
}
$ret = $cs->render();
open(FH, "> test.out");
print FH $ret;
close(FH);
$ret = system("diff test.gold test.out > /dev/null");
$ret ? result($testnum, 0) : result($testnum, 1);