fix some tests (#29729)

* non airlock stuff

* pain unending

* comment local test define back out

* this needs a room to spawn mobs in
This commit is contained in:
warriorstar-orion
2025-07-09 14:16:36 +00:00
committed by GitHub
parent ec374c69d5
commit 064f0ce221
20 changed files with 102 additions and 89 deletions
+54 -43
View File
@@ -57,30 +57,12 @@ GLOBAL_LIST_EMPTY(game_test_tguis)
//Bit of metadata for the future maybe
var/list/procs_tested
//usable vars
var/list/available_turfs
//internal shit
// failure tracking
var/succeeded = TRUE
var/list/allocated
var/list/fail_reasons
var/testing_area_name = "test_generic.dmm"
var/obj/effect/landmark/bottom_left
var/obj/effect/landmark/top_right
/datum/game_test/New()
if(!length(available_turfs))
load_testing_area()
available_turfs = get_test_turfs()
/datum/game_test/proc/load_testing_area()
var/list/testing_levels = levels_by_trait(GAME_TEST_LEVEL)
if(!length(testing_levels))
Fail("Could not find appropriate z-level for spawning test areas")
var/testing_z_level = pick(testing_levels)
var/datum/map_template/generic_test_area = GLOB.map_templates[testing_area_name]
if(!generic_test_area.load(locate(TRANSITIONEDGE + 1, TRANSITIONEDGE + 1, testing_z_level)))
Fail("Could not place generic testing area on z-level [testing_z_level]")
/datum/game_test/Destroy()
QDEL_LIST_CONTENTS(allocated)
@@ -89,11 +71,6 @@ GLOBAL_LIST_EMPTY(game_test_tguis)
for(var/atom/movable/AM in T)
qdel(AM)
// Gotta destroy these landmarks so the next test
// doesn't end up seeing them if it tries to load a new map
qdel(bottom_left)
qdel(top_right)
return ..()
/datum/game_test/proc/Run()
@@ -107,7 +84,59 @@ GLOBAL_LIST_EMPTY(game_test_tguis)
LAZYADD(fail_reasons, list(list(reason, file, line)))
/datum/game_test/proc/get_test_turfs()
/datum/game_test/proc/get_available_turfs()
return get_area_turfs(findEventArea())
/// Allocates an instance of the provided type, and places it somewhere in an available loc
/// Instances allocated through this proc will be destroyed when the test is over
/datum/game_test/proc/allocate(type, ...)
var/list/arguments = args.Copy(2)
if(ispath(type, /atom))
if(!arguments.len)
arguments = list(pick(get_available_turfs()))
else if(arguments[1] == null)
arguments[1] = pick(get_available_turfs())
var/instance
// Byond will throw an index out of bounds if arguments is empty in that arglist call. Sigh
if(length(arguments))
instance = new type(arglist(arguments))
else
instance = new type()
LAZYADD(allocated, instance)
return instance
/datum/game_test/room_test
var/list/available_turfs
var/testing_area_name = "test_generic.dmm"
var/obj/effect/landmark/bottom_left
var/obj/effect/landmark/top_right
/datum/game_test/room_test/New()
. = ..()
if(!length(available_turfs))
load_testing_area()
available_turfs = get_test_turfs()
/datum/game_test/room_test/Destroy()
. = ..()
// Gotta destroy these landmarks so the next test
// doesn't end up seeing them if it tries to load a new map
qdel(bottom_left)
qdel(top_right)
/datum/game_test/room_test/get_available_turfs()
return available_turfs
/datum/game_test/room_test/proc/load_testing_area()
var/list/testing_levels = levels_by_trait(GAME_TEST_LEVEL)
if(!length(testing_levels))
Fail("Could not find appropriate z-level for spawning test areas")
var/testing_z_level = pick(testing_levels)
var/datum/map_template/generic_test_area = GLOB.map_templates[testing_area_name]
if(!generic_test_area.load(locate(TRANSITIONEDGE + 1, TRANSITIONEDGE + 1, testing_z_level)))
Fail("Could not place generic testing area on z-level [testing_z_level]")
/datum/game_test/room_test/proc/get_test_turfs()
var/list/result = list()
for(var/obj/effect/landmark in GLOB.landmarks_list)
if(istype(landmark, /obj/effect/landmark/game_test/bottom_left_corner))
@@ -125,21 +154,3 @@ GLOBAL_LIST_EMPTY(game_test_tguis)
Fail("could not find any test turfs")
return result
/// Allocates an instance of the provided type, and places it somewhere in an available loc
/// Instances allocated through this proc will be destroyed when the test is over
/datum/game_test/proc/allocate(type, ...)
var/list/arguments = args.Copy(2)
if(ispath(type, /atom))
if(!arguments.len)
arguments = list(pick(available_turfs))
else if(arguments[1] == null)
arguments[1] = pick(available_turfs)
var/instance
// Byond will throw an index out of bounds if arguments is empty in that arglist call. Sigh
if(length(arguments))
instance = new type(arglist(arguments))
else
instance = new type()
LAZYADD(allocated, instance)
return instance
+4 -4
View File
@@ -1,4 +1,4 @@
/datum/game_test/ventcrawl
/datum/game_test/room_test/ventcrawl
var/mob/living/simple_animal/slime = null
var/obj/machinery/vent = null
var/obj/structure/table/table = null
@@ -6,7 +6,7 @@
/datum/milla_safe_must_sleep/ventcrawl_test_setup
/datum/milla_safe_must_sleep/ventcrawl_test_setup/on_run(datum/game_test/ventcrawl/test)
/datum/milla_safe_must_sleep/ventcrawl_test_setup/on_run(datum/game_test/room_test/ventcrawl/test)
// I'm sure get_area_turfs is totally deterministic and this will never go wrong
var/turf/run_loc_bottom_left = test.available_turfs[1]
// This setup creates turfs that initialize themselves in MILLA on creation, which is why we need to be MILLA-safe.
@@ -19,13 +19,13 @@
test.table = test.find_spawned_test_object(get_step(run_loc_bottom_left, EAST), /obj/structure/table)
test.setup_complete = TRUE
/datum/game_test/ventcrawl/proc/find_spawned_test_object(turf/location as turf, test_object_type)
/datum/game_test/room_test/ventcrawl/proc/find_spawned_test_object(turf/location as turf, test_object_type)
for(var/content in location.contents)
if(istype(content, test_object_type))
return content
TEST_FAIL("Couldn't find spawned test object of type: [test_object_type].")
/datum/game_test/ventcrawl/Run()
/datum/game_test/room_test/ventcrawl/Run()
var/datum/milla_safe_must_sleep/ventcrawl_test_setup/milla = new()
milla.invoke_async(src)
while(!setup_complete)
@@ -1,4 +1,4 @@
/datum/game_test/attack_chain_borgs/Run()
/datum/game_test/room_test/attack_chain_borgs/Run()
var/datum/test_puppeteer/player = new(src)
player.puppet.name = "Player"
@@ -1,4 +1,4 @@
/datum/game_test/attack_chain_cult_dagger/Run()
/datum/game_test/room_test/attack_chain_cult_dagger/Run()
var/datum/test_puppeteer/cultist = new(src)
var/datum/test_puppeteer/target = cultist.spawn_puppet_nearby()
@@ -1,21 +1,21 @@
/datum/game_test/attack_chain_machinery
/datum/game_test/room_test/attack_chain_machinery
testing_area_name = "test_attack_chain_machinery.dmm"
var/list/machine_instances_by_type = list()
/datum/game_test/attack_chain_machinery/proc/teleport_to_first(datum/test_puppeteer/player, obj_type, dir=EAST)
/datum/game_test/room_test/attack_chain_machinery/proc/teleport_to_first(datum/test_puppeteer/player, obj_type, dir=EAST)
if(length(machine_instances_by_type[obj_type]))
var/machine = machine_instances_by_type[obj_type][1]
player.puppet.forceMove(get_step(machine, dir))
return machine
TEST_FAIL("could not find [obj_type] to teleport puppet to")
/datum/game_test/attack_chain_machinery/New()
/datum/game_test/room_test/attack_chain_machinery/New()
. = ..()
for(var/turf/T in available_turfs)
for(var/obj/machinery/machine in T)
LAZYOR(machine_instances_by_type[machine.type], machine)
/datum/game_test/attack_chain_machinery/Run()
/datum/game_test/room_test/attack_chain_machinery/Run()
var/datum/test_puppeteer/player = new(src)
// Here we fucking go. There's a lot of machines and interactions to test
@@ -1,4 +1,4 @@
/datum/game_test/attack_chain_mobs/Run()
/datum/game_test/room_test/attack_chain_mobs/Run()
var/datum/test_puppeteer/player = new(src)
player.puppet.name = "Player"
// To ensure punches do damage without knockdowns
@@ -115,6 +115,6 @@
// Even before this test, butchering items included a second attack message
TEST_ASSERT_ANY_CHATLOG(player, "You hack off a chunk of meat from Victim")
/datum/game_test/attack_chain_mobs/proc/cancel_attack_chain(datum/source, mob/user)
/datum/game_test/room_test/attack_chain_mobs/proc/cancel_attack_chain(datum/source, mob/user)
to_chat(user, "Attack chain cancelled by signal")
return COMPONENT_CANCEL_ATTACK_CHAIN
@@ -1,4 +1,4 @@
/datum/game_test/attack_chain_applicator/Run()
/datum/game_test/room_test/attack_chain_applicator/Run()
var/datum/test_puppeteer/player = new(src)
var/datum/test_puppeteer/target = player.spawn_puppet_nearby()
var/obj/item/reagent_containers/applicator/mender = player.spawn_obj_in_hand(/obj/item/reagent_containers/applicator/burn)
@@ -32,7 +32,7 @@
items = list(/obj/item/food/grown/apple)
result = /obj/item/food/badrecipe
/datum/game_test/attack_chain_condiment/Run()
/datum/game_test/room_test/attack_chain_condiment/Run()
var/datum/test_puppeteer/player = new(src)
var/obj/item/reagent_containers/saltshaker = player.spawn_obj_in_hand(/obj/item/reagent_containers/condiment/saltshaker)
@@ -70,7 +70,7 @@
player.click_on(backpack)
TEST_ASSERT_LAST_CHATLOG(player, "You put")
/datum/game_test/attack_chain_drinks/Run()
/datum/game_test/room_test/attack_chain_drinks/Run()
var/datum/test_puppeteer/player = new(src)
var/obj/structure/reagent_dispensers/watertank/watertank = player.spawn_obj_nearby(/obj/structure/reagent_dispensers/watertank)
var/obj/item/reagent_containers/glass/bucket/bucket = player.spawn_obj_nearby(/obj/item/reagent_containers/glass/bucket)
@@ -195,7 +195,7 @@
player.use_item_in_hand()
TEST_ASSERT_LAST_CHATLOG(player, "The dancing flame on the flaming shot glass of Vodka dies out.")
/datum/game_test/attack_chain_medcontainers/Run()
/datum/game_test/room_test/attack_chain_medcontainers/Run()
var/datum/test_puppeteer/player = new(src)
var/datum/test_puppeteer/target = player.spawn_puppet_nearby()
@@ -245,7 +245,7 @@
player.click_on(pill_bottle)
TEST_ASSERT_LAST_CHATLOG(player, "You put [pill] into [pill_bottle].")
/datum/game_test/attack_chain_syringes/Run()
/datum/game_test/room_test/attack_chain_syringes/Run()
var/datum/test_puppeteer/player = new(src)
var/datum/test_puppeteer/target = player.spawn_puppet_nearby()
@@ -272,7 +272,7 @@
player.click_on(beaker)
TEST_ASSERT_LAST_CHATLOG(player, "You inject 5 units of the solution")
/datum/game_test/attack_chain_iv_bags/Run()
/datum/game_test/room_test/attack_chain_iv_bags/Run()
var/datum/test_puppeteer/player = new(src)
var/datum/test_puppeteer/target = player.spawn_puppet_nearby()
@@ -298,7 +298,7 @@
player.click_on(beaker)
TEST_ASSERT_LAST_CHATLOG(player, "You transfer 1 units of the solution to [beaker]")
/datum/game_test/attack_chain_chemistry_bags/Run()
/datum/game_test/room_test/attack_chain_chemistry_bags/Run()
var/datum/test_puppeteer/player = new(src)
var/obj/table = player.spawn_obj_nearby(/obj/structure/table)
@@ -319,7 +319,7 @@
player.click_on(chem_bag)
TEST_ASSERT_LAST_CHATLOG(player, "You put [patch] into [chem_bag]")
/datum/game_test/attack_chain_rags/Run()
/datum/game_test/room_test/attack_chain_rags/Run()
var/datum/test_puppeteer/player = new(src)
var/turf/simulated/floor/floor = get_turf(player.puppet)
new/obj/effect/decal/cleanable/dirt(floor)
@@ -333,7 +333,7 @@
player.click_on(target)
TEST_ASSERT_LAST_CHATLOG(player, "You smother [target.puppet] with [rag]")
/datum/game_test/attack_chain_hyposprays/Run()
/datum/game_test/room_test/attack_chain_hyposprays/Run()
var/datum/test_puppeteer/player = new(src)
var/obj/autoinjector = player.spawn_obj_in_hand(/obj/item/reagent_containers/hypospray/autoinjector/stimpack)
player.click_on_self()
@@ -345,7 +345,7 @@
player.click_on(target)
TEST_ASSERT_ANY_CHATLOG(player, "You inject [target] with [autoinjector]")
/datum/game_test/attack_chain_droppers/Run()
/datum/game_test/room_test/attack_chain_droppers/Run()
var/datum/test_puppeteer/player = new(src)
var/datum/test_puppeteer/target = player.spawn_puppet_nearby()
var/obj/item/reagent_containers/dropper/dropper = player.spawn_obj_in_hand(/obj/item/reagent_containers/dropper)
@@ -357,7 +357,7 @@
TEST_ASSERT_ANY_CHATLOG(player, "[player.puppet] drips something into [target.puppet]'s eyes")
TEST_ASSERT_NOT_CHATLOG(player, "You cannot directly remove reagents from [target.puppet]")
/datum/game_test/attack_chain_spray/Run()
/datum/game_test/room_test/attack_chain_spray/Run()
var/datum/test_puppeteer/player = new(src)
var/obj/item/reagent_containers/spray/spray = player.spawn_obj_in_hand(/obj/item/reagent_containers/spray)
var/obj/structure/table = player.spawn_obj_nearby(/obj/structure/table)
@@ -1,4 +1,4 @@
/datum/game_test/attack_chain_stunbaton/Run()
/datum/game_test/room_test/attack_chain_stunbaton/Run()
var/datum/test_puppeteer/player = new(src)
var/datum/test_puppeteer/target = player.spawn_puppet_nearby()
player.spawn_obj_in_hand(/obj/item/melee/baton/loaded)
@@ -1,4 +1,4 @@
/datum/game_test/attack_chain_turf/Run()
/datum/game_test/room_test/attack_chain_turf/Run()
var/datum/test_puppeteer/player = new(src)
var/area/admin_area = get_area(player.puppet)
@@ -1,4 +1,4 @@
/datum/game_test/attack_chain_vehicles/Run()
/datum/game_test/room_test/attack_chain_vehicles/Run()
var/datum/test_puppeteer/player = new(src)
var/obj/item/key/janitor/janicart_key = player.spawn_obj_in_hand(/obj/item/key/janitor)
var/obj/vehicle/janicart/janicart = player.spawn_obj_nearby(/obj/vehicle/janicart)
@@ -1,4 +1,4 @@
/datum/game_test/attack_chain_toilet/Run()
/datum/game_test/room_test/attack_chain_toilet/Run()
var/datum/test_puppeteer/player = new(src)
var/obj/structure/toilet/toilet = player.spawn_obj_nearby(/obj/structure/toilet, EAST)
@@ -19,14 +19,14 @@
player.use_item_in_hand()
player.put_away(flamethrower)
var/obj/item/crowbar = player.spawn_obj_in_hand(/obj/item/crowbar)
player.spawn_obj_in_hand(/obj/item/crowbar)
player.click_on(toilet)
TEST_ASSERT_LAST_CHATLOG(player, "You lift")
player.puppet.swap_hand()
player.click_on(toilet)
player.click_on(toilet)
TEST_ASSERT_LAST_CHATLOG(player, "The cistern is empty")
var/obj/item/storage/box = player.spawn_obj_in_hand(/obj/item/storage/box)
player.spawn_obj_in_hand(/obj/item/storage/box)
player.click_on(toilet)
TEST_ASSERT_LAST_CHATLOG(player, "You carefully")
player.click_on(toilet)
@@ -35,7 +35,7 @@
player.click_on(toilet)
TEST_ASSERT_LAST_CHATLOG(player, "You replace")
/datum/game_test/attack_chain_shower/Run()
/datum/game_test/room_test/attack_chain_shower/Run()
var/datum/test_puppeteer/player = new(src)
var/obj/machinery/shower = player.spawn_obj_nearby(/obj/machinery/shower, EAST)
@@ -65,7 +65,7 @@
player.put_away(welder)
qdel(player)
/datum/game_test/attack_chain_sink/Run()
/datum/game_test/room_test/attack_chain_sink/Run()
var/datum/test_puppeteer/player = new(src)
var/obj/structure/sink = player.spawn_obj_nearby(/obj/structure/sink, SOUTH)
+2 -2
View File
@@ -1,4 +1,4 @@
/datum/game_test/card_deck/proc/validate_deck(obj/item/deck/deck)
/datum/game_test/room_test/card_deck/proc/validate_deck(obj/item/deck/deck)
var/list/card_count = list()
for(var/datum/playingcard/card in deck.cards)
if(card_count[card.name] == null)
@@ -14,7 +14,7 @@
return TRUE
/datum/game_test/card_deck/Run()
/datum/game_test/room_test/card_deck/Run()
// setup
var/loc = pick(available_turfs)
var/obj/item/deck/cards/cards = allocate(/obj/item/deck/cards, loc)
+1 -1
View File
@@ -1,4 +1,4 @@
/datum/game_test/aicard_icons/Run()
/datum/game_test/room_test/aicard_icons/Run()
var/mob/living/silicon/ai/ai_box = allocate(/mob/living/silicon/ai)
var/obj/item/aicard/int_card = allocate(/obj/item/aicard)
+1 -1
View File
@@ -1,4 +1,4 @@
/datum/game_test/anti_drop_implant/Run()
/datum/game_test/room_test/anti_drop_implant/Run()
var/datum/test_puppeteer/player = new(src)
var/obj/item/organ/internal/cyberimp/brain/anti_drop/anti_drop = new/obj/item/organ/internal/cyberimp/brain/anti_drop
var/obj/item/autosurgeon/organ/syndicate/autosurg = player.spawn_obj_in_hand(/obj/item/autosurgeon/organ/syndicate)
@@ -5,16 +5,16 @@
/// Unit Test that ensure that if we add a specific planning subtree to a basic mob's planning tree, that we also have the operational datum needed for it (component/element).
/// This can be extended to other "mandatory" operational datums for certain subtrees to work.
/datum/game_test/ensure_subtree_operational_datum
/datum/game_test/room_test/ensure_subtree_operational_datum
/// Associated list of mobs that we need to test this on. Key is the typepath of the mob, value is a list of the planning subtree and the operational datums that are required for it.
var/list/testable_mobs = list()
/datum/game_test/ensure_subtree_operational_datum/Run()
/datum/game_test/room_test/ensure_subtree_operational_datum/Run()
gather_testable_mobs()
test_applicable_mobs()
/// First, look for all mobs that have a planning subtree that requires an element, then add it to the list for stuff to test afterwards. Done like this to not have one mumbo proc that's hard to read.
/datum/game_test/ensure_subtree_operational_datum/proc/gather_testable_mobs()
/datum/game_test/room_test/ensure_subtree_operational_datum/proc/gather_testable_mobs()
for(var/mob/living/basic/checkable_mob as anything in subtypesof(/mob/living/basic))
var/datum/ai_controller/testable_controller = initial(checkable_mob.ai_controller)
if(isnull(testable_controller))
@@ -37,7 +37,7 @@
)
/// Then, test the mobs that we've found
/datum/game_test/ensure_subtree_operational_datum/proc/test_applicable_mobs()
/datum/game_test/room_test/ensure_subtree_operational_datum/proc/test_applicable_mobs()
for(var/mob/living/basic/checkable_mob as anything in testable_mobs)
var/list/checkable_mob_data = testable_mobs[checkable_mob]
checkable_mob = allocate(checkable_mob)
+4 -3
View File
@@ -27,7 +27,7 @@
// Run map tests first in case unit tests futz with map state
RunMap()
#endif
#ifdef GAME_TESTS
#if defined(GAME_TESTS) || defined(MAP_TESTS)
Run()
#endif
SSticker.reboot_helper("Unit Test Reboot", "tests ended", 0)
@@ -36,7 +36,7 @@
log_world("Test runner: game tests.")
CHECK_TICK
for(var/I in subtypesof(/datum/game_test))
for(var/I in subtypesof(/datum/game_test) - /datum/game_test/room_test)
var/datum/game_test/test = new I
test_logs[I] = list()
@@ -95,9 +95,10 @@
QDEL_LIST_CONTENTS(tests)
/datum/test_runner/proc/Finalize(emit_failures = FALSE)
set waitfor = FALSE
log_world("Test runner: finalizing.")
var/time = world.timeofday
set waitfor = FALSE
#ifdef LOCAL_GAME_TESTS
emit_failures = TRUE
+1 -1
View File
@@ -1,4 +1,4 @@
/datum/game_test/spawn_humans/Run()
/datum/game_test/room_test/spawn_humans/Run()
for(var/I in 1 to 5)
allocate(/mob/living/carbon/human, pick(available_turfs))