170 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			SourcePawn
		
	
	
	
	
	
			
		
		
	
	
			170 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			SourcePawn
		
	
	
	
	
	
| #include <sourcemod>
 | |
| 
 | |
| public Plugin:myinfo = 
 | |
| {
 | |
| 	name = "Function Call Testing Lab",
 | |
| 	author = "AlliedModders LLC",
 | |
| 	description = "Tests basic function calls",
 | |
| 	version = "1.0.0.0",
 | |
| 	url = "http://www.sourcemod.net/"
 | |
| };
 | |
| 
 | |
| public OnPluginStart()
 | |
| {
 | |
| 	RegServerCmd("test_callfunc", Command_CallFunc);
 | |
| 	RegServerCmd("test_callfunc_reentrant", Command_ReentrantCallFunc);
 | |
| }
 | |
| 
 | |
| public OnCallFuncReceived(num, Float:fnum, String:str[], String:str2[], &val, &Float:fval, array[], array2[], size, hello2[1])
 | |
| {
 | |
| 	PrintToServer("Inside OnCallFuncReceived...");
 | |
| 
 | |
| 	PrintToServer("num = %d (expected: %d)", num, 5);
 | |
| 	PrintToServer("fnum = %f (expected: %f)", fnum, 7.17);
 | |
| 	PrintToServer("str[] = \"%s\" (expected: \"%s\")", str, "Gaben");
 | |
| 	PrintToServer("str2[] = \"%s\" (expected: \"%s\")", str2, ".taf si nebaG");
 | |
| 	
 | |
| 	PrintToServer("val = %d (expected %d, setting to %d)", val, 62, 15);
 | |
| 	val = 15;
 | |
| 	
 | |
| 	PrintToServer("fval = %f (expected: %f, setting to %f)", fval, 6.25, 1.5);
 | |
| 	fval = 1.5; 
 | |
| 	
 | |
| 	PrintToServer("Printing %d elements of array[] (expected: %d)", size, 6);
 | |
| 	for (new i = 0; i < size; i++)
 | |
| 	{
 | |
| 		PrintToServer("array[%d] = %d (expected: %d)", i, array[i], i);
 | |
| 	}
 | |
| 	for (new i = 0; i < size; i++)
 | |
| 	{
 | |
| 		PrintToServer("array2[%d] = %d (expected: %d)", i, array[i], i);
 | |
| 	}
 | |
| 	
 | |
| 	/* This shouldn't get copied back */
 | |
| 	strcopy(str, strlen(str) + 1, "Yeti");
 | |
| 	/* This should get copied back */
 | |
| 	strcopy(str2, strlen(str2) + 1, "Gaben is fat.");
 | |
| 	
 | |
| 	/* This should get copied back */
 | |
| 	array[0] = 5;
 | |
| 	array[1] = 6;
 | |
| 	/* This shouldn't get copied back */
 | |
| 	hello2[0] = 25;
 | |
| 	
 | |
| 	return 42;
 | |
| }
 | |
| 
 | |
| public OnReentrantCallReceived(num, String:str[])
 | |
| {
 | |
| 	new err, ret;
 | |
| 	
 | |
| 	PrintToServer("Inside OnReentrantCallReceived...");
 | |
| 	
 | |
| 	PrintToServer("num = %d (expected: %d)", num, 7);
 | |
| 	PrintToServer("str[] = \"%s\" (expected: \"%s\")", str, "nana");
 | |
| 	
 | |
| 	new Function:func = GetFunctionByName(null, "OnReentrantCallReceivedTwo");
 | |
| 	
 | |
| 	if (func == INVALID_FUNCTION)
 | |
| 	{
 | |
| 		PrintToServer("Failed to get the function id of OnReentrantCallReceivedTwo");
 | |
| 		return 0;
 | |
| 	}
 | |
| 	
 | |
| 	PrintToServer("Calling OnReentrantCallReceivedTwo...");
 | |
| 	
 | |
| 	Call_StartFunction(null, func);
 | |
| 	Call_PushFloat(8.0);
 | |
| 	err = Call_Finish(ret);
 | |
| 	
 | |
| 	PrintToServer("Call to OnReentrantCallReceivedTwo has finished!");
 | |
| 	PrintToServer("Error code = %d (expected: %d)", err, 0);
 | |
| 	PrintToServer("Return value = %d (expected: %d)", ret, 707);
 | |
| 	
 | |
| 	return 11;
 | |
| }
 | |
| 
 | |
| public OnReentrantCallReceivedTwo(Float:fnum)
 | |
| {
 | |
| 	PrintToServer("Inside OnReentrantCallReceivedTwo...");
 | |
| 	
 | |
| 	PrintToServer("fnum = %f (expected: %f)", fnum, 8.0);
 | |
| 
 | |
| 	return 707;
 | |
| }
 | |
| 
 | |
| public Action:Command_CallFunc(args)
 | |
| {
 | |
| 	new a = 62;
 | |
| 	new Float:b = 6.25;
 | |
| 	new const String:what[] = "Gaben";
 | |
| 	new String:truth[] = ".taf si nebaG";
 | |
| 	new hello[] = {0, 1, 2, 3, 4, 5};
 | |
| 	new hello2[] = {9};
 | |
| 	new pm = 6;
 | |
| 	new err;
 | |
| 	new ret;
 | |
| 	
 | |
| 	new Function:func = GetFunctionByName(null, "OnCallFuncReceived");
 | |
| 	
 | |
| 	if (func == INVALID_FUNCTION)
 | |
| 	{
 | |
| 		PrintToServer("Failed to get the function id of OnCallFuncReceived");
 | |
| 		return Plugin_Handled;
 | |
| 	}
 | |
| 	
 | |
| 	PrintToServer("Calling OnCallFuncReceived...");
 | |
| 	
 | |
| 	Call_StartFunction(null, func);
 | |
| 	Call_PushCell(5);
 | |
| 	Call_PushFloat(7.17);
 | |
| 	Call_PushString(what);
 | |
| 	Call_PushStringEx(truth, sizeof(truth), SM_PARAM_STRING_COPY, SM_PARAM_COPYBACK);
 | |
| 	Call_PushCellRef(a);
 | |
| 	Call_PushFloatRef(b);
 | |
| 	Call_PushArrayEx(hello, pm, SM_PARAM_COPYBACK);
 | |
| 	Call_PushArray(hello, pm);
 | |
| 	Call_PushCell(pm);
 | |
| 	Call_PushArray(hello2, 1);
 | |
| 	err = Call_Finish(ret);
 | |
| 	
 | |
| 	PrintToServer("Call to OnCallFuncReceived has finished!");
 | |
| 	PrintToServer("Error code = %d (expected: %d)", err, 0);
 | |
| 	PrintToServer("Return value = %d (expected: %d)", ret, 42);
 | |
| 	
 | |
| 	PrintToServer("a = %d (expected: %d)", a, 15);
 | |
| 	PrintToServer("b = %f (expected: %f)", b, 1.5);
 | |
| 	PrintToServer("what = \"%s\" (expected: \"%s\")", what, "Gaben");
 | |
| 	PrintToServer("truth = \"%s\" (expected: \"%s\")", truth, "Gaben is fat.");
 | |
| 	PrintToServer("hello[0] = %d (expected: %d)", hello[0], 5);
 | |
| 	PrintToServer("hello[1] = %d (expected: %d)", hello[1], 6);
 | |
| 	PrintToServer("hello2[0] = %d (expected: %d)", hello2[0], 9);
 | |
| 	
 | |
| 	return Plugin_Handled;
 | |
| }
 | |
| 
 | |
| public Action:Command_ReentrantCallFunc(args)
 | |
| {	
 | |
| 	new err, ret;
 | |
| 	new Function:func = GetFunctionByName(null, "OnReentrantCallReceived");
 | |
| 	
 | |
| 	if (func == INVALID_FUNCTION)
 | |
| 	{
 | |
| 		PrintToServer("Failed to get the function id of OnReentrantCallReceived");
 | |
| 		return Plugin_Handled;
 | |
| 	}
 | |
| 	
 | |
| 	PrintToServer("Calling OnReentrantCallReceived...");
 | |
| 	
 | |
| 	Call_StartFunction(null, func);
 | |
| 	Call_PushCell(7);
 | |
| 	Call_PushString("nana");
 | |
| 	err = Call_Finish(ret);
 | |
| 	
 | |
| 	PrintToServer("Call to OnReentrantCallReceived has finished!");
 | |
| 	PrintToServer("Error code = %d (expected: %d)", err, 0);
 | |
| 	PrintToServer("Return value = %d (expected: %d)", ret, 11);
 | |
| 	
 | |
| 	return Plugin_Handled;
 | |
| }
 |