chore(client): add gdUnit4 test framework addon
Vendor gdUnit4 for Godot 4 client testing (D-030). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,73 @@
|
||||
class_name GdUnitTcpNode
|
||||
extends Node
|
||||
|
||||
|
||||
func rpc_send(stream: StreamPeerTCP, data: RPC) -> void:
|
||||
var package_buffer := StreamPeerBuffer.new()
|
||||
var buffer := data.serialize().to_utf16_buffer()
|
||||
package_buffer.put_u32(0xDEADBEEF)
|
||||
package_buffer.put_u32(buffer.size())
|
||||
var status_code := package_buffer.put_data(buffer)
|
||||
if status_code != OK:
|
||||
push_error("'rpc_send:' Can't put_data(), error: %s" % error_string(status_code))
|
||||
return
|
||||
stream.put_data(package_buffer.data_array)
|
||||
|
||||
|
||||
func receive_packages(stream: StreamPeerTCP, rpc_cb: Callable = noop) -> Array[RPC]:
|
||||
var received_packages: Array[RPC] = []
|
||||
var package_buffer := StreamPeerBuffer.new()
|
||||
if stream.get_status() != StreamPeerTCP.STATUS_CONNECTED:
|
||||
return received_packages
|
||||
|
||||
while stream.get_status() == StreamPeerTCP.STATUS_CONNECTED and stream.get_available_bytes() > 0:
|
||||
var buffer := stream.get_data(8)
|
||||
var status_code: int = buffer[0]
|
||||
if status_code != OK:
|
||||
push_error("'receive_packages:' Can't get_data(%d) for available_bytes, error: %s"
|
||||
% [stream.get_available_bytes(), error_string(status_code)])
|
||||
return received_packages
|
||||
|
||||
var data_package: PackedByteArray
|
||||
package_buffer.data_array = buffer[1]
|
||||
package_buffer.seek(0)
|
||||
|
||||
if package_buffer.get_u32() == 0xDEADBEEF:
|
||||
var size := package_buffer.get_u32()
|
||||
if stream.get_status() != StreamPeerTCP.STATUS_CONNECTED:
|
||||
return received_packages
|
||||
if stream.get_available_bytes() < size:
|
||||
prints("size check:",
|
||||
package_buffer.get_size(), ":",
|
||||
package_buffer.get_position(),
|
||||
"to read:",
|
||||
size,
|
||||
"available size:",
|
||||
stream.get_available_bytes())
|
||||
push_error("'receive_packages:' Can't receive data get_data(%d) for package, error: %s" % [size, error_string(status_code)])
|
||||
return received_packages
|
||||
|
||||
buffer = stream.get_data(size)
|
||||
package_buffer.data_array = buffer[1]
|
||||
|
||||
var rpc_data := package_buffer.get_data(size)
|
||||
status_code = rpc_data[0]
|
||||
if status_code != OK:
|
||||
push_error("'receive_packages:' Can't get_data(%d) for package, error: %s" % [size, error_string(status_code)])
|
||||
continue
|
||||
data_package = rpc_data[1]
|
||||
else:
|
||||
data_package = buffer[1]
|
||||
|
||||
var json := data_package.get_string_from_utf16()
|
||||
if json.is_empty():
|
||||
push_warning("json is empty, can't process data")
|
||||
continue
|
||||
var data := RPC.deserialize(json)
|
||||
received_packages.append(data)
|
||||
rpc_cb.call(data)
|
||||
return received_packages
|
||||
|
||||
|
||||
static func noop(_rpc_data: RPC) -> void:
|
||||
pass
|
||||
Reference in New Issue
Block a user