PSF-BotServer/common/src/test/scala/objects/DeployableToolboxTest.scala
Fate-JH 9340777c00
Router and Telepad (#232)
* added short and detailed codecs for Telepad, and converter for switching between Telepad and packets; modified Utility to construct a formal TeleportPadTerminal that associates the Telepad with a Router; can now pull telepad Equipment from Router terminal utilities

* this code supports operation of the deployable-side telepad

* basic teleportation between the Router and the remote telepad is functional; an ever-present internal telepad utility was added to the Router to facilitate this teleportation

* breakdown of Router teleportation code for the purposes of client synchronization; supports Router being set up first or Telepad being set up first, either order; background timer for eventual activation of Router

* refactored the router telepad system to remove unecessary function diversions; telepads now are properly linked where appropriate and links are properly broken in appropriate situations; message passing has been simplified

* fixed inventory size of the telepad; transferred router telepad activation systems from VehicleService to LocalService, and from the Ruoter to the TelepadDeployable; cleaned up code that handled the TelepadDeployable the Router relationship in WSA

* tests, mostly; no-router conditions for certain telepad-related converters

* adjusted (made constant) quantities for owned telepads

* resolved issue with router and telepad crashes; properly handles deployment states of AMS and Router upon zone entry; changed ownership/decon requirements to ownerless only
2018-10-17 12:36:43 -04:00

1058 lines
59 KiB
Scala

// Copyright (c) 2017 PSForever
package objects
import net.psforever.objects._
import net.psforever.objects.avatar.DeployableToolbox
import net.psforever.objects.ce.{DeployableCategory, DeployedItem}
import net.psforever.packet.game.PlanetSideGUID
import net.psforever.types.CertificationType._
import org.specs2.mutable.Specification
class DeployableToolboxTest extends Specification {
"DeployableToolbbox" should {
"construct" in {
new DeployableToolbox //should just construct without issue
ok
}
"initialization (default)" in {
val obj = new DeployableToolbox
obj.Initialize(Set())
val list = obj.UpdateUI()
list.size mustEqual DeployedItem.values.size - 3 //extra field turrets
val (routers, allOthers) = list.partition({ case((_,_,_,max)) => max == 1024 })
allOthers.foreach({case(_,curr,_,max) =>
curr mustEqual 0
max mustEqual 0
})
routers.length mustEqual 1
ok
}
"initialization (CombatEngineering)" in {
val obj = new DeployableToolbox
obj.Initialize(Set(CombatEngineering))
obj.CountDeployable(DeployedItem.boomer)._2 mustEqual 20
obj.CountDeployable(DeployedItem.he_mine)._2 mustEqual 20
obj.CountDeployable(DeployedItem.spitfire_turret)._2 mustEqual 10
obj.CountDeployable(DeployedItem.motionalarmsensor)._2 mustEqual 20
obj.CountDeployable(DeployedItem.jammer_mine)._2 mustEqual 0
obj.CountDeployable(DeployedItem.spitfire_cloaked)._2 mustEqual 0
obj.CountDeployable(DeployedItem.spitfire_aa)._2 mustEqual 0
obj.CountDeployable(DeployedItem.sensor_shield)._2 mustEqual 0
obj.CountDeployable(DeployedItem.tank_traps)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret_nc)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret_tr)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret_vs)._2 mustEqual 0
obj.CountDeployable(DeployedItem.deployable_shield_generator)._2 mustEqual 0
obj.CountDeployable(DeployedItem.router_telepad_deployable)._2 mustEqual 1024
}
"initialization (AssaultEngineering)" in {
val obj = new DeployableToolbox
obj.Initialize(Set(CombatEngineering, AssaultEngineering))
obj.CountDeployable(DeployedItem.boomer)._2 mustEqual 20
obj.CountDeployable(DeployedItem.he_mine)._2 mustEqual 20
obj.CountDeployable(DeployedItem.spitfire_turret)._2 mustEqual 10
obj.CountDeployable(DeployedItem.motionalarmsensor)._2 mustEqual 20
obj.CountDeployable(DeployedItem.jammer_mine)._2 mustEqual 20
obj.CountDeployable(DeployedItem.spitfire_cloaked)._2 mustEqual 0
obj.CountDeployable(DeployedItem.spitfire_aa)._2 mustEqual 0
obj.CountDeployable(DeployedItem.sensor_shield)._2 mustEqual 0
obj.CountDeployable(DeployedItem.tank_traps)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret)._2 mustEqual 1
obj.CountDeployable(DeployedItem.portable_manned_turret_nc)._2 mustEqual 1
obj.CountDeployable(DeployedItem.portable_manned_turret_tr)._2 mustEqual 1
obj.CountDeployable(DeployedItem.portable_manned_turret_vs)._2 mustEqual 1
obj.CountDeployable(DeployedItem.deployable_shield_generator)._2 mustEqual 1
obj.CountDeployable(DeployedItem.router_telepad_deployable)._2 mustEqual 1024
}
"initialization (FortificationEngineering)" in {
val obj = new DeployableToolbox
obj.Initialize(Set(CombatEngineering, FortificationEngineering))
obj.CountDeployable(DeployedItem.boomer)._2 mustEqual 25
obj.CountDeployable(DeployedItem.he_mine)._2 mustEqual 25
obj.CountDeployable(DeployedItem.spitfire_turret)._2 mustEqual 15
obj.CountDeployable(DeployedItem.motionalarmsensor)._2 mustEqual 25
obj.CountDeployable(DeployedItem.jammer_mine)._2 mustEqual 0
obj.CountDeployable(DeployedItem.spitfire_cloaked)._2 mustEqual 5
obj.CountDeployable(DeployedItem.spitfire_aa)._2 mustEqual 5
obj.CountDeployable(DeployedItem.sensor_shield)._2 mustEqual 0
obj.CountDeployable(DeployedItem.tank_traps)._2 mustEqual 5
obj.CountDeployable(DeployedItem.portable_manned_turret)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret_nc)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret_tr)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret_vs)._2 mustEqual 0
obj.CountDeployable(DeployedItem.deployable_shield_generator)._2 mustEqual 0
obj.CountDeployable(DeployedItem.router_telepad_deployable)._2 mustEqual 1024
}
"initialization (AdvancedEngineering)" in {
val obj = new DeployableToolbox
obj.Initialize(Set(AdvancedEngineering))
obj.CountDeployable(DeployedItem.boomer)._2 mustEqual 25
obj.CountDeployable(DeployedItem.he_mine)._2 mustEqual 25
obj.CountDeployable(DeployedItem.spitfire_turret)._2 mustEqual 15
obj.CountDeployable(DeployedItem.motionalarmsensor)._2 mustEqual 25
obj.CountDeployable(DeployedItem.jammer_mine)._2 mustEqual 20
obj.CountDeployable(DeployedItem.spitfire_cloaked)._2 mustEqual 5
obj.CountDeployable(DeployedItem.spitfire_aa)._2 mustEqual 5
obj.CountDeployable(DeployedItem.sensor_shield)._2 mustEqual 0
obj.CountDeployable(DeployedItem.tank_traps)._2 mustEqual 5
obj.CountDeployable(DeployedItem.portable_manned_turret)._2 mustEqual 1
obj.CountDeployable(DeployedItem.portable_manned_turret_nc)._2 mustEqual 1
obj.CountDeployable(DeployedItem.portable_manned_turret_tr)._2 mustEqual 1
obj.CountDeployable(DeployedItem.portable_manned_turret_vs)._2 mustEqual 1
obj.CountDeployable(DeployedItem.deployable_shield_generator)._2 mustEqual 1
obj.CountDeployable(DeployedItem.router_telepad_deployable)._2 mustEqual 1024
}
"initialization (AdvancedHacking)" in {
val obj = new DeployableToolbox
obj.Initialize(Set(CombatEngineering, AdvancedHacking))
obj.CountDeployable(DeployedItem.boomer)._2 mustEqual 20
obj.CountDeployable(DeployedItem.he_mine)._2 mustEqual 20
obj.CountDeployable(DeployedItem.spitfire_turret)._2 mustEqual 10
obj.CountDeployable(DeployedItem.motionalarmsensor)._2 mustEqual 20
obj.CountDeployable(DeployedItem.jammer_mine)._2 mustEqual 0
obj.CountDeployable(DeployedItem.spitfire_cloaked)._2 mustEqual 0
obj.CountDeployable(DeployedItem.spitfire_aa)._2 mustEqual 0
obj.CountDeployable(DeployedItem.sensor_shield)._2 mustEqual 20
obj.CountDeployable(DeployedItem.tank_traps)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret_nc)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret_tr)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret_vs)._2 mustEqual 0
obj.CountDeployable(DeployedItem.deployable_shield_generator)._2 mustEqual 0
obj.CountDeployable(DeployedItem.router_telepad_deployable)._2 mustEqual 1024
}
"initialization (without CombatEngineering)" in {
val obj = new DeployableToolbox
obj.Initialize(Set(AssaultEngineering, FortificationEngineering, AdvancedHacking))
obj.CountDeployable(DeployedItem.boomer)._2 mustEqual 0
obj.CountDeployable(DeployedItem.he_mine)._2 mustEqual 0
obj.CountDeployable(DeployedItem.spitfire_turret)._2 mustEqual 0
obj.CountDeployable(DeployedItem.motionalarmsensor)._2 mustEqual 0
obj.CountDeployable(DeployedItem.jammer_mine)._2 mustEqual 0
obj.CountDeployable(DeployedItem.spitfire_cloaked)._2 mustEqual 0
obj.CountDeployable(DeployedItem.spitfire_aa)._2 mustEqual 0
obj.CountDeployable(DeployedItem.sensor_shield)._2 mustEqual 0
obj.CountDeployable(DeployedItem.tank_traps)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret_nc)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret_tr)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret_vs)._2 mustEqual 0
obj.CountDeployable(DeployedItem.deployable_shield_generator)._2 mustEqual 0
obj.CountDeployable(DeployedItem.router_telepad_deployable)._2 mustEqual 1024
}
"initialization (GroundSupport)" in {
val obj = new DeployableToolbox
obj.Initialize(Set(GroundSupport))
obj.CountDeployable(DeployedItem.boomer)._2 mustEqual 0
obj.CountDeployable(DeployedItem.he_mine)._2 mustEqual 0
obj.CountDeployable(DeployedItem.spitfire_turret)._2 mustEqual 0
obj.CountDeployable(DeployedItem.motionalarmsensor)._2 mustEqual 0
obj.CountDeployable(DeployedItem.jammer_mine)._2 mustEqual 0
obj.CountDeployable(DeployedItem.spitfire_cloaked)._2 mustEqual 0
obj.CountDeployable(DeployedItem.spitfire_aa)._2 mustEqual 0
obj.CountDeployable(DeployedItem.sensor_shield)._2 mustEqual 0
obj.CountDeployable(DeployedItem.tank_traps)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret_nc)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret_tr)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret_vs)._2 mustEqual 0
obj.CountDeployable(DeployedItem.deployable_shield_generator)._2 mustEqual 0
obj.CountDeployable(DeployedItem.router_telepad_deployable)._2 mustEqual 1024
}
"can not initialize twice" in {
val obj = new DeployableToolbox
obj.Initialize(Set()) mustEqual true
obj.CountDeployable(DeployedItem.boomer)._2 mustEqual 0
obj.CountDeployable(DeployedItem.he_mine)._2 mustEqual 0
obj.CountDeployable(DeployedItem.spitfire_turret)._2 mustEqual 0
obj.CountDeployable(DeployedItem.motionalarmsensor)._2 mustEqual 0
obj.CountDeployable(DeployedItem.jammer_mine)._2 mustEqual 0
obj.CountDeployable(DeployedItem.spitfire_cloaked)._2 mustEqual 0
obj.CountDeployable(DeployedItem.spitfire_aa)._2 mustEqual 0
obj.CountDeployable(DeployedItem.sensor_shield)._2 mustEqual 0
obj.CountDeployable(DeployedItem.tank_traps)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret_nc)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret_tr)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret_vs)._2 mustEqual 0
obj.CountDeployable(DeployedItem.deployable_shield_generator)._2 mustEqual 0
obj.CountDeployable(DeployedItem.router_telepad_deployable)._2 mustEqual 1024
obj.Initialize(Set(AdvancedEngineering)) mustEqual false
obj.CountDeployable(DeployedItem.boomer)._2 mustEqual 0
obj.CountDeployable(DeployedItem.he_mine)._2 mustEqual 0
obj.CountDeployable(DeployedItem.spitfire_turret)._2 mustEqual 0
obj.CountDeployable(DeployedItem.motionalarmsensor)._2 mustEqual 0
obj.CountDeployable(DeployedItem.jammer_mine)._2 mustEqual 0
obj.CountDeployable(DeployedItem.spitfire_cloaked)._2 mustEqual 0
obj.CountDeployable(DeployedItem.spitfire_aa)._2 mustEqual 0
obj.CountDeployable(DeployedItem.sensor_shield)._2 mustEqual 0
obj.CountDeployable(DeployedItem.tank_traps)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret_nc)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret_tr)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret_vs)._2 mustEqual 0
obj.CountDeployable(DeployedItem.deployable_shield_generator)._2 mustEqual 0
obj.CountDeployable(DeployedItem.router_telepad_deployable)._2 mustEqual 1024
}
"uninitialized fields can not accept deployables" in {
val obj = new DeployableToolbox
obj.CountDeployable(DeployedItem.boomer)._2 mustEqual 0
val boomer = new BoomerDeployable(GlobalDefinitions.boomer)
obj.Accept(boomer) mustEqual false
obj.Add(boomer) mustEqual false
obj.CountDeployable(DeployedItem.boomer)._2 mustEqual 0
}
"only initialized fields can accept deployables" in {
val obj = new DeployableToolbox
obj.CountDeployable(DeployedItem.boomer)._2 mustEqual 0
obj.Initialize(Set(CombatEngineering))
obj.CountDeployable(DeployedItem.boomer)._2 mustEqual 20
val boomer = new BoomerDeployable(GlobalDefinitions.boomer)
obj.Accept(boomer) mustEqual true
obj.Add(boomer) mustEqual true
obj.CountDeployable(DeployedItem.boomer).productIterator.toList mustEqual List(1, 20)
}
"change accessible fields by adding by certification type (CombatEngineering ...)" in {
val obj = new DeployableToolbox
obj.Initialize(Set())
obj.CountDeployable(DeployedItem.boomer)._2 mustEqual 0
obj.CountDeployable(DeployedItem.he_mine)._2 mustEqual 0
obj.CountDeployable(DeployedItem.spitfire_turret)._2 mustEqual 0
obj.CountDeployable(DeployedItem.motionalarmsensor)._2 mustEqual 0
obj.CountDeployable(DeployedItem.jammer_mine)._2 mustEqual 0
obj.CountDeployable(DeployedItem.spitfire_cloaked)._2 mustEqual 0
obj.CountDeployable(DeployedItem.spitfire_aa)._2 mustEqual 0
obj.CountDeployable(DeployedItem.sensor_shield)._2 mustEqual 0
obj.CountDeployable(DeployedItem.tank_traps)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret_nc)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret_tr)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret_vs)._2 mustEqual 0
obj.CountDeployable(DeployedItem.deployable_shield_generator)._2 mustEqual 0
obj.CountDeployable(DeployedItem.router_telepad_deployable)._2 mustEqual 1024
obj.AddToDeployableQuantities(
CombatEngineering,
Set(CombatEngineering)
)
obj.CountDeployable(DeployedItem.boomer)._2 mustEqual 20
obj.CountDeployable(DeployedItem.he_mine)._2 mustEqual 20
obj.CountDeployable(DeployedItem.spitfire_turret)._2 mustEqual 10
obj.CountDeployable(DeployedItem.motionalarmsensor)._2 mustEqual 20
obj.CountDeployable(DeployedItem.jammer_mine)._2 mustEqual 0
obj.CountDeployable(DeployedItem.spitfire_cloaked)._2 mustEqual 0
obj.CountDeployable(DeployedItem.spitfire_aa)._2 mustEqual 0
obj.CountDeployable(DeployedItem.sensor_shield)._2 mustEqual 0
obj.CountDeployable(DeployedItem.tank_traps)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret_nc)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret_tr)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret_vs)._2 mustEqual 0
obj.CountDeployable(DeployedItem.deployable_shield_generator)._2 mustEqual 0
obj.CountDeployable(DeployedItem.router_telepad_deployable)._2 mustEqual 1024
obj.AddToDeployableQuantities(
FortificationEngineering,
Set(CombatEngineering, FortificationEngineering)
)
obj.CountDeployable(DeployedItem.boomer)._2 mustEqual 25
obj.CountDeployable(DeployedItem.he_mine)._2 mustEqual 25
obj.CountDeployable(DeployedItem.spitfire_turret)._2 mustEqual 15
obj.CountDeployable(DeployedItem.motionalarmsensor)._2 mustEqual 25
obj.CountDeployable(DeployedItem.jammer_mine)._2 mustEqual 0
obj.CountDeployable(DeployedItem.spitfire_cloaked)._2 mustEqual 5
obj.CountDeployable(DeployedItem.spitfire_aa)._2 mustEqual 5
obj.CountDeployable(DeployedItem.sensor_shield)._2 mustEqual 0
obj.CountDeployable(DeployedItem.tank_traps)._2 mustEqual 5
obj.CountDeployable(DeployedItem.portable_manned_turret)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret_nc)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret_tr)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret_vs)._2 mustEqual 0
obj.CountDeployable(DeployedItem.deployable_shield_generator)._2 mustEqual 0
obj.CountDeployable(DeployedItem.router_telepad_deployable)._2 mustEqual 1024
obj.AddToDeployableQuantities(
AssaultEngineering,
Set(CombatEngineering, FortificationEngineering, AssaultEngineering)
)
obj.CountDeployable(DeployedItem.boomer)._2 mustEqual 25
obj.CountDeployable(DeployedItem.he_mine)._2 mustEqual 25
obj.CountDeployable(DeployedItem.spitfire_turret)._2 mustEqual 15
obj.CountDeployable(DeployedItem.motionalarmsensor)._2 mustEqual 25
obj.CountDeployable(DeployedItem.jammer_mine)._2 mustEqual 20
obj.CountDeployable(DeployedItem.spitfire_cloaked)._2 mustEqual 5
obj.CountDeployable(DeployedItem.spitfire_aa)._2 mustEqual 5
obj.CountDeployable(DeployedItem.sensor_shield)._2 mustEqual 0
obj.CountDeployable(DeployedItem.tank_traps)._2 mustEqual 5
obj.CountDeployable(DeployedItem.portable_manned_turret)._2 mustEqual 1
obj.CountDeployable(DeployedItem.portable_manned_turret_nc)._2 mustEqual 1
obj.CountDeployable(DeployedItem.portable_manned_turret_tr)._2 mustEqual 1
obj.CountDeployable(DeployedItem.portable_manned_turret_vs)._2 mustEqual 1
obj.CountDeployable(DeployedItem.deployable_shield_generator)._2 mustEqual 1
obj.CountDeployable(DeployedItem.router_telepad_deployable)._2 mustEqual 1024
obj.AddToDeployableQuantities(
AssaultEngineering,
Set(CombatEngineering, FortificationEngineering, AssaultEngineering)
)
obj.CountDeployable(DeployedItem.boomer)._2 mustEqual 25
obj.CountDeployable(DeployedItem.he_mine)._2 mustEqual 25
obj.CountDeployable(DeployedItem.spitfire_turret)._2 mustEqual 15
obj.CountDeployable(DeployedItem.motionalarmsensor)._2 mustEqual 25
obj.CountDeployable(DeployedItem.jammer_mine)._2 mustEqual 20
obj.CountDeployable(DeployedItem.spitfire_cloaked)._2 mustEqual 5
obj.CountDeployable(DeployedItem.spitfire_aa)._2 mustEqual 5
obj.CountDeployable(DeployedItem.sensor_shield)._2 mustEqual 0
obj.CountDeployable(DeployedItem.tank_traps)._2 mustEqual 5
obj.CountDeployable(DeployedItem.portable_manned_turret)._2 mustEqual 1
obj.CountDeployable(DeployedItem.portable_manned_turret_nc)._2 mustEqual 1
obj.CountDeployable(DeployedItem.portable_manned_turret_tr)._2 mustEqual 1
obj.CountDeployable(DeployedItem.portable_manned_turret_vs)._2 mustEqual 1
obj.CountDeployable(DeployedItem.deployable_shield_generator)._2 mustEqual 1
obj.CountDeployable(DeployedItem.router_telepad_deployable)._2 mustEqual 1024
obj.AddToDeployableQuantities(
AdvancedHacking,
Set(CombatEngineering, FortificationEngineering, AssaultEngineering, AdvancedHacking)
)
obj.CountDeployable(DeployedItem.boomer)._2 mustEqual 25
obj.CountDeployable(DeployedItem.he_mine)._2 mustEqual 25
obj.CountDeployable(DeployedItem.spitfire_turret)._2 mustEqual 15
obj.CountDeployable(DeployedItem.motionalarmsensor)._2 mustEqual 25
obj.CountDeployable(DeployedItem.jammer_mine)._2 mustEqual 20
obj.CountDeployable(DeployedItem.spitfire_cloaked)._2 mustEqual 5
obj.CountDeployable(DeployedItem.spitfire_aa)._2 mustEqual 5
obj.CountDeployable(DeployedItem.sensor_shield)._2 mustEqual 20
obj.CountDeployable(DeployedItem.tank_traps)._2 mustEqual 5
obj.CountDeployable(DeployedItem.portable_manned_turret)._2 mustEqual 1
obj.CountDeployable(DeployedItem.portable_manned_turret_nc)._2 mustEqual 1
obj.CountDeployable(DeployedItem.portable_manned_turret_tr)._2 mustEqual 1
obj.CountDeployable(DeployedItem.portable_manned_turret_vs)._2 mustEqual 1
obj.CountDeployable(DeployedItem.deployable_shield_generator)._2 mustEqual 1
obj.CountDeployable(DeployedItem.router_telepad_deployable)._2 mustEqual 1024
}
"change accessible fields by adding by certification type (GroundSupport)" in {
val obj = new DeployableToolbox
obj.Initialize(Set())
obj.CountDeployable(DeployedItem.boomer)._2 mustEqual 0
obj.CountDeployable(DeployedItem.he_mine)._2 mustEqual 0
obj.CountDeployable(DeployedItem.spitfire_turret)._2 mustEqual 0
obj.CountDeployable(DeployedItem.motionalarmsensor)._2 mustEqual 0
obj.CountDeployable(DeployedItem.jammer_mine)._2 mustEqual 0
obj.CountDeployable(DeployedItem.spitfire_cloaked)._2 mustEqual 0
obj.CountDeployable(DeployedItem.spitfire_aa)._2 mustEqual 0
obj.CountDeployable(DeployedItem.sensor_shield)._2 mustEqual 0
obj.CountDeployable(DeployedItem.tank_traps)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret_nc)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret_tr)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret_vs)._2 mustEqual 0
obj.CountDeployable(DeployedItem.deployable_shield_generator)._2 mustEqual 0
obj.CountDeployable(DeployedItem.router_telepad_deployable)._2 mustEqual 1024
obj.AddToDeployableQuantities(
GroundSupport,
Set(GroundSupport)
)
obj.CountDeployable(DeployedItem.boomer)._2 mustEqual 0
obj.CountDeployable(DeployedItem.he_mine)._2 mustEqual 0
obj.CountDeployable(DeployedItem.spitfire_turret)._2 mustEqual 0
obj.CountDeployable(DeployedItem.motionalarmsensor)._2 mustEqual 0
obj.CountDeployable(DeployedItem.jammer_mine)._2 mustEqual 0
obj.CountDeployable(DeployedItem.spitfire_cloaked)._2 mustEqual 0
obj.CountDeployable(DeployedItem.spitfire_aa)._2 mustEqual 0
obj.CountDeployable(DeployedItem.sensor_shield)._2 mustEqual 0
obj.CountDeployable(DeployedItem.tank_traps)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret_nc)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret_tr)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret_vs)._2 mustEqual 0
obj.CountDeployable(DeployedItem.deployable_shield_generator)._2 mustEqual 0
obj.CountDeployable(DeployedItem.router_telepad_deployable)._2 mustEqual 1024
}
"change accessible fields by adding by certification type (AdvancedEngineering)" in {
val obj = new DeployableToolbox
obj.Initialize(Set(CombatEngineering))
obj.CountDeployable(DeployedItem.boomer)._2 mustEqual 20
obj.CountDeployable(DeployedItem.he_mine)._2 mustEqual 20
obj.CountDeployable(DeployedItem.spitfire_turret)._2 mustEqual 10
obj.CountDeployable(DeployedItem.motionalarmsensor)._2 mustEqual 20
obj.CountDeployable(DeployedItem.jammer_mine)._2 mustEqual 0
obj.CountDeployable(DeployedItem.spitfire_cloaked)._2 mustEqual 0
obj.CountDeployable(DeployedItem.spitfire_aa)._2 mustEqual 0
obj.CountDeployable(DeployedItem.sensor_shield)._2 mustEqual 0
obj.CountDeployable(DeployedItem.tank_traps)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret_nc)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret_tr)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret_vs)._2 mustEqual 0
obj.CountDeployable(DeployedItem.deployable_shield_generator)._2 mustEqual 0
obj.CountDeployable(DeployedItem.router_telepad_deployable)._2 mustEqual 1024
obj.AddToDeployableQuantities(
AdvancedEngineering,
Set(CombatEngineering, AdvancedEngineering)
)
obj.CountDeployable(DeployedItem.boomer)._2 mustEqual 25
obj.CountDeployable(DeployedItem.he_mine)._2 mustEqual 25
obj.CountDeployable(DeployedItem.spitfire_turret)._2 mustEqual 15
obj.CountDeployable(DeployedItem.motionalarmsensor)._2 mustEqual 25
obj.CountDeployable(DeployedItem.jammer_mine)._2 mustEqual 20
obj.CountDeployable(DeployedItem.spitfire_cloaked)._2 mustEqual 5
obj.CountDeployable(DeployedItem.spitfire_aa)._2 mustEqual 5
obj.CountDeployable(DeployedItem.sensor_shield)._2 mustEqual 0
obj.CountDeployable(DeployedItem.tank_traps)._2 mustEqual 5
obj.CountDeployable(DeployedItem.portable_manned_turret)._2 mustEqual 1
obj.CountDeployable(DeployedItem.portable_manned_turret_nc)._2 mustEqual 1
obj.CountDeployable(DeployedItem.portable_manned_turret_tr)._2 mustEqual 1
obj.CountDeployable(DeployedItem.portable_manned_turret_vs)._2 mustEqual 1
obj.CountDeployable(DeployedItem.deployable_shield_generator)._2 mustEqual 1
obj.CountDeployable(DeployedItem.router_telepad_deployable)._2 mustEqual 1024
}
"change accessible fields by removing by certification types (all)" in {
val obj = new DeployableToolbox
obj.Initialize(Set(CombatEngineering, AssaultEngineering, FortificationEngineering, AdvancedHacking, GroundSupport))
obj.CountDeployable(DeployedItem.boomer)._2 mustEqual 25
obj.CountDeployable(DeployedItem.he_mine)._2 mustEqual 25
obj.CountDeployable(DeployedItem.spitfire_turret)._2 mustEqual 15
obj.CountDeployable(DeployedItem.motionalarmsensor)._2 mustEqual 25
obj.CountDeployable(DeployedItem.jammer_mine)._2 mustEqual 20
obj.CountDeployable(DeployedItem.spitfire_cloaked)._2 mustEqual 5
obj.CountDeployable(DeployedItem.spitfire_aa)._2 mustEqual 5
obj.CountDeployable(DeployedItem.sensor_shield)._2 mustEqual 20
obj.CountDeployable(DeployedItem.tank_traps)._2 mustEqual 5
obj.CountDeployable(DeployedItem.portable_manned_turret)._2 mustEqual 1
obj.CountDeployable(DeployedItem.portable_manned_turret_nc)._2 mustEqual 1
obj.CountDeployable(DeployedItem.portable_manned_turret_tr)._2 mustEqual 1
obj.CountDeployable(DeployedItem.portable_manned_turret_vs)._2 mustEqual 1
obj.CountDeployable(DeployedItem.deployable_shield_generator)._2 mustEqual 1
obj.CountDeployable(DeployedItem.router_telepad_deployable)._2 mustEqual 1024
obj.RemoveFromDeployableQuantities(
GroundSupport,
Set(CombatEngineering, AssaultEngineering, FortificationEngineering, AdvancedHacking)
)
obj.CountDeployable(DeployedItem.boomer)._2 mustEqual 25
obj.CountDeployable(DeployedItem.he_mine)._2 mustEqual 25
obj.CountDeployable(DeployedItem.spitfire_turret)._2 mustEqual 15
obj.CountDeployable(DeployedItem.motionalarmsensor)._2 mustEqual 25
obj.CountDeployable(DeployedItem.jammer_mine)._2 mustEqual 20
obj.CountDeployable(DeployedItem.spitfire_cloaked)._2 mustEqual 5
obj.CountDeployable(DeployedItem.spitfire_aa)._2 mustEqual 5
obj.CountDeployable(DeployedItem.sensor_shield)._2 mustEqual 20
obj.CountDeployable(DeployedItem.tank_traps)._2 mustEqual 5
obj.CountDeployable(DeployedItem.portable_manned_turret)._2 mustEqual 1
obj.CountDeployable(DeployedItem.portable_manned_turret_nc)._2 mustEqual 1
obj.CountDeployable(DeployedItem.portable_manned_turret_tr)._2 mustEqual 1
obj.CountDeployable(DeployedItem.portable_manned_turret_vs)._2 mustEqual 1
obj.CountDeployable(DeployedItem.deployable_shield_generator)._2 mustEqual 1
obj.CountDeployable(DeployedItem.router_telepad_deployable)._2 mustEqual 1024
obj.RemoveFromDeployableQuantities(
AdvancedHacking,
Set(CombatEngineering, AssaultEngineering, FortificationEngineering)
)
obj.CountDeployable(DeployedItem.boomer)._2 mustEqual 25
obj.CountDeployable(DeployedItem.he_mine)._2 mustEqual 25
obj.CountDeployable(DeployedItem.spitfire_turret)._2 mustEqual 15
obj.CountDeployable(DeployedItem.motionalarmsensor)._2 mustEqual 25
obj.CountDeployable(DeployedItem.jammer_mine)._2 mustEqual 20
obj.CountDeployable(DeployedItem.spitfire_cloaked)._2 mustEqual 5
obj.CountDeployable(DeployedItem.spitfire_aa)._2 mustEqual 5
obj.CountDeployable(DeployedItem.sensor_shield)._2 mustEqual 0
obj.CountDeployable(DeployedItem.tank_traps)._2 mustEqual 5
obj.CountDeployable(DeployedItem.portable_manned_turret)._2 mustEqual 1
obj.CountDeployable(DeployedItem.portable_manned_turret_nc)._2 mustEqual 1
obj.CountDeployable(DeployedItem.portable_manned_turret_tr)._2 mustEqual 1
obj.CountDeployable(DeployedItem.portable_manned_turret_vs)._2 mustEqual 1
obj.CountDeployable(DeployedItem.deployable_shield_generator)._2 mustEqual 1
obj.CountDeployable(DeployedItem.router_telepad_deployable)._2 mustEqual 1024
obj.RemoveFromDeployableQuantities(
FortificationEngineering,
Set(CombatEngineering, AssaultEngineering)
)
obj.CountDeployable(DeployedItem.boomer)._2 mustEqual 20
obj.CountDeployable(DeployedItem.he_mine)._2 mustEqual 20
obj.CountDeployable(DeployedItem.spitfire_turret)._2 mustEqual 10
obj.CountDeployable(DeployedItem.motionalarmsensor)._2 mustEqual 20
obj.CountDeployable(DeployedItem.jammer_mine)._2 mustEqual 20
obj.CountDeployable(DeployedItem.spitfire_cloaked)._2 mustEqual 0
obj.CountDeployable(DeployedItem.spitfire_aa)._2 mustEqual 0
obj.CountDeployable(DeployedItem.sensor_shield)._2 mustEqual 0
obj.CountDeployable(DeployedItem.tank_traps)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret)._2 mustEqual 1
obj.CountDeployable(DeployedItem.portable_manned_turret_nc)._2 mustEqual 1
obj.CountDeployable(DeployedItem.portable_manned_turret_tr)._2 mustEqual 1
obj.CountDeployable(DeployedItem.portable_manned_turret_vs)._2 mustEqual 1
obj.CountDeployable(DeployedItem.deployable_shield_generator)._2 mustEqual 1
obj.CountDeployable(DeployedItem.router_telepad_deployable)._2 mustEqual 1024
obj.RemoveFromDeployableQuantities(
AssaultEngineering,
Set(CombatEngineering)
)
obj.CountDeployable(DeployedItem.boomer)._2 mustEqual 20
obj.CountDeployable(DeployedItem.he_mine)._2 mustEqual 20
obj.CountDeployable(DeployedItem.spitfire_turret)._2 mustEqual 10
obj.CountDeployable(DeployedItem.motionalarmsensor)._2 mustEqual 20
obj.CountDeployable(DeployedItem.jammer_mine)._2 mustEqual 0
obj.CountDeployable(DeployedItem.spitfire_cloaked)._2 mustEqual 0
obj.CountDeployable(DeployedItem.spitfire_aa)._2 mustEqual 0
obj.CountDeployable(DeployedItem.sensor_shield)._2 mustEqual 0
obj.CountDeployable(DeployedItem.tank_traps)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret_nc)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret_tr)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret_vs)._2 mustEqual 0
obj.CountDeployable(DeployedItem.deployable_shield_generator)._2 mustEqual 0
obj.CountDeployable(DeployedItem.router_telepad_deployable)._2 mustEqual 1024
obj.RemoveFromDeployableQuantities(
CombatEngineering,
Set()
)
obj.CountDeployable(DeployedItem.boomer)._2 mustEqual 0
obj.CountDeployable(DeployedItem.he_mine)._2 mustEqual 0
obj.CountDeployable(DeployedItem.spitfire_turret)._2 mustEqual 0
obj.CountDeployable(DeployedItem.motionalarmsensor)._2 mustEqual 0
obj.CountDeployable(DeployedItem.jammer_mine)._2 mustEqual 0
obj.CountDeployable(DeployedItem.spitfire_cloaked)._2 mustEqual 0
obj.CountDeployable(DeployedItem.spitfire_aa)._2 mustEqual 0
obj.CountDeployable(DeployedItem.sensor_shield)._2 mustEqual 0
obj.CountDeployable(DeployedItem.tank_traps)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret_nc)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret_tr)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret_vs)._2 mustEqual 0
obj.CountDeployable(DeployedItem.deployable_shield_generator)._2 mustEqual 0
obj.CountDeployable(DeployedItem.router_telepad_deployable)._2 mustEqual 1024
}
"change accessible fields by removing by certification type (AdvancedEngineering)" in {
val obj = new DeployableToolbox
obj.Initialize(Set(CombatEngineering, AdvancedEngineering))
obj.CountDeployable(DeployedItem.boomer)._2 mustEqual 25
obj.CountDeployable(DeployedItem.he_mine)._2 mustEqual 25
obj.CountDeployable(DeployedItem.spitfire_turret)._2 mustEqual 15
obj.CountDeployable(DeployedItem.motionalarmsensor)._2 mustEqual 25
obj.CountDeployable(DeployedItem.jammer_mine)._2 mustEqual 20
obj.CountDeployable(DeployedItem.spitfire_cloaked)._2 mustEqual 5
obj.CountDeployable(DeployedItem.spitfire_aa)._2 mustEqual 5
obj.CountDeployable(DeployedItem.sensor_shield)._2 mustEqual 0
obj.CountDeployable(DeployedItem.tank_traps)._2 mustEqual 5
obj.CountDeployable(DeployedItem.portable_manned_turret)._2 mustEqual 1
obj.CountDeployable(DeployedItem.portable_manned_turret_nc)._2 mustEqual 1
obj.CountDeployable(DeployedItem.portable_manned_turret_tr)._2 mustEqual 1
obj.CountDeployable(DeployedItem.portable_manned_turret_vs)._2 mustEqual 1
obj.CountDeployable(DeployedItem.deployable_shield_generator)._2 mustEqual 1
obj.CountDeployable(DeployedItem.router_telepad_deployable)._2 mustEqual 1024
obj.RemoveFromDeployableQuantities(
AdvancedEngineering,
Set(CombatEngineering)
)
obj.CountDeployable(DeployedItem.boomer)._2 mustEqual 20
obj.CountDeployable(DeployedItem.he_mine)._2 mustEqual 20
obj.CountDeployable(DeployedItem.spitfire_turret)._2 mustEqual 10
obj.CountDeployable(DeployedItem.motionalarmsensor)._2 mustEqual 20
obj.CountDeployable(DeployedItem.jammer_mine)._2 mustEqual 0
obj.CountDeployable(DeployedItem.spitfire_cloaked)._2 mustEqual 0
obj.CountDeployable(DeployedItem.spitfire_aa)._2 mustEqual 0
obj.CountDeployable(DeployedItem.sensor_shield)._2 mustEqual 0
obj.CountDeployable(DeployedItem.tank_traps)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret_nc)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret_tr)._2 mustEqual 0
obj.CountDeployable(DeployedItem.portable_manned_turret_vs)._2 mustEqual 0
obj.CountDeployable(DeployedItem.deployable_shield_generator)._2 mustEqual 0
obj.CountDeployable(DeployedItem.router_telepad_deployable)._2 mustEqual 1024
}
"can not remove deployables from an unpopulated field" in {
val obj = new DeployableToolbox
obj.Initialize(Set(CombatEngineering))
val boomer = new BoomerDeployable(GlobalDefinitions.boomer)
obj.CountDeployable(DeployedItem.boomer)._2 mustEqual 20
obj.Remove(boomer) mustEqual false
obj.CountDeployable(DeployedItem.boomer)._2 mustEqual 20
}
"can remove a deployable from a field it populates" in {
val obj = new DeployableToolbox
obj.Initialize(Set(CombatEngineering))
val boomer = new BoomerDeployable(GlobalDefinitions.boomer)
obj.CountDeployable(DeployedItem.boomer)._2 mustEqual 20
obj.Add(boomer) mustEqual true
obj.CountDeployable(DeployedItem.boomer).productIterator.toList mustEqual List(1,20)
obj.CountDeployable(DeployedItem.boomer).productIterator.toList mustEqual List(1, 20)
obj.Remove(boomer) mustEqual true
obj.CountDeployable(DeployedItem.boomer)._2 mustEqual 20
}
"can not remove a deployable from a field it does not populate" in {
val obj = new DeployableToolbox
obj.Initialize(Set(CombatEngineering))
val boomer1 = new BoomerDeployable(GlobalDefinitions.boomer)
obj.CountDeployable(DeployedItem.boomer)._2 mustEqual 20
obj.Add(boomer1) mustEqual true
obj.CountDeployable(DeployedItem.boomer).productIterator.toList mustEqual List(1, 20)
val boomer2 = new BoomerDeployable(GlobalDefinitions.boomer)
obj.Remove(boomer2) mustEqual false
obj.CountDeployable(DeployedItem.boomer).productIterator.toList mustEqual List(1, 20)
}
"changing accessible fields by removing by certification type does not invalidate existing deployables" in {
val obj = new DeployableToolbox
obj.Initialize(Set(CombatEngineering))
obj.Add(new BoomerDeployable(GlobalDefinitions.boomer))
obj.Add(new BoomerDeployable(GlobalDefinitions.boomer))
obj.Add(new BoomerDeployable(GlobalDefinitions.boomer))
obj.CountDeployable(DeployedItem.boomer).productIterator.toList mustEqual List(3, 20)
obj.RemoveFromDeployableQuantities(
CombatEngineering,
Set()
)
obj.CountDeployable(DeployedItem.boomer).productIterator.toList mustEqual List(3, 0)
}
"can not add the same deployable multiple times" in {
val obj = new DeployableToolbox
obj.Initialize(Set(CombatEngineering))
val boomer = new BoomerDeployable(GlobalDefinitions.boomer)
obj.Add(boomer) mustEqual true
obj.Add(boomer) mustEqual false
}
"can not add more deployables to a field than is allowed by its current type maximum" in {
val obj = new DeployableToolbox
obj.Initialize(Set(CombatEngineering))
obj.CountDeployable(DeployedItem.he_mine)._2 mustEqual 20
(1 to 19).foreach(_ => {
val o1 = new ExplosiveDeployable(GlobalDefinitions.he_mine)
obj.Accept(o1)mustEqual true
obj.Add(o1) mustEqual true
})
obj.CountDeployable(DeployedItem.he_mine).productIterator.toList mustEqual List(19, 20)
val o2 = new BoomerDeployable(GlobalDefinitions.he_mine)
obj.Accept(o2) mustEqual true
obj.Add(o2) mustEqual true
obj.CountDeployable(DeployedItem.he_mine).productIterator.toList mustEqual List(20, 20)
//fail extra
val o3 = new BoomerDeployable(GlobalDefinitions.he_mine)
obj.Accept(o3) mustEqual false
obj.Add(o3) mustEqual false
obj.CountDeployable(DeployedItem.he_mine).productIterator.toList mustEqual List(20, 20)
//remove old
obj.Remove(o2) mustEqual true
obj.Accept(o2) mustEqual true
obj.Accept(o3) mustEqual true
obj.CountDeployable(DeployedItem.he_mine).productIterator.toList mustEqual List(19, 20)
//add extra
obj.Add(o3) mustEqual true
obj.CountDeployable(DeployedItem.he_mine).productIterator.toList mustEqual List(20, 20)
}
"some deployables can share a category and a category maximum" in {
val obj = new DeployableToolbox
obj.Initialize(Set(CombatEngineering, AdvancedHacking))
obj.CountDeployable(DeployedItem.motionalarmsensor)._2 mustEqual 20
obj.CountDeployable(DeployedItem.sensor_shield)._2 mustEqual 20
(1 to 10).foreach(_ => {
val o = new SensorDeployable(GlobalDefinitions.motionalarmsensor)
obj.Accept(o)mustEqual true
obj.Add(o) mustEqual true
})
(1 to 10).foreach(_ => {
val o = new SensorDeployable(GlobalDefinitions.sensor_shield)
obj.Accept(o)mustEqual true
obj.Add(o) mustEqual true
})
obj.CountDeployable(DeployedItem.motionalarmsensor).productIterator.toList mustEqual List(10, 20)
obj.CountDeployable(DeployedItem.sensor_shield).productIterator.toList mustEqual List(10, 20)
val o1 = new SensorDeployable(GlobalDefinitions.motionalarmsensor)
obj.Accept(o1)mustEqual false
obj.Add(o1) mustEqual false
val o2 = new SensorDeployable(GlobalDefinitions.sensor_shield)
obj.Accept(o2)mustEqual false
obj.Add(o2) mustEqual false
}
"remove the first deployable type from a category" in {
val obj = new DeployableToolbox
obj.Initialize(Set(CombatEngineering, AdvancedHacking))
obj.CountDeployable(DeployedItem.motionalarmsensor)._2 mustEqual 20
obj.CountDeployable(DeployedItem.sensor_shield)._2 mustEqual 20
val o1 = new SensorDeployable(GlobalDefinitions.motionalarmsensor)
obj.Accept(o1)mustEqual true
obj.Add(o1) mustEqual true
val o2 = new SensorDeployable(GlobalDefinitions.sensor_shield)
obj.Accept(o2)mustEqual true
obj.Add(o2) mustEqual true
obj.CountDeployable(DeployedItem.motionalarmsensor).productIterator.toList mustEqual List(1, 20)
obj.CountDeployable(DeployedItem.sensor_shield).productIterator.toList mustEqual List(1, 20)
val o3 = new SensorDeployable(GlobalDefinitions.sensor_shield)
val displaced1a = obj.DisplaceFirst(o3) //remove the first sensor_shield's deployable
displaced1a.nonEmpty mustEqual true
displaced1a.get.Definition == o3.Definition mustEqual true
obj.CountDeployable(DeployedItem.motionalarmsensor).productIterator.toList mustEqual List(1, 20)
obj.CountDeployable(DeployedItem.sensor_shield).productIterator.toList mustEqual List(0, 20)
//test: add o2 again and try to remove the motionalarmsensor
obj.Add(o2)
val displaced1b = obj.DisplaceFirst(o3, {(d) => d.Definition.Item != DeployedItem.sensor_shield}) //remove the first sensor_shield's deployable
displaced1b.nonEmpty mustEqual true
displaced1b.get.Definition == o3.Definition mustEqual false
displaced1b.get.Definition mustEqual GlobalDefinitions.motionalarmsensor
obj.CountDeployable(DeployedItem.motionalarmsensor).productIterator.toList mustEqual List(0, 20)
obj.CountDeployable(DeployedItem.sensor_shield).productIterator.toList mustEqual List(1, 20)
val o4 = new SensorDeployable(GlobalDefinitions.motionalarmsensor)
val displaced2 = obj.DisplaceFirst(o3) //remove the first deployable of motionalarmsensor's category
displaced2.nonEmpty mustEqual true
displaced2.get.Definition == o4.Definition mustEqual false
displaced2.get.Definition mustEqual GlobalDefinitions.sensor_shield //removed deployable is a sensor_shield type
obj.CountDeployable(DeployedItem.motionalarmsensor)._2 mustEqual 20
obj.CountDeployable(DeployedItem.sensor_shield)._2 mustEqual 20
obj.DisplaceFirst(o3) mustEqual None //we can not remove anymore deployables because the category is empty
obj.DisplaceFirst(o4) mustEqual None //likewise
}
"remove the first deployable type from a category" in {
val obj = new DeployableToolbox
obj.Initialize(Set(CombatEngineering, AdvancedHacking))
val o1 = new SensorDeployable(GlobalDefinitions.sensor_shield)
val o2 = new SensorDeployable(GlobalDefinitions.motionalarmsensor)
val o3 = new SensorDeployable(GlobalDefinitions.sensor_shield)
obj.Add(o3) mustEqual true //0
obj.Add(o1) mustEqual true //1
obj.Add(o2) mustEqual true //2
val displaced1 = obj.DisplaceFirst(DeployableCategory.Sensors)
displaced1.nonEmpty mustEqual true
displaced1.get.Definition == GlobalDefinitions.sensor_shield mustEqual true
displaced1.get == o3 mustEqual true
val displaced2 = obj.DisplaceFirst(DeployableCategory.Sensors)
displaced2.nonEmpty mustEqual true
displaced2.get.Definition == GlobalDefinitions.sensor_shield mustEqual true
displaced2.get == o1 mustEqual true
}
"counting deployables will give the type number; counting categories gives all deployables in that category" in {
val obj = new DeployableToolbox
obj.Initialize(Set(CombatEngineering, AdvancedHacking))
obj.Add(new SensorDeployable(GlobalDefinitions.sensor_shield))
obj.Add(new SensorDeployable(GlobalDefinitions.motionalarmsensor))
obj.Add(new SensorDeployable(GlobalDefinitions.sensor_shield))
obj.CountDeployable(DeployedItem.motionalarmsensor).productIterator.toList mustEqual List(1, 20)
obj.CountDeployable(DeployedItem.sensor_shield).productIterator.toList mustEqual List(2, 20)
obj.CountCategory(DeployedItem.motionalarmsensor).productIterator.toList mustEqual List(3, 20)
obj.CountCategory(DeployedItem.sensor_shield).productIterator.toList mustEqual List(3, 20)
}
"get a list of GUIDs when the category contents are tested" in {
val obj = new DeployableToolbox
obj.Initialize(Set(CombatEngineering, AdvancedHacking))
obj.CountDeployable(DeployedItem.motionalarmsensor)._2 mustEqual 20
obj.CountDeployable(DeployedItem.sensor_shield)._2 mustEqual 20
val o1 = new SensorDeployable(GlobalDefinitions.motionalarmsensor)
o1.GUID = PlanetSideGUID(1)
obj.Add(o1) mustEqual true
val o3 = new SensorDeployable(GlobalDefinitions.sensor_shield)
o3.GUID = PlanetSideGUID(3)
obj.Add(o3) mustEqual true
val o4 = new SensorDeployable(GlobalDefinitions.motionalarmsensor)
o4.GUID = PlanetSideGUID(4)
obj.Add(o4) mustEqual true
val o2 = new SensorDeployable(GlobalDefinitions.sensor_shield)
o2.GUID = PlanetSideGUID(2)
obj.Add(o2) mustEqual true
obj.CountDeployable(DeployedItem.motionalarmsensor).productIterator.toList mustEqual List(2, 20)
obj.CountDeployable(DeployedItem.sensor_shield).productIterator.toList mustEqual List(2, 20)
val test1 = new SensorDeployable(GlobalDefinitions.motionalarmsensor)
val test2 = new SensorDeployable(GlobalDefinitions.sensor_shield)
obj.Category(test1) mustEqual List(PlanetSideGUID(1),PlanetSideGUID(3),PlanetSideGUID(4),PlanetSideGUID(2))
obj.Category(test1) mustEqual obj.Category(test2)
}
"get a list of GUIDs when the types are tested" in {
val obj = new DeployableToolbox
obj.Initialize(Set(CombatEngineering, AdvancedHacking))
obj.CountDeployable(DeployedItem.motionalarmsensor)._2 mustEqual 20
obj.CountDeployable(DeployedItem.sensor_shield)._2 mustEqual 20
val o1 = new SensorDeployable(GlobalDefinitions.motionalarmsensor)
o1.GUID = PlanetSideGUID(1)
obj.Add(o1) mustEqual true
val o3 = new SensorDeployable(GlobalDefinitions.sensor_shield)
o3.GUID = PlanetSideGUID(3)
obj.Add(o3) mustEqual true
val o4 = new SensorDeployable(GlobalDefinitions.motionalarmsensor)
o4.GUID = PlanetSideGUID(4)
obj.Add(o4) mustEqual true
val o2 = new SensorDeployable(GlobalDefinitions.sensor_shield)
o2.GUID = PlanetSideGUID(2)
obj.Add(o2) mustEqual true
obj.CountDeployable(DeployedItem.motionalarmsensor).productIterator.toList mustEqual List(2, 20)
obj.CountDeployable(DeployedItem.sensor_shield).productIterator.toList mustEqual List(2, 20)
val test1 = new SensorDeployable(GlobalDefinitions.motionalarmsensor)
val test2 = new SensorDeployable(GlobalDefinitions.sensor_shield)
obj.Deployables(test1) mustEqual List(PlanetSideGUID(1),PlanetSideGUID(4))
obj.Deployables(test2) mustEqual List(PlanetSideGUID(3),PlanetSideGUID(2))
}
"three tests: 'contains' detects same deployable" in {
val obj = new DeployableToolbox
obj.Initialize(Set(CombatEngineering))
val boomer1 = new BoomerDeployable(GlobalDefinitions.boomer)
val boomer2 = new BoomerDeployable(GlobalDefinitions.boomer)
obj.Contains(boomer1) mustEqual false
obj.Contains(boomer2) mustEqual false
obj.Add(boomer1)
obj.Contains(boomer1) mustEqual true
obj.Contains(boomer2) mustEqual false
}
"three tests: 'valid' tests whether deployable type can be accepted" in {
val obj = new DeployableToolbox
obj.Initialize(Set(CombatEngineering))
val cerebus = new TurretDeployable(GlobalDefinitions.spitfire_aa) //cerebus turret
obj.Valid(cerebus) mustEqual false
obj.CountDeployable(DeployedItem.spitfire_aa).productIterator.toList mustEqual List(0,0)
obj.AddToDeployableQuantities(AdvancedEngineering, Set(CombatEngineering, AdvancedEngineering))
obj.Valid(cerebus) mustEqual true
obj.CountDeployable(DeployedItem.spitfire_aa).productIterator.toList mustEqual List(0,5)
}
"three tests: 'available' tests whether there is enough space to add more deployables of a type" in {
val obj = new DeployableToolbox
obj.Initialize(Set(CombatEngineering))
obj.CountDeployable(DeployedItem.boomer).productIterator.toList mustEqual List(0,20)
(1 to 20).foreach(_ => {
val boomer = new BoomerDeployable(GlobalDefinitions.boomer)
obj.Available(boomer) mustEqual true
obj.Add(boomer) mustEqual true
})
obj.CountDeployable(DeployedItem.boomer).productIterator.toList mustEqual List(20,20)
val boomer = new BoomerDeployable(GlobalDefinitions.boomer)
obj.Available(boomer) mustEqual false
obj.Add(boomer) mustEqual false
}
"three tests: 'accept' ensures that all three of the previous tests are passable" in {
val obj = new DeployableToolbox
val boomer = new BoomerDeployable(GlobalDefinitions.boomer)
obj.Initialize(Set())
obj.CountDeployable(DeployedItem.boomer).productIterator.toList mustEqual List(0,0)
obj.Accept(boomer) mustEqual false
obj.Available(boomer) mustEqual false
obj.Contains(boomer) mustEqual false //false is being passable
obj.Valid(boomer) mustEqual false
obj.AddToDeployableQuantities(CombatEngineering, Set(CombatEngineering))
obj.CountDeployable(DeployedItem.boomer).productIterator.toList mustEqual List(0,20)
obj.Accept(boomer) mustEqual true
obj.Available(boomer) mustEqual true //true is being passable
obj.Contains(boomer) mustEqual false //false is being passable
obj.Valid(boomer) mustEqual true //true is being passable
obj.Add(boomer)
obj.CountDeployable(DeployedItem.boomer).productIterator.toList mustEqual List(1,20)
obj.Accept(boomer) mustEqual false
obj.Available(boomer) mustEqual true //true is being passable
obj.Contains(boomer) mustEqual true
obj.Valid(boomer) mustEqual true //true is being passable
(1 to 20).foreach(_ => { obj.Add(new BoomerDeployable(GlobalDefinitions.boomer)) })
obj.CountDeployable(DeployedItem.boomer).productIterator.toList mustEqual List(20,20)
obj.Accept(boomer) mustEqual false
obj.Available(boomer) mustEqual false
obj.Contains(boomer) mustEqual true
obj.Valid(boomer) mustEqual true //true is being passable
obj.RemoveFromDeployableQuantities(CombatEngineering, Set())
obj.CountDeployable(DeployedItem.boomer).productIterator.toList mustEqual List(20,0)
obj.Accept(boomer) mustEqual false
obj.Available(boomer) mustEqual false
obj.Contains(boomer) mustEqual true
obj.Valid(boomer) mustEqual false
}
"UI elements report individual deployable types for a certification type" in {
val obj = new DeployableToolbox
obj.Initialize(Set(CombatEngineering, AdvancedEngineering, AdvancedHacking))
val list1 = obj.UpdateUI(CombatEngineering)
list1.head.productIterator.toList mustEqual List(94, 0, 83, 25)
list1(1).productIterator.toList mustEqual List(95, 0, 84, 25)
list1(2).productIterator.toList mustEqual List(97, 0, 86, 15)
list1(3).productIterator.toList mustEqual List(98, 0, 87, 25)
val list2 = obj.UpdateUI(AdvancedHacking)
list2.head.productIterator.toList mustEqual List(104, 0, 93, 25)
val list3 = obj.UpdateUI(AssaultEngineering)
list3.head.productIterator.toList mustEqual List(96, 0, 85, 20)
list3(1).productIterator.toList mustEqual List(103, 0, 92, 1)
list3(2).productIterator.toList mustEqual List(101, 0, 90, 1)
val list4 = obj.UpdateUI(FortificationEngineering)
list4.head.productIterator.toList mustEqual List(94, 0, 83, 25)
list4(1).productIterator.toList mustEqual List(95, 0, 84, 25)
list4(2).productIterator.toList mustEqual List(97, 0, 86, 15)
list4(3).productIterator.toList mustEqual List(99, 0, 88, 5)
list4(4).productIterator.toList mustEqual List(100, 0, 89, 5)
list4(5).productIterator.toList mustEqual List(98, 0, 87, 25)
list4(6).productIterator.toList mustEqual List(102, 0, 91, 5)
obj.UpdateUI(AdvancedEngineering).flatMap(tuple => tuple.productIterator.toList) mustEqual
obj.UpdateUI(AssaultEngineering).flatMap(tuple => tuple.productIterator.toList) ++
obj.UpdateUI(FortificationEngineering).flatMap(tuple => tuple.productIterator.toList)
obj.UpdateUI(MediumAssault) mustEqual Nil
}
"UI elements report individual deployable types for a combination of certification types" in {
val obj = new DeployableToolbox
obj.Initialize(Set(CombatEngineering, AdvancedEngineering, AdvancedHacking))
obj.UpdateUI(
List(AssaultEngineering, FortificationEngineering)
).flatMap(tuple => tuple.productIterator.toList) mustEqual
obj.UpdateUI(AdvancedEngineering).flatMap(tuple => tuple.productIterator.toList)
}
"all of the one manned field turrets use the same category and the same UI elements" in {
val obj = new DeployableToolbox
//initial state
(obj.UpdateUIElement(DeployedItem.portable_manned_turret) ++
obj.UpdateUIElement(DeployedItem.portable_manned_turret_nc) ++
obj.UpdateUIElement(DeployedItem.portable_manned_turret_tr) ++
obj.UpdateUIElement(DeployedItem.portable_manned_turret_vs)
).toSet mustEqual Set((103, 0, 92, 0)) //note: four elements become one common element
//initialized state
obj.Initialize(Set(CombatEngineering, AdvancedEngineering))
(obj.UpdateUIElement(DeployedItem.portable_manned_turret) ++
obj.UpdateUIElement(DeployedItem.portable_manned_turret_nc) ++
obj.UpdateUIElement(DeployedItem.portable_manned_turret_tr) ++
obj.UpdateUIElement(DeployedItem.portable_manned_turret_vs)
).toSet mustEqual Set((103, 0, 92, 1))
//portable_manned_turret_vs added
val obj1 = new TurretDeployable(GlobalDefinitions.portable_manned_turret_vs)
obj1.Definition.Item mustEqual DeployedItem.portable_manned_turret_vs
obj1.Definition.DeployCategory mustEqual DeployableCategory.FieldTurrets
obj1.GUID = PlanetSideGUID(1)
obj.Add(obj1) mustEqual true
(obj.UpdateUIElement(DeployedItem.portable_manned_turret) ++
obj.UpdateUIElement(DeployedItem.portable_manned_turret_nc) ++
obj.UpdateUIElement(DeployedItem.portable_manned_turret_tr) ++
obj.UpdateUIElement(DeployedItem.portable_manned_turret_vs)
).toSet mustEqual Set((103, 1, 92, 1))
//portable_manned_turret_nc fails to add
val obj2 = new TurretDeployable(GlobalDefinitions.portable_manned_turret_nc)
obj2.Definition.Item mustEqual DeployedItem.portable_manned_turret_nc
obj2.Definition.DeployCategory mustEqual DeployableCategory.FieldTurrets
obj2.GUID = PlanetSideGUID(2)
obj.Add(obj2) mustEqual false
obj.Category(DeployableCategory.FieldTurrets).contains(PlanetSideGUID(1)) mustEqual true //included
obj.Category(DeployableCategory.FieldTurrets).contains(PlanetSideGUID(2)) mustEqual false
//swap turrets
obj.Remove(obj1) mustEqual true
obj.Add(obj2) mustEqual true
(obj.UpdateUIElement(DeployedItem.portable_manned_turret) ++
obj.UpdateUIElement(DeployedItem.portable_manned_turret_nc) ++
obj.UpdateUIElement(DeployedItem.portable_manned_turret_tr) ++
obj.UpdateUIElement(DeployedItem.portable_manned_turret_vs)
).toSet mustEqual Set((103, 1, 92, 1))
obj.Category(DeployableCategory.FieldTurrets).contains(PlanetSideGUID(1)) mustEqual false
obj.Category(DeployableCategory.FieldTurrets).contains(PlanetSideGUID(2)) mustEqual true //included
}
"clear all deployables, return their GUIDs" in {
val obj = new DeployableToolbox
obj.Initialize(Set(CombatEngineering))
obj.Add(new SensorDeployable(GlobalDefinitions.motionalarmsensor) { GUID = PlanetSideGUID(1) })
obj.Add(new BoomerDeployable(GlobalDefinitions.boomer) { GUID = PlanetSideGUID(2) })
obj.Add(new BoomerDeployable(GlobalDefinitions.he_mine) { GUID = PlanetSideGUID(3) })
obj.CountDeployable(DeployedItem.boomer).productIterator.toList mustEqual List(1, 20)
obj.CountDeployable(DeployedItem.he_mine).productIterator.toList mustEqual List(1, 20)
obj.CountDeployable(DeployedItem.motionalarmsensor).productIterator.toList mustEqual List(1, 20)
obj.Clear().toSet mustEqual Set(PlanetSideGUID(1), PlanetSideGUID(2), PlanetSideGUID(3))
obj.CountDeployable(DeployedItem.boomer).productIterator.toList mustEqual List(0, 20)
obj.CountDeployable(DeployedItem.he_mine).productIterator.toList mustEqual List(0, 20)
obj.CountDeployable(DeployedItem.motionalarmsensor).productIterator.toList mustEqual List(0, 20)
}
"clear all deployables of a certain type" in {
val obj = new DeployableToolbox
obj.Initialize(Set(CombatEngineering, AdvancedHacking))
obj.Add(new ExplosiveDeployable(GlobalDefinitions.he_mine) { GUID = PlanetSideGUID(1) })
obj.Add(new SensorDeployable(GlobalDefinitions.motionalarmsensor) { GUID = PlanetSideGUID(3) })
obj.Add(new SensorDeployable(GlobalDefinitions.sensor_shield) { GUID = PlanetSideGUID(4) })
obj.CountDeployable(DeployedItem.he_mine).productIterator.toList mustEqual List(1, 20)
obj.CountDeployable(DeployedItem.motionalarmsensor).productIterator.toList mustEqual List(1, 20)
obj.CountDeployable(DeployedItem.sensor_shield).productIterator.toList mustEqual List(1, 20)
obj.CountCategory(DeployedItem.motionalarmsensor).productIterator.toList mustEqual List(2, 20)
obj.ClearDeployable(DeployedItem.motionalarmsensor).toSet mustEqual Set(PlanetSideGUID(3))
obj.CountDeployable(DeployedItem.he_mine).productIterator.toList mustEqual List(1, 20)
obj.CountDeployable(DeployedItem.motionalarmsensor).productIterator.toList mustEqual List(0, 20)
obj.CountDeployable(DeployedItem.sensor_shield).productIterator.toList mustEqual List(1, 20)
obj.CountCategory(DeployedItem.motionalarmsensor).productIterator.toList mustEqual List(1, 20)
}
"clear all deployables of a certain category" in {
val obj = new DeployableToolbox
obj.Initialize(Set(CombatEngineering, AdvancedHacking))
obj.Add(new ExplosiveDeployable(GlobalDefinitions.he_mine) { GUID = PlanetSideGUID(1) })
obj.Add(new SensorDeployable(GlobalDefinitions.motionalarmsensor) { GUID = PlanetSideGUID(3) })
obj.Add(new SensorDeployable(GlobalDefinitions.sensor_shield) { GUID = PlanetSideGUID(4) })
obj.CountDeployable(DeployedItem.he_mine).productIterator.toList mustEqual List(1, 20)
obj.CountDeployable(DeployedItem.motionalarmsensor).productIterator.toList mustEqual List(1, 20)
obj.CountDeployable(DeployedItem.sensor_shield).productIterator.toList mustEqual List(1, 20)
obj.CountCategory(DeployedItem.motionalarmsensor).productIterator.toList mustEqual List(2, 20)
obj.ClearCategory(DeployedItem.motionalarmsensor).toSet mustEqual Set(PlanetSideGUID(3), PlanetSideGUID(4))
obj.CountDeployable(DeployedItem.he_mine).productIterator.toList mustEqual List(1, 20)
obj.CountDeployable(DeployedItem.motionalarmsensor).productIterator.toList mustEqual List(0, 20)
obj.CountDeployable(DeployedItem.sensor_shield).productIterator.toList mustEqual List(0, 20)
obj.CountCategory(DeployedItem.motionalarmsensor).productIterator.toList mustEqual List(0, 20)
}
}
}