Skip to content

Commit

Permalink
add nativefunction for function testcase
Browse files Browse the repository at this point in the history
  • Loading branch information
zzusoftboy committed Nov 2, 2017
1 parent 76c3153 commit 677be17
Show file tree
Hide file tree
Showing 6 changed files with 263 additions and 45 deletions.
4 changes: 3 additions & 1 deletion tests/dummyext/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,9 @@ set(DUMMYEXT_SRCS
NamespaceTestcases.h
NamespaceTestcases.cpp
ConstantTestcases.h
ConstantTestcases.cpp)
ConstantTestcases.cpp
NativeFunctions.h
NativeFunctions.cpp)

add_library(dummyext MODULE
${DUMMYEXT_SRCS})
Expand Down
62 changes: 62 additions & 0 deletions tests/dummyext/FunctionTestcases.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,75 @@
// Created by softboy on 2017/11/01.

#include "FunctionTestcases.h"
#include "NativeFunctions.h"

namespace dummyext
{

using zapi::lang::Namespace;
using zapi::lang::ValueArgument;
using zapi::lang::RefArgument;
using zapi::lang::VariadicArgument;

void register_function_testcases(Extension &extension)
{
extension.registerFunction<decltype(&dummyext::show_something), &dummyext::show_something>("show_something");
extension.registerFunction<decltype(&dummyext::get_name), &dummyext::get_name>("get_name");
extension.registerFunction<decltype(&dummyext::print_name), &dummyext::print_name>
("print_name", {
ValueArgument("name", zapi::lang::Type::String)
});
extension.registerFunction<decltype(&dummyext::print_name_and_age), &dummyext::print_name_and_age>
("print_name_and_age", {
ValueArgument("name", zapi::lang::Type::String),
ValueArgument("age", zapi::lang::Type::Long)
});
extension.registerFunction<decltype(&dummyext::add_two_number), &dummyext::add_two_number>
("add_two_number", {
ValueArgument("num1", zapi::lang::Type::Long),
ValueArgument("num2", zapi::lang::Type::Long)
});
extension.registerFunction<decltype(&dummyext::return_arg), &dummyext::return_arg>
("return_arg", {
ValueArgument("number1"),
});
// for passby value and reference test
extension.registerFunction<decltype(&dummyext::get_value_ref), &dummyext::get_value_ref>
("get_value_ref", {
RefArgument("number", zapi::lang::Type::Numeric),
});
extension.registerFunction<decltype(&dummyext::passby_value), &dummyext::passby_value>
("passby_value", {
ValueArgument("number", zapi::lang::Type::Numeric),
});

// test for default arguments
extension.registerFunction<decltype(&dummyext::say_hello), &dummyext::say_hello>
("say_hello", {
ValueArgument("name", zapi::lang::Type::String, false)
});

// register for namespace
Namespace *zapi = extension.findNamespace("zapi");
Namespace *io = zapi->findNamespace("io");

zapi->registerFunction<decltype(&dummyext::get_name), &dummyext::get_name>("get_name");
zapi->registerFunction<decltype(&dummyext::show_something), &dummyext::show_something>("show_something");

io->registerFunction<decltype(&dummyext::calculate_sum), &dummyext::calculate_sum>
("calculate_sum", {
VariadicArgument("numbers")
});
io->registerFunction<decltype(&dummyext::print_name), &dummyext::print_name>
("print_name", {
ValueArgument("name", zapi::lang::Type::String)
});
// for test varidic
io->registerFunction<decltype(&dummyext::print_sum), &dummyext::print_sum>
("print_sum", {
VariadicArgument("numbers")
});
io->registerFunction<decltype(&dummyext::show_something), &dummyext::show_something>("show_something");
}

} // dummyext
94 changes: 94 additions & 0 deletions tests/dummyext/NativeFunctions.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
// @copyright 2017-2018 zzu_softboy <zzu_softboy@163.com>
//
// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Created by softboy on 2017/11/02.

#include "NativeFunctions.h"

namespace dummyext
{

using zapi::lang::Variant;

void show_something()
{
zapi::out << "hello world, zapi" << std::flush;
}

void get_value_ref(NumericVariant &number)
{
number = 321;
}

void passby_value(NumericVariant &number)
{
// have no effect
number = 321;
}

Variant get_name()
{
return "zzu_softboy";
}

void print_name(const StringVariant &name)
{
zapi::out << name << std::flush;
}

void print_sum(NumericVariant argQuantity, ...)
{
va_list args;
va_start(args, argQuantity);
NumericVariant result;
for (int i = 0; i < argQuantity; ++i) {
result += NumericVariant(va_arg(args, zapi_varidic_item_type), false);
}
zapi::out << result << std::flush;
}

Variant calculate_sum(NumericVariant argQuantity, ...)
{
va_list args;
va_start(args, argQuantity);
NumericVariant result;
for (int i = 0; i < argQuantity; ++i) {
result += NumericVariant(va_arg(args, zapi_varidic_item_type), false);
}
return result;
}

void print_name_and_age(const StringVariant &name, const NumericVariant &age)
{
zapi::out << "name: " << name << " age: " << age << std::flush;
}

Variant add_two_number(const NumericVariant &num1, const NumericVariant &num2)
{
return num1 + num2;
}

void say_hello(StringVariant &name)
{
if (name.getCapacity() == 0) {
name = "zapi";
}
zapi::out << "hello, " << name << std::endl;
}

Variant return_arg(Variant &value)
{
return value;
}

}
41 changes: 41 additions & 0 deletions tests/dummyext/NativeFunctions.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
// @copyright 2017-2018 zzu_softboy <zzu_softboy@163.com>
//
// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Created by softboy on 2017/11/02.

#ifndef ZAPI_TEST_DUMMYEXT_NATIVE_FUNCTIONS_H
#define ZAPI_TEST_DUMMYEXT_NATIVE_FUNCTIONS_H

#include "zapi/ZendApi.h"

namespace dummyext
{

using zapi::ds::StringVariant;
using zapi::ds::NumericVariant;

ZAPI_DECL_EXPORT Variant return_arg(Variant &value);
ZAPI_DECL_EXPORT void show_something();
ZAPI_DECL_EXPORT Variant get_name();
ZAPI_DECL_EXPORT void get_value_ref(NumericVariant &number);
ZAPI_DECL_EXPORT void passby_value(NumericVariant &number);
ZAPI_DECL_EXPORT void print_sum(NumericVariant argQuantity, ...);
ZAPI_DECL_EXPORT void print_name(const StringVariant &name);
ZAPI_DECL_EXPORT void print_name_and_age(const StringVariant &name, const NumericVariant &age);
ZAPI_DECL_EXPORT Variant calculate_sum(NumericVariant argQuantity, ...);
ZAPI_DECL_EXPORT Variant add_two_number(const NumericVariant &num1, const NumericVariant &num2);
ZAPI_DECL_EXPORT void say_hello(StringVariant &name);

}

#endif // ZAPI_TEST_DUMMYEXT_NATIVE_FUNCTIONS_H
58 changes: 43 additions & 15 deletions tests/lang/func/FunctionArgsTest.phpt
Original file line number Diff line number Diff line change
@@ -1,29 +1,57 @@
--TEST--
test function argument pass
--FILE--
<?php

// here we test argument passed
if (function_exists("print_name")) {
$ret = "";
ob_start();
print_name("unicorn team");
echo "\n";
$ret = ob_get_clean();
if ("unicorn team" != $ret) {
goto error;
}
ob_start();
print_name(3.14);
echo "\n";
$ret = ob_get_clean();
if ("3.14" != $ret) {
goto error;
}
ob_start();
print_name(true);
$ret = ob_get_clean();
if ("1" != $ret) {
goto error;
}

} else {
goto error;
}
echo "\n";

if (function_exists("\zapi\io\print_name")) {
ob_start();
print_name("hello, zapi");
echo "\n";
$ret = ob_get_clean();

if ("hello, zapi" != $ret) {
goto error;
}
ob_start();
print_name(4.16);
echo "\n";
$ret = ob_get_clean();

if ("4.16" != $ret) {
goto error;
}
ob_start();
print_name(false);
$ret = ob_get_clean();
if ("" != $ret) {
goto error;
}
} else {
goto error;
}

?>
--EXPECT--
unicorn team
3.14
1
hello, zapi
4.16
success:
exit(0);
error:
exit(1);
49 changes: 20 additions & 29 deletions tests/lang/func/FunctionExistTest.phpt
Original file line number Diff line number Diff line change
@@ -1,47 +1,38 @@
--TEST--
Function exists test
--FILE--
<?php
if (function_exists("show_something")) {
echo "show_something exist\n";
if (!function_exists("show_something")) {
goto error;
}

if (function_exists("get_name")) {
echo "get_name exist\n";
if (!function_exists("get_name")) {
goto error;
}

if (function_exists("print_name")) {
echo "print_name exist\n";
if (!function_exists("print_name")) {
goto error;
}

if (function_exists("print_name_and_age")) {
echo "print_name_and_age exist\n";
if (!function_exists("print_name_and_age")) {
goto error;
}

if (function_exists("add_two_number")) {
echo "add_two_number exist\n";
if (!function_exists("add_two_number")) {
goto error;
}

// test function in namespace
if (function_exists("\zapi\get_name")) {
echo "\zapi\get_name exist\n";
if (!function_exists("\zapi\get_name")) {
goto error;
}

if (function_exists("\zapi\io\print_name")) {
echo "\zapi\io\print_name exist\n";
if (!function_exists("\zapi\io\print_name")) {
goto error;
}

if (function_exists("\zapi\io\show_something")) {
echo "\zapi\io\show_something exist\n";
if (!function_exists("\zapi\io\show_something")) {
goto error;
}

?>
--EXPECT--
show_something exist
get_name exist
print_name exist
print_name_and_age exist
add_two_number exist
\zapi\get_name exist
\zapi\io\print_name exist
\zapi\io\show_something exist
success:
exit(0);
error:
exit(1);

0 comments on commit 677be17

Please sign in to comment.