http://www.perlmonks.org?node_id=1039533


in reply to Unit testing question with Test::Deep

Best I could come up with is this:

use strict; use warnings; use 5.010; use Test::More; use Test::Deep; my $structure = [ { alpha => 'alpha-foo', beta => 18, gamma => 'opt-bar' }, { alpha => 'alpha-foo', beta => 18 } ]; my $structure_extra = [ { alpha => 'alpha-foo', beta => 18, gamma => 'opt-bar', delta => 'huh' }, { alpha => 'alpha-foo', beta => 18 } ]; my $structure_failing = [ { alpha => 'alpha-foo', beta => 18, gamma => 'copt-bar' }, { alpha => 'alpha-foo', beta => 18 } ]; my %minimal = ( alpha => re('^alpha(.*)'), beta => re('\d+') ); my %optional = ( gamma => re('^opt(.*)') ); my $validator = array_each(superhashof(\%minimal) & subhashof({%minima +l, %optional})); cmp_deeply($structure, $validator); cmp_deeply($structure_extra, $validator); cmp_deeply($structure_failing, $validator); done_testing;

$structure passes the test, the other two fail. This can easily be modified to add new mandatory elements (add them to %minimal) and new optional elements (add them to %optional).