add begin.t from Method::Signatures
[p5sagit/Function-Parameters.git] / t / foreign / Method-Signatures / begin.t
1 #!perl
2
3 package Foo;
4
5 use strict;
6 use warnings FATAL => 'all';
7
8 use Test::More;
9 use Test::Fatal;
10
11 use Function::Parameters { method => { defaults => 'method', runtime => 0 } };
12
13
14 our $phase;
15 BEGIN { $phase = 'compile-time' }
16 INIT  { $phase = 'run-time'     }
17
18
19 sub method_defined
20 {
21     my ($method) = @_;
22
23     local $Test::Builder::Level = $Test::Builder::Level + 1;
24     is exception { Foo->$method }, undef, "method $method is defined at $phase";
25 }
26
27 sub method_undefined
28 {
29     my ($method) = @_;
30
31     local $Test::Builder::Level = $Test::Builder::Level + 1;
32     like exception { Foo->$method }, qr/Can't locate object method/, "method $method is undefined at $phase";
33 }
34
35
36 # The default configuration with compile at BEGIN on.
37 method top_level_default() {}
38
39 # Turn it off.
40 use Function::Parameters { method => { defaults => 'method', runtime => 1 } };
41 method top_level_off() {}
42
43 # And on again.
44 use Function::Parameters { method => { defaults => 'method', runtime => 0 } };
45 method top_level_on() {}
46
47 # Now turn it off inside a lexical scope
48 {
49     use Function::Parameters { method => { defaults => 'method', runtime => 1 } };
50     method inner_scope_off() {}
51 }
52
53 # And it's restored.
54 method outer_scope_on() {}
55
56
57 # at compile-time, some should be defined and others shouldn't be
58 BEGIN {
59     method_defined('top_level_default');
60     method_undefined('top_level_off');
61     method_defined('top_level_on');
62     method_undefined('inner_scope_off');
63     method_defined('outer_scope_on');
64 }
65
66 # by run-time, they should _all_ be defined
67 method_defined('top_level_default');
68 method_defined('top_level_off');
69 method_defined('top_level_on');
70 method_defined('inner_scope_off');
71 method_defined('outer_scope_on');
72
73
74 done_testing;