1*5759b3d2Safresh1#!/usr/bin/perl -w
2*5759b3d2Safresh1
3*5759b3d2Safresh1use strict;
4*5759b3d2Safresh1use warnings;
5*5759b3d2Safresh1
6*5759b3d2Safresh1use lib 't/lib';
7*5759b3d2Safresh1use Test::More;
8*5759b3d2Safresh1
9*5759b3d2Safresh1note "Basic use_ok"; {
10*5759b3d2Safresh1    package Foo::one;
11*5759b3d2Safresh1    ::use_ok("Symbol");
12*5759b3d2Safresh1    ::ok( defined &gensym,        'use_ok() no args exports defaults' );
13*5759b3d2Safresh1}
14*5759b3d2Safresh1
15*5759b3d2Safresh1
16*5759b3d2Safresh1note "With one arg"; {
17*5759b3d2Safresh1    package Foo::two;
18*5759b3d2Safresh1    ::use_ok("Symbol", qw(qualify));
19*5759b3d2Safresh1    ::ok( !defined &gensym,       '  one arg, defaults overridden' );
20*5759b3d2Safresh1    ::ok( defined &qualify,       '  right function exported' );
21*5759b3d2Safresh1}
22*5759b3d2Safresh1
23*5759b3d2Safresh1
24*5759b3d2Safresh1note "Multiple args"; {
25*5759b3d2Safresh1    package Foo::three;
26*5759b3d2Safresh1    ::use_ok("Symbol", qw(gensym ungensym));
27*5759b3d2Safresh1    ::ok( defined &gensym && defined &ungensym,   '  multiple args' );
28*5759b3d2Safresh1}
29*5759b3d2Safresh1
30*5759b3d2Safresh1
31*5759b3d2Safresh1note "Defining constants"; {
32*5759b3d2Safresh1    package Foo::four;
33*5759b3d2Safresh1    my $warn; local $SIG{__WARN__} = sub { $warn .= shift; };
34*5759b3d2Safresh1    ::use_ok("constant", qw(foo bar));
35*5759b3d2Safresh1    ::ok( defined &foo, 'constant' );
36*5759b3d2Safresh1    ::is( $warn, undef, 'no warning');
37*5759b3d2Safresh1}
38*5759b3d2Safresh1
39*5759b3d2Safresh1
40*5759b3d2Safresh1note "use Module VERSION"; {
41*5759b3d2Safresh1    package Foo::five;
42*5759b3d2Safresh1    ::use_ok("Symbol", 1.02);
43*5759b3d2Safresh1}
44*5759b3d2Safresh1
45*5759b3d2Safresh1
46*5759b3d2Safresh1note "use Module VERSION does not call import"; {
47*5759b3d2Safresh1    package Foo::six;
48*5759b3d2Safresh1    ::use_ok("NoExporter", 1.02);
49*5759b3d2Safresh1}
50*5759b3d2Safresh1
51*5759b3d2Safresh1
52*5759b3d2Safresh1{
53*5759b3d2Safresh1    package Foo::seven;
54*5759b3d2Safresh1    local $SIG{__WARN__} = sub {
55*5759b3d2Safresh1        # Old perls will warn on X.YY_ZZ style versions.  Not our problem
56*5759b3d2Safresh1        warn @_ unless $_[0] =~ /^Argument "\d+\.\d+_\d+" isn't numeric/;
57*5759b3d2Safresh1    };
58*5759b3d2Safresh1    ::use_ok("Test::More", 0.47);
59*5759b3d2Safresh1}
60*5759b3d2Safresh1
61*5759b3d2Safresh1
62*5759b3d2Safresh1note "Signals are preserved"; {
63*5759b3d2Safresh1    package Foo::eight;
64*5759b3d2Safresh1    local $SIG{__DIE__};
65*5759b3d2Safresh1    ::use_ok("SigDie");
66*5759b3d2Safresh1    ::ok(defined $SIG{__DIE__}, '  SIG{__DIE__} preserved');
67*5759b3d2Safresh1}
68*5759b3d2Safresh1
69*5759b3d2Safresh1
70*5759b3d2Safresh1note "Line numbers preserved"; {
71*5759b3d2Safresh1    my $package = "that_cares_about_line_numbers";
72*5759b3d2Safresh1
73*5759b3d2Safresh1    # Store the output of caller.
74*5759b3d2Safresh1    my @caller;
75*5759b3d2Safresh1    {
76*5759b3d2Safresh1        package that_cares_about_line_numbers;
77*5759b3d2Safresh1
78*5759b3d2Safresh1        sub import {
79*5759b3d2Safresh1            @caller = caller;
80*5759b3d2Safresh1            return;
81*5759b3d2Safresh1        }
82*5759b3d2Safresh1
83*5759b3d2Safresh1        $INC{"$package.pm"} = 1;  # fool use into thinking it's already loaded
84*5759b3d2Safresh1    }
85*5759b3d2Safresh1
86*5759b3d2Safresh1    ::use_ok($package);
87*5759b3d2Safresh1    my $line = __LINE__-1;
88*5759b3d2Safresh1    ::is( $caller[0], __PACKAGE__,      "caller package preserved" );
89*5759b3d2Safresh1    ::is( $caller[1], __FILE__,         "  file" );
90*5759b3d2Safresh1    ::is( $caller[2], $line,            "  line" );
91*5759b3d2Safresh1}
92*5759b3d2Safresh1
93*5759b3d2Safresh1
94*5759b3d2Safresh1note "not confused by functions vs class names"; {
95*5759b3d2Safresh1    $INC{"ok.pm"} = 1;
96*5759b3d2Safresh1    use_ok("ok");               # ok is a function inside Test::More
97*5759b3d2Safresh1
98*5759b3d2Safresh1    $INC{"Foo/bar.pm"} = 1;
99*5759b3d2Safresh1    sub Foo::bar { 42 }
100*5759b3d2Safresh1    use_ok("Foo::bar");         # Confusing a class name with a function name
101*5759b3d2Safresh1}
102*5759b3d2Safresh1
103*5759b3d2Safresh1done_testing;
104