xref: /openbsd/gnu/usr.bin/perl/ext/Fcntl/t/mode.t (revision 771fbea0)
1#!./perl -w
2
3use Test::More;
4
5use File::Temp;
6use File::Spec;
7
8use Fcntl qw(:mode);
9
10my $tmpfile = File::Temp->new;
11my @tests = (
12	     ['REG', 'tmpfile', (stat "$tmpfile")[2]],
13	     ['DIR', 'dir', (stat '.')[2]]
14	    );
15
16$devnull = File::Spec->devnull();
17if (-c $devnull) {
18    push @tests, ['CHR', $devnull, (stat $devnull)[2]];
19}
20
21plan(tests => 34 + 6 + 9 * @tests);
22foreach (@tests) {
23    my ($type, $name, $mode) = @$_;
24
25    if ($type eq 'REG') {
26	ok( S_ISREG($mode), " S_ISREG $name");
27    } else {
28	ok(!S_ISREG($mode), "!S_ISREG $name");
29    }
30
31    if ($type eq 'DIR') {
32	ok( S_ISDIR($mode), " S_ISDIR $name");
33    } else {
34	ok(!S_ISDIR($mode), "!S_ISDIR $name");
35    }
36
37 SKIP: {
38	skip 'No S_IFCHR', 1 unless defined eval {S_IFCHR};
39	if ($type eq 'CHR') {
40	    ok( S_ISCHR($mode), " S_ISCHR $name");
41	} else {
42	    ok(!S_ISCHR($mode), "!S_ISCHR $name");
43	}
44    }
45
46 SKIP: {
47	skip 'No S_IFLNK', 1 unless defined eval {S_IFLNK};
48	ok(!S_ISLNK($mode), "!S_ISLNK $name");
49    }
50 SKIP: {
51	skip 'No S_IFSOCK', 1 unless defined eval {S_IFSOCK};
52	ok(!S_ISSOCK($mode), "!S_ISSOCK $name");
53    }
54 SKIP: {
55	skip 'No S_IFBLK', 1 unless defined eval {S_IFBLK};
56	ok(!S_ISBLK($mode), "!S_ISBLK $name");
57    }
58 SKIP: {
59	skip 'No S_IFFIFO', 1 unless defined eval {S_IFFIFO};
60	ok(!S_ISFIFO($mode), "!S_ISFIFO $name");
61    }
62 SKIP: {
63	skip 'No S_IFWHT', 1 unless defined eval {S_IFWHT};
64	ok(!S_ISWHT($mode), "!S_ISWHT $name");
65    }
66 SKIP: {
67	skip 'No S_ENFMT', 1 unless defined eval {S_ENFMT};
68	ok(!S_ISENFMT($mode), "!S_ISENFMT $name");
69    }
70}
71
72foreach ([S_ISREG => \&S_ISREG],
73	 [S_IMODE => \&S_IMODE],
74	) {
75    my ($name, $func) = @$_;
76    my @warnings;
77    my $ret;
78
79    {
80	local $SIG{__WARN__} = sub { push @warnings, "@_" };
81	$ret = &$func();
82    }
83    ok(!$ret, "$name() is false");
84    is(scalar @warnings, 1, '1 warning');
85    like($warnings[0], qr/^Use of uninitialized value/, 'expected warning');
86}
87
88is (S_IFMT(), _S_IFMT(), 'S_IFMT()');
89is (S_IFMT(0), 0, 'S_IFMT(0)');
90for my $shift (0..31) {
91    is (S_IFMT(1 << $shift), ((1 << $shift) & _S_IFMT()), "S_IFMT(1 << $shift)");
92}
93