diff options
Diffstat (limited to 'Examples/test-suite/php/director_classes_runme.php')
-rw-r--r-- | Examples/test-suite/php/director_classes_runme.php | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/Examples/test-suite/php/director_classes_runme.php b/Examples/test-suite/php/director_classes_runme.php new file mode 100644 index 000000000..c25d85d17 --- /dev/null +++ b/Examples/test-suite/php/director_classes_runme.php @@ -0,0 +1,79 @@ +<?php +require "tests.php"; + +// No new functions +check::functions(array()); +// New classes +check::classes(array('director_classes', 'Base', 'BaseClass', 'Caller', 'Derived', 'DerivedClass', 'DoubleHolder')); +// New vars +check::globals(array('PrintDebug')); + +class PHPDerived extends Base { + function Val(DoubleHolder $x) { return $x; } + function Ref(DoubleHolder $x) { return $x; } + function Ptr(?DoubleHolder $x) { return $x; } + function ConstPtrRef(?DoubleHolder $x) { return $x; } + function FullyOverloaded($x) { + $rv = parent::FullyOverloaded($x); + $rv = preg_replace('/Base/', 'PHPDerived', $rv); + return $rv; + } + function SemiOverloaded($x) { + # this is going to be awkward because we can't really + # semi-overload in PHP, but we can sort of fake it. + if (!is_int($x)) { + return parent::SemiOverloaded($x); + } + $rv = parent::SemiOverloaded($x); + $rv = preg_replace('/Base/', 'PHPDerived', $rv); + return $rv; + } + function DefaultParms(int $x, float $y = 1.125) { + $rv = parent::DefaultParms($x, $y); + $rv = preg_replace('/Base/', 'PHPDerived', $rv); + return $rv; + } +} + +{ + $c = new Caller(); + makeCalls($c, new Base(100.0)); + makeCalls($c, new Derived(200.0)); + makeCalls($c, new PHPDerived(300.0)); +} + +function makeCalls($caller, $base) { + $bname = get_class($base); + if ($bname == 'PHPDerived') { + // TODO: Debug and make this work: + return; + } + $caller->set($base); + $dh = new DoubleHolder(444.555); + check::equal($caller->ValCall($dh)->val, $dh->val, "$bname.Val"); + check::equal($caller->RefCall($dh)->val, $dh->val, "$bname.Ref"); + check::equal($caller->PtrCall($dh)->val, $dh->val, "$bname.Ptr"); + check::equal($caller->ConstPtrRefCall($dh)->val, $dh->val, "$bname.ConstPtrRef"); + check::equal($caller->FullyOverloadedCall(1), + "{$bname}::FullyOverloaded(int)", + "$bname.FullyOverloaded(int)"); + check::equal($caller->FullyOverloadedCall(false), + "{$bname}::FullyOverloaded(bool)", + "$bname.FullyOverloaded(bool)"); + // This next one is TODO for Perl with PerlDerived. + check::equal($caller->SemiOverloadedCall(-678), + "{$bname}::SemiOverloaded(int)", + "$bname.SemiOverloaded(int)"); + check::equal($caller->SemiOverloadedCall(false), + "Base::SemiOverloaded(bool)", + "$bname.SemiOverloaded(bool)"); + check::equal($caller->DefaultParmsCall(10, 2.2), + "{$bname}::DefaultParms(int, double)", + "$bname.DefaultParms(int, double)"); + check::equal($caller->DefaultParmsCall(10), + "{$bname}::DefaultParms(int)", + "$bname.DefaultParms(int)"); + $caller->reset(); +} + +check::done(); |