#!/usr/bin/perl
my
$ms
;
my
(
$out
,
$err
,
@res
);
use_ok
'Text::MacroScript'
;
require_ok
't/mytests.pl'
;
sub
void(&) {
$_
[0]->(); () }
$ms
= new_ok(
'Text::MacroScript'
=> [
-variable
=> [
[
N1
=> 1 ],
[
N2
=> 2 ],
],
-script
=> [
[
ADD
=>
'#0+#1'
],
]]);
$ms
->define(
-script
=>
"ADD1"
=>
"#0+1"
);
$ms
->define_script(
"ADD2"
,
"#0+2"
);
is
$ms
->expand(
'%DEFINE_SCRIPT ADD3[#0+3]'
),
""
;
diag
'Issue #41: Macro/script arguments do not nest'
;
is
$ms
->expand(
"ADD[1|2] ADD1[3] ADD2[4] ADD3[5]"
),
"3 4 6 8"
;
$ms
->define_variable(
N3
=> 3 );
$ms
->define(
-script
=>
SUM
=>
'my $s=0;for(@Param){$s+=$_};$s'
);
is
$ms
->expand(
"N1 #N1 N2 #N2 N3 #N3"
),
"N1 #N1 N2 #N2 N3 #N3"
;
is
$ms
->expand(
"%DEFINE_SCRIPT SHOW\n"
),
""
;
is
$ms
->expand(
"join(',', \@Param, #N1||0, #N2||0, #N3||0, "
.
"\$Var{N1}||0, \$Var{N2}||0, \$Var{N3}||0 )\n"
),
""
;
is
$ms
->expand(
"%END_DEFINE\n"
),
""
;
is
$ms
->expand(
"SHOW\n"
),
"1,2,3,1,2,3\n"
;
is
$ms
->expand(
"SHOW[4]\n"
),
"4,1,2,3,1,2,3\n"
;
is
$ms
->expand(
"SHOW[4|5]\n"
),
"4,5,1,2,3,1,2,3\n"
;
$ms
->undefine_variable(
"N3"
);
is
$ms
->expand(
"SHOW\n"
),
"1,2,0,1,2,0\n"
;
is
$ms
->expand(
"%UNDEFINE_VARIABLE N2"
),
""
;
is
$ms
->expand(
"SHOW\n"
),
"1,0,0,1,0,0\n"
;
is
$ms
->expand(
"%DEFINE_VARIABLE N2[2]"
),
""
;
is
$ms
->expand(
"%DEFINE_VARIABLE N3[3]"
),
""
;
is
$ms
->expand(
"SHOW\n"
),
"1,2,3,1,2,3\n"
;
is
$ms
->expand(
"%UNDEFINE_ALL_VARIABLE"
),
""
;
is
$ms
->expand(
"SHOW\n"
),
"0,0,0,0,0,0\n"
;
$ms
->define_variable(
N1
=> 4 );
$ms
->define_variable(
N2
=> 5 );
$ms
->define_variable(
N3
=> 6 );
is
$ms
->expand(
"SHOW\n"
),
"4,5,6,4,5,6\n"
;
$ms
->undefine_all(-variable);
is
$ms
->expand(
"SHOW\n"
),
"0,0,0,0,0,0\n"
;
is
$ms
->expand(
"ADD[1|2] ADD1[3] ADD2[4] ADD3[5]"
),
"3 4 6 8"
;
$ms
->undefine(
-script
=>
"ADD"
);
$ms
->undefine(
-script
=>
"ADD1"
);
$ms
->undefine_script(
"ADD2"
);
is
$ms
->expand(
'%UNDEFINE_SCRIPT ADD3'
),
""
;
is
$ms
->expand(
"ADD[1|2] ADD1[3] ADD2[4] ADD3[5]"
),
"ADD[1|2] ADD1[3] ADD2[4] ADD3[5]"
;
diag
'Issue #5: Syntax SUM[] should be accepted to call script without parameters'
;
is
$ms
->expand(
"SUM"
),
"0"
;
is
$ms
->expand(
"SUM[1]"
),
"1"
;
is
$ms
->expand(
"SUM[1|2]"
),
"3"
;
is
$ms
->expand(
"SUM[1|2|3]"
),
"6"
;
is
$ms
->expand(
"%UNDEFINE_SCRIPT SUM\n"
),
""
;
is
$ms
->expand(
"SUM"
),
"SUM"
;
$ms
->define(
-script
=>
S1
=> 1);
$ms
->define(
-script
=>
S2
=> 2);
$ms
->define(
-script
=>
S3
=> 3);
is
$ms
->expand(
"S1S2S3"
),
"123"
;
$ms
->undefine_all(
'-script'
);
is
$ms
->expand(
"S1S2S3"
),
"S1S2S3"
;
$ms
->define(
-script
=>
S1
=> 1);
$ms
->define(
-script
=>
S2
=> 2);
$ms
->define(
-script
=>
S3
=> 3);
is
$ms
->expand(
"S1S2S3"
),
"123"
;
is
$ms
->expand(
"%UNDEFINE_ALL_SCRIPT\n"
),
""
;
is
$ms
->expand(
"S1S2S3"
),
"S1S2S3"
;
$ms
= new_ok(
'Text::MacroScript'
=> [
-script
=> [
[
N1
=> 1 ],
[
N2
=> 2 ],
]]);
my
@output
;
@output
=
$ms
->list(-script, -namesonly);
is_deeply \
@output
, [
"%DEFINE_SCRIPT N1"
,
"%DEFINE_SCRIPT N2"
];
@output
=
$ms
->list(-script);
is_deeply \
@output
, [
"%DEFINE_SCRIPT N1 [1]\n"
,
"%DEFINE_SCRIPT N2 [2]\n"
];
(
$out
,
$err
,
@res
) = capture { void {
$ms
->list(-script, -namesonly); } };
eq_or_diff
$out
,
"%DEFINE_SCRIPT N1\n"
.
"%DEFINE_SCRIPT N2\n"
;
is
$err
,
""
;
is_deeply \
@res
, [];
(
$out
,
$err
,
@res
) = capture { void {
$ms
->list(-script); } };
eq_or_diff
$out
,
"%DEFINE_SCRIPT N1 [1]\n\n"
.
"%DEFINE_SCRIPT N2 [2]\n\n"
;
is
$err
,
""
;
is_deeply \
@res
, [];
@output
=
$ms
->list_script(-namesonly);
is_deeply \
@output
, [
"%DEFINE_SCRIPT N1"
,
"%DEFINE_SCRIPT N2"
];
@output
=
$ms
->list_script();
is_deeply \
@output
, [
"%DEFINE_SCRIPT N1 [1]\n"
,
"%DEFINE_SCRIPT N2 [2]\n"
];
(
$out
,
$err
,
@res
) = capture { void {
$ms
->list_script(-namesonly); } };
eq_or_diff
$out
,
"%DEFINE_SCRIPT N1\n"
.
"%DEFINE_SCRIPT N2\n"
;
is
$err
,
""
;
is_deeply \
@res
, [];
(
$out
,
$err
,
@res
) = capture { void {
$ms
->list_script(); } };
eq_or_diff
$out
,
"%DEFINE_SCRIPT N1 [1]\n\n"
.
"%DEFINE_SCRIPT N2 [2]\n\n"
;
is
$err
,
""
;
is_deeply \
@res
, [];
for
(1..3) {
$ms
->define_script(
"N$_"
,
$_
);
}
is
$ms
->expand(
"N1N2N3"
),
"123"
;
$ms
->undefine_all(-script);
is
$ms
->expand(
"N1N2N3"
),
"N1N2N3"
;
for
(1..3) {
$ms
->define_script(
"N$_"
,
$_
);
}
is
$ms
->expand(
"N1N2N3"
),
"123"
;
$ms
->undefine_all_script;
is
$ms
->expand(
"N1N2N3"
),
"N1N2N3"
;
for
(1..3) {
$ms
->define_script(
"N$_"
,
$_
);
}
is
$ms
->expand(
"N1N2N3"
),
"123"
;
is
$ms
->expand(
"%UNDEFINE_ALL_SCRIPT"
),
""
;
is
$ms
->expand(
"N1N2N3"
),
"N1N2N3"
;
diag
'Issue #7: expansion depends on size of script name'
;
$ms
= new_ok(
'Text::MacroScript'
=> [
-script
=> [
[
"hello"
=>
"'Hallo'"
],
[
"Z1"
=>
"'hel'"
],
[
"Z2"
=>
"'lo'"
],
]]);
is
$ms
->expand(
"hello Z1 Z2\n"
),
"Hallo hel lo\n"
;
$ms
= new_ok(
'Text::MacroScript'
=> [
-script
=> [
[
"ZZZZZ1"
=>
"'hel'"
],
[
"ZZZZZ2"
=>
"'lo'"
],
[
"hello"
=>
"'Hallo'"
],
]]);
is
$ms
->expand(
"hello ZZZZZ1 ZZZZZ2\n"
),
"Hallo hel lo\n"
;
is
$ms
->expand(
"ZZZZZ1ZZZZZ2\n"
),
"Hallo\n"
;
$ms
= new_ok(
'Text::MacroScript'
);
is
$ms
->expand(
"%DEFINE_SCRIPT * ['*']\n"
),
""
;
is
$ms
->expand(
"2*4\n"
),
"2*4\n"
;
$ms
= new_ok(
'Text::MacroScript'
);
diag
'Issue #3: Cannot catch error "missing parameter or unescaped # in MACRO"'
;
is
$ms
->expand(
"%DEFINE_SCRIPT * [#0+#1]"
),
""
;
is
$ms
->expand(
"*[0|1]"
),
"1"
;
is
$ms
->expand(
"*[ 0 | 1 ]"
),
"1"
;
is
$ms
->expand(
"*[0|1|2]"
),
"1"
;
is
$ms
->expand(
"%DEFINE_SCRIPT * [\"#0+\\#ffff\"]"
),
""
;
is
$ms
->expand(
"*[1]\n"
),
"1+#ffff\n"
;
$ms
= new_ok(
'Text::MacroScript'
);
is
$ms
->expand(
"%DEFINE_SCRIPT *"
),
""
;
is
$ms
->expand(
"\"line 1: #0 \"."
),
""
;
is
$ms
->expand(
"\"line 2: #1 \"."
),
""
;
is
$ms
->expand(
"\"line 3: #2 \";"
),
""
;
is
$ms
->expand(
"%END_DEFINE"
),
""
;
is
$ms
->expand(
"*[a|b|c]"
),
"line 1: a line 2: b line 3: c "
;
$ms
= new_ok(
'Text::MacroScript'
);
is
$ms
->expand(
"%DEFINE_SCRIPT * ['\\#0']\n"
),
""
;
is
$ms
->expand(
"2*4\n"
),
"2#04\n"
;
diag
'Issue #37: Variables should be expanded in all input text, not only in macro scripts'
;
$ms
= new_ok(
'Text::MacroScript'
);
$ms
->define_variable(
YEAR
=> 2015);
$ms
->define(
-script
=>
SHOW
=>
'"\\#YEAR = #YEAR"'
);
done_testing;