polserver/testsuite/pol/testpkgs/client/test_client.src
Kevin Eady 593cfffb83
Add uninit, true, false keywords to grammar (#596)
* Update grammar

* Update expression handling for uninit

* update existing tests

* Add new tests

* Remove fullpath from escriptgrammar generation comment

* fix tests

* Update eScript guide

* Declare escript version 0x11

* Add core-changes

* Add `true` and `false` to grammar

* true/false implementation

* Fix existing tests

* Add new tests

* Update core changes

* add docs

* Fix BooleanValue::describe_to

* bool optimizations

* optimize uninit

* remove unused var assignments

* Update grammar for case labels for uninit, booleans

* Fix case label handling for uninit, true, false

* Tests

* Fix compiler version display v1.1700000017881393 -> v1.17

* optimize boolean binary operations

* fix unary boolean optimizer

* add boolean, uninit optimizer test

* Use new fmt lib apis

* Fix compiler warning

* really fix warning lol

* Add Executor[Module]::getParam for bools, FindSubstance test
2024-01-20 05:38:25 +01:00

243 lines
6.6 KiB
Text

use os;
use uo;
include "testutil";
include "communication";
var char;
var char2;
var clientcon := getClientConnection();
program chartests()
var a:=FindAccount("testclient0");
char:=a.getcharacter(1);
if (!char)
return ret_error("Could not find char at slot 1");
endif
a:=FindAccount("testclient1");
char2:=a.getcharacter(1);
if (!char2)
return ret_error("Could not find char2 at slot 1");
endif
endprogram
exported function test_client_properties()
if (char.client.acctname != "testclient0")
return ret_error("Incorrect account name on char 1, expected 'testclient0");
elseif (char.client.acct.name != "testclient0")
return ret_error("Incorrect account reference returned on char.client.acct, expected account with name 'testclient0'");
elseif (char2.client.acct.name != "testclient1")
return ret_error("Incorrect account reference returned on char2.client.acct, expected account with name 'testclient1'");
elseif (char2.client.acctname != "testclient1")
return ret_error("Incorrect account name on char 2, expected 'testclient1");
elseif (char.client.multi != uninit) // testing knownObjMember: acct is a known member but not implemented on client
return ret_error("Expected char.client.multi to be uninit object, got " + char.client.multi);
elseif (char.client.unknownprop != uninit) // testing of objmember that is not known
return ret_error("Expected char.client.unknownprop to be uninit object, got " + char.client.unknownprop);
endif
return 1;
endfunction
exported function say_something()
Clear_Event_Queue();
clientcon.sendevent(struct{todo:="speech", arg:="Hello Test", id:=0});
while (1)
var ev:=waitForClient(0, {EVT_SPEECH});
if (!ev)
return ev;
endif
if (ev.msg=="Hello Test")
break;
endif
endwhile
return 1;
endfunction
exported function say_something_with_tokens()
var arg := struct{
text := "Hello Test",
tokens:= {60, 255}
};
// This needs to match what gets echo'ed from test_speech's NPC script ai_speech.src
var expected_message := $"source=[npc] text=[{arg.text}] tokens=[{arg.tokens}]";
var npc := CreateNpcFromTemplate(":testnpc:test_speech", char.x + 1, char.y + 1, char.z, realm := char.realm, forcelocation := 1);
if (!npc)
return ret_error($"Could not create npc: {npc.errortext}");
endif
Clear_Event_Queue();
clientcon.sendevent(struct{
todo := "speech",
arg := arg,
id := 0
});
while (1)
var ev:=waitForClient(0, {EVT_SPEECH});
if (!ev)
MoveObjectToLocation(npc, 80, 80, 0, flags := MOVEOBJECT_FORCELOCATION);
npc.kill();
return ev;
endif
if (ev.msg == expected_message)
break;
endif
endwhile
MoveObjectToLocation(npc, 80, 80, 0, flags := MOVEOBJECT_FORCELOCATION);
npc.kill();
return 1;
endfunction
exported function test_speechtoken_crash()
var arg := struct{
text := "Hello Test",
tokens:= {60, 255}
};
// This needs to match what gets echo'ed from EchoItem's control script control_echo.src
var expected_message := $"source=[item] text=[{arg.text}] tokens=[{arg.tokens}]";
var npc := CreateNpcFromTemplate(":testnpc:test_speech", char.x + 1, char.y + 1, char.z, override_properties := struct{ CProps := dictionary{ "EventSize" -> 0 } }, realm := char.realm, forcelocation := 1);
if (!npc)
return ret_error($"Could not create npc: {npc.errortext}");
endif
var item := CreateItemAtLocation( char.x+2, char.y+2, char.z, "EchoItem", realm := char.realm );
if (!item)
MoveObjectToLocation(npc, 80, 80, 0, flags := MOVEOBJECT_FORCELOCATION);
npc.kill();
return ret_error($"Could not create item: {item.errortext}");
endif
Clear_Event_Queue();
clientcon.sendevent(struct{
todo := "speech",
arg := arg,
id := 0
});
while (1)
var ev:=waitForClient(0, {EVT_SPEECH});
if (!ev)
MoveObjectToLocation(npc, 80, 80, 0, flags := MOVEOBJECT_FORCELOCATION);
npc.kill();
DestroyItem(item);
return ev;
endif
// NPC handles events first, then items.
if (ev.msg == expected_message)
break;
endif
endwhile
MoveObjectToLocation(npc, 80, 80, 0, flags := MOVEOBJECT_FORCELOCATION);
npc.kill();
DestroyItem(item);
return 1;
endfunction
exported function move_turn_water()
MoveObjectToLocation(char, 1,1,1,flags:=MOVEOBJECT_FORCELOCATION);
char.facing:=1;
Clear_Event_Queue();
clientcon.sendevent(struct{todo:="move",arg:=6,id:=0});
while (1)
var ev:=waitForClient(0, {EVT_MOVED});
if (!ev)
return ev;
endif
if (!ev.ack)
return ret_error("failed to turn");
endif
if (ev.pos != {1,1,1,6})
return ret_error("wrong pos");
endif
break;
endwhile
clientcon.sendevent(struct{todo:="move",arg:=6,id:=0});
while (1)
var ev:=waitForClient(0, {EVT_MOVED});
if (!ev)
return ev;
endif
if (ev.ack)
return ret_error("move in water succeeded");
endif
if (ev.pos != {1,1,1,6})
return ret_error("wrong pos");
endif
break;
endwhile
return 1;
endfunction
exported function move_ground()
MoveObjectToLocation(char, 100,100,1,flags:=MOVEOBJECT_FORCELOCATION);
char.facing:=1;
Clear_Event_Queue();
clientcon.sendevent(struct{todo:="move",arg:=1,id:=0});
while (1)
var ev:=waitForClient(0, {EVT_MOVED});
if (!ev)
return ev;
endif
if (!ev.ack)
return ret_error("failed to move");
endif
if (ev.pos != {101,99,1,1})
return ret_error("wrong pos");
endif
break;
endwhile
return 1;
endfunction
exported function move_realm()
MoveObjectToLocation(char, 100,100,1,flags:=MOVEOBJECT_FORCELOCATION);
while (1)
var ev:=waitForClient(0, {EVT_OWNCREATE});
if (!ev)
return ev;
endif
break;
endwhile
Clear_Event_Queue();
MoveObjectToLocation(char, 100,100,1,"britannia2",MOVEOBJECT_FORCELOCATION);
while (1)
var ev:=waitForClient(0, {EVT_NEW_SUBSERVER});
if (!ev)
return ev;
endif
break;
endwhile
MoveObjectToLocation(char, 100,100,1,flags:=MOVEOBJECT_FORCELOCATION);
Clear_Event_Queue();
return 1;
endfunction
/*
Test that with WarmodeInhibitsRegen=3 (NPCs Only), a _PC_ in war mode _will_ regenerate health.
*/
exported function client_warmodeinhibitsregen()
char.setwarmode(1);
SetVital( char, "Life", GetVital( char, "Life" ) / 2);
var damaged_health := GetVital( char, "Life" );
var waited_health;
for i := 1 to 10
waited_health := GetVital( char, "Life" );
if (damaged_health != waited_health)
char.setwarmode(0);
return 1;
endif
Sleep(1);
endfor
char.setwarmode(0);
return ret_error($"PC health did not change between sleeping: {damaged_health} -> {waited_health}");
endfunction