use strict;

use lib '.';
use Texinfo::ModulePath (undef, undef, undef, 'updirs' => 2);

use Test::More;

BEGIN { plan tests => 6; }

use Texinfo::Transformations;
use Texinfo::Parser qw(parse_texi_text);
use Texinfo::Convert::Texinfo;
use Texinfo::Document;

ok(1, "modules loading");

sub test_correction($$$;$)
{
  my $in = shift;
  my $out = shift;
  my $name = shift;
  # if set, test _correct_level instead of fill_gaps_in_sectioning
  my $test_correct_level = shift;

  my $document = parse_texi_text(undef, $in);
  my $tree = $document->tree();

  if (! defined($test_correct_level)) {
    Texinfo::Transformations::fill_gaps_in_sectioning($tree);
  } else {
    # If set to 0, undef to mimic not giving the argument
    $test_correct_level = undef if (!$test_correct_level);
    # the sectioning command is always $tree->{'contents'}->[1], while
    # $tree->{'contents'}->[0] is the before_sections container,
    # which contains the raise/lowersections that modify the
    # sectioning command.
    # Add the level corrections corresponding to the sectioning command
    # to before_sections.
    Texinfo::Transformations::_correct_level($tree->{'contents'}->[1],
                                             $tree->{'contents'}->[0],
                                             $test_correct_level);
  }

  # rebuild the tree
  $tree = $document->tree();
  {
  local $Data::Dumper::Purity = 1;
  #local $Data::Dumper::Maxdepth = 2;
  local $Data::Dumper::Indent = 1;
  #print STDERR Data::Dumper->Dump([$tree]);
  }

  my $texi_result
   = Texinfo::Convert::Texinfo::convert_to_texinfo($tree);
  if (!defined($out)) {
    print STDERR " --> $name:\n$texi_result";
  } else {
    is($texi_result, $out, $name);
  }
}

my $with_XS = ((not defined($ENV{TEXINFO_XS})
                or $ENV{TEXINFO_XS} ne 'omit')
               and (!defined $ENV{TEXINFO_XS_PARSER}
                    or $ENV{TEXINFO_XS_PARSER} eq '1'));


SKIP:
{
  skip "test perl not XS", 2 if ($with_XS);

test_correction('@raisesections

@section truc
', '@raisesections

@lowersections
@section truc
', 'correct level one raised section', 0);

# With -1, the commands added go from the normal level to the modified level
# of the chapter.  It is therefore the same commands as the commands setting
# the chapter level that are added.
test_correction('@lowersections
@lowersections

@chapter truc
', '@lowersections
@lowersections

@lowersections
@lowersections
@chapter truc
', 'correct level from normal to section, two lowered', -1);
}

test_correction('@chapter chap
@subsection sub
','@chapter chap
@unnumberedsec @asis{}

@subsection sub
', 'simple completed tree');

my $raisesections_lowersection_no_correction_text = '@raisesections
@section sec
@lowersections
@lowersections
@chapter chap
';
test_correction($raisesections_lowersection_no_correction_text,
  $raisesections_lowersection_no_correction_text,
  'raisesections and lowersections, no correction');

test_correction('@raisesections
@section sec
@lowersections
@lowersections
@lowersections
@chapter chap
', '@raisesections
@section sec
@lowersections
@lowersections
@lowersections
@raisesections
@raisesections
@unnumberedsec @asis{}

@lowersections
@lowersections
@chapter chap
', 'raisesections lowersections with correction');
