Parse::Binary::Nested: byte-terminated groups
[wormy.git] / t / parser.t
index faa229ce760b1e70cf3bfac574c58f2ed529e6e6..8e386634bc3785ce97a8d655f573769797bbba73 100644 (file)
@@ -6,7 +6,7 @@ use warnings;
 use Test::More;
 use Data::Dumper;
 
-plan tests => 7;
+plan tests => 11;
 
 use_ok('Parse::Binary::Nested');
 
@@ -57,3 +57,56 @@ is_deeply(
        'empty values'
 );
 
+is_deeply(
+       unpackf([
+               begin => 'c',
+               asciiz => ['?0', lead => 'v', string => 'Z*'],
+               end   => 'c',
+       ], "\377\1\0Hi\0\2\0zer0\0\0\376"),
+       {
+               begin => -1,
+               asciiz => [
+                       { lead => 1, string => 'Hi' },
+                       { lead => 2, string => 'zer0' },
+               ],
+               end => -2,
+       },
+       'zero-terminated group'
+);
+
+my $looptest = Parse::Binary::Nested->new([
+       begin => 'xc',
+       loop  => ['?1', lead => 'c', string => 'Z*'],
+       end   => '=.',
+]);
+is_deeply(
+       $looptest->unpackf("\0\1\0Hello\0\377bye"),
+       {
+               begin => 1,
+               loop => [
+                       { lead =>  0, string => 'Hello' },
+                       { lead => -1, string => 'bye' },
+               ],
+               end => 15,
+       },
+       'unterminated group'
+);
+is_deeply(
+       $looptest->unpackf("\0\1\1trailing"),
+       {
+               begin => 1,
+               end => 3,
+       },
+       'preterminated group'
+);
+
+is_deeply(
+       unpackf([
+               loop => ['?0', byte => 'C'],
+       ], "\1\2\3"),
+       {
+               loop => [map { {byte => $_} } 1..3],
+       },
+       'last byte in unterminated loop'
+);
+