# 02_reduce.t
#
# Test suite for Regexp::Assemble
#
# Test the various tail reductions, e.g. /dab/ /cab/ => /[cd]ab/
#
# copyright (C) 2004-2006 David Landgren
use strict;
use Regexp::Assemble;
eval qq{ use Test::More tests => 61 };
if( $@ ) {
warn "# Test::More not available, no tests performed\n";
print "1..1\nok 1\n";
exit 0;
}
my $fixed = 'The scalar remains the same';
$_ = $fixed;
my $context = { debug => 0, depth => 0 };
{
# ran, reran
my $path = ['r'];
my $tail = { '' => undef, 'r' => [ 'r', 'e' ] };
my $head = ['n', 'a'];
($head, my $slide, $path) = Regexp::Assemble::_slide_tail( $head, $tail, $path, $context );
is_deeply( $head, ['n', 'a', 'r'], '_slide_tail ran/reran head' );
is_deeply( $slide, { '' => undef, 'e' => ['e', 'r'] }, '_slide_tail ran/reran slide' );
is_deeply( $path, [], '_slide_tail ran/reran path' );
}
{
# lit, limit
my $path = ['i', 'l'];
my $tail = { '' => undef, 'i' => [ 'i', 'm' ] };
my $head = ['t'];
($head, my $slide, $path) = Regexp::Assemble::_slide_tail( $head, $tail, $path, $context );
is_deeply( $head, ['t', 'i'], '_slide_tail lit/limit head' );
is_deeply( $slide, { '' => undef, 'm' => ['m', 'i'] }, '_slide_tail lit/limit slide' );
is_deeply( $path, ['l'], '_slide_tail lit/limit path' );
}
{
# acids/acidoids
my $path = ['d', 'i', 'c', 'a'];
my $tail = { '' => undef, 'd' => [ 'd', 'i', 'o' ] };
my $head = ['s'];
($head, my $slide, $path) = Regexp::Assemble::_slide_tail( $head, $tail, $path, $context );
is_deeply( $head, ['s', 'd', 'i'], '_slide_tail acids/acidoids head' );
is_deeply( $slide, { '' => undef, 'o' => ['o', 'd', 'i'] }, '_slide_tail acids/acidoids slide' );
is_deeply( $path, ['c', 'a'], '_slide_tail acids/acidoids path' );
}
{
# 007/00607
my $path = ['0', '0'];
my $tail = { '' => undef, '0' => [ '0', '6' ] };
my $head = ['7'];
($head, my $slide, $path) = Regexp::Assemble::_slide_tail( $head, $tail, $path, $context );
is_deeply( $head, ['7', '0'], '_slide_tail 007/00607 head' );
is_deeply( $slide, { '' => undef, '6' => ['6', '0'] }, '_slide_tail 007/00607 slide' );
is_deeply( $path, ['0'], '_slide_tail 007/00607 path' );
}
{
my $ra = Regexp::Assemble->new;
$ra->insert($_) for 0..2;
$ra->_reduce;
is_deeply( $ra->_path,
[
{
'0' => ['0'],
'1' => ['1'],
'2' => ['2'],
},
],
'/0/ /1/ /2/',
);
}
{
my $ra = Regexp::Assemble->new
->insert( split //, 'cat' )
->insert( split //, 'dog' )
->insert( split //, 'bird' )
->insert( split //, 'worm' )
->_reduce;
is_deeply( $ra->_path,
[
{
'b' => ['b','i','r','d'],
'c' => ['c','a','t'],
'd' => ['d','o','g'],
'w' => ['w','o','r','m'],
},
],
'/cat/ /dog/ /bird/ /worm/',
);
}
{
my $ra = Regexp::Assemble->new
->insert( split //, 'proamendment' )
->insert( split //, 'proappropriation' )
->insert( split //, 'proapproval' )
->_reduce
;
is_deeply( $ra->_path,
[
'p', 'r', 'o', 'a',
{
'm' => ['m','e','n','d','m','e','n','t'],
'p' => ['p','p','r','o', {
'p' => ['p','r','i','a','t','i','o','n'],
'v' => ['v','a','l'],
},
],
},
],
'/proamendment/ /proappropriation/ /proapproval/',
);
}
{
my $ra = Regexp::Assemble->new;
$ra->insert( 0 )
->insert( 1 )
->insert( split //, 10 )
->insert( split //, 100 )
->_reduce;
is_deeply( $ra->_path,
[
{
'0' => ['0'],
'1' => [
'1', {
'' => undef,
'0' => [
{
'' => undef,
'0' => ['0'],
},
0,
],
}
],
},
],
'/0/ /1/ /10/ /100/',
);
}
{
my $ra = Regexp::Assemble->new
->insert( 'c', 'a', 'b' )
->insert( 'd', 'a', 'b' )
->_reduce
;
is_deeply( $ra->_path,
[
{
'c' => ['c'],
'd' => ['d'],
},
'a', 'b',
],
'/cab/ /dab/'
);
}
{
my $ra = Regexp::Assemble->new
->insert( 'c', 'r', 'a', 'b' )
->insert( 'd', 'a', 'b' )
->_reduce
;
is_deeply( $ra->_path,
[
{
'c' => ['c', 'r'],
'd' => ['d'],
},
'a', 'b',
],
'/crab/ /dab/'
);
}
{
my $ra = Regexp::Assemble->new
->insert( 'd', 'a', 'b' )
->insert( 'd', 'a', 'y' )
->insert( 'd', 'a', 'i', 'l', 'y' )
->_reduce
;
is_deeply( $ra->_path,
[
'd', 'a',
{
'b' => ['b'],
'i' => [
{
'' => undef,
'i' => ['i', 'l'],
},
'y'
],
},
],
'/dab/ /day /daily/'
);
}
{
my $ra = Regexp::Assemble->new
->insert( 'c', 'r', 'a', 'b' )
->insert( 'd', 'a', 'b' )
->insert( 'l', 'o', 'b' )
->_reduce
;
is_deeply( $ra->_path,
[
{
'c' => [
{
'c' => ['c', 'r'],
'd' => ['d'],
},
'a',
],
'l' => ['l', 'o'],
},
'b',
],
'/crab/ /dab/ /lob/'
);
}
{
my $ra = Regexp::Assemble->new
->insert( split //, 'hat' )
->insert( split //, 'that' )
->_reduce
;
is_deeply( $ra->_path,
[
{
'' => undef,
't' => ['t'],
},
'h', 'a', 't',
],
'/hat/ /that/'
);
}
{
my $ra = Regexp::Assemble->new
->insert( split //, 'treat' )
->insert( split //, 'threat' )
->_reduce
;
is_deeply( $ra->_path,
[
't',
{
'' => undef,
'h' => ['h'],
},
'r', 'e', 'a', 't'
],
'/treat/ /threat/'
);
}
{
my $ra = Regexp::Assemble->new
->insert( split //, 'treat' )
->insert( split //, 'threat' )
->insert( split //, 'eat' )
->_reduce
;
is_deeply( $ra->_path,
[
{
'' => undef,
't' => [
't',
{
'' => undef,
'h' => ['h'],
},
'r',
],
},
'e', 'a', 't'
],
'/eat/ /treat/ /threat/'
);
}
{
my $ra = Regexp::Assemble->new
->insert( split //, 'treat' )
->insert( split //, 'threat' )
->insert( split //, 'teat' )
->_reduce
;
is_deeply( $ra->_path,
[
't',
{
'' => undef,
'h' => [
{
'h' => ['h'],
'' => undef,
},
'r'
],
},
'e', 'a', 't'
],
'/teat/ /treat/ /threat/'
);
}
{
my $ra = Regexp::Assemble->new
->insert( split //, 'grit' )
->insert( split //, 'lit' )
->insert( split //, 'limit' )
->_reduce
;
is_deeply( $ra->_path,
[
{
'g' => [ 'g', 'r' ],
'l' => [ 'l',
{
'' => undef,
'i' => ['i', 'm'],
},
],
},
'i', 't'
],
'/grit/ /lit/ /limit/',
);
}
{
my $ra = Regexp::Assemble->new
->insert( split //, 'in' )
->insert( split //, 'ban' )
->insert( split //, 'ten' )
->insert( split //, 'tent' )
->_reduce
;
is_deeply( $ra->_path,
[
{
'b' => [
{
'i' => ['i'],
'b' => ['b', 'a'],
},
'n',
],
't' => ['t', 'e', 'n',
{
'' => undef,
't' => ['t'],
}
]
}
],
'/in/ /ban/ /ten/ /tent/',
);
}
{
my $ra = Regexp::Assemble->new
->insert( '' )
->insert( split //, 'do' )
->insert( split //, 'don' )
->_reduce
;
is_deeply( $ra->_path,
[
{
'' => undef,
'd' => [ 'd', 'o',
{
'' => undef,
'n' => ['n'],
},
],
}
],
'// /do/ /don/',
);
}
{
my $ra = Regexp::Assemble->new
->insert( split //, 'bf' )
->insert( split //, 'cdf' )
->insert( split //, 'cgf' )
->insert( split //, 'cez' )
->insert( split //, 'daf' )
->insert( split //, 'dbf' )
->insert( split //, 'dcf' )
->_reduce
;
is_deeply( $ra->_path,
[
{
'b' => [
{
'b' => ['b'],
'd' => ['d',
{
'a'=>['a'],
'b'=>['b'],
'c'=>['c'],
},
],
},
'f',
],
'c' => [ 'c', {
'd' => [
{
'd' => ['d'],
'g' => ['g'],
},
'f',
],
'e' => ['e', 'z'],
}
],
}
],
'/bf/ /cdf/ /cgf/ /cez/ /daf/ /dbf/ /dcf/',
);
}
{
my $ra = Regexp::Assemble->new
->insert( split //, 'kids' )
->insert( split //, 'acids' )
->insert( split //, 'acidoids' )
->_reduce
;
is_deeply( $ra->_path,
[
{
'k' => [ 'k' ],
'a' => [ 'a', 'c',
{
'' => undef,
'i' => ['i', 'd', 'o'],
},
],
},
'i', 'd', 's',
],
'/kids/ /acids/ /acidoids/',
);
}
{
my $ra = Regexp::Assemble->new
->insert( split //, 'schoolkids' )
->insert( split //, 'acids' )
->insert( split //, 'acidoids' )
->_reduce
;
is_deeply( $ra->_path,
[
{
's' => [ 's', 'c', 'h', 'o', 'o', 'l', 'k' ],
'a' => [ 'a', 'c',
{
'' => undef,
'i' => ['i', 'd', 'o'],
},
],
},
'i', 'd', 's',
],
'/schoolkids/ /acids/ /acidoids/',
);
}
{
my $ra = Regexp::Assemble->new
->insert( split //, 'skids' )
->insert( split //, 'kids' )
->insert( split //, 'acids' )
->insert( split //, 'acidoids' )
->_reduce
;
is_deeply( $ra->_path,
[
{
's' => [
{
'' => undef,
's' => ['s'],
},
'k',
],
'a' => [ 'a', 'c',
{
'' => undef,
'i' => ['i', 'd', 'o'],
},
],
},
'i', 'd', 's',
],
'/skids/ /kids/ /acids/ /acidoids/',
);
}
{
my $ra = Regexp::Assemble->new
->insert( split //, 'skids' )
->insert( split //, 'kids' )
->insert( split //, 'acids' )
->insert( split //, 'acidoids' )
->insert( split //, 'schoolkids' )
->_reduce
;
is_deeply( $ra->_path,
[
{
's' => [
{
'' => undef,
's' => ['s',
{
'' => undef,
'c' => ['c', 'h', 'o', 'o', 'l'],
}
],
},
'k',
],
'a' => [ 'a', 'c',
{
'' => undef,
'i' => ['i', 'd', 'o'],
},
],
},
'i', 'd', 's',
],
'/skids/ /kids/ /acids/ /acidoids/ /schoolkids/',
);
}
{
my $ra = Regexp::Assemble->new
->insert( split //, 'showeriness' )
->insert( split //, 'showerless' )
->insert( split //, 'showiness' )
->insert( split //, 'showless' )
->_reduce
;
is_deeply( $ra->_path,
[
's', 'h', 'o', 'w',
{
'' => undef,
'e' => ['e', 'r'],
},
{
'i' => ['i', 'n'],
'l' => ['l'],
},
'e', 's', 's'
],
'/showeriness/ /showerless/ /showiness/ /showless/',
);
}
{
my $ra = Regexp::Assemble->new
->insert( split //, 'gait' )
->insert( split //, 'grit' )
->insert( split //, 'blaze' )
->_reduce
;
is_deeply( $ra->_path,
[
{
'b' => ['b', 'l', 'a', 'z', 'e'],
'g' => ['g',
{
'a' => ['a'],
'r' => ['r'],
},
'i', 't',
],
},
],
'/gait/ /grit/ /blaze/',
);
}
{
my $ra = Regexp::Assemble->new
->insert( split //, 'gait' )
->insert( split //, 'grit' )
->insert( split //, 'glaze' )
->_reduce
;
is_deeply( $ra->_path,
[
'g',
{
'l' => ['l', 'a', 'z', 'e'],
'a' => [
{
'a' => ['a'],
'r' => ['r'],
},
'i', 't',
],
},
],
'/gait/ /grit/ /glaze/',
);
}
{
my $ra = Regexp::Assemble->new
->insert( split //, 'gait' )
->insert( split //, 'grit' )
->insert( split //, 'graze' )
->_reduce
;
is_deeply( $ra->_path,
[
'g',
{
'r' => ['r',
{
'a' => ['a', 'z', 'e'],
'i' => ['i', 't'],
},
],
'a' => ['a', 'i', 't'],
},
],
'/gait/ /grit/ /graze/',
);
}
{
my $ra = Regexp::Assemble->new;
$ra->{path} = [
't', {
'a' => ['a'],
'i' => ['i'],
},
'b',
];
my $path = [ 't', {
'a' => ['a'],
'i' => ['i'],
},
's',
];
my $res = $ra->_insert_path( $ra->{path}, 0, $path );
is_deeply( $res,
[
't',
{
'a' => ['a'],
'i' => ['i'],
},
{
'b' => ['b'],
's' => ['s'],
},
],
'_insert_path sit/sat -> bit/bat',
);
}
{
my $ra = Regexp::Assemble->new;
$ra->{path} = [
't', {
'a' => ['a'],
'i' => ['i'],
},
{
'b' => ['b'],
's' => ['s'],
}
];
my $path = [ 't', {
'a' => ['a'],
'i' => ['i'],
},
'f',
];
my $res = $ra->_insert_path( $ra->{path}, 0, $path );
is_deeply( $res,
[
't',
{
'a' => ['a'],
'i' => ['i'],
},
{
'b' => ['b'],
'f' => ['f'],
's' => ['s'],
},
],
'_insert_path fit/fat -> sit/sat, bit/bat',
);
}
{
my $ra = Regexp::Assemble->new;
$ra->{path} = [
't', {
'' => undef,
'a' => ['a'],
},
'e', 'b',
];
my $path = [ 't', {
'' => undef,
'a' => ['a'],
},
'e', 's',
];
my $res = $ra->_insert_path( $ra->{path}, 0, $path );
is_deeply( $res,
[
't',
{
'' => undef,
'a' => ['a'],
},
'e',
{
'b' => ['b'],
's' => ['s'],
},
],
'_insert_path seat/set -> beat/bet',
);
}
{
my $ra = Regexp::Assemble->new;
$ra->{path} = [
'd', 'i',
{
'' => undef,
'o' => ['o'],
},
't', 'y', 'd',
];
my $path = [ 'd', 'i',
{
'' => undef,
'o' => ['o'],
},
't', 'a', 'b',
];
my $res = $ra->_insert_path( $ra->{path}, 0, $path );
is_deeply( $res,
[
'd', 'i',
{
'' => undef,
'o' => ['o'],
},
't',
{
'a' => ['a', 'b'],
'y' => ['y', 'd'],
},
],
'_insert_path dio?tyd -> dio?tab',
);
}
{
my $ra = Regexp::Assemble->new;
$ra->{path} = [
'd', 'i',
{
'' => undef,
'o' => ['o'],
},
't',
{
'a' => ['a', 'b'],
'y' => ['y', 'd'],
},
];
my $path = [ 'd', 'i',
{
'' => undef,
'o' => ['o'],
},
't', 'm', 'x',
];
my $res = $ra->_insert_path( $ra->{path}, 0, $path );
is_deeply( $res,
[
'd', 'i',
{
'' => undef,
'o' => ['o'],
},
't',
{
'a' => ['a', 'b'],
'm' => ['m', 'x'],
'y' => ['y', 'd'],
},
],
'_insert_path dio?tmx -> dio?t(ab|yd)',
);
}
{
my $ra = Regexp::Assemble->new;
$ra->{path} = [
'd', 'i',
{
'' => undef,
'o' => ['o'],
},
't',
{
'a' => ['a', 'b'],
'y' => ['y', 'd'],
},
];
my $path = [ 'd', 'i',
{
'' => undef,
'o' => ['o'],
},
't', 'a', 'x',
];
my $res = $ra->_insert_path( $ra->{path}, 0, $path );
is_deeply( $res,
[
'd', 'i',
{
'' => undef,
'o' => ['o'],
},
't',
{
'a' => ['a',
{
'b' => ['b'],
'x' => ['x'],
}
],
'y' => ['y', 'd'],
},
],
'_insert_path dio?tax -> dio?t(ab|yd)',
);
}
{
my $ra = Regexp::Assemble->new
->insert( split //, 'gait' )
->insert( split //, 'grit' )
->insert( split //, 'summit' )
->insert( split //, 'submit' )
->_reduce
;
is_deeply( $ra->_path,
[
{
'g' => ['g',
{
'a' => ['a'],
'r' => ['r'],
},
],
's' => [
's', 'u',
{
'b' => ['b'],
'm' => ['m'],
},
'm',
],
},
'i', 't',
],
'/gait/ /grit/ /summit/ /submit/',
);
}
{
my $ra = Regexp::Assemble->new
->insert( split //, 'gait' )
->insert( split //, 'grit' )
->insert( split //, 'summit' )
->insert( split //, 'submit' )
->insert( split //, 'it' )
->insert( split //, 'emit' )
->_reduce
;
is_deeply( $ra->_path,
[
{
'' => undef,
'g' => ['g',
{
'a' => ['a'],
'r' => ['r'],
},
],
'e' => [
{
'e' => ['e'],
's' => ['s', 'u',
{
'b' => ['b'],
'm' => ['m'],
},
],
},
'm',
],
},
'i', 't',
],
'/gait/ /grit/ /summit/ /submit/ /it/ /emit/',
);
}
{
my $ra = Regexp::Assemble->new
->insert( split //, 'gait' )
->insert( split //, 'grit' )
->insert( split //, 'lit' )
->insert( split //, 'limit' )
->_reduce
;
is_deeply( $ra->_path,
[
{
'g' => ['g',
{
'a' => ['a'],
'r' => ['r'],
},
],
'l' => [ 'l',
{
'' => undef,
'i' => ['i','m'],
},
],
},
'i', 't',
],
'/gait/ /grit/ /lit/ /limit/',
);
}
{
my $ra = Regexp::Assemble->new
->insert( split //, 'gait' )
->insert( split //, 'grit' )
->insert( split //, 'bait' )
->insert( split //, 'brit' )
->_reduce
;
is_deeply( $ra->_path,
[
{
'b' => ['b'],
'g' => ['g'],
},
{
'a' => ['a'],
'r' => ['r'],
},
'i', 't',
],
'/gait/ /grit/ /bait/ /brit/',
);
}
{
my $ra = Regexp::Assemble->new
->insert( split //, 'gait' )
->insert( split //, 'grit' )
->insert( split //, 'bebait' )
->insert( split //, 'bait' )
->insert( split //, 'brit' )
->_reduce
;
is_deeply( $ra->_path,
[
{
'b' => ['b',
{
'e' => [
{
'' => undef,
'e' => ['e','b'],
},
'a',
],
'r' => ['r'],
},
],
'g' => ['g',
{
'a' => ['a'],
'r' => ['r'],
}
]
},
'i', 't',
],
'/gait/ /grit/ /bait/ /bebait/ /brit/',
);
}
{
my $ra = Regexp::Assemble->new
->insert( split //, 'gait' )
->insert( split //, 'grit' )
->insert( split //, 'bait' )
->insert( split //, 'brit' )
->insert( split //, 'summit' )
->insert( split //, 'submit' )
->insert( split //, 'emit' )
->insert( split //, 'transmit' )
->_reduce
;
is_deeply( $ra->_path,
[
{
'b' => [
{
'b' => ['b'],
'g' => ['g'],
},
{
'a' => ['a'],
'r' => ['r'],
},
],
'e' => [
{
'e' => ['e'],
's' => ['s','u',{'b'=>['b'],'m'=>['m']}],
't' => ['t','r','a','n','s'],
},
'm',
],
},
'i', 't',
],
'/gait/ /grit/ /bait/ /brit/ /emit/ /summit/ /submit/ /transmit/',
);
}
{
my $ra = Regexp::Assemble->new
->insert( split //, 'lit' )
->insert( split //, 'limit' )
->insert( split //, 'commit' )
->insert( split //, 'emit' )
->insert( split //, 'transmit' )
->_reduce
;
is_deeply( $ra->_path,
[
{
'c' => [
{
'c' => ['c','o','m'],
'e' => ['e'],
't' => ['t','r','a','n','s'],
},
'm',
],
'l' => ['l',
{
'' => undef,
'i' => ['i','m'],
},
],
},
'i', 't',
],
'/lit/ /limit/ /emit/ /commit/ /transmit/',
);
}
{
my $ra = Regexp::Assemble->new
->insert( split //, 'apocryphal' )
->insert( split //, 'apocrustic' )
->insert( split //, 'apocrenic' )
->_reduce
;
is_deeply( $ra->_path,
[
'a','p','o','c','r',
{
'e' => [
{
'e' => ['e', 'n'],
'u' => ['u', 's', 't'],
},
'i','c',
],
'y' => ['y','p','h','a','l'],
},
],
'/apocryphal/ /apocrustic/ /apocrenic/',
);
}
{
my @list = qw/ den dent din dint ten tent tin tint /;
my $ra = Regexp::Assemble->new;
# $ra->insert( split // ) for @list;
for my $l (@list) { $ra->insert( split //, $l ) }
$ra->_reduce;
is_deeply( $ra->_path, [
{
'd' => ['d',
{
'e' => [ 'e', 'n', {
'' => undef,
't' => ['t'],
},
],
'i' => [ 'i', 'n', {
'' => undef,
't' => ['t'],
},
],
},
],
't' => ['t',
{
'e' => [ 'e', 'n', {
'' => undef,
't' => ['t'],
},
],
'i' => [ 'i', 'n', {
'' => undef,
't' => ['t'],
},
],
},
],
},
],
join( ' ', map { "/$_/" } @list ),
);
}
{
my @list = qw/ gait git grapefruit grassquit grit guitguit /;
my $ra = Regexp::Assemble->new;
# $ra->insert( split // ) for @list;
for my $l (@list) { $ra->insert( split //, $l ) }
$ra->_reduce;
is_deeply( $ra->_path,
[ 'g',
{
'' => undef,
'a' => ['a'],
'r' => ['r',
{
'' => undef,
'a' => ['a',
{
'p' => ['p','e','f','r'],
's' => ['s','s','q'],
},
'u',
],
},
],
'u' => [ 'u','i','t','g','u'],
},
'i', 't'
],
join( ' ', map { "/$_/" } @list ),
);
}
{
my @list = qw/ gait gambit gaslit giggit git godwit goldtit goodwillit
gowkit grapefruit grassquit grit guitguit /;
my $ra = Regexp::Assemble->new;
# $ra->insert( split // ) for @list;
for my $l (@list) { $ra->insert( split //, $l ) }
$ra->_reduce;
is_deeply( $ra->_path,
[ 'g',
{
'a' => [ 'a',
{
'' => undef,
'm' => ['m','b'],
's' => ['s','l'],
},
],
'i' => [
{
'' => undef,
'i' => ['i','g','g'],
}
],
'o' => [ 'o',
{
'd' => ['d','w'],
'l' => ['l','d','t'],
'o' => ['o','d','w','i','l','l'],
'w' => ['w','k'],
}
],
'r' => [ 'r',
{
'' => undef,
'a' => ['a',
{
'p' => ['p','e','f','r'],
's' => ['s','s','q'],
},
'u',
],
},
],
'u' => [ 'u','i','t','g','u'],
},
'i', 't'
],
join( ' ', map { "/$_/" } @list ),
);
}
{
my @list = qw/ lit limit lid livid /;
my $ra = Regexp::Assemble->new;
# $ra->insert( split // ) for @list;
for my $l (@list) { $ra->insert( split //, $l ) }
$ra->_reduce;
is_deeply( $ra->_path,
[
'l','i', {
'm' => [
{
'' => undef,
'm' => ['m','i'],
},
't'
],
'v' => [
{
'' => undef,
'v' => ['v','i'],
},
'd'
],
},
],
join( ' ', map { "/$_/" } @list ),
);
}
{
my @list = qw/ theatre metre millimetre /;
my $ra = Regexp::Assemble->new;
# $ra->insert( split // ) for @list;
for my $l (@list) { $ra->insert( split //, $l ) }
$ra->_reduce;
is_deeply( $ra->_path,
[
{
'm' => [
{
'' => undef,
'm' => ['m','i','l','l','i'],
},
'm','e',
],
't' => ['t','h','e','a'],
},
't','r','e'
],
join( ' ', map { "/$_/" } @list ),
);
}
{
my @list = qw/ sad salad spread/;
my $ra = Regexp::Assemble->new;
# $ra->insert( split // ) for @list;
for my $l (@list) { $ra->insert( split //, $l ) }
$ra->_reduce;
is_deeply( $ra->_path,
[
's',
{
'a' => [
{
'' => undef,
'a' => ['a','l'],
},
],
'p' => ['p','r','e'],
},
'a','d',
],
join( ' ', map { "/$_/" } @list ),
);
}
{
my @list = qw/ tough trough though thorough /;
my $ra = Regexp::Assemble->new;
# $ra->insert( split // ) for @list;
for my $l (@list) { $ra->insert( split //, $l ) }
$ra->_reduce;
is_deeply( $ra->_path,
[
't',
{
'' => undef,
'h' => ['h',
{
'' => undef,
'o' => ['o','r'],
}
],
'r' => ['r'],
},
'o','u','g','h',
],
join( ' ', map { "/$_/" } @list ),
);
}
{
my @list = qw/ tough though trough through thorough /;
my $ra = Regexp::Assemble->new;
# $ra->insert( split // ) for @list;
for my $l (@list) { $ra->insert( split //, $l ) }
$ra->_reduce;
is_deeply( $ra->_path,
['t',
{
'' => undef,
h => [ 'h',
{
o => [
{
'' => undef,
o => ['o','r']
}
],
r => ['r'],
}
],
r => ['r'],
},
'o','u','g','h'
],
join( ' ', map { "/$_/" } @list ),
);
}
{
my @list = qw/ tit titanate titania titanite titano tite titi titian titien tittie /;
my $ra = Regexp::Assemble->new;
# $ra->insert( split // ) for @list;
for my $l (@list) { $ra->insert( split //, $l ) }
$ra->_reduce;
is_deeply( $ra->_path,
['t','i','t',
{
'' => undef,
'a' => [ 'a','n',
{
'a' => ['a','t','e'],
'i' => ['i',
{
'a' => ['a'],
't' => ['t','e']
}
],
'o' => ['o']
}
],
'i' => [ 'i',
{
'' => undef,
'a' => [
{
'e' => ['e'],
'a' => ['a']
},
'n'
]
}
],
't' => [
{
'' => undef,
't' => ['t','i']
},
'e'
]
}
],
join( ' ', map { "/$_/" } @list ),
);
}
{
my $ra = Regexp::Assemble->new;
$ra->add( 'dasin' );
$ra->add( 'dosin' );
$ra->add( 'dastin' );
$ra->add( 'dostin' );
$ra->_reduce;
is_deeply( $ra->_path,
[
'd',
{
'a' =>['a'],
'o' =>['o'],
},
's',
{
'' => undef,
't' => ['t'],
},
'i', 'n',
],
'dasin/dosin/dastin/dosting'
) or diag ($ra->_path);
}
is( $_, $fixed, '$_ has not been altered' );