use strict;

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

require 't/test_utils.pl';

my @test_cases = (
[ 'simple', '@set a-_5b the value @b{b} @c comment

@value{a-_5b} After value.
'],
['not_only_characters',
'@set -e_\'::; hh

Say @value{-e_\'::;}.
'],
['bad_syntax','
@set
@set 
@set ?
@set :-/ hey!
@set a@b
@set :-" bad
@set } no

@clear aaa ggg
@clear and{other

@value{gurgl

@value{unknown}
'],
['spaces_before_value',
'@set var val

@value  {var}
'],
['unknown_value_after_spaces',
'  @value{unknown}  '],
['comment_on_set_line',
'@set x@c
@set y @c
@set z g@c
@set t a vv @comment@ggg

!@value{x}!, !@value{y}!, !@value{z}!, !@value{t}!
'],
['begin_like_comment_on_set_line',
'@set x@come with me
@set y some thing @commentary is it

!@value{x}! !@value{y}!
'],
['comment_on_clear_line',
'@set x
@set y
@set z g
@set t a vv @comment@ggg

@clear x@c
@clear y @c
@clear z g@c
@clear t a vv @comment@ggg

!@value{x}!, !@value{y}!, !@value{z}!, !@value{t}!
'],
['value_zero',
'@set zero 0
Value
@value{zero}'
],
['empty_set',
'@set myspace

1 @value{myspace} 1
'],
['empty_value_in_line',
'@set myspace

1 
@value{myspace} 
1
'],
['set_no_end_of_line',
'@set arg'
],
['clear_no_end_of_line',
'@clear jj',
],
['recursive_expansion_in_set',
'@set V @value{V}
@value{V}
', {'MAX_MACRO_CALL_NESTING' => 100}],
['value_in_node',
'@set node1 Node 1

@node Top, (dir), (dir), (dir)
@top Expansion in Node Names

@menu
* @value{node1}  ::
@end menu

@node @value{node1},, Top, Top
@chapter Chapter 1

@set sec1 Section 1.1

@menu
* @value{sec1}::
@end menu

@node Section 1.1, , Node 1, Node 1

@xref{@value{node1}}.
'],
['value_node_directions',
'@set a--foo bar

@node Top, @value{a--foo}, (dir), (dir)
@top Var @value{a--foo}
@value{a--foo}

@node @value{a--foo}, BarFoo, Top, (dir)
@chapter BarFoo

@node BarFoo, , @value{a--foo}, (dir)
@chapter bar
'],
['value_after_accent',
'@set a_letter a
@ringaccent @value{a_letter}
@~@value{a_letter}'
],
['value_after_brace_command',
'@set bracedletter {a}
@set unknowncmd @unknown

@ringaccent @value{bracedletter}
@ringaccent @value{unknowncmd}
@^ @value{bracedletter}
@^ @value{unknowncmd}
@code @value{bracedletter}
@code @value{unknowncmd}
'],
['value_in_index_commands',
'@set cp cp
@set fn fn
@set syncodeindex_command @syncodeindex

@syncodeindex @value{cp} @value{fn}
@value{syncodeindex_command} cp fn

@set truc truc

definedx truc
@defindex @value{truc}
after

@set trucindex_command @trucindex

@set codeidx codeidx

@defcodeindex @value{codeidx}

@set defcodeindex_entry a @var{index entry} t@\'e @^{@dotless{i}}

@node Top
@node chap

@value{trucindex_command} index truc

@codeidxindex @value{defcodeindex_entry}

@kindex @value{truc} kindex
@pindex pindex @value{codeidx}

value truc
@printindex @value{truc}

value cp
@printindex @value{cp}
'],
['value_in_misc_commands',
'@set text atext

@node Top
@top top @value{text}

@node chap

@subheading Comment like: @value{text}

Text line followed by a comment on the same line and another below @c comment @value{text}
@c comment @value{text}

@set pagesizes_arg 200mm,150mm
@set afourpaper_macro @afourpaper

@ifnottex
@pagesizes @value{pagesizes_arg}
@end ifnottex
@value{afourpaper_macro}
@headings on line following headings @value{text}
@oddfooting some text ignored @value{text}
@everyheading on line following everyheading @value{text}

@set need_arg 0.1

@ifnottex
@need @value{need_arg}
@end ifnottex

@set raisesections_macro @raisesections
@value{raisesections_macro}
@set lowersections_macro @lowersections
@value{lowersections_macro}

@c tex error: Use of \ doesn\'t match its definition.
@ifnottex
@@definfoenclose phoo,//,\\\\  @definfoenclose phoo,//,\\\\

@phoo{bar}
@end ifnottex

@set definfoenclose_name phi
@definfoenclose @value{definfoenclose_name},:,:

@phi{bar}

@set strong_macro @strong
@set strong_name strong

@value{strong_macro}{very strong}

@definfoenclose @value{strong_name},(@value{strong_name}:,:)

@value{strong_macro}{ is it really strong? }

@kbd{something before kbdinputstyle}

@set kbdinputstyle_arg code
@kbdinputstyle @value{kbdinputstyle_arg}

@kbd{truc}

@example
@kbd{example}
@end example

@set asis_arg asis
@set zero 0
@set none_arg none
@set four 4
@set six 6

@paragraphindent @value{asis_arg}
@paragraphindent @value{zero}
@paragraphindent @value{none_arg}
@paragraphindent @value{four}
@firstparagraphindent @value{none_arg}
@exampleindent @value{six}

@set end_arg end
@set separate_arg separate 
@footnotestyle @value{end_arg}
@footnotestyle @value{separate_arg}

@set latin1 ISO-8859-1
@documentencoding @value{latin1}

@set en en
@set documentlanguage_command @documentlanguage

documentlanguage @documentlanguage  @value{en}

documentlanguage on its line
@value{documentlanguage_command}  en
line following documentlanguage

@set on_arg on
@set off_arg off
@frenchspacing @value{on_arg}
@frenchspacing @value{off_arg}

@c accepts 10 or 11
@set ten 10
@fonttextsize @value{ten}

@c accept false or true
@c makeinfo don\'t care about the arg and remove the remaining of the line
@set false_arg false
@set true_arg true
@allowcodebreaks @value{false_arg}

@allowcodebreaks @value{true_arg}

@set page_macro @page
@set noindent_macro @noindent
@set refill_macro @refill

@@page @value{page_macro} @@noindent @value{noindent_macro} @@refill @value{refill_macro} something

@value{noindent_macro}     noindent at beginning of line
@value{noindent_macro}
noindent on the preceding line
  @value{noindent_macro}    noindent after space at beginning of line
@page         page at beginning of line
@page
After page on it\'s own line.

@@page @value{page_macro}   @@noindent @value{noindent_macro}    @@refill @value{refill_macro}

@set contents_macro @contents
@value{contents_macro}

@vskip @value{text}

@set exdent_macro @exdent
@value{exdent_macro} line after exdent

@set two 2
@sp @value{two}

@set result_macro @result

@clickstyle @value{result_macro}

@value{contents_macro}

@set shortcontents_macro @shortcontents
@value{shortcontents_macro}

@set bye_macro @bye

@value{bye_macro}',
{'EXPANDED_FORMATS' => []}
],
['value_in_invalid_documentencoding',
'@set badvalue bad
@documentencoding @value{badvalue}
'],
['set_flag_command_equivalent',
'@set txicodequoteundirected

@value{txicodequoteundirected}.

@clear txicodequoteundirected
'],
['set_on_item_line',
'@table @code
@item @set ca b@c
item text
in item
@item cjj @set cj@c
line
@item cvvv @set cg@c
@end table

@table @code
@item @set a b
item text
in item
@item jj @set j
line
@item vvv @set g
@end table
'],
# very similar with previous test, maybe the difference is that the
# next @item is right after the @item with @set on the line
['set_in_item_missing_line',
'@table @code
@item xx @set n
@item jj
@end table

@table @code
@item cxx @set cn@c
@item jj
@end table
'],
['set_form_feed',
'@set gg  a\\a\\f\\\\
@set hh
@set ll 

@code{@value{gg}. @value{hh}. @value{ll}}.
', {'test_formats' => ['xml']}
],
['ignored_value_definition',
'@set aa outside

@inlinefmt{tex,
@set aa in inlinefmt tex
}

@value{aa}.
'],
['closing_brace_in_value_in_ignored_inline',
'@set closebrace }

@inlinefmt{html,
truc @value{closebrace}
machin

@inlinefmt{tex,
bidule @value{closebrace}
after
'],
);

run_all('value', \@test_cases);
