global statement removal: hphp/test [7/x]
[hiphop-php.git] / hphp / test / quick / fb_intercept.php
blob6914354728b669b581004ac2b4d4469a03546182
1 <?php
3 function handler($name, $obj, $args, $data, &$done) {
4 echo "----HANDLER----\n";
5 var_dump($name, $obj, $args, $data, $done);
6 echo "---------------\n";
9 function passthrough_handler($name, $obj, $args, $data, &$done) {
10 echo "----HANDLER----\n";
11 var_dump($name, $obj, $args, $data, $done);
12 $done = false;
13 echo "---------------\n";
16 class MagicCall {
17 public function __call($name, $args) {
18 echo "magic call! ";
19 var_dump($name, $args);
20 echo "\n";
24 function frap($arg) {
25 echo "frap $arg\n";
28 function test_standard_function() {
29 echo '---------- ', __FUNCTION__, ' ----------', "\n";
30 // Call once normally first; make sure translator can handle it
31 frap('claptrap');
33 // Intercept a function
34 fb_intercept('frap', 'handler', 'data');
35 frap('claptrap');
36 call_user_func('frap', 'callfunc');
38 fb_intercept('frap', 'passthrough_handler');
39 frap('claptrap');
40 call_user_func('frap', 'callfunc');
42 // Replace with closure
43 fb_intercept('frap', function () { echo "Closure! wooooo\n"; });
44 frap('claptrap');
46 // Replace with __call-having object
47 $mc = new MagicCall();
48 fb_intercept('frap', array($mc, 'i_dont_exist'));
49 frap('claptrap');
51 // Reset
52 fb_intercept('frap', null);
53 frap('claptrap');
56 function var_frap($arg, ...$rest) {
57 echo "var_frap $arg "; var_dump($rest);
60 function test_variadic_function() {
61 echo '---------- ', __FUNCTION__, ' ----------', "\n";
63 // Call once normally first; make sure translator can handle it
64 var_frap('claptrap', 'blah');
66 // Intercept a function
67 fb_intercept('var_frap', 'handler', 'data');
68 var_frap('claptrap', 'blah');
69 call_user_func('var_frap', 'callfunc');
71 fb_intercept('var_frap', 'passthrough_handler');
72 var_frap('claptrap', 'blah');
73 call_user_func('var_frap', 'callfunc');
75 // Replace with closure
76 fb_intercept('var_frap', function () { echo "Closure! wooooo\n"; });
77 var_frap('claptrap', 'blah');
79 // Replace with __call-having object
80 $mc = new MagicCall();
81 fb_intercept('var_frap', array($mc, 'i_dont_exist'));
82 var_frap('claptrap', 'blah');
84 // Reset
85 fb_intercept('var_frap', null);
86 var_frap('claptrap', 'blah');
89 class Blark {
90 public static function sfrap() {
91 echo "static frap " . static::class . "\n";
93 public function frap() {
94 echo "non-static frap\n";
98 class SubBlark extends Blark {}
99 class SubBlark2 extends Blark {}
101 function test_methods() {
102 echo '---------- ', __FUNCTION__, ' ----------', "\n";
103 $mc = new MagicCall();
105 // Intercept static method
106 fb_intercept('SubBlark2::sfrap', 'handler');
107 Blark::sfrap();
108 call_user_func(array('Blark', 'sfrap'));
109 SubBlark::sfrap();
110 call_user_func(array('SubBlark', 'sfrap'));
111 SubBlark2::sfrap();
112 call_user_func(array('SubBlark2', 'sfrap'));
114 fb_intercept('Blark::sfrap', 'handler');
115 Blark::sfrap();
116 call_user_func(array('Blark', 'sfrap'));
117 SubBlark::sfrap();
118 call_user_func(array('SubBlark', 'sfrap'));
119 SubBlark2::sfrap();
120 call_user_func(array('SubBlark2', 'sfrap'));
122 fb_intercept('Blark::sfrap', 'passthrough_handler');
123 Blark::sfrap();
124 call_user_func(array('Blark', 'sfrap'));
126 fb_intercept('Blark::sfrap', array($mc, 'i_dont_exist_either'));
127 Blark::sfrap();
128 call_user_func(array('Blark', 'sfrap'));
130 // Intercept non-static method
131 $b = new Blark();
132 fb_intercept('Blark::frap', 'handler');
133 $b->frap();
134 call_user_func(array($b, 'frap'));
136 fb_intercept('Blark::frap', 'passthrough_handler');
137 $b->frap();
138 call_user_func(array($b, 'frap'));
140 fb_intercept('Blark::frap', array($mc, 'i_dont_exist_either'));
141 $b->frap();
142 call_user_func(array($b, 'frap'));
144 // MULTI-INTERCEPT!
145 fb_intercept('frap', 'handler');
146 fb_intercept('handler', 'passthrough_handler');
147 frap('claptrap');
149 // Reset all
150 fb_intercept('', null);
151 frap('claptrap');
152 Blark::sfrap();
153 $b->frap();
155 // Intercept __call
156 fb_intercept('MagicCall::__call', 'handler');
157 $mc->blark('hi');
158 fb_intercept('MagicCall::__call', 'passthrough_handler');
159 $mc->blark('ho');
162 function main() {
163 test_standard_function();
164 test_variadic_function();
165 test_methods();
168 main();