1#!/usr/bin/perl -w
2
3use strict;
4
5use Params::Validate qw(validate validate_pos);
6use Test::More tests => 19;
7
8{
9    my %spec = ( foo => { optional => 1, depends => 'bar' },
10                 bar => { optional => 1 },
11               );
12
13    my @args = ( bar => 1 );
14
15    eval { validate( @args,\%spec ) };
16
17    is( $@, q{}, "validate() single depends(1): no depends, positive" );
18
19    @args = ( foo => 1, bar => 1 );
20    eval { validate( @args,\%spec ) };
21
22    is( $@, q{}, "validate() single depends(2): with depends, positive" );
23
24    @args = ( foo => 1 );
25    eval { validate( @args, \%spec ) };
26
27    ok( $@, "validate() single depends(3.a): with depends, negative" );
28    like( $@,
29          qr(^Parameter 'foo' depends on parameter 'bar', which was not given),
30          "validate() single depends(3.b): check error string" );
31}
32
33{
34    my %spec = ( foo => { optional => 1, depends => [ qw(bar baz) ] },
35                 bar => { optional => 1 },
36                 baz => { optional => 1 },
37               );
38
39    # positive, no depends (single, multiple)
40    my @args = ( bar => 1 );
41    eval { validate( @args, \%spec ) };
42    is( $@, q{}, "validate() multiple depends(1): no depends, single arg, positive" );
43
44    @args = ( bar => 1, baz => 1 );
45    eval { validate( @args, \%spec ) };
46
47    is( $@, q{},
48	"validate() multiple depends(2): no depends, multiple arg, positive" );
49
50    @args = ( foo => 1, bar => 1, baz => 1 );
51    eval { validate( @args, \%spec ) };
52
53    is( $@, q{}, "validate() multiple depends(3): with depends, positive" );
54
55    @args = ( foo => 1, bar => 1 );
56    eval { validate( @args, \%spec ) };
57
58    ok( $@, "validate() multiple depends(4.a): with depends, negative, multiple missing" );
59    like( $@,
60          qr(^Parameter 'foo' depends on parameter 'baz', which was not given),
61          "validate() multiple depends (4.b): check error string" );
62
63    @args = ( foo => 1 );
64    eval { validate( @args, \%spec ) };
65
66    ok( $@, "validate() multiple depends(5.a): with depends, negative, multiple missing" );
67    like( $@,
68          qr(^Parameter 'foo' depends on parameter '(bar|baz)', which was not given),
69          "validate() multiple depends (5.b): check error string" );
70}
71
72{
73    # bad depends
74    my %spec = ( foo => { optional => 1, depends => { 'bar' => 1 } },
75                 bar => { optional => 1 },
76               );
77
78    my @args = ( foo => 1 );
79    eval { validate( @args, \%spec ) };
80
81    ok( $@, "validate() bad depends spec (1.a): depends is a hashref" );
82    like( $@,
83          qr(^Arguments to 'depends' must be a scalar or arrayref),
84          "validate() bad depends spec (1.a): check error string" );
85}
86
87{
88    my @spec = ( { optional => 1 } );
89
90    my @args = qw(1);
91    eval { validate_pos( @args, @spec ) };
92
93    is( $@, q{}, "validate_pos() no depends, positive" );
94}
95
96{
97    my @spec = ( { optional => 1, depends => 2 }, {optional => 1} );
98
99    my @args = qw(1 1);
100    eval { validate_pos( @args, @spec ) };
101
102    is( $@, q{}, "validate_pos() single depends (1): with depends, positive" );
103}
104
105{
106    my @spec = ( { optional => 1, depends => 4 },
107                 { optional => 1 }, { optional => 1 },
108                 { optional => 1 } );
109
110    my @args = qw(1 0);
111    eval { validate_pos( @args, @spec ) };
112
113    ok( $@, "validate_pos() single depends (2.a): with depends, negative" );
114    like( $@,
115          qr(^Parameter #1 depends on parameter #4, which was not given),
116          "validate_pos() single depends (2.b): check error" );
117}
118
119{
120    my @spec = ( { optional => 1, depends => [ 2, 3 ] },
121                 { optional => 1 },
122                 0
123               );
124    my @args = qw(1);
125    eval { validate_pos( @args, @spec ) };
126
127    ok( $@, "validate_pos() multiple depends (1.a): with depends, bad args negative" );
128    like( $@,
129          qr{^Arguments to 'depends' for validate_pos\(\) must be a scalar},
130          "validate_pos() multiple depends (1.b): check error" );
131}
132