Skip to content

Commit

Permalink
Fix editor warnings and clean up unit tests (#254)
Browse files Browse the repository at this point in the history
  • Loading branch information
bitbrain authored Dec 2, 2023
1 parent b379806 commit b4f477e
Show file tree
Hide file tree
Showing 18 changed files with 105 additions and 92 deletions.
2 changes: 1 addition & 1 deletion addons/beehave/nodes/beehave_tree.gd
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ signal tree_disabled
@export_node_path var actor_node_path : NodePath:
set(anp):
actor_node_path = anp
if actor_node_path:
if actor_node_path != null and str(actor_node_path) != "..":
actor = get_node(actor_node_path)
else:
actor = get_parent()
Expand Down
2 changes: 1 addition & 1 deletion addons/gdUnit4/GdUnitRunner.cfg
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"included":{"res://test/nodes/decorators/time_limiter_test.gd":["test_return_failure_when_child_exceeds_time_limiter"]},"server_port":31002,"skipped":{},"version":"1.0"}
{"included":{"res://test/nodes/decorators/time_limiter_test.gd":["test_reset_when_child_finishes"]},"server_port":31002,"skipped":{},"version":"1.0"}
34 changes: 20 additions & 14 deletions examples/random_tree_example/RandomAction.gd
Original file line number Diff line number Diff line change
Expand Up @@ -6,28 +6,34 @@
@tool
class_name RandomAction extends ActionLeaf


## How often this action changes its return status, in milliseconds.
@export var reset_duration_msec: = 1000


var last_step = 0
var action = 0

## Array of 3 floats signifying the weights of SUCCESS, FAILURE and RUNNING
## statuses respectively.
var weights = [3., 3., 1.]


func _get_random_action():
var sum = 0.
for w in weights:
sum += w
var rnd = randf_range(0, sum)
for i in weights.size():
if rnd <= weights[i]:
return i
rnd -= weights[i]
return weights.size() - 1
var sum = 0.
for w in weights:
sum += w
var rnd = randf_range(0, sum)
for i in weights.size():
if rnd <= weights[i]:
return i
rnd -= weights[i]
return weights.size() - 1


func tick(actor: Node, blackboard: Blackboard) -> int:
var step = Time.get_ticks_msec() / reset_duration_msec
if step != last_step:
action = _get_random_action()
last_step = step
return action
var step = Time.get_ticks_msec() / reset_duration_msec
if step != last_step:
action = _get_random_action()
last_step = step
return action
88 changes: 47 additions & 41 deletions examples/random_tree_example/RandomTree.gd
Original file line number Diff line number Diff line change
@@ -1,63 +1,69 @@
@tool
extends BeehaveTree


@export_range(1, 100) var randomize_node_count: int = 20
@export var randomize_tree: bool = false:
set(v):
if !v:
return
randomize_tree = false
_randomize_tree()
set(v):
if !v:
return
randomize_tree = false
_randomize_tree()


class TNode extends RefCounted:
var children = []
var children = []


var long_name_suffix = "LooooooooongNameSuffix"


func get_name_suffix():
var r = randi_range(0, 0)
if r:
return long_name_suffix
return ""
var r = randi_range(0, 0)
if r:
return long_name_suffix
return ""

var tree_root: TNode
var tree_nodes = []

func _get_random_node():
return tree_nodes[randi_range(0, tree_nodes.size() - 1)]
return tree_nodes[randi_range(0, tree_nodes.size() - 1)]

func _make_random_tree():
# One node (the root) is already created
tree_root = TNode.new()
tree_nodes = [tree_root]
for i in randomize_node_count - 1:
var n = _get_random_node()
var new_node = TNode.new()
n.children.append(new_node)
tree_nodes.append(new_node)
# One node (the root) is already created
tree_root = TNode.new()
tree_nodes = [tree_root]
for i in randomize_node_count - 1:
var n = _get_random_node()
var new_node = TNode.new()
n.children.append(new_node)
tree_nodes.append(new_node)


func _parse_tree_node(parent, node, index: int):
var n
if node.children.size() > 1:
n = SelectorReactiveComposite.new()
n.name = "SelectorReactiveComposite%s-%d" % [get_name_suffix(), index]
elif node.children.size() == 1:
n = InverterDecorator.new()
n.name = "InverterDecorator%s-%d" % [get_name_suffix(), index]
else:
n = RandomAction.new()
n.name = "RandomAction%s-%d" % [get_name_suffix(), index]
parent.add_child(n)
if Engine.is_editor_hint():
n.owner = get_tree().get_edited_scene_root()
var i = 0
for ch in node.children:
_parse_tree_node(n, ch, i)
i += 1
var n
if node.children.size() > 1:
n = SelectorReactiveComposite.new()
n.name = "SelectorReactiveComposite%s-%d" % [get_name_suffix(), index]
elif node.children.size() == 1:
n = InverterDecorator.new()
n.name = "InverterDecorator%s-%d" % [get_name_suffix(), index]
else:
n = RandomAction.new()
n.name = "RandomAction%s-%d" % [get_name_suffix(), index]
parent.add_child(n)
if Engine.is_editor_hint():
n.owner = get_tree().get_edited_scene_root()
var i = 0
for ch in node.children:
_parse_tree_node(n, ch, i)
i += 1


func _randomize_tree():
for ch in get_children():
remove_child(ch)
ch.queue_free()
_make_random_tree()
_parse_tree_node(self, tree_root, 0)
for ch in get_children():
remove_child(ch)
ch.queue_free()
_make_random_tree()
_parse_tree_node(self, tree_root, 0)
4 changes: 4 additions & 0 deletions project.godot
Original file line number Diff line number Diff line change
Expand Up @@ -68,3 +68,7 @@ ui_down={
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194322,"key_label":0,"unicode":0,"echo":false,"script":null)
]
}

[rendering]

renderer/rendering_method="gl_compatibility"
2 changes: 1 addition & 1 deletion test/actions/clear_count_action.gd
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ class_name ClearCountAction extends ActionLeaf

@export var key = "custom_value"

func tick(actor: Node, blackboard: Blackboard) -> int:
func tick(_actor: Node, blackboard: Blackboard) -> int:
if blackboard.has_value(key):
blackboard.erase_value(key)
return SUCCESS
Expand Down
4 changes: 2 additions & 2 deletions test/actions/count_up_action.gd
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,13 @@ class_name CountUpAction extends ActionLeaf
var count = 0
var status = SUCCESS

func tick(actor: Node, blackboard: Blackboard) -> int:
func tick(_actor: Node, blackboard: Blackboard) -> int:
count += 1
blackboard.set_value(key, count)
return status


func interrupt(actor: Node, blackboard: Blackboard) -> void:
func interrupt(_actor: Node, blackboard: Blackboard) -> void:
count = 0
blackboard.set_value(key, count)
status = FAILURE
2 changes: 1 addition & 1 deletion test/actions/mock_action.gd
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ func before_run(actor: Node, blackboard: Blackboard) -> void:
started_running.emit(actor, blackboard)


func tick(actor: Node, blackboard: Blackboard) -> int:
func tick(_actor: Node, _blackboard: Blackboard) -> int:
if tick_count < running_frame_count:
tick_count += 1
return RUNNING
Expand Down
6 changes: 3 additions & 3 deletions test/beehave_tree_test.gd
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,14 @@ func create_scene() -> Node2D:

func test_normal_tick() -> void:
var scene = create_scene()
var runner := scene_runner(scene)
scene_runner(scene)
scene.beehave_tree._physics_process(1.0)
assert_that(scene.beehave_tree.status).is_equal(BeehaveNode.SUCCESS)


func test_nothing_running_before_first_tick() -> void:
var scene = create_scene()
var runner := scene_runner(scene)
scene_runner(scene)
assert_that(scene.beehave_tree.get_running_action()).is_null()
assert_that(scene.beehave_tree.get_last_condition()).is_null()
assert_that(scene.beehave_tree.get_last_condition_status()).is_equal("")
Expand Down Expand Up @@ -55,7 +55,7 @@ func test_reenabled() -> void:

func test_interrupt_running_action() -> void:
var scene = create_scene()
var runner := scene_runner(scene)
scene_runner(scene)
scene.count_up_action.status = BeehaveNode.RUNNING
scene.beehave_tree._physics_process(1.0)
scene.beehave_tree._physics_process(1.0)
Expand Down
4 changes: 2 additions & 2 deletions test/before_after_run_test.gd
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,10 @@ func before_test() -> void:


func test_action_after_run() -> void:
var before_run_callback = func (actor, blackboard):
var before_run_callback = func (_actor, blackboard):
blackboard.set_value("entered", true)

var after_run_callback = func (actor, blackboard):
var after_run_callback = func (_actor, blackboard):
blackboard.set_value("exited", true)

action.started_running.connect(before_run_callback)
Expand Down
2 changes: 1 addition & 1 deletion test/conditions/value_reached_condition.gd
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ class_name ValueReachedCondition extends ConditionLeaf
@export var limit = 2
@export var key = "custom_value"

func tick(actor: Node, blackboard: Blackboard) -> int:
func tick(_actor: Node, blackboard: Blackboard) -> int:
if blackboard.get_value(key, 0) >= limit:
return SUCCESS
else:
Expand Down
10 changes: 5 additions & 5 deletions test/debug/debugger_test.gd
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ func create_scene() -> Node2D:

func test_debugger_renders_correctly():
var scene = create_scene()
var scene_runner = scene_runner(scene)
await scene_runner.simulate_frames(20)
await scene_runner.set_mouse_pos(Vector2(20, 20))
await scene_runner.simulate_mouse_button_press(1)
await scene_runner.simulate_frames(10)
var runner = scene_runner(scene)
await runner.simulate_frames(20)
runner.set_mouse_pos(Vector2(20, 20))
runner.simulate_mouse_button_press(1)
await runner.simulate_frames(10)
2 changes: 0 additions & 2 deletions test/nodes/composites/selector_test.gd
Original file line number Diff line number Diff line change
Expand Up @@ -106,8 +106,6 @@ func test_clear_running_child_after_run() -> void:
func test_not_interrupt_first_after_finished() -> void:
var action3 = auto_free(load(__count_up_action).new())
selector.add_child(action3)
var running_action: Node
var blackboard_name: String = str(actor.get_instance_id())

action1.status = BeehaveNode.RUNNING
action2.status = BeehaveNode.FAILURE
Expand Down
2 changes: 1 addition & 1 deletion test/nodes/decorators/limiter_test.gd
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ func before_test() -> void:
tree.blackboard = blackboard


func test_max_count(count: int, test_parameters: Array = [[2], [0]]) -> void:
func test_max_count(count: int, _test_parameters: Array = [[2], [0]]) -> void:
limiter.max_count = count
action.status = BeehaveNode.RUNNING
for i in range(count):
Expand Down
6 changes: 3 additions & 3 deletions test/nodes/decorators/repeater_test.gd
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ func after_test():
tree.blackboard.set_value("ended", 0)


func test_repetitions(count: int, test_parameters: Array = [[2], [0]]) -> void:
func test_repetitions(count: int, _test_parameters: Array = [[2], [0]]) -> void:
repeater.repetitions = count
action.final_result = BeehaveNode.SUCCESS

Expand Down Expand Up @@ -88,11 +88,11 @@ func test_failure():
assert_int(times_ended).is_equal(2)


func _on_action_started(actor, blackboard):
func _on_action_started(_actor, blackboard):
var started = blackboard.get_value("started", 0)
blackboard.set_value("started", started + 1)


func _on_action_ended(actor, blackboard):
func _on_action_ended(_actor, blackboard):
var ended = blackboard.get_value("ended", 0)
blackboard.set_value("ended", ended + 1)
12 changes: 6 additions & 6 deletions test/nodes/decorators/time_limiter_test.gd
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ func before_test() -> void:
func test_return_failure_when_child_exceeds_time_limiter() -> void:
time_limiter.wait_time = 1.0
action.status = BeehaveNode.RUNNING
await runner.simulate_frames(1)
tree.tick()
assert_that(tree.tick()).is_equal(BeehaveNode.RUNNING)
await runner.simulate_frames(1, 1500)
assert_that(tree.tick()).is_equal(BeehaveNode.FAILURE)
Expand All @@ -46,18 +46,18 @@ func test_return_failure_when_child_exceeds_time_limiter() -> void:
func test_reset_when_child_finishes() -> void:
time_limiter.wait_time = 0.5
action.status = BeehaveNode.RUNNING
await runner.simulate_frames(1, 10)
tree.tick()
assert_that(tree.tick()).is_equal(BeehaveNode.RUNNING)
await runner.simulate_frames(5, 100)
await runner.simulate_frames(2, 500)
action.status = BeehaveNode.SUCCESS
assert_that(tree.tick()).is_equal(BeehaveNode.SUCCESS)


func test_clear_running_child_after_run() -> void:
time_limiter.wait_time = 0.5
time_limiter.wait_time = 1.5
action.status = BeehaveNode.RUNNING
await runner.simulate_frames(1, 50)
tree.tick()
assert_that(time_limiter.running_child).is_equal(action)
action.status = BeehaveNode.SUCCESS
await runner.simulate_frames(1, 50)
await runner.simulate_frames(1, 1600)
assert_that(time_limiter.running_child).is_null()
12 changes: 6 additions & 6 deletions test/nodes/leaves/actions/blackboard_set_test.gd
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ func before_test() -> void:

func test_set_to_constant() -> void:
blackboard_set.value = "0"
var runner: GdUnitSceneRunner = scene_runner(blackboard_set) # run it as a scene, so that _ready gets called
scene_runner(blackboard_set) # run it as a scene, so that _ready gets called
assert_that(blackboard_set.tick(actor, blackboard)).is_equal(BeehaveNode.SUCCESS)
assert_bool(blackboard.has_value(KEY)).is_true()
assert_that(blackboard.get_value(KEY)).is_equal(0)
Expand All @@ -35,33 +35,33 @@ func test_set_to_constant() -> void:
func test_copy_key() -> void:
blackboard.set_value(KEY2, 0)
blackboard_set.value = "get_value('%s')" % [KEY2]
var runner: GdUnitSceneRunner = scene_runner(blackboard_set)
scene_runner(blackboard_set)
assert_that(blackboard_set.tick(actor, blackboard)).is_equal(BeehaveNode.SUCCESS)
assert_that(blackboard.get_value(KEY)).is_equal(blackboard.get_value(KEY2)) # properly copy values from one key to another


func test_invalid_expression() -> void:
blackboard_set.value = "this is not a valid expression"
var runner: GdUnitSceneRunner = scene_runner(blackboard_set)
scene_runner(blackboard_set)
assert_that(blackboard_set.tick(actor, blackboard)).is_equal(BeehaveNode.FAILURE)
assert_bool(blackboard.has_value(KEY)).is_false()


func test_set_vector3() -> void:
blackboard_set.value = "Vector3(0,0,0)"
var runner: GdUnitSceneRunner = scene_runner(blackboard_set)
scene_runner(blackboard_set)
assert_that(blackboard_set.tick(actor, blackboard)).is_equal(BeehaveNode.SUCCESS)
assert_bool(blackboard.has_value(KEY)).is_true()
assert_that(blackboard.get_value(KEY)).is_equal(Vector3(0,0,0))


func test_invalid_key_expression() -> void:
blackboard_set.key = "this is invalid!!!"
var runner: GdUnitSceneRunner = scene_runner(blackboard_set)
scene_runner(blackboard_set)
assert_that(blackboard_set.tick(actor, blackboard)).is_equal(BeehaveNode.FAILURE)


func test_invalid_value_expression() -> void:
blackboard_set.value = "this is invalid!!!"
var runner: GdUnitSceneRunner = scene_runner(blackboard_set)
scene_runner(blackboard_set)
assert_that(blackboard_set.tick(actor, blackboard)).is_equal(BeehaveNode.FAILURE)
Loading

0 comments on commit b4f477e

Please sign in to comment.