add begin.t from Method::Signatures
[p5sagit/Function-Parameters.git] / t / foreign / Method-Signatures / begin.t
CommitLineData
5424bb4a 1#!perl
2
3package Foo;
4
5use strict;
6use warnings FATAL => 'all';
7
8use Test::More;
9use Test::Fatal;
10
11use Function::Parameters { method => { defaults => 'method', runtime => 0 } };
12
13
14our $phase;
15BEGIN { $phase = 'compile-time' }
16INIT { $phase = 'run-time' }
17
18
19sub 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
27sub 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.
37method top_level_default() {}
38
39# Turn it off.
40use Function::Parameters { method => { defaults => 'method', runtime => 1 } };
41method top_level_off() {}
42
43# And on again.
44use Function::Parameters { method => { defaults => 'method', runtime => 0 } };
45method 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.
54method outer_scope_on() {}
55
56
57# at compile-time, some should be defined and others shouldn't be
58BEGIN {
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
67method_defined('top_level_default');
68method_defined('top_level_off');
69method_defined('top_level_on');
70method_defined('inner_scope_off');
71method_defined('outer_scope_on');
72
73
74done_testing;