From 120fc33b132347e447db93982e9e2c86cbff81bf Mon Sep 17 00:00:00 2001 From: erwan-joly Date: Sun, 18 Jan 2026 23:45:04 +1300 Subject: [PATCH 1/4] cleanup --- src/NosCore.Data/SkillPacket.cs | 4 - .../Entities}/Character.cs | 6 +- .../Entities}/MapDesignObject.cs | 2 +- .../Entities}/MapItem.cs | 3 +- .../Entities}/MapMonster.cs | 3 +- .../Entities}/MapNpc.cs | 3 +- .../{ => ComponentEntities/Entities}/Pet.cs | 4 +- .../Entities}/Portal.cs | 2 +- .../Extensions/AliveEntityExtension.cs | 9 -- .../Extensions/GroupExtension.cs | 1 + .../Extensions/VisualEntityExtension.cs | 1 + .../Interfaces/IAliveEntity.cs | 3 +- .../Interfaces/ICharacterEntity.cs | 1 + .../Interfaces/INamedEntity.cs | 2 + .../{ => Infastructure}/IEventHandler.cs | 2 +- .../{ => Infastructure}/IPacketHandler.cs | 2 +- .../Networking/ClientSession/ClientSession.cs | 2 + .../ExchangeDisconnectHandler.cs | 1 + .../LoginPacketHandlingStrategy.cs | 1 - .../WorldPacketHandlingStrategy.cs | 3 +- .../Services/BattleService/BattleService.cs | 1 - .../Services/BattleService/CharacterSkill.cs | 4 - .../BazaarService/BazaarRegistry.cs} | 45 +++++++--- .../Services/BazaarService/BazaarService.cs | 29 +++---- .../Services/BazaarService/IBazaarRegistry.cs | 35 ++++++++ ...ssageChannelCommunicationMessageHandler.cs | 1 - .../CharacterInitializationService.cs | 1 + .../ICharacterInitializationService.cs | 1 + .../EventLoaderService/EventLoaderService.cs | 1 + .../Handlers/RemoveTimeoutStaticBonuses.cs | 1 - .../EventLoaderService/Handlers/SaveAll.cs | 1 - .../EventLoaderService/ITimedEventHandler.cs | 1 + .../ExchangeService}/ExchangeData.cs | 14 ++-- .../ExchangeRequestRegistry.cs | 58 +++++++++++++ .../ExchangeService/ExchangeService.cs | 79 ++++++++++-------- .../IExchangeRequestRegistry.cs | 36 ++++++++ .../FriendService}/CharacterRelation.cs | 14 ++-- .../FriendService/FriendRequestRegistry.cs | 40 +++++++++ .../Services/FriendService/FriendService.cs | 37 ++++----- .../FriendService/IFriendRequestRegistry.cs} | 22 ++--- .../{ => Services/GroupService}/Group.cs | 14 ++-- .../Services/GroupService/GroupRegistry.cs | 62 ++++++++++++++ .../GroupService/IGroupRegistry.cs} | 27 +++--- .../GuriRunnerService/GuriRunnerService.cs | 1 + .../Handlers/SpeakerGuriHandler.cs | 1 - .../GuriRunnerService/IGuriEventHandler.cs | 1 + .../IUseItemEventHandler.cs | 1 + .../{ => Services/MailService}/Gift.cs | 18 ++-- .../MailService}/GiftHelper.cs | 14 ++-- .../Services/MailService/IParcelRegistry.cs | 34 ++++++++ .../Services/MailService/MailService.cs | 38 +++++---- .../MailService/ParcelRegistry.cs} | 83 +++++++++++++------ .../MapInstanceAccessService.cs | 27 ++---- .../IMapInstanceEntranceEventHandler.cs | 2 + .../IMapInstanceRegistry.cs | 34 ++++++++ .../MapInstance.cs | 2 +- .../MapInstanceGenerationService.cs | 35 ++++---- .../MapInstanceRegistry.cs | 49 +++++++++++ .../Handlers/DropHandler.cs | 1 + .../Handlers/GoldDropHandler.cs | 1 + .../Handlers/SpChargerHandler.cs | 1 + .../IGetMapItemEventHandler.cs | 2 + .../IMapItemGenerationService.cs | 1 + .../MapItemGenerationService.cs | 1 + .../MinilandService/IMinilandRegistry.cs} | 26 +++--- .../MinilandService/IMinilandService.cs | 1 + .../MinilandService}/MinilandHelper.cs | 3 +- .../MinilandService/MinilandRegistry.cs | 47 +++++++++++ .../MinilandService/MinilandService.cs | 41 ++++----- .../NRunService/Handlers/BazaarHandler.cs | 1 + .../NRunService/Handlers/TeleporterHandler.cs | 1 + .../Services/NRunService/INrunEventHandler.cs | 1 + .../Services/NRunService/NrunService.cs | 1 + .../IPacketHandlerRegistry.cs | 1 + .../PacketHandlerRegistry.cs | 1 + .../Services/QuestService/IQuestService.cs | 1 + .../Services/QuestService/QuestService.cs | 1 + .../Services/SaveService/SaveService.cs | 1 + .../ShopService/IShopRegistry.cs} | 24 +++--- .../{ => Services/ShopService}/Shop.cs | 15 ++-- .../{ => Services/ShopService}/ShopItem.cs | 14 ++-- .../Services/ShopService/ShopRegistry.cs | 50 +++++++++++ .../Services/SkillService/ISkillService.cs | 4 - .../ITransformationService.cs | 1 + .../TransformationService.cs | 1 + .../WarehouseService}/WarehouseItem.cs | 14 ++-- .../LoginServerBootstrap.cs | 1 + src/NosCore.MasterServer/Startup.cs | 11 ++- .../Battle/UseSkillPacketHandler.cs | 15 +--- .../Bazaar/CBListPacketHandler.cs | 2 +- .../Bazaar/CBuyPacketHandler.cs | 2 +- .../Bazaar/CModPacketHandler.cs | 3 +- .../Bazaar/CRegPacketHandler.cs | 2 +- .../Bazaar/CSListPacketHandler.cs | 2 +- .../Bazaar/CScalcPacketHandler.cs | 2 +- .../Bazaar/CSkillPacketHandler.cs | 2 +- .../CharNewJobPacketHandler.cs | 2 +- .../CharacterScreen/CharNewPacketHandler.cs | 5 +- .../CharacterScreen/CharRenPacketHandler.cs | 2 +- .../CharacterDeletePacketHandler.cs | 2 +- .../CharacterScreen/DacPacketHandler.cs | 2 +- .../EntryPointPacketHandler.cs | 4 +- .../CharacterScreen/SelectPacketHandler.cs | 4 +- .../Chat/BtkPacketHandler.cs | 3 +- .../Chat/ClientSayPacketHandler.cs | 2 +- .../Chat/WhisperPacketHandler.cs | 2 +- .../Command/ChangeChannelPacketHandler.cs | 2 +- .../Command/ChangeClassPacketHandler.cs | 2 +- .../Command/CreateItemPacketHandler.cs | 2 +- .../Command/EffectCommandPacketHandler.cs | 2 +- .../Command/GiftPacketHandler.cs | 4 +- .../Command/HelpPacketHandler.cs | 2 +- .../Command/InvisibleCommandPacketHandler.cs | 2 +- .../Command/KickPacketHandler.cs | 2 +- .../Command/PositionPacketHandler.cs | 2 +- .../Command/SetGoldCommandPacketHandler.cs | 2 +- .../SetHeroLevelCommandPacketHandler.cs | 2 +- .../SetJobLevelCommandPacketHandler.cs | 2 +- .../Command/SetLevelCommandPacketHandler.cs | 2 +- .../Command/SetMaintenancePacketHandler.cs | 2 +- .../Command/SetReputationPacketHandler.cs | 2 +- .../Command/ShoutPacketHandler.cs | 2 +- .../Command/SizePacketHandler.cs | 2 +- .../Command/SpeedPacketHandler.cs | 2 +- .../Command/TeleportPacketHandler.cs | 2 +- .../Exchange/ExcListPacketHandler.cs | 5 +- .../Exchange/ExchangeRequestPacketHandler.cs | 3 +- .../Friend/BlDelPacketHandler.cs | 2 +- .../Friend/BlInsPacketHandler.cs | 2 +- .../Friend/BlPacketHandler.cs | 2 +- .../Friend/FdelPacketHandler.cs | 2 +- .../Friend/FinsPacketHandler.cs | 2 +- .../Friend/FlPacketHandler.cs | 2 +- .../Game/GameStartPacketHandler.cs | 2 +- .../Game/GuriPacketHandler.cs | 2 +- .../Game/NcifPacketHandler.cs | 2 +- .../Game/PulsePacketHandler.cs | 2 +- .../Game/QSetPacketHandler.cs | 2 +- .../Game/TitEqPacketHandler.cs | 2 +- .../Group/GroupTalkPacketHandler.cs | 2 +- .../Group/PjoinPacketHandler.cs | 4 +- .../Group/PleavePacketHandler.cs | 4 +- .../Inventory/BiPacketHandler.cs | 2 +- .../Inventory/GetPacketHandler.cs | 3 +- .../Inventory/MvePacketHandler.cs | 2 +- .../Inventory/MviPacketHandler.cs | 2 +- .../Inventory/PutPacketHandler.cs | 2 +- .../Inventory/RemovePacketHandler.cs | 2 +- .../Inventory/SpTransformPacketHandler.cs | 2 +- .../Inventory/UseItemPacketHandler.cs | 2 +- .../Inventory/WearPacketHandler.cs | 2 +- .../Login/NoS0575PacketHandler.cs | 2 +- .../Login/NoS0577PacketHandler.cs | 2 +- .../Miniland/AddobjPacketHandler.cs | 4 +- .../Miniland/MJoinPacketHandler.cs | 3 +- .../MinilandObjects/MgPacketHandler.cs | 6 +- .../MinilandObjects/UseobjPacketHandler.cs | 6 +- .../Miniland/MlobjPacketHandler.cs | 2 +- .../Miniland/RmvobjPacketHandler.cs | 2 +- .../Movement/ClientDirPacketHandler.cs | 2 +- .../Movement/PreqPacketHandler.cs | 3 +- .../Movement/SitPacketHandler.cs | 3 +- .../Movement/WalkPacketHandler.cs | 2 +- .../NoAction/CClosePacketHandler.cs | 2 +- .../NoAction/LbsPacketHandler.cs | 2 +- .../NoAction/SnapPacketHandler.cs | 2 +- .../NoAction/ZeroPacketHandler.cs | 2 +- .../Parcel/PclPacketHandler.cs | 2 +- .../Parcel/PstClientPacketHandler.cs | 4 +- .../Quest/QTPacketHandler.cs | 2 +- .../Quest/ScriptPacketHandler.cs | 2 +- .../Shops/BuyPacketHandler.cs | 2 +- .../Shops/MShopPacketHandler.cs | 3 +- .../Shops/NrunPacketHandler.cs | 3 +- .../Shops/RequestNpcPacketHandler.cs | 3 +- .../Shops/SellPacketHandler.cs | 2 +- .../Shops/ShoppingPacketHandler.cs | 2 +- .../Warehouse/DepositPacketHandler.cs | 2 +- .../Warehouse/FDepositPacketHandler.cs | 2 +- .../Warehouse/FReposPacketHandler.cs | 2 +- .../Warehouse/FStashEndPacketHandler.cs | 2 +- .../Warehouse/FWithdrawPacketHandler.cs | 2 +- .../Warehouse/ReposPacketHandler.cs | 2 +- .../Warehouse/StashEndPacketHandler.cs | 2 +- .../Warehouse/WithdrawPacketHandler.cs | 2 +- .../WorldServerBootstrap.cs | 15 ++-- test/NosCore.GameObject.Tests/BazaarTests.cs | 30 +++---- test/NosCore.GameObject.Tests/GroupTests.cs | 2 + .../ExchangeService/ExchangeServiceTests.cs | 5 +- .../Handlers/GuriEventHandlerTestsBase.cs | 1 + .../Handlers/SpeakerGuriHandlerTests.cs | 1 + .../Handlers/TitleGuriHandlerTests.cs | 1 + .../InventoryService/InventoryServiceTests.cs | 1 + .../Handlers/BackPackHandlerTests.cs | 1 + .../Handlers/BazaarMedalsHandlerTests.cs | 1 + .../Handlers/MinilandBellHandlerTests.cs | 1 + .../Handlers/SpRechargerHandlerTests.cs | 1 + .../Handlers/SpeakerHandlerTests.cs | 1 + .../Handlers/TitleHandlerTests.cs | 1 + .../Handlers/UseItemEventHandlerTestsBase.cs | 1 + .../Handlers/VehicleHandlerTests.cs | 1 + .../Handlers/WearHandlerTests.cs | 1 + .../NRunService/Handlers/ChangeClassTests.cs | 1 + test/NosCore.GameObject.Tests/ShopTests.cs | 6 +- .../Bazaar/CRegPacketHandlerTests.cs | 2 +- .../CharNewJobPacketHandlerTests.cs | 2 +- .../CharNewPacketHandlerTests.cs | 4 +- .../CharRenPacketHandlerTests.cs | 4 +- .../CharacterDeletePacketHandlerTests.cs | 2 +- .../Friend/FinsPacketHandlerTests.cs | 11 ++- .../Friend/FlPacketHandlerTests.cs | 7 +- .../Friend/fDelPacketHandlerTests.cs | 3 +- .../Group/PJoinPacketHandlerTests.cs | 6 +- .../Group/PleavePacketHandlerTests.cs | 6 +- .../Inventory/WearPacketHandlerTests.cs | 2 +- .../Miniland/MJoinPacketHandlerTests.cs | 2 +- .../Miniland/MlEditPacketHandlerTests.cs | 5 +- .../Movement/PreqPacketHandlerTests.cs | 2 +- .../Shops/MShopPacketHandlerTests.cs | 8 +- .../Shops/SellPacketHandlerTests.cs | 2 +- test/NosCore.Tests.Shared/TestHelpers.cs | 24 +++--- tools/NosCore.DtoGenerator/DtoGenerator.cs | 1 - 222 files changed, 1067 insertions(+), 531 deletions(-) rename src/NosCore.GameObject/{ => ComponentEntities/Entities}/Character.cs (99%) rename src/NosCore.GameObject/{Services/MapInstanceGenerationService => ComponentEntities/Entities}/MapDesignObject.cs (97%) rename src/NosCore.GameObject/{Services/MapItemGenerationService => ComponentEntities/Entities}/MapItem.cs (95%) rename src/NosCore.GameObject/{ => ComponentEntities/Entities}/MapMonster.cs (97%) rename src/NosCore.GameObject/{ => ComponentEntities/Entities}/MapNpc.cs (98%) rename src/NosCore.GameObject/{ => ComponentEntities/Entities}/Pet.cs (95%) rename src/NosCore.GameObject/{ => ComponentEntities/Entities}/Portal.cs (96%) rename src/NosCore.GameObject/{ => Infastructure}/IEventHandler.cs (96%) rename src/NosCore.GameObject/{ => Infastructure}/IPacketHandler.cs (97%) rename src/NosCore.GameObject/{Holders/BazaarItemsHolder.cs => Services/BazaarService/BazaarRegistry.cs} (55%) create mode 100644 src/NosCore.GameObject/Services/BazaarService/IBazaarRegistry.cs rename src/NosCore.GameObject/{ => Services/ExchangeService}/ExchangeData.cs (91%) create mode 100644 src/NosCore.GameObject/Services/ExchangeService/ExchangeRequestRegistry.cs create mode 100644 src/NosCore.GameObject/Services/ExchangeService/IExchangeRequestRegistry.cs rename src/NosCore.GameObject/{ => Services/FriendService}/CharacterRelation.cs (89%) create mode 100644 src/NosCore.GameObject/Services/FriendService/FriendRequestRegistry.cs rename src/NosCore.GameObject/{Holders/FriendRequestHolder.cs => Services/FriendService/IFriendRequestRegistry.cs} (65%) rename src/NosCore.GameObject/{ => Services/GroupService}/Group.cs (97%) create mode 100644 src/NosCore.GameObject/Services/GroupService/GroupRegistry.cs rename src/NosCore.GameObject/{Holders/ExchangeRequestHolder.cs => Services/GroupService/IGroupRegistry.cs} (66%) rename src/NosCore.GameObject/{ => Services/MailService}/Gift.cs (92%) rename src/NosCore.GameObject/{Helper => Services/MailService}/GiftHelper.cs (96%) create mode 100644 src/NosCore.GameObject/Services/MailService/IParcelRegistry.cs rename src/NosCore.GameObject/{Holders/ParcelHolder.cs => Services/MailService/ParcelRegistry.cs} (57%) create mode 100644 src/NosCore.GameObject/Services/MapInstanceGenerationService/IMapInstanceRegistry.cs create mode 100644 src/NosCore.GameObject/Services/MapInstanceGenerationService/MapInstanceRegistry.cs rename src/NosCore.GameObject/{Holders/MapInstanceHolder.cs => Services/MinilandService/IMinilandRegistry.cs} (61%) rename src/NosCore.GameObject/{Helper => Services/MinilandService}/MinilandHelper.cs (99%) create mode 100644 src/NosCore.GameObject/Services/MinilandService/MinilandRegistry.cs rename src/NosCore.GameObject/{Holders/MinilandHolder.cs => Services/ShopService/IShopRegistry.cs} (67%) rename src/NosCore.GameObject/{ => Services/ShopService}/Shop.cs (89%) rename src/NosCore.GameObject/{ => Services/ShopService}/ShopItem.cs (91%) create mode 100644 src/NosCore.GameObject/Services/ShopService/ShopRegistry.cs rename src/NosCore.GameObject/{ => Services/WarehouseService}/WarehouseItem.cs (90%) diff --git a/src/NosCore.Data/SkillPacket.cs b/src/NosCore.Data/SkillPacket.cs index dab970316..577b2684a 100644 --- a/src/NosCore.Data/SkillPacket.cs +++ b/src/NosCore.Data/SkillPacket.cs @@ -1,10 +1,6 @@ using NosCore.Packets.Attributes; using NosCore.Packets; -using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using NosCore.Packets.Enumerations; //todo move to NosCore.Packets diff --git a/src/NosCore.GameObject/Character.cs b/src/NosCore.GameObject/ComponentEntities/Entities/Character.cs similarity index 99% rename from src/NosCore.GameObject/Character.cs rename to src/NosCore.GameObject/ComponentEntities/Entities/Character.cs index 2f11880eb..718621f1e 100644 --- a/src/NosCore.GameObject/Character.cs +++ b/src/NosCore.GameObject/ComponentEntities/Entities/Character.cs @@ -33,10 +33,11 @@ using NosCore.Data.StaticEntities; using NosCore.GameObject.ComponentEntities.Extensions; using NosCore.GameObject.ComponentEntities.Interfaces; -using NosCore.GameObject.Networking; using NosCore.GameObject.Networking.ClientSession; using NosCore.GameObject.Services.ExchangeService; +using NosCore.GameObject.Services.GroupService; using NosCore.GameObject.Services.InventoryService; +using NosCore.GameObject.Services.ShopService; using NosCore.GameObject.Services.ItemGenerationService; using NosCore.GameObject.Services.MapInstanceGenerationService; using NosCore.GameObject.Services.NRunService; @@ -61,7 +62,6 @@ using NosCore.GameObject.Services.BattleService; using NosCore.GameObject.Services.BroadcastService; using NosCore.GameObject.Services.MapChangeService; -using NosCore.GameObject.Services.SkillService; using NosCore.GameObject.Services.SpeedCalculationService; using NosCore.Core.I18N; using NosCore.Networking; @@ -69,7 +69,7 @@ using NosCore.Networking.SessionGroup.ChannelMatcher; using MailData = NosCore.GameObject.InterChannelCommunication.Messages.MailData; -namespace NosCore.GameObject +namespace NosCore.GameObject.ComponentEntities.Entities { public class Character(IInventoryService inventory, IExchangeService exchangeService, IItemGenerationService itemProvider, diff --git a/src/NosCore.GameObject/Services/MapInstanceGenerationService/MapDesignObject.cs b/src/NosCore.GameObject/ComponentEntities/Entities/MapDesignObject.cs similarity index 97% rename from src/NosCore.GameObject/Services/MapInstanceGenerationService/MapDesignObject.cs rename to src/NosCore.GameObject/ComponentEntities/Entities/MapDesignObject.cs index 1b589c2ce..22055a6b6 100644 --- a/src/NosCore.GameObject/Services/MapInstanceGenerationService/MapDesignObject.cs +++ b/src/NosCore.GameObject/ComponentEntities/Entities/MapDesignObject.cs @@ -22,7 +22,7 @@ using NosCore.Packets.ServerPackets.Map; using NosCore.Packets.ServerPackets.Miniland; -namespace NosCore.GameObject.Services.MapInstanceGenerationService +namespace NosCore.GameObject.ComponentEntities.Entities { public class MapDesignObject : MinilandObjectDto { diff --git a/src/NosCore.GameObject/Services/MapItemGenerationService/MapItem.cs b/src/NosCore.GameObject/ComponentEntities/Entities/MapItem.cs similarity index 95% rename from src/NosCore.GameObject/Services/MapItemGenerationService/MapItem.cs rename to src/NosCore.GameObject/ComponentEntities/Entities/MapItem.cs index b041d0ff4..d7756d3e4 100644 --- a/src/NosCore.GameObject/Services/MapItemGenerationService/MapItem.cs +++ b/src/NosCore.GameObject/ComponentEntities/Entities/MapItem.cs @@ -29,8 +29,9 @@ using System.Reactive.Subjects; using System.Threading.Tasks; using NodaTime; +using NosCore.GameObject.Services.MapItemGenerationService; -namespace NosCore.GameObject.Services.MapItemGenerationService +namespace NosCore.GameObject.ComponentEntities.Entities { public class MapItem(long visualId) : ICountableEntity, IRequestableEntity> { diff --git a/src/NosCore.GameObject/MapMonster.cs b/src/NosCore.GameObject/ComponentEntities/Entities/MapMonster.cs similarity index 97% rename from src/NosCore.GameObject/MapMonster.cs rename to src/NosCore.GameObject/ComponentEntities/Entities/MapMonster.cs index 676eb1fe6..92969de66 100644 --- a/src/NosCore.GameObject/MapMonster.cs +++ b/src/NosCore.GameObject/ComponentEntities/Entities/MapMonster.cs @@ -22,6 +22,7 @@ using NosCore.GameObject.ComponentEntities.Extensions; using NosCore.GameObject.ComponentEntities.Interfaces; using NosCore.GameObject.Services.MapInstanceGenerationService; +using NosCore.GameObject.Services.ShopService; using NosCore.PathFinder.Interfaces; using NosCore.Shared.Enumerations; using Serilog; @@ -33,7 +34,7 @@ using System.Threading; using System.Collections.Concurrent; -namespace NosCore.GameObject +namespace NosCore.GameObject.ComponentEntities.Entities { public class MapMonster(ILogger logger, IHeuristic distanceCalculator, IClock clock, ISpeedCalculationService speedCalculationService) diff --git a/src/NosCore.GameObject/MapNpc.cs b/src/NosCore.GameObject/ComponentEntities/Entities/MapNpc.cs similarity index 98% rename from src/NosCore.GameObject/MapNpc.cs rename to src/NosCore.GameObject/ComponentEntities/Entities/MapNpc.cs index 80760999d..03728d822 100644 --- a/src/NosCore.GameObject/MapNpc.cs +++ b/src/NosCore.GameObject/ComponentEntities/Entities/MapNpc.cs @@ -26,6 +26,7 @@ using NosCore.GameObject.Services.ItemGenerationService; using NosCore.GameObject.Services.MapInstanceGenerationService; using NosCore.GameObject.Services.NRunService; +using NosCore.GameObject.Services.ShopService; using NosCore.PathFinder.Interfaces; using NosCore.Shared.Enumerations; using Serilog; @@ -38,7 +39,7 @@ using NodaTime; using System.Threading; -namespace NosCore.GameObject +namespace NosCore.GameObject.ComponentEntities.Entities { public class MapNpc(IItemGenerationService? itemProvider, ILogger logger, IHeuristic distanceCalculator, IClock clock) diff --git a/src/NosCore.GameObject/Pet.cs b/src/NosCore.GameObject/ComponentEntities/Entities/Pet.cs similarity index 95% rename from src/NosCore.GameObject/Pet.cs rename to src/NosCore.GameObject/ComponentEntities/Entities/Pet.cs index 8f952b481..a683671fe 100644 --- a/src/NosCore.GameObject/Pet.cs +++ b/src/NosCore.GameObject/ComponentEntities/Entities/Pet.cs @@ -20,14 +20,16 @@ using NosCore.Data.Dto; using NosCore.Data.StaticEntities; using NosCore.GameObject.ComponentEntities.Interfaces; +using NosCore.GameObject.Services.GroupService; using NosCore.GameObject.Services.MapInstanceGenerationService; +using NosCore.GameObject.Services.ShopService; using NosCore.Shared.Enumerations; using System; using System.Collections.Concurrent; using NodaTime; using System.Threading; -namespace NosCore.GameObject +namespace NosCore.GameObject.ComponentEntities.Entities { public class Pet : MapMonsterDto, INamedEntity //TODO replace MapMonsterDTO by the correct PetDTO { diff --git a/src/NosCore.GameObject/Portal.cs b/src/NosCore.GameObject/ComponentEntities/Entities/Portal.cs similarity index 96% rename from src/NosCore.GameObject/Portal.cs rename to src/NosCore.GameObject/ComponentEntities/Entities/Portal.cs index da397dfdd..2961c253d 100644 --- a/src/NosCore.GameObject/Portal.cs +++ b/src/NosCore.GameObject/ComponentEntities/Entities/Portal.cs @@ -21,7 +21,7 @@ using NosCore.Packets.ServerPackets.Portals; using System; -namespace NosCore.GameObject +namespace NosCore.GameObject.ComponentEntities.Entities { public class Portal : PortalDto { diff --git a/src/NosCore.GameObject/ComponentEntities/Extensions/AliveEntityExtension.cs b/src/NosCore.GameObject/ComponentEntities/Extensions/AliveEntityExtension.cs index 4c1976bb4..acf1f8927 100644 --- a/src/NosCore.GameObject/ComponentEntities/Extensions/AliveEntityExtension.cs +++ b/src/NosCore.GameObject/ComponentEntities/Extensions/AliveEntityExtension.cs @@ -41,15 +41,6 @@ using System.Threading.Tasks; using NodaTime; using NosCore.Networking; -using NosCore.GameObject.Networking.ClientSession; -using NosCore.Packets.ClientPackets.Battle; -using NosCore.Packets.ServerPackets.Battle; -using Microsoft.AspNetCore.Http; -using NosCore.Data.Enumerations.Battle; -using NosCore.Data.Enumerations.Map; -using static NosCore.Data.Enumerations.Buff.AdditionalTypes; -using System.Collections.Concurrent; -using System.Threading; namespace NosCore.GameObject.ComponentEntities.Extensions diff --git a/src/NosCore.GameObject/ComponentEntities/Extensions/GroupExtension.cs b/src/NosCore.GameObject/ComponentEntities/Extensions/GroupExtension.cs index 11421ab9b..1ede33863 100644 --- a/src/NosCore.GameObject/ComponentEntities/Extensions/GroupExtension.cs +++ b/src/NosCore.GameObject/ComponentEntities/Extensions/GroupExtension.cs @@ -18,6 +18,7 @@ // along with this program. If not, see . using NosCore.GameObject.ComponentEntities.Interfaces; +using NosCore.GameObject.Services.GroupService; using NosCore.Packets.ServerPackets.Shop; using System.Collections.Generic; using System.Linq; diff --git a/src/NosCore.GameObject/ComponentEntities/Extensions/VisualEntityExtension.cs b/src/NosCore.GameObject/ComponentEntities/Extensions/VisualEntityExtension.cs index 7b15323a1..53af3ef53 100644 --- a/src/NosCore.GameObject/ComponentEntities/Extensions/VisualEntityExtension.cs +++ b/src/NosCore.GameObject/ComponentEntities/Extensions/VisualEntityExtension.cs @@ -17,6 +17,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +using NosCore.GameObject.ComponentEntities.Entities; using NosCore.GameObject.ComponentEntities.Interfaces; using NosCore.Packets.Enumerations; using NosCore.Packets.ServerPackets.Chats; diff --git a/src/NosCore.GameObject/ComponentEntities/Interfaces/IAliveEntity.cs b/src/NosCore.GameObject/ComponentEntities/Interfaces/IAliveEntity.cs index 2a8772493..14bc84374 100644 --- a/src/NosCore.GameObject/ComponentEntities/Interfaces/IAliveEntity.cs +++ b/src/NosCore.GameObject/ComponentEntities/Interfaces/IAliveEntity.cs @@ -19,8 +19,7 @@ using System.Collections.Concurrent; using System.Threading; -using System.Threading.Tasks; -using NosCore.GameObject.Services.BattleService; +using NosCore.GameObject.Services.ShopService; namespace NosCore.GameObject.ComponentEntities.Interfaces { diff --git a/src/NosCore.GameObject/ComponentEntities/Interfaces/ICharacterEntity.cs b/src/NosCore.GameObject/ComponentEntities/Interfaces/ICharacterEntity.cs index 5f42d7f22..deaaec475 100644 --- a/src/NosCore.GameObject/ComponentEntities/Interfaces/ICharacterEntity.cs +++ b/src/NosCore.GameObject/ComponentEntities/Interfaces/ICharacterEntity.cs @@ -30,6 +30,7 @@ using System.Collections.Generic; using System.Threading.Tasks; using NosCore.GameObject.Services.BattleService; +using NosCore.GameObject.Services.GroupService; using NosCore.GameObject.Services.MapChangeService; using NosCore.Networking; using MailData = NosCore.GameObject.InterChannelCommunication.Messages.MailData; diff --git a/src/NosCore.GameObject/ComponentEntities/Interfaces/INamedEntity.cs b/src/NosCore.GameObject/ComponentEntities/Interfaces/INamedEntity.cs index a49b7dfea..251b4f24e 100644 --- a/src/NosCore.GameObject/ComponentEntities/Interfaces/INamedEntity.cs +++ b/src/NosCore.GameObject/ComponentEntities/Interfaces/INamedEntity.cs @@ -17,6 +17,8 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +using NosCore.GameObject.Services.GroupService; + namespace NosCore.GameObject.ComponentEntities.Interfaces { public interface INamedEntity : IAliveEntity diff --git a/src/NosCore.GameObject/IEventHandler.cs b/src/NosCore.GameObject/Infastructure/IEventHandler.cs similarity index 96% rename from src/NosCore.GameObject/IEventHandler.cs rename to src/NosCore.GameObject/Infastructure/IEventHandler.cs index 91c11518b..5f5245ad0 100644 --- a/src/NosCore.GameObject/IEventHandler.cs +++ b/src/NosCore.GameObject/Infastructure/IEventHandler.cs @@ -20,7 +20,7 @@ using NosCore.GameObject.Networking.ClientSession; using System.Threading.Tasks; -namespace NosCore.GameObject +namespace NosCore.GameObject.Infastructure { public interface IEventHandler : IEventHandler { diff --git a/src/NosCore.GameObject/IPacketHandler.cs b/src/NosCore.GameObject/Infastructure/IPacketHandler.cs similarity index 97% rename from src/NosCore.GameObject/IPacketHandler.cs rename to src/NosCore.GameObject/Infastructure/IPacketHandler.cs index 78ac98474..c356eb908 100644 --- a/src/NosCore.GameObject/IPacketHandler.cs +++ b/src/NosCore.GameObject/Infastructure/IPacketHandler.cs @@ -21,7 +21,7 @@ using NosCore.Packets.Interfaces; using System.Threading.Tasks; -namespace NosCore.GameObject +namespace NosCore.GameObject.Infastructure { public interface IPacketHandler { diff --git a/src/NosCore.GameObject/Networking/ClientSession/ClientSession.cs b/src/NosCore.GameObject/Networking/ClientSession/ClientSession.cs index b10acde36..36cba7689 100644 --- a/src/NosCore.GameObject/Networking/ClientSession/ClientSession.cs +++ b/src/NosCore.GameObject/Networking/ClientSession/ClientSession.cs @@ -35,6 +35,8 @@ using NosCore.Networking; using NosCore.Networking.Encoding; using NosCore.Shared.I18N; +using NosCore.GameObject.Infastructure; +using NosCore.GameObject.ComponentEntities.Entities; namespace NosCore.GameObject.Networking.ClientSession { diff --git a/src/NosCore.GameObject/Networking/ClientSession/DisconnectHandlers/ExchangeDisconnectHandler.cs b/src/NosCore.GameObject/Networking/ClientSession/DisconnectHandlers/ExchangeDisconnectHandler.cs index f86acda93..373f26bce 100644 --- a/src/NosCore.GameObject/Networking/ClientSession/DisconnectHandlers/ExchangeDisconnectHandler.cs +++ b/src/NosCore.GameObject/Networking/ClientSession/DisconnectHandlers/ExchangeDisconnectHandler.cs @@ -18,6 +18,7 @@ // along with this program. If not, see . using System.Threading.Tasks; +using NosCore.GameObject.ComponentEntities.Entities; using NosCore.GameObject.Services.BroadcastService; using NosCore.GameObject.Services.ExchangeService; using NosCore.Packets.Enumerations; diff --git a/src/NosCore.GameObject/Networking/ClientSession/LoginPacketHandlingStrategy.cs b/src/NosCore.GameObject/Networking/ClientSession/LoginPacketHandlingStrategy.cs index ddc37c1ca..bcce1860f 100644 --- a/src/NosCore.GameObject/Networking/ClientSession/LoginPacketHandlingStrategy.cs +++ b/src/NosCore.GameObject/Networking/ClientSession/LoginPacketHandlingStrategy.cs @@ -19,7 +19,6 @@ using System.Threading.Tasks; using NosCore.Data.Enumerations.I18N; -using NosCore.Packets.Attributes; using NosCore.Packets.Enumerations; using NosCore.Packets.Interfaces; using NosCore.Shared.I18N; diff --git a/src/NosCore.GameObject/Networking/ClientSession/WorldPacketHandlingStrategy.cs b/src/NosCore.GameObject/Networking/ClientSession/WorldPacketHandlingStrategy.cs index 9d5766580..a6944ea75 100644 --- a/src/NosCore.GameObject/Networking/ClientSession/WorldPacketHandlingStrategy.cs +++ b/src/NosCore.GameObject/Networking/ClientSession/WorldPacketHandlingStrategy.cs @@ -20,11 +20,10 @@ using System.Threading.Tasks; using NosCore.Data.CommandPackets; using NosCore.Data.Enumerations.I18N; +using NosCore.GameObject.Infastructure; using NosCore.Networking.SessionRef; using NosCore.Packets.Attributes; -using NosCore.Packets.ClientPackets.CharacterSelectionScreen; using NosCore.Packets.ClientPackets.Infrastructure; -using NosCore.Packets.ClientPackets.Login; using NosCore.Packets.ClientPackets.UI; using NosCore.Packets.Enumerations; using NosCore.Packets.Interfaces; diff --git a/src/NosCore.GameObject/Services/BattleService/BattleService.cs b/src/NosCore.GameObject/Services/BattleService/BattleService.cs index bf0dd051b..d9c1330c3 100644 --- a/src/NosCore.GameObject/Services/BattleService/BattleService.cs +++ b/src/NosCore.GameObject/Services/BattleService/BattleService.cs @@ -24,7 +24,6 @@ using NosCore.Packets.Enumerations; using NosCore.Packets.ServerPackets.Battle; using NosCore.Shared.Enumerations; -using static NosCore.Data.Enumerations.Buff.AdditionalTypes; namespace NosCore.GameObject.Services.BattleService; diff --git a/src/NosCore.GameObject/Services/BattleService/CharacterSkill.cs b/src/NosCore.GameObject/Services/BattleService/CharacterSkill.cs index 0fe5a46cc..d2671091e 100644 --- a/src/NosCore.GameObject/Services/BattleService/CharacterSkill.cs +++ b/src/NosCore.GameObject/Services/BattleService/CharacterSkill.cs @@ -1,8 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using NosCore.Data.Dto; using NosCore.Data.StaticEntities; diff --git a/src/NosCore.GameObject/Holders/BazaarItemsHolder.cs b/src/NosCore.GameObject/Services/BazaarService/BazaarRegistry.cs similarity index 55% rename from src/NosCore.GameObject/Holders/BazaarItemsHolder.cs rename to src/NosCore.GameObject/Services/BazaarService/BazaarRegistry.cs index 1f3fc155f..312102aab 100644 --- a/src/NosCore.GameObject/Holders/BazaarItemsHolder.cs +++ b/src/NosCore.GameObject/Services/BazaarService/BazaarRegistry.cs @@ -1,19 +1,19 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . @@ -25,11 +25,13 @@ using System.Collections.Generic; using System.Linq; -namespace NosCore.GameObject.Holders +namespace NosCore.GameObject.Services.BazaarService { - public class BazaarItemsHolder + public class BazaarRegistry : IBazaarRegistry { - public BazaarItemsHolder(IDao bazaarItemDao, + private readonly ConcurrentDictionary _bazaarItems; + + public BazaarRegistry(IDao bazaarItemDao, IDao itemInstanceDao, IDao characterDao) { var billist = bazaarItemDao.LoadAll().ToList(); @@ -38,14 +40,33 @@ public BazaarItemsHolder(IDao bazaarItemDao, var itemInstancelist = itemInstanceDao.Where(s => bzItemInstanceIds.Contains(s!.Id))?.ToList() ?? new List(); var characterList = characterDao.Where(s => bzCharacterIds.Contains(s.CharacterId))?.ToList() ?? new List(); - BazaarItems = new ConcurrentDictionary(billist.ToDictionary(x => x.BazaarItemId, + _bazaarItems = new ConcurrentDictionary(billist.ToDictionary(x => x.BazaarItemId, x => new BazaarLink { ItemInstance = (ItemInstanceDto?)itemInstancelist.First(s => s!.Id == x.ItemInstanceId), - BazaarItem = x, SellerName = characterList.First(s => s.CharacterId == x.SellerId).Name! + BazaarItem = x, + SellerName = characterList.First(s => s.CharacterId == x.SellerId).Name! })); } - public ConcurrentDictionary BazaarItems { get; set; } + public IEnumerable GetAll() => _bazaarItems.Values; + + public BazaarLink? GetById(long bazaarItemId) => + _bazaarItems.TryGetValue(bazaarItemId, out var link) ? link : null; + + public IEnumerable GetBySellerId(long sellerId) => + _bazaarItems.Values.Where(s => s.BazaarItem?.SellerId == sellerId); + + public void Register(long bazaarItemId, BazaarLink bazaarLink) => + _bazaarItems.TryAdd(bazaarItemId, bazaarLink); + + public bool Unregister(long bazaarItemId) => + _bazaarItems.TryRemove(bazaarItemId, out _); + + public void Update(long bazaarItemId, BazaarLink bazaarLink) => + _bazaarItems[bazaarItemId] = bazaarLink; + + public int CountBySellerId(long sellerId) => + _bazaarItems.Values.Count(o => o.BazaarItem?.SellerId == sellerId); } -} \ No newline at end of file +} diff --git a/src/NosCore.GameObject/Services/BazaarService/BazaarService.cs b/src/NosCore.GameObject/Services/BazaarService/BazaarService.cs index b2df935c9..d6ac88888 100644 --- a/src/NosCore.GameObject/Services/BazaarService/BazaarService.cs +++ b/src/NosCore.GameObject/Services/BazaarService/BazaarService.cs @@ -26,7 +26,6 @@ using NosCore.Data.Enumerations.I18N; using NosCore.Data.Enumerations.Items; using NosCore.Data.WebApi; -using NosCore.GameObject.Holders; using NosCore.Packets.Enumerations; using System; using System.Collections.Generic; @@ -36,7 +35,7 @@ namespace NosCore.GameObject.Services.BazaarService { - public class BazaarService(BazaarItemsHolder holder, IDao bazaarItemDao, + public class BazaarService(IBazaarRegistry bazaarRegistry, IDao bazaarItemDao, IDao itemInstanceDao, IClock clock) : IBazaarService { @@ -57,12 +56,14 @@ public List GetBazaar(long id, byte? index, byte? pageSize, BazaarLi IEnumerable bzlinks; if (id != -1) { - bzlinks = holder.BazaarItems.Values.Where(s => s.BazaarItem?.BazaarItemId == id); + var item = bazaarRegistry.GetById(id); + bzlinks = item != null ? new[] { item } : Enumerable.Empty(); } else { - bzlinks = holder.BazaarItems.Values.Where(s => - (s.BazaarItem?.SellerId == sellerFilter) || (sellerFilter == null)); + bzlinks = sellerFilter != null + ? bazaarRegistry.GetBySellerId(sellerFilter.Value) + : bazaarRegistry.GetAll(); } foreach (var bz in bzlinks) @@ -166,7 +167,7 @@ public List GetBazaar(long id, byte? index, byte? pageSize, BazaarLi public async Task DeleteBazaarAsync(long id, short count, string requestCharacterName) { - var bzlink = holder.BazaarItems.Values.FirstOrDefault(s => s.BazaarItem?.BazaarItemId == id); + var bzlink = bazaarRegistry.GetById(id); if (bzlink == null) { throw new ArgumentException(); @@ -180,7 +181,7 @@ public async Task DeleteBazaarAsync(long id, short count, string requestCh if ((bzlink.ItemInstance?.Amount == count) && (requestCharacterName == bzlink.SellerName)) { await bazaarItemDao.TryDeleteAsync(bzlink.BazaarItem!.BazaarItemId).ConfigureAwait(false); - holder.BazaarItems.TryRemove(bzlink.BazaarItem.BazaarItemId, out _); + bazaarRegistry.Unregister(bzlink.BazaarItem.BazaarItemId); await itemInstanceDao.TryDeleteAsync(bzlink.ItemInstance.Id).ConfigureAwait(false); } else @@ -195,8 +196,8 @@ public async Task DeleteBazaarAsync(long id, short count, string requestCh public async Task AddBazaarAsync(Guid itemInstanceId, long characterId, string? characterName, bool hasMedal, long price, bool isPackage, short duration, short amount) { - var items = holder.BazaarItems.Values.Where(o => o.BazaarItem!.SellerId == characterId); - if (items.Count() > 10 * (hasMedal ? 10 : 1) - 1) + var itemCount = bazaarRegistry.CountBySellerId(characterId); + if (itemCount > 10 * (hasMedal ? 10 : 1) - 1) { return LanguageKey.LIMIT_EXCEEDED; } @@ -235,10 +236,11 @@ public async Task AddBazaarAsync(Guid itemInstanceId, long characte ItemInstanceId = item!.Id }; bazaarItem = await bazaarItemDao.TryInsertOrUpdateAsync(bazaarItem).ConfigureAwait(true); - holder.BazaarItems.TryAdd(bazaarItem.BazaarItemId, + bazaarRegistry.Register(bazaarItem.BazaarItemId, new BazaarLink { - BazaarItem = bazaarItem, SellerName = characterName, + BazaarItem = bazaarItem, + SellerName = characterName, ItemInstance = (ItemInstanceDto)item }); @@ -247,8 +249,7 @@ public async Task AddBazaarAsync(Guid itemInstanceId, long characte public async Task ModifyBazaarAsync(long id, Json.Patch.JsonPatch bzMod) { - var item = holder.BazaarItems.Values - .FirstOrDefault(o => o.BazaarItem?.BazaarItemId == id); + var item = bazaarRegistry.GetById(id); if ((item?.BazaarItem == null) || (item.BazaarItem?.Amount != item.ItemInstance?.Amount)) { return null; @@ -258,7 +259,7 @@ public async Task AddBazaarAsync(Guid itemInstanceId, long characte item = JsonSerializer.Deserialize(result.Result, new JsonSerializerOptions().ConfigureForNodaTime(DateTimeZoneProviders.Tzdb)); var bz = item!.BazaarItem!; await bazaarItemDao.TryInsertOrUpdateAsync(bz).ConfigureAwait(true); - holder.BazaarItems[item.BazaarItem!.BazaarItemId] = item; + bazaarRegistry.Update(item.BazaarItem!.BazaarItemId, item); return item; } } diff --git a/src/NosCore.GameObject/Services/BazaarService/IBazaarRegistry.cs b/src/NosCore.GameObject/Services/BazaarService/IBazaarRegistry.cs new file mode 100644 index 000000000..ef1c74d7d --- /dev/null +++ b/src/NosCore.GameObject/Services/BazaarService/IBazaarRegistry.cs @@ -0,0 +1,35 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using NosCore.Data.WebApi; +using System.Collections.Generic; + +namespace NosCore.GameObject.Services.BazaarService +{ + public interface IBazaarRegistry + { + IEnumerable GetAll(); + BazaarLink? GetById(long bazaarItemId); + IEnumerable GetBySellerId(long sellerId); + void Register(long bazaarItemId, BazaarLink bazaarLink); + bool Unregister(long bazaarItemId); + void Update(long bazaarItemId, BazaarLink bazaarLink); + int CountBySellerId(long sellerId); + } +} diff --git a/src/NosCore.GameObject/Services/ChannelCommunicationService/Handlers/PostedPacketMessageChannelCommunicationMessageHandler.cs b/src/NosCore.GameObject/Services/ChannelCommunicationService/Handlers/PostedPacketMessageChannelCommunicationMessageHandler.cs index d1ce96dad..2f3b0a8e3 100644 --- a/src/NosCore.GameObject/Services/ChannelCommunicationService/Handlers/PostedPacketMessageChannelCommunicationMessageHandler.cs +++ b/src/NosCore.GameObject/Services/ChannelCommunicationService/Handlers/PostedPacketMessageChannelCommunicationMessageHandler.cs @@ -2,7 +2,6 @@ using NosCore.Data.Enumerations.I18N; using NosCore.Data.Enumerations.Interaction; using NosCore.GameObject.ComponentEntities.Interfaces; -using NosCore.Networking; using NosCore.Packets.Interfaces; using NosCore.Shared.I18N; using Serilog; diff --git a/src/NosCore.GameObject/Services/CharacterService/CharacterInitializationService.cs b/src/NosCore.GameObject/Services/CharacterService/CharacterInitializationService.cs index b3b8f6a1e..a9effb414 100644 --- a/src/NosCore.GameObject/Services/CharacterService/CharacterInitializationService.cs +++ b/src/NosCore.GameObject/Services/CharacterService/CharacterInitializationService.cs @@ -18,6 +18,7 @@ // along with this program. If not, see . using System.Threading.Tasks; +using NosCore.GameObject.ComponentEntities.Entities; using NosCore.GameObject.Services.MapInstanceGenerationService; using NosCore.GameObject.Services.MinilandService; diff --git a/src/NosCore.GameObject/Services/CharacterService/ICharacterInitializationService.cs b/src/NosCore.GameObject/Services/CharacterService/ICharacterInitializationService.cs index 080e6020a..e2583f6d5 100644 --- a/src/NosCore.GameObject/Services/CharacterService/ICharacterInitializationService.cs +++ b/src/NosCore.GameObject/Services/CharacterService/ICharacterInitializationService.cs @@ -17,6 +17,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +using NosCore.GameObject.ComponentEntities.Entities; using System.Threading.Tasks; namespace NosCore.GameObject.Services.CharacterService diff --git a/src/NosCore.GameObject/Services/EventLoaderService/EventLoaderService.cs b/src/NosCore.GameObject/Services/EventLoaderService/EventLoaderService.cs index 04ddc4d5f..8247ce8a6 100644 --- a/src/NosCore.GameObject/Services/EventLoaderService/EventLoaderService.cs +++ b/src/NosCore.GameObject/Services/EventLoaderService/EventLoaderService.cs @@ -18,6 +18,7 @@ // along with this program. If not, see . using NosCore.GameObject.ComponentEntities.Interfaces; +using NosCore.GameObject.Infastructure; using NosCore.GameObject.Networking.ClientSession; using System; using System.Collections.Generic; diff --git a/src/NosCore.GameObject/Services/EventLoaderService/Handlers/RemoveTimeoutStaticBonuses.cs b/src/NosCore.GameObject/Services/EventLoaderService/Handlers/RemoveTimeoutStaticBonuses.cs index 8f5b7316b..a4505eb8b 100644 --- a/src/NosCore.GameObject/Services/EventLoaderService/Handlers/RemoveTimeoutStaticBonuses.cs +++ b/src/NosCore.GameObject/Services/EventLoaderService/Handlers/RemoveTimeoutStaticBonuses.cs @@ -18,7 +18,6 @@ // along with this program. If not, see . using JetBrains.Annotations; -using NosCore.GameObject.Networking; using NosCore.GameObject.Networking.ClientSession; using NosCore.Packets.Enumerations; using System; diff --git a/src/NosCore.GameObject/Services/EventLoaderService/Handlers/SaveAll.cs b/src/NosCore.GameObject/Services/EventLoaderService/Handlers/SaveAll.cs index 4f70ad970..900a89b07 100644 --- a/src/NosCore.GameObject/Services/EventLoaderService/Handlers/SaveAll.cs +++ b/src/NosCore.GameObject/Services/EventLoaderService/Handlers/SaveAll.cs @@ -19,7 +19,6 @@ using JetBrains.Annotations; using NosCore.Data.Enumerations.I18N; -using NosCore.GameObject.Networking; using NosCore.GameObject.Networking.ClientSession; using System; using System.Linq; diff --git a/src/NosCore.GameObject/Services/EventLoaderService/ITimedEventHandler.cs b/src/NosCore.GameObject/Services/EventLoaderService/ITimedEventHandler.cs index 1c968ca55..b46fec88e 100644 --- a/src/NosCore.GameObject/Services/EventLoaderService/ITimedEventHandler.cs +++ b/src/NosCore.GameObject/Services/EventLoaderService/ITimedEventHandler.cs @@ -18,6 +18,7 @@ // along with this program. If not, see . using NodaTime; +using NosCore.GameObject.Infastructure; namespace NosCore.GameObject.Services.EventLoaderService { diff --git a/src/NosCore.GameObject/ExchangeData.cs b/src/NosCore.GameObject/Services/ExchangeService/ExchangeData.cs similarity index 91% rename from src/NosCore.GameObject/ExchangeData.cs rename to src/NosCore.GameObject/Services/ExchangeService/ExchangeData.cs index 4b123c925..4063bc3db 100644 --- a/src/NosCore.GameObject/ExchangeData.cs +++ b/src/NosCore.GameObject/Services/ExchangeService/ExchangeData.cs @@ -1,26 +1,26 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . using NosCore.GameObject.Services.InventoryService; using System.Collections.Concurrent; -namespace NosCore.GameObject +namespace NosCore.GameObject.Services.ExchangeService { public class ExchangeData { @@ -32,4 +32,4 @@ public class ExchangeData public bool ExchangeConfirmed { get; set; } } -} \ No newline at end of file +} diff --git a/src/NosCore.GameObject/Services/ExchangeService/ExchangeRequestRegistry.cs b/src/NosCore.GameObject/Services/ExchangeService/ExchangeRequestRegistry.cs new file mode 100644 index 000000000..ce092ab42 --- /dev/null +++ b/src/NosCore.GameObject/Services/ExchangeService/ExchangeRequestRegistry.cs @@ -0,0 +1,58 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; + +namespace NosCore.GameObject.Services.ExchangeService +{ + public class ExchangeRequestRegistry : IExchangeRequestRegistry + { + private readonly ConcurrentDictionary _exchangeDatas = new(); + private readonly ConcurrentDictionary _exchangeRequests = new(); + + public ExchangeData? GetExchangeData(long characterId) => + _exchangeDatas.TryGetValue(characterId, out var data) ? data : null; + + public void SetExchangeData(long characterId, ExchangeData data) => + _exchangeDatas[characterId] = data; + + public bool RemoveExchangeData(long characterId) => + _exchangeDatas.TryRemove(characterId, out _); + + public long? GetExchangeRequest(long characterId) => + _exchangeRequests.TryGetValue(characterId, out var targetId) ? targetId : null; + + public KeyValuePair? GetExchangeRequestPair(long characterId) + { + var pair = _exchangeRequests.FirstOrDefault(k => k.Key == characterId || k.Value == characterId); + return pair.Key == 0 && pair.Value == 0 ? null : pair; + } + + public void SetExchangeRequest(long characterId, long targetCharacterId) => + _exchangeRequests[characterId] = targetCharacterId; + + public bool RemoveExchangeRequest(long characterId) => + _exchangeRequests.TryRemove(characterId, out _); + + public bool HasExchange(long characterId) => + _exchangeRequests.Any(k => k.Key == characterId || k.Value == characterId); + } +} diff --git a/src/NosCore.GameObject/Services/ExchangeService/ExchangeService.cs b/src/NosCore.GameObject/Services/ExchangeService/ExchangeService.cs index bfcad36f6..e272fff39 100644 --- a/src/NosCore.GameObject/Services/ExchangeService/ExchangeService.cs +++ b/src/NosCore.GameObject/Services/ExchangeService/ExchangeService.cs @@ -1,19 +1,19 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . @@ -23,7 +23,6 @@ using NosCore.Data.Enumerations.I18N; using NosCore.GameObject.ComponentEntities.Extensions; using NosCore.GameObject.ComponentEntities.Interfaces; -using NosCore.GameObject.Holders; using NosCore.GameObject.Networking.ClientSession; using NosCore.GameObject.Services.InventoryService; using NosCore.GameObject.Services.ItemGenerationService; @@ -41,17 +40,20 @@ namespace NosCore.GameObject.Services.ExchangeService { public class ExchangeService(IItemGenerationService itemBuilderService, - IOptions worldConfiguration, ILogger logger, ExchangeRequestHolder requestHolder, + IOptions worldConfiguration, ILogger logger, IExchangeRequestRegistry exchangeRegistry, ILogLanguageLocalizer logLanguage, IGameLanguageLocalizer gameLanguageLocalizer) : IExchangeService { public void SetGold(long visualId, long gold, long bankGold) { - requestHolder.ExchangeDatas[visualId].Gold = gold; - requestHolder.ExchangeDatas[visualId].BankGold = bankGold; + var data = exchangeRegistry.GetExchangeData(visualId); + if (data != null) + { + data.Gold = gold; + data.BankGold = bankGold; + } } - //TODO: Remove these clientsessions as parameter public Tuple?> ValidateExchange(ClientSession session, ICharacterEntity targetSession) { @@ -131,68 +133,76 @@ public void SetGold(long visualId, long gold, long bankGold) public void ConfirmExchange(long visualId) { - requestHolder.ExchangeDatas[visualId].ExchangeConfirmed = true; + var data = exchangeRegistry.GetExchangeData(visualId); + if (data != null) + { + data.ExchangeConfirmed = true; + } } public bool IsExchangeConfirmed(long visualId) { - return requestHolder.ExchangeDatas[visualId].ExchangeConfirmed; + return exchangeRegistry.GetExchangeData(visualId)?.ExchangeConfirmed ?? false; } public ExchangeData GetData(long visualId) { - return requestHolder.ExchangeDatas[visualId]; + return exchangeRegistry.GetExchangeData(visualId) ?? new ExchangeData(); } public void AddItems(long visualId, InventoryItemInstance item, short amount) { - var data = requestHolder.ExchangeRequests.FirstOrDefault(k => k.Key == visualId); - if (data.Equals(default)) + var request = exchangeRegistry.GetExchangeRequest(visualId); + if (request == null) { logger.Error(logLanguage[LogLanguageKey.INVALID_EXCHANGE]); return; } - requestHolder.ExchangeDatas[data.Key].ExchangeItems.TryAdd(item, amount); + var data = exchangeRegistry.GetExchangeData(visualId); + data?.ExchangeItems.TryAdd(item, amount); } public bool CheckExchange(long visualId) { - return requestHolder.ExchangeRequests.Any(k => (k.Key == visualId) || (k.Value == visualId)); + return exchangeRegistry.HasExchange(visualId); } public long? GetTargetId(long visualId) { - var id = requestHolder.ExchangeRequests.FirstOrDefault(k => (k.Key == visualId) || (k.Value == visualId)); - if (id.Equals(default(KeyValuePair))) + var pair = exchangeRegistry.GetExchangeRequestPair(visualId); + if (pair == null) { return null; } - return id.Value == visualId ? id.Key : id.Value; + return pair.Value.Value == visualId ? pair.Value.Key : pair.Value.Value; } public bool CheckExchange(long visualId, long targetId) { - return requestHolder.ExchangeRequests.Any(k => (k.Key == visualId) && (k.Value == visualId)) || - requestHolder.ExchangeRequests.Any(k => (k.Key == targetId) && (k.Value == targetId)); + var pair1 = exchangeRegistry.GetExchangeRequestPair(visualId); + var pair2 = exchangeRegistry.GetExchangeRequestPair(targetId); + return (pair1 != null && pair1.Value.Key == visualId && pair1.Value.Value == visualId) || + (pair2 != null && pair2.Value.Key == targetId && pair2.Value.Value == targetId); } public ExcClosePacket? CloseExchange(long visualId, ExchangeResultType resultType) { - var data = requestHolder.ExchangeRequests.FirstOrDefault(k => (k.Key == visualId) || (k.Value == visualId)); - if ((data.Key == 0) && (data.Value == 0)) + var pair = exchangeRegistry.GetExchangeRequestPair(visualId); + if (pair == null) { logger.Error(logLanguage[LogLanguageKey.INVALID_EXCHANGE]); return null; } - if (!requestHolder.ExchangeDatas.TryRemove(data.Key, out _) || !requestHolder.ExchangeRequests.TryRemove(data.Key, out _)) + var data = pair.Value; + if (!exchangeRegistry.RemoveExchangeData(data.Key) || !exchangeRegistry.RemoveExchangeRequest(data.Key)) { logger.Error(logLanguage[LogLanguageKey.TRY_REMOVE_FAILED], data.Key); } - if (!requestHolder.ExchangeDatas.TryRemove(data.Value, out _) || !requestHolder.ExchangeRequests.TryRemove(data.Value, out _)) + if (!exchangeRegistry.RemoveExchangeData(data.Value) || !exchangeRegistry.RemoveExchangeRequest(data.Value)) { logger.Error(logLanguage[LogLanguageKey.TRY_REMOVE_FAILED], data.Value); } @@ -211,10 +221,10 @@ public bool OpenExchange(long visualId, long targetVisualId) return false; } - requestHolder.ExchangeRequests[visualId] = targetVisualId; - requestHolder.ExchangeRequests[targetVisualId] = visualId; - requestHolder.ExchangeDatas[visualId] = new ExchangeData(); - requestHolder.ExchangeDatas[targetVisualId] = new ExchangeData(); + exchangeRegistry.SetExchangeRequest(visualId, targetVisualId); + exchangeRegistry.SetExchangeRequest(targetVisualId, visualId); + exchangeRegistry.SetExchangeData(visualId, new ExchangeData()); + exchangeRegistry.SetExchangeData(targetVisualId, new ExchangeData()); return true; } @@ -222,11 +232,14 @@ public List> ProcessExchange(long firstUser, long IInventoryService sessionInventory, IInventoryService targetInventory) { var usersArray = new[] { firstUser, secondUser }; - var items = new List>(); //SessionId, PocketChange + var items = new List>(); foreach (var user in usersArray) { - foreach (var item in requestHolder.ExchangeDatas[user].ExchangeItems) + var userData = exchangeRegistry.GetExchangeData(user); + if (userData == null) continue; + + foreach (var item in userData.ExchangeItems) { var destInventory = user == firstUser ? targetInventory : sessionInventory; var originInventory = user == firstUser ? sessionInventory : targetInventory; @@ -262,4 +275,4 @@ public List> ProcessExchange(long firstUser, long return items; } } -} \ No newline at end of file +} diff --git a/src/NosCore.GameObject/Services/ExchangeService/IExchangeRequestRegistry.cs b/src/NosCore.GameObject/Services/ExchangeService/IExchangeRequestRegistry.cs new file mode 100644 index 000000000..5ef24ec37 --- /dev/null +++ b/src/NosCore.GameObject/Services/ExchangeService/IExchangeRequestRegistry.cs @@ -0,0 +1,36 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Collections.Generic; + +namespace NosCore.GameObject.Services.ExchangeService +{ + public interface IExchangeRequestRegistry + { + ExchangeData? GetExchangeData(long characterId); + void SetExchangeData(long characterId, ExchangeData data); + bool RemoveExchangeData(long characterId); + + long? GetExchangeRequest(long characterId); + KeyValuePair? GetExchangeRequestPair(long characterId); + void SetExchangeRequest(long characterId, long targetCharacterId); + bool RemoveExchangeRequest(long characterId); + bool HasExchange(long characterId); + } +} diff --git a/src/NosCore.GameObject/CharacterRelation.cs b/src/NosCore.GameObject/Services/FriendService/CharacterRelation.cs similarity index 89% rename from src/NosCore.GameObject/CharacterRelation.cs rename to src/NosCore.GameObject/Services/FriendService/CharacterRelation.cs index a43cbd61f..804614951 100644 --- a/src/NosCore.GameObject/CharacterRelation.cs +++ b/src/NosCore.GameObject/Services/FriendService/CharacterRelation.cs @@ -1,28 +1,28 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . using NosCore.Data.Dto; -namespace NosCore.GameObject +namespace NosCore.GameObject.Services.FriendService { public class CharacterRelation : CharacterRelationDto { public string? CharacterName { get; set; } } -} \ No newline at end of file +} diff --git a/src/NosCore.GameObject/Services/FriendService/FriendRequestRegistry.cs b/src/NosCore.GameObject/Services/FriendService/FriendRequestRegistry.cs new file mode 100644 index 000000000..1acf513e5 --- /dev/null +++ b/src/NosCore.GameObject/Services/FriendService/FriendRequestRegistry.cs @@ -0,0 +1,40 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; + +namespace NosCore.GameObject.Services.FriendService +{ + public class FriendRequestRegistry : IFriendRequestRegistry + { + private readonly ConcurrentDictionary _friendRequests = new(); + + public IEnumerable> GetRequestsForCharacter(long characterId) => + _friendRequests.Where(s => s.Value.ReceiverId == characterId || s.Value.SenderId == characterId); + + public void RegisterRequest(Guid requestId, long senderId, long receiverId) => + _friendRequests[requestId] = (senderId, receiverId); + + public bool UnregisterRequest(Guid requestId) => + _friendRequests.TryRemove(requestId, out _); + } +} diff --git a/src/NosCore.GameObject/Services/FriendService/FriendService.cs b/src/NosCore.GameObject/Services/FriendService/FriendService.cs index 5a32ea83f..419a36ce5 100644 --- a/src/NosCore.GameObject/Services/FriendService/FriendService.cs +++ b/src/NosCore.GameObject/Services/FriendService/FriendService.cs @@ -1,19 +1,19 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . @@ -21,7 +21,6 @@ using NosCore.Data.Dto; using NosCore.Data.Enumerations.I18N; using NosCore.Data.WebApi; -using NosCore.GameObject.Holders; using NosCore.Packets.Enumerations; using NosCore.Shared.I18N; using Serilog; @@ -37,7 +36,7 @@ namespace NosCore.GameObject.Services.FriendService { public class FriendService(ILogger logger, IDao characterRelationDao, - IDao characterDao, FriendRequestHolder friendRequestHolder, + IDao characterDao, IFriendRequestRegistry friendRequestRegistry, IPubSubHub pubSubHub, IChannelHub channelHub, ILogLanguageLocalizer logLanguage) : IFriendService { @@ -48,9 +47,9 @@ public async Task AddFriendAsync(long characterId, long secondChara var character = accounts.FirstOrDefault(s => s.ConnectedCharacter?.Id == characterId && servers.Where(c => c.Type == ServerType.WorldServer).Any(x => x.Id == s.ChannelId)); var targetCharacter = accounts.FirstOrDefault(s => s.ConnectedCharacter?.Id == secondCharacterId && servers.Where(c => c.Type == ServerType.WorldServer).Any(x => x.Id == s.ChannelId)); - var friendRequest = friendRequestHolder.FriendRequestCharacters.Where(s => - (s.Value.Item2 == character?.ConnectedCharacter?.Id) && - (s.Value.Item1 == targetCharacter?.ConnectedCharacter?.Id)).ToList(); + var friendRequest = friendRequestRegistry.GetRequestsForCharacter(character?.ConnectedCharacter?.Id ?? 0) + .Where(s => s.Value.ReceiverId == character?.ConnectedCharacter?.Id && + s.Value.SenderId == targetCharacter?.ConnectedCharacter?.Id).ToList(); if ((character != null) && (targetCharacter != null)) { if (character.ChannelId != targetCharacter.ChannelId) @@ -86,9 +85,9 @@ public async Task AddFriendAsync(long characterId, long secondChara if (!friendRequest.Any()) { - friendRequestHolder.FriendRequestCharacters[Guid.NewGuid()] = - new Tuple(character.ConnectedCharacter.Id, - targetCharacter.ConnectedCharacter.Id); + friendRequestRegistry.RegisterRequest(Guid.NewGuid(), + character.ConnectedCharacter.Id, + targetCharacter.ConnectedCharacter.Id); return LanguageKey.FRIEND_REQUEST_SENT; } @@ -111,19 +110,19 @@ public async Task AddFriendAsync(long characterId, long secondChara }; await characterRelationDao.TryInsertOrUpdateAsync(data2).ConfigureAwait(false); - friendRequestHolder.FriendRequestCharacters.TryRemove(friendRequest.First().Key, out _); + friendRequestRegistry.UnregisterRequest(friendRequest.First().Key); return LanguageKey.FRIEND_ADDED; case FinsPacketType.Rejected: - friendRequestHolder.FriendRequestCharacters.TryRemove(friendRequest.First().Key, out _); + friendRequestRegistry.UnregisterRequest(friendRequest.First().Key); return LanguageKey.FRIEND_REJECTED; default: logger.Error(logLanguage[LogLanguageKey.INVITETYPE_UNKNOWN]); - friendRequestHolder.FriendRequestCharacters.TryRemove(friendRequest.First().Key, out _); + friendRequestRegistry.UnregisterRequest(friendRequest.First().Key); throw new ArgumentException(); } } - friendRequestHolder.FriendRequestCharacters.TryRemove(friendRequest.First().Key, out _); + friendRequestRegistry.UnregisterRequest(friendRequest.First().Key); throw new ArgumentException(); } @@ -141,7 +140,7 @@ public async Task> GetFriendsAsync(long id) var servers = await channelHub.GetCommunicationChannels(); var accounts = await pubSubHub.GetSubscribersAsync(); var character = accounts.FirstOrDefault(s => s.ConnectedCharacter?.Id == rel.RelatedCharacterId && servers.Where(c => c.Type == ServerType.WorldServer).Any(x => x.Id == s.ChannelId)); - + charList.Add(new CharacterRelationStatus { CharacterName = (await characterDao.FirstOrDefaultAsync(s => s.CharacterId == rel.RelatedCharacterId).ConfigureAwait(false))?.Name, @@ -175,4 +174,4 @@ public async Task DeleteAsync(Guid id) return true; } } -} \ No newline at end of file +} diff --git a/src/NosCore.GameObject/Holders/FriendRequestHolder.cs b/src/NosCore.GameObject/Services/FriendService/IFriendRequestRegistry.cs similarity index 65% rename from src/NosCore.GameObject/Holders/FriendRequestHolder.cs rename to src/NosCore.GameObject/Services/FriendService/IFriendRequestRegistry.cs index bf1cb98d8..003d5b3e9 100644 --- a/src/NosCore.GameObject/Holders/FriendRequestHolder.cs +++ b/src/NosCore.GameObject/Services/FriendService/IFriendRequestRegistry.cs @@ -1,29 +1,31 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . using System; -using System.Collections.Concurrent; +using System.Collections.Generic; -namespace NosCore.GameObject.Holders +namespace NosCore.GameObject.Services.FriendService { - public class FriendRequestHolder + public interface IFriendRequestRegistry { - public ConcurrentDictionary> FriendRequestCharacters { get; set; } = new(); + IEnumerable> GetRequestsForCharacter(long characterId); + void RegisterRequest(Guid requestId, long senderId, long receiverId); + bool UnregisterRequest(Guid requestId); } -} \ No newline at end of file +} diff --git a/src/NosCore.GameObject/Group.cs b/src/NosCore.GameObject/Services/GroupService/Group.cs similarity index 97% rename from src/NosCore.GameObject/Group.cs rename to src/NosCore.GameObject/Services/GroupService/Group.cs index 26a3b4e2a..4916f1a80 100644 --- a/src/NosCore.GameObject/Group.cs +++ b/src/NosCore.GameObject/Services/GroupService/Group.cs @@ -1,19 +1,19 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . @@ -32,7 +32,7 @@ using NosCore.Networking.SessionGroup; -namespace NosCore.GameObject +namespace NosCore.GameObject.Services.GroupService { public class Group(GroupType type, ISessionGroupFactory sessionGroupFactory) : ConcurrentDictionary, Tuple>, IBroadcastable @@ -113,4 +113,4 @@ public void LeaveGroup(INamedEntity namedEntity) TryRemove(new Tuple(namedEntity.VisualType, namedEntity.VisualId), out _); } } -} \ No newline at end of file +} diff --git a/src/NosCore.GameObject/Services/GroupService/GroupRegistry.cs b/src/NosCore.GameObject/Services/GroupService/GroupRegistry.cs new file mode 100644 index 000000000..40b84fcf1 --- /dev/null +++ b/src/NosCore.GameObject/Services/GroupService/GroupRegistry.cs @@ -0,0 +1,62 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Collections.Concurrent; +using System.Threading; + +namespace NosCore.GameObject.Services.GroupService +{ + public class GroupRegistry : IGroupRegistry + { + private readonly ConcurrentDictionary _groupsById = new(); + private readonly ConcurrentDictionary _characterToGroupId = new(); + private long _nextId; + + public Group? GetById(long groupId) + { + _groupsById.TryGetValue(groupId, out var group); + return group; + } + + public void Register(Group group) + { + _groupsById[group.GroupId] = group; + } + + public void Unregister(long groupId) + { + _groupsById.TryRemove(groupId, out _); + } + + public void RegisterMember(long characterId, long groupId) + { + _characterToGroupId[characterId] = groupId; + } + + public void UnregisterMember(long characterId) + { + _characterToGroupId.TryRemove(characterId, out _); + } + + public long GetNextGroupId() + { + return Interlocked.Increment(ref _nextId); + } + } +} diff --git a/src/NosCore.GameObject/Holders/ExchangeRequestHolder.cs b/src/NosCore.GameObject/Services/GroupService/IGroupRegistry.cs similarity index 66% rename from src/NosCore.GameObject/Holders/ExchangeRequestHolder.cs rename to src/NosCore.GameObject/Services/GroupService/IGroupRegistry.cs index 4cc4071a7..d2eddf9b3 100644 --- a/src/NosCore.GameObject/Holders/ExchangeRequestHolder.cs +++ b/src/NosCore.GameObject/Services/GroupService/IGroupRegistry.cs @@ -1,30 +1,31 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . -using System.Collections.Concurrent; - -namespace NosCore.GameObject.Holders +namespace NosCore.GameObject.Services.GroupService { - public class ExchangeRequestHolder + public interface IGroupRegistry { - public readonly ConcurrentDictionary ExchangeDatas = new(); - - public readonly ConcurrentDictionary ExchangeRequests = new(); + Group? GetById(long groupId); + void Register(Group group); + void Unregister(long groupId); + void RegisterMember(long characterId, long groupId); + void UnregisterMember(long characterId); + long GetNextGroupId(); } -} \ No newline at end of file +} diff --git a/src/NosCore.GameObject/Services/GuriRunnerService/GuriRunnerService.cs b/src/NosCore.GameObject/Services/GuriRunnerService/GuriRunnerService.cs index 54053e7c2..3944a8f65 100644 --- a/src/NosCore.GameObject/Services/GuriRunnerService/GuriRunnerService.cs +++ b/src/NosCore.GameObject/Services/GuriRunnerService/GuriRunnerService.cs @@ -17,6 +17,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +using NosCore.GameObject.Infastructure; using NosCore.GameObject.Networking.ClientSession; using NosCore.Packets.ClientPackets.UI; using System; diff --git a/src/NosCore.GameObject/Services/GuriRunnerService/Handlers/SpeakerGuriHandler.cs b/src/NosCore.GameObject/Services/GuriRunnerService/Handlers/SpeakerGuriHandler.cs index c384685b1..6be005e37 100644 --- a/src/NosCore.GameObject/Services/GuriRunnerService/Handlers/SpeakerGuriHandler.cs +++ b/src/NosCore.GameObject/Services/GuriRunnerService/Handlers/SpeakerGuriHandler.cs @@ -22,7 +22,6 @@ using NosCore.Data.Enumerations.I18N; using NosCore.Data.Enumerations.Items; using NosCore.GameObject.ComponentEntities.Extensions; -using NosCore.GameObject.Networking; using NosCore.GameObject.Networking.ClientSession; using NosCore.GameObject.Services.InventoryService; using NosCore.Packets.ClientPackets.UI; diff --git a/src/NosCore.GameObject/Services/GuriRunnerService/IGuriEventHandler.cs b/src/NosCore.GameObject/Services/GuriRunnerService/IGuriEventHandler.cs index 485a66332..f0b0b9106 100644 --- a/src/NosCore.GameObject/Services/GuriRunnerService/IGuriEventHandler.cs +++ b/src/NosCore.GameObject/Services/GuriRunnerService/IGuriEventHandler.cs @@ -17,6 +17,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +using NosCore.GameObject.Infastructure; using NosCore.Packets.ClientPackets.UI; namespace NosCore.GameObject.Services.GuriRunnerService diff --git a/src/NosCore.GameObject/Services/ItemGenerationService/IUseItemEventHandler.cs b/src/NosCore.GameObject/Services/ItemGenerationService/IUseItemEventHandler.cs index 25d716b7f..8a05c4601 100644 --- a/src/NosCore.GameObject/Services/ItemGenerationService/IUseItemEventHandler.cs +++ b/src/NosCore.GameObject/Services/ItemGenerationService/IUseItemEventHandler.cs @@ -17,6 +17,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +using NosCore.GameObject.Infastructure; using NosCore.GameObject.Services.InventoryService; using NosCore.Packets.ClientPackets.Inventory; using System; diff --git a/src/NosCore.GameObject/Gift.cs b/src/NosCore.GameObject/Services/MailService/Gift.cs similarity index 92% rename from src/NosCore.GameObject/Gift.cs rename to src/NosCore.GameObject/Services/MailService/Gift.cs index 518b39a64..d7770e3f0 100644 --- a/src/NosCore.GameObject/Gift.cs +++ b/src/NosCore.GameObject/Services/MailService/Gift.cs @@ -1,23 +1,23 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . -namespace NosCore.GameObject +namespace NosCore.GameObject.Services.MailService { public class Gift { @@ -39,8 +39,8 @@ public Gift(short vnum, byte amount, short design = 0, bool isRareRandom = false public short VNum { get; set; } - public bool IsRandomRare { get; set; } - public bool IsRareRandom { get; set; } + + public bool IsRandomRare { get; set; } } -} \ No newline at end of file +} diff --git a/src/NosCore.GameObject/Helper/GiftHelper.cs b/src/NosCore.GameObject/Services/MailService/GiftHelper.cs similarity index 96% rename from src/NosCore.GameObject/Helper/GiftHelper.cs rename to src/NosCore.GameObject/Services/MailService/GiftHelper.cs index 3a0952170..9c1f8f01d 100644 --- a/src/NosCore.GameObject/Helper/GiftHelper.cs +++ b/src/NosCore.GameObject/Services/MailService/GiftHelper.cs @@ -1,19 +1,19 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . @@ -23,7 +23,7 @@ using NosCore.GameObject.ComponentEntities.Extensions; using NosCore.GameObject.ComponentEntities.Interfaces; -namespace NosCore.GameObject.Helper; +namespace NosCore.GameObject.Services.MailService; public static class GiftHelper { @@ -62,4 +62,4 @@ public static MailRequest GenerateMailRequest(IClock clock, ICharacterEntity cha }; return new MailRequest { Mail = mail, VNum = vnum, Amount = amount, Rare = rare, Upgrade = upgrade }; } -} \ No newline at end of file +} diff --git a/src/NosCore.GameObject/Services/MailService/IParcelRegistry.cs b/src/NosCore.GameObject/Services/MailService/IParcelRegistry.cs new file mode 100644 index 000000000..807a11ce3 --- /dev/null +++ b/src/NosCore.GameObject/Services/MailService/IParcelRegistry.cs @@ -0,0 +1,34 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Collections.Concurrent; +using NosCore.GameObject.InterChannelCommunication.Messages; + +namespace NosCore.GameObject.Services.MailService +{ + public interface IParcelRegistry + { + ConcurrentDictionary GetMails(long characterId, bool isSenderCopy); + MailData? GetMail(long characterId, bool isSenderCopy, long mailId); + void AddMail(long characterId, bool isSenderCopy, long mailId, MailData mailData); + bool RemoveMail(long characterId, bool isSenderCopy, long mailId, out MailData? mailData); + void UpdateMail(long characterId, bool isSenderCopy, long mailId, MailData mailData); + long GetNextMailId(long characterId, bool isSenderCopy); + } +} diff --git a/src/NosCore.GameObject/Services/MailService/MailService.cs b/src/NosCore.GameObject/Services/MailService/MailService.cs index 32b22caa7..22b7b838d 100644 --- a/src/NosCore.GameObject/Services/MailService/MailService.cs +++ b/src/NosCore.GameObject/Services/MailService/MailService.cs @@ -26,7 +26,6 @@ using NosCore.Data.Enumerations.Items; using NosCore.Data.StaticEntities; using NosCore.Data.WebApi; -using NosCore.GameObject.Holders; using NosCore.GameObject.Services.ItemGenerationService; using System; using System.Collections.Generic; @@ -45,21 +44,22 @@ namespace NosCore.GameObject.Services.MailService public class MailService(IDao mailDao, IDao itemInstanceDao, IPubSubHub pubSubHub, IChannelHub channelHub, List items, IItemGenerationService itemProvider, - ParcelHolder parcelHolder, + IParcelRegistry parcelRegistry, IDao characterDto) : IMailService { public List GetMails(long id, long characterId, bool senderCopy) { - var mails = parcelHolder[characterId][false].Values.Concat(parcelHolder[characterId][true].Values); + var mails = parcelRegistry.GetMails(characterId, false).Values.Concat(parcelRegistry.GetMails(characterId, true).Values); if (id == -1) { return mails.ToList(); } - if (parcelHolder[characterId][senderCopy].ContainsKey(id)) + var mail = parcelRegistry.GetMail(characterId, senderCopy, id); + if (mail != null) { - mails = new[] { parcelHolder[characterId][senderCopy][id] }; + mails = new[] { mail }; } else { @@ -71,15 +71,19 @@ public List GetMails(long id, long characterId, bool senderCopy) public async Task DeleteMailAsync(long id, long characterId, bool senderCopy) { - var mail = parcelHolder[characterId][senderCopy][id]; + var mail = parcelRegistry.GetMail(characterId, senderCopy, id); + if (mail == null) + { + return false; + } + await mailDao.TryDeleteAsync(mail.MailDto.MailId).ConfigureAwait(false); if (mail.ItemInstance != null) { await itemInstanceDao.TryDeleteAsync(mail.ItemInstance.Id).ConfigureAwait(false); } - parcelHolder[characterId][senderCopy].TryRemove(id, out var maildata); - if (maildata == null) + if (!parcelRegistry.RemoveMail(characterId, senderCopy, id, out var maildata) || maildata == null) { return false; } @@ -102,8 +106,8 @@ public async Task DeleteMailAsync(long id, long characterId, bool senderCo var result = mailData.Apply(JsonDocument.Parse(JsonSerializer.SerializeToUtf8Bytes(mail, new JsonSerializerOptions().ConfigureForNodaTime(DateTimeZoneProviders.Tzdb))).RootElement); mail = JsonSerializer.Deserialize(result.GetRawText())!; await mailDao.TryInsertOrUpdateAsync(mail).ConfigureAwait(false); - var savedData = - parcelHolder[mail.IsSenderCopy ? (long)mail.SenderId! : mail.ReceiverId][mail.IsSenderCopy] + var targetCharacterId = mail.IsSenderCopy ? (long)mail.SenderId! : mail.ReceiverId; + var savedData = parcelRegistry.GetMails(targetCharacterId, mail.IsSenderCopy) .FirstOrDefault(s => s.Value.MailDto.MailId == id); if (savedData.Value.ItemInstance == null || savedData.Value.ReceiverName == null) { @@ -112,8 +116,8 @@ public async Task DeleteMailAsync(long id, long characterId, bool senderCo var maildata = await GenerateMailDataAsync(mail, savedData.Value.ItemType, savedData.Value.ItemInstance, savedData.Value.ReceiverName).ConfigureAwait(false); maildata.MailId = savedData.Value.MailId; - parcelHolder[mail.IsSenderCopy ? mail.SenderId ?? 0 : mail.ReceiverId][mail.IsSenderCopy][ - savedData.Key] = maildata; + parcelRegistry.UpdateMail(mail.IsSenderCopy ? mail.SenderId ?? 0 : mail.ReceiverId, mail.IsSenderCopy, + savedData.Key, maildata); return maildata; } @@ -184,7 +188,7 @@ public async Task SendMailAsync(MailDto mail, short? vNum, short? amount, return false; } var mailData = await GenerateMailDataAsync(mailref, (short?)it?.ItemType ?? -1, itemInstance, receiverName).ConfigureAwait(false); - parcelHolder[mailref.ReceiverId][mailData.MailDto.IsSenderCopy].TryAdd(mailData.MailId, mailData); + parcelRegistry.AddMail(mailref.ReceiverId, mailData.MailDto.IsSenderCopy, mailData.MailId, mailData); await NotifyAsync(0, receiver, mailData).ConfigureAwait(false); if (mailref.SenderId == null) @@ -199,8 +203,7 @@ public async Task SendMailAsync(MailDto mail, short? vNum, short? amount, mailref.ItemInstanceId = itemInstance?.Id; mailref = await mailDao.TryInsertOrUpdateAsync(mailref).ConfigureAwait(false); var mailDataCopy = await GenerateMailDataAsync(mailref, (short?)it?.ItemType ?? -1, itemInstance!, receiverName).ConfigureAwait(false); - parcelHolder[mailref.ReceiverId][mailDataCopy.MailDto.IsSenderCopy] - .TryAdd(mailDataCopy.MailId, mailDataCopy); + parcelRegistry.AddMail(mailref.ReceiverId, mailDataCopy.MailDto.IsSenderCopy, mailDataCopy.MailId, mailDataCopy); await NotifyAsync(0, receiver, mailDataCopy).ConfigureAwait(false); return true; @@ -209,14 +212,13 @@ public async Task SendMailAsync(MailDto mail, short? vNum, short? amount, private async Task GenerateMailDataAsync(MailDto mailref, short itemType, IItemInstanceDto itemInstance, string receiverName) { - var count = parcelHolder[mailref.ReceiverId][mailref.IsSenderCopy].Select(s => s.Key).DefaultIfEmpty(-1) - .Max(); + var nextMailId = parcelRegistry.GetNextMailId(mailref.ReceiverId, mailref.IsSenderCopy); var sender = mailref.SenderId != null ? (await characterDto.FirstOrDefaultAsync(s => s.CharacterId == mailref.SenderId).ConfigureAwait(false))?.Name : "NOSMALL"; return new MailData { ReceiverName = receiverName, - MailId = (short)++count, + MailId = (short)nextMailId, MailDto = mailref, ItemInstance = (ItemInstanceDto)itemInstance, ItemType = itemType, diff --git a/src/NosCore.GameObject/Holders/ParcelHolder.cs b/src/NosCore.GameObject/Services/MailService/ParcelRegistry.cs similarity index 57% rename from src/NosCore.GameObject/Holders/ParcelHolder.cs rename to src/NosCore.GameObject/Services/MailService/ParcelRegistry.cs index aaef06a38..5cd6ffc01 100644 --- a/src/NosCore.GameObject/Holders/ParcelHolder.cs +++ b/src/NosCore.GameObject/Services/MailService/ParcelRegistry.cs @@ -1,19 +1,19 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . @@ -25,19 +25,19 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; -using MailData = NosCore.GameObject.InterChannelCommunication.Messages.MailData; +using NosCore.GameObject.InterChannelCommunication.Messages; -namespace NosCore.GameObject.Holders +namespace NosCore.GameObject.Services.MailService { - public class ParcelHolder : ConcurrentDictionary>> + public class ParcelRegistry : IParcelRegistry { + private readonly ConcurrentDictionary>> _parcels = new(); private readonly IDao _characterDao; private readonly IDao _itemInstanceDao; private readonly List _items; private readonly IDao _mailDao; - public ParcelHolder(IDao characterDao, IDao mailDao, List items, + public ParcelRegistry(IDao characterDao, IDao mailDao, List items, IDao itemInstanceDao) { _mailDao = mailDao; @@ -47,24 +47,52 @@ public ParcelHolder(IDao characterDao, IDao m _ = InitializeAsync(); } - public new ConcurrentDictionary> this[long characterId] + public ConcurrentDictionary GetMails(long characterId, bool isSenderCopy) { - // returns value if exists - get - { - if (ContainsKey(characterId)) - { - return this.First(s => s.Key == characterId).Value; - } + EnsureCharacterExists(characterId); + return _parcels[characterId][isSenderCopy]; + } + + public MailData? GetMail(long characterId, bool isSenderCopy, long mailId) + { + EnsureCharacterExists(characterId); + return _parcels[characterId][isSenderCopy].TryGetValue(mailId, out var mail) ? mail : null; + } + + public void AddMail(long characterId, bool isSenderCopy, long mailId, MailData mailData) + { + EnsureCharacterExists(characterId); + _parcels[characterId][isSenderCopy].TryAdd(mailId, mailData); + } - TryAdd(characterId, new ConcurrentDictionary>()); - this.First(s => s.Key == characterId).Value - .TryAdd(false, new ConcurrentDictionary()); - this.First(s => s.Key == characterId).Value - .TryAdd(true, new ConcurrentDictionary()); + public bool RemoveMail(long characterId, bool isSenderCopy, long mailId, out MailData? mailData) + { + EnsureCharacterExists(characterId); + return _parcels[characterId][isSenderCopy].TryRemove(mailId, out mailData); + } - return this.First(s => s.Key == characterId).Value; + public void UpdateMail(long characterId, bool isSenderCopy, long mailId, MailData mailData) + { + EnsureCharacterExists(characterId); + _parcels[characterId][isSenderCopy][mailId] = mailData; + } + + public long GetNextMailId(long characterId, bool isSenderCopy) + { + EnsureCharacterExists(characterId); + return _parcels[characterId][isSenderCopy].Select(s => s.Key).DefaultIfEmpty(-1).Max() + 1; + } + + private void EnsureCharacterExists(long characterId) + { + if (_parcels.ContainsKey(characterId)) + { + return; } + + _parcels.TryAdd(characterId, new ConcurrentDictionary>()); + _parcels[characterId].TryAdd(false, new ConcurrentDictionary()); + _parcels[characterId].TryAdd(true, new ConcurrentDictionary()); } private async Task InitializeAsync() @@ -92,7 +120,9 @@ private async Task InitializeAsync() var senderName = mail.SenderId == null ? "NOSMALL" : characternames[(long)mail.SenderId]; var receiverName = characternames[mail.ReceiverId]; var mailId = mail.IsSenderCopy ? (short)idcopy : (short)idmail; - this[mail.IsSenderCopy ? mail.SenderId ?? 0 : mail.ReceiverId][mail.IsSenderCopy].TryAdd(mailId, + var targetCharacterId = mail.IsSenderCopy ? mail.SenderId ?? 0 : mail.ReceiverId; + + AddMail(targetCharacterId, mail.IsSenderCopy, mailId, new MailData { ItemInstance = (ItemInstanceDto?)itinst, @@ -102,6 +132,7 @@ private async Task InitializeAsync() MailDto = mail, ItemType = (short?)it?.ItemType ?? -1 }); + if (mail.IsSenderCopy) { idcopy++; @@ -113,4 +144,4 @@ private async Task InitializeAsync() } } } -} \ No newline at end of file +} diff --git a/src/NosCore.GameObject/Services/MapInstanceAccessService/MapInstanceAccessService.cs b/src/NosCore.GameObject/Services/MapInstanceAccessService/MapInstanceAccessService.cs index abc2eb00c..d4c418de3 100644 --- a/src/NosCore.GameObject/Services/MapInstanceAccessService/MapInstanceAccessService.cs +++ b/src/NosCore.GameObject/Services/MapInstanceAccessService/MapInstanceAccessService.cs @@ -1,42 +1,31 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . -using NosCore.Data.Enumerations.Map; -using NosCore.GameObject.Holders; using NosCore.GameObject.Services.MapInstanceGenerationService; using System; -using System.Linq; namespace NosCore.GameObject.Services.MapInstanceAccessService { - public class MapInstanceAccessorService(MapInstanceHolder holder) : IMapInstanceAccessorService + public class MapInstanceAccessorService(IMapInstanceRegistry mapInstanceRegistry) : IMapInstanceAccessorService { - public MapInstance? GetMapInstance(Guid id) - { - return holder.MapInstances.TryGetValue(id, out var instance) ? instance : null; - } + public MapInstance? GetMapInstance(Guid id) => mapInstanceRegistry.GetById(id); - public MapInstance? GetBaseMapById(short mapId) - { - var mapInstance = holder.MapInstances.FirstOrDefault(s => - (s.Value?.Map.MapId == mapId) && (s.Value.MapInstanceType == MapInstanceType.BaseMapInstance)); - return mapInstance.Key == default ? null : mapInstance.Value; - } + public MapInstance? GetBaseMapById(short mapId) => mapInstanceRegistry.GetBaseMapById(mapId); } } diff --git a/src/NosCore.GameObject/Services/MapInstanceGenerationService/IMapInstanceEntranceEventHandler.cs b/src/NosCore.GameObject/Services/MapInstanceGenerationService/IMapInstanceEntranceEventHandler.cs index b03d89f8e..dba89c6df 100644 --- a/src/NosCore.GameObject/Services/MapInstanceGenerationService/IMapInstanceEntranceEventHandler.cs +++ b/src/NosCore.GameObject/Services/MapInstanceGenerationService/IMapInstanceEntranceEventHandler.cs @@ -17,6 +17,8 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +using NosCore.GameObject.Infastructure; + namespace NosCore.GameObject.Services.MapInstanceGenerationService { public interface IMapInstanceEntranceEventHandler : IEventHandler diff --git a/src/NosCore.GameObject/Services/MapInstanceGenerationService/IMapInstanceRegistry.cs b/src/NosCore.GameObject/Services/MapInstanceGenerationService/IMapInstanceRegistry.cs new file mode 100644 index 000000000..d59cf114e --- /dev/null +++ b/src/NosCore.GameObject/Services/MapInstanceGenerationService/IMapInstanceRegistry.cs @@ -0,0 +1,34 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System; +using System.Collections.Generic; + +namespace NosCore.GameObject.Services.MapInstanceGenerationService +{ + public interface IMapInstanceRegistry + { + MapInstance? GetById(Guid mapInstanceId); + MapInstance? GetBaseMapById(short mapId); + IEnumerable GetAll(); + void Register(Guid mapInstanceId, MapInstance mapInstance); + bool Unregister(Guid mapInstanceId, out MapInstance? mapInstance); + void SetAll(IDictionary mapInstances); + } +} diff --git a/src/NosCore.GameObject/Services/MapInstanceGenerationService/MapInstance.cs b/src/NosCore.GameObject/Services/MapInstanceGenerationService/MapInstance.cs index 1c7414909..50907e752 100644 --- a/src/NosCore.GameObject/Services/MapInstanceGenerationService/MapInstance.cs +++ b/src/NosCore.GameObject/Services/MapInstanceGenerationService/MapInstance.cs @@ -20,7 +20,6 @@ using NosCore.Data.Enumerations.Map; using NosCore.GameObject.ComponentEntities.Extensions; using NosCore.GameObject.ComponentEntities.Interfaces; -using NosCore.GameObject.Networking; using NosCore.GameObject.Networking.ClientSession; using NosCore.GameObject.Services.ItemGenerationService.Item; using NosCore.GameObject.Services.MapItemGenerationService; @@ -40,6 +39,7 @@ using NosCore.GameObject.Services.BroadcastService; using NosCore.GameObject.Services.MapChangeService; using NosCore.Networking.SessionGroup; +using NosCore.GameObject.ComponentEntities.Entities; namespace NosCore.GameObject.Services.MapInstanceGenerationService diff --git a/src/NosCore.GameObject/Services/MapInstanceGenerationService/MapInstanceGenerationService.cs b/src/NosCore.GameObject/Services/MapInstanceGenerationService/MapInstanceGenerationService.cs index 7b48ddbc8..e5bb0c46a 100644 --- a/src/NosCore.GameObject/Services/MapInstanceGenerationService/MapInstanceGenerationService.cs +++ b/src/NosCore.GameObject/Services/MapInstanceGenerationService/MapInstanceGenerationService.cs @@ -1,19 +1,19 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . @@ -23,13 +23,11 @@ using NosCore.Data.Enumerations.I18N; using NosCore.Data.Enumerations.Map; using NosCore.Data.StaticEntities; -using NosCore.GameObject.Holders; using NosCore.GameObject.Services.EventLoaderService; using NosCore.GameObject.Services.MapInstanceAccessService; using NosCore.GameObject.Services.MapItemGenerationService; using Serilog; using System; -using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; @@ -38,6 +36,7 @@ using NosCore.Shared.I18N; using NosCore.Networking.SessionGroup; using NosCore.GameObject.Services.BroadcastService; +using NosCore.GameObject.ComponentEntities.Entities; namespace NosCore.GameObject.Services.MapInstanceGenerationService { @@ -46,7 +45,7 @@ public class MapInstanceGeneratorService(List maps, List IMapItemGenerationService mapItemGenerationService, IDao mapNpcs, IDao mapMonsters, IDao portalDao, IDao? shopItems, ILogger logger, EventLoaderService entranceRunnerService, MapInstanceHolder holder, + MapInstance, IMapInstanceEntranceEventHandler> entranceRunnerService, IMapInstanceRegistry mapInstanceRegistry, IMapInstanceAccessorService mapInstanceAccessorService, IClock clock, ILogLanguageLocalizer logLanguage, IMapChangeService mapChangeService, ISessionGroupFactory sessionGroupFactory, ISessionRegistry sessionRegistry) @@ -54,15 +53,17 @@ public class MapInstanceGeneratorService(List maps, List { public Task AddMapInstanceAsync(MapInstance mapInstance) { - holder.MapInstances.TryAdd(mapInstance.MapInstanceId, mapInstance); + mapInstanceRegistry.Register(mapInstance.MapInstanceId, mapInstance); entranceRunnerService.LoadHandlers(mapInstance); return LoadPortalsAsync(mapInstance, portalDao.Where(s => s.SourceMapId == mapInstance.Map.MapId)?.ToList() ?? new List()); } public void RemoveMap(Guid mapInstanceId) { - holder.MapInstances.TryRemove(mapInstanceId, out var mapInstance); - mapInstance?.Kick(); + if (mapInstanceRegistry.Unregister(mapInstanceId, out var mapInstance)) + { + mapInstance?.Kick(); + } } public async Task InitializeAsync() @@ -86,7 +87,7 @@ public async Task InitializeAsync() var portals = portalDao.LoadAll().GroupBy(s => s.SourceMapId).ToDictionary(x => x.Key, x => x.ToList()); var mapsdic = maps.ToDictionary(x => x.MapId, x => Guid.NewGuid()); - holder.MapInstances = new ConcurrentDictionary(maps.Adapt>().ToDictionary( + var mapInstances = maps.Adapt>().ToDictionary( map => mapsdic[map.MapId], map => { @@ -116,10 +117,12 @@ public async Task InitializeAsync() } entranceRunnerService.LoadHandlers(mapinstance); return mapinstance; - })); + }); + + mapInstanceRegistry.SetAll(mapInstances); - await Task.WhenAll(holder.MapInstances.Values.Select(s => s.StartLifeAsync())).ConfigureAwait(false); - await Task.WhenAll(holder.MapInstances.Values.Select(mapInstance => portals.TryGetValue(mapInstance.Map.MapId, out var portal) ? LoadPortalsAsync(mapInstance, portal) : Task.CompletedTask)).ConfigureAwait(false); + await Task.WhenAll(mapInstanceRegistry.GetAll().Select(s => s.StartLifeAsync())).ConfigureAwait(false); + await Task.WhenAll(mapInstanceRegistry.GetAll().Select(mapInstance => portals.TryGetValue(mapInstance.Map.MapId, out var portal) ? LoadPortalsAsync(mapInstance, portal) : Task.CompletedTask)).ConfigureAwait(false); } public MapInstance CreateMapInstance(Map.Map map, Guid guid, bool shopAllowed, MapInstanceType normalInstance) @@ -148,4 +151,4 @@ private async Task LoadPortalsAsync(MapInstance mapInstance, List por mapInstance.Portals.AddRange(portalList); } } -} \ No newline at end of file +} diff --git a/src/NosCore.GameObject/Services/MapInstanceGenerationService/MapInstanceRegistry.cs b/src/NosCore.GameObject/Services/MapInstanceGenerationService/MapInstanceRegistry.cs new file mode 100644 index 000000000..4e641d63d --- /dev/null +++ b/src/NosCore.GameObject/Services/MapInstanceGenerationService/MapInstanceRegistry.cs @@ -0,0 +1,49 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using NosCore.Data.Enumerations.Map; +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; + +namespace NosCore.GameObject.Services.MapInstanceGenerationService +{ + public class MapInstanceRegistry : IMapInstanceRegistry + { + private ConcurrentDictionary _mapInstances = new(); + + public MapInstance? GetById(Guid mapInstanceId) => + _mapInstances.TryGetValue(mapInstanceId, out var instance) ? instance : null; + + public MapInstance? GetBaseMapById(short mapId) => + _mapInstances.Values.FirstOrDefault(s => s.Map.MapId == mapId && s.MapInstanceType == MapInstanceType.BaseMapInstance); + + public IEnumerable GetAll() => _mapInstances.Values; + + public void Register(Guid mapInstanceId, MapInstance mapInstance) => + _mapInstances.TryAdd(mapInstanceId, mapInstance); + + public bool Unregister(Guid mapInstanceId, out MapInstance? mapInstance) => + _mapInstances.TryRemove(mapInstanceId, out mapInstance); + + public void SetAll(IDictionary mapInstances) => + _mapInstances = new ConcurrentDictionary(mapInstances); + } +} diff --git a/src/NosCore.GameObject/Services/MapItemGenerationService/Handlers/DropHandler.cs b/src/NosCore.GameObject/Services/MapItemGenerationService/Handlers/DropHandler.cs index a628e5736..38b96662a 100644 --- a/src/NosCore.GameObject/Services/MapItemGenerationService/Handlers/DropHandler.cs +++ b/src/NosCore.GameObject/Services/MapItemGenerationService/Handlers/DropHandler.cs @@ -31,6 +31,7 @@ using System.Threading.Tasks; using NosCore.Networking; using NosCore.Packets.ServerPackets.Chats; +using NosCore.GameObject.ComponentEntities.Entities; namespace NosCore.GameObject.Services.MapItemGenerationService.Handlers { diff --git a/src/NosCore.GameObject/Services/MapItemGenerationService/Handlers/GoldDropHandler.cs b/src/NosCore.GameObject/Services/MapItemGenerationService/Handlers/GoldDropHandler.cs index e59ec3550..38b4d28f7 100644 --- a/src/NosCore.GameObject/Services/MapItemGenerationService/Handlers/GoldDropHandler.cs +++ b/src/NosCore.GameObject/Services/MapItemGenerationService/Handlers/GoldDropHandler.cs @@ -29,6 +29,7 @@ using System.Threading.Tasks; using NosCore.Networking; using NosCore.Packets.ServerPackets.Chats; +using NosCore.GameObject.ComponentEntities.Entities; namespace NosCore.GameObject.Services.MapItemGenerationService.Handlers { diff --git a/src/NosCore.GameObject/Services/MapItemGenerationService/Handlers/SpChargerHandler.cs b/src/NosCore.GameObject/Services/MapItemGenerationService/Handlers/SpChargerHandler.cs index 1a747381f..6c3ce559b 100644 --- a/src/NosCore.GameObject/Services/MapItemGenerationService/Handlers/SpChargerHandler.cs +++ b/src/NosCore.GameObject/Services/MapItemGenerationService/Handlers/SpChargerHandler.cs @@ -24,6 +24,7 @@ using System; using System.Threading.Tasks; using NosCore.Networking; +using NosCore.GameObject.ComponentEntities.Entities; namespace NosCore.GameObject.Services.MapItemGenerationService.Handlers { diff --git a/src/NosCore.GameObject/Services/MapItemGenerationService/IGetMapItemEventHandler.cs b/src/NosCore.GameObject/Services/MapItemGenerationService/IGetMapItemEventHandler.cs index 7c7818165..a2fe5274f 100644 --- a/src/NosCore.GameObject/Services/MapItemGenerationService/IGetMapItemEventHandler.cs +++ b/src/NosCore.GameObject/Services/MapItemGenerationService/IGetMapItemEventHandler.cs @@ -17,6 +17,8 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +using NosCore.GameObject.ComponentEntities.Entities; +using NosCore.GameObject.Infastructure; using NosCore.Packets.ClientPackets.Drops; using System; diff --git a/src/NosCore.GameObject/Services/MapItemGenerationService/IMapItemGenerationService.cs b/src/NosCore.GameObject/Services/MapItemGenerationService/IMapItemGenerationService.cs index b27b3fc53..523be0b93 100644 --- a/src/NosCore.GameObject/Services/MapItemGenerationService/IMapItemGenerationService.cs +++ b/src/NosCore.GameObject/Services/MapItemGenerationService/IMapItemGenerationService.cs @@ -17,6 +17,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +using NosCore.GameObject.ComponentEntities.Entities; using NosCore.GameObject.Services.ItemGenerationService.Item; using NosCore.GameObject.Services.MapInstanceGenerationService; diff --git a/src/NosCore.GameObject/Services/MapItemGenerationService/MapItemGenerationService.cs b/src/NosCore.GameObject/Services/MapItemGenerationService/MapItemGenerationService.cs index feb00d1b3..a581a4eb7 100644 --- a/src/NosCore.GameObject/Services/MapItemGenerationService/MapItemGenerationService.cs +++ b/src/NosCore.GameObject/Services/MapItemGenerationService/MapItemGenerationService.cs @@ -23,6 +23,7 @@ using NosCore.Packets.ClientPackets.Drops; using System; using NosCore.Core.Services.IdService; +using NosCore.GameObject.ComponentEntities.Entities; namespace NosCore.GameObject.Services.MapItemGenerationService { diff --git a/src/NosCore.GameObject/Holders/MapInstanceHolder.cs b/src/NosCore.GameObject/Services/MinilandService/IMinilandRegistry.cs similarity index 61% rename from src/NosCore.GameObject/Holders/MapInstanceHolder.cs rename to src/NosCore.GameObject/Services/MinilandService/IMinilandRegistry.cs index edd1de2aa..f6fbc7c73 100644 --- a/src/NosCore.GameObject/Holders/MapInstanceHolder.cs +++ b/src/NosCore.GameObject/Services/MinilandService/IMinilandRegistry.cs @@ -1,30 +1,34 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . -using NosCore.GameObject.Services.MapInstanceGenerationService; using System; -using System.Collections.Concurrent; +using System.Collections.Generic; -namespace NosCore.GameObject.Holders +namespace NosCore.GameObject.Services.MinilandService { - public class MapInstanceHolder + public interface IMinilandRegistry { - public ConcurrentDictionary MapInstances { get; set; } = null!; + Miniland? GetByCharacterId(long characterId); + Miniland? GetByMapInstanceId(Guid mapInstanceId); + IEnumerable GetAll(); + bool ContainsCharacter(long characterId); + void Register(long characterId, Miniland miniland); + bool Unregister(long characterId, out Miniland? miniland); } -} \ No newline at end of file +} diff --git a/src/NosCore.GameObject/Services/MinilandService/IMinilandService.cs b/src/NosCore.GameObject/Services/MinilandService/IMinilandService.cs index 5a4e79eaa..f91fda2c8 100644 --- a/src/NosCore.GameObject/Services/MinilandService/IMinilandService.cs +++ b/src/NosCore.GameObject/Services/MinilandService/IMinilandService.cs @@ -17,6 +17,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +using NosCore.GameObject.ComponentEntities.Entities; using NosCore.GameObject.Services.InventoryService; using NosCore.GameObject.Services.MapInstanceGenerationService; using NosCore.Packets.Enumerations; diff --git a/src/NosCore.GameObject/Helper/MinilandHelper.cs b/src/NosCore.GameObject/Services/MinilandService/MinilandHelper.cs similarity index 99% rename from src/NosCore.GameObject/Helper/MinilandHelper.cs rename to src/NosCore.GameObject/Services/MinilandService/MinilandHelper.cs index dcb38dbfc..57697c6a3 100644 --- a/src/NosCore.GameObject/Helper/MinilandHelper.cs +++ b/src/NosCore.GameObject/Services/MinilandService/MinilandHelper.cs @@ -20,8 +20,9 @@ using System; using System.Collections.Generic; using System.Linq; +using NosCore.GameObject.Services.MailService; -namespace NosCore.GameObject.Helper +namespace NosCore.GameObject.Services.MinilandService { public sealed class MinilandHelper { diff --git a/src/NosCore.GameObject/Services/MinilandService/MinilandRegistry.cs b/src/NosCore.GameObject/Services/MinilandService/MinilandRegistry.cs new file mode 100644 index 000000000..10c8b5a0c --- /dev/null +++ b/src/NosCore.GameObject/Services/MinilandService/MinilandRegistry.cs @@ -0,0 +1,47 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; + +namespace NosCore.GameObject.Services.MinilandService +{ + public class MinilandRegistry : IMinilandRegistry + { + private readonly ConcurrentDictionary _minilands = new(); + + public Miniland? GetByCharacterId(long characterId) => + _minilands.TryGetValue(characterId, out var miniland) ? miniland : null; + + public Miniland? GetByMapInstanceId(Guid mapInstanceId) => + _minilands.Values.FirstOrDefault(s => s.MapInstanceId == mapInstanceId); + + public IEnumerable GetAll() => _minilands.Values; + + public bool ContainsCharacter(long characterId) => _minilands.ContainsKey(characterId); + + public void Register(long characterId, Miniland miniland) => + _minilands.TryAdd(characterId, miniland); + + public bool Unregister(long characterId, out Miniland? miniland) => + _minilands.TryRemove(characterId, out miniland); + } +} diff --git a/src/NosCore.GameObject/Services/MinilandService/MinilandService.cs b/src/NosCore.GameObject/Services/MinilandService/MinilandService.cs index d0cbe3be9..207f91841 100644 --- a/src/NosCore.GameObject/Services/MinilandService/MinilandService.cs +++ b/src/NosCore.GameObject/Services/MinilandService/MinilandService.cs @@ -2,18 +2,18 @@ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . @@ -24,7 +24,6 @@ using NosCore.Data.Enumerations.Items; using NosCore.Data.Enumerations.Map; using NosCore.Data.StaticEntities; -using NosCore.GameObject.Holders; using NosCore.GameObject.Services.InventoryService; using NosCore.GameObject.Services.MapInstanceAccessService; using NosCore.GameObject.Services.MapInstanceGenerationService; @@ -34,20 +33,22 @@ using System.Linq; using System.Threading.Tasks; using NosCore.GameObject.InterChannelCommunication.Hubs.FriendHub; +using NosCore.GameObject.ComponentEntities.Entities; namespace NosCore.GameObject.Services.MinilandService { public class MinilandService(IMapInstanceAccessorService mapInstanceAccessorService, IFriendHub friendHttpClient, List maps, IDao minilandDao, IDao minilandObjectsDao, - MinilandHolder minilandHolder) + IMinilandRegistry minilandRegistry) : IMinilandService { public List GetMinilandPortals(long characterId) { var nosville = mapInstanceAccessorService.GetBaseMapById(1); var oldNosville = mapInstanceAccessorService.GetBaseMapById(145); - var miniland = mapInstanceAccessorService.GetMapInstance(minilandHolder.Minilands[characterId].MapInstanceId); + var minilandInfo = minilandRegistry.GetByCharacterId(characterId); + var miniland = mapInstanceAccessorService.GetMapInstance(minilandInfo!.MapInstanceId); return new List { new() @@ -79,7 +80,8 @@ public List GetMinilandPortals(long characterId) public Miniland GetMiniland(long characterId) { - if (minilandHolder.Minilands.TryGetValue(characterId, out var miniland)) + var miniland = minilandRegistry.GetByCharacterId(characterId); + if (miniland != null) { return miniland; } @@ -89,20 +91,21 @@ public Miniland GetMiniland(long characterId) public async Task DeleteMinilandAsync(long characterId) { - if (!minilandHolder.Minilands.ContainsKey(characterId)) + if (!minilandRegistry.ContainsCharacter(characterId)) { return null; } - var miniland = mapInstanceAccessorService.GetMapInstance(minilandHolder.Minilands[characterId].MapInstanceId); + var minilandInfo = minilandRegistry.GetByCharacterId(characterId); + var miniland = mapInstanceAccessorService.GetMapInstance(minilandInfo!.MapInstanceId); foreach (var obj in miniland!.MapDesignObjects.Values) { await minilandObjectsDao.TryInsertOrUpdateAsync(obj).ConfigureAwait(false); } - if (minilandHolder.Minilands.TryRemove(characterId, out var mapInstance)) + if (minilandRegistry.Unregister(characterId, out var removedMiniland)) { - return mapInstance.MapInstanceId; + return removedMiniland?.MapInstanceId; } return null; @@ -124,7 +127,7 @@ public async Task InitializeAsync(Character character, IMapInstanceGen minilandInfo.MapInstanceId = miniland.MapInstanceId; minilandInfo.CharacterEntity = character; - minilandHolder.Minilands.TryAdd(character.CharacterId, minilandInfo); + minilandRegistry.Register(character.CharacterId, minilandInfo); await generator.AddMapInstanceAsync(miniland).ConfigureAwait(false); var listobjects = character.InventoryService.Values.Where(s => s.Type == NoscorePocketType.Miniland).ToArray(); @@ -143,12 +146,12 @@ public async Task InitializeAsync(Character character, IMapInstanceGen public async Task SetStateAsync(long characterId, MinilandState state) { - if (!minilandHolder.Minilands.ContainsKey(characterId)) + if (!minilandRegistry.ContainsCharacter(characterId)) { throw new ArgumentException(); } - var ml = minilandHolder.Minilands[characterId]; + var ml = minilandRegistry.GetByCharacterId(characterId)!; var miniland = mapInstanceAccessorService.GetMapInstance(ml.MapInstanceId); ml.State = state; @@ -161,7 +164,6 @@ public async Task SetStateAsync(long characterId, MinilandState state) List friends = (await friendHttpClient.GetFriendsAsync(characterId).ConfigureAwait(false)) .Select(s => s.CharacterId) .ToList(); - // Kick all players in miniland except owner and his friends miniland!.Kick(o => o.VisualId != characterId && !friends.Contains(o.VisualId)); break; } @@ -173,12 +175,13 @@ public async Task SetStateAsync(long characterId, MinilandState state) public Miniland? GetMinilandFromMapInstanceId(Guid mapInstanceId) { - return minilandHolder.Minilands.FirstOrDefault(s => s.Value.MapInstanceId == mapInstanceId).Value; + return minilandRegistry.GetByMapInstanceId(mapInstanceId); } public void AddMinilandObject(MapDesignObject mapObject, long characterId, InventoryItemInstance minilandobject) { - var miniland = mapInstanceAccessorService.GetMapInstance(minilandHolder.Minilands[characterId].MapInstanceId); + var minilandInfo = minilandRegistry.GetByCharacterId(characterId); + var miniland = mapInstanceAccessorService.GetMapInstance(minilandInfo!.MapInstanceId); mapObject.Effect = (short)(minilandobject?.ItemInstance?.Item?.EffectValue ?? minilandobject?.ItemInstance?.Design ?? 0); @@ -214,4 +217,4 @@ public void AddMinilandObject(MapDesignObject mapObject, long characterId, Inven miniland!.MapDesignObjects.TryAdd(minilandobject!.Id, mapObject); } } -} \ No newline at end of file +} diff --git a/src/NosCore.GameObject/Services/NRunService/Handlers/BazaarHandler.cs b/src/NosCore.GameObject/Services/NRunService/Handlers/BazaarHandler.cs index 074211fae..d3c743600 100644 --- a/src/NosCore.GameObject/Services/NRunService/Handlers/BazaarHandler.cs +++ b/src/NosCore.GameObject/Services/NRunService/Handlers/BazaarHandler.cs @@ -27,6 +27,7 @@ using System.Linq; using System.Threading.Tasks; using NodaTime; +using NosCore.GameObject.ComponentEntities.Entities; namespace NosCore.GameObject.Services.NRunService.Handlers { diff --git a/src/NosCore.GameObject/Services/NRunService/Handlers/TeleporterHandler.cs b/src/NosCore.GameObject/Services/NRunService/Handlers/TeleporterHandler.cs index b28cecfe5..9bc3f9fd1 100644 --- a/src/NosCore.GameObject/Services/NRunService/Handlers/TeleporterHandler.cs +++ b/src/NosCore.GameObject/Services/NRunService/Handlers/TeleporterHandler.cs @@ -27,6 +27,7 @@ using NosCore.GameObject.Services.MapChangeService; using NosCore.Packets.ServerPackets.Chats; using NosCore.Shared.Enumerations; +using NosCore.GameObject.ComponentEntities.Entities; namespace NosCore.GameObject.Services.NRunService.Handlers { diff --git a/src/NosCore.GameObject/Services/NRunService/INrunEventHandler.cs b/src/NosCore.GameObject/Services/NRunService/INrunEventHandler.cs index 5eb684f73..7487f1690 100644 --- a/src/NosCore.GameObject/Services/NRunService/INrunEventHandler.cs +++ b/src/NosCore.GameObject/Services/NRunService/INrunEventHandler.cs @@ -18,6 +18,7 @@ // along with this program. If not, see . using NosCore.GameObject.ComponentEntities.Interfaces; +using NosCore.GameObject.Infastructure; using NosCore.Packets.ClientPackets.Npcs; using System; diff --git a/src/NosCore.GameObject/Services/NRunService/NrunService.cs b/src/NosCore.GameObject/Services/NRunService/NrunService.cs index 44886d953..26c2c78a1 100644 --- a/src/NosCore.GameObject/Services/NRunService/NrunService.cs +++ b/src/NosCore.GameObject/Services/NRunService/NrunService.cs @@ -18,6 +18,7 @@ // along with this program. If not, see . using NosCore.GameObject.ComponentEntities.Interfaces; +using NosCore.GameObject.Infastructure; using NosCore.GameObject.Networking.ClientSession; using NosCore.Packets.ClientPackets.Npcs; using System; diff --git a/src/NosCore.GameObject/Services/PacketHandlerService/IPacketHandlerRegistry.cs b/src/NosCore.GameObject/Services/PacketHandlerService/IPacketHandlerRegistry.cs index b9c4e0901..539429f0a 100644 --- a/src/NosCore.GameObject/Services/PacketHandlerService/IPacketHandlerRegistry.cs +++ b/src/NosCore.GameObject/Services/PacketHandlerService/IPacketHandlerRegistry.cs @@ -18,6 +18,7 @@ // along with this program. If not, see . using System; +using NosCore.GameObject.Infastructure; using NosCore.Packets.Attributes; namespace NosCore.GameObject.Services.PacketHandlerService diff --git a/src/NosCore.GameObject/Services/PacketHandlerService/PacketHandlerRegistry.cs b/src/NosCore.GameObject/Services/PacketHandlerService/PacketHandlerRegistry.cs index 8c8592b1c..01c0b6409 100644 --- a/src/NosCore.GameObject/Services/PacketHandlerService/PacketHandlerRegistry.cs +++ b/src/NosCore.GameObject/Services/PacketHandlerService/PacketHandlerRegistry.cs @@ -20,6 +20,7 @@ using System; using System.Collections.Generic; using System.Reflection; +using NosCore.GameObject.Infastructure; using NosCore.Packets.Attributes; namespace NosCore.GameObject.Services.PacketHandlerService diff --git a/src/NosCore.GameObject/Services/QuestService/IQuestService.cs b/src/NosCore.GameObject/Services/QuestService/IQuestService.cs index 4aa98c219..5fce6cc43 100644 --- a/src/NosCore.GameObject/Services/QuestService/IQuestService.cs +++ b/src/NosCore.GameObject/Services/QuestService/IQuestService.cs @@ -17,6 +17,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +using NosCore.GameObject.ComponentEntities.Entities; using NosCore.Packets.ClientPackets.Quest; using System.Threading.Tasks; diff --git a/src/NosCore.GameObject/Services/QuestService/QuestService.cs b/src/NosCore.GameObject/Services/QuestService/QuestService.cs index 5690a0fb5..54b5529c3 100644 --- a/src/NosCore.GameObject/Services/QuestService/QuestService.cs +++ b/src/NosCore.GameObject/Services/QuestService/QuestService.cs @@ -36,6 +36,7 @@ using System.Threading.Tasks; using NodaTime; using NosCore.Shared.I18N; +using NosCore.GameObject.ComponentEntities.Entities; namespace NosCore.GameObject.Services.QuestService { diff --git a/src/NosCore.GameObject/Services/SaveService/SaveService.cs b/src/NosCore.GameObject/Services/SaveService/SaveService.cs index 883bb29d4..0fd18cb1f 100644 --- a/src/NosCore.GameObject/Services/SaveService/SaveService.cs +++ b/src/NosCore.GameObject/Services/SaveService/SaveService.cs @@ -23,6 +23,7 @@ using NosCore.Dao.Interfaces; using NosCore.Data.Dto; using NosCore.Data.Enumerations.I18N; +using NosCore.GameObject.ComponentEntities.Entities; using NosCore.GameObject.ComponentEntities.Interfaces; using NosCore.GameObject.Services.MinilandService; using NosCore.Shared.I18N; diff --git a/src/NosCore.GameObject/Holders/MinilandHolder.cs b/src/NosCore.GameObject/Services/ShopService/IShopRegistry.cs similarity index 67% rename from src/NosCore.GameObject/Holders/MinilandHolder.cs rename to src/NosCore.GameObject/Services/ShopService/IShopRegistry.cs index 7b4cb4784..f15209c0f 100644 --- a/src/NosCore.GameObject/Holders/MinilandHolder.cs +++ b/src/NosCore.GameObject/Services/ShopService/IShopRegistry.cs @@ -1,29 +1,31 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . -using NosCore.GameObject.Services.MinilandService; -using System.Collections.Concurrent; +using System.Collections.Generic; -namespace NosCore.GameObject.Holders +namespace NosCore.GameObject.Services.ShopService { - public class MinilandHolder + public interface IShopRegistry { - public ConcurrentDictionary Minilands { get; set; } = new(); + void RegisterPlayerShop(long characterId, Shop shop); + void UnregisterPlayerShop(long characterId); + Shop? GetPlayerShop(long characterId); + IEnumerable GetAllPlayerShops(); } -} \ No newline at end of file +} diff --git a/src/NosCore.GameObject/Shop.cs b/src/NosCore.GameObject/Services/ShopService/Shop.cs similarity index 89% rename from src/NosCore.GameObject/Shop.cs rename to src/NosCore.GameObject/Services/ShopService/Shop.cs index e12eb8a3b..f026020d9 100644 --- a/src/NosCore.GameObject/Shop.cs +++ b/src/NosCore.GameObject/Services/ShopService/Shop.cs @@ -1,28 +1,29 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . using NosCore.Data.Dto; using NosCore.Data.StaticEntities; +using NosCore.GameObject.ComponentEntities.Entities; using System.Collections.Concurrent; using System.Linq; -namespace NosCore.GameObject +namespace NosCore.GameObject.Services.ShopService { public class Shop : ShopDto { @@ -40,4 +41,4 @@ public int Size } public I18NString Name { get; set; } = new(); } -} \ No newline at end of file +} diff --git a/src/NosCore.GameObject/ShopItem.cs b/src/NosCore.GameObject/Services/ShopService/ShopItem.cs similarity index 91% rename from src/NosCore.GameObject/ShopItem.cs rename to src/NosCore.GameObject/Services/ShopService/ShopItem.cs index ed727688b..06e2c303b 100644 --- a/src/NosCore.GameObject/ShopItem.cs +++ b/src/NosCore.GameObject/Services/ShopService/ShopItem.cs @@ -1,26 +1,26 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . using NosCore.Data.StaticEntities; using NosCore.GameObject.Services.ItemGenerationService.Item; -namespace NosCore.GameObject +namespace NosCore.GameObject.Services.ShopService { public class ShopItem : ShopItemDto { @@ -30,4 +30,4 @@ public class ShopItem : ShopItemDto public short? Amount { get; set; } } -} \ No newline at end of file +} diff --git a/src/NosCore.GameObject/Services/ShopService/ShopRegistry.cs b/src/NosCore.GameObject/Services/ShopService/ShopRegistry.cs new file mode 100644 index 000000000..f9766a4e0 --- /dev/null +++ b/src/NosCore.GameObject/Services/ShopService/ShopRegistry.cs @@ -0,0 +1,50 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Collections.Concurrent; +using System.Collections.Generic; + +namespace NosCore.GameObject.Services.ShopService +{ + public class ShopRegistry : IShopRegistry + { + private readonly ConcurrentDictionary _playerShops = new(); + + public void RegisterPlayerShop(long characterId, Shop shop) + { + _playerShops[characterId] = shop; + } + + public void UnregisterPlayerShop(long characterId) + { + _playerShops.TryRemove(characterId, out _); + } + + public Shop? GetPlayerShop(long characterId) + { + _playerShops.TryGetValue(characterId, out var shop); + return shop; + } + + public IEnumerable GetAllPlayerShops() + { + return _playerShops.Values; + } + } +} diff --git a/src/NosCore.GameObject/Services/SkillService/ISkillService.cs b/src/NosCore.GameObject/Services/SkillService/ISkillService.cs index 486243859..63ac3d23f 100644 --- a/src/NosCore.GameObject/Services/SkillService/ISkillService.cs +++ b/src/NosCore.GameObject/Services/SkillService/ISkillService.cs @@ -1,8 +1,4 @@ using NosCore.GameObject.ComponentEntities.Interfaces; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; using System.Threading.Tasks; namespace NosCore.GameObject.Services.SkillService diff --git a/src/NosCore.GameObject/Services/TransformationService/ITransformationService.cs b/src/NosCore.GameObject/Services/TransformationService/ITransformationService.cs index d37ceae79..f61acb4d1 100644 --- a/src/NosCore.GameObject/Services/TransformationService/ITransformationService.cs +++ b/src/NosCore.GameObject/Services/TransformationService/ITransformationService.cs @@ -18,6 +18,7 @@ // along with this program. If not, see . using System.Threading.Tasks; +using NosCore.GameObject.ComponentEntities.Entities; using NosCore.GameObject.Services.ItemGenerationService.Item; namespace NosCore.GameObject.Services.TransformationService diff --git a/src/NosCore.GameObject/Services/TransformationService/TransformationService.cs b/src/NosCore.GameObject/Services/TransformationService/TransformationService.cs index ee81292b9..5c0b51f2f 100644 --- a/src/NosCore.GameObject/Services/TransformationService/TransformationService.cs +++ b/src/NosCore.GameObject/Services/TransformationService/TransformationService.cs @@ -26,6 +26,7 @@ using NosCore.Algorithm.JobExperienceService; using NosCore.Data.Enumerations; using NosCore.Data.Enumerations.I18N; +using NosCore.GameObject.ComponentEntities.Entities; using NosCore.GameObject.ComponentEntities.Extensions; using NosCore.GameObject.Services.ItemGenerationService.Item; using NosCore.Networking; diff --git a/src/NosCore.GameObject/WarehouseItem.cs b/src/NosCore.GameObject/Services/WarehouseService/WarehouseItem.cs similarity index 90% rename from src/NosCore.GameObject/WarehouseItem.cs rename to src/NosCore.GameObject/Services/WarehouseService/WarehouseItem.cs index 43a728552..81067dfdc 100644 --- a/src/NosCore.GameObject/WarehouseItem.cs +++ b/src/NosCore.GameObject/Services/WarehouseService/WarehouseItem.cs @@ -1,29 +1,29 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . using NosCore.Data.Dto; using NosCore.GameObject.Services.ItemGenerationService.Item; -namespace NosCore.GameObject +namespace NosCore.GameObject.Services.WarehouseService { public class WarehouseItem : WarehouseItemDto { public IItemInstance? ItemInstance { get; set; } } -} \ No newline at end of file +} diff --git a/src/NosCore.LoginServer/LoginServerBootstrap.cs b/src/NosCore.LoginServer/LoginServerBootstrap.cs index d8d8ef6be..9a3814a7d 100644 --- a/src/NosCore.LoginServer/LoginServerBootstrap.cs +++ b/src/NosCore.LoginServer/LoginServerBootstrap.cs @@ -39,6 +39,7 @@ using NosCore.Database; using NosCore.Database.Entities; using NosCore.GameObject; +using NosCore.GameObject.Infastructure; using NosCore.GameObject.Networking.ClientSession; using NosCore.PacketHandlers.Login; using NosCore.Packets; diff --git a/src/NosCore.MasterServer/Startup.cs b/src/NosCore.MasterServer/Startup.cs index d8234c9c8..a0854807b 100644 --- a/src/NosCore.MasterServer/Startup.cs +++ b/src/NosCore.MasterServer/Startup.cs @@ -47,8 +47,9 @@ using NosCore.Data.StaticEntities; using NosCore.Database; using NosCore.Database.Entities; -using NosCore.GameObject.Holders; using NosCore.GameObject.Services.BazaarService; +using NosCore.GameObject.Services.FriendService; +using NosCore.GameObject.Services.MailService; using NosCore.GameObject.Services.EventLoaderService; using NosCore.Shared.Authentication; using NosCore.Shared.Configuration; @@ -180,9 +181,11 @@ private ContainerBuilder InitializeContainer(IServiceCollection services) containerBuilder.RegisterLogger(); containerBuilder.Register(_ => SystemClock.Instance).As().SingleInstance(); - containerBuilder.RegisterAssemblyTypes(typeof(FriendRequestHolder).Assembly) - .Where(t => t.Name.EndsWith("Holder")) - .SingleInstance(); + + // Register registries + containerBuilder.RegisterType().As().SingleInstance(); + containerBuilder.RegisterType().As().SingleInstance(); + containerBuilder.RegisterType().As().SingleInstance(); containerBuilder.RegisterType().SingleInstance().AsImplementedInterfaces(); containerBuilder.RegisterType().As().SingleInstance(); diff --git a/src/NosCore.PacketHandlers/Battle/UseSkillPacketHandler.cs b/src/NosCore.PacketHandlers/Battle/UseSkillPacketHandler.cs index 5c2a4e443..c74d644fc 100644 --- a/src/NosCore.PacketHandlers/Battle/UseSkillPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Battle/UseSkillPacketHandler.cs @@ -17,29 +17,16 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -using NosCore.Data.StaticEntities; -using NosCore.GameObject; using NosCore.GameObject.Networking.ClientSession; -using NosCore.Packets.ClientPackets.Bazaar; -using NosCore.Packets.ServerPackets.Auction; -using NosCore.Packets.ServerPackets.Inventory; -using System.Collections.Generic; -using System.Linq; using System.Threading.Tasks; -using NodaTime; -using NosCore.GameObject.InterChannelCommunication.Hubs.BazaarHub; using NosCore.Packets.ClientPackets.Battle; -using static NosCore.Packets.ServerPackets.Auction.RcbListPacket; -using NosCore.Data.Enumerations.Buff; using NosCore.Packets.Enumerations; -using System; using NosCore.Data.Enumerations.I18N; using NosCore.Packets.ServerPackets.Battle; using NosCore.GameObject.ComponentEntities.Extensions; using NosCore.GameObject.ComponentEntities.Interfaces; -using NosCore.GameObject.Networking; +using NosCore.GameObject.Infastructure; using NosCore.GameObject.Services.BattleService; -using NosCore.Packets.ClientPackets.Npcs; using NosCore.Shared.Enumerations; using NosCore.Shared.I18N; using Serilog; diff --git a/src/NosCore.PacketHandlers/Bazaar/CBListPacketHandler.cs b/src/NosCore.PacketHandlers/Bazaar/CBListPacketHandler.cs index 44e7df920..5ea6ec31f 100644 --- a/src/NosCore.PacketHandlers/Bazaar/CBListPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Bazaar/CBListPacketHandler.cs @@ -18,7 +18,6 @@ // along with this program. If not, see . using NosCore.Data.StaticEntities; -using NosCore.GameObject; using NosCore.GameObject.Networking.ClientSession; using NosCore.Packets.ClientPackets.Bazaar; using NosCore.Packets.ServerPackets.Auction; @@ -27,6 +26,7 @@ using System.Linq; using System.Threading.Tasks; using NodaTime; +using NosCore.GameObject.Infastructure; using NosCore.GameObject.InterChannelCommunication.Hubs.BazaarHub; using static NosCore.Packets.ServerPackets.Auction.RcbListPacket; diff --git a/src/NosCore.PacketHandlers/Bazaar/CBuyPacketHandler.cs b/src/NosCore.PacketHandlers/Bazaar/CBuyPacketHandler.cs index 6a8ff3efb..b08d47aae 100644 --- a/src/NosCore.PacketHandlers/Bazaar/CBuyPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Bazaar/CBuyPacketHandler.cs @@ -20,7 +20,6 @@ using NosCore.Dao.Interfaces; using NosCore.Data.Dto; using NosCore.Data.Enumerations.I18N; -using NosCore.GameObject; using NosCore.GameObject.ComponentEntities.Extensions; using NosCore.GameObject.Networking.ClientSession; using NosCore.GameObject.Services.InventoryService; @@ -37,6 +36,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; using NosCore.GameObject.InterChannelCommunication.Hubs.BazaarHub; namespace NosCore.PacketHandlers.Bazaar diff --git a/src/NosCore.PacketHandlers/Bazaar/CModPacketHandler.cs b/src/NosCore.PacketHandlers/Bazaar/CModPacketHandler.cs index a736722fe..8f6b72b72 100644 --- a/src/NosCore.PacketHandlers/Bazaar/CModPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Bazaar/CModPacketHandler.cs @@ -22,8 +22,6 @@ using Json.Patch; using Json.Pointer; using NosCore.Data.Enumerations.I18N; -using NosCore.Data.WebApi; -using NosCore.GameObject; using NosCore.GameObject.Networking.ClientSession; using NosCore.Packets.ClientPackets.Bazaar; using NosCore.Packets.Enumerations; @@ -33,6 +31,7 @@ using NosCore.Shared.I18N; using Serilog; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; using NosCore.GameObject.InterChannelCommunication.Hubs.BazaarHub; namespace NosCore.PacketHandlers.Bazaar diff --git a/src/NosCore.PacketHandlers/Bazaar/CRegPacketHandler.cs b/src/NosCore.PacketHandlers/Bazaar/CRegPacketHandler.cs index 8770b03af..2b3789d46 100644 --- a/src/NosCore.PacketHandlers/Bazaar/CRegPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Bazaar/CRegPacketHandler.cs @@ -25,7 +25,6 @@ using NosCore.Data.Enumerations.Buff; using NosCore.Data.Enumerations.I18N; using NosCore.Data.WebApi; -using NosCore.GameObject; using NosCore.GameObject.ComponentEntities.Extensions; using NosCore.GameObject.Networking.ClientSession; using NosCore.GameObject.Services.InventoryService; @@ -38,6 +37,7 @@ using System; using System.Linq; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; using NosCore.GameObject.InterChannelCommunication.Hubs.BazaarHub; namespace NosCore.PacketHandlers.Bazaar diff --git a/src/NosCore.PacketHandlers/Bazaar/CSListPacketHandler.cs b/src/NosCore.PacketHandlers/Bazaar/CSListPacketHandler.cs index 48e67a6cd..19431d8c5 100644 --- a/src/NosCore.PacketHandlers/Bazaar/CSListPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Bazaar/CSListPacketHandler.cs @@ -17,7 +17,6 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -using NosCore.GameObject; using NosCore.GameObject.Networking.ClientSession; using NosCore.Packets.ClientPackets.Bazaar; using NosCore.Packets.Enumerations; @@ -26,6 +25,7 @@ using System.Collections.Generic; using System.Threading.Tasks; using NodaTime; +using NosCore.GameObject.Infastructure; using NosCore.GameObject.InterChannelCommunication.Hubs.BazaarHub; namespace NosCore.PacketHandlers.Bazaar diff --git a/src/NosCore.PacketHandlers/Bazaar/CScalcPacketHandler.cs b/src/NosCore.PacketHandlers/Bazaar/CScalcPacketHandler.cs index 78add452b..77b6fcb7d 100644 --- a/src/NosCore.PacketHandlers/Bazaar/CScalcPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Bazaar/CScalcPacketHandler.cs @@ -22,7 +22,6 @@ using NosCore.Dao.Interfaces; using NosCore.Data.Dto; using NosCore.Data.Enumerations.I18N; -using NosCore.GameObject; using NosCore.GameObject.ComponentEntities.Extensions; using NosCore.GameObject.Networking.ClientSession; using NosCore.GameObject.Services.InventoryService; @@ -39,6 +38,7 @@ using System.Threading.Tasks; using NosCore.GameObject.InterChannelCommunication.Hubs.BazaarHub; using System.Linq; +using NosCore.GameObject.Infastructure; namespace NosCore.PacketHandlers.Bazaar { diff --git a/src/NosCore.PacketHandlers/Bazaar/CSkillPacketHandler.cs b/src/NosCore.PacketHandlers/Bazaar/CSkillPacketHandler.cs index 2b47f450b..5f991bb6d 100644 --- a/src/NosCore.PacketHandlers/Bazaar/CSkillPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Bazaar/CSkillPacketHandler.cs @@ -18,7 +18,6 @@ // along with this program. If not, see . using NosCore.Data.Enumerations.Buff; -using NosCore.GameObject; using NosCore.GameObject.Networking.ClientSession; using NosCore.Packets.ClientPackets.Bazaar; using NosCore.Packets.Enumerations; @@ -26,6 +25,7 @@ using System.Linq; using System.Threading.Tasks; using NodaTime; +using NosCore.GameObject.Infastructure; namespace NosCore.PacketHandlers.Bazaar { diff --git a/src/NosCore.PacketHandlers/CharacterScreen/CharNewJobPacketHandler.cs b/src/NosCore.PacketHandlers/CharacterScreen/CharNewJobPacketHandler.cs index 3235683bf..ab410862e 100644 --- a/src/NosCore.PacketHandlers/CharacterScreen/CharNewJobPacketHandler.cs +++ b/src/NosCore.PacketHandlers/CharacterScreen/CharNewJobPacketHandler.cs @@ -21,13 +21,13 @@ using NosCore.Dao.Interfaces; using NosCore.Data.Dto; using NosCore.Data.Enumerations.Character; -using NosCore.GameObject; using NosCore.GameObject.Networking.ClientSession; using NosCore.Packets.ClientPackets.CharacterSelectionScreen; using NosCore.Shared.Enumerations; using System.Threading.Tasks; using Microsoft.Extensions.Options; using NosCore.Core.Configuration; +using NosCore.GameObject.Infastructure; namespace NosCore.PacketHandlers.CharacterScreen { diff --git a/src/NosCore.PacketHandlers/CharacterScreen/CharNewPacketHandler.cs b/src/NosCore.PacketHandlers/CharacterScreen/CharNewPacketHandler.cs index fb9dcc23b..4f1ed5e5b 100644 --- a/src/NosCore.PacketHandlers/CharacterScreen/CharNewPacketHandler.cs +++ b/src/NosCore.PacketHandlers/CharacterScreen/CharNewPacketHandler.cs @@ -25,9 +25,7 @@ using NosCore.Dao.Interfaces; using NosCore.Data.CommandPackets; using NosCore.Data.Dto; -using NosCore.Data.Enumerations; using NosCore.Data.Enumerations.Character; -using NosCore.GameObject; using NosCore.GameObject.Networking.ClientSession; using NosCore.GameObject.Services.InventoryService; using NosCore.GameObject.Services.ItemGenerationService; @@ -42,6 +40,7 @@ using System.Linq; using System.Text.RegularExpressions; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; namespace NosCore.PacketHandlers.CharacterScreen { @@ -113,7 +112,7 @@ public override async Task ExecuteAsync(CharNewPacket packet, ClientSession clie }; await minilandDao.TryInsertOrUpdateAsync(miniland).ConfigureAwait(false); - var charaGo = chara.Adapt(); + var charaGo = chara.Adapt(); var itemsToAdd = new List(); foreach (var item in _worldConfiguration.BasicEquipments) { diff --git a/src/NosCore.PacketHandlers/CharacterScreen/CharRenPacketHandler.cs b/src/NosCore.PacketHandlers/CharacterScreen/CharRenPacketHandler.cs index 37fae3169..1556cbf39 100644 --- a/src/NosCore.PacketHandlers/CharacterScreen/CharRenPacketHandler.cs +++ b/src/NosCore.PacketHandlers/CharacterScreen/CharRenPacketHandler.cs @@ -21,7 +21,6 @@ using NosCore.Data.CommandPackets; using NosCore.Data.Dto; using NosCore.Data.Enumerations.Character; -using NosCore.GameObject; using NosCore.GameObject.Networking.ClientSession; using NosCore.Packets.ClientPackets.CharacterSelectionScreen; using NosCore.Packets.Enumerations; @@ -31,6 +30,7 @@ using System.Threading.Tasks; using Microsoft.Extensions.Options; using NosCore.Core.Configuration; +using NosCore.GameObject.Infastructure; namespace NosCore.PacketHandlers.CharacterScreen { diff --git a/src/NosCore.PacketHandlers/CharacterScreen/CharacterDeletePacketHandler.cs b/src/NosCore.PacketHandlers/CharacterScreen/CharacterDeletePacketHandler.cs index c3a2d5a96..e40bf2761 100644 --- a/src/NosCore.PacketHandlers/CharacterScreen/CharacterDeletePacketHandler.cs +++ b/src/NosCore.PacketHandlers/CharacterScreen/CharacterDeletePacketHandler.cs @@ -21,7 +21,6 @@ using NosCore.Data.CommandPackets; using NosCore.Data.Dto; using NosCore.Data.Enumerations.Character; -using NosCore.GameObject; using NosCore.GameObject.Networking.ClientSession; using NosCore.Packets.ClientPackets.CharacterSelectionScreen; using NosCore.Packets.Enumerations; @@ -30,6 +29,7 @@ using System.Threading.Tasks; using Microsoft.Extensions.Options; using NosCore.Core.Configuration; +using NosCore.GameObject.Infastructure; namespace NosCore.PacketHandlers.CharacterScreen { diff --git a/src/NosCore.PacketHandlers/CharacterScreen/DacPacketHandler.cs b/src/NosCore.PacketHandlers/CharacterScreen/DacPacketHandler.cs index 4557203fc..301c1b00a 100644 --- a/src/NosCore.PacketHandlers/CharacterScreen/DacPacketHandler.cs +++ b/src/NosCore.PacketHandlers/CharacterScreen/DacPacketHandler.cs @@ -20,12 +20,12 @@ using NosCore.Dao.Interfaces; using NosCore.Data.Dto; using NosCore.Data.Enumerations.I18N; -using NosCore.GameObject; using NosCore.GameObject.Networking.ClientSession; using NosCore.Packets.ClientPackets.CharacterSelectionScreen; using NosCore.Packets.ClientPackets.Infrastructure; using Serilog; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; using NosCore.GameObject.InterChannelCommunication.Hubs.AuthHub; using NosCore.GameObject.InterChannelCommunication.Hubs.PubSub; using NosCore.Networking.SessionRef; diff --git a/src/NosCore.PacketHandlers/CharacterScreen/EntryPointPacketHandler.cs b/src/NosCore.PacketHandlers/CharacterScreen/EntryPointPacketHandler.cs index 64445a449..80a0b0e31 100644 --- a/src/NosCore.PacketHandlers/CharacterScreen/EntryPointPacketHandler.cs +++ b/src/NosCore.PacketHandlers/CharacterScreen/EntryPointPacketHandler.cs @@ -24,7 +24,6 @@ using NosCore.Data.Dto; using NosCore.Data.Enumerations.Character; using NosCore.Data.Enumerations.I18N; -using NosCore.GameObject; using NosCore.GameObject.Networking.ClientSession; using NosCore.GameObject.Services.ItemGenerationService.Item; using NosCore.Packets.Enumerations; @@ -41,6 +40,7 @@ using NosCore.Networking.SessionRef; using NosCore.Shared.I18N; using NosCore.Data.WebApi; +using NosCore.GameObject.Infastructure; using NosCore.GameObject.InterChannelCommunication.Hubs.AuthHub; using NosCore.GameObject.InterChannelCommunication.Hubs.PubSub; @@ -152,7 +152,7 @@ await clientSession.SendPacketAsync(new GuriPacket // load characterlist packet for each character in Character await clientSession.SendPacketAsync(new ClistStartPacket { Type = 0 }).ConfigureAwait(false); - foreach (var character in characters!.Select(characterDto => characterDto.Adapt())) + foreach (var character in characters!.Select(characterDto => characterDto.Adapt())) { var equipment = new WearableInstance?[16]; /* IEnumerable inventory = _iteminstanceDAO.Where(s => s.CharacterId == character.CharacterId && s.Type == (byte)InventoryType.Wear); diff --git a/src/NosCore.PacketHandlers/CharacterScreen/SelectPacketHandler.cs b/src/NosCore.PacketHandlers/CharacterScreen/SelectPacketHandler.cs index 1d8db04ff..ea9bf0aef 100644 --- a/src/NosCore.PacketHandlers/CharacterScreen/SelectPacketHandler.cs +++ b/src/NosCore.PacketHandlers/CharacterScreen/SelectPacketHandler.cs @@ -23,7 +23,6 @@ using NosCore.Data.Enumerations.Character; using NosCore.Data.Enumerations.I18N; using NosCore.Data.StaticEntities; -using NosCore.GameObject; using NosCore.GameObject.ComponentEntities.Extensions; using NosCore.GameObject.Networking.ClientSession; using NosCore.GameObject.Services.InventoryService; @@ -42,6 +41,7 @@ using NosCore.Core.Configuration; using NosCore.Shared.I18N; using NosCore.Data.WebApi; +using NosCore.GameObject.Infastructure; using NosCore.GameObject.InterChannelCommunication.Hubs.PubSub; namespace NosCore.PacketHandlers.CharacterScreen @@ -74,7 +74,7 @@ public override async Task ExecuteAsync(SelectPacket packet, ClientSession clien return; } - var character = characterDto.Adapt(); + var character = characterDto.Adapt(); character.InitializeGroup(); await pubSubHub.SubscribeAsync(new Subscriber { diff --git a/src/NosCore.PacketHandlers/Chat/BtkPacketHandler.cs b/src/NosCore.PacketHandlers/Chat/BtkPacketHandler.cs index 2519dc9b6..5cc880605 100644 --- a/src/NosCore.PacketHandlers/Chat/BtkPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Chat/BtkPacketHandler.cs @@ -21,9 +21,7 @@ using NosCore.Core.I18N; using NosCore.Data.Enumerations.I18N; using NosCore.Data.Enumerations.Interaction; -using NosCore.GameObject; using NosCore.GameObject.ComponentEntities.Extensions; -using NosCore.GameObject.Networking; using NosCore.GameObject.Networking.ClientSession; using NosCore.Packets.ClientPackets.Chat; using NosCore.Packets.Enumerations; @@ -32,6 +30,7 @@ using Serilog; using System.Linq; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; using NosCore.GameObject.InterChannelCommunication.Hubs.FriendHub; using Character = NosCore.Data.WebApi.Character; using NosCore.GameObject.InterChannelCommunication.Hubs.PubSub; diff --git a/src/NosCore.PacketHandlers/Chat/ClientSayPacketHandler.cs b/src/NosCore.PacketHandlers/Chat/ClientSayPacketHandler.cs index 9bd9e7f66..5cdae48ab 100644 --- a/src/NosCore.PacketHandlers/Chat/ClientSayPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Chat/ClientSayPacketHandler.cs @@ -17,13 +17,13 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -using NosCore.GameObject; using NosCore.GameObject.ComponentEntities.Extensions; using NosCore.GameObject.Networking.ClientSession; using NosCore.Packets.ClientPackets.Chat; using NosCore.Packets.Enumerations; using NosCore.Packets.ServerPackets.Chats; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; using NosCore.Networking; using NosCore.Networking.SessionGroup.ChannelMatcher; diff --git a/src/NosCore.PacketHandlers/Chat/WhisperPacketHandler.cs b/src/NosCore.PacketHandlers/Chat/WhisperPacketHandler.cs index 4325b2cde..069881da9 100644 --- a/src/NosCore.PacketHandlers/Chat/WhisperPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Chat/WhisperPacketHandler.cs @@ -21,7 +21,6 @@ using NosCore.Core.I18N; using NosCore.Data.Enumerations.I18N; using NosCore.Data.Enumerations.Interaction; -using NosCore.GameObject; using NosCore.GameObject.ComponentEntities.Extensions; using NosCore.GameObject.Networking.ClientSession; using NosCore.GameObject.Services.BroadcastService; @@ -36,6 +35,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; using NosCore.GameObject.InterChannelCommunication.Hubs.BlacklistHub; using NosCore.GameObject.InterChannelCommunication.Hubs.PubSub; using NosCore.GameObject.InterChannelCommunication.Messages; diff --git a/src/NosCore.PacketHandlers/Command/ChangeChannelPacketHandler.cs b/src/NosCore.PacketHandlers/Command/ChangeChannelPacketHandler.cs index 2fae42b4f..4303a1699 100644 --- a/src/NosCore.PacketHandlers/Command/ChangeChannelPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Command/ChangeChannelPacketHandler.cs @@ -18,9 +18,9 @@ // along with this program. If not, see . using NosCore.Data.CommandPackets; -using NosCore.GameObject; using NosCore.GameObject.Networking.ClientSession; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; using NosCore.GameObject.Services.ChannelService; namespace NosCore.PacketHandlers.Command diff --git a/src/NosCore.PacketHandlers/Command/ChangeClassPacketHandler.cs b/src/NosCore.PacketHandlers/Command/ChangeClassPacketHandler.cs index 117efbc6b..e29741ff1 100644 --- a/src/NosCore.PacketHandlers/Command/ChangeClassPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Command/ChangeClassPacketHandler.cs @@ -20,11 +20,11 @@ using System.Linq; using NosCore.Data.CommandPackets; using NosCore.Data.Enumerations; -using NosCore.GameObject; using NosCore.GameObject.Networking.ClientSession; using NosCore.Packets.Enumerations; using NosCore.Packets.ServerPackets.UI; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; using NosCore.GameObject.InterChannelCommunication.Hubs.PubSub; using NosCore.GameObject.InterChannelCommunication.Messages; using Character = NosCore.Data.WebApi.Character; diff --git a/src/NosCore.PacketHandlers/Command/CreateItemPacketHandler.cs b/src/NosCore.PacketHandlers/Command/CreateItemPacketHandler.cs index fcdd3b06b..572984a63 100644 --- a/src/NosCore.PacketHandlers/Command/CreateItemPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Command/CreateItemPacketHandler.cs @@ -24,7 +24,6 @@ using NosCore.Data.Enumerations.I18N; using NosCore.Data.Enumerations.Items; using NosCore.Data.StaticEntities; -using NosCore.GameObject; using NosCore.GameObject.ComponentEntities.Extensions; using NosCore.GameObject.Networking.ClientSession; using NosCore.GameObject.Services.InventoryService; @@ -38,6 +37,7 @@ using Serilog; using System.Collections.Generic; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; namespace NosCore.PacketHandlers.Command { diff --git a/src/NosCore.PacketHandlers/Command/EffectCommandPacketHandler.cs b/src/NosCore.PacketHandlers/Command/EffectCommandPacketHandler.cs index 6ebf5eed0..8aca028f8 100644 --- a/src/NosCore.PacketHandlers/Command/EffectCommandPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Command/EffectCommandPacketHandler.cs @@ -18,10 +18,10 @@ // along with this program. If not, see . using NosCore.Data.CommandPackets; -using NosCore.GameObject; using NosCore.GameObject.ComponentEntities.Extensions; using NosCore.GameObject.Networking.ClientSession; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; using NosCore.Networking; diff --git a/src/NosCore.PacketHandlers/Command/GiftPacketHandler.cs b/src/NosCore.PacketHandlers/Command/GiftPacketHandler.cs index f6b020443..46f9357d3 100644 --- a/src/NosCore.PacketHandlers/Command/GiftPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Command/GiftPacketHandler.cs @@ -19,7 +19,6 @@ using System.Linq; using NosCore.Data.CommandPackets; -using NosCore.GameObject; using NosCore.GameObject.Networking.ClientSession; using NosCore.Packets.Enumerations; using NosCore.Packets.ServerPackets.Chats; @@ -27,7 +26,8 @@ using NosCore.Shared.Enumerations; using System.Threading.Tasks; using NodaTime; -using NosCore.GameObject.Helper; +using NosCore.GameObject.Services.MailService; +using NosCore.GameObject.Infastructure; using NosCore.GameObject.InterChannelCommunication.Hubs.MailHub; using NosCore.GameObject.InterChannelCommunication.Hubs.PubSub; diff --git a/src/NosCore.PacketHandlers/Command/HelpPacketHandler.cs b/src/NosCore.PacketHandlers/Command/HelpPacketHandler.cs index 3768d967c..a5c23d68c 100644 --- a/src/NosCore.PacketHandlers/Command/HelpPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Command/HelpPacketHandler.cs @@ -19,13 +19,13 @@ using NosCore.Core.Extensions; using NosCore.Data.CommandPackets; -using NosCore.GameObject; using NosCore.GameObject.ComponentEntities.Extensions; using NosCore.GameObject.Networking.ClientSession; using NosCore.Packets.Enumerations; using System.Linq; using System.Reflection; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; namespace NosCore.PacketHandlers.Command { diff --git a/src/NosCore.PacketHandlers/Command/InvisibleCommandPacketHandler.cs b/src/NosCore.PacketHandlers/Command/InvisibleCommandPacketHandler.cs index 5ba8c2caf..765e0d1e3 100644 --- a/src/NosCore.PacketHandlers/Command/InvisibleCommandPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Command/InvisibleCommandPacketHandler.cs @@ -18,10 +18,10 @@ // along with this program. If not, see . using NosCore.Data.CommandPackets; -using NosCore.GameObject; using NosCore.GameObject.ComponentEntities.Extensions; using NosCore.GameObject.Networking.ClientSession; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; using NosCore.Networking; diff --git a/src/NosCore.PacketHandlers/Command/KickPacketHandler.cs b/src/NosCore.PacketHandlers/Command/KickPacketHandler.cs index 2b810c8db..87d4e4c9b 100644 --- a/src/NosCore.PacketHandlers/Command/KickPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Command/KickPacketHandler.cs @@ -19,11 +19,11 @@ using System.Linq; using NosCore.Data.CommandPackets; -using NosCore.GameObject; using NosCore.GameObject.Networking.ClientSession; using NosCore.Packets.Enumerations; using NosCore.Packets.ServerPackets.UI; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; using NosCore.GameObject.InterChannelCommunication.Hubs.PubSub; namespace NosCore.PacketHandlers.Command diff --git a/src/NosCore.PacketHandlers/Command/PositionPacketHandler.cs b/src/NosCore.PacketHandlers/Command/PositionPacketHandler.cs index fc09798a1..71d292039 100644 --- a/src/NosCore.PacketHandlers/Command/PositionPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Command/PositionPacketHandler.cs @@ -18,11 +18,11 @@ // along with this program. If not, see . using NosCore.Data.CommandPackets; -using NosCore.GameObject; using NosCore.GameObject.ComponentEntities.Extensions; using NosCore.GameObject.Networking.ClientSession; using NosCore.Packets.Enumerations; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; namespace NosCore.PacketHandlers.Command { diff --git a/src/NosCore.PacketHandlers/Command/SetGoldCommandPacketHandler.cs b/src/NosCore.PacketHandlers/Command/SetGoldCommandPacketHandler.cs index 03690acd6..9e3150a76 100644 --- a/src/NosCore.PacketHandlers/Command/SetGoldCommandPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Command/SetGoldCommandPacketHandler.cs @@ -20,11 +20,11 @@ using System.Linq; using NosCore.Data.CommandPackets; using NosCore.Data.Enumerations; -using NosCore.GameObject; using NosCore.GameObject.Networking.ClientSession; using NosCore.Packets.Enumerations; using NosCore.Packets.ServerPackets.UI; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; using NosCore.GameObject.InterChannelCommunication.Hubs.PubSub; using NosCore.GameObject.InterChannelCommunication.Messages; using Character = NosCore.Data.WebApi.Character; diff --git a/src/NosCore.PacketHandlers/Command/SetHeroLevelCommandPacketHandler.cs b/src/NosCore.PacketHandlers/Command/SetHeroLevelCommandPacketHandler.cs index 9bfdf25c4..e913ef3e9 100644 --- a/src/NosCore.PacketHandlers/Command/SetHeroLevelCommandPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Command/SetHeroLevelCommandPacketHandler.cs @@ -19,12 +19,12 @@ using NosCore.Data.CommandPackets; using NosCore.Data.Enumerations; -using NosCore.GameObject; using NosCore.GameObject.Networking.ClientSession; using NosCore.Packets.Enumerations; using NosCore.Packets.ServerPackets.UI; using System.Linq; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; using NosCore.GameObject.InterChannelCommunication.Hubs.ChannelHub; using Character = NosCore.Data.WebApi.Character; using NosCore.GameObject.InterChannelCommunication.Hubs.PubSub; diff --git a/src/NosCore.PacketHandlers/Command/SetJobLevelCommandPacketHandler.cs b/src/NosCore.PacketHandlers/Command/SetJobLevelCommandPacketHandler.cs index 02d6f009d..21c246479 100644 --- a/src/NosCore.PacketHandlers/Command/SetJobLevelCommandPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Command/SetJobLevelCommandPacketHandler.cs @@ -19,13 +19,13 @@ using NosCore.Data.CommandPackets; using NosCore.Data.Enumerations; -using NosCore.GameObject; using NosCore.GameObject.Networking.ClientSession; using NosCore.Packets.Enumerations; using NosCore.Packets.ServerPackets.UI; using System.Threading.Tasks; using Character = NosCore.Data.WebApi.Character; using System.Linq; +using NosCore.GameObject.Infastructure; using NosCore.GameObject.InterChannelCommunication.Hubs.PubSub; using NosCore.GameObject.InterChannelCommunication.Messages; diff --git a/src/NosCore.PacketHandlers/Command/SetLevelCommandPacketHandler.cs b/src/NosCore.PacketHandlers/Command/SetLevelCommandPacketHandler.cs index a4fb117f3..afe7301c2 100644 --- a/src/NosCore.PacketHandlers/Command/SetLevelCommandPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Command/SetLevelCommandPacketHandler.cs @@ -20,11 +20,11 @@ using System.Linq; using NosCore.Data.CommandPackets; using NosCore.Data.Enumerations; -using NosCore.GameObject; using NosCore.GameObject.Networking.ClientSession; using NosCore.Packets.Enumerations; using NosCore.Packets.ServerPackets.UI; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; using NosCore.GameObject.InterChannelCommunication.Hubs.ChannelHub; using NosCore.GameObject.InterChannelCommunication.Hubs.PubSub; using NosCore.GameObject.InterChannelCommunication.Messages; diff --git a/src/NosCore.PacketHandlers/Command/SetMaintenancePacketHandler.cs b/src/NosCore.PacketHandlers/Command/SetMaintenancePacketHandler.cs index 40690c595..ea15e5b9b 100644 --- a/src/NosCore.PacketHandlers/Command/SetMaintenancePacketHandler.cs +++ b/src/NosCore.PacketHandlers/Command/SetMaintenancePacketHandler.cs @@ -18,9 +18,9 @@ // along with this program. If not, see . using NosCore.Data.CommandPackets; -using NosCore.GameObject; using NosCore.GameObject.Networking.ClientSession; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; using NosCore.GameObject.InterChannelCommunication.Hubs.ChannelHub; namespace NosCore.PacketHandlers.Command diff --git a/src/NosCore.PacketHandlers/Command/SetReputationPacketHandler.cs b/src/NosCore.PacketHandlers/Command/SetReputationPacketHandler.cs index 1a05aa3ee..9aec47bd1 100644 --- a/src/NosCore.PacketHandlers/Command/SetReputationPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Command/SetReputationPacketHandler.cs @@ -19,13 +19,13 @@ using NosCore.Data.CommandPackets; using NosCore.Data.Enumerations; -using NosCore.GameObject; using NosCore.GameObject.Networking.ClientSession; using NosCore.Packets.Enumerations; using NosCore.Packets.ServerPackets.UI; using System.Threading.Tasks; using Character = NosCore.Data.WebApi.Character; using System.Linq; +using NosCore.GameObject.Infastructure; using NosCore.GameObject.InterChannelCommunication.Hubs.PubSub; using NosCore.GameObject.InterChannelCommunication.Messages; diff --git a/src/NosCore.PacketHandlers/Command/ShoutPacketHandler.cs b/src/NosCore.PacketHandlers/Command/ShoutPacketHandler.cs index 0cee6a41f..9da837984 100644 --- a/src/NosCore.PacketHandlers/Command/ShoutPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Command/ShoutPacketHandler.cs @@ -21,7 +21,6 @@ using NosCore.Data.CommandPackets; using NosCore.Data.Enumerations.I18N; using NosCore.Data.Enumerations.Interaction; -using NosCore.GameObject; using NosCore.GameObject.Networking.ClientSession; using NosCore.Packets.Enumerations; using NosCore.Packets.Interfaces; @@ -30,6 +29,7 @@ using NosCore.Shared.Enumerations; using System.Collections.Generic; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; using NosCore.GameObject.InterChannelCommunication.Hubs.PubSub; using NosCore.GameObject.InterChannelCommunication.Messages; using Character = NosCore.Data.WebApi.Character; diff --git a/src/NosCore.PacketHandlers/Command/SizePacketHandler.cs b/src/NosCore.PacketHandlers/Command/SizePacketHandler.cs index 1b37c910d..d4eaf9df1 100644 --- a/src/NosCore.PacketHandlers/Command/SizePacketHandler.cs +++ b/src/NosCore.PacketHandlers/Command/SizePacketHandler.cs @@ -19,13 +19,13 @@ using NosCore.Data.CommandPackets; using NosCore.Data.Enumerations.I18N; -using NosCore.GameObject; using NosCore.GameObject.ComponentEntities.Extensions; using NosCore.GameObject.ComponentEntities.Interfaces; using NosCore.GameObject.Networking.ClientSession; using NosCore.Shared.Enumerations; using Serilog; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; using NosCore.Networking; using NosCore.Shared.I18N; diff --git a/src/NosCore.PacketHandlers/Command/SpeedPacketHandler.cs b/src/NosCore.PacketHandlers/Command/SpeedPacketHandler.cs index 0f7a3bea9..dbfdfc26d 100644 --- a/src/NosCore.PacketHandlers/Command/SpeedPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Command/SpeedPacketHandler.cs @@ -18,11 +18,11 @@ // along with this program. If not, see . using NosCore.Data.CommandPackets; -using NosCore.GameObject; using NosCore.GameObject.ComponentEntities.Extensions; using NosCore.GameObject.Networking.ClientSession; using NosCore.Packets.Enumerations; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; namespace NosCore.PacketHandlers.Command { diff --git a/src/NosCore.PacketHandlers/Command/TeleportPacketHandler.cs b/src/NosCore.PacketHandlers/Command/TeleportPacketHandler.cs index 192269cfb..51547da8c 100644 --- a/src/NosCore.PacketHandlers/Command/TeleportPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Command/TeleportPacketHandler.cs @@ -20,11 +20,11 @@ using NosCore.Core.I18N; using NosCore.Data.CommandPackets; using NosCore.Data.Enumerations.I18N; -using NosCore.GameObject; using NosCore.GameObject.Networking.ClientSession; using NosCore.GameObject.Services.BroadcastService; using Serilog; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; using NosCore.GameObject.Services.MapChangeService; namespace NosCore.PacketHandlers.Command diff --git a/src/NosCore.PacketHandlers/Exchange/ExcListPacketHandler.cs b/src/NosCore.PacketHandlers/Exchange/ExcListPacketHandler.cs index bc5aae3b2..fd4327ba5 100644 --- a/src/NosCore.PacketHandlers/Exchange/ExcListPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Exchange/ExcListPacketHandler.cs @@ -19,9 +19,7 @@ using NosCore.Data.Enumerations; using NosCore.Data.Enumerations.I18N; -using NosCore.GameObject; using NosCore.GameObject.ComponentEntities.Extensions; -using NosCore.GameObject.Networking; using NosCore.GameObject.Networking.ClientSession; using NosCore.GameObject.Services.ExchangeService; using NosCore.Packets.ClientPackets.Exchanges; @@ -31,6 +29,7 @@ using Serilog; using System.Collections.Generic; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; using NosCore.GameObject.Services.BroadcastService; namespace NosCore.PacketHandlers.Exchange @@ -51,7 +50,7 @@ public override async Task ExecuteAsync(ExcListPacket packet, ClientSession clie var target = sessionRegistry.GetCharacter(s => (s.VisualId == exchangeService.GetTargetId(clientSession.Character.VisualId)) && - (s.MapInstanceId == clientSession.Character.MapInstanceId)) as Character; + (s.MapInstanceId == clientSession.Character.MapInstanceId)) as GameObject.ComponentEntities.Entities.Character; if ((packet.SubPackets!.Count > 0) && (target != null)) { diff --git a/src/NosCore.PacketHandlers/Exchange/ExchangeRequestPacketHandler.cs b/src/NosCore.PacketHandlers/Exchange/ExchangeRequestPacketHandler.cs index fe850207f..bc8be3d26 100644 --- a/src/NosCore.PacketHandlers/Exchange/ExchangeRequestPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Exchange/ExchangeRequestPacketHandler.cs @@ -18,7 +18,6 @@ // along with this program. If not, see . using NosCore.Data.Enumerations.I18N; -using NosCore.GameObject; using NosCore.GameObject.ComponentEntities.Extensions; using NosCore.GameObject.InterChannelCommunication.Hubs.BlacklistHub; using NosCore.GameObject.Networking.ClientSession; @@ -35,6 +34,8 @@ using System; using System.Linq; using System.Threading.Tasks; +using NosCore.GameObject.ComponentEntities.Entities; +using NosCore.GameObject.Infastructure; namespace NosCore.PacketHandlers.Exchange { diff --git a/src/NosCore.PacketHandlers/Friend/BlDelPacketHandler.cs b/src/NosCore.PacketHandlers/Friend/BlDelPacketHandler.cs index 6d8b31af5..120d85e43 100644 --- a/src/NosCore.PacketHandlers/Friend/BlDelPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Friend/BlDelPacketHandler.cs @@ -20,12 +20,12 @@ using System.Linq; using NosCore.Core.I18N; using NosCore.Data.Enumerations.I18N; -using NosCore.GameObject; using NosCore.GameObject.ComponentEntities.Extensions; using NosCore.GameObject.Networking.ClientSession; using NosCore.Packets.ClientPackets.Relations; using NosCore.Packets.ServerPackets.UI; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; using NosCore.GameObject.InterChannelCommunication.Hubs.BlacklistHub; namespace NosCore.PacketHandlers.Friend diff --git a/src/NosCore.PacketHandlers/Friend/BlInsPacketHandler.cs b/src/NosCore.PacketHandlers/Friend/BlInsPacketHandler.cs index a0f21c2ed..45cfd7d83 100644 --- a/src/NosCore.PacketHandlers/Friend/BlInsPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Friend/BlInsPacketHandler.cs @@ -19,7 +19,6 @@ using NosCore.Data.Enumerations.I18N; using NosCore.Data.WebApi; -using NosCore.GameObject; using NosCore.GameObject.ComponentEntities.Extensions; using NosCore.GameObject.Networking.ClientSession; using NosCore.Packets.ClientPackets.Relations; @@ -28,6 +27,7 @@ using NosCore.Shared.I18N; using Serilog; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; using NosCore.GameObject.InterChannelCommunication.Hubs.BlacklistHub; namespace NosCore.PacketHandlers.Friend diff --git a/src/NosCore.PacketHandlers/Friend/BlPacketHandler.cs b/src/NosCore.PacketHandlers/Friend/BlPacketHandler.cs index 240b735ec..e36b3fb87 100644 --- a/src/NosCore.PacketHandlers/Friend/BlPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Friend/BlPacketHandler.cs @@ -17,13 +17,13 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -using NosCore.GameObject; using NosCore.GameObject.Networking.ClientSession; using NosCore.GameObject.Services.BroadcastService; using NosCore.Packets.ClientPackets.Relations; using NosCore.Packets.Enumerations; using NosCore.Packets.ServerPackets.UI; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; namespace NosCore.PacketHandlers.Friend { diff --git a/src/NosCore.PacketHandlers/Friend/FdelPacketHandler.cs b/src/NosCore.PacketHandlers/Friend/FdelPacketHandler.cs index f14e570e3..19c1b25cc 100644 --- a/src/NosCore.PacketHandlers/Friend/FdelPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Friend/FdelPacketHandler.cs @@ -20,13 +20,13 @@ using System.Linq; using NosCore.Core.I18N; using NosCore.Data.Enumerations.I18N; -using NosCore.GameObject; using NosCore.GameObject.ComponentEntities.Extensions; using NosCore.GameObject.Networking.ClientSession; using NosCore.GameObject.Services.BroadcastService; using NosCore.Packets.ClientPackets.Relations; using NosCore.Packets.ServerPackets.UI; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; using NosCore.GameObject.InterChannelCommunication.Hubs.ChannelHub; using NosCore.GameObject.InterChannelCommunication.Hubs.FriendHub; using NosCore.GameObject.InterChannelCommunication.Hubs.PubSub; diff --git a/src/NosCore.PacketHandlers/Friend/FinsPacketHandler.cs b/src/NosCore.PacketHandlers/Friend/FinsPacketHandler.cs index 2194e3eca..537d30b51 100644 --- a/src/NosCore.PacketHandlers/Friend/FinsPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Friend/FinsPacketHandler.cs @@ -19,7 +19,6 @@ using NosCore.Data.Enumerations.I18N; using NosCore.Data.WebApi; -using NosCore.GameObject; using NosCore.GameObject.ComponentEntities.Extensions; using NosCore.GameObject.Networking.ClientSession; using NosCore.GameObject.Services.BroadcastService; @@ -28,6 +27,7 @@ using NosCore.Packets.ServerPackets.UI; using System; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; using NosCore.GameObject.InterChannelCommunication.Hubs.ChannelHub; using NosCore.GameObject.InterChannelCommunication.Hubs.FriendHub; using NosCore.GameObject.InterChannelCommunication.Hubs.PubSub; diff --git a/src/NosCore.PacketHandlers/Friend/FlPacketHandler.cs b/src/NosCore.PacketHandlers/Friend/FlPacketHandler.cs index f261884c9..314d18db1 100644 --- a/src/NosCore.PacketHandlers/Friend/FlPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Friend/FlPacketHandler.cs @@ -18,13 +18,13 @@ // along with this program. If not, see . using NosCore.Data.CommandPackets; -using NosCore.GameObject; using NosCore.GameObject.Networking.ClientSession; using NosCore.GameObject.Services.BroadcastService; using NosCore.Packets.ClientPackets.Relations; using NosCore.Packets.Enumerations; using NosCore.Packets.ServerPackets.UI; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; namespace NosCore.PacketHandlers.Friend { diff --git a/src/NosCore.PacketHandlers/Game/GameStartPacketHandler.cs b/src/NosCore.PacketHandlers/Game/GameStartPacketHandler.cs index 5ecc0a2b7..dc4a075c6 100644 --- a/src/NosCore.PacketHandlers/Game/GameStartPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Game/GameStartPacketHandler.cs @@ -20,7 +20,6 @@ using Microsoft.Extensions.Options; using NosCore.Core.Configuration; using NosCore.Data.Enumerations.Buff; -using NosCore.GameObject; using NosCore.GameObject.ComponentEntities.Extensions; using NosCore.GameObject.Networking.ClientSession; using NosCore.GameObject.Services.QuestService; @@ -32,6 +31,7 @@ using NosCore.Shared.Enumerations; using System.Linq; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; using NosCore.GameObject.InterChannelCommunication.Hubs.BlacklistHub; using NosCore.GameObject.InterChannelCommunication.Hubs.ChannelHub; using NosCore.GameObject.InterChannelCommunication.Hubs.FriendHub; diff --git a/src/NosCore.PacketHandlers/Game/GuriPacketHandler.cs b/src/NosCore.PacketHandlers/Game/GuriPacketHandler.cs index 803bf8850..0bc3c23d5 100644 --- a/src/NosCore.PacketHandlers/Game/GuriPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Game/GuriPacketHandler.cs @@ -17,11 +17,11 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -using NosCore.GameObject; using NosCore.GameObject.Networking.ClientSession; using NosCore.GameObject.Services.GuriRunnerService; using NosCore.Packets.ClientPackets.UI; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; namespace NosCore.PacketHandlers.Game { diff --git a/src/NosCore.PacketHandlers/Game/NcifPacketHandler.cs b/src/NosCore.PacketHandlers/Game/NcifPacketHandler.cs index 478eabcb1..c5258f1cd 100644 --- a/src/NosCore.PacketHandlers/Game/NcifPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Game/NcifPacketHandler.cs @@ -18,7 +18,6 @@ // along with this program. If not, see . using NosCore.Data.Enumerations.I18N; -using NosCore.GameObject; using NosCore.GameObject.ComponentEntities.Extensions; using NosCore.GameObject.ComponentEntities.Interfaces; using NosCore.GameObject.Networking.ClientSession; @@ -28,6 +27,7 @@ using NosCore.Shared.I18N; using Serilog; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; namespace NosCore.PacketHandlers.Game { diff --git a/src/NosCore.PacketHandlers/Game/PulsePacketHandler.cs b/src/NosCore.PacketHandlers/Game/PulsePacketHandler.cs index fb804637e..748d27498 100644 --- a/src/NosCore.PacketHandlers/Game/PulsePacketHandler.cs +++ b/src/NosCore.PacketHandlers/Game/PulsePacketHandler.cs @@ -17,10 +17,10 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -using NosCore.GameObject; using NosCore.GameObject.Networking.ClientSession; using NosCore.Packets.ClientPackets.Movement; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; namespace NosCore.PacketHandlers.Game { diff --git a/src/NosCore.PacketHandlers/Game/QSetPacketHandler.cs b/src/NosCore.PacketHandlers/Game/QSetPacketHandler.cs index 2724b6d17..df2a9867c 100644 --- a/src/NosCore.PacketHandlers/Game/QSetPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Game/QSetPacketHandler.cs @@ -18,13 +18,13 @@ // along with this program. If not, see . using NosCore.Data.Dto; -using NosCore.GameObject; using NosCore.GameObject.Networking.ClientSession; using NosCore.Packets.ClientPackets.Quicklist; using NosCore.Packets.Enumerations; using NosCore.Packets.ServerPackets.Quicklist; using System; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; namespace NosCore.PacketHandlers.Game { diff --git a/src/NosCore.PacketHandlers/Game/TitEqPacketHandler.cs b/src/NosCore.PacketHandlers/Game/TitEqPacketHandler.cs index 23b94a0cd..5f713eaf3 100644 --- a/src/NosCore.PacketHandlers/Game/TitEqPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Game/TitEqPacketHandler.cs @@ -17,7 +17,6 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -using NosCore.GameObject; using NosCore.GameObject.ComponentEntities.Extensions; using NosCore.GameObject.Networking.ClientSession; using NosCore.Packets.ClientPackets.Player; @@ -25,6 +24,7 @@ using NosCore.Packets.ServerPackets.UI; using System.Linq; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; using NosCore.Networking; diff --git a/src/NosCore.PacketHandlers/Group/GroupTalkPacketHandler.cs b/src/NosCore.PacketHandlers/Group/GroupTalkPacketHandler.cs index e6a46611e..758c7409e 100644 --- a/src/NosCore.PacketHandlers/Group/GroupTalkPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Group/GroupTalkPacketHandler.cs @@ -17,13 +17,13 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -using NosCore.GameObject; using NosCore.GameObject.ComponentEntities.Extensions; using NosCore.GameObject.Networking.ClientSession; using NosCore.Packets.ClientPackets.Chat; using NosCore.Packets.Enumerations; using NosCore.Packets.ServerPackets.Chats; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; using NosCore.Networking; diff --git a/src/NosCore.PacketHandlers/Group/PjoinPacketHandler.cs b/src/NosCore.PacketHandlers/Group/PjoinPacketHandler.cs index 14ff050aa..5f1ce806d 100644 --- a/src/NosCore.PacketHandlers/Group/PjoinPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Group/PjoinPacketHandler.cs @@ -20,7 +20,6 @@ using NosCore.Core.I18N; using NosCore.Data.Enumerations.Group; using NosCore.Data.Enumerations.I18N; -using NosCore.GameObject; using NosCore.GameObject.ComponentEntities.Extensions; using NosCore.GameObject.ComponentEntities.Interfaces; using NosCore.GameObject.Networking.ClientSession; @@ -33,6 +32,7 @@ using System.Threading.Tasks; using NodaTime; using NosCore.Core.Services.IdService; +using NosCore.GameObject.Infastructure; using NosCore.Networking; using NosCore.Shared.I18N; using NosCore.Packets.ServerPackets.Chats; @@ -42,7 +42,7 @@ namespace NosCore.PacketHandlers.Group { public class PjoinPacketHandler(ILogger logger, IBlacklistHub blacklistHttpCLient, IClock clock, - IIdService groupIdService, + IIdService groupIdService, ILogLanguageLocalizer logLanguage, IGameLanguageLocalizer gameLanguageLocalizer, ISessionRegistry sessionRegistry) : PacketHandler, IWorldPacketHandler diff --git a/src/NosCore.PacketHandlers/Group/PleavePacketHandler.cs b/src/NosCore.PacketHandlers/Group/PleavePacketHandler.cs index fd5d218b9..5e7b4cd02 100644 --- a/src/NosCore.PacketHandlers/Group/PleavePacketHandler.cs +++ b/src/NosCore.PacketHandlers/Group/PleavePacketHandler.cs @@ -18,7 +18,6 @@ // along with this program. If not, see . using NosCore.Data.Enumerations.Group; -using NosCore.GameObject; using NosCore.GameObject.ComponentEntities.Extensions; using NosCore.GameObject.ComponentEntities.Interfaces; using NosCore.GameObject.Networking.ClientSession; @@ -30,11 +29,12 @@ using System.Linq; using System.Threading.Tasks; using NosCore.Core.Services.IdService; +using NosCore.GameObject.Infastructure; using NosCore.Networking; namespace NosCore.PacketHandlers.Group { - public class PleavePacketHandler(IIdService groupIdService, ISessionRegistry sessionRegistry) : PacketHandler, + public class PleavePacketHandler(IIdService groupIdService, ISessionRegistry sessionRegistry) : PacketHandler, IWorldPacketHandler { public override async Task ExecuteAsync(PleavePacket bIPacket, ClientSession clientSession) diff --git a/src/NosCore.PacketHandlers/Inventory/BiPacketHandler.cs b/src/NosCore.PacketHandlers/Inventory/BiPacketHandler.cs index 5f4c945ee..c55f59d04 100644 --- a/src/NosCore.PacketHandlers/Inventory/BiPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Inventory/BiPacketHandler.cs @@ -19,7 +19,6 @@ using NosCore.Data.Enumerations; using NosCore.Data.Enumerations.I18N; -using NosCore.GameObject; using NosCore.GameObject.ComponentEntities.Extensions; using NosCore.GameObject.Networking.ClientSession; using NosCore.Packets.ClientPackets.Inventory; @@ -28,6 +27,7 @@ using NosCore.Shared.I18N; using Serilog; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; namespace NosCore.PacketHandlers.Inventory { diff --git a/src/NosCore.PacketHandlers/Inventory/GetPacketHandler.cs b/src/NosCore.PacketHandlers/Inventory/GetPacketHandler.cs index 908ffb8b6..04074b211 100644 --- a/src/NosCore.PacketHandlers/Inventory/GetPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Inventory/GetPacketHandler.cs @@ -18,7 +18,6 @@ // along with this program. If not, see . using NosCore.Data.Enumerations.I18N; -using NosCore.GameObject; using NosCore.GameObject.Networking.ClientSession; using NosCore.GameObject.Services.MapItemGenerationService; using NosCore.Packets.ClientPackets.Drops; @@ -29,6 +28,8 @@ using System; using System.Threading.Tasks; using NodaTime; +using NosCore.GameObject.ComponentEntities.Entities; +using NosCore.GameObject.Infastructure; using NosCore.Shared.I18N; using NosCore.Packets.ServerPackets.Chats; diff --git a/src/NosCore.PacketHandlers/Inventory/MvePacketHandler.cs b/src/NosCore.PacketHandlers/Inventory/MvePacketHandler.cs index dbcc2f2ea..8a5cd7c7b 100644 --- a/src/NosCore.PacketHandlers/Inventory/MvePacketHandler.cs +++ b/src/NosCore.PacketHandlers/Inventory/MvePacketHandler.cs @@ -18,12 +18,12 @@ // along with this program. If not, see . using NosCore.Data.Enumerations; -using NosCore.GameObject; using NosCore.GameObject.ComponentEntities.Extensions; using NosCore.GameObject.Networking.ClientSession; using NosCore.GameObject.Services.InventoryService; using NosCore.Packets.ClientPackets.Inventory; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; namespace NosCore.PacketHandlers.Inventory { diff --git a/src/NosCore.PacketHandlers/Inventory/MviPacketHandler.cs b/src/NosCore.PacketHandlers/Inventory/MviPacketHandler.cs index 61fe2d713..3c93c7c3d 100644 --- a/src/NosCore.PacketHandlers/Inventory/MviPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Inventory/MviPacketHandler.cs @@ -18,11 +18,11 @@ // along with this program. If not, see . using NosCore.Data.Enumerations; -using NosCore.GameObject; using NosCore.GameObject.ComponentEntities.Extensions; using NosCore.GameObject.Networking.ClientSession; using NosCore.Packets.ClientPackets.Inventory; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; namespace NosCore.PacketHandlers.Inventory { diff --git a/src/NosCore.PacketHandlers/Inventory/PutPacketHandler.cs b/src/NosCore.PacketHandlers/Inventory/PutPacketHandler.cs index 63b59e7fe..b368ed859 100644 --- a/src/NosCore.PacketHandlers/Inventory/PutPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Inventory/PutPacketHandler.cs @@ -22,12 +22,12 @@ using NosCore.Core.I18N; using NosCore.Data.Enumerations; using NosCore.Data.Enumerations.I18N; -using NosCore.GameObject; using NosCore.GameObject.ComponentEntities.Extensions; using NosCore.GameObject.Networking.ClientSession; using NosCore.Packets.ClientPackets.Inventory; using NosCore.Packets.ServerPackets.UI; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; using NosCore.Networking; using NosCore.Packets.ServerPackets.Chats; using NosCore.Packets.Enumerations; diff --git a/src/NosCore.PacketHandlers/Inventory/RemovePacketHandler.cs b/src/NosCore.PacketHandlers/Inventory/RemovePacketHandler.cs index d1c1bd781..7ad97cdc9 100644 --- a/src/NosCore.PacketHandlers/Inventory/RemovePacketHandler.cs +++ b/src/NosCore.PacketHandlers/Inventory/RemovePacketHandler.cs @@ -18,7 +18,6 @@ // along with this program. If not, see . using NosCore.Data.Enumerations; -using NosCore.GameObject; using NosCore.GameObject.ComponentEntities.Extensions; using NosCore.GameObject.Networking.ClientSession; using NosCore.Packets.ClientPackets.Inventory; @@ -26,6 +25,7 @@ using NosCore.Packets.Enumerations; using NosCore.Packets.ServerPackets.UI; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; using NosCore.Networking; diff --git a/src/NosCore.PacketHandlers/Inventory/SpTransformPacketHandler.cs b/src/NosCore.PacketHandlers/Inventory/SpTransformPacketHandler.cs index d09bd1593..c6e19496b 100644 --- a/src/NosCore.PacketHandlers/Inventory/SpTransformPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Inventory/SpTransformPacketHandler.cs @@ -20,7 +20,6 @@ using NosCore.Core.I18N; using NosCore.Data.Enumerations; using NosCore.Data.Enumerations.I18N; -using NosCore.GameObject; using NosCore.GameObject.Networking.ClientSession; using NosCore.GameObject.Services.ItemGenerationService.Item; using NosCore.Packets.ClientPackets.Specialists; @@ -29,6 +28,7 @@ using System; using System.Threading.Tasks; using NodaTime; +using NosCore.GameObject.Infastructure; using NosCore.GameObject.Services.TransformationService; using NosCore.Networking; diff --git a/src/NosCore.PacketHandlers/Inventory/UseItemPacketHandler.cs b/src/NosCore.PacketHandlers/Inventory/UseItemPacketHandler.cs index 7d6f55b50..80634ffac 100644 --- a/src/NosCore.PacketHandlers/Inventory/UseItemPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Inventory/UseItemPacketHandler.cs @@ -18,13 +18,13 @@ // along with this program. If not, see . using NosCore.Data.Enumerations; -using NosCore.GameObject; using NosCore.GameObject.Networking.ClientSession; using NosCore.GameObject.Services.InventoryService; using NosCore.GameObject.Services.ItemGenerationService; using NosCore.Packets.ClientPackets.Inventory; using System; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; namespace NosCore.PacketHandlers.Inventory { diff --git a/src/NosCore.PacketHandlers/Inventory/WearPacketHandler.cs b/src/NosCore.PacketHandlers/Inventory/WearPacketHandler.cs index 55347229d..39a2bfb5a 100644 --- a/src/NosCore.PacketHandlers/Inventory/WearPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Inventory/WearPacketHandler.cs @@ -17,10 +17,10 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -using NosCore.GameObject; using NosCore.GameObject.Networking.ClientSession; using NosCore.Packets.ClientPackets.Inventory; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; namespace NosCore.PacketHandlers.Inventory { diff --git a/src/NosCore.PacketHandlers/Login/NoS0575PacketHandler.cs b/src/NosCore.PacketHandlers/Login/NoS0575PacketHandler.cs index ab23b6abc..30a95970b 100644 --- a/src/NosCore.PacketHandlers/Login/NoS0575PacketHandler.cs +++ b/src/NosCore.PacketHandlers/Login/NoS0575PacketHandler.cs @@ -20,12 +20,12 @@ using Microsoft.Extensions.Options; using NosCore.Core.Configuration; using NosCore.Data.Enumerations.I18N; -using NosCore.GameObject; using NosCore.GameObject.Networking.ClientSession; using NosCore.Packets.ClientPackets.Login; using NosCore.Shared.I18N; using Serilog; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; using NosCore.GameObject.Services.LoginService; namespace NosCore.PacketHandlers.Login diff --git a/src/NosCore.PacketHandlers/Login/NoS0577PacketHandler.cs b/src/NosCore.PacketHandlers/Login/NoS0577PacketHandler.cs index 6c929e549..624e12c1e 100644 --- a/src/NosCore.PacketHandlers/Login/NoS0577PacketHandler.cs +++ b/src/NosCore.PacketHandlers/Login/NoS0577PacketHandler.cs @@ -17,10 +17,10 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -using NosCore.GameObject; using NosCore.GameObject.Networking.ClientSession; using NosCore.Packets.ClientPackets.Login; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; using NosCore.GameObject.Services.LoginService; namespace NosCore.PacketHandlers.Login diff --git a/src/NosCore.PacketHandlers/Miniland/AddobjPacketHandler.cs b/src/NosCore.PacketHandlers/Miniland/AddobjPacketHandler.cs index fc81aa5a4..77ff1c34d 100644 --- a/src/NosCore.PacketHandlers/Miniland/AddobjPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Miniland/AddobjPacketHandler.cs @@ -19,9 +19,7 @@ using NosCore.Data.Enumerations; using NosCore.Data.Enumerations.Items; -using NosCore.GameObject; using NosCore.GameObject.Networking.ClientSession; -using NosCore.GameObject.Services.MapInstanceGenerationService; using NosCore.GameObject.Services.MinilandService; using NosCore.Packets.ClientPackets.Miniland; using NosCore.Packets.Enumerations; @@ -30,6 +28,8 @@ using System; using System.Linq; using System.Threading.Tasks; +using NosCore.GameObject.ComponentEntities.Entities; +using NosCore.GameObject.Infastructure; namespace NosCore.PacketHandlers.Miniland { diff --git a/src/NosCore.PacketHandlers/Miniland/MJoinPacketHandler.cs b/src/NosCore.PacketHandlers/Miniland/MJoinPacketHandler.cs index 21022f59f..f6c905302 100644 --- a/src/NosCore.PacketHandlers/Miniland/MJoinPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Miniland/MJoinPacketHandler.cs @@ -19,9 +19,8 @@ using System.Linq; using System.Threading.Tasks; -using NosCore.GameObject; +using NosCore.GameObject.Infastructure; using NosCore.GameObject.InterChannelCommunication.Hubs.FriendHub; -using NosCore.GameObject.Networking; using NosCore.GameObject.Networking.ClientSession; using NosCore.GameObject.Services.MapChangeService; using NosCore.GameObject.Services.MinilandService; diff --git a/src/NosCore.PacketHandlers/Miniland/MinilandObjects/MgPacketHandler.cs b/src/NosCore.PacketHandlers/Miniland/MinilandObjects/MgPacketHandler.cs index dd2c87c99..05048cb25 100644 --- a/src/NosCore.PacketHandlers/Miniland/MinilandObjects/MgPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Miniland/MinilandObjects/MgPacketHandler.cs @@ -17,13 +17,10 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -using NosCore.GameObject; using NosCore.GameObject.ComponentEntities.Extensions; -using NosCore.GameObject.Helper; using NosCore.GameObject.Networking.ClientSession; using NosCore.GameObject.Services.InventoryService; using NosCore.GameObject.Services.ItemGenerationService; -using NosCore.GameObject.Services.MapInstanceGenerationService; using NosCore.GameObject.Services.MinilandService; using NosCore.Packets.ClientPackets.Miniland; using NosCore.Packets.Enumerations; @@ -33,6 +30,9 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using NosCore.GameObject.ComponentEntities.Entities; +using NosCore.GameObject.Infastructure; +using NosCore.GameObject.Services.MailService; using NosCore.Networking; using NosCore.Packets.ServerPackets.Chats; using NosCore.Shared.Enumerations; diff --git a/src/NosCore.PacketHandlers/Miniland/MinilandObjects/UseobjPacketHandler.cs b/src/NosCore.PacketHandlers/Miniland/MinilandObjects/UseobjPacketHandler.cs index d00a94b6f..e8000e0cb 100644 --- a/src/NosCore.PacketHandlers/Miniland/MinilandObjects/UseobjPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Miniland/MinilandObjects/UseobjPacketHandler.cs @@ -19,10 +19,8 @@ using System.Collections.Generic; using NosCore.Data.Enumerations.Miniland; -using NosCore.GameObject; -using NosCore.GameObject.Helper; -using NosCore.GameObject.Networking.ClientSession; using NosCore.GameObject.Services.MinilandService; +using NosCore.GameObject.Networking.ClientSession; using NosCore.Packets.Enumerations; using NosCore.Packets.ServerPackets.Miniland; using NosCore.Packets.ServerPackets.Warehouse; @@ -35,6 +33,8 @@ using NosCore.Dao.Interfaces; using NosCore.GameObject.Services.ItemGenerationService; using System; +using NosCore.GameObject.Infastructure; +using NosCore.GameObject.Services.WarehouseService; namespace NosCore.PacketHandlers.Miniland.MinilandObjects { diff --git a/src/NosCore.PacketHandlers/Miniland/MlobjPacketHandler.cs b/src/NosCore.PacketHandlers/Miniland/MlobjPacketHandler.cs index 8290ddb25..82872a6c7 100644 --- a/src/NosCore.PacketHandlers/Miniland/MlobjPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Miniland/MlobjPacketHandler.cs @@ -17,7 +17,6 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -using NosCore.GameObject; using NosCore.GameObject.Networking.ClientSession; using NosCore.GameObject.Services.MinilandService; using NosCore.Packets.ClientPackets.Miniland; @@ -25,6 +24,7 @@ using NosCore.Packets.ServerPackets.Miniland; using NosCore.Packets.ServerPackets.UI; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; namespace NosCore.PacketHandlers.Miniland { diff --git a/src/NosCore.PacketHandlers/Miniland/RmvobjPacketHandler.cs b/src/NosCore.PacketHandlers/Miniland/RmvobjPacketHandler.cs index 76f5ed9b6..facd3dc22 100644 --- a/src/NosCore.PacketHandlers/Miniland/RmvobjPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Miniland/RmvobjPacketHandler.cs @@ -18,7 +18,6 @@ // along with this program. If not, see . using NosCore.Data.Enumerations; -using NosCore.GameObject; using NosCore.GameObject.Networking.ClientSession; using NosCore.GameObject.Services.MinilandService; using NosCore.Packets.ClientPackets.Miniland; @@ -26,6 +25,7 @@ using NosCore.Packets.ServerPackets.Miniland; using NosCore.Packets.ServerPackets.UI; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; namespace NosCore.PacketHandlers.Miniland { diff --git a/src/NosCore.PacketHandlers/Movement/ClientDirPacketHandler.cs b/src/NosCore.PacketHandlers/Movement/ClientDirPacketHandler.cs index 0de95d5ec..df83924c4 100644 --- a/src/NosCore.PacketHandlers/Movement/ClientDirPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Movement/ClientDirPacketHandler.cs @@ -18,7 +18,6 @@ // along with this program. If not, see . using NosCore.Data.Enumerations.I18N; -using NosCore.GameObject; using NosCore.GameObject.ComponentEntities.Extensions; using NosCore.GameObject.ComponentEntities.Interfaces; using NosCore.GameObject.Networking.ClientSession; @@ -27,6 +26,7 @@ using NosCore.Shared.I18N; using Serilog; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; namespace NosCore.PacketHandlers.Movement { diff --git a/src/NosCore.PacketHandlers/Movement/PreqPacketHandler.cs b/src/NosCore.PacketHandlers/Movement/PreqPacketHandler.cs index 3942c7d2c..60961be60 100644 --- a/src/NosCore.PacketHandlers/Movement/PreqPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Movement/PreqPacketHandler.cs @@ -18,7 +18,6 @@ // along with this program. If not, see . using NosCore.Data.Enumerations.Map; -using NosCore.GameObject; using NosCore.GameObject.Networking.ClientSession; using NosCore.GameObject.Services.MapInstanceAccessService; using NosCore.GameObject.Services.MinilandService; @@ -29,6 +28,8 @@ using System.Linq; using System.Threading.Tasks; using NodaTime; +using NosCore.GameObject.ComponentEntities.Entities; +using NosCore.GameObject.Infastructure; using NosCore.GameObject.Services.MapChangeService; using NosCore.Packets.ServerPackets.Chats; using NosCore.Shared.Enumerations; diff --git a/src/NosCore.PacketHandlers/Movement/SitPacketHandler.cs b/src/NosCore.PacketHandlers/Movement/SitPacketHandler.cs index 7a590a6ea..550d11f6b 100644 --- a/src/NosCore.PacketHandlers/Movement/SitPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Movement/SitPacketHandler.cs @@ -18,10 +18,8 @@ // along with this program. If not, see . using NosCore.Data.Enumerations.I18N; -using NosCore.GameObject; using NosCore.GameObject.ComponentEntities.Extensions; using NosCore.GameObject.ComponentEntities.Interfaces; -using NosCore.GameObject.Networking; using NosCore.GameObject.Networking.ClientSession; using NosCore.Packets.ClientPackets.Movement; using NosCore.Shared.Enumerations; @@ -29,6 +27,7 @@ using Serilog; using System.Linq; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; using NosCore.GameObject.Services.BroadcastService; namespace NosCore.PacketHandlers.Movement diff --git a/src/NosCore.PacketHandlers/Movement/WalkPacketHandler.cs b/src/NosCore.PacketHandlers/Movement/WalkPacketHandler.cs index d924e8a0e..6b7cf0d88 100644 --- a/src/NosCore.PacketHandlers/Movement/WalkPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Movement/WalkPacketHandler.cs @@ -19,7 +19,6 @@ using NosCore.Data.Enumerations.I18N; using NosCore.Data.Enumerations.Map; -using NosCore.GameObject; using NosCore.GameObject.ComponentEntities.Extensions; using NosCore.GameObject.Networking.ClientSession; using NosCore.Packets.ClientPackets.Movement; @@ -27,6 +26,7 @@ using Serilog; using System.Threading.Tasks; using NodaTime; +using NosCore.GameObject.Infastructure; using NosCore.Networking; using NosCore.Networking.SessionGroup.ChannelMatcher; using NosCore.Shared.I18N; diff --git a/src/NosCore.PacketHandlers/NoAction/CClosePacketHandler.cs b/src/NosCore.PacketHandlers/NoAction/CClosePacketHandler.cs index 7c9c756b7..2666239f3 100644 --- a/src/NosCore.PacketHandlers/NoAction/CClosePacketHandler.cs +++ b/src/NosCore.PacketHandlers/NoAction/CClosePacketHandler.cs @@ -17,10 +17,10 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -using NosCore.GameObject; using NosCore.GameObject.Networking.ClientSession; using NosCore.Packets.ClientPackets.Shops; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; namespace NosCore.PacketHandlers.NoAction { diff --git a/src/NosCore.PacketHandlers/NoAction/LbsPacketHandler.cs b/src/NosCore.PacketHandlers/NoAction/LbsPacketHandler.cs index def1411dd..72ec52722 100644 --- a/src/NosCore.PacketHandlers/NoAction/LbsPacketHandler.cs +++ b/src/NosCore.PacketHandlers/NoAction/LbsPacketHandler.cs @@ -17,10 +17,10 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -using NosCore.GameObject; using NosCore.GameObject.Networking.ClientSession; using NosCore.Packets.ClientPackets; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; namespace NosCore.PacketHandlers.NoAction { diff --git a/src/NosCore.PacketHandlers/NoAction/SnapPacketHandler.cs b/src/NosCore.PacketHandlers/NoAction/SnapPacketHandler.cs index 4322d1b2a..c0bef62f6 100644 --- a/src/NosCore.PacketHandlers/NoAction/SnapPacketHandler.cs +++ b/src/NosCore.PacketHandlers/NoAction/SnapPacketHandler.cs @@ -17,10 +17,10 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -using NosCore.GameObject; using NosCore.GameObject.Networking.ClientSession; using NosCore.Packets.ClientPackets.Player; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; namespace NosCore.PacketHandlers.NoAction { diff --git a/src/NosCore.PacketHandlers/NoAction/ZeroPacketHandler.cs b/src/NosCore.PacketHandlers/NoAction/ZeroPacketHandler.cs index c031d170b..bb9f134e3 100644 --- a/src/NosCore.PacketHandlers/NoAction/ZeroPacketHandler.cs +++ b/src/NosCore.PacketHandlers/NoAction/ZeroPacketHandler.cs @@ -17,10 +17,10 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -using NosCore.GameObject; using NosCore.GameObject.Networking.ClientSession; using NosCore.Packets.ClientPackets.Infrastructure; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; namespace NosCore.PacketHandlers.NoAction { diff --git a/src/NosCore.PacketHandlers/Parcel/PclPacketHandler.cs b/src/NosCore.PacketHandlers/Parcel/PclPacketHandler.cs index 2163d57d6..c09520df3 100644 --- a/src/NosCore.PacketHandlers/Parcel/PclPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Parcel/PclPacketHandler.cs @@ -19,7 +19,6 @@ using NosCore.Dao.Interfaces; using NosCore.Data.Dto; -using NosCore.GameObject; using NosCore.GameObject.Networking.ClientSession; using NosCore.GameObject.Services.InventoryService; using NosCore.GameObject.Services.ItemGenerationService; @@ -32,6 +31,7 @@ using System; using System.Linq; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; using NosCore.GameObject.InterChannelCommunication.Hubs.MailHub; namespace NosCore.PacketHandlers.Parcel diff --git a/src/NosCore.PacketHandlers/Parcel/PstClientPacketHandler.cs b/src/NosCore.PacketHandlers/Parcel/PstClientPacketHandler.cs index e7120cd96..5a3dd58e3 100644 --- a/src/NosCore.PacketHandlers/Parcel/PstClientPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Parcel/PstClientPacketHandler.cs @@ -23,7 +23,6 @@ using Json.Pointer; using NosCore.Dao.Interfaces; using NosCore.Data.Dto; -using NosCore.GameObject; using NosCore.GameObject.Networking.ClientSession; using NosCore.Packets.ClientPackets.Parcel; using NosCore.Packets.Enumerations; @@ -31,8 +30,9 @@ using NosCore.Shared.Enumerations; using System.Threading.Tasks; using NodaTime; -using NosCore.GameObject.Helper; +using NosCore.GameObject.Infastructure; using NosCore.GameObject.InterChannelCommunication.Hubs.MailHub; +using NosCore.GameObject.Services.MailService; namespace NosCore.PacketHandlers.Parcel { diff --git a/src/NosCore.PacketHandlers/Quest/QTPacketHandler.cs b/src/NosCore.PacketHandlers/Quest/QTPacketHandler.cs index 83e996544..3685de3c0 100644 --- a/src/NosCore.PacketHandlers/Quest/QTPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Quest/QTPacketHandler.cs @@ -17,7 +17,6 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -using NosCore.GameObject; using NosCore.GameObject.Networking.ClientSession; using NosCore.GameObject.Services.QuestService; using NosCore.Packets.ClientPackets.Quest; @@ -26,6 +25,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; namespace NosCore.PacketHandlers.Quest { diff --git a/src/NosCore.PacketHandlers/Quest/ScriptPacketHandler.cs b/src/NosCore.PacketHandlers/Quest/ScriptPacketHandler.cs index 456b7043a..a8dab9cf2 100644 --- a/src/NosCore.PacketHandlers/Quest/ScriptPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Quest/ScriptPacketHandler.cs @@ -17,11 +17,11 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -using NosCore.GameObject; using NosCore.GameObject.Networking.ClientSession; using NosCore.GameObject.Services.QuestService; using NosCore.Packets.ClientPackets.Quest; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; namespace NosCore.PacketHandlers.Quest { diff --git a/src/NosCore.PacketHandlers/Shops/BuyPacketHandler.cs b/src/NosCore.PacketHandlers/Shops/BuyPacketHandler.cs index cf797b262..e300e2177 100644 --- a/src/NosCore.PacketHandlers/Shops/BuyPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Shops/BuyPacketHandler.cs @@ -18,7 +18,6 @@ // along with this program. If not, see . using NosCore.Data.Enumerations.I18N; -using NosCore.GameObject; using NosCore.GameObject.ComponentEntities.Interfaces; using NosCore.GameObject.Networking.ClientSession; using NosCore.GameObject.Services.BroadcastService; @@ -27,6 +26,7 @@ using NosCore.Shared.I18N; using Serilog; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; namespace NosCore.PacketHandlers.Shops { diff --git a/src/NosCore.PacketHandlers/Shops/MShopPacketHandler.cs b/src/NosCore.PacketHandlers/Shops/MShopPacketHandler.cs index 7ab8b19b7..24655ce57 100644 --- a/src/NosCore.PacketHandlers/Shops/MShopPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Shops/MShopPacketHandler.cs @@ -19,7 +19,6 @@ using NosCore.Data.Enumerations; using NosCore.Data.Enumerations.Group; -using NosCore.GameObject; using NosCore.GameObject.ComponentEntities.Extensions; using NosCore.GameObject.Networking.ClientSession; using NosCore.GameObject.Services.NRunService; @@ -33,6 +32,8 @@ using System; using System.Linq; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; +using NosCore.GameObject.Services.ShopService; using NosCore.Networking; using NosCore.Networking.SessionGroup.ChannelMatcher; diff --git a/src/NosCore.PacketHandlers/Shops/NrunPacketHandler.cs b/src/NosCore.PacketHandlers/Shops/NrunPacketHandler.cs index 3e18f930b..84f66441f 100644 --- a/src/NosCore.PacketHandlers/Shops/NrunPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Shops/NrunPacketHandler.cs @@ -18,9 +18,7 @@ // along with this program. If not, see . using NosCore.Data.Enumerations.I18N; -using NosCore.GameObject; using NosCore.GameObject.ComponentEntities.Interfaces; -using NosCore.GameObject.Networking; using NosCore.GameObject.Networking.ClientSession; using NosCore.GameObject.Services.NRunService; using NosCore.Packets.ClientPackets.Npcs; @@ -29,6 +27,7 @@ using Serilog; using System; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; using NosCore.GameObject.Services.BroadcastService; namespace NosCore.PacketHandlers.Shops diff --git a/src/NosCore.PacketHandlers/Shops/RequestNpcPacketHandler.cs b/src/NosCore.PacketHandlers/Shops/RequestNpcPacketHandler.cs index 9c0960182..4f5b2fb6b 100644 --- a/src/NosCore.PacketHandlers/Shops/RequestNpcPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Shops/RequestNpcPacketHandler.cs @@ -18,9 +18,7 @@ // along with this program. If not, see . using NosCore.Data.Enumerations.I18N; -using NosCore.GameObject; using NosCore.GameObject.ComponentEntities.Interfaces; -using NosCore.GameObject.Networking; using NosCore.GameObject.Networking.ClientSession; using NosCore.GameObject.Services.NRunService; using NosCore.Packets.ClientPackets.Npcs; @@ -28,6 +26,7 @@ using NosCore.Shared.I18N; using Serilog; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; using NosCore.GameObject.Services.BroadcastService; namespace NosCore.PacketHandlers.Shops diff --git a/src/NosCore.PacketHandlers/Shops/SellPacketHandler.cs b/src/NosCore.PacketHandlers/Shops/SellPacketHandler.cs index e6678e2cf..584af868e 100644 --- a/src/NosCore.PacketHandlers/Shops/SellPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Shops/SellPacketHandler.cs @@ -21,7 +21,6 @@ using NosCore.Core.Configuration; using NosCore.Data.Enumerations; using NosCore.Data.Enumerations.Items; -using NosCore.GameObject; using NosCore.GameObject.ComponentEntities.Extensions; using NosCore.GameObject.Networking.ClientSession; using NosCore.Packets.ClientPackets.Shops; @@ -29,6 +28,7 @@ using NosCore.Packets.ServerPackets.Shop; using NosCore.Packets.ServerPackets.UI; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; namespace NosCore.PacketHandlers.Shops { diff --git a/src/NosCore.PacketHandlers/Shops/ShoppingPacketHandler.cs b/src/NosCore.PacketHandlers/Shops/ShoppingPacketHandler.cs index 1b374a156..16644922c 100644 --- a/src/NosCore.PacketHandlers/Shops/ShoppingPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Shops/ShoppingPacketHandler.cs @@ -19,7 +19,6 @@ using NosCore.Algorithm.DignityService; using NosCore.Data.Enumerations.I18N; -using NosCore.GameObject; using NosCore.GameObject.ComponentEntities.Extensions; using NosCore.GameObject.ComponentEntities.Interfaces; using NosCore.GameObject.Networking.ClientSession; @@ -29,6 +28,7 @@ using NosCore.Shared.I18N; using Serilog; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; namespace NosCore.PacketHandlers.Shops { diff --git a/src/NosCore.PacketHandlers/Warehouse/DepositPacketHandler.cs b/src/NosCore.PacketHandlers/Warehouse/DepositPacketHandler.cs index aea365e82..d2506aca8 100644 --- a/src/NosCore.PacketHandlers/Warehouse/DepositPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Warehouse/DepositPacketHandler.cs @@ -18,7 +18,6 @@ // along with this program. If not, see . using NosCore.Data.Enumerations.Miniland; -using NosCore.GameObject; using NosCore.GameObject.Networking.ClientSession; using NosCore.GameObject.Services.ItemGenerationService.Item; using NosCore.Packets.ClientPackets.Warehouse; @@ -27,6 +26,7 @@ using NosCore.GameObject.InterChannelCommunication.Hubs.WarehouseHub; using Mapster; using NosCore.Data.Dto; +using NosCore.GameObject.Infastructure; namespace NosCore.PacketHandlers.Warehouse { diff --git a/src/NosCore.PacketHandlers/Warehouse/FDepositPacketHandler.cs b/src/NosCore.PacketHandlers/Warehouse/FDepositPacketHandler.cs index 24bc0c6d0..efd7a21f2 100644 --- a/src/NosCore.PacketHandlers/Warehouse/FDepositPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Warehouse/FDepositPacketHandler.cs @@ -17,10 +17,10 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -using NosCore.GameObject; using NosCore.GameObject.Networking.ClientSession; using NosCore.Packets.ClientPackets.Warehouse; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; namespace NosCore.PacketHandlers.Warehouse { diff --git a/src/NosCore.PacketHandlers/Warehouse/FReposPacketHandler.cs b/src/NosCore.PacketHandlers/Warehouse/FReposPacketHandler.cs index 1b13e1eef..404669eb0 100644 --- a/src/NosCore.PacketHandlers/Warehouse/FReposPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Warehouse/FReposPacketHandler.cs @@ -17,10 +17,10 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -using NosCore.GameObject; using NosCore.GameObject.Networking.ClientSession; using NosCore.Packets.ClientPackets.Warehouse; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; namespace NosCore.PacketHandlers.Warehouse { diff --git a/src/NosCore.PacketHandlers/Warehouse/FStashEndPacketHandler.cs b/src/NosCore.PacketHandlers/Warehouse/FStashEndPacketHandler.cs index 8824585f5..872651d02 100644 --- a/src/NosCore.PacketHandlers/Warehouse/FStashEndPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Warehouse/FStashEndPacketHandler.cs @@ -17,10 +17,10 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -using NosCore.GameObject; using NosCore.GameObject.Networking.ClientSession; using NosCore.Packets.ClientPackets.Warehouse; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; namespace NosCore.PacketHandlers.Warehouse { diff --git a/src/NosCore.PacketHandlers/Warehouse/FWithdrawPacketHandler.cs b/src/NosCore.PacketHandlers/Warehouse/FWithdrawPacketHandler.cs index 8d5e2c193..964be03d3 100644 --- a/src/NosCore.PacketHandlers/Warehouse/FWithdrawPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Warehouse/FWithdrawPacketHandler.cs @@ -17,10 +17,10 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -using NosCore.GameObject; using NosCore.GameObject.Networking.ClientSession; using NosCore.Packets.ClientPackets.Warehouse; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; namespace NosCore.PacketHandlers.Warehouse { diff --git a/src/NosCore.PacketHandlers/Warehouse/ReposPacketHandler.cs b/src/NosCore.PacketHandlers/Warehouse/ReposPacketHandler.cs index 2f2d2ce50..2ca3ff453 100644 --- a/src/NosCore.PacketHandlers/Warehouse/ReposPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Warehouse/ReposPacketHandler.cs @@ -17,10 +17,10 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -using NosCore.GameObject; using NosCore.GameObject.Networking.ClientSession; using NosCore.Packets.ClientPackets.Warehouse; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; namespace NosCore.PacketHandlers.Warehouse { diff --git a/src/NosCore.PacketHandlers/Warehouse/StashEndPacketHandler.cs b/src/NosCore.PacketHandlers/Warehouse/StashEndPacketHandler.cs index 3bac22ac3..edcacfe8d 100644 --- a/src/NosCore.PacketHandlers/Warehouse/StashEndPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Warehouse/StashEndPacketHandler.cs @@ -17,10 +17,10 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -using NosCore.GameObject; using NosCore.GameObject.Networking.ClientSession; using NosCore.Packets.ClientPackets.Warehouse; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; namespace NosCore.PacketHandlers.Warehouse { diff --git a/src/NosCore.PacketHandlers/Warehouse/WithdrawPacketHandler.cs b/src/NosCore.PacketHandlers/Warehouse/WithdrawPacketHandler.cs index 376a72804..6eca4d316 100644 --- a/src/NosCore.PacketHandlers/Warehouse/WithdrawPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Warehouse/WithdrawPacketHandler.cs @@ -17,10 +17,10 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -using NosCore.GameObject; using NosCore.GameObject.Networking.ClientSession; using NosCore.Packets.ClientPackets.Warehouse; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; namespace NosCore.PacketHandlers.Warehouse { diff --git a/src/NosCore.WorldServer/WorldServerBootstrap.cs b/src/NosCore.WorldServer/WorldServerBootstrap.cs index e0d654f87..30c31938b 100644 --- a/src/NosCore.WorldServer/WorldServerBootstrap.cs +++ b/src/NosCore.WorldServer/WorldServerBootstrap.cs @@ -69,7 +69,6 @@ using NosCore.Shared.I18N; using NosCore.Algorithm.ExperienceService; using NosCore.Data.CommandPackets; -using NosCore.GameObject.Holders; using NosCore.GameObject.Services.ChannelCommunicationService.Handlers; using NosCore.GameObject.Services.EventLoaderService; using NosCore.GameObject.Services.InventoryService; @@ -81,12 +80,18 @@ using Microsoft.Extensions.Options; using NosCore.Data.DataAttributes; using NosCore.Data; +using NosCore.GameObject.ComponentEntities.Entities; +using NosCore.GameObject.Infastructure; using NosCore.GameObject.InterChannelCommunication.Messages; using NosCore.Packets; using ILogger = Serilog.ILogger; -using Character = NosCore.GameObject.Character; +using Character = NosCore.GameObject.ComponentEntities.Entities.Character; using NosCore.Packets.Enumerations; using NosCore.GameObject.Networking.ClientSession.DisconnectHandlers; +using NosCore.GameObject.Services.GroupService; +using NosCore.GameObject.Services.MapInstanceGenerationService; +using NosCore.GameObject.Services.MinilandService; +using NosCore.GameObject.Services.ExchangeService; namespace NosCore.WorldServer { @@ -220,9 +225,9 @@ private static void InitializeContainer(ContainerBuilder containerBuilder) .Where(t => t.Name.EndsWith("Service")) .AsImplementedInterfaces(); - containerBuilder.RegisterAssemblyTypes(typeof(MapInstanceHolder).Assembly) - .Where(t => t.Name.EndsWith("Holder")) - .SingleInstance(); + containerBuilder.RegisterType().As().SingleInstance(); + containerBuilder.RegisterType().As().SingleInstance(); + containerBuilder.RegisterType().As().SingleInstance(); RegisterDto(containerBuilder); diff --git a/test/NosCore.GameObject.Tests/BazaarTests.cs b/test/NosCore.GameObject.Tests/BazaarTests.cs index fbf56df42..89333f372 100644 --- a/test/NosCore.GameObject.Tests/BazaarTests.cs +++ b/test/NosCore.GameObject.Tests/BazaarTests.cs @@ -18,6 +18,7 @@ // along with this program. If not, see . using System; +using System.Linq; using System.Linq.Expressions; using System.Threading.Tasks; using Json.More; @@ -30,7 +31,6 @@ using NosCore.Data.Enumerations; using NosCore.Data.Enumerations.I18N; using NosCore.Data.WebApi; -using NosCore.GameObject.Holders; using NosCore.GameObject.InterChannelCommunication.Hubs.BazaarHub; using NosCore.GameObject.Services.BazaarService; using NosCore.Tests.Shared; @@ -43,7 +43,7 @@ public class BazaarTests public delegate SaveResult DelegateInsert(ref BazaarItemDto y); private BazaarHub? _bazaarController; - private BazaarItemsHolder? _bazaarItemsHolder; + private BazaarRegistry? _bazaarItemsHolder; private Guid _guid; private Mock>? _mockBzDao; private Mock>? _mockItemDao; @@ -58,7 +58,7 @@ public void Setup() var mockCharacterDao = new Mock>(); _bazaarItemsHolder = - new BazaarItemsHolder(_mockBzDao.Object, _mockItemDao.Object, mockCharacterDao.Object); + new BazaarRegistry(_mockBzDao.Object, _mockItemDao.Object, mockCharacterDao.Object); _bazaarController = new BazaarHub(new BazaarService(_bazaarItemsHolder, _mockBzDao.Object, _mockItemDao.Object, TestHelpers.Instance.Clock)); _mockItemDao.Setup(s => s.TryInsertOrUpdateAsync(It.IsAny())) .Returns(Task.FromResult); @@ -88,8 +88,8 @@ public async Task AddToBazaarAllStackAsync() ItemInstanceId = _guid, Price = 50 }).ConfigureAwait(false); - Assert.AreEqual(_guid, _bazaarItemsHolder?.BazaarItems[0].BazaarItem?.ItemInstanceId); - Assert.AreEqual(99, _bazaarItemsHolder?.BazaarItems[0].BazaarItem?.Amount ?? 0); + Assert.AreEqual(_guid, _bazaarItemsHolder?.GetById(0)?.BazaarItem?.ItemInstanceId); + Assert.AreEqual(99, _bazaarItemsHolder?.GetById(0)?.BazaarItem?.Amount ?? 0); Assert.AreEqual(LanguageKey.OBJECT_IN_BAZAAR, add); } @@ -115,8 +115,8 @@ public async Task AddToBazaarPartialStackAsync() ItemInstanceId = _guid, Price = 50 }).ConfigureAwait(false); - Assert.AreNotEqual(_guid, _bazaarItemsHolder!.BazaarItems[0].BazaarItem?.ItemInstanceId); - Assert.AreEqual(50, _bazaarItemsHolder.BazaarItems[0].BazaarItem?.Amount ?? 0); + Assert.AreNotEqual(_guid, _bazaarItemsHolder!.GetById(0)?.BazaarItem?.ItemInstanceId); + Assert.AreEqual(50, _bazaarItemsHolder.GetById(0)?.BazaarItem?.Amount ?? 0); Assert.AreEqual(LanguageKey.OBJECT_IN_BAZAAR, add); } @@ -247,7 +247,7 @@ public async Task AddMoreThanLimitAsync() }).ConfigureAwait(false); } - Assert.AreEqual(10, _bazaarItemsHolder!.BazaarItems.Count); + Assert.AreEqual(10, _bazaarItemsHolder!.GetAll().Count()); Assert.AreEqual(LanguageKey.LIMIT_EXCEEDED, add); } @@ -324,9 +324,9 @@ public async Task DeleteFromBazaarSomeoneElseAsync() Price = 50 }).ConfigureAwait(false); Assert.AreEqual(true, await _bazaarController.DeleteBazaarAsync(0, 99, "test2").ConfigureAwait(false)); - Assert.AreEqual(1, _bazaarItemsHolder!.BazaarItems.Values.Count); - Assert.AreEqual(0, _bazaarItemsHolder.BazaarItems[0].ItemInstance?.Amount ?? 0); - Assert.AreEqual(99, _bazaarItemsHolder.BazaarItems[0].BazaarItem?.Amount ?? 0); + Assert.AreEqual(1, _bazaarItemsHolder!.GetAll().Count()); + Assert.AreEqual(0, _bazaarItemsHolder.GetById(0)?.ItemInstance?.Amount ?? 0); + Assert.AreEqual(99, _bazaarItemsHolder.GetById(0)?.BazaarItem?.Amount ?? 0); } [TestMethod] @@ -352,7 +352,7 @@ public async Task DeleteFromUserBazaarAsync() Price = 50 }).ConfigureAwait(false); Assert.AreEqual(true, await _bazaarController.DeleteBazaarAsync(0, 99, "test").ConfigureAwait(false)); - Assert.AreEqual(0, _bazaarItemsHolder!.BazaarItems.Values.Count); + Assert.AreEqual(0, _bazaarItemsHolder!.GetAll().Count()); } [TestMethod] @@ -392,7 +392,7 @@ public async Task ModifyBazaarAsync() }).ConfigureAwait(false); var patch = new JsonPatch(PatchOperation.Replace(JsonPointer.Parse("/BazaarItem/Price"), 50.AsJsonElement().AsNode())); Assert.IsNotNull(await _bazaarController.ModifyBazaarAsync(0, patch).ConfigureAwait(false)); - Assert.AreEqual(50, _bazaarItemsHolder?.BazaarItems[0].BazaarItem?.Price); + Assert.AreEqual(50, _bazaarItemsHolder?.GetById(0)?.BazaarItem?.Price); } [TestMethod] @@ -417,10 +417,10 @@ public async Task ModifyBazaarAlreadySoldAsync() ItemInstanceId = _guid, Price = 50 }).ConfigureAwait(false); - _bazaarItemsHolder!.BazaarItems[0].ItemInstance!.Amount--; + _bazaarItemsHolder!.GetById(0)!.ItemInstance!.Amount--; var patch = new JsonPatch(PatchOperation.Replace(JsonPointer.Parse("/BazaarItem/Price"), 10.AsJsonElement().AsNode())); Assert.IsNull(await _bazaarController.ModifyBazaarAsync(0, patch).ConfigureAwait(false)); - Assert.AreEqual(50, _bazaarItemsHolder.BazaarItems[0].BazaarItem?.Price); + Assert.AreEqual(50, _bazaarItemsHolder.GetById(0)?.BazaarItem?.Price); } } } \ No newline at end of file diff --git a/test/NosCore.GameObject.Tests/GroupTests.cs b/test/NosCore.GameObject.Tests/GroupTests.cs index f1bc99876..699915d20 100644 --- a/test/NosCore.GameObject.Tests/GroupTests.cs +++ b/test/NosCore.GameObject.Tests/GroupTests.cs @@ -31,6 +31,8 @@ using NosCore.Data.Enumerations.Character; using NosCore.Data.Enumerations.Group; using NosCore.GameObject.Services.ExchangeService; +using NosCore.GameObject.ComponentEntities.Entities; +using NosCore.GameObject.Services.GroupService; using NosCore.GameObject.Services.InventoryService; using NosCore.GameObject.Services.ItemGenerationService; using NosCore.GameObject.Services.SpeedCalculationService; diff --git a/test/NosCore.GameObject.Tests/Services/ExchangeService/ExchangeServiceTests.cs b/test/NosCore.GameObject.Tests/Services/ExchangeService/ExchangeServiceTests.cs index e6b492026..3df09c4e2 100644 --- a/test/NosCore.GameObject.Tests/Services/ExchangeService/ExchangeServiceTests.cs +++ b/test/NosCore.GameObject.Tests/Services/ExchangeService/ExchangeServiceTests.cs @@ -26,7 +26,7 @@ using NosCore.Core.Configuration; using NosCore.Data.Enumerations; using NosCore.Data.StaticEntities; -using NosCore.GameObject.Holders; +using NosCore.GameObject.Infastructure; using NosCore.GameObject.Services.EventLoaderService; using NosCore.GameObject.Services.InventoryService; using NosCore.GameObject.Services.ItemGenerationService; @@ -35,6 +35,7 @@ using NosCore.Packets.Enumerations; using NosCore.Tests.Shared; using Serilog; +using ExchangeRequestRegistry = NosCore.GameObject.Services.ExchangeService.ExchangeRequestRegistry; namespace NosCore.GameObject.Tests.Services.ExchangeService { @@ -67,7 +68,7 @@ public void Setup() }; _itemProvider = new GameObject.Services.ItemGenerationService.ItemGenerationService(items, new EventLoaderService, IUseItemEventHandler>(new List>>()), Logger, TestHelpers.Instance.LogLanguageLocalizer); - _exchangeProvider = new GameObject.Services.ExchangeService.ExchangeService(_itemProvider, _worldConfiguration, Logger, new ExchangeRequestHolder(), TestHelpers.Instance.LogLanguageLocalizer, TestHelpers.Instance.GameLanguageLocalizer); + _exchangeProvider = new GameObject.Services.ExchangeService.ExchangeService(_itemProvider, _worldConfiguration, Logger, new ExchangeRequestRegistry(), TestHelpers.Instance.LogLanguageLocalizer, TestHelpers.Instance.GameLanguageLocalizer); } [TestMethod] diff --git a/test/NosCore.GameObject.Tests/Services/GuriRunnerService/Handlers/GuriEventHandlerTestsBase.cs b/test/NosCore.GameObject.Tests/Services/GuriRunnerService/Handlers/GuriEventHandlerTestsBase.cs index b979baa86..526a40d80 100644 --- a/test/NosCore.GameObject.Tests/Services/GuriRunnerService/Handlers/GuriEventHandlerTestsBase.cs +++ b/test/NosCore.GameObject.Tests/Services/GuriRunnerService/Handlers/GuriEventHandlerTestsBase.cs @@ -18,6 +18,7 @@ // along with this program. If not, see . using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; using NosCore.GameObject.Networking.ClientSession; using NosCore.Packets.ClientPackets.Inventory; using NosCore.Packets.ClientPackets.UI; diff --git a/test/NosCore.GameObject.Tests/Services/GuriRunnerService/Handlers/SpeakerGuriHandlerTests.cs b/test/NosCore.GameObject.Tests/Services/GuriRunnerService/Handlers/SpeakerGuriHandlerTests.cs index 7e0dc0aac..8dab0d8ce 100644 --- a/test/NosCore.GameObject.Tests/Services/GuriRunnerService/Handlers/SpeakerGuriHandlerTests.cs +++ b/test/NosCore.GameObject.Tests/Services/GuriRunnerService/Handlers/SpeakerGuriHandlerTests.cs @@ -37,6 +37,7 @@ using NosCore.GameObject.Networking.ClientSession; using NosCore.Tests.Shared; using Serilog; +using NosCore.GameObject.Infastructure; using GuriPacket = NosCore.Packets.ClientPackets.UI.GuriPacket; namespace NosCore.GameObject.Tests.Services.GuriRunnerService.Handlers diff --git a/test/NosCore.GameObject.Tests/Services/GuriRunnerService/Handlers/TitleGuriHandlerTests.cs b/test/NosCore.GameObject.Tests/Services/GuriRunnerService/Handlers/TitleGuriHandlerTests.cs index 9ebdc17c9..a9c712843 100644 --- a/test/NosCore.GameObject.Tests/Services/GuriRunnerService/Handlers/TitleGuriHandlerTests.cs +++ b/test/NosCore.GameObject.Tests/Services/GuriRunnerService/Handlers/TitleGuriHandlerTests.cs @@ -37,6 +37,7 @@ using NosCore.Packets.ServerPackets.UI; using NosCore.Tests.Shared; using Serilog; +using NosCore.GameObject.Infastructure; using GuriPacket = NosCore.Packets.ClientPackets.UI.GuriPacket; namespace NosCore.GameObject.Tests.Services.GuriRunnerService.Handlers diff --git a/test/NosCore.GameObject.Tests/Services/InventoryService/InventoryServiceTests.cs b/test/NosCore.GameObject.Tests/Services/InventoryService/InventoryServiceTests.cs index d54e62b51..e2af51783 100644 --- a/test/NosCore.GameObject.Tests/Services/InventoryService/InventoryServiceTests.cs +++ b/test/NosCore.GameObject.Tests/Services/InventoryService/InventoryServiceTests.cs @@ -35,6 +35,7 @@ using NosCore.Packets.Enumerations; using NosCore.Tests.Shared; using Serilog; +using NosCore.GameObject.Infastructure; namespace NosCore.GameObject.Tests.Services.InventoryService { diff --git a/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/BackPackHandlerTests.cs b/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/BackPackHandlerTests.cs index 15fac4e74..13941717a 100644 --- a/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/BackPackHandlerTests.cs +++ b/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/BackPackHandlerTests.cs @@ -39,6 +39,7 @@ using NosCore.Packets.ServerPackets.Inventory; using NosCore.Tests.Shared; using Serilog; +using NosCore.GameObject.Infastructure; namespace NosCore.GameObject.Tests.Services.ItemGenerationService.Handlers { diff --git a/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/BazaarMedalsHandlerTests.cs b/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/BazaarMedalsHandlerTests.cs index 9f4332b8e..6765615a9 100644 --- a/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/BazaarMedalsHandlerTests.cs +++ b/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/BazaarMedalsHandlerTests.cs @@ -35,6 +35,7 @@ using NosCore.Packets.ClientPackets.Inventory; using NosCore.Tests.Shared; using Serilog; +using NosCore.GameObject.Infastructure; namespace NosCore.GameObject.Tests.Services.ItemGenerationService.Handlers { diff --git a/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/MinilandBellHandlerTests.cs b/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/MinilandBellHandlerTests.cs index 6b08d2884..f9b21b5e4 100644 --- a/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/MinilandBellHandlerTests.cs +++ b/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/MinilandBellHandlerTests.cs @@ -39,6 +39,7 @@ using NosCore.Shared.Enumerations; using NosCore.Tests.Shared; using Serilog; +using NosCore.GameObject.Infastructure; namespace NosCore.GameObject.Tests.Services.ItemGenerationService.Handlers { diff --git a/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/SpRechargerHandlerTests.cs b/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/SpRechargerHandlerTests.cs index b521b66c8..09a2c0c27 100644 --- a/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/SpRechargerHandlerTests.cs +++ b/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/SpRechargerHandlerTests.cs @@ -37,6 +37,7 @@ using NosCore.Packets.ServerPackets.UI; using NosCore.Tests.Shared; using Serilog; +using NosCore.GameObject.Infastructure; namespace NosCore.GameObject.Tests.Services.ItemGenerationService.Handlers { diff --git a/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/SpeakerHandlerTests.cs b/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/SpeakerHandlerTests.cs index 2d51142c6..e17e4d59c 100644 --- a/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/SpeakerHandlerTests.cs +++ b/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/SpeakerHandlerTests.cs @@ -34,6 +34,7 @@ using NosCore.Packets.ServerPackets.UI; using NosCore.Tests.Shared; using Serilog; +using NosCore.GameObject.Infastructure; namespace NosCore.GameObject.Tests.Services.ItemGenerationService.Handlers { diff --git a/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/TitleHandlerTests.cs b/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/TitleHandlerTests.cs index 1a20426c2..cb61e7dd5 100644 --- a/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/TitleHandlerTests.cs +++ b/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/TitleHandlerTests.cs @@ -34,6 +34,7 @@ using NosCore.Packets.ServerPackets.UI; using NosCore.Tests.Shared; using Serilog; +using NosCore.GameObject.Infastructure; namespace NosCore.GameObject.Tests.Services.ItemGenerationService.Handlers { diff --git a/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/UseItemEventHandlerTestsBase.cs b/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/UseItemEventHandlerTestsBase.cs index 38d5d4103..501f4ae93 100644 --- a/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/UseItemEventHandlerTestsBase.cs +++ b/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/UseItemEventHandlerTestsBase.cs @@ -19,6 +19,7 @@ using System; using System.Threading.Tasks; +using NosCore.GameObject.Infastructure; using NosCore.GameObject.Networking.ClientSession; using NosCore.GameObject.Services.InventoryService; using NosCore.GameObject.Services.ItemGenerationService.Item; diff --git a/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/VehicleHandlerTests.cs b/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/VehicleHandlerTests.cs index dbd791f07..ced7c0b29 100644 --- a/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/VehicleHandlerTests.cs +++ b/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/VehicleHandlerTests.cs @@ -40,6 +40,7 @@ using NosCore.Packets.ServerPackets.UI; using NosCore.Tests.Shared; using Serilog; +using NosCore.GameObject.Infastructure; namespace NosCore.GameObject.Tests.Services.ItemGenerationService.Handlers { diff --git a/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/WearHandlerTests.cs b/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/WearHandlerTests.cs index 9bf1559bf..313950017 100644 --- a/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/WearHandlerTests.cs +++ b/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/WearHandlerTests.cs @@ -43,6 +43,7 @@ using NosCore.Shared.Enumerations; using NosCore.Tests.Shared; using Serilog; +using NosCore.GameObject.Infastructure; namespace NosCore.GameObject.Tests.Services.ItemGenerationService.Handlers { diff --git a/test/NosCore.GameObject.Tests/Services/NRunService/Handlers/ChangeClassTests.cs b/test/NosCore.GameObject.Tests/Services/NRunService/Handlers/ChangeClassTests.cs index 99b4d29af..c32633def 100644 --- a/test/NosCore.GameObject.Tests/Services/NRunService/Handlers/ChangeClassTests.cs +++ b/test/NosCore.GameObject.Tests/Services/NRunService/Handlers/ChangeClassTests.cs @@ -37,6 +37,7 @@ using NosCore.Shared.Enumerations; using NosCore.Tests.Shared; using Serilog; +using NosCore.GameObject.Infastructure; //TODO stop using obsolete #pragma warning disable 618 diff --git a/test/NosCore.GameObject.Tests/ShopTests.cs b/test/NosCore.GameObject.Tests/ShopTests.cs index 4e2fca34d..e5402c520 100644 --- a/test/NosCore.GameObject.Tests/ShopTests.cs +++ b/test/NosCore.GameObject.Tests/ShopTests.cs @@ -49,20 +49,20 @@ using NosCore.GameObject.Services.ItemGenerationService; using NosCore.GameObject.Services.ItemGenerationService.Item; using NosCore.GameObject.Services.MapInstanceAccessService; -using NosCore.GameObject.Services.MinilandService; using NosCore.GameObject.Services.SpeedCalculationService; using NosCore.Networking; using NosCore.Networking.Encoding; -using NosCore.Networking.SessionGroup; using NosCore.Networking.SessionRef; using NosCore.Packets.ClientPackets.Inventory; using NosCore.Packets.Enumerations; -using NosCore.Packets.Interfaces; using NosCore.Packets.ServerPackets.Shop; using NosCore.Packets.ServerPackets.UI; using NosCore.Shared.I18N; using NosCore.Tests.Shared; using Serilog; +using NosCore.GameObject.Infastructure; +using NosCore.GameObject.Services.ShopService; +using NosCore.GameObject.ComponentEntities.Entities; namespace NosCore.GameObject.Tests { diff --git a/test/NosCore.PacketHandlers.Tests/Bazaar/CRegPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Bazaar/CRegPacketHandlerTests.cs index 552f63feb..8b01f3b71 100644 --- a/test/NosCore.PacketHandlers.Tests/Bazaar/CRegPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Bazaar/CRegPacketHandlerTests.cs @@ -31,7 +31,6 @@ using NosCore.Data.Enumerations.Items; using NosCore.Data.StaticEntities; using NosCore.Data.WebApi; -using NosCore.GameObject; using NosCore.GameObject.InterChannelCommunication.Hubs.BazaarHub; using NosCore.GameObject.Networking; using NosCore.GameObject.Networking.ClientSession; @@ -46,6 +45,7 @@ using NosCore.Packets.ServerPackets.UI; using NosCore.Tests.Shared; using Serilog; +using NosCore.GameObject.Infastructure; namespace NosCore.PacketHandlers.Tests.Bazaar { diff --git a/test/NosCore.PacketHandlers.Tests/CharacterScreen/CharNewJobPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/CharacterScreen/CharNewJobPacketHandlerTests.cs index 86d8cf705..bb1c3df8e 100644 --- a/test/NosCore.PacketHandlers.Tests/CharacterScreen/CharNewJobPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/CharacterScreen/CharNewJobPacketHandlerTests.cs @@ -21,12 +21,12 @@ using Mapster; using Microsoft.VisualStudio.TestTools.UnitTesting; using NosCore.Data.Dto; -using NosCore.GameObject; using NosCore.GameObject.Networking.ClientSession; using NosCore.PacketHandlers.CharacterScreen; using NosCore.Packets.ClientPackets.CharacterSelectionScreen; using NosCore.Shared.Enumerations; using NosCore.Tests.Shared; +using NosCore.GameObject.ComponentEntities.Entities; namespace NosCore.PacketHandlers.Tests.CharacterScreen { diff --git a/test/NosCore.PacketHandlers.Tests/CharacterScreen/CharNewPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/CharacterScreen/CharNewPacketHandlerTests.cs index 426019aca..e4e4c2d59 100644 --- a/test/NosCore.PacketHandlers.Tests/CharacterScreen/CharNewPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/CharacterScreen/CharNewPacketHandlerTests.cs @@ -30,13 +30,11 @@ using NosCore.Dao.Interfaces; using NosCore.Data.Dto; using NosCore.Data.Enumerations.Map; -using NosCore.GameObject; using NosCore.GameObject.Map; using NosCore.GameObject.Networking.ClientSession; using NosCore.Networking.SessionGroup; using NosCore.GameObject.Services.EventLoaderService; using NosCore.GameObject.Services.ItemGenerationService; -using NosCore.GameObject.Services.BroadcastService; using NosCore.GameObject.Services.MapChangeService; using NosCore.GameObject.Services.MapInstanceGenerationService; using NosCore.GameObject.Services.MapItemGenerationService; @@ -45,6 +43,8 @@ using NosCore.Packets.ClientPackets.Drops; using NosCore.Tests.Shared; using Serilog; +using NosCore.GameObject.ComponentEntities.Entities; +using NosCore.GameObject.Infastructure; namespace NosCore.PacketHandlers.Tests.CharacterScreen { diff --git a/test/NosCore.PacketHandlers.Tests/CharacterScreen/CharRenPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/CharacterScreen/CharRenPacketHandlerTests.cs index 8f66d41c8..3179c9ad3 100644 --- a/test/NosCore.PacketHandlers.Tests/CharacterScreen/CharRenPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/CharacterScreen/CharRenPacketHandlerTests.cs @@ -24,12 +24,10 @@ using Moq; using NosCore.Core.Services.IdService; using NosCore.Data.Enumerations.Map; -using NosCore.GameObject; using NosCore.GameObject.Map; using NosCore.GameObject.Networking.ClientSession; using NosCore.Networking.SessionGroup; using NosCore.GameObject.Services.EventLoaderService; -using NosCore.GameObject.Services.BroadcastService; using NosCore.GameObject.Services.MapChangeService; using NosCore.GameObject.Services.MapInstanceGenerationService; using NosCore.GameObject.Services.MapItemGenerationService; @@ -38,6 +36,8 @@ using NosCore.Packets.ClientPackets.Drops; using NosCore.Tests.Shared; using Serilog; +using NosCore.GameObject.ComponentEntities.Entities; +using NosCore.GameObject.Infastructure; namespace NosCore.PacketHandlers.Tests.CharacterScreen { diff --git a/test/NosCore.PacketHandlers.Tests/CharacterScreen/CharacterDeletePacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/CharacterScreen/CharacterDeletePacketHandlerTests.cs index 00dc0786e..a69dac664 100644 --- a/test/NosCore.PacketHandlers.Tests/CharacterScreen/CharacterDeletePacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/CharacterScreen/CharacterDeletePacketHandlerTests.cs @@ -22,11 +22,11 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using NosCore.Core.Encryption; using NosCore.Data.Enumerations.Character; -using NosCore.GameObject; using NosCore.GameObject.Networking.ClientSession; using NosCore.PacketHandlers.CharacterScreen; using NosCore.Packets.ClientPackets.CharacterSelectionScreen; using NosCore.Tests.Shared; +using NosCore.GameObject.Infastructure; namespace NosCore.PacketHandlers.Tests.CharacterScreen { diff --git a/test/NosCore.PacketHandlers.Tests/Friend/FinsPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Friend/FinsPacketHandlerTests.cs index bad0f2028..f33f2d38b 100644 --- a/test/NosCore.PacketHandlers.Tests/Friend/FinsPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Friend/FinsPacketHandlerTests.cs @@ -28,8 +28,6 @@ using NosCore.Dao.Interfaces; using NosCore.Data.Dto; using NosCore.Data.WebApi; -using NosCore.GameObject; -using NosCore.GameObject.Holders; using NosCore.GameObject.InterChannelCommunication.Hubs.ChannelHub; using NosCore.GameObject.InterChannelCommunication.Hubs.FriendHub; using NosCore.GameObject.InterChannelCommunication.Hubs.PubSub; @@ -42,6 +40,7 @@ using NosCore.Shared.Enumerations; using NosCore.Tests.Shared; using Serilog; +using NosCore.GameObject.ComponentEntities.Entities; using Character = NosCore.Data.WebApi.Character; namespace NosCore.PacketHandlers.Tests.Friend @@ -56,7 +55,7 @@ public class FinsPacketHandlerTests private Mock? _channelHub; private FinsPacketHandler? _finsPacketHandler; private readonly Mock _friendHttpClient = TestHelpers.Instance.FriendHttpClient; - private FriendRequestHolder? _friendRequestHolder; + private FriendRequestRegistry? _friendRequestHolder; private ClientSession? _session; private ClientSession? _targetSession; @@ -81,7 +80,7 @@ public async Task SetupAsync() } }); - _friendRequestHolder = new FriendRequestHolder(); + _friendRequestHolder = new FriendRequestRegistry(); _connectedAccountHttpClient.Setup(s => s.GetSubscribersAsync()) .ReturnsAsync(new List(){ new Subscriber @@ -101,8 +100,8 @@ public async Task SetupAsync() [TestMethod] public async Task Test_Add_FriendAsync() { - _friendRequestHolder!.FriendRequestCharacters.TryAdd(Guid.NewGuid(), - new Tuple(_targetSession!.Character.CharacterId, _session!.Character.CharacterId)); + _friendRequestHolder!.RegisterRequest(Guid.NewGuid(), + _targetSession!.Character.CharacterId, _session!.Character.CharacterId); var finsPacket = new FinsPacket { CharacterId = _targetSession.Character.CharacterId, diff --git a/test/NosCore.PacketHandlers.Tests/Friend/FlPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Friend/FlPacketHandlerTests.cs index f4a18235b..db0d6f789 100644 --- a/test/NosCore.PacketHandlers.Tests/Friend/FlPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Friend/FlPacketHandlerTests.cs @@ -27,7 +27,6 @@ using NosCore.Data.CommandPackets; using NosCore.Data.Dto; using NosCore.Data.WebApi; -using NosCore.GameObject.Holders; using NosCore.GameObject.Networking; using NosCore.GameObject.Networking.ClientSession; using NosCore.GameObject.Services.FriendService; @@ -71,9 +70,9 @@ public async Task SetupAsync() public async Task Test_Add_Distant_FriendAsync() { var targetSession = await TestHelpers.Instance.GenerateSessionAsync().ConfigureAwait(false); - var friendRequestHolder = new FriendRequestHolder(); - friendRequestHolder.FriendRequestCharacters.TryAdd(Guid.NewGuid(), - new Tuple(targetSession.Character.CharacterId, _session!.Character.CharacterId)); + var friendRequestHolder = new FriendRequestRegistry(); + friendRequestHolder.RegisterRequest(Guid.NewGuid(), + targetSession.Character.CharacterId, _session!.Character.CharacterId); var flPacket = new FlCommandPacket { CharacterName = targetSession.Character.Name diff --git a/test/NosCore.PacketHandlers.Tests/Friend/fDelPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Friend/fDelPacketHandlerTests.cs index 1ecc9820a..12bccc4bf 100644 --- a/test/NosCore.PacketHandlers.Tests/Friend/fDelPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Friend/fDelPacketHandlerTests.cs @@ -28,7 +28,6 @@ using NosCore.Data.Dto; using NosCore.Data.Enumerations.I18N; using NosCore.Data.WebApi; -using NosCore.GameObject.Holders; using NosCore.GameObject.InterChannelCommunication.Hubs.ChannelHub; using NosCore.GameObject.InterChannelCommunication.Hubs.FriendHub; using NosCore.GameObject.InterChannelCommunication.Hubs.PubSub; @@ -82,7 +81,7 @@ public async Task SetupAsync() TestHelpers.Instance.PubSubHub.Object, TestHelpers.Instance.GameLanguageLocalizer, new NosCore.GameObject.Services.BroadcastService.SessionRegistry()); _characterDao = new Mock>(); _friendController = new FriendService(Logger, _characterRelationDao, _characterDao.Object, - new FriendRequestHolder(), _connectedAccountHttpClient.Object, _channelHub.Object, TestHelpers.Instance.LogLanguageLocalizer); + new FriendRequestRegistry(), _connectedAccountHttpClient.Object, _channelHub.Object, TestHelpers.Instance.LogLanguageLocalizer); _friendHttpClient.Setup(s => s.GetFriendsAsync(It.IsAny())) .Returns((long id) => _friendController.GetFriendsAsync(id)); _friendHttpClient.Setup(s => s.DeleteAsync(It.IsAny())) diff --git a/test/NosCore.PacketHandlers.Tests/Group/PJoinPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Group/PJoinPacketHandlerTests.cs index 278825a84..15d1a0747 100644 --- a/test/NosCore.PacketHandlers.Tests/Group/PJoinPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Group/PJoinPacketHandlerTests.cs @@ -24,7 +24,6 @@ using Moq; using NosCore.Core.Services.IdService; using NosCore.Data.Enumerations.Group; -using NosCore.GameObject; using NosCore.GameObject.InterChannelCommunication.Hubs.BlacklistHub; using NosCore.GameObject.Networking; using NosCore.GameObject.Networking.ClientSession; @@ -35,6 +34,7 @@ using NosCore.Packets.ServerPackets.Groups; using NosCore.Tests.Shared; using Serilog; +using Group = NosCore.GameObject.Services.GroupService.Group; namespace NosCore.PacketHandlers.Tests.Group { @@ -49,7 +49,7 @@ public class PJoinPacketHandlerTests public async Task SetupAsync() { Broadcaster.Reset(); - var idServer = new IdService(1); + var idServer = new IdService(1); for (byte i = 0; i < (byte)(GroupType.Group + 1); i++) { var session = await TestHelpers.Instance.GenerateSessionAsync().ConfigureAwait(false); @@ -59,7 +59,7 @@ public async Task SetupAsync() _sessions.Add(i, session); var sessionGroupFactoryMock = new Mock(); sessionGroupFactoryMock.Setup(x => x.Create()).Returns(new Mock().Object); - session.Character.Group = new GameObject.Group(GroupType.Group, sessionGroupFactoryMock.Object); + session.Character.Group = new NosCore.GameObject.Services.GroupService.Group(GroupType.Group, sessionGroupFactoryMock.Object); session.Character.Group.JoinGroup(session.Character); } diff --git a/test/NosCore.PacketHandlers.Tests/Group/PleavePacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Group/PleavePacketHandlerTests.cs index d72669323..53726f4c2 100644 --- a/test/NosCore.PacketHandlers.Tests/Group/PleavePacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Group/PleavePacketHandlerTests.cs @@ -24,7 +24,6 @@ using Moq; using NosCore.Core.Services.IdService; using NosCore.Data.Enumerations.Group; -using NosCore.GameObject; using NosCore.GameObject.InterChannelCommunication.Hubs.BlacklistHub; using NosCore.GameObject.Networking; using NosCore.GameObject.Networking.ClientSession; @@ -36,6 +35,7 @@ using NosCore.Packets.ServerPackets.Groups; using NosCore.Tests.Shared; using Serilog; +using Group = NosCore.GameObject.Services.GroupService.Group; namespace NosCore.PacketHandlers.Tests.Group { @@ -51,7 +51,7 @@ public class PleavePacketHandlerTests public async Task SetupAsync() { Broadcaster.Reset(); - var idServer = new IdService(1); + var idServer = new IdService(1); for (byte i = 0; i < (byte)(GroupType.Group + 1); i++) { var session = await TestHelpers.Instance.GenerateSessionAsync().ConfigureAwait(false); @@ -61,7 +61,7 @@ public async Task SetupAsync() _sessions.Add(i, session); var sessionGroupFactoryMock = new Mock(); sessionGroupFactoryMock.Setup(x => x.Create()).Returns(new Mock().Object); - session.Character.Group = new GameObject.Group(GroupType.Group, sessionGroupFactoryMock.Object); + session.Character.Group = new NosCore.GameObject.Services.GroupService.Group(GroupType.Group, sessionGroupFactoryMock.Object); session.Character.Group.JoinGroup(session.Character); } diff --git a/test/NosCore.PacketHandlers.Tests/Inventory/WearPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Inventory/WearPacketHandlerTests.cs index 86137525e..57736aecb 100644 --- a/test/NosCore.PacketHandlers.Tests/Inventory/WearPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Inventory/WearPacketHandlerTests.cs @@ -26,7 +26,7 @@ using NosCore.Data.Enumerations; using NosCore.Data.Enumerations.I18N; using NosCore.Data.StaticEntities; -using NosCore.GameObject; +using NosCore.GameObject.Infastructure; using NosCore.GameObject.Networking.ClientSession; using NosCore.GameObject.Services.EventLoaderService; using NosCore.GameObject.Services.InventoryService; diff --git a/test/NosCore.PacketHandlers.Tests/Miniland/MJoinPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Miniland/MJoinPacketHandlerTests.cs index 912103fa2..e0c4789bf 100644 --- a/test/NosCore.PacketHandlers.Tests/Miniland/MJoinPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Miniland/MJoinPacketHandlerTests.cs @@ -25,7 +25,6 @@ using Moq; using NosCore.Data.Dto; using NosCore.Data.WebApi; -using NosCore.GameObject; using NosCore.GameObject.InterChannelCommunication.Hubs.FriendHub; using NosCore.GameObject.InterChannelCommunication.Hubs.PubSub; using NosCore.GameObject.Networking; @@ -39,6 +38,7 @@ using NosCore.Shared.Enumerations; using NosCore.Tests.Shared; using Serilog; +using NosCore.GameObject.ComponentEntities.Entities; using Character = NosCore.Data.WebApi.Character; namespace NosCore.PacketHandlers.Tests.Miniland diff --git a/test/NosCore.PacketHandlers.Tests/Miniland/MlEditPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Miniland/MlEditPacketHandlerTests.cs index 347475a52..253da88c2 100644 --- a/test/NosCore.PacketHandlers.Tests/Miniland/MlEditPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Miniland/MlEditPacketHandlerTests.cs @@ -27,8 +27,6 @@ using NosCore.Data.Dto; using NosCore.Data.StaticEntities; using NosCore.Data.WebApi; -using NosCore.GameObject; -using NosCore.GameObject.Holders; using NosCore.GameObject.Map; using NosCore.GameObject.Networking.ClientSession; using NosCore.GameObject.Services.MinilandService; @@ -39,6 +37,7 @@ using NosCore.Packets.ServerPackets.UI; using NosCore.Tests.Shared; using Serilog; +using NosCore.GameObject.ComponentEntities.Entities; namespace NosCore.PacketHandlers.Tests.Miniland { @@ -87,7 +86,7 @@ await TestHelpers.Instance.MinilandDao.TryInsertOrUpdateAsync(new MinilandDto() Data = new byte[] {} }}, TestHelpers.Instance.MinilandDao, - TestHelpers.Instance.MinilandObjectDao, new MinilandHolder()); + TestHelpers.Instance.MinilandObjectDao, new MinilandRegistry()); await _minilandProvider.InitializeAsync(_session.Character, TestHelpers.Instance.MapInstanceGeneratorService); var miniland = _minilandProvider.GetMiniland(_session.Character.CharacterId); var mapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetMapInstance(miniland.MapInstanceId)!; diff --git a/test/NosCore.PacketHandlers.Tests/Movement/PreqPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Movement/PreqPacketHandlerTests.cs index 24d82b1d5..044a126c4 100644 --- a/test/NosCore.PacketHandlers.Tests/Movement/PreqPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Movement/PreqPacketHandlerTests.cs @@ -23,13 +23,13 @@ using Moq; using NodaTime; using NosCore.Data.Enumerations.Map; -using NosCore.GameObject; using NosCore.GameObject.Networking.ClientSession; using NosCore.GameObject.Services.MapChangeService; using NosCore.GameObject.Services.MinilandService; using NosCore.PacketHandlers.Movement; using NosCore.Packets.ClientPackets.Movement; using NosCore.Tests.Shared; +using NosCore.GameObject.ComponentEntities.Entities; namespace NosCore.PacketHandlers.Tests.Movement { diff --git a/test/NosCore.PacketHandlers.Tests/Shops/MShopPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Shops/MShopPacketHandlerTests.cs index 57b2d1d1b..734eec94c 100644 --- a/test/NosCore.PacketHandlers.Tests/Shops/MShopPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Shops/MShopPacketHandlerTests.cs @@ -26,7 +26,6 @@ using NosCore.Data.Enumerations; using NosCore.Data.Enumerations.Group; using NosCore.Data.StaticEntities; -using NosCore.GameObject; using NosCore.GameObject.Networking; using NosCore.GameObject.Networking.ClientSession; using NosCore.Networking.SessionGroup; @@ -43,6 +42,9 @@ using NosCore.Shared.Enumerations; using NosCore.Tests.Shared; using Serilog; +using NosCore.GameObject.ComponentEntities.Entities; +using Group = NosCore.GameObject.Services.GroupService.Group; +using NosCore.GameObject.Infastructure; //TODO stop using obsolete #pragma warning disable 618 @@ -109,7 +111,7 @@ public async Task UserCanNotCreateShopInTeamAsync() { _session!.Character.PositionX = 7; _session.Character.PositionY = 7; - _session.Character.Group = new GameObject.Group(GroupType.Team, new Mock().Object); + _session.Character.Group = new NosCore.GameObject.Services.GroupService.Group(GroupType.Team, new Mock().Object); await _mShopPacketHandler!.ExecuteAsync(_shopPacket, _session).ConfigureAwait(false); var packet = (SayiPacket?)_session.LastPackets.FirstOrDefault(s => s is SayiPacket); Assert.IsTrue(packet?.VisualType == VisualType.Player && packet?.VisualId == _session.Character.CharacterId && packet?.Type == SayColorType.Red && packet?.Message == Game18NConstString.TeammateCanNotOpenShop); @@ -121,7 +123,7 @@ public async Task UserCanCreateShopInGroupAsync() { _session!.Character.PositionX = 7; _session.Character.PositionY = 7; - _session.Character.Group = new GameObject.Group(GroupType.Group, new Mock().Object); + _session.Character.Group = new NosCore.GameObject.Services.GroupService.Group(GroupType.Group, new Mock().Object); await _mShopPacketHandler!.ExecuteAsync(_shopPacket, _session).ConfigureAwait(false); var packet = (SayiPacket?)_session.LastPackets.FirstOrDefault(s => s is SayiPacket); Assert.IsNull(packet); diff --git a/test/NosCore.PacketHandlers.Tests/Shops/SellPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Shops/SellPacketHandlerTests.cs index 0e597f792..f1cbde859 100644 --- a/test/NosCore.PacketHandlers.Tests/Shops/SellPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Shops/SellPacketHandlerTests.cs @@ -25,7 +25,6 @@ using Moq; using NosCore.Data.Enumerations; using NosCore.Data.StaticEntities; -using NosCore.GameObject; using NosCore.GameObject.Networking; using NosCore.GameObject.Networking.ClientSession; using NosCore.GameObject.Services.EventLoaderService; @@ -40,6 +39,7 @@ using NosCore.Packets.ServerPackets.Shop; using NosCore.Tests.Shared; using Serilog; +using NosCore.GameObject.Infastructure; namespace NosCore.PacketHandlers.Tests.Shops { diff --git a/test/NosCore.Tests.Shared/TestHelpers.cs b/test/NosCore.Tests.Shared/TestHelpers.cs index 8949f0495..698cf5ca7 100644 --- a/test/NosCore.Tests.Shared/TestHelpers.cs +++ b/test/NosCore.Tests.Shared/TestHelpers.cs @@ -50,8 +50,8 @@ using NosCore.Data.WebApi; using NosCore.Database; using NosCore.Database.Entities; -using NosCore.GameObject; -using NosCore.GameObject.Holders; +using NosCore.GameObject.ComponentEntities.Entities; +using NosCore.GameObject.Infastructure; using NosCore.GameObject.InterChannelCommunication.Hubs.BazaarHub; using NosCore.GameObject.InterChannelCommunication.Hubs.BlacklistHub; using NosCore.GameObject.InterChannelCommunication.Hubs.ChannelHub; @@ -251,8 +251,8 @@ private async Task GenerateMapInstanceProviderAsync() }; var npc = new MapNpcDto(); await _mapNpcDao.TryInsertOrUpdateAsync(npc).ConfigureAwait(false); - var holder = new MapInstanceHolder(); - MapInstanceAccessorService = new MapInstanceAccessorService(holder); + var mapInstanceRegistry = new MapInstanceRegistry(); + MapInstanceAccessorService = new MapInstanceAccessorService(mapInstanceRegistry); var mapChangeService = new MapChangeService(new Mock().Object, new Mock().Object, new Mock().Object, MapInstanceAccessorService, Instance.Clock, Instance.LogLanguageLocalizer, new Mock().Object, _logger, Instance.LogLanguageLocalizer, Instance.GameLanguageLocalizer, SessionRegistry); var sessionGroupFactory = new Mock().Object; @@ -260,7 +260,7 @@ private async Task GenerateMapInstanceProviderAsync() MapItemProvider, _mapNpcDao, _mapMonsterDao, _portalDao, _shopItemDao, _logger, new EventLoaderService(new List>()), - holder, MapInstanceAccessorService, Instance.Clock, Instance.LogLanguageLocalizer, mapChangeService, sessionGroupFactory, SessionRegistry); + mapInstanceRegistry, MapInstanceAccessorService, Instance.Clock, Instance.LogLanguageLocalizer, mapChangeService, sessionGroupFactory, SessionRegistry); await instanceGeneratorService.InitializeAsync().ConfigureAwait(false); await instanceGeneratorService.AddMapInstanceAsync(new MapInstance(miniland, MinilandId, false, MapInstanceType.NormalInstance, MapItemProvider, _logger, Clock, mapChangeService, sessionGroupFactory, SessionRegistry)).ConfigureAwait(false); @@ -300,10 +300,10 @@ public void InitDatabase() _staticBonusDao = new Dao(_logger, ContextBuilder); TypeAdapterConfig.GlobalSettings.AllowImplicitSourceInheritance = false; TypeAdapterConfig.GlobalSettings.ForDestinationType().Ignore(s => s.ValidationResult); - TypeAdapterConfig.NewConfig() - .ConstructUsing(src => new GameObject.MapNpc(GenerateItemProvider(), _logger, Instance.DistanceCalculator, Instance.Clock)); - TypeAdapterConfig.NewConfig() - .ConstructUsing(src => new GameObject.MapMonster(_logger, Instance.DistanceCalculator, Instance.Clock, new Mock().Object)); + TypeAdapterConfig.NewConfig() + .ConstructUsing(src => new GameObject.ComponentEntities.Entities.MapNpc(GenerateItemProvider(), _logger, Instance.DistanceCalculator, Instance.Clock)); + TypeAdapterConfig.NewConfig() + .ConstructUsing(src => new GameObject.ComponentEntities.Entities.MapMonster(_logger, Instance.DistanceCalculator, Instance.Clock, new Mock().Object)); } @@ -331,7 +331,7 @@ public async Task GenerateSessionAsync(List? pack }; var packetHandlerRegistry = new NosCore.GameObject.Services.PacketHandlerService.PacketHandlerRegistry(handlers); var characterInitializationService = new Mock(); - characterInitializationService.Setup(s => s.InitializeAsync(It.IsAny())).Returns(Task.CompletedTask); + characterInitializationService.Setup(s => s.InitializeAsync(It.IsAny())).Returns(Task.CompletedTask); var session = new ClientSession( _logger, packetHandlerRegistry, @@ -348,8 +348,8 @@ public async Task GenerateSessionAsync(List? pack SessionId = _lastId }; - var chara = new GameObject.Character(new InventoryService(ItemList, WorldConfiguration, _logger), - new ExchangeService(new Mock().Object, WorldConfiguration, _logger, new ExchangeRequestHolder(), Instance.LogLanguageLocalizer, Instance.GameLanguageLocalizer), new Mock().Object, new HpService(), new MpService(), new ExperienceService(), new JobExperienceService(), + var chara = new GameObject.ComponentEntities.Entities.Character(new InventoryService(ItemList, WorldConfiguration, _logger), + new ExchangeService(new Mock().Object, WorldConfiguration, _logger, new ExchangeRequestRegistry(), Instance.LogLanguageLocalizer, Instance.GameLanguageLocalizer), new Mock().Object, new HpService(), new MpService(), new ExperienceService(), new JobExperienceService(), new HeroExperienceService(), new ReputationService(), new DignityService(), Instance.WorldConfiguration, new Mock().Object, Instance.SessionGroupFactory, Instance.SessionRegistry, Instance.GameLanguageLocalizer) { diff --git a/tools/NosCore.DtoGenerator/DtoGenerator.cs b/tools/NosCore.DtoGenerator/DtoGenerator.cs index ef9fc044d..760db66ef 100644 --- a/tools/NosCore.DtoGenerator/DtoGenerator.cs +++ b/tools/NosCore.DtoGenerator/DtoGenerator.cs @@ -17,7 +17,6 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -using System.Diagnostics; using System.IO; using System.Linq; using System.Text; From fa92b94d8f3aeefbbdac24a4f082b6493e76e448 Mon Sep 17 00:00:00 2001 From: erwan-joly Date: Mon, 19 Jan 2026 14:55:20 +1300 Subject: [PATCH 2/4] remove .ConfigureAwait(false) calls Co-Authored-By: Claude Opus 4.5 --- .../ComponentEntities/Entities/Character.cs | 124 +++++++++--------- .../ComponentEntities/Entities/MapMonster.cs | 4 +- .../ComponentEntities/Entities/MapNpc.cs | 4 +- .../Extensions/CharacterEntityExtension.cs | 12 +- .../Hubs/ChannelHub/ChannelHubClient.cs | 4 +- .../Networking/ClientSession/ClientSession.cs | 4 +- .../ExchangeDisconnectHandler.cs | 2 +- .../FriendNotificationDisconnectHandler.cs | 2 +- .../GroupDisconnectHandler.cs | 2 +- .../MapDisconnectHandler.cs | 2 +- .../MinilandDisconnectHandler.cs | 2 +- .../SaveDisconnectHandler.cs | 2 +- .../LoginPacketHandlingStrategy.cs | 4 +- .../WorldPacketHandlingStrategy.cs | 8 +- .../Services/BazaarService/BazaarService.cs | 8 +- .../BlackListService/BlacklistService.cs | 10 +- .../BroadcastService/PacketBroadcaster.cs | 4 +- ...ssageChannelCommunicationMessageHandler.cs | 4 +- ...ssageChannelCommunicationMessageHandler.cs | 4 +- ...ssageChannelCommunicationMessageHandler.cs | 6 +- ...ssageChannelCommunicationMessageHandler.cs | 6 +- ...ssageChannelCommunicationMessageHandler.cs | 12 +- .../Services/ChannelService/ChannelService.cs | 4 +- .../Handlers/ChannelCommunicationRunner.cs | 8 +- .../Services/FriendService/FriendService.cs | 14 +- .../Handlers/MfaGuriHandler.cs | 6 +- .../Handlers/SpeakerGuriHandler.cs | 8 +- .../Handlers/TitleGuriHandler.cs | 8 +- .../Handlers/BackPackHandler.cs | 12 +- .../Handlers/BazaarMedalsHandler.cs | 6 +- .../Handlers/MinilandBellHandler.cs | 12 +- .../Handlers/SpRechargerHandler.cs | 8 +- .../Handlers/SpeakerHandler.cs | 4 +- .../Handlers/VehicleHandler.cs | 4 +- .../Handlers/WearHandler.cs | 30 ++--- .../Services/LoginService/LoginService.cs | 40 +++--- .../Services/MailService/MailService.cs | 36 ++--- .../Services/MailService/ParcelRegistry.cs | 4 +- .../MapChangeService/MapChangeService.cs | 58 ++++---- .../Handlers/MinilandEntranceHandler.cs | 14 +- .../MapInstance.cs | 6 +- .../MapInstanceGenerationService.cs | 6 +- .../Handlers/DropHandler.cs | 14 +- .../Handlers/GoldDropHandler.cs | 12 +- .../Handlers/SpChargerHandler.cs | 8 +- .../MinilandService/MinilandService.cs | 8 +- .../Handlers/ChangeClassHandler.cs | 10 +- .../NRunService/Handlers/TeleporterHandler.cs | 8 +- .../Services/QuestService/QuestService.cs | 48 +++---- .../Services/SaveService/SaveService.cs | 30 ++--- .../TransformationService.cs | 48 +++---- .../WarehouseService/WarehouseService.cs | 10 +- src/NosCore.LoginServer/LoginServer.cs | 4 +- .../LoginServerBootstrap.cs | 4 +- .../Bazaar/CBListPacketHandler.cs | 6 +- .../Bazaar/CBuyPacketHandler.cs | 26 ++-- .../Bazaar/CModPacketHandler.cs | 14 +- .../Bazaar/CRegPacketHandler.cs | 24 ++-- .../Bazaar/CSListPacketHandler.cs | 6 +- .../Bazaar/CScalcPacketHandler.cs | 28 ++-- .../Bazaar/CSkillPacketHandler.cs | 8 +- .../CharNewJobPacketHandler.cs | 8 +- .../CharacterScreen/CharNewPacketHandler.cs | 22 ++-- .../CharacterScreen/CharRenPacketHandler.cs | 16 +-- .../CharacterDeletePacketHandler.cs | 12 +- .../CharacterScreen/DacPacketHandler.cs | 4 +- .../EntryPointPacketHandler.cs | 20 +-- .../CharacterScreen/SelectPacketHandler.cs | 14 +- .../Chat/BtkPacketHandler.cs | 10 +- .../Chat/WhisperPacketHandler.cs | 10 +- .../Command/ChangeClassPacketHandler.cs | 8 +- .../Command/CreateItemPacketHandler.cs | 10 +- .../Command/GiftPacketHandler.cs | 8 +- .../Command/HelpPacketHandler.cs | 6 +- .../Command/KickPacketHandler.cs | 4 +- .../Command/SetGoldCommandPacketHandler.cs | 6 +- .../SetHeroLevelCommandPacketHandler.cs | 8 +- .../SetJobLevelCommandPacketHandler.cs | 8 +- .../Command/SetLevelCommandPacketHandler.cs | 8 +- .../Command/SetReputationPacketHandler.cs | 8 +- .../Command/ShoutPacketHandler.cs | 4 +- .../Exchange/ExcListPacketHandler.cs | 12 +- .../Exchange/ExchangeRequestPacketHandler.cs | 48 +++---- .../Friend/BlDelPacketHandler.cs | 10 +- .../Friend/BlInsPacketHandler.cs | 12 +- .../Friend/FdelPacketHandler.cs | 12 +- .../Friend/FinsPacketHandler.cs | 24 ++-- .../Friend/FlPacketHandler.cs | 6 +- .../Game/GameStartPacketHandler.cs | 52 ++++---- .../Game/NcifPacketHandler.cs | 4 +- .../Game/PulsePacketHandler.cs | 4 +- .../Game/QSetPacketHandler.cs | 16 +-- .../Game/TitEqPacketHandler.cs | 10 +- .../Group/PjoinPacketHandler.cs | 40 +++--- .../Group/PleavePacketHandler.cs | 20 +-- .../Inventory/BiPacketHandler.cs | 8 +- .../Inventory/GetPacketHandler.cs | 6 +- .../Inventory/MvePacketHandler.cs | 6 +- .../Inventory/MviPacketHandler.cs | 6 +- .../Inventory/PutPacketHandler.cs | 14 +- .../Inventory/RemovePacketHandler.cs | 12 +- .../Inventory/SpTransformPacketHandler.cs | 14 +- .../Miniland/AddobjPacketHandler.cs | 14 +- .../Miniland/MJoinPacketHandler.cs | 10 +- .../MinilandObjects/MgPacketHandler.cs | 48 +++---- .../MinilandObjects/UseobjPacketHandler.cs | 10 +- .../Miniland/MlobjPacketHandler.cs | 18 +-- .../Miniland/RmvobjPacketHandler.cs | 10 +- .../Movement/PreqPacketHandler.cs | 8 +- .../Movement/WalkPacketHandler.cs | 4 +- .../Parcel/PclPacketHandler.cs | 20 +-- .../Parcel/PstClientPacketHandler.cs | 20 +-- .../Quest/QTPacketHandler.cs | 6 +- .../Shops/MShopPacketHandler.cs | 32 ++--- .../Shops/NrunPacketHandler.cs | 4 +- .../Shops/SellPacketHandler.cs | 12 +- .../Shops/ShoppingPacketHandler.cs | 4 +- src/NosCore.Parser/ImportFactory.cs | 42 +++--- src/NosCore.Parser/Parser.cs | 76 +++++------ src/NosCore.Parser/ParserBootstrap.cs | 4 +- src/NosCore.Parser/Parsers/ActParser.cs | 8 +- src/NosCore.Parser/Parsers/CardParser.cs | 8 +- .../Parsers/Generic/GenericParser.cs | 4 +- src/NosCore.Parser/Parsers/I18NParser.cs | 6 +- src/NosCore.Parser/Parsers/ItemParser.cs | 8 +- .../Parsers/MapMonsterParser.cs | 4 +- src/NosCore.Parser/Parsers/MapNpcParser.cs | 4 +- src/NosCore.Parser/Parsers/MapParser.cs | 6 +- src/NosCore.Parser/Parsers/MapTypeParser.cs | 4 +- .../Parsers/NpcMonsterParser.cs | 12 +- src/NosCore.Parser/Parsers/NpcTalkParser.cs | 6 +- src/NosCore.Parser/Parsers/PortalParser.cs | 12 +- src/NosCore.Parser/Parsers/QuestParser.cs | 10 +- .../Parsers/QuestPrizeParser.cs | 6 +- .../Parsers/RespawnMapTypeParser.cs | 4 +- src/NosCore.Parser/Parsers/ScriptParser.cs | 6 +- src/NosCore.Parser/Parsers/ShopItemParser.cs | 4 +- src/NosCore.Parser/Parsers/ShopParser.cs | 4 +- src/NosCore.Parser/Parsers/SkillParser.cs | 10 +- .../Controllers/AuthController.cs | 8 +- src/NosCore.WorldServer/WorldServer.cs | 6 +- .../WorldServerBootstrap.cs | 4 +- test/NosCore.GameObject.Tests/BazaarTests.cs | 44 +++---- .../Handlers/SpeakerGuriHandlerTests.cs | 14 +- .../Handlers/TitleGuriHandlerTests.cs | 10 +- .../Handlers/BackPackHandlerTests.cs | 14 +- .../Handlers/BazaarMedalsHandlerTests.cs | 12 +- .../Handlers/MinilandBellHandlerTests.cs | 14 +- .../Handlers/SpRechargerHandlerTests.cs | 10 +- .../Handlers/SpeakerHandlerTests.cs | 8 +- .../Handlers/TitleHandlerTests.cs | 8 +- .../Handlers/VehicleHandlerTests.cs | 14 +- .../Handlers/WearHandlerTests.cs | 30 ++--- .../NRunService/Handlers/ChangeClassTests.cs | 6 +- test/NosCore.GameObject.Tests/ShopTests.cs | 42 +++--- .../Bazaar/CBListPacketHandlerTests.cs | 12 +- .../Bazaar/CBuyPacketHandlerTests.cs | 26 ++-- .../Bazaar/CModPacketHandlerTests.cs | 20 +-- .../Bazaar/CRegPacketHandlerTests.cs | 32 ++--- .../Bazaar/CScalcPacketHandlerTests.cs | 18 +-- .../Bazaar/CSkillPacketHandlerTests.cs | 12 +- .../CharNewJobPacketHandlerTests.cs | 24 ++-- .../CharNewPacketHandlerTests.cs | 26 ++-- .../CharRenPacketHandlerTests.cs | 26 ++-- .../CharacterDeletePacketHandlerTests.cs | 22 ++-- .../CharacterScreen/DacPacketHandlerTests.cs | 8 +- .../Friend/BlDelPacketHandlerTests.cs | 20 +-- .../Friend/BlInsPacketHandlerTests.cs | 14 +- .../Friend/BlPacketHandlerTests.cs | 12 +- .../Friend/FinsPacketHandlerTests.cs | 14 +- .../Friend/FlPacketHandlerTests.cs | 12 +- .../Friend/fDelPacketHandlerTests.cs | 20 +-- .../Game/PulsePacketHandlerTests.cs | 8 +- .../Game/QsetPacketHandlerTests.cs | 20 +-- .../Group/PJoinPacketHandlerTests.cs | 20 +-- .../Group/PleavePacketHandlerTests.cs | 26 ++-- .../Inventory/BiPacketHandlerTests.cs | 8 +- .../Inventory/GetPacketHandlerTests.cs | 20 +-- .../Inventory/PutPacketHandlerTests.cs | 16 +-- .../SpTransformPacketHandlerTests.cs | 26 ++-- .../Inventory/UseItemPacketHandlerTests.cs | 14 +- .../Inventory/WearPacketHandlerTests.cs | 52 ++++---- .../Login/NoS0575PacketHandlerTests.cs | 26 ++-- .../Login/NoS0577PacketHandlerTests.cs | 24 ++-- .../Miniland/MJoinPacketHandlerTests.cs | 20 +-- .../Miniland/MlEditPacketHandlerTests.cs | 24 ++-- .../Movement/PreqPacketHandlerTests.cs | 18 +-- .../Parcel/PclPacketHandlerTests.cs | 14 +- .../Shops/MShopPacketHandlerTests.cs | 24 ++-- .../Shops/SellPacketHandlerTests.cs | 12 +- test/NosCore.Tests.Shared/TestHelpers.cs | 16 +-- .../ApiTests/AuthControllerTests.cs | 6 +- 192 files changed, 1394 insertions(+), 1394 deletions(-) diff --git a/src/NosCore.GameObject/ComponentEntities/Entities/Character.cs b/src/NosCore.GameObject/ComponentEntities/Entities/Character.cs index 718621f1e..7173de742 100644 --- a/src/NosCore.GameObject/ComponentEntities/Entities/Character.cs +++ b/src/NosCore.GameObject/ComponentEntities/Entities/Character.cs @@ -243,19 +243,19 @@ public async Task SetHeroLevelAsync(byte level) { HeroLevel = level; HeroXp = 0; - await GenerateLevelupPacketsAsync().ConfigureAwait(false); + await GenerateLevelupPacketsAsync(); await SendPacketAsync(new MsgiPacket { Type = MessageType.Default, Message = Game18NConstString.HeroLevelIncreased - }).ConfigureAwait(false); + }); } public async Task SetJobLevelAsync(byte jobLevel) { JobLevel = (byte)((Class == CharacterClassType.Adventurer) && (jobLevel > 20) ? 20 : jobLevel); JobLevelXp = 0; - await SendPacketAsync(this.GenerateLev(experienceService, jobExperienceService, heroExperienceService)).ConfigureAwait(false); + await SendPacketAsync(this.GenerateLev(experienceService, jobExperienceService, heroExperienceService)); var mapSessions = sessionRegistry.GetCharacters(s => s.MapInstance == MapInstance); await Task.WhenAll(mapSessions.Select(s => { @@ -265,12 +265,12 @@ await Task.WhenAll(mapSessions.Select(s => //} return s.SendPacketAsync(this.GenerateEff(8)); - })).ConfigureAwait(false); + })); await SendPacketAsync(new MsgiPacket { Type = MessageType.Default, Message = Game18NConstString.JobLevelIncreased - }).ConfigureAwait(false); + }); } public void JoinGroup(Group group) @@ -294,16 +294,16 @@ public async Task LeaveGroupAsync() if (Group.Count == 1) { - await groupMember.LeaveGroupAsync().ConfigureAwait(false); - await groupMember.SendPacketAsync(Group.GeneratePidx(groupMember)).ConfigureAwait(false); + await groupMember.LeaveGroupAsync(); + await groupMember.SendPacketAsync(Group.GeneratePidx(groupMember)); await groupMember.SendPacketAsync(new MsgiPacket { Type = MessageType.Default, Message = Game18NConstString.PartyDisbanded - }).ConfigureAwait(false); + }); } - await groupMember.SendPacketAsync(groupMember.Group!.GeneratePinit()).ConfigureAwait(false); + await groupMember.SendPacketAsync(groupMember.Group!.GeneratePinit()); } Group = new Group(GroupType.Group, sessionGroupFactory); @@ -321,14 +321,14 @@ await SendPacketAsync(new SayiPacket VisualId = CharacterId, Type = SayColorType.Yellow, Message = Game18NConstString.RemoveEquipment - }).ConfigureAwait(false); + }); return; } JobLevel = 1; JobLevelXp = 0; - await SendPacketAsync(new NpInfoPacket()).ConfigureAwait(false); - await SendPacketAsync(new PclearPacket()).ConfigureAwait(false); + await SendPacketAsync(new NpInfoPacket()); + await SendPacketAsync(new PclearPacket()); if (classType == CharacterClassType.Adventurer) { @@ -360,22 +360,22 @@ await SendPacketAsync(new SayiPacket .Where(inv => inv != null)) { await SendPacketsAsync( - inv!.Select(invItem => invItem.GeneratePocketChange((PocketType)invItem.Type, invItem.Slot))).ConfigureAwait(false); + inv!.Select(invItem => invItem.GeneratePocketChange((PocketType)invItem.Type, invItem.Slot))); } - await SendPacketAsync(this.GenerateTit()).ConfigureAwait(false); - await SendPacketAsync(GenerateStat()).ConfigureAwait(false); - await MapInstance.SendPacketAsync(this.GenerateEq()).ConfigureAwait(false); - await MapInstance.SendPacketAsync(this.GenerateEff(8)).ConfigureAwait(false); + await SendPacketAsync(this.GenerateTit()); + await SendPacketAsync(GenerateStat()); + await MapInstance.SendPacketAsync(this.GenerateEq()); + await MapInstance.SendPacketAsync(this.GenerateEff(8)); //TODO: Faction - await SendPacketAsync(this.GenerateCond()).ConfigureAwait(false); - await SendPacketAsync(this.GenerateLev(experienceService, jobExperienceService, heroExperienceService)).ConfigureAwait(false); - await SendPacketAsync(this.GenerateCMode()).ConfigureAwait(false); + await SendPacketAsync(this.GenerateCond()); + await SendPacketAsync(this.GenerateLev(experienceService, jobExperienceService, heroExperienceService)); + await SendPacketAsync(this.GenerateCMode()); await SendPacketAsync(new MsgiPacket { Type = MessageType.Default, Message = Game18NConstString.ClassChanged - }).ConfigureAwait(false); + }); QuicklistEntries = new List { @@ -391,10 +391,10 @@ await SendPacketAsync(new MsgiPacket } }; - await MapInstance.SendPacketAsync(this.GenerateIn(Prefix ?? ""), new EveryoneBut(Channel!.Id)).ConfigureAwait(false); - await MapInstance.SendPacketAsync(Group!.GeneratePidx(this)).ConfigureAwait(false); - await MapInstance.SendPacketAsync(this.GenerateEff(6)).ConfigureAwait(false); - await MapInstance.SendPacketAsync(this.GenerateEff(198)).ConfigureAwait(false); + await MapInstance.SendPacketAsync(this.GenerateIn(Prefix ?? ""), new EveryoneBut(Channel!.Id)); + await MapInstance.SendPacketAsync(Group!.GeneratePidx(this)); + await MapInstance.SendPacketAsync(this.GenerateEff(6)); + await MapInstance.SendPacketAsync(this.GenerateEff(198)); } public Task AddGoldAsync(long gold) @@ -422,19 +422,19 @@ public void RemoveBankGold(long bankGold) public async Task SetGoldAsync(long gold) { Gold = gold; - await SendPacketAsync(this.GenerateGold()).ConfigureAwait(false); + await SendPacketAsync(this.GenerateGold()); await SendPacketAsync(this.GenerateSay( GetMessageFromKey(LanguageKey.UPDATE_GOLD), - SayColorType.Red)).ConfigureAwait(false); + SayColorType.Red)); } public async Task SetReputationAsync(long reput) { Reput = reput; - await SendPacketAsync(this.GenerateFd()).ConfigureAwait(false); + await SendPacketAsync(this.GenerateFd()); await SendPacketAsync(this.GenerateSay( GetMessageFromKey(LanguageKey.REPUTATION_CHANGED), - SayColorType.Red)).ConfigureAwait(false); + SayColorType.Red)); } //todo move this @@ -446,22 +446,22 @@ public async Task GenerateMailAsync(IEnumerable mails) { if (mail.ItemInstance != null) { - await SendPacketAsync(mail.GeneratePost(0)).ConfigureAwait(false); + await SendPacketAsync(mail.GeneratePost(0)); } else { - await SendPacketAsync(mail.GeneratePost(1)).ConfigureAwait(false); + await SendPacketAsync(mail.GeneratePost(1)); } } else { if (mail.ItemInstance != null) { - await SendPacketAsync(mail.GeneratePost(3)).ConfigureAwait(false); + await SendPacketAsync(mail.GeneratePost(3)); } else { - await SendPacketAsync(mail.GeneratePost(2)).ConfigureAwait(false); + await SendPacketAsync(mail.GeneratePost(2)); } } } @@ -481,12 +481,12 @@ public async Task CloseShopAsync() { Shop = null; - await MapInstance.SendPacketAsync(this.GenerateShop(AccountLanguage)).ConfigureAwait(false); - await MapInstance.SendPacketAsync(this.GeneratePFlag()).ConfigureAwait(false); + await MapInstance.SendPacketAsync(this.GenerateShop(AccountLanguage)); + await MapInstance.SendPacketAsync(this.GeneratePFlag()); IsSitting = false; - await SendPacketAsync(this.GenerateCond()).ConfigureAwait(false); - await MapInstance.SendPacketAsync(this.GenerateRest()).ConfigureAwait(false); + await SendPacketAsync(this.GenerateCond()); + await MapInstance.SendPacketAsync(this.GenerateRest()); } public async Task BuyAsync(Shop shop, short slot, short amount) @@ -519,7 +519,7 @@ await SendPacketAsync(new SMemoiPacket { Type = SMemoType.FailNpc, Message = Game18NConstString.NotEnoughGold5 - }).ConfigureAwait(false); + }); return; } @@ -529,7 +529,7 @@ await SendPacketAsync(new SMemoiPacket { Type = SMemoType.FailNpc, Message = Game18NConstString.ReputationNotHighEnough - }).ConfigureAwait(false); + }); return; } @@ -548,7 +548,7 @@ await SendPacketAsync(new SMemoPacket { Type = SMemoType.FailPlayer, Message = GetMessageFromKey(LanguageKey.TOO_RICH_SELLER) - }).ConfigureAwait(false); + }); return; } @@ -567,28 +567,28 @@ await SendPacketAsync(new SMemoPacket if (inv?.Count > 0) { inv.ForEach(it => it.CharacterId = CharacterId); - var packet = await (shop.OwnerCharacter == null ? Task.FromResult((NInvPacket?)null) : shop.OwnerCharacter.BuyFromAsync(item, amount, slotChar)).ConfigureAwait(false); + var packet = await (shop.OwnerCharacter == null ? Task.FromResult((NInvPacket?)null) : shop.OwnerCharacter.BuyFromAsync(item, amount, slotChar)); if (packet != null) { - await SendPacketAsync(packet).ConfigureAwait(false); + await SendPacketAsync(packet); } - await SendPacketsAsync(inv.Select(invItem => invItem.GeneratePocketChange((PocketType)invItem.Type, invItem.Slot))).ConfigureAwait(false); + await SendPacketsAsync(inv.Select(invItem => invItem.GeneratePocketChange((PocketType)invItem.Type, invItem.Slot))); await SendPacketAsync(new SMemoiPacket { Type = SMemoType.SuccessNpc, Message = Game18NConstString.TradeSuccessfull - }).ConfigureAwait(false); + }); if (reputprice == 0) { Gold -= (long)(price * percent); - await SendPacketAsync(this.GenerateGold()).ConfigureAwait(false); + await SendPacketAsync(this.GenerateGold()); } else { Reput -= reputprice; - await SendPacketAsync(this.GenerateFd()).ConfigureAwait(false); + await SendPacketAsync(this.GenerateFd()); await SendPacketAsync(new SayiPacket { VisualType = VisualType.Player, @@ -597,7 +597,7 @@ await SendPacketAsync(new SayiPacket Message = Game18NConstString.ReputationReduced, ArgumentType = 4, Game18NArguments = { reputprice } - }).ConfigureAwait(false); + }); } } else @@ -606,7 +606,7 @@ await SendPacketAsync(new MsgiPacket { Type = MessageType.Default, Message = Game18NConstString.NotEnoughSpace - }).ConfigureAwait(false); + }); } } @@ -623,10 +623,10 @@ await SendPacketAsync(new MsgiPacket Shop!.ShopItems.TryRemove(slot, out _); } - await SendPacketAsync(itemInstance.GeneratePocketChange((PocketType)type, slotChar)).ConfigureAwait(false); + await SendPacketAsync(itemInstance.GeneratePocketChange((PocketType)type, slotChar)); var sellAmount = (item?.Price ?? 0) * amount; Gold += sellAmount; - await SendPacketAsync(this.GenerateGold()).ConfigureAwait(false); + await SendPacketAsync(this.GenerateGold()); Shop!.Sell += sellAmount; await SendPacketAsync(new SellListPacket @@ -641,23 +641,23 @@ await SendPacketAsync(new SellListPacket SellAmount = item?.Amount ?? 0 } } - }).ConfigureAwait(false); + }); if (!Shop.ShopItems.IsEmpty) { return this.GenerateNInv(1, 0); } - await CloseShopAsync().ConfigureAwait(false); + await CloseShopAsync(); return null; } private async Task GenerateLevelupPacketsAsync() { - await SendPacketAsync(GenerateStat()).ConfigureAwait(false); - await SendPacketAsync(this.GenerateStatInfo()).ConfigureAwait(false); - await SendPacketAsync(this.GenerateLev(experienceService, jobExperienceService, heroExperienceService)).ConfigureAwait(false); + await SendPacketAsync(GenerateStat()); + await SendPacketAsync(this.GenerateStatInfo()); + await SendPacketAsync(this.GenerateLev(experienceService, jobExperienceService, heroExperienceService)); var mapSessions = sessionRegistry.GetCharacters(s => s.MapInstance == MapInstance); await Task.WhenAll(mapSessions.Select(async s => @@ -665,13 +665,13 @@ await Task.WhenAll(mapSessions.Select(async s => if (s.VisualId != VisualId) { await s.SendPacketAsync(this.GenerateIn(Authority == AuthorityType.Moderator - ? GetMessageFromKey(LanguageKey.SUPPORT) : string.Empty)).ConfigureAwait(false); + ? GetMessageFromKey(LanguageKey.SUPPORT) : string.Empty)); //TODO: Generate GIDX } - await s.SendPacketAsync(this.GenerateEff(6)).ConfigureAwait(false); - await s.SendPacketAsync(this.GenerateEff(198)).ConfigureAwait(false); - })).ConfigureAwait(false); + await s.SendPacketAsync(this.GenerateEff(6)); + await s.SendPacketAsync(this.GenerateEff(198)); + })); foreach (var member in Group!.Keys) { @@ -681,18 +681,18 @@ await s.SendPacketAsync(this.GenerateIn(Authority == AuthorityType.Moderator groupMember?.SendPacketAsync(groupMember.Group!.GeneratePinit()); } - await SendPacketAsync(Group.GeneratePinit()).ConfigureAwait(false); + await SendPacketAsync(Group.GeneratePinit()); } public async Task SetLevelAsync(byte level) { this.SetLevel(level); - await GenerateLevelupPacketsAsync().ConfigureAwait(false); + await GenerateLevelupPacketsAsync(); await SendPacketAsync(new MsgiPacket { Type = MessageType.Default, Message = Game18NConstString.LevelIncreased - }).ConfigureAwait(false); + }); } diff --git a/src/NosCore.GameObject/ComponentEntities/Entities/MapMonster.cs b/src/NosCore.GameObject/ComponentEntities/Entities/MapMonster.cs index 92969de66..0ca6171d6 100644 --- a/src/NosCore.GameObject/ComponentEntities/Entities/MapMonster.cs +++ b/src/NosCore.GameObject/ComponentEntities/Entities/MapMonster.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -106,7 +106,7 @@ async Task LifeAsync() { if (!MapInstance.IsSleeping) { - await MonsterLifeAsync().ConfigureAwait(false); + await MonsterLifeAsync(); } } catch (Exception e) diff --git a/src/NosCore.GameObject/ComponentEntities/Entities/MapNpc.cs b/src/NosCore.GameObject/ComponentEntities/Entities/MapNpc.cs index 03728d822..f04fabac3 100644 --- a/src/NosCore.GameObject/ComponentEntities/Entities/MapNpc.cs +++ b/src/NosCore.GameObject/ComponentEntities/Entities/MapNpc.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -140,7 +140,7 @@ async Task LifeAsync() { if (!MapInstance.IsSleeping) { - await MonsterLifeAsync().ConfigureAwait(false); + await MonsterLifeAsync(); } } catch (Exception e) diff --git a/src/NosCore.GameObject/ComponentEntities/Extensions/CharacterEntityExtension.cs b/src/NosCore.GameObject/ComponentEntities/Extensions/CharacterEntityExtension.cs index 211d25703..8528aa072 100644 --- a/src/NosCore.GameObject/ComponentEntities/Extensions/CharacterEntityExtension.cs +++ b/src/NosCore.GameObject/ComponentEntities/Extensions/CharacterEntityExtension.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -363,7 +363,7 @@ public static async Task GenerateBlinitAsync(this ICharacterEntity IBlacklistHub blacklistHttpClient) { var subpackets = new List(); - var blackList = await blacklistHttpClient.GetBlacklistedAsync(visualEntity.VisualId).ConfigureAwait(false); + var blackList = await blacklistHttpClient.GetBlacklistedAsync(visualEntity.VisualId); foreach (var relation in blackList) { if (relation.CharacterId == visualEntity.VisualId) @@ -385,12 +385,12 @@ public static async Task GenerateFinitAsync(this ICharacterEntity v IChannelHub channelHttpClient, IPubSubHub pubSubHub) { //same canal - var servers = (await channelHttpClient.GetCommunicationChannels().ConfigureAwait(false)) + var servers = (await channelHttpClient.GetCommunicationChannels()) ?.Where(c => c.Type == ServerType.WorldServer).ToList(); var accounts = await pubSubHub.GetSubscribersAsync(); var subpackets = new List(); - var friendlist = await friendHttpClient.GetFriendsAsync(visualEntity.VisualId).ConfigureAwait(false); + var friendlist = await friendHttpClient.GetFriendsAsync(visualEntity.VisualId); //TODO add spouselist //var spouseList = _webApiAccess.Get>(WebApiRoute.Spouse, friendServer.WebApi, visualEntity.VisualId) ?? new List(); foreach (var relation in friendlist) @@ -412,7 +412,7 @@ public static async Task GenerateFinitAsync(this ICharacterEntity v public static async Task SendFinfoAsync(this ICharacterEntity visualEntity, IFriendHub friendHttpClient, IPubSubHub pubSubHub, ISerializer packetSerializer, bool isConnected) { - var friendlist = await friendHttpClient.GetFriendsAsync(visualEntity.VisualId).ConfigureAwait(false); + var friendlist = await friendHttpClient.GetFriendsAsync(visualEntity.VisualId); await Task.WhenAll(friendlist.Select(friend => pubSubHub.SendMessageAsync(new PostedPacket { @@ -437,7 +437,7 @@ await Task.WhenAll(friendlist.Select(friend => Id = friend.CharacterId, Name = friend.CharacterName! } - }))).ConfigureAwait(false); + }))); } public static ServerGetPacket GenerateGet(this ICharacterEntity visualEntity, long itemId) diff --git a/src/NosCore.GameObject/InterChannelCommunication/Hubs/ChannelHub/ChannelHubClient.cs b/src/NosCore.GameObject/InterChannelCommunication/Hubs/ChannelHub/ChannelHubClient.cs index c63a50da8..077bdfbd6 100644 --- a/src/NosCore.GameObject/InterChannelCommunication/Hubs/ChannelHub/ChannelHubClient.cs +++ b/src/NosCore.GameObject/InterChannelCommunication/Hubs/ChannelHub/ChannelHubClient.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.AspNetCore.SignalR.Client; @@ -26,7 +26,7 @@ await Policy (_, __, timeSpan) => logger.Verbose( logLanguage[LogLanguageKey.MASTER_SERVER_PING]) - ).ExecuteAsync(Ping).ConfigureAwait(false); + ).ExecuteAsync(Ping); logger.Error( logLanguage[LogLanguageKey.MASTER_SERVER_PING_FAILED]); Environment.Exit(0); diff --git a/src/NosCore.GameObject/Networking/ClientSession/ClientSession.cs b/src/NosCore.GameObject/Networking/ClientSession/ClientSession.cs index 36cba7689..569863a7e 100644 --- a/src/NosCore.GameObject/Networking/ClientSession/ClientSession.cs +++ b/src/NosCore.GameObject/Networking/ClientSession/ClientSession.cs @@ -154,7 +154,7 @@ public async Task HandlePacketAsync(NosPackageInfo package) { try { - await HandlePacketsAsync(package.Packets, true).ConfigureAwait(false); + await HandlePacketsAsync(package.Packets, true); } catch (Exception ex) { @@ -183,7 +183,7 @@ public async Task OnDisconnectedAsync() foreach (var handler in disconnectHandlers) { - await handler.HandleDisconnectAsync(this).ConfigureAwait(false); + await handler.HandleDisconnectAsync(this); } } } diff --git a/src/NosCore.GameObject/Networking/ClientSession/DisconnectHandlers/ExchangeDisconnectHandler.cs b/src/NosCore.GameObject/Networking/ClientSession/DisconnectHandlers/ExchangeDisconnectHandler.cs index 373f26bce..720414a20 100644 --- a/src/NosCore.GameObject/Networking/ClientSession/DisconnectHandlers/ExchangeDisconnectHandler.cs +++ b/src/NosCore.GameObject/Networking/ClientSession/DisconnectHandlers/ExchangeDisconnectHandler.cs @@ -43,7 +43,7 @@ public async Task HandleDisconnectAsync(ClientSession session) var closeExchange = exchangeService.CloseExchange(session.Character.VisualId, ExchangeResultType.Failure); if (sessionRegistry.GetCharacter(s => s.VisualId == targetId) is Character target) { - await target.SendPacketAsync(closeExchange).ConfigureAwait(false); + await target.SendPacketAsync(closeExchange); } } } diff --git a/src/NosCore.GameObject/Networking/ClientSession/DisconnectHandlers/FriendNotificationDisconnectHandler.cs b/src/NosCore.GameObject/Networking/ClientSession/DisconnectHandlers/FriendNotificationDisconnectHandler.cs index a87b302ee..a31281806 100644 --- a/src/NosCore.GameObject/Networking/ClientSession/DisconnectHandlers/FriendNotificationDisconnectHandler.cs +++ b/src/NosCore.GameObject/Networking/ClientSession/DisconnectHandlers/FriendNotificationDisconnectHandler.cs @@ -34,6 +34,6 @@ public async Task HandleDisconnectAsync(ClientSession session) return; } - await session.Character.SendFinfoAsync(friendHub, pubSubHub, serializer, false).ConfigureAwait(false); + await session.Character.SendFinfoAsync(friendHub, pubSubHub, serializer, false); } } diff --git a/src/NosCore.GameObject/Networking/ClientSession/DisconnectHandlers/GroupDisconnectHandler.cs b/src/NosCore.GameObject/Networking/ClientSession/DisconnectHandlers/GroupDisconnectHandler.cs index b3d6b3f1b..0c34ea22b 100644 --- a/src/NosCore.GameObject/Networking/ClientSession/DisconnectHandlers/GroupDisconnectHandler.cs +++ b/src/NosCore.GameObject/Networking/ClientSession/DisconnectHandlers/GroupDisconnectHandler.cs @@ -30,6 +30,6 @@ public async Task HandleDisconnectAsync(ClientSession session) return; } - await session.Character.LeaveGroupAsync().ConfigureAwait(false); + await session.Character.LeaveGroupAsync(); } } diff --git a/src/NosCore.GameObject/Networking/ClientSession/DisconnectHandlers/MapDisconnectHandler.cs b/src/NosCore.GameObject/Networking/ClientSession/DisconnectHandlers/MapDisconnectHandler.cs index b2bd39b07..ec5f33819 100644 --- a/src/NosCore.GameObject/Networking/ClientSession/DisconnectHandlers/MapDisconnectHandler.cs +++ b/src/NosCore.GameObject/Networking/ClientSession/DisconnectHandlers/MapDisconnectHandler.cs @@ -37,6 +37,6 @@ public async Task HandleDisconnectAsync(ClientSession session) session.Character.MapInstance.Sessions.Remove(session.Channel); } - await session.Character.MapInstance.SendPacketAsync(session.Character.GenerateOut()).ConfigureAwait(false); + await session.Character.MapInstance.SendPacketAsync(session.Character.GenerateOut()); } } diff --git a/src/NosCore.GameObject/Networking/ClientSession/DisconnectHandlers/MinilandDisconnectHandler.cs b/src/NosCore.GameObject/Networking/ClientSession/DisconnectHandlers/MinilandDisconnectHandler.cs index b4077e498..9ae60a205 100644 --- a/src/NosCore.GameObject/Networking/ClientSession/DisconnectHandlers/MinilandDisconnectHandler.cs +++ b/src/NosCore.GameObject/Networking/ClientSession/DisconnectHandlers/MinilandDisconnectHandler.cs @@ -33,7 +33,7 @@ public async Task HandleDisconnectAsync(ClientSession session) return; } - var minilandId = await minilandService.DeleteMinilandAsync(session.Character.CharacterId).ConfigureAwait(false); + var minilandId = await minilandService.DeleteMinilandAsync(session.Character.CharacterId); if (minilandId != null) { mapInstanceGeneratorService.RemoveMap((Guid)minilandId); diff --git a/src/NosCore.GameObject/Networking/ClientSession/DisconnectHandlers/SaveDisconnectHandler.cs b/src/NosCore.GameObject/Networking/ClientSession/DisconnectHandlers/SaveDisconnectHandler.cs index 765c2a21a..eda5522f6 100644 --- a/src/NosCore.GameObject/Networking/ClientSession/DisconnectHandlers/SaveDisconnectHandler.cs +++ b/src/NosCore.GameObject/Networking/ClientSession/DisconnectHandlers/SaveDisconnectHandler.cs @@ -31,6 +31,6 @@ public async Task HandleDisconnectAsync(ClientSession session) return; } - await saveService.SaveAsync(session.Character).ConfigureAwait(false); + await saveService.SaveAsync(session.Character); } } diff --git a/src/NosCore.GameObject/Networking/ClientSession/LoginPacketHandlingStrategy.cs b/src/NosCore.GameObject/Networking/ClientSession/LoginPacketHandlingStrategy.cs index bcce1860f..aa1fc7660 100644 --- a/src/NosCore.GameObject/Networking/ClientSession/LoginPacketHandlingStrategy.cs +++ b/src/NosCore.GameObject/Networking/ClientSession/LoginPacketHandlingStrategy.cs @@ -34,7 +34,7 @@ public async Task HandlePacketAsync(IPacket packet, ClientSession session, bool var packetHeader = packet.Header; if (string.IsNullOrWhiteSpace(packetHeader)) { - await session.DisconnectAsync().ConfigureAwait(false); + await session.DisconnectAsync(); return; } @@ -52,6 +52,6 @@ public async Task HandlePacketAsync(IPacket packet, ClientSession session, bool return; } - await handler.ExecuteAsync(packet, session).ConfigureAwait(false); + await handler.ExecuteAsync(packet, session); } } diff --git a/src/NosCore.GameObject/Networking/ClientSession/WorldPacketHandlingStrategy.cs b/src/NosCore.GameObject/Networking/ClientSession/WorldPacketHandlingStrategy.cs index a6944ea75..95c3cc822 100644 --- a/src/NosCore.GameObject/Networking/ClientSession/WorldPacketHandlingStrategy.cs +++ b/src/NosCore.GameObject/Networking/ClientSession/WorldPacketHandlingStrategy.cs @@ -60,7 +60,7 @@ public async Task HandlePacketAsync(IPacket packet, ClientSession session, bool if (string.IsNullOrWhiteSpace(packetHeader) && isFromNetwork) { logger.Warning(logLanguage[LogLanguageKey.CORRUPT_PACKET], processedPacket); - await session.DisconnectAsync().ConfigureAwait(false); + await session.DisconnectAsync(); return; } @@ -95,7 +95,7 @@ private async Task ValidateKeepAliveAsync(IPacket packet, ClientSession se if (session.LastKeepAliveIdentity != 0 && packet.KeepAliveId != session.LastKeepAliveIdentity + 1) { logger.Error(logLanguage[LogLanguageKey.CORRUPTED_KEEPALIVE], session.SessionId); - await session.DisconnectAsync().ConfigureAwait(false); + await session.DisconnectAsync(); return false; } @@ -103,7 +103,7 @@ private async Task ValidateKeepAliveAsync(IPacket packet, ClientSession se if (packet.KeepAliveId == null) { - await session.DisconnectAsync().ConfigureAwait(false); + await session.DisconnectAsync(); return false; } @@ -208,7 +208,7 @@ private async Task ExecuteHandlerAsync(IPacketHandler handler, IPacket packet, C try { - await Task.WhenAll(handler.ExecuteAsync(packet, session), Task.Delay(200)).ConfigureAwait(false); + await Task.WhenAll(handler.ExecuteAsync(packet, session), Task.Delay(200)); } finally { diff --git a/src/NosCore.GameObject/Services/BazaarService/BazaarService.cs b/src/NosCore.GameObject/Services/BazaarService/BazaarService.cs index d6ac88888..457e9be0a 100644 --- a/src/NosCore.GameObject/Services/BazaarService/BazaarService.cs +++ b/src/NosCore.GameObject/Services/BazaarService/BazaarService.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -180,15 +180,15 @@ public async Task DeleteBazaarAsync(long id, short count, string requestCh if ((bzlink.ItemInstance?.Amount == count) && (requestCharacterName == bzlink.SellerName)) { - await bazaarItemDao.TryDeleteAsync(bzlink.BazaarItem!.BazaarItemId).ConfigureAwait(false); + await bazaarItemDao.TryDeleteAsync(bzlink.BazaarItem!.BazaarItemId); bazaarRegistry.Unregister(bzlink.BazaarItem.BazaarItemId); - await itemInstanceDao.TryDeleteAsync(bzlink.ItemInstance.Id).ConfigureAwait(false); + await itemInstanceDao.TryDeleteAsync(bzlink.ItemInstance.Id); } else { var item = (IItemInstanceDto)bzlink.ItemInstance!; item.Amount -= count; - await itemInstanceDao.TryInsertOrUpdateAsync(item).ConfigureAwait(false); + await itemInstanceDao.TryInsertOrUpdateAsync(item); } return true; diff --git a/src/NosCore.GameObject/Services/BlackListService/BlacklistService.cs b/src/NosCore.GameObject/Services/BlackListService/BlacklistService.cs index 5e223ff98..ca02eefa3 100644 --- a/src/NosCore.GameObject/Services/BlackListService/BlacklistService.cs +++ b/src/NosCore.GameObject/Services/BlackListService/BlacklistService.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -73,7 +73,7 @@ public async Task BlacklistPlayerAsync(long characterId, long secon RelationType = CharacterRelationType.Blocked }; - await characterRelationDao.TryInsertOrUpdateAsync(data).ConfigureAwait(false); + await characterRelationDao.TryInsertOrUpdateAsync(data); return LanguageKey.BLACKLIST_ADDED; } @@ -97,7 +97,7 @@ public async Task> GetBlacklistedListAsync(long id charList.Add(new CharacterRelationStatus { - CharacterName = (await characterDao.FirstOrDefaultAsync(s => s.CharacterId == rel.RelatedCharacterId).ConfigureAwait(false))?.Name ?? "", + CharacterName = (await characterDao.FirstOrDefaultAsync(s => s.CharacterId == rel.RelatedCharacterId))?.Name ?? "", CharacterId = rel.RelatedCharacterId, IsConnected = character != null, RelationType = rel.RelationType, @@ -111,12 +111,12 @@ public async Task> GetBlacklistedListAsync(long id public async Task UnblacklistAsync(Guid id) { var rel = await characterRelationDao.FirstOrDefaultAsync(s => - (s.CharacterRelationId == id) && (s.RelationType == CharacterRelationType.Blocked)).ConfigureAwait(false); + (s.CharacterRelationId == id) && (s.RelationType == CharacterRelationType.Blocked)); if (rel == null) { return false; } - await characterRelationDao.TryDeleteAsync(rel.CharacterRelationId).ConfigureAwait(false); + await characterRelationDao.TryDeleteAsync(rel.CharacterRelationId); return true; } } diff --git a/src/NosCore.GameObject/Services/BroadcastService/PacketBroadcaster.cs b/src/NosCore.GameObject/Services/BroadcastService/PacketBroadcaster.cs index 3f1d11744..748adbabe 100644 --- a/src/NosCore.GameObject/Services/BroadcastService/PacketBroadcaster.cs +++ b/src/NosCore.GameObject/Services/BroadcastService/PacketBroadcaster.cs @@ -28,7 +28,7 @@ public class PacketBroadcaster(ISessionRegistry sessionRegistry) : IPacketBroadc { public async Task SendToAsync(IPacketTarget target, IPacket packet) { - await SendToAsync(target, new[] { packet }).ConfigureAwait(false); + await SendToAsync(target, new[] { packet }); } public async Task SendToAsync(IPacketTarget target, IEnumerable packets) @@ -37,7 +37,7 @@ public async Task SendToAsync(IPacketTarget target, IEnumerable packets var sessions = GetTargetSessions(target); var tasks = sessions.Select(s => s.Sender.SendPacketsAsync(packetList)); - await Task.WhenAll(tasks).ConfigureAwait(false); + await Task.WhenAll(tasks); } private IEnumerable GetTargetSessions(IPacketTarget target) diff --git a/src/NosCore.GameObject/Services/ChannelCommunicationService/Handlers/DeleteMailDataMessageChannelCommunicationMessageHandler.cs b/src/NosCore.GameObject/Services/ChannelCommunicationService/Handlers/DeleteMailDataMessageChannelCommunicationMessageHandler.cs index da6a5a462..2fcb859c5 100644 --- a/src/NosCore.GameObject/Services/ChannelCommunicationService/Handlers/DeleteMailDataMessageChannelCommunicationMessageHandler.cs +++ b/src/NosCore.GameObject/Services/ChannelCommunicationService/Handlers/DeleteMailDataMessageChannelCommunicationMessageHandler.cs @@ -1,4 +1,4 @@ -using System.Threading.Tasks; +using System.Threading.Tasks; using NosCore.Packets.ServerPackets.Parcel; using NosCore.GameObject.Services.BroadcastService; using DeleteMailData = NosCore.GameObject.InterChannelCommunication.Messages.DeleteMailData; @@ -21,7 +21,7 @@ await session.SendPacketAsync(new PostPacket Type = 2, PostType = data.PostType, Id = data.MailId - }).ConfigureAwait(false); + }); } } } diff --git a/src/NosCore.GameObject/Services/ChannelCommunicationService/Handlers/DisconnectDataMessageChannelCommunicationMessageHandler.cs b/src/NosCore.GameObject/Services/ChannelCommunicationService/Handlers/DisconnectDataMessageChannelCommunicationMessageHandler.cs index 98f955468..841d0d23e 100644 --- a/src/NosCore.GameObject/Services/ChannelCommunicationService/Handlers/DisconnectDataMessageChannelCommunicationMessageHandler.cs +++ b/src/NosCore.GameObject/Services/ChannelCommunicationService/Handlers/DisconnectDataMessageChannelCommunicationMessageHandler.cs @@ -1,4 +1,4 @@ -using System.Threading.Tasks; +using System.Threading.Tasks; using NosCore.GameObject.Services.BroadcastService; using DisconnectData = NosCore.GameObject.InterChannelCommunication.Messages.DisconnectData; @@ -14,7 +14,7 @@ public override async Task Handle(DisconnectData data) return; } - await sessionRegistry.DisconnectByCharacterIdAsync(data.CharacterId).ConfigureAwait(false); + await sessionRegistry.DisconnectByCharacterIdAsync(data.CharacterId); } } } diff --git a/src/NosCore.GameObject/Services/ChannelCommunicationService/Handlers/MailDataMessageChannelCommunicationMessageHandler.cs b/src/NosCore.GameObject/Services/ChannelCommunicationService/Handlers/MailDataMessageChannelCommunicationMessageHandler.cs index a5cc4705e..33ccdfd6b 100644 --- a/src/NosCore.GameObject/Services/ChannelCommunicationService/Handlers/MailDataMessageChannelCommunicationMessageHandler.cs +++ b/src/NosCore.GameObject/Services/ChannelCommunicationService/Handlers/MailDataMessageChannelCommunicationMessageHandler.cs @@ -1,4 +1,4 @@ -using System.Threading.Tasks; +using System.Threading.Tasks; using NosCore.Core.I18N; using NosCore.Data.Enumerations.I18N; using NosCore.GameObject.ComponentEntities.Extensions; @@ -24,10 +24,10 @@ public override async Task Handle(MailData data) { await session.SendPacketAsync(session.GenerateSay( string.Format(gameLanguageLocalizer[LanguageKey.ITEM_GIFTED, session.AccountLanguage], - data.ItemInstance.Amount), SayColorType.Green)).ConfigureAwait(false); + data.ItemInstance.Amount), SayColorType.Green)); } - await session.GenerateMailAsync(new[] { data }).ConfigureAwait(false); + await session.GenerateMailAsync(new[] { data }); } } } diff --git a/src/NosCore.GameObject/Services/ChannelCommunicationService/Handlers/PostedPacketMessageChannelCommunicationMessageHandler.cs b/src/NosCore.GameObject/Services/ChannelCommunicationService/Handlers/PostedPacketMessageChannelCommunicationMessageHandler.cs index 2f3b0a8e3..4c9df0d9d 100644 --- a/src/NosCore.GameObject/Services/ChannelCommunicationService/Handlers/PostedPacketMessageChannelCommunicationMessageHandler.cs +++ b/src/NosCore.GameObject/Services/ChannelCommunicationService/Handlers/PostedPacketMessageChannelCommunicationMessageHandler.cs @@ -1,4 +1,4 @@ -using System.Threading.Tasks; +using System.Threading.Tasks; using NosCore.Data.Enumerations.I18N; using NosCore.Data.Enumerations.Interaction; using NosCore.GameObject.ComponentEntities.Interfaces; @@ -20,7 +20,7 @@ public override async Task Handle(PostedPacket postedPacket) switch (postedPacket.ReceiverType) { case ReceiverType.All: - await sessionRegistry.BroadcastPacketAsync(message).ConfigureAwait(false); + await sessionRegistry.BroadcastPacketAsync(message); break; case ReceiverType.OnlySomeone: ICharacterEntity? receiverSession; @@ -41,7 +41,7 @@ public override async Task Handle(PostedPacket postedPacket) return; } - await receiverSession.SendPacketAsync(message).ConfigureAwait(false); + await receiverSession.SendPacketAsync(message); break; default: logger.Error(logLanguage[LogLanguageKey.UNKWNOWN_RECEIVERTYPE]); diff --git a/src/NosCore.GameObject/Services/ChannelCommunicationService/Handlers/StatDataMessageChannelCommunicationMessageHandler.cs b/src/NosCore.GameObject/Services/ChannelCommunicationService/Handlers/StatDataMessageChannelCommunicationMessageHandler.cs index 7df59b1ac..0e8be7585 100644 --- a/src/NosCore.GameObject/Services/ChannelCommunicationService/Handlers/StatDataMessageChannelCommunicationMessageHandler.cs +++ b/src/NosCore.GameObject/Services/ChannelCommunicationService/Handlers/StatDataMessageChannelCommunicationMessageHandler.cs @@ -1,4 +1,4 @@ -using System.Threading.Tasks; +using System.Threading.Tasks; using Microsoft.Extensions.Options; using NosCore.Core.Configuration; using NosCore.Data.Enumerations; @@ -31,13 +31,13 @@ public override async Task Handle(StatData data) session.SetLevel((byte)data.Data); break; case UpdateStatActionType.UpdateJobLevel: - await session.SetJobLevelAsync((byte)data.Data).ConfigureAwait(false); + await session.SetJobLevelAsync((byte)data.Data); break; case UpdateStatActionType.UpdateHeroLevel: - await session.SetHeroLevelAsync((byte)data.Data).ConfigureAwait(false); + await session.SetHeroLevelAsync((byte)data.Data); break; case UpdateStatActionType.UpdateReputation: - await session.SetReputationAsync(data.Data).ConfigureAwait(false); + await session.SetReputationAsync(data.Data); break; case UpdateStatActionType.UpdateGold: if (session.Gold + data.Data > worldConfiguration.Value.MaxGoldAmount) @@ -45,10 +45,10 @@ public override async Task Handle(StatData data) return; } - await session.SetGoldAsync(data.Data).ConfigureAwait(false); + await session.SetGoldAsync(data.Data); break; case UpdateStatActionType.UpdateClass: - await session.ChangeClassAsync((CharacterClassType)data.Data).ConfigureAwait(false); + await session.ChangeClassAsync((CharacterClassType)data.Data); break; default: logger.Error(logLanguage[LogLanguageKey.UNKWNOWN_RECEIVERTYPE]); diff --git a/src/NosCore.GameObject/Services/ChannelService/ChannelService.cs b/src/NosCore.GameObject/Services/ChannelService/ChannelService.cs index 0df9a15a2..dd2ed86ee 100644 --- a/src/NosCore.GameObject/Services/ChannelService/ChannelService.cs +++ b/src/NosCore.GameObject/Services/ChannelService/ChannelService.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -33,7 +33,7 @@ public class ChannelService(IAuthHub authHttpClient, { public async Task MoveChannelAsync(Networking.ClientSession.ClientSession clientSession, int channelId) { - var servers = await channelHttpClient.GetCommunicationChannels().ConfigureAwait(false); + var servers = await channelHttpClient.GetCommunicationChannels(); var server = servers.FirstOrDefault(x => x.Id == channelId); if (server == null || server.Type != ServerType.WorldServer) { diff --git a/src/NosCore.GameObject/Services/EventLoaderService/Handlers/ChannelCommunicationRunner.cs b/src/NosCore.GameObject/Services/EventLoaderService/Handlers/ChannelCommunicationRunner.cs index 25e2ea176..c2ab97c5c 100644 --- a/src/NosCore.GameObject/Services/EventLoaderService/Handlers/ChannelCommunicationRunner.cs +++ b/src/NosCore.GameObject/Services/EventLoaderService/Handlers/ChannelCommunicationRunner.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -65,7 +65,7 @@ private void OnMessageReceived(IMessage message) { if (_handlers.TryGetValue(message.GetType(), out var handler)) { - await handler.Handle(message).ConfigureAwait(false); + await handler.Handle(message); } else { @@ -81,13 +81,13 @@ private void OnMessageReceived(IMessage message) public async Task StartAsync(CancellationToken cancellationToken) { - await _pubSubHubClient.StartAsync().ConfigureAwait(false); + await _pubSubHubClient.StartAsync(); } public async Task StopAsync(CancellationToken cancellationToken) { _pubSubHubClient.OnMessageReceived -= OnMessageReceived; - await _pubSubHubClient.StopAsync().ConfigureAwait(false); + await _pubSubHubClient.StopAsync(); } } } \ No newline at end of file diff --git a/src/NosCore.GameObject/Services/FriendService/FriendService.cs b/src/NosCore.GameObject/Services/FriendService/FriendService.cs index 419a36ce5..fdf9c2b95 100644 --- a/src/NosCore.GameObject/Services/FriendService/FriendService.cs +++ b/src/NosCore.GameObject/Services/FriendService/FriendService.cs @@ -101,7 +101,7 @@ public async Task AddFriendAsync(long characterId, long secondChara RelationType = CharacterRelationType.Friend }; - await characterRelationDao.TryInsertOrUpdateAsync(data).ConfigureAwait(false); + await characterRelationDao.TryInsertOrUpdateAsync(data); var data2 = new CharacterRelationDto { CharacterId = targetCharacter.ConnectedCharacter.Id, @@ -109,7 +109,7 @@ public async Task AddFriendAsync(long characterId, long secondChara RelationType = CharacterRelationType.Friend }; - await characterRelationDao.TryInsertOrUpdateAsync(data2).ConfigureAwait(false); + await characterRelationDao.TryInsertOrUpdateAsync(data2); friendRequestRegistry.UnregisterRequest(friendRequest.First().Key); return LanguageKey.FRIEND_ADDED; case FinsPacketType.Rejected: @@ -143,7 +143,7 @@ public async Task> GetFriendsAsync(long id) charList.Add(new CharacterRelationStatus { - CharacterName = (await characterDao.FirstOrDefaultAsync(s => s.CharacterId == rel.RelatedCharacterId).ConfigureAwait(false))?.Name, + CharacterName = (await characterDao.FirstOrDefaultAsync(s => s.CharacterId == rel.RelatedCharacterId))?.Name, CharacterId = rel.RelatedCharacterId, IsConnected = character != null, RelationType = rel.RelationType, @@ -157,20 +157,20 @@ public async Task> GetFriendsAsync(long id) public async Task DeleteAsync(Guid id) { var rel = await characterRelationDao.FirstOrDefaultAsync(s => - (s.CharacterRelationId == id) && (s.RelationType == CharacterRelationType.Friend)).ConfigureAwait(false); + (s.CharacterRelationId == id) && (s.RelationType == CharacterRelationType.Friend)); if (rel == null) { return false; } var rel2 = await characterRelationDao.FirstOrDefaultAsync(s => (s.CharacterId == rel.RelatedCharacterId) && (s.RelatedCharacterId == rel.CharacterId) && - (s.RelationType == CharacterRelationType.Friend)).ConfigureAwait(false); + (s.RelationType == CharacterRelationType.Friend)); if (rel2 == null) { return false; } - await characterRelationDao.TryDeleteAsync(rel.CharacterRelationId).ConfigureAwait(false); - await characterRelationDao.TryDeleteAsync(rel2.CharacterRelationId).ConfigureAwait(false); + await characterRelationDao.TryDeleteAsync(rel.CharacterRelationId); + await characterRelationDao.TryDeleteAsync(rel2.CharacterRelationId); return true; } } diff --git a/src/NosCore.GameObject/Services/GuriRunnerService/Handlers/MfaGuriHandler.cs b/src/NosCore.GameObject/Services/GuriRunnerService/Handlers/MfaGuriHandler.cs index 7441bae0a..d1f95630a 100644 --- a/src/NosCore.GameObject/Services/GuriRunnerService/Handlers/MfaGuriHandler.cs +++ b/src/NosCore.GameObject/Services/GuriRunnerService/Handlers/MfaGuriHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -57,9 +57,9 @@ await requestData.ClientSession.SendPacketAsync(new NosCore.Packets.ServerPacket Type = GuriPacketType.TextInput, Argument = 3, EntityId = 0 - }).ConfigureAwait(false); + }); - await requestData.ClientSession.SendPacketAsync(new InfoiPacket { Message = Game18NConstString.IncorrectPassword }).ConfigureAwait(false); + await requestData.ClientSession.SendPacketAsync(new InfoiPacket { Message = Game18NConstString.IncorrectPassword }); } } } diff --git a/src/NosCore.GameObject/Services/GuriRunnerService/Handlers/SpeakerGuriHandler.cs b/src/NosCore.GameObject/Services/GuriRunnerService/Handlers/SpeakerGuriHandler.cs index 6be005e37..ee2f8d904 100644 --- a/src/NosCore.GameObject/Services/GuriRunnerService/Handlers/SpeakerGuriHandler.cs +++ b/src/NosCore.GameObject/Services/GuriRunnerService/Handlers/SpeakerGuriHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -82,16 +82,16 @@ public async Task ExecuteAsync(RequestData requestData) return; } message = CraftMessage(message, valuesplit.Skip(2).ToArray()).Replace(' ', '|'); - await sessionRegistry.BroadcastPacketAsync(requestData.ClientSession.Character.GenerateSayItem(message, deeplink), requestData.ClientSession.Channel!.Id).ConfigureAwait(false); + await sessionRegistry.BroadcastPacketAsync(requestData.ClientSession.Character.GenerateSayItem(message, deeplink), requestData.ClientSession.Channel!.Id); } else { message = CraftMessage(message, valuesplit); - await sessionRegistry.BroadcastPacketAsync(requestData.ClientSession.Character.GenerateSay(message, (SayColorType)13), requestData.ClientSession.Channel!.Id).ConfigureAwait(false); + await sessionRegistry.BroadcastPacketAsync(requestData.ClientSession.Character.GenerateSay(message, (SayColorType)13), requestData.ClientSession.Channel!.Id); } requestData.ClientSession.Character.InventoryService.RemoveItemAmountFromInventory(1, inv.ItemInstanceId); - await requestData.ClientSession.Character.SendPacketAsync(inv.GeneratePocketChange(PocketType.Etc, (short)(requestData.Data.VisualId ?? 0))).ConfigureAwait(false); + await requestData.ClientSession.Character.SendPacketAsync(inv.GeneratePocketChange(PocketType.Etc, (short)(requestData.Data.VisualId ?? 0))); } } } \ No newline at end of file diff --git a/src/NosCore.GameObject/Services/GuriRunnerService/Handlers/TitleGuriHandler.cs b/src/NosCore.GameObject/Services/GuriRunnerService/Handlers/TitleGuriHandler.cs index e90598304..dd6ffa214 100644 --- a/src/NosCore.GameObject/Services/GuriRunnerService/Handlers/TitleGuriHandler.cs +++ b/src/NosCore.GameObject/Services/GuriRunnerService/Handlers/TitleGuriHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -57,10 +57,10 @@ public async Task ExecuteAsync(RequestData requestData) Active = false, CharacterId = requestData.ClientSession.Character.VisualId }); - await requestData.ClientSession.Character.MapInstance.SendPacketAsync(requestData.ClientSession.Character.GenerateTitle()).ConfigureAwait(false); - await requestData.ClientSession.SendPacketAsync(new InfoiPacket { Message = Game18NConstString.TitleChangedOrHidden }).ConfigureAwait(false); + await requestData.ClientSession.Character.MapInstance.SendPacketAsync(requestData.ClientSession.Character.GenerateTitle()); + await requestData.ClientSession.SendPacketAsync(new InfoiPacket { Message = Game18NConstString.TitleChangedOrHidden }); requestData.ClientSession.Character.InventoryService.RemoveItemAmountFromInventory(1, inv.ItemInstanceId); - await requestData.ClientSession.SendPacketAsync(inv.GeneratePocketChange((PocketType)inv.Type, inv.Slot)).ConfigureAwait(false); + await requestData.ClientSession.SendPacketAsync(inv.GeneratePocketChange((PocketType)inv.Type, inv.Slot)); } } } \ No newline at end of file diff --git a/src/NosCore.GameObject/Services/ItemGenerationService/Handlers/BackPackHandler.cs b/src/NosCore.GameObject/Services/ItemGenerationService/Handlers/BackPackHandler.cs index faf754570..bf1fe4eb6 100644 --- a/src/NosCore.GameObject/Services/ItemGenerationService/Handlers/BackPackHandler.cs +++ b/src/NosCore.GameObject/Services/ItemGenerationService/Handlers/BackPackHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -56,7 +56,7 @@ await requestData.ClientSession.SendPacketAsync(new SayiPacket VisualId = requestData.ClientSession.Character.CharacterId, Type = SayColorType.Green, Message = Game18NConstString.NotInPair - }).ConfigureAwait(false); + }); return; } @@ -69,7 +69,7 @@ await requestData.ClientSession.SendPacketAsync(new SayiPacket VisualId = requestData.ClientSession.Character.CharacterId, Type = SayColorType.Green, Message = Game18NConstString.NotInPair - }).ConfigureAwait(false); + }); return; } @@ -88,14 +88,14 @@ await requestData.ClientSession.SendPacketAsync(new SayiPacket Message = Game18NConstString.EffectActivated, ArgumentType = 2, Game18NArguments = { itemInstance.ItemInstance.Item.VNum.ToString() } - }).ConfigureAwait(false); + }); await requestData.ClientSession.SendPacketAsync( - itemInstance.GeneratePocketChange((PocketType)itemInstance.Type, itemInstance.Slot)).ConfigureAwait(false); + itemInstance.GeneratePocketChange((PocketType)itemInstance.Type, itemInstance.Slot)); requestData.ClientSession.Character.InventoryService.RemoveItemAmountFromInventory(1, itemInstance.ItemInstanceId); requestData.ClientSession.Character.LoadExpensions(); - await requestData.ClientSession.SendPacketAsync(requestData.ClientSession.Character.GenerateExts(conf)).ConfigureAwait(false); + await requestData.ClientSession.SendPacketAsync(requestData.ClientSession.Character.GenerateExts(conf)); } } } \ No newline at end of file diff --git a/src/NosCore.GameObject/Services/ItemGenerationService/Handlers/BazaarMedalsHandler.cs b/src/NosCore.GameObject/Services/ItemGenerationService/Handlers/BazaarMedalsHandler.cs index d61799914..e6510131e 100644 --- a/src/NosCore.GameObject/Services/ItemGenerationService/Handlers/BazaarMedalsHandler.cs +++ b/src/NosCore.GameObject/Services/ItemGenerationService/Handlers/BazaarMedalsHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -67,9 +67,9 @@ await requestData.ClientSession.SendPacketAsync(new SayiPacket Message = Game18NConstString.EffectActivated, ArgumentType = 2, Game18NArguments = { itemInstance.ItemInstance.Item.VNum.ToString() } - }).ConfigureAwait(false); + }); - await requestData.ClientSession.SendPacketAsync(itemInstance.GeneratePocketChange((PocketType)itemInstance.Type, itemInstance.Slot)).ConfigureAwait(false); + await requestData.ClientSession.SendPacketAsync(itemInstance.GeneratePocketChange((PocketType)itemInstance.Type, itemInstance.Slot)); requestData.ClientSession.Character.InventoryService.RemoveItemAmountFromInventory(1, itemInstance.ItemInstanceId); } } diff --git a/src/NosCore.GameObject/Services/ItemGenerationService/Handlers/MinilandBellHandler.cs b/src/NosCore.GameObject/Services/ItemGenerationService/Handlers/MinilandBellHandler.cs index 0e7683eb8..887dec4c4 100644 --- a/src/NosCore.GameObject/Services/ItemGenerationService/Handlers/MinilandBellHandler.cs +++ b/src/NosCore.GameObject/Services/ItemGenerationService/Handlers/MinilandBellHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -52,7 +52,7 @@ await requestData.ClientSession.Character.SendPacketAsync(new SayiPacket VisualId = requestData.ClientSession.Character.CharacterId, Type = SayColorType.Yellow, Message = Game18NConstString.CanNotBeUsedHere - }).ConfigureAwait(false); + }); return; } @@ -64,7 +64,7 @@ await requestData.ClientSession.Character.SendPacketAsync(new SayiPacket VisualId = requestData.ClientSession.Character.CharacterId, Type = SayColorType.Yellow, Message = Game18NConstString.OnlyPotionInVehicle - }).ConfigureAwait(false); + }); return; } @@ -75,14 +75,14 @@ await requestData.ClientSession.SendPacketAsync(new DelayPacket Delay = 5000, Type = DelayPacketType.ItemInUse, Packet = requestData.ClientSession.Character.GenerateUseItem((PocketType)itemInstance.Type, itemInstance.Slot, 2, 0) - }).ConfigureAwait(false); + }); return; } requestData.ClientSession.Character.InventoryService.RemoveItemAmountFromInventory(1, itemInstance.ItemInstanceId); - await requestData.ClientSession.SendPacketAsync(itemInstance.GeneratePocketChange((PocketType)itemInstance.Type, itemInstance.Slot)).ConfigureAwait(false); + await requestData.ClientSession.SendPacketAsync(itemInstance.GeneratePocketChange((PocketType)itemInstance.Type, itemInstance.Slot)); var miniland = minilandProvider.GetMiniland(requestData.ClientSession.Character.CharacterId); - await mapChangeService.ChangeMapInstanceAsync(requestData.ClientSession, miniland.MapInstanceId, 5, 8).ConfigureAwait(false); + await mapChangeService.ChangeMapInstanceAsync(requestData.ClientSession, miniland.MapInstanceId, 5, 8); } } } \ No newline at end of file diff --git a/src/NosCore.GameObject/Services/ItemGenerationService/Handlers/SpRechargerHandler.cs b/src/NosCore.GameObject/Services/ItemGenerationService/Handlers/SpRechargerHandler.cs index e258bdae2..1b81df2dd 100644 --- a/src/NosCore.GameObject/Services/ItemGenerationService/Handlers/SpRechargerHandler.cs +++ b/src/NosCore.GameObject/Services/ItemGenerationService/Handlers/SpRechargerHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -48,8 +48,8 @@ public async Task ExecuteAsync(RequestData> requestData) { - await requestData.ClientSession.SendPacketAsync(requestData.ClientSession.Character.GenerateEff(123)).ConfigureAwait(false); + await requestData.ClientSession.SendPacketAsync(requestData.ClientSession.Character.GenerateEff(123)); var itemInstance = requestData.Data.Item1; var packet = requestData.Data.Item2; @@ -71,7 +71,7 @@ await requestData.ClientSession.SendPacketAsync( (PocketType)itemInstance.Type, itemInstance.Slot, 1, (byte)(packet.Parameter ?? 0)), Question = requestData.ClientSession.GetMessageFromKey(LanguageKey.ASK_BIND) - }).ConfigureAwait(false); + }); return; } @@ -90,7 +90,7 @@ await requestData.ClientSession.SendPacketAsync(new SayiPacket VisualId = requestData.ClientSession.Character.CharacterId, Type = SayColorType.Yellow, Message = Game18NConstString.CanNotWearThat - }).ConfigureAwait(false); + }); return; } @@ -108,7 +108,7 @@ await requestData.ClientSession.SendPacketAsync(new MsgiPacket { Type = MessageType.Default, Message = Game18NConstString.SpecialistAndFairyDifferentElement - }).ConfigureAwait(false); + }); return; } } @@ -127,7 +127,7 @@ await requestData.ClientSession.SendPacketAsync(new MsgiPacket Message = Game18NConstString.CantTrasformWithSideEffect, ArgumentType = 4, Game18NArguments = { requestData.ClientSession.Character.SpCooldown - (int)Math.Round(timeSpanSinceLastSpUsage) } - }).ConfigureAwait(false); + }); return; } @@ -139,7 +139,7 @@ await requestData.ClientSession.SendPacketAsync(new SayiPacket VisualId = requestData.ClientSession.Character.CharacterId, Type = SayColorType.Yellow, Message = Game18NConstString.SpecialistCardsCannotBeTradedWhileTransformed - }).ConfigureAwait(false); + }); return; } @@ -149,7 +149,7 @@ await requestData.ClientSession.SendPacketAsync(new MsgiPacket { Type = MessageType.Default, Message = Game18NConstString.CantUseBecauseSoulDestroyed - }).ConfigureAwait(false); + }); return; } } @@ -160,7 +160,7 @@ await requestData.ClientSession.SendPacketAsync(new MsgiPacket { Type = MessageType.Default, Message = Game18NConstString.CanNotBeWornDifferentClass - }).ConfigureAwait(false); + }); return; } @@ -171,26 +171,26 @@ await requestData.ClientSession.SendPacketAsync(new MsgiPacket requestData.ClientSession.Character.InventoryService .LoadBySlotAndType(packet.Slot, (NoscorePocketType)packet.Type); - await requestData.ClientSession.SendPacketAsync(newItem.GeneratePocketChange(packet.Type, packet.Slot)).ConfigureAwait(false); + await requestData.ClientSession.SendPacketAsync(newItem.GeneratePocketChange(packet.Type, packet.Slot)); await requestData.ClientSession.Character.MapInstance.SendPacketAsync(requestData.ClientSession.Character - .GenerateEq()).ConfigureAwait(false); - await requestData.ClientSession.SendPacketAsync(requestData.ClientSession.Character.GenerateEquipment()).ConfigureAwait(false); + .GenerateEq()); + await requestData.ClientSession.SendPacketAsync(requestData.ClientSession.Character.GenerateEquipment()); if (itemInstance.ItemInstance.Item.EquipmentSlot == EquipmentType.Sp) { - await requestData.ClientSession.SendPacketAsync(requestData.ClientSession.Character.GenerateSpPoint()).ConfigureAwait(false); + await requestData.ClientSession.SendPacketAsync(requestData.ClientSession.Character.GenerateSpPoint()); } if (itemInstance.ItemInstance.Item.EquipmentSlot == EquipmentType.Fairy) { await requestData.ClientSession.Character.MapInstance.SendPacketAsync( - requestData.ClientSession.Character.GeneratePairy(itemInstance.ItemInstance as WearableInstance)).ConfigureAwait(false); + requestData.ClientSession.Character.GeneratePairy(itemInstance.ItemInstance as WearableInstance)); } if (itemInstance.ItemInstance.Item.EquipmentSlot == EquipmentType.Amulet) { - await requestData.ClientSession.SendPacketAsync(requestData.ClientSession.Character.GenerateEff(39)).ConfigureAwait(false); + await requestData.ClientSession.SendPacketAsync(requestData.ClientSession.Character.GenerateEff(39)); } itemInstance.ItemInstance.BoundCharacterId = requestData.ClientSession.Character.CharacterId; diff --git a/src/NosCore.GameObject/Services/LoginService/LoginService.cs b/src/NosCore.GameObject/Services/LoginService/LoginService.cs index 74469a10f..37721b7fb 100644 --- a/src/NosCore.GameObject/Services/LoginService/LoginService.cs +++ b/src/NosCore.GameObject/Services/LoginService/LoginService.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -60,25 +60,25 @@ public async Task LoginAsync(string? username, string md5String, ClientVersionSu await clientSession.SendPacketAsync(new FailcPacket { Type = LoginFailType.OldClient - }).ConfigureAwait(false); - await clientSession.DisconnectAsync().ConfigureAwait(false); + }); + await clientSession.DisconnectAsync(); return; } if (useApiAuth) { - username = await authHttpClient.GetAwaitingConnectionAsync(null, passwordToken, clientSession.SessionId).ConfigureAwait(false); + username = await authHttpClient.GetAwaitingConnectionAsync(null, passwordToken, clientSession.SessionId); } - var acc = await accountDao.FirstOrDefaultAsync(s => s.Name.ToLower() == (username ?? "").ToLower()).ConfigureAwait(false); + var acc = await accountDao.FirstOrDefaultAsync(s => s.Name.ToLower() == (username ?? "").ToLower()); if ((acc != null) && (acc.Name != username)) { await clientSession.SendPacketAsync(new FailcPacket { Type = LoginFailType.WrongCaps - }).ConfigureAwait(false); - await clientSession.DisconnectAsync().ConfigureAwait(false); + }); + await clientSession.DisconnectAsync(); return; } @@ -88,8 +88,8 @@ await clientSession.SendPacketAsync(new FailcPacket await clientSession.SendPacketAsync(new FailcPacket { Type = LoginFailType.AccountOrPasswordWrong - }).ConfigureAwait(false); - await clientSession.DisconnectAsync().ConfigureAwait(false); + }); + await clientSession.DisconnectAsync(); return; } @@ -99,14 +99,14 @@ await clientSession.SendPacketAsync(new FailcPacket await clientSession.SendPacketAsync(new FailcPacket { Type = LoginFailType.Banned - }).ConfigureAwait(false); + }); break; case AuthorityType.Closed: case AuthorityType.Unconfirmed: await clientSession.SendPacketAsync(new FailcPacket { Type = LoginFailType.CantConnect - }).ConfigureAwait(false); + }); break; default: var connectedAccount = await pubSubHub.GetSubscribersAsync(); @@ -117,21 +117,21 @@ await clientSession.SendPacketAsync(new FailcPacket await clientSession.SendPacketAsync(new FailcPacket { Type = LoginFailType.AlreadyConnected - }).ConfigureAwait(false); - await clientSession.DisconnectAsync().ConfigureAwait(false); + }); + await clientSession.DisconnectAsync(); return; } acc.Language = language; - acc = await accountDao.TryInsertOrUpdateAsync(acc).ConfigureAwait(false); + acc = await accountDao.TryInsertOrUpdateAsync(acc); if (servers.Count <= 0) { await clientSession.SendPacketAsync(new FailcPacket { Type = LoginFailType.CantConnect - }).ConfigureAwait(false); - await clientSession.DisconnectAsync().ConfigureAwait(false); + }); + await clientSession.DisconnectAsync(); return; } @@ -195,19 +195,19 @@ await clientSession.SendPacketAsync(new FailcPacket Name = useApiAuth ? "4" : "1" }); //useless server to end the client reception - await clientSession.SendPacketAsync(nstest).ConfigureAwait(false); + await clientSession.SendPacketAsync(nstest); return; } - await clientSession.DisconnectAsync().ConfigureAwait(false); + await clientSession.DisconnectAsync(); } catch { await clientSession.SendPacketAsync(new FailcPacket { Type = LoginFailType.UnhandledError - }).ConfigureAwait(false); - await clientSession.DisconnectAsync().ConfigureAwait(false); + }); + await clientSession.DisconnectAsync(); } } } diff --git a/src/NosCore.GameObject/Services/MailService/MailService.cs b/src/NosCore.GameObject/Services/MailService/MailService.cs index 22b7b838d..60f1274c9 100644 --- a/src/NosCore.GameObject/Services/MailService/MailService.cs +++ b/src/NosCore.GameObject/Services/MailService/MailService.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -77,10 +77,10 @@ public async Task DeleteMailAsync(long id, long characterId, bool senderCo return false; } - await mailDao.TryDeleteAsync(mail.MailDto.MailId).ConfigureAwait(false); + await mailDao.TryDeleteAsync(mail.MailDto.MailId); if (mail.ItemInstance != null) { - await itemInstanceDao.TryDeleteAsync(mail.ItemInstance.Id).ConfigureAwait(false); + await itemInstanceDao.TryDeleteAsync(mail.ItemInstance.Id); } if (!parcelRegistry.RemoveMail(characterId, senderCopy, id, out var maildata) || maildata == null) @@ -91,13 +91,13 @@ public async Task DeleteMailAsync(long id, long characterId, bool senderCo var accounts = await pubSubHub.GetSubscribersAsync(); var receiver = accounts.FirstOrDefault(s => s.ConnectedCharacter?.Id == characterId && servers.Where(c => c.Type == ServerType.WorldServer).Any(x => x.Id == s.ChannelId)); - await NotifyAsync(1, receiver, maildata).ConfigureAwait(false); + await NotifyAsync(1, receiver, maildata); return true; } public async Task EditMailAsync(long id, JsonPatch mailData) { - var mail = await mailDao.FirstOrDefaultAsync(s => s.MailId == id).ConfigureAwait(false); + var mail = await mailDao.FirstOrDefaultAsync(s => s.MailId == id); if (mail == null) { return null; @@ -105,7 +105,7 @@ public async Task DeleteMailAsync(long id, long characterId, bool senderCo var result = mailData.Apply(JsonDocument.Parse(JsonSerializer.SerializeToUtf8Bytes(mail, new JsonSerializerOptions().ConfigureForNodaTime(DateTimeZoneProviders.Tzdb))).RootElement); mail = JsonSerializer.Deserialize(result.GetRawText())!; - await mailDao.TryInsertOrUpdateAsync(mail).ConfigureAwait(false); + await mailDao.TryInsertOrUpdateAsync(mail); var targetCharacterId = mail.IsSenderCopy ? (long)mail.SenderId! : mail.ReceiverId; var savedData = parcelRegistry.GetMails(targetCharacterId, mail.IsSenderCopy) .FirstOrDefault(s => s.Value.MailDto.MailId == id); @@ -114,7 +114,7 @@ public async Task DeleteMailAsync(long id, long characterId, bool senderCo return null; } var maildata = await GenerateMailDataAsync(mail, savedData.Value.ItemType, savedData.Value.ItemInstance, - savedData.Value.ReceiverName).ConfigureAwait(false); + savedData.Value.ReceiverName); maildata.MailId = savedData.Value.MailId; parcelRegistry.UpdateMail(mail.IsSenderCopy ? mail.SenderId ?? 0 : mail.ReceiverId, mail.IsSenderCopy, savedData.Key, maildata); @@ -124,7 +124,7 @@ public async Task DeleteMailAsync(long id, long characterId, bool senderCo public async Task SendMailAsync(MailDto mail, short? vNum, short? amount, sbyte? rare, byte? upgrade) { var mailref = mail; - var receivdto = await characterDto.FirstOrDefaultAsync(s => s.CharacterId == mailref.ReceiverId).ConfigureAwait(false); + var receivdto = await characterDto.FirstOrDefaultAsync(s => s.CharacterId == mailref.ReceiverId); if (receivdto == null) { return false; @@ -174,7 +174,7 @@ public async Task SendMailAsync(MailDto mail, short? vNum, short? amount, itemInstance = itemProvider.Create((short)vNum, amount ?? 1, rare ?? 0, upgrade ?? 0); - itemInstance = await itemInstanceDao.TryInsertOrUpdateAsync(itemInstance).ConfigureAwait(false); + itemInstance = await itemInstanceDao.TryInsertOrUpdateAsync(itemInstance); mailref.ItemInstanceId = itemInstance?.Id; } @@ -182,14 +182,14 @@ public async Task SendMailAsync(MailDto mail, short? vNum, short? amount, var accounts = await pubSubHub.GetSubscribersAsync(); var receiver = accounts.FirstOrDefault(s => s.ConnectedCharacter?.Id == mailref.ReceiverId && servers.Where(c => c.Type == ServerType.WorldServer).Any(x => x.Id == s.ChannelId)); - mailref = await mailDao.TryInsertOrUpdateAsync(mailref).ConfigureAwait(false); + mailref = await mailDao.TryInsertOrUpdateAsync(mailref); if (itemInstance == null) { return false; } - var mailData = await GenerateMailDataAsync(mailref, (short?)it?.ItemType ?? -1, itemInstance, receiverName).ConfigureAwait(false); + var mailData = await GenerateMailDataAsync(mailref, (short?)it?.ItemType ?? -1, itemInstance, receiverName); parcelRegistry.AddMail(mailref.ReceiverId, mailData.MailDto.IsSenderCopy, mailData.MailId, mailData); - await NotifyAsync(0, receiver, mailData).ConfigureAwait(false); + await NotifyAsync(0, receiver, mailData); if (mailref.SenderId == null) { @@ -199,12 +199,12 @@ public async Task SendMailAsync(MailDto mail, short? vNum, short? amount, mailref.IsSenderCopy = true; mailref.MailId = 0; itemInstance.Id = new Guid(); - itemInstance = await itemInstanceDao.TryInsertOrUpdateAsync(itemInstance).ConfigureAwait(false); + itemInstance = await itemInstanceDao.TryInsertOrUpdateAsync(itemInstance); mailref.ItemInstanceId = itemInstance?.Id; - mailref = await mailDao.TryInsertOrUpdateAsync(mailref).ConfigureAwait(false); - var mailDataCopy = await GenerateMailDataAsync(mailref, (short?)it?.ItemType ?? -1, itemInstance!, receiverName).ConfigureAwait(false); + mailref = await mailDao.TryInsertOrUpdateAsync(mailref); + var mailDataCopy = await GenerateMailDataAsync(mailref, (short?)it?.ItemType ?? -1, itemInstance!, receiverName); parcelRegistry.AddMail(mailref.ReceiverId, mailDataCopy.MailDto.IsSenderCopy, mailDataCopy.MailId, mailDataCopy); - await NotifyAsync(0, receiver, mailDataCopy).ConfigureAwait(false); + await NotifyAsync(0, receiver, mailDataCopy); return true; } @@ -214,7 +214,7 @@ private async Task GenerateMailDataAsync(MailDto mailref, short itemTy { var nextMailId = parcelRegistry.GetNextMailId(mailref.ReceiverId, mailref.IsSenderCopy); var sender = mailref.SenderId != null - ? (await characterDto.FirstOrDefaultAsync(s => s.CharacterId == mailref.SenderId).ConfigureAwait(false))?.Name : "NOSMALL"; + ? (await characterDto.FirstOrDefaultAsync(s => s.CharacterId == mailref.SenderId))?.Name : "NOSMALL"; return new MailData { ReceiverName = receiverName, @@ -239,7 +239,7 @@ private async Task NotifyAsync(byte notifyType, Subscriber? receiver, MailData m switch (notifyType) { case 0: - await pubSubHub.SendMessageAsync(mailData).ConfigureAwait(false); + await pubSubHub.SendMessageAsync(mailData); break; case 1: await pubSubHub.SendMessageAsync(new DeleteMailData() diff --git a/src/NosCore.GameObject/Services/MailService/ParcelRegistry.cs b/src/NosCore.GameObject/Services/MailService/ParcelRegistry.cs index 5cd6ffc01..1542ed2f3 100644 --- a/src/NosCore.GameObject/Services/MailService/ParcelRegistry.cs +++ b/src/NosCore.GameObject/Services/MailService/ParcelRegistry.cs @@ -105,12 +105,12 @@ private async Task InitializeAsync() var characternames = new Dictionary(); foreach (var characterId in charactersIds) { - characternames.Add(characterId, (await _characterDao.FirstOrDefaultAsync(s => s.CharacterId == characterId).ConfigureAwait(false))?.Name); + characternames.Add(characterId, (await _characterDao.FirstOrDefaultAsync(s => s.CharacterId == characterId))?.Name); } foreach (var mail in mails) { - var itinst = await _itemInstanceDao.FirstOrDefaultAsync(s => s!.Id == mail.ItemInstanceId).ConfigureAwait(false); + var itinst = await _itemInstanceDao.FirstOrDefaultAsync(s => s!.Id == mail.ItemInstanceId); ItemDto? it = null; if (itinst != null) { diff --git a/src/NosCore.GameObject/Services/MapChangeService/MapChangeService.cs b/src/NosCore.GameObject/Services/MapChangeService/MapChangeService.cs index a6b47b5f8..b2f193eea 100644 --- a/src/NosCore.GameObject/Services/MapChangeService/MapChangeService.cs +++ b/src/NosCore.GameObject/Services/MapChangeService/MapChangeService.cs @@ -1,4 +1,4 @@ - + using System; using System.Linq; using System.Threading.Tasks; @@ -58,7 +58,7 @@ public async Task ChangeMapAsync(ClientSession session, short? mapId = null, sho } mapInstanceAccessorService.GetMapInstance(session.Character.MapInstanceId); - await ChangeMapInstanceAsync(session, session.Character.MapInstanceId, mapX, mapY).ConfigureAwait(false); + await ChangeMapInstanceAsync(session, session.Character.MapInstanceId, mapX, mapY); } public async Task ChangeMapInstanceAsync(ClientSession session, Guid mapInstanceId, int? mapX = null, int? mapY = null) @@ -76,9 +76,9 @@ public async Task ChangeMapInstanceAsync(ClientSession session, Guid mapInstance { session.Character.MapInstance.Sessions.Remove(session.Channel); } - await session.SendPacketAsync(session.Character.MapInstance.GenerateCMap(false)).ConfigureAwait(false); + await session.SendPacketAsync(session.Character.MapInstance.GenerateCMap(false)); session.Character.MapInstance.LastUnregister = clock.GetCurrentInstant(); - await LeaveMapAsync(session).ConfigureAwait(false); + await LeaveMapAsync(session); if (session.Character.MapInstance.Sessions.Count == 0) { session.Character.MapInstance.IsSleeping = true; @@ -107,20 +107,20 @@ public async Task ChangeMapInstanceAsync(ClientSession session, Guid mapInstance session.Character.PositionY = (short)mapY; } - await session.SendPacketAsync(session.Character.GenerateCInfo()).ConfigureAwait(false); - await session.SendPacketAsync(session.Character.GenerateCMode()).ConfigureAwait(false); - await session.SendPacketAsync(session.Character.GenerateEq()).ConfigureAwait(false); - await session.SendPacketAsync(session.Character.GenerateEquipment()).ConfigureAwait(false); - await session.SendPacketAsync(session.Character.GenerateLev(experienceService, jobExperienceService, heroExperienceService)).ConfigureAwait(false); - await session.SendPacketAsync(session.Character.GenerateStat()).ConfigureAwait(false); - await session.SendPacketAsync(session.Character.GenerateAt()).ConfigureAwait(false); - await session.SendPacketAsync(session.Character.GenerateCond()).ConfigureAwait(false); - await session.SendPacketAsync(session.Character.MapInstance.GenerateCMap(true)).ConfigureAwait(false); + await session.SendPacketAsync(session.Character.GenerateCInfo()); + await session.SendPacketAsync(session.Character.GenerateCMode()); + await session.SendPacketAsync(session.Character.GenerateEq()); + await session.SendPacketAsync(session.Character.GenerateEquipment()); + await session.SendPacketAsync(session.Character.GenerateLev(experienceService, jobExperienceService, heroExperienceService)); + await session.SendPacketAsync(session.Character.GenerateStat()); + await session.SendPacketAsync(session.Character.GenerateAt()); + await session.SendPacketAsync(session.Character.GenerateCond()); + await session.SendPacketAsync(session.Character.MapInstance.GenerateCMap(true)); await session.SendPacketAsync(session.Character.GeneratePairy( session.Character.InventoryService.LoadBySlotAndType((byte)EquipmentType.Fairy, - NoscorePocketType.Wear)?.ItemInstance as WearableInstance)).ConfigureAwait(false); - await session.SendPacketsAsync(session.Character.MapInstance.GetMapItems(session.Character.AccountLanguage)).ConfigureAwait(false); - await session.SendPacketsAsync(session.Character.MapInstance.MapDesignObjects.Values.Select(mp => mp.GenerateEffect())).ConfigureAwait(false); + NoscorePocketType.Wear)?.ItemInstance as WearableInstance)); + await session.SendPacketsAsync(session.Character.MapInstance.GetMapItems(session.Character.AccountLanguage)); + await session.SendPacketsAsync(session.Character.MapInstance.MapDesignObjects.Values.Select(mp => mp.GenerateEffect())); var minilandPortals = minilandProvider .GetMinilandPortals(session.Character.CharacterId) @@ -129,18 +129,18 @@ await session.SendPacketAsync(session.Character.GeneratePairy( if (minilandPortals.Count > 0) { - await session.SendPacketsAsync(minilandPortals.Select(s => s.GenerateGp())).ConfigureAwait(false); + await session.SendPacketsAsync(minilandPortals.Select(s => s.GenerateGp())); } - await session.SendPacketAsync(session.Character.Group!.GeneratePinit()).ConfigureAwait(false); + await session.SendPacketAsync(session.Character.Group!.GeneratePinit()); if (!session.Character.Group.IsEmpty) { - await session.SendPacketsAsync(session.Character.Group.GeneratePst()).ConfigureAwait(false); + await session.SendPacketsAsync(session.Character.Group.GeneratePst()); } if ((session.Character.Group.Type == GroupType.Group) && (session.Character.Group.Count > 1)) { - await session.Character.MapInstance.SendPacketAsync(session.Character.Group.GeneratePidx(session.Character)).ConfigureAwait(false); + await session.Character.MapInstance.SendPacketAsync(session.Character.Group.GeneratePidx(session.Character)); } var mapSessions = sessionRegistry.GetCharacters(s => @@ -150,16 +150,16 @@ await Task.WhenAll(mapSessions.Select(async s => { await session.SendPacketAsync(s.GenerateIn(s.Authority == AuthorityType.Moderator ? $"[{gameLanguageLocalizer[LanguageKey.SUPPORT, s.AccountLanguage]}" - : string.Empty)).ConfigureAwait(false); + : string.Empty)); if (s.Shop == null) { return; } - await session.SendPacketAsync(s.GeneratePFlag()).ConfigureAwait(false); - await session.SendPacketAsync(s.GenerateShop(session.Account.Language)).ConfigureAwait(false); - })).ConfigureAwait(false); - await session.Character.MapInstance.SendPacketAsync(session.Character.GenerateTitInfo()).ConfigureAwait(false); + await session.SendPacketAsync(s.GeneratePFlag()); + await session.SendPacketAsync(s.GenerateShop(session.Account.Language)); + })); + await session.Character.MapInstance.SendPacketAsync(session.Character.GenerateTitInfo()); session.Character.MapInstance.IsSleeping = false; if (session.Channel?.Id != null) { @@ -167,7 +167,7 @@ await session.SendPacketAsync(s.GenerateIn(s.Authority == AuthorityType.Moderato { await session.Character.MapInstance.SendPacketAsync(session.Character.GenerateIn(session.Character.Authority == AuthorityType.Moderator ? $"[{gameLanguageLocalizer[LanguageKey.SUPPORT, session.Character.AccountLanguage]}]" : string.Empty), - new EveryoneBut(session.Character.Channel!.Id)).ConfigureAwait(false); + new EveryoneBut(session.Character.Channel!.Id)); } session.Character.MapInstance.Sessions.Add(session.Channel); @@ -190,15 +190,15 @@ public async Task ChangeMapByCharacterIdAsync(long characterId, short mapId, sho var sender = sessionRegistry.GetSenderByCharacterId(characterId); if (sender is ClientSession session) { - await ChangeMapAsync(session, mapId, mapX, mapY).ConfigureAwait(false); + await ChangeMapAsync(session, mapId, mapX, mapY); } } private async Task LeaveMapAsync(ClientSession session) { - await session.SendPacketAsync(new MapOutPacket()).ConfigureAwait(false); + await session.SendPacketAsync(new MapOutPacket()); await session.Character.MapInstance.SendPacketAsync(session.Character.GenerateOut(), - new EveryoneBut(session.Channel!.Id)).ConfigureAwait(false); + new EveryoneBut(session.Channel!.Id)); } } diff --git a/src/NosCore.GameObject/Services/MapInstanceGenerationService/Handlers/MinilandEntranceHandler.cs b/src/NosCore.GameObject/Services/MapInstanceGenerationService/Handlers/MinilandEntranceHandler.cs index 0c1e43b0b..be0635372 100644 --- a/src/NosCore.GameObject/Services/MapInstanceGenerationService/Handlers/MinilandEntranceHandler.cs +++ b/src/NosCore.GameObject/Services/MapInstanceGenerationService/Handlers/MinilandEntranceHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -43,16 +43,16 @@ public async Task ExecuteAsync(RequestData requestData) await requestData.ClientSession.SendPacketAsync(new MsgPacket { Message = miniland.MinilandMessage!.Replace(' ', '^') - }).ConfigureAwait(false); + }); miniland.DailyVisitCount++; miniland.VisitCount++; - await requestData.ClientSession.SendPacketAsync(miniland.GenerateMlinfobr()).ConfigureAwait(false); + await requestData.ClientSession.SendPacketAsync(miniland.GenerateMlinfobr()); } else { - await requestData.ClientSession.SendPacketAsync(miniland.GenerateMlinfo()).ConfigureAwait(false); - await requestData.ClientSession.SendPacketAsync(requestData.ClientSession.Character.GenerateMlobjlst()).ConfigureAwait(false); + await requestData.ClientSession.SendPacketAsync(miniland.GenerateMlinfo()); + await requestData.ClientSession.SendPacketAsync(requestData.ClientSession.Character.GenerateMlobjlst()); } //TODO add pets @@ -65,7 +65,7 @@ await requestData.ClientSession.SendPacketAsync(new SayiPacket Message = Game18NConstString.TotalVisitors, ArgumentType = 4, Game18NArguments = { miniland.VisitCount } - }).ConfigureAwait(false); + }); await requestData.ClientSession.SendPacketAsync(new SayiPacket { @@ -75,7 +75,7 @@ await requestData.ClientSession.SendPacketAsync(new SayiPacket Message = Game18NConstString.TodayVisitors, ArgumentType = 4, Game18NArguments = { miniland.DailyVisitCount } - }).ConfigureAwait(false); + }); } } } \ No newline at end of file diff --git a/src/NosCore.GameObject/Services/MapInstanceGenerationService/MapInstance.cs b/src/NosCore.GameObject/Services/MapInstanceGenerationService/MapInstance.cs index 50907e752..103b7f8be 100644 --- a/src/NosCore.GameObject/Services/MapInstanceGenerationService/MapInstance.cs +++ b/src/NosCore.GameObject/Services/MapInstanceGenerationService/MapInstance.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -308,8 +308,8 @@ async Task LifeAsync() return; } - await Task.WhenAll(Monsters.Where(s => s.Life == null).Select(monster => monster.StartLifeAsync())).ConfigureAwait(false); - await Task.WhenAll(Npcs.Where(s => s.Life == null).Select(npc => npc.StartLifeAsync())).ConfigureAwait(false); + await Task.WhenAll(Monsters.Where(s => s.Life == null).Select(monster => monster.StartLifeAsync())); + await Task.WhenAll(Npcs.Where(s => s.Life == null).Select(npc => npc.StartLifeAsync())); } catch (Exception e) { diff --git a/src/NosCore.GameObject/Services/MapInstanceGenerationService/MapInstanceGenerationService.cs b/src/NosCore.GameObject/Services/MapInstanceGenerationService/MapInstanceGenerationService.cs index e5bb0c46a..47bb467b7 100644 --- a/src/NosCore.GameObject/Services/MapInstanceGenerationService/MapInstanceGenerationService.cs +++ b/src/NosCore.GameObject/Services/MapInstanceGenerationService/MapInstanceGenerationService.cs @@ -121,8 +121,8 @@ public async Task InitializeAsync() mapInstanceRegistry.SetAll(mapInstances); - await Task.WhenAll(mapInstanceRegistry.GetAll().Select(s => s.StartLifeAsync())).ConfigureAwait(false); - await Task.WhenAll(mapInstanceRegistry.GetAll().Select(mapInstance => portals.TryGetValue(mapInstance.Map.MapId, out var portal) ? LoadPortalsAsync(mapInstance, portal) : Task.CompletedTask)).ConfigureAwait(false); + await Task.WhenAll(mapInstanceRegistry.GetAll().Select(s => s.StartLifeAsync())); + await Task.WhenAll(mapInstanceRegistry.GetAll().Select(mapInstance => portals.TryGetValue(mapInstance.Map.MapId, out var portal) ? LoadPortalsAsync(mapInstance, portal) : Task.CompletedTask)); } public MapInstance CreateMapInstance(Map.Map map, Guid guid, bool shopAllowed, MapInstanceType normalInstance) @@ -146,7 +146,7 @@ private async Task LoadPortalsAsync(MapInstance mapInstance, List por } return Task.FromResult(portal); - })).ConfigureAwait(false); + })); mapInstance.Portals.AddRange(portalList); } diff --git a/src/NosCore.GameObject/Services/MapItemGenerationService/Handlers/DropHandler.cs b/src/NosCore.GameObject/Services/MapItemGenerationService/Handlers/DropHandler.cs index 38b96662a..6288b0cec 100644 --- a/src/NosCore.GameObject/Services/MapItemGenerationService/Handlers/DropHandler.cs +++ b/src/NosCore.GameObject/Services/MapItemGenerationService/Handlers/DropHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -52,15 +52,15 @@ public async Task ExecuteAsync(RequestData> requestDat if (inv != null) { - await requestData.ClientSession.SendPacketAsync(inv.GeneratePocketChange((PocketType)inv.Type, inv.Slot)).ConfigureAwait(false); + await requestData.ClientSession.SendPacketAsync(inv.GeneratePocketChange((PocketType)inv.Type, inv.Slot)); requestData.ClientSession.Character.MapInstance.MapItems.TryRemove(requestData.Data.Item1.VisualId, out _); await requestData.ClientSession.Character.MapInstance.SendPacketAsync( - requestData.ClientSession.Character.GenerateGet(requestData.Data.Item1.VisualId)).ConfigureAwait(false); + requestData.ClientSession.Character.GenerateGet(requestData.Data.Item1.VisualId)); if (requestData.Data.Item2.PickerType == VisualType.Npc) { await requestData.ClientSession.SendPacketAsync( - requestData.ClientSession.Character.GenerateIcon(1, inv.ItemInstance.ItemVNum)).ConfigureAwait(false); + requestData.ClientSession.Character.GenerateIcon(1, inv.ItemInstance.ItemVNum)); } await requestData.ClientSession.SendPacketAsync(new SayiPacket @@ -71,7 +71,7 @@ await requestData.ClientSession.SendPacketAsync(new SayiPacket Message = Game18NConstString.ReceivedThisItem, ArgumentType = 2, Game18NArguments = { inv.ItemInstance.ItemVNum.ToString(), amount } - }).ConfigureAwait(false); + }); if (requestData.ClientSession.Character.MapInstance.MapInstanceType == MapInstanceType.LodInstance) { @@ -83,7 +83,7 @@ await requestData.ClientSession.Character.MapInstance.SendPacketAsync(new Sayi2P Message = Game18NConstString.CharacterHasReceivedItem, ArgumentType = 13, Game18NArguments = { $"{requestData.ClientSession.Character.Name} {inv.ItemInstance.Item.VNum}" } - }).ConfigureAwait(false); + }); } } else @@ -92,7 +92,7 @@ await requestData.ClientSession.SendPacketAsync(new MsgiPacket { Type = MessageType.Default, Message = Game18NConstString.NotEnoughSpace - }).ConfigureAwait(false); + }); } } } diff --git a/src/NosCore.GameObject/Services/MapItemGenerationService/Handlers/GoldDropHandler.cs b/src/NosCore.GameObject/Services/MapItemGenerationService/Handlers/GoldDropHandler.cs index 38b4d28f7..978df6eb4 100644 --- a/src/NosCore.GameObject/Services/MapItemGenerationService/Handlers/GoldDropHandler.cs +++ b/src/NosCore.GameObject/Services/MapItemGenerationService/Handlers/GoldDropHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -49,7 +49,7 @@ public async Task ExecuteAsync(RequestData> requestDat if (requestData.Data.Item2.PickerType == VisualType.Npc) { await requestData.ClientSession.SendPacketAsync( - requestData.ClientSession.Character.GenerateIcon(1, requestData.Data.Item1.VNum)).ConfigureAwait(false); + requestData.ClientSession.Character.GenerateIcon(1, requestData.Data.Item1.VNum)); } requestData.ClientSession.Character.Gold += requestData.Data.Item1.Amount; @@ -63,7 +63,7 @@ await requestData.ClientSession.SendPacketAsync(new Sayi2Packet Message = Game18NConstString.ItemReceived, ArgumentType = 9, Game18NArguments = { requestData.Data.Item1.Amount, requestData.Data.Item1.ItemInstance!.Item.Name[requestData.ClientSession.Account.Language] } - }).ConfigureAwait(false); + }); #pragma warning restore NosCoreAnalyzers } else @@ -73,13 +73,13 @@ await requestData.ClientSession.SendPacketAsync(new MsgiPacket { Type = MessageType.Default, Message = Game18NConstString.MaxGoldReached - }).ConfigureAwait(false); + }); } - await requestData.ClientSession.SendPacketAsync(requestData.ClientSession.Character.GenerateGold()).ConfigureAwait(false); + await requestData.ClientSession.SendPacketAsync(requestData.ClientSession.Character.GenerateGold()); requestData.ClientSession.Character.MapInstance.MapItems.TryRemove(requestData.Data.Item1.VisualId, out _); await requestData.ClientSession.Character.MapInstance.SendPacketAsync( - requestData.ClientSession.Character.GenerateGet(requestData.Data.Item1.VisualId)).ConfigureAwait(false); + requestData.ClientSession.Character.GenerateGet(requestData.Data.Item1.VisualId)); } } } \ No newline at end of file diff --git a/src/NosCore.GameObject/Services/MapItemGenerationService/Handlers/SpChargerHandler.cs b/src/NosCore.GameObject/Services/MapItemGenerationService/Handlers/SpChargerHandler.cs index 6c3ce559b..fac50efc2 100644 --- a/src/NosCore.GameObject/Services/MapItemGenerationService/Handlers/SpChargerHandler.cs +++ b/src/NosCore.GameObject/Services/MapItemGenerationService/Handlers/SpChargerHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -38,11 +38,11 @@ public bool Condition(MapItem item) public async Task ExecuteAsync(RequestData> requestData) { - await requestData.ClientSession.Character.AddSpPointsAsync(requestData.Data.Item1.ItemInstance!.Item.EffectValue).ConfigureAwait(false); - await requestData.ClientSession.SendPacketAsync(requestData.ClientSession.Character.GenerateSpPoint()).ConfigureAwait(false); + await requestData.ClientSession.Character.AddSpPointsAsync(requestData.Data.Item1.ItemInstance!.Item.EffectValue); + await requestData.ClientSession.SendPacketAsync(requestData.ClientSession.Character.GenerateSpPoint()); requestData.ClientSession.Character.MapInstance.MapItems.TryRemove(requestData.Data.Item1.VisualId, out _); await requestData.ClientSession.Character.MapInstance.SendPacketAsync( - requestData.ClientSession.Character.GenerateGet(requestData.Data.Item1.VisualId)).ConfigureAwait(false); + requestData.ClientSession.Character.GenerateGet(requestData.Data.Item1.VisualId)); } } } \ No newline at end of file diff --git a/src/NosCore.GameObject/Services/MinilandService/MinilandService.cs b/src/NosCore.GameObject/Services/MinilandService/MinilandService.cs index 207f91841..a1e5f4c54 100644 --- a/src/NosCore.GameObject/Services/MinilandService/MinilandService.cs +++ b/src/NosCore.GameObject/Services/MinilandService/MinilandService.cs @@ -100,7 +100,7 @@ public Miniland GetMiniland(long characterId) var miniland = mapInstanceAccessorService.GetMapInstance(minilandInfo!.MapInstanceId); foreach (var obj in miniland!.MapDesignObjects.Values) { - await minilandObjectsDao.TryInsertOrUpdateAsync(obj).ConfigureAwait(false); + await minilandObjectsDao.TryInsertOrUpdateAsync(obj); } if (minilandRegistry.Unregister(characterId, out var removedMiniland)) @@ -113,7 +113,7 @@ public Miniland GetMiniland(long characterId) public async Task InitializeAsync(Character character, IMapInstanceGeneratorService generator) { - var minilandInfoDto = await minilandDao.FirstOrDefaultAsync(s => s.OwnerId == character.CharacterId).ConfigureAwait(false); + var minilandInfoDto = await minilandDao.FirstOrDefaultAsync(s => s.OwnerId == character.CharacterId); if (minilandInfoDto == null) { throw new ArgumentException(); @@ -128,7 +128,7 @@ public async Task InitializeAsync(Character character, IMapInstanceGen minilandInfo.CharacterEntity = character; minilandRegistry.Register(character.CharacterId, minilandInfo); - await generator.AddMapInstanceAsync(miniland).ConfigureAwait(false); + await generator.AddMapInstanceAsync(miniland); var listobjects = character.InventoryService.Values.Where(s => s.Type == NoscorePocketType.Miniland).ToArray(); var idlist = listobjects.Select(s => s.Id).ToList(); @@ -161,7 +161,7 @@ public async Task SetStateAsync(long characterId, MinilandState state) return; case MinilandState.Private: { - List friends = (await friendHttpClient.GetFriendsAsync(characterId).ConfigureAwait(false)) + List friends = (await friendHttpClient.GetFriendsAsync(characterId)) .Select(s => s.CharacterId) .ToList(); miniland!.Kick(o => o.VisualId != characterId && !friends.Contains(o.VisualId)); diff --git a/src/NosCore.GameObject/Services/NRunService/Handlers/ChangeClassHandler.cs b/src/NosCore.GameObject/Services/NRunService/Handlers/ChangeClassHandler.cs index 711cf47a0..f2fca680b 100644 --- a/src/NosCore.GameObject/Services/NRunService/Handlers/ChangeClassHandler.cs +++ b/src/NosCore.GameObject/Services/NRunService/Handlers/ChangeClassHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -56,7 +56,7 @@ await requestData.ClientSession.SendPacketAsync(new SayiPacket VisualId = requestData.ClientSession.Character.CharacterId, Type = SayColorType.Red, Message = Game18NConstString.CantUseInGroup - }).ConfigureAwait(false); + }); return; } @@ -66,7 +66,7 @@ await requestData.ClientSession.SendPacketAsync(new MsgiPacket { Type = MessageType.Default, Message = Game18NConstString.CanNotChangeJobAtThisLevel - }).ConfigureAwait(false); + }); await requestData.ClientSession.SendPacketAsync(new SayiPacket { @@ -74,7 +74,7 @@ await requestData.ClientSession.SendPacketAsync(new SayiPacket VisualId = requestData.ClientSession.Character.CharacterId, Type = SayColorType.Yellow, Message = Game18NConstString.CanNotChangeJobAtThisJobLevel - }).ConfigureAwait(false); + }); return; } @@ -85,7 +85,7 @@ await requestData.ClientSession.SendPacketAsync(new SayiPacket return; } - await requestData.ClientSession.Character.ChangeClassAsync(classType).ConfigureAwait(false); + await requestData.ClientSession.Character.ChangeClassAsync(classType); } } } \ No newline at end of file diff --git a/src/NosCore.GameObject/Services/NRunService/Handlers/TeleporterHandler.cs b/src/NosCore.GameObject/Services/NRunService/Handlers/TeleporterHandler.cs index 9bc3f9fd1..32c18dd8b 100644 --- a/src/NosCore.GameObject/Services/NRunService/Handlers/TeleporterHandler.cs +++ b/src/NosCore.GameObject/Services/NRunService/Handlers/TeleporterHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -56,10 +56,10 @@ private async Task RemoveGoldAndTeleportAsync(ClientSession clientSession, short { if (clientSession.Character.Gold >= goldToPay) { - await clientSession.Character.RemoveGoldAsync(goldToPay).ConfigureAwait(false); + await clientSession.Character.RemoveGoldAsync(goldToPay); await mapChangeService.ChangeMapAsync(clientSession, mapId, (short)RandomHelper.Instance.RandomNumber(x1, x2), - (short)RandomHelper.Instance.RandomNumber(y1, y2)).ConfigureAwait(false); + (short)RandomHelper.Instance.RandomNumber(y1, y2)); return; } @@ -69,7 +69,7 @@ await clientSession.SendPacketAsync(new SayiPacket VisualId = clientSession.Character.CharacterId, Type = SayColorType.Yellow, Message = Game18NConstString.NotEnoughGold - }).ConfigureAwait(false); + }); } } } \ No newline at end of file diff --git a/src/NosCore.GameObject/Services/QuestService/QuestService.cs b/src/NosCore.GameObject/Services/QuestService/QuestService.cs index 54b5529c3..d41311226 100644 --- a/src/NosCore.GameObject/Services/QuestService/QuestService.cs +++ b/src/NosCore.GameObject/Services/QuestService/QuestService.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -53,15 +53,15 @@ public async Task RunScriptAsync(Character character, ScriptClientPacket? packet { if (worldConfiguration.Value.SceneOnCreate) { - await character.SendPacketAsync(new ScenePacket { SceneId = 40 }).ConfigureAwait(false); - await Task.Delay(TimeSpan.FromSeconds(71)).ConfigureAwait(false); + await character.SendPacketAsync(new ScenePacket { SceneId = 40 }); + await Task.Delay(TimeSpan.FromSeconds(71)); } - await Task.Delay(TimeSpan.FromSeconds(2)).ConfigureAwait(false); + await Task.Delay(TimeSpan.FromSeconds(2)); } if (packet != null) { - if (!await CheckScriptStateAsync(packet, character).ConfigureAwait(false)) + if (!await CheckScriptStateAsync(packet, character)) { return; } @@ -71,7 +71,7 @@ public async Task RunScriptAsync(Character character, ScriptClientPacket? packet if (quest != null) { quest.CompletedOn = clock.GetCurrentInstant(); - await character.SendPacketAsync(quest.GenerateQstiPacket(false)).ConfigureAwait(false); + await character.SendPacketAsync(quest.GenerateQstiPacket(false)); } } } @@ -89,7 +89,7 @@ await character.SendPacketAsync(new ScriptPacket() { ScriptId = nextScript.ScriptId, ScriptStepId = nextScript.ScriptStepId - }).ConfigureAwait(false); + }); } private async Task CheckScriptStateAsync(ScriptClientPacket packet, ICharacterEntity character) @@ -116,7 +116,7 @@ private async Task CheckScriptStateAsync(ScriptClientPacket packet, IChara return false; } - return await IsValidScriptAsync(character, packet.Type, (int)scriptId, (int)scriptStepId).ConfigureAwait(false); + return await IsValidScriptAsync(character, packet.Type, (int)scriptId, (int)scriptStepId); } private async Task IsValidScriptAsync(ICharacterEntity character, QuestActionType type, int scriptId, int scriptStepId) @@ -129,10 +129,10 @@ private async Task IsValidScriptAsync(ICharacterEntity character, QuestAct return script.StepType switch { - "q_complete" => await ValidateQuestAsync(character, script.Argument1 ?? 0).ConfigureAwait(false), - "quest" => await AddQuestAsync(character, type, script.Argument1 ?? 0).ConfigureAwait(false), - "time" => await TimeAsync(script.Argument1 ?? 0).ConfigureAwait(false), - "targetoff" => await TargetOffPacketAsync(script.Argument1 ?? 0, character).ConfigureAwait(false), + "q_complete" => await ValidateQuestAsync(character, script.Argument1 ?? 0), + "quest" => await AddQuestAsync(character, type, script.Argument1 ?? 0), + "time" => await TimeAsync(script.Argument1 ?? 0), + "targetoff" => await TargetOffPacketAsync(script.Argument1 ?? 0, character), "web" => true, "talk" => true, "openwin" => true, @@ -148,7 +148,7 @@ private async Task IsValidScriptAsync(ICharacterEntity character, QuestAct private async Task TimeAsync(short delay) { - await Task.Delay(TimeSpan.FromSeconds(delay)).ConfigureAwait(false); + await Task.Delay(TimeSpan.FromSeconds(delay)); return true; } @@ -157,7 +157,7 @@ private async Task TargetOffPacketAsync(short questId, ICharacterEntity ch var questDto = quests.FirstOrDefault(s => s.QuestId == questId); if (questDto != null) { - return await ValidateQuestAsync(character, questId).ConfigureAwait(false); + return await ValidateQuestAsync(character, questId); } logger.Error(logLanguage[LogLanguageKey.QUEST_NOT_FOUND]); @@ -177,7 +177,7 @@ public async Task AddQuestAsync(ICharacterEntity character, QuestActionTyp character.Quests.FirstOrDefault(s => s.Value.QuestId == questId && s.Value.CompletedOn == null); if (!characterQuest.Equals(new KeyValuePair())) { - var isValid = await ValidateQuestAsync(character, questId).ConfigureAwait(false); + var isValid = await ValidateQuestAsync(character, questId); if (type != QuestActionType.Achieve) { return isValid; @@ -192,9 +192,9 @@ await character.SendPacketAsync(new MsgiPacket { Type = MessageType.Default, Message = Game18NConstString.QuestComplete - }).ConfigureAwait(false); - await character.SendPacketAsync(characterQuest.Value.GenerateQstiPacket(false)).ConfigureAwait(false); - await character.SendPacketAsync(character.GenerateQuestPacket()).ConfigureAwait(false); + }); + await character.SendPacketAsync(characterQuest.Value.GenerateQstiPacket(false)); + await character.SendPacketAsync(character.GenerateQuestPacket()); } var questDto = quests.FirstOrDefault(s => s.QuestId == questId); @@ -219,7 +219,7 @@ await character.SendPacketAsync(new MsgiPacket { Type = MessageType.Default, Message = Game18NConstString.LevelTooLow - }).ConfigureAwait(false); + }); return false; } @@ -229,7 +229,7 @@ await character.SendPacketAsync(new MsgiPacket { Type = MessageType.Default, Message = Game18NConstString.LevelTooHigh - }).ConfigureAwait(false); + }); return false; } @@ -239,7 +239,7 @@ await character.SendPacketAsync(new MsgiPacket { Type = MessageType.Default, Message = Game18NConstString.DailyQuestOncePerDay - }).ConfigureAwait(false); + }); return false; } @@ -250,10 +250,10 @@ await character.SendPacketAsync(new MsgiPacket Quest = quest, QuestId = quest.QuestId }); - await character.SendPacketAsync(character.GenerateQuestPacket()).ConfigureAwait(false); + await character.SendPacketAsync(character.GenerateQuestPacket()); if (quest.TargetMap != null) { - await character.SendPacketAsync(quest.GenerateTargetPacket()).ConfigureAwait(false); + await character.SendPacketAsync(quest.GenerateTargetPacket()); } return true; } @@ -306,7 +306,7 @@ public async Task ValidateQuestAsync(ICharacterEntity character, short que && (character.MapId == (characterQuest.Quest.TargetMap ?? 0)); if (isValid) { - await character.SendPacketAsync(characterQuest.Quest.GenerateTargetOffPacket()).ConfigureAwait(false); + await character.SendPacketAsync(characterQuest.Quest.GenerateTargetOffPacket()); } break; case QuestType.CollectMapEntity: diff --git a/src/NosCore.GameObject/Services/SaveService/SaveService.cs b/src/NosCore.GameObject/Services/SaveService/SaveService.cs index 0fd18cb1f..5c61e1107 100644 --- a/src/NosCore.GameObject/Services/SaveService/SaveService.cs +++ b/src/NosCore.GameObject/Services/SaveService/SaveService.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -50,43 +50,43 @@ public async Task SaveAsync(ICharacterEntity chara) try { var account = character.Account; - await accountDao.TryInsertOrUpdateAsync(account).ConfigureAwait(false); + await accountDao.TryInsertOrUpdateAsync(account); - await characterDao.TryInsertOrUpdateAsync(character).ConfigureAwait(false); + await characterDao.TryInsertOrUpdateAsync(character); var quicklistEntriesToDelete = quicklistEntriesDao .Where(i => i.CharacterId == character.VisualId)!.ToList() .Where(i => character.QuicklistEntries.All(o => o.Id != i.Id)).ToList(); - await quicklistEntriesDao.TryDeleteAsync(quicklistEntriesToDelete.Select(s => s.Id).ToArray()).ConfigureAwait(false); - await quicklistEntriesDao.TryInsertOrUpdateAsync(character.QuicklistEntries).ConfigureAwait(false); + await quicklistEntriesDao.TryDeleteAsync(quicklistEntriesToDelete.Select(s => s.Id).ToArray()); + await quicklistEntriesDao.TryInsertOrUpdateAsync(character.QuicklistEntries); // load and concat inventory with equipment var itemsToDelete = inventoryItemInstanceDao .Where(i => i.CharacterId == character.VisualId)!.ToList() .Where(i => character.InventoryService.Values.All(o => o.Id != i.Id)).ToList(); - await inventoryItemInstanceDao.TryDeleteAsync(itemsToDelete.Select(s => s.Id).ToArray()).ConfigureAwait(false); - await itemInstanceDao.TryDeleteAsync(itemsToDelete.Select(s => s.ItemInstanceId).ToArray()).ConfigureAwait(false); + await inventoryItemInstanceDao.TryDeleteAsync(itemsToDelete.Select(s => s.Id).ToArray()); + await itemInstanceDao.TryDeleteAsync(itemsToDelete.Select(s => s.ItemInstanceId).ToArray()); - await itemInstanceDao.TryInsertOrUpdateAsync(character.InventoryService.Values.Select(s => s.ItemInstance).ToArray()).ConfigureAwait(false); - await inventoryItemInstanceDao.TryInsertOrUpdateAsync(character.InventoryService.Values.ToArray()).ConfigureAwait(false); + await itemInstanceDao.TryInsertOrUpdateAsync(character.InventoryService.Values.Select(s => s.ItemInstance).ToArray()); + await inventoryItemInstanceDao.TryInsertOrUpdateAsync(character.InventoryService.Values.ToArray()); var staticBonusToDelete = staticBonusDao .Where(i => i.CharacterId == character.VisualId)!.ToList() .Where(i => character.StaticBonusList.All(o => o.StaticBonusId != i.StaticBonusId)).ToList(); - await staticBonusDao.TryDeleteAsync(staticBonusToDelete.Select(s => s.StaticBonusId)).ConfigureAwait(false); - await staticBonusDao.TryInsertOrUpdateAsync(character.StaticBonusList).ConfigureAwait(false); + await staticBonusDao.TryDeleteAsync(staticBonusToDelete.Select(s => s.StaticBonusId)); + await staticBonusDao.TryInsertOrUpdateAsync(character.StaticBonusList); - await titleDao.TryInsertOrUpdateAsync(character.Titles).ConfigureAwait(false); + await titleDao.TryInsertOrUpdateAsync(character.Titles); var minilandDto = (MinilandDto)minilandProvider.GetMiniland(character.VisualId); - await minilandDao.TryInsertOrUpdateAsync(minilandDto).ConfigureAwait(false); + await minilandDao.TryInsertOrUpdateAsync(minilandDto); var questsToDelete = characterQuestDao .Where(i => i.CharacterId == character.VisualId)!.ToList() .Where(i => character.Quests.Values.All(o => o.QuestId != i.QuestId)).ToList(); - await characterQuestDao.TryDeleteAsync(questsToDelete.Select(s => s.Id)).ConfigureAwait(false); - await characterQuestDao.TryInsertOrUpdateAsync(character.Quests.Values).ConfigureAwait(false); + await characterQuestDao.TryDeleteAsync(questsToDelete.Select(s => s.Id)); + await characterQuestDao.TryInsertOrUpdateAsync(character.Quests.Values); } catch (Exception e) { diff --git a/src/NosCore.GameObject/Services/TransformationService/TransformationService.cs b/src/NosCore.GameObject/Services/TransformationService/TransformationService.cs index 5c0b51f2f..4dd641774 100644 --- a/src/NosCore.GameObject/Services/TransformationService/TransformationService.cs +++ b/src/NosCore.GameObject/Services/TransformationService/TransformationService.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -51,8 +51,8 @@ public async Task RemoveSpAsync(Character character) character.Morph = 0; character.MorphUpgrade = 0; character.MorphDesign = 0; - await character.SendPacketAsync(character.GenerateCond()).ConfigureAwait(false); - await character.SendPacketAsync(character.GenerateLev(experienceService, jobExperienceService, heroExperienceService)).ConfigureAwait(false); + await character.SendPacketAsync(character.GenerateCond()); + await character.SendPacketAsync(character.GenerateLev(experienceService, jobExperienceService, heroExperienceService)); character.SpCooldown = 30; await character.SendPacketAsync(new SayiPacket { @@ -62,16 +62,16 @@ await character.SendPacketAsync(new SayiPacket Message = Game18NConstString.DurationOfSideEffect, ArgumentType = 4, Game18NArguments = { character.SpCooldown } - }).ConfigureAwait(false); - await character.SendPacketAsync(new SdPacket { Cooldown = character.SpCooldown }).ConfigureAwait(false); - await character.MapInstance.SendPacketAsync(character.GenerateCMode()).ConfigureAwait(false); + }); + await character.SendPacketAsync(new SdPacket { Cooldown = character.SpCooldown }); + await character.MapInstance.SendPacketAsync(character.GenerateCMode()); await character.MapInstance.SendPacketAsync(new GuriPacket { Type = GuriPacketType.Dance, Value = 1, EntityId = character.CharacterId - }).ConfigureAwait(false); - await character.SendPacketAsync(character.GenerateStat()).ConfigureAwait(false); + }); + await character.SendPacketAsync(character.GenerateStat()); async Task CoolDown() { @@ -81,8 +81,8 @@ await character.SendPacketAsync(new SayiPacket VisualId = character.CharacterId, Type = SayColorType.Red, Message = Game18NConstString.TransformationSideEffectGone - }).ConfigureAwait(false); - await character.SendPacketAsync(new SdPacket { Cooldown = 0 }).ConfigureAwait(false); + }); + await character.SendPacketAsync(new SdPacket { Cooldown = 0 }); } Observable.Timer(TimeSpan.FromMilliseconds(character.SpCooldown * 1000)).Select(_ => CoolDown()).Subscribe(); @@ -105,7 +105,7 @@ await character.SendPacketAsync(new SayiPacket VisualId = character.CharacterId, Type = SayColorType.Yellow, Message = Game18NConstString.CanNotBeWornReputationLow - }).ConfigureAwait(false); + }); return; } @@ -118,7 +118,7 @@ await character.SendPacketAsync(new MsgiPacket { Type = MessageType.Default, Message = Game18NConstString.SpecialistAndFairyDifferentElement - }).ConfigureAwait(false); + }); return; } @@ -127,18 +127,18 @@ await character.SendPacketAsync(new MsgiPacket character.Morph = sp.Item.Morph; character.MorphUpgrade = sp.Upgrade; character.MorphDesign = sp.Design; - await character.MapInstance.SendPacketAsync(character.GenerateCMode()).ConfigureAwait(false); - await character.SendPacketAsync(character.GenerateLev(experienceService, jobExperienceService, heroExperienceService)).ConfigureAwait(false); - await character.MapInstance.SendPacketAsync(character.GenerateEff(196)).ConfigureAwait(false); + await character.MapInstance.SendPacketAsync(character.GenerateCMode()); + await character.SendPacketAsync(character.GenerateLev(experienceService, jobExperienceService, heroExperienceService)); + await character.MapInstance.SendPacketAsync(character.GenerateEff(196)); await character.MapInstance.SendPacketAsync(new GuriPacket { Type = GuriPacketType.Dance, Value = 1, EntityId = character.CharacterId - }).ConfigureAwait(false); - await character.SendPacketAsync(character.GenerateSpPoint()).ConfigureAwait(false); - await character.SendPacketAsync(character.GenerateCond()).ConfigureAwait(false); - await character.SendPacketAsync(character.GenerateStat()).ConfigureAwait(false); + }); + await character.SendPacketAsync(character.GenerateSpPoint()); + await character.SendPacketAsync(character.GenerateCond()); + await character.SendPacketAsync(character.GenerateStat()); } public async Task ChangeVehicleAsync(Character character, Item item) @@ -154,10 +154,10 @@ public async Task ChangeVehicleAsync(Character character, Item item) : item.SecondMorph; await character.MapInstance.SendPacketAsync( - character.GenerateEff(196)).ConfigureAwait(false); + character.GenerateEff(196)); await character.MapInstance.SendPacketAsync(character - .GenerateCMode()).ConfigureAwait(false); - await character.SendPacketAsync(character.GenerateCond()).ConfigureAwait(false); + .GenerateCMode()); + await character.SendPacketAsync(character.GenerateCond()); } public async Task RemoveVehicleAsync(Character character) @@ -183,8 +183,8 @@ public async Task RemoveVehicleAsync(Character character) character.IsVehicled = false; character.VehicleSpeed = 0; - await character.SendPacketAsync(character.GenerateCond()).ConfigureAwait(false); - await character.MapInstance.SendPacketAsync(character.GenerateCMode()).ConfigureAwait(false); + await character.SendPacketAsync(character.GenerateCond()); + await character.MapInstance.SendPacketAsync(character.GenerateCMode()); } } } diff --git a/src/NosCore.GameObject/Services/WarehouseService/WarehouseService.cs b/src/NosCore.GameObject/Services/WarehouseService/WarehouseService.cs index fa8d1c834..c5e15b695 100644 --- a/src/NosCore.GameObject/Services/WarehouseService/WarehouseService.cs +++ b/src/NosCore.GameObject/Services/WarehouseService/WarehouseService.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -57,14 +57,14 @@ public List GetItems(Guid? id, long? ownerId, WarehouseType wareh public async Task WithdrawItemAsync(Guid id) { - var item = await warehouseItemDao.FirstOrDefaultAsync(s => s.Id == id).ConfigureAwait(false); + var item = await warehouseItemDao.FirstOrDefaultAsync(s => s.Id == id); if (item == null) { return false; } - await warehouseItemDao.TryDeleteAsync(item.Id).ConfigureAwait(false); - await warehouseDao.TryDeleteAsync(item.WarehouseId).ConfigureAwait(false); - await itemInstanceDao.TryDeleteAsync(item.ItemInstanceId).ConfigureAwait(false); + await warehouseItemDao.TryDeleteAsync(item.Id); + await warehouseDao.TryDeleteAsync(item.WarehouseId); + await itemInstanceDao.TryDeleteAsync(item.ItemInstanceId); return true; } diff --git a/src/NosCore.LoginServer/LoginServer.cs b/src/NosCore.LoginServer/LoginServer.cs index 2e2a46a42..ca961cd10 100644 --- a/src/NosCore.LoginServer/LoginServer.cs +++ b/src/NosCore.LoginServer/LoginServer.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -68,7 +68,7 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken) timeSpan.TotalSeconds) ).ExecuteAsync(() => channelHubClient.Bind(channel)); - await Task.WhenAny(connectTask, networkManager.RunServerAsync()).ConfigureAwait(false); + await Task.WhenAny(connectTask, networkManager.RunServerAsync()); } } } \ No newline at end of file diff --git a/src/NosCore.LoginServer/LoginServerBootstrap.cs b/src/NosCore.LoginServer/LoginServerBootstrap.cs index 9a3814a7d..903e37ae5 100644 --- a/src/NosCore.LoginServer/LoginServerBootstrap.cs +++ b/src/NosCore.LoginServer/LoginServerBootstrap.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -187,7 +187,7 @@ public static async Task Main(string[] args) { try { - await BuildHost(args).RunAsync().ConfigureAwait(false); + await BuildHost(args).RunAsync(); } catch (Exception ex) { diff --git a/src/NosCore.PacketHandlers/Bazaar/CBListPacketHandler.cs b/src/NosCore.PacketHandlers/Bazaar/CBListPacketHandler.cs index 5ea6ec31f..c8dae4743 100644 --- a/src/NosCore.PacketHandlers/Bazaar/CBListPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Bazaar/CBListPacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -40,7 +40,7 @@ public override async Task ExecuteAsync(CBListPacket packet, ClientSession clien var itemssearch = packet.ItemVNumFilter?.FirstOrDefault() == 0 ? new List() : packet.ItemVNumFilter; var bzlist = await bazaarHttpClient.GetBazaar(-1, (byte?)packet.Index, 50, packet.TypeFilter, packet.SubTypeFilter, - packet.LevelFilter, packet.RareFilter, packet.UpgradeFilter, null).ConfigureAwait(false); + packet.LevelFilter, packet.RareFilter, packet.UpgradeFilter, null); var bzlistsearched = bzlist.Where(s => itemssearch!.Contains(s.ItemInstance!.ItemVNum)).ToList(); //price up price down quantity up quantity down @@ -91,7 +91,7 @@ await clientSession.SendPacketAsync(new RcbListPacket Upgrade = bzlink.ItemInstance.Upgrade, EInfo = new EInfoPacket() }).ToList() as List - }).ConfigureAwait(false); + }); } } } \ No newline at end of file diff --git a/src/NosCore.PacketHandlers/Bazaar/CBuyPacketHandler.cs b/src/NosCore.PacketHandlers/Bazaar/CBuyPacketHandler.cs index b08d47aae..ef9876260 100644 --- a/src/NosCore.PacketHandlers/Bazaar/CBuyPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Bazaar/CBuyPacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -48,7 +48,7 @@ public class CBuyPacketHandler(IBazaarHub bazaarHttpClient, IItemGenerationServi { public override async Task ExecuteAsync(CBuyPacket packet, ClientSession clientSession) { - var bzs = await bazaarHttpClient.GetBazaar(packet.BazaarId, null, null, null, null, null, null, null, null).ConfigureAwait(false); + var bzs = await bazaarHttpClient.GetBazaar(packet.BazaarId, null, null, null, null, null, null, null, null); var bz = bzs.FirstOrDefault(); if ((bz != null) && (bz.SellerName != clientSession.Character.Name) && (packet.Price == bz.BazaarItem?.Price) && (bz.ItemInstance?.Amount >= packet.Amount)) @@ -64,21 +64,21 @@ public override async Task ExecuteAsync(CBuyPacket packet, ClientSession clientS if (clientSession.Character.Gold - price > 0) { clientSession.Character.Gold -= price; - await clientSession.SendPacketAsync(clientSession.Character.GenerateGold()).ConfigureAwait(false); + await clientSession.SendPacketAsync(clientSession.Character.GenerateGold()); - var itemInstance = await itemInstanceDao.FirstOrDefaultAsync(s => s!.Id == bz.ItemInstance.Id).ConfigureAwait(false); + var itemInstance = await itemInstanceDao.FirstOrDefaultAsync(s => s!.Id == bz.ItemInstance.Id); var item = itemProvider.Convert(itemInstance!); item.Id = Guid.NewGuid(); var newInv = clientSession.Character.InventoryService.AddItemToPocket( InventoryItemInstance.Create(item, clientSession.Character.CharacterId)); - await clientSession.SendPacketAsync(newInv!.GeneratePocketChange()).ConfigureAwait(false); + await clientSession.SendPacketAsync(newInv!.GeneratePocketChange()); var remove = await bazaarHttpClient.DeleteBazaarAsync(packet.BazaarId, packet.Amount, - clientSession.Character.Name).ConfigureAwait(false); + clientSession.Character.Name); if (remove) { - await clientSession.HandlePacketsAsync(new[] { new CBListPacket { Index = 0, ItemVNumFilter = new List() } }).ConfigureAwait(false); + await clientSession.HandlePacketsAsync(new[] { new CBListPacket { Index = 0, ItemVNumFilter = new List() } }); await clientSession.SendPacketAsync(new RCBuyPacket(bz.SellerName!) { Type = VisualType.Player, @@ -88,7 +88,7 @@ await clientSession.SendPacketAsync(new RCBuyPacket(bz.SellerName!) Slot = 0, //TODO: Add slot Upgrade = bz.ItemInstance.Upgrade, Rarity = (byte)bz.ItemInstance.Rare - }).ConfigureAwait(false); + }); await clientSession.SendPacketAsync(new SayiPacket { @@ -98,7 +98,7 @@ await clientSession.SendPacketAsync(new SayiPacket Message = Game18NConstString.BoughtItem, ArgumentType = 2, Game18NArguments = { bz.ItemInstance.ItemVNum.ToString(), packet.Amount } - }).ConfigureAwait(false); + }); return; } @@ -113,12 +113,12 @@ await clientSession.SendPacketAsync(new SayiPacket VisualId = clientSession.Character.CharacterId, Type = SayColorType.Yellow, Message = Game18NConstString.InsufficientGoldAvailable - }).ConfigureAwait(false); + }); await clientSession.SendPacketAsync(new ModaliPacket { Type = 1, Message = Game18NConstString.InsufficientGoldAvailable - }).ConfigureAwait(false); + }); return; } } @@ -127,7 +127,7 @@ await clientSession.SendPacketAsync(new ModaliPacket await clientSession.SendPacketAsync(new InfoiPacket { Message = Game18NConstString.NotEnoughSpace - }).ConfigureAwait(false); + }); return; } } @@ -136,7 +136,7 @@ await clientSession.SendPacketAsync(new ModaliPacket { Type = 1, Message = Game18NConstString.OfferUpdated - }).ConfigureAwait(false); + }); } } } diff --git a/src/NosCore.PacketHandlers/Bazaar/CModPacketHandler.cs b/src/NosCore.PacketHandlers/Bazaar/CModPacketHandler.cs index 8f6b72b72..41ef7b966 100644 --- a/src/NosCore.PacketHandlers/Bazaar/CModPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Bazaar/CModPacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -42,7 +42,7 @@ public class CModPacketHandler(IBazaarHub bazaarHttpClient, ILogger logger, { public override async Task ExecuteAsync(CModPacket packet, ClientSession clientSession) { - var bzs = await bazaarHttpClient.GetBazaar(packet.BazaarId,null,null,null,null,null,null,null,null).ConfigureAwait(false); + var bzs = await bazaarHttpClient.GetBazaar(packet.BazaarId,null,null,null,null,null,null,null,null); var bz = bzs.FirstOrDefault(); if ((bz != null) && (bz.SellerName == clientSession.Character.Name) && (bz.BazaarItem?.Price != packet.NewPrice)) @@ -53,18 +53,18 @@ await clientSession.SendPacketAsync(new ModaliPacket { Type = 1, Message = Game18NConstString.CannotChangePriceSoldItems - }).ConfigureAwait(false); + }); return; } if (bz.BazaarItem?.Amount == packet.Amount) { var patch = new JsonPatch(PatchOperation.Replace(JsonPointer.Parse("/BazaarItem/Price"), packet.NewPrice.AsJsonElement().AsNode())); - var bzMod = await bazaarHttpClient.ModifyBazaarAsync(packet.BazaarId, patch).ConfigureAwait(false); + var bzMod = await bazaarHttpClient.ModifyBazaarAsync(packet.BazaarId, patch); if ((bzMod != null) && (bzMod.BazaarItem?.Price != bz.BazaarItem.Price)) { - await clientSession.HandlePacketsAsync(new[] {new CSListPacket {Index = 0, Filter = BazaarStatusType.Default}}).ConfigureAwait(false); + await clientSession.HandlePacketsAsync(new[] {new CSListPacket {Index = 0, Filter = BazaarStatusType.Default}}); await clientSession.SendPacketAsync(new SayiPacket { VisualType = VisualType.Player, @@ -73,7 +73,7 @@ await clientSession.SendPacketAsync(new SayiPacket Message = Game18NConstString.NewSellingPrice, ArgumentType = 4, Game18NArguments = { bzMod.BazaarItem?.Price ?? 0 } - }).ConfigureAwait(false); + }); return; } } @@ -82,7 +82,7 @@ await clientSession.SendPacketAsync(new ModaliPacket { Type = 1, Message = Game18NConstString.OfferUpdated - }).ConfigureAwait(false); + }); } else diff --git a/src/NosCore.PacketHandlers/Bazaar/CRegPacketHandler.cs b/src/NosCore.PacketHandlers/Bazaar/CRegPacketHandler.cs index 2b3789d46..0d7592e83 100644 --- a/src/NosCore.PacketHandlers/Bazaar/CRegPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Bazaar/CRegPacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -65,7 +65,7 @@ await clientSession.SendPacketAsync(new MsgiPacket { Type = MessageType.Default, Message = Game18NConstString.NotEnoughGold - }).ConfigureAwait(false); + }); return; } @@ -87,7 +87,7 @@ await clientSession.SendPacketAsync(new ModaliPacket Message = Game18NConstString.NotExceedMaxPrice, ArgumentType = 4, Game18NArguments = { maxPrice } - }).ConfigureAwait(false); + }); return; } @@ -126,7 +126,7 @@ await clientSession.SendPacketAsync(new ModaliPacket return; } IItemInstanceDto bazaaritem = bazar.ItemInstance; - bazaaritem = (await itemInstanceDao.TryInsertOrUpdateAsync(bazaaritem).ConfigureAwait(false))!; + bazaaritem = (await itemInstanceDao.TryInsertOrUpdateAsync(bazaaritem))!; var result = await bazaarHttpClient.AddBazaarAsync(new BazaarRequest { @@ -138,7 +138,7 @@ await clientSession.SendPacketAsync(new ModaliPacket IsPackage = cRegPacket.IsPackage, Duration = duration, Amount = cRegPacket.Amount - }).ConfigureAwait(false); + }); switch (result) { @@ -147,13 +147,13 @@ await clientSession.SendPacketAsync(new ModaliPacket { Type = 1, Message = Game18NConstString.ListedMaxItemsNumber - }).ConfigureAwait(false); + }); break; case LanguageKey.OBJECT_IN_BAZAAR: if (bazar.ItemInstance.Amount == cRegPacket.Amount) { - await inventoryItemInstanceDao.TryDeleteAsync(bazar.Id).ConfigureAwait(false); + await inventoryItemInstanceDao.TryDeleteAsync(bazar.Id); clientSession.Character.InventoryService.DeleteById(bazar.ItemInstanceId); } else @@ -164,23 +164,23 @@ await clientSession.SendPacketAsync(new ModaliPacket await clientSession.SendPacketAsync(((InventoryItemInstance?)null).GeneratePocketChange( cRegPacket.Inventory == 4 ? PocketType.Equipment : (PocketType)cRegPacket.Inventory, - cRegPacket.Slot)).ConfigureAwait(false); + cRegPacket.Slot)); clientSession.Character.Gold -= tax; - await clientSession.SendPacketAsync(clientSession.Character.GenerateGold()).ConfigureAwait(false); + await clientSession.SendPacketAsync(clientSession.Character.GenerateGold()); await clientSession.SendPacketAsync(new SayiPacket { VisualType = VisualType.Player, VisualId = clientSession.Character.CharacterId, Type = SayColorType.Yellow, Message = Game18NConstString.ItemAddedToBazar - }).ConfigureAwait(false); + }); await clientSession.SendPacketAsync(new MsgiPacket { Type = MessageType.Default, Message = Game18NConstString.ItemAddedToBazar - }).ConfigureAwait(false); + }); - await clientSession.SendPacketAsync(new RCRegPacket { Type = VisualType.Player }).ConfigureAwait(false); + await clientSession.SendPacketAsync(new RCRegPacket { Type = VisualType.Player }); break; } } diff --git a/src/NosCore.PacketHandlers/Bazaar/CSListPacketHandler.cs b/src/NosCore.PacketHandlers/Bazaar/CSListPacketHandler.cs index 19431d8c5..91dfbb0ae 100644 --- a/src/NosCore.PacketHandlers/Bazaar/CSListPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Bazaar/CSListPacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -37,7 +37,7 @@ public override async Task ExecuteAsync(CSListPacket packet, ClientSession clien { var list = new List(); var bzlist = await bazaarHttpClient.GetBazaar(-1, packet.Index, 50, 0, 0, 0, 0, 0, - clientSession.Character.CharacterId).ConfigureAwait(false); + clientSession.Character.CharacterId); foreach (var bz in bzlist) { @@ -84,7 +84,7 @@ await clientSession.SendPacketAsync(new RcsListPacket { PageNumber = packet.Index, Items = list - }).ConfigureAwait(false); + }); } } } \ No newline at end of file diff --git a/src/NosCore.PacketHandlers/Bazaar/CScalcPacketHandler.cs b/src/NosCore.PacketHandlers/Bazaar/CScalcPacketHandler.cs index 77b6fcb7d..b02f47d76 100644 --- a/src/NosCore.PacketHandlers/Bazaar/CScalcPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Bazaar/CScalcPacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -50,7 +50,7 @@ public class CScalcPacketHandler(IOptions worldConfiguration { public override async Task ExecuteAsync(CScalcPacket packet, ClientSession clientSession) { - var bzs = await bazaarHttpClient.GetBazaar(packet.BazaarId, null, null, null, null, null, null, null, null).ConfigureAwait(false); + var bzs = await bazaarHttpClient.GetBazaar(packet.BazaarId, null, null, null, null, null, null, null, null); var bz = bzs.FirstOrDefault(); if ((bz != null) && (bz.SellerName == clientSession.Character.Name)) { @@ -70,7 +70,7 @@ await clientSession.SendPacketAsync(new SayiPacket Message = Game18NConstString.PurchaseCompleted, ArgumentType = 2, Game18NArguments = { bz.ItemInstance.ItemVNum.ToString(), bz.ItemInstance.Amount } - }).ConfigureAwait(false); + }); await clientSession.SendPacketAsync(new SayiPacket { VisualType = VisualType.Player, @@ -79,10 +79,10 @@ await clientSession.SendPacketAsync(new SayiPacket Message = Game18NConstString.PurchaseCompletedWithGoldUsed, ArgumentType = 4, Game18NArguments = { price } - }).ConfigureAwait(false); - await clientSession.SendPacketAsync(clientSession.Character.GenerateGold()).ConfigureAwait(false); + }); + await clientSession.SendPacketAsync(clientSession.Character.GenerateGold()); - var itemInstance = await itemInstanceDao.FirstOrDefaultAsync(s => s!.Id == bz.ItemInstance.Id).ConfigureAwait(false); + var itemInstance = await itemInstanceDao.FirstOrDefaultAsync(s => s!.Id == bz.ItemInstance.Id); if (itemInstance == null) { return; @@ -93,9 +93,9 @@ await clientSession.SendPacketAsync(new SayiPacket var newInv = clientSession.Character.InventoryService.AddItemToPocket( InventoryItemInstance.Create(item, clientSession.Character.CharacterId)); - await clientSession.SendPacketAsync(newInv!.GeneratePocketChange()).ConfigureAwait(false); + await clientSession.SendPacketAsync(newInv!.GeneratePocketChange()); var remove = await bazaarHttpClient.DeleteBazaarAsync(packet.BazaarId, bz.ItemInstance.Amount, - clientSession.Character.Name).ConfigureAwait(false); + clientSession.Character.Name); if (remove) { await clientSession.SendPacketAsync(new RCScalcPacket @@ -106,9 +106,9 @@ await clientSession.SendPacketAsync(new RCScalcPacket Amount = bz.BazaarItem.Amount, Taxes = taxes, Total = price + taxes - }).ConfigureAwait(false); + }); await clientSession.HandlePacketsAsync(new[] - {new CSListPacket {Index = 0, Filter = BazaarStatusType.Default}}).ConfigureAwait(false); + {new CSListPacket {Index = 0, Filter = BazaarStatusType.Default}}); return; } @@ -120,7 +120,7 @@ await clientSession.SendPacketAsync(new MsgiPacket { Type = MessageType.Default, Message = Game18NConstString.MaxGoldReached - }).ConfigureAwait(false); + }); } } else @@ -128,19 +128,19 @@ await clientSession.SendPacketAsync(new MsgiPacket await clientSession.SendPacketAsync(new InfoiPacket { Message = Game18NConstString.NotEnoughSpace - }).ConfigureAwait(false); + }); } await clientSession.SendPacketAsync(new RCScalcPacket { Type = VisualType.Player, Price = bz.BazaarItem.Price, RemainingAmount = 0, Amount = bz.BazaarItem.Amount, Taxes = 0, Total = 0 - }).ConfigureAwait(false); + }); } else { await clientSession.SendPacketAsync(new RCScalcPacket - { Type = VisualType.Player, Price = 0, RemainingAmount = 0, Amount = 0, Taxes = 0, Total = 0 }).ConfigureAwait(false); + { Type = VisualType.Player, Price = 0, RemainingAmount = 0, Amount = 0, Taxes = 0, Total = 0 }); } } } diff --git a/src/NosCore.PacketHandlers/Bazaar/CSkillPacketHandler.cs b/src/NosCore.PacketHandlers/Bazaar/CSkillPacketHandler.cs index 5f991bb6d..96f3e55b8 100644 --- a/src/NosCore.PacketHandlers/Bazaar/CSkillPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Bazaar/CSkillPacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -44,21 +44,21 @@ await clientSession.SendPacketAsync(new MsgiPacket { Type = MessageType.Default, Message = Game18NConstString.AttackWhileBazar - }).ConfigureAwait(false); + }); await clientSession.SendPacketAsync(new WopenPacket { Type = WindowType.NosBazaar, Unknown = medal, Unknown2 = (byte)time - }).ConfigureAwait(false); + }); } else { await clientSession.SendPacketAsync(new InfoiPacket { Message = Game18NConstString.NosMerchantMedaleAllowPlayerToUseNosbazarOnAllGeneralMaps - }).ConfigureAwait(false); + }); } } } diff --git a/src/NosCore.PacketHandlers/CharacterScreen/CharNewJobPacketHandler.cs b/src/NosCore.PacketHandlers/CharacterScreen/CharNewJobPacketHandler.cs index ab410862e..0dd125807 100644 --- a/src/NosCore.PacketHandlers/CharacterScreen/CharNewJobPacketHandler.cs +++ b/src/NosCore.PacketHandlers/CharacterScreen/CharNewJobPacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -40,7 +40,7 @@ public override async Task ExecuteAsync(CharNewJobPacket packet, ClientSession c //TODO add a flag on Account if (await characterDao.FirstOrDefaultAsync(s => (s.Level >= 80) && (s.AccountId == clientSession.Account.AccountId) && (s.ServerId == configuration.Value.ServerId) && - (s.State == CharacterState.Active)).ConfigureAwait(false) == null) + (s.State == CharacterState.Active)) == null) { //Needs at least a level 80 to Create a martial artist //TODO log @@ -49,7 +49,7 @@ public override async Task ExecuteAsync(CharNewJobPacket packet, ClientSession c if (await characterDao.FirstOrDefaultAsync(s => (s.AccountId == clientSession.Account.AccountId) && - (s.Class == CharacterClassType.MartialArtist) && (s.State == CharacterState.Active)).ConfigureAwait(false) != null) + (s.Class == CharacterClassType.MartialArtist) && (s.State == CharacterState.Active)) != null) { //If already a martial artist, can't Create another //TODO log @@ -57,7 +57,7 @@ public override async Task ExecuteAsync(CharNewJobPacket packet, ClientSession c } //todo add cooldown for recreate 30days - await clientSession.HandlePacketsAsync(new[] { packet.Adapt() }).ConfigureAwait(false); + await clientSession.HandlePacketsAsync(new[] { packet.Adapt() }); } } } \ No newline at end of file diff --git a/src/NosCore.PacketHandlers/CharacterScreen/CharNewPacketHandler.cs b/src/NosCore.PacketHandlers/CharacterScreen/CharNewPacketHandler.cs index 4f1ed5e5b..79dead9a4 100644 --- a/src/NosCore.PacketHandlers/CharacterScreen/CharNewPacketHandler.cs +++ b/src/NosCore.PacketHandlers/CharacterScreen/CharNewPacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -63,7 +63,7 @@ public override async Task ExecuteAsync(CharNewPacket packet, ClientSession clie var slot = packet.Slot; var characterName = packet.Name; if (await characterDao.FirstOrDefaultAsync(s => - (s.AccountId == accountId) && (s.Slot == slot) && (s.State == CharacterState.Active) && (s.ServerId == _worldConfiguration.ServerId)).ConfigureAwait(false) != null) + (s.AccountId == accountId) && (s.Slot == slot) && (s.State == CharacterState.Active) && (s.ServerId == _worldConfiguration.ServerId)) != null) { return; } @@ -73,7 +73,7 @@ public override async Task ExecuteAsync(CharNewPacket packet, ClientSession clie { var character = await characterDao.FirstOrDefaultAsync(s => - (s.Name == characterName) && (s.State == CharacterState.Active) && (s.ServerId == _worldConfiguration.ServerId)).ConfigureAwait(false); + (s.Name == characterName) && (s.State == CharacterState.Active) && (s.ServerId == _worldConfiguration.ServerId)); if (character == null) { var level = (byte)(packet.IsMartialArtist ? 81 : 1); @@ -100,7 +100,7 @@ public override async Task ExecuteAsync(CharNewPacket packet, ClientSession clie AccountId = accountId, State = CharacterState.Active }; - chara = await characterDao.TryInsertOrUpdateAsync(chara).ConfigureAwait(false); + chara = await characterDao.TryInsertOrUpdateAsync(chara); var miniland = new MinilandDto { @@ -110,7 +110,7 @@ public override async Task ExecuteAsync(CharNewPacket packet, ClientSession clie OwnerId = chara.CharacterId, WelcomeMusicInfo = 3800 }; - await minilandDao.TryInsertOrUpdateAsync(miniland).ConfigureAwait(false); + await minilandDao.TryInsertOrUpdateAsync(miniland); var charaGo = chara.Adapt(); var itemsToAdd = new List(); @@ -197,21 +197,21 @@ await quicklistEntryDao.TryInsertOrUpdateAsync(new[] { }, }); - await itemInstanceDao.TryInsertOrUpdateAsync(charaGo.InventoryService.Values.Select(s => s.ItemInstance).ToArray()).ConfigureAwait(false); - await inventoryItemInstanceDao.TryInsertOrUpdateAsync(charaGo.InventoryService.Values.ToArray()).ConfigureAwait(false); + await itemInstanceDao.TryInsertOrUpdateAsync(charaGo.InventoryService.Values.Select(s => s.ItemInstance).ToArray()); + await inventoryItemInstanceDao.TryInsertOrUpdateAsync(charaGo.InventoryService.Values.ToArray()); - await clientSession.SendPacketAsync(new SuccessPacket()).ConfigureAwait(false); + await clientSession.SendPacketAsync(new SuccessPacket()); await clientSession.HandlePacketsAsync(new[] { new EntryPointPacket() { Name = clientSession.Account.Name, - } }).ConfigureAwait(false); + } }); } else { await clientSession.SendPacketAsync(new InfoiPacket { Message = Game18NConstString.CharacterNameAlreadyTaken - }).ConfigureAwait(false); + }); } } else @@ -219,7 +219,7 @@ await clientSession.SendPacketAsync(new InfoiPacket await clientSession.SendPacketAsync(new InfoiPacket { Message = Game18NConstString.NameIsInvalid - }).ConfigureAwait(false); + }); } } } diff --git a/src/NosCore.PacketHandlers/CharacterScreen/CharRenPacketHandler.cs b/src/NosCore.PacketHandlers/CharacterScreen/CharRenPacketHandler.cs index 1556cbf39..e184b9739 100644 --- a/src/NosCore.PacketHandlers/CharacterScreen/CharRenPacketHandler.cs +++ b/src/NosCore.PacketHandlers/CharacterScreen/CharRenPacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -45,7 +45,7 @@ public override async Task ExecuteAsync(CharRenamePacket packet, ClientSession c var characterName = packet.Name; var chara = await characterDao.FirstOrDefaultAsync(s => (s.AccountId == accountId) && (s.Slot == slot) && (s.State == CharacterState.Active) && (s.ServerId == configuration.Value.ServerId)) - .ConfigureAwait(false); + ; if ((chara == null) || (chara.ShouldRename == false)) { return; @@ -56,24 +56,24 @@ public override async Task ExecuteAsync(CharRenamePacket packet, ClientSession c { var character = await characterDao.FirstOrDefaultAsync(s => - (s.Name == characterName) && (s.State == CharacterState.Active)).ConfigureAwait(false); + (s.Name == characterName) && (s.State == CharacterState.Active)); if (character == null) { chara.Name = characterName; chara.ShouldRename = false; - await characterDao.TryInsertOrUpdateAsync(chara).ConfigureAwait(false); - await clientSession.SendPacketAsync(new SuccessPacket()).ConfigureAwait(false); + await characterDao.TryInsertOrUpdateAsync(chara); + await clientSession.SendPacketAsync(new SuccessPacket()); await clientSession.HandlePacketsAsync(new[] { new EntryPointPacket() { Name = clientSession.Account.Name, - } }).ConfigureAwait(false); + } }); } else { await clientSession.SendPacketAsync(new InfoiPacket { Message = Game18NConstString.CharacterNameAlreadyTaken - }).ConfigureAwait(false); + }); } } else @@ -81,7 +81,7 @@ await clientSession.SendPacketAsync(new InfoiPacket await clientSession.SendPacketAsync(new InfoiPacket { Message = Game18NConstString.NameIsInvalid - }).ConfigureAwait(false); + }); } } } diff --git a/src/NosCore.PacketHandlers/CharacterScreen/CharacterDeletePacketHandler.cs b/src/NosCore.PacketHandlers/CharacterScreen/CharacterDeletePacketHandler.cs index e40bf2761..2b7fba2fc 100644 --- a/src/NosCore.PacketHandlers/CharacterScreen/CharacterDeletePacketHandler.cs +++ b/src/NosCore.PacketHandlers/CharacterScreen/CharacterDeletePacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -40,7 +40,7 @@ public class CharacterDeletePacketHandler(IDao characterDao, public override async Task ExecuteAsync(CharacterDeletePacket packet, ClientSession clientSession) { var account = await accountDao - .FirstOrDefaultAsync(s => s.AccountId.Equals(clientSession.Account.AccountId)).ConfigureAwait(false); + .FirstOrDefaultAsync(s => s.AccountId.Equals(clientSession.Account.AccountId)); if (account == null) { return; @@ -50,14 +50,14 @@ public override async Task ExecuteAsync(CharacterDeletePacket packet, ClientSess { var character = await characterDao.FirstOrDefaultAsync(s => (s.AccountId == account.AccountId) && (s.Slot == packet.Slot) && (s.ServerId == configuration.Value.ServerId) - && (s.State == CharacterState.Active)).ConfigureAwait(false); + && (s.State == CharacterState.Active)); if (character == null) { return; } character.State = CharacterState.Inactive; - character = await characterDao.TryInsertOrUpdateAsync(character).ConfigureAwait(false); + character = await characterDao.TryInsertOrUpdateAsync(character); await clientSession.HandlePacketsAsync(new[] { @@ -67,14 +67,14 @@ await clientSession.HandlePacketsAsync(new[] Name = account.Name, Password = account.Password } - }).ConfigureAwait(false); + }); } else { await clientSession.SendPacketAsync(new InfoiPacket { Message = Game18NConstString.IncorrectPassword - }).ConfigureAwait(false); + }); } } } diff --git a/src/NosCore.PacketHandlers/CharacterScreen/DacPacketHandler.cs b/src/NosCore.PacketHandlers/CharacterScreen/DacPacketHandler.cs index 301c1b00a..908421ea5 100644 --- a/src/NosCore.PacketHandlers/CharacterScreen/DacPacketHandler.cs +++ b/src/NosCore.PacketHandlers/CharacterScreen/DacPacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -48,7 +48,7 @@ await EntryPointPacketHandler.VerifyConnectionAsync(clientSession, logger, authH return; } await clientSession.HandlePacketsAsync(new[] { new SelectPacket { Slot = packet.Slot } }) - .ConfigureAwait(false); + ; logger.Information(logLanguage[LogLanguageKey.ACCOUNT_ARRIVED], clientSession.Account.Name); diff --git a/src/NosCore.PacketHandlers/CharacterScreen/EntryPointPacketHandler.cs b/src/NosCore.PacketHandlers/CharacterScreen/EntryPointPacketHandler.cs index 80a0b0e31..36095f974 100644 --- a/src/NosCore.PacketHandlers/CharacterScreen/EntryPointPacketHandler.cs +++ b/src/NosCore.PacketHandlers/CharacterScreen/EntryPointPacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -65,11 +65,11 @@ public static async Task VerifyConnectionAsync(ClientSession clientSession, ILog { accountName }); - await clientSession.DisconnectAsync().ConfigureAwait(false); + await clientSession.DisconnectAsync(); return; } - var account = await accountDao.FirstOrDefaultAsync(s => s.Name == accountName).ConfigureAwait(false); + var account = await accountDao.FirstOrDefaultAsync(s => s.Name == accountName); if (account == null) { @@ -77,7 +77,7 @@ public static async Task VerifyConnectionAsync(ClientSession clientSession, ILog { accountName }); - await clientSession.DisconnectAsync().ConfigureAwait(false); + await clientSession.DisconnectAsync(); return; } @@ -85,7 +85,7 @@ public static async Task VerifyConnectionAsync(ClientSession clientSession, ILog (passwordLessConnection ? await authHttpClient .GetAwaitingConnectionAsync(accountName, password, sessionId) - .ConfigureAwait(false) != null + != null : account.Password?.Equals(new Sha512Hasher().Hash(password), StringComparison.OrdinalIgnoreCase) == true); @@ -95,7 +95,7 @@ public static async Task VerifyConnectionAsync(ClientSession clientSession, ILog { accountName }); - await clientSession.DisconnectAsync().ConfigureAwait(false); + await clientSession.DisconnectAsync(); return; } @@ -142,7 +142,7 @@ await clientSession.SendPacketAsync(new GuriPacket Type = GuriPacketType.TextInput, Argument = 3, EntityId = 0 - }).ConfigureAwait(false); + }); return; } } @@ -151,7 +151,7 @@ await clientSession.SendPacketAsync(new GuriPacket (s.AccountId == clientSession.Account.AccountId) && (s.State == CharacterState.Active) && s.ServerId == configuration.Value.ServerId); // load characterlist packet for each character in Character - await clientSession.SendPacketAsync(new ClistStartPacket { Type = 0 }).ConfigureAwait(false); + await clientSession.SendPacketAsync(new ClistStartPacket { Type = 0 }); foreach (var character in characters!.Select(characterDto => characterDto.Adapt())) { var equipment = new WearableInstance?[16]; @@ -214,10 +214,10 @@ await clientSession.SendPacketAsync(new ClistPacket Design = equipment[(byte)EquipmentType.Hat]?.Item?.IsColored ?? false ? equipment[(byte)EquipmentType.Hat]?.Design ?? 0 : 0, Rename = character.ShouldRename - }).ConfigureAwait(false); + }); } - await clientSession.SendPacketAsync(new ClistEndPacket()).ConfigureAwait(false); + await clientSession.SendPacketAsync(new ClistEndPacket()); } } } \ No newline at end of file diff --git a/src/NosCore.PacketHandlers/CharacterScreen/SelectPacketHandler.cs b/src/NosCore.PacketHandlers/CharacterScreen/SelectPacketHandler.cs index ea9bf0aef..59b86e028 100644 --- a/src/NosCore.PacketHandlers/CharacterScreen/SelectPacketHandler.cs +++ b/src/NosCore.PacketHandlers/CharacterScreen/SelectPacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -63,7 +63,7 @@ public override async Task ExecuteAsync(SelectPacket packet, ClientSession clien var characterDto = await characterDao.FirstOrDefaultAsync(s => (s.AccountId == clientSession.Account.AccountId) && (s.Slot == packet.Slot) - && (s.State == CharacterState.Active) && s.ServerId == configuration.Value.ServerId).ConfigureAwait(false); + && (s.State == CharacterState.Active) && s.ServerId == configuration.Value.ServerId); if (characterDto == null) { logger.Error(logLanguage[LogLanguageKey.CHARACTER_SLOT_EMPTY], new @@ -92,7 +92,7 @@ await pubSubHub.SubscribeAsync(new Subscriber character.PositionX = character.MapX; character.PositionY = character.MapY; character.Direction = 2; - character.Script = character.CurrentScriptId != null ? await scriptDao.FirstOrDefaultAsync(s => s.Id == character.CurrentScriptId).ConfigureAwait(false) : null; + character.Script = character.CurrentScriptId != null ? await scriptDao.FirstOrDefaultAsync(s => s.Id == character.CurrentScriptId) : null; character.Group!.JoinGroup(character); var inventories = inventoryItemInstanceDao @@ -103,12 +103,12 @@ await pubSubHub.SubscribeAsync(new Subscriber inventories.ForEach(k => character.InventoryService[k.ItemInstanceId] = InventoryItemInstance.Create(itemProvider.Convert(items.First(s => s!.Id == k.ItemInstanceId)!), character.CharacterId, k)); - await clientSession.SetCharacterAsync(character).ConfigureAwait(false); + await clientSession.SetCharacterAsync(character); #pragma warning disable CS0618 - await clientSession.SendPacketsAsync(clientSession.Character.GenerateInv(logger, logLanguage)).ConfigureAwait(false); + await clientSession.SendPacketsAsync(clientSession.Character.GenerateInv(logger, logLanguage)); #pragma warning restore CS0618 - await clientSession.SendPacketAsync(clientSession.Character.GenerateMlobjlst()).ConfigureAwait(false); + await clientSession.SendPacketAsync(clientSession.Character.GenerateMlobjlst()); if (clientSession.Character.Hp > clientSession.Character.MaxHp) { clientSession.Character.Hp = clientSession.Character.MaxHp; @@ -135,7 +135,7 @@ await pubSubHub.SubscribeAsync(new Subscriber .Where(s => s.CharacterId == clientSession.Character.CharacterId)?.ToList() ?? new List(); clientSession.Character.Titles = titleDao .Where(s => s.CharacterId == clientSession.Character.CharacterId)?.ToList() ?? new List(); - await clientSession.SendPacketAsync(new OkPacket()).ConfigureAwait(false); + await clientSession.SendPacketAsync(new OkPacket()); } catch (Exception ex) { diff --git a/src/NosCore.PacketHandlers/Chat/BtkPacketHandler.cs b/src/NosCore.PacketHandlers/Chat/BtkPacketHandler.cs index 5cc880605..b66d49354 100644 --- a/src/NosCore.PacketHandlers/Chat/BtkPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Chat/BtkPacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -46,7 +46,7 @@ public class BtkPacketHandler(ILogger logger, ISerializer packetSerializer, IFri { public override async Task ExecuteAsync(BtkPacket btkPacket, ClientSession session) { - var friendlist = await friendHttpClient.GetFriendsAsync(session.Character.VisualId).ConfigureAwait(false); + var friendlist = await friendHttpClient.GetFriendsAsync(session.Character.VisualId); if (friendlist.All(s => s.CharacterId != btkPacket.CharacterId)) { @@ -68,7 +68,7 @@ public override async Task ExecuteAsync(BtkPacket btkPacket, ClientSession sessi if (receiverSession != null) { - await receiverSession.SendPacketAsync(session.Character.GenerateTalk(message)).ConfigureAwait(false); + await receiverSession.SendPacketAsync(session.Character.GenerateTalk(message)); return; } @@ -80,7 +80,7 @@ public override async Task ExecuteAsync(BtkPacket btkPacket, ClientSession sessi await session.SendPacketAsync(new InfoiPacket { Message = Game18NConstString.FriendOffline - }).ConfigureAwait(false); + }); return; } @@ -93,7 +93,7 @@ await packetHttpClient.SendMessageAsync(new PostedPacket { Name = session.Character.Name, Id = session.Character.CharacterId }, OriginWorldId = channel.ChannelId, ReceiverType = ReceiverType.OnlySomeone - }).ConfigureAwait(false); + }); } } } \ No newline at end of file diff --git a/src/NosCore.PacketHandlers/Chat/WhisperPacketHandler.cs b/src/NosCore.PacketHandlers/Chat/WhisperPacketHandler.cs index 069881da9..6ecb4e8d4 100644 --- a/src/NosCore.PacketHandlers/Chat/WhisperPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Chat/WhisperPacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -72,7 +72,7 @@ await session.SendPacketAsync(session.Character.GenerateSpk(new SpeakPacket { SpeakType = SpeakType.Player, Message = message.ToString() - })).ConfigureAwait(false); + })); var speakPacket = session.Character.GenerateSpk(new SpeakPacket { @@ -98,13 +98,13 @@ await session.SendPacketAsync(new Infoi2Packet return; } - var blacklisteds = await blacklistHttpClient.GetBlacklistedAsync(session.Character.VisualId).ConfigureAwait(false); + var blacklisteds = await blacklistHttpClient.GetBlacklistedAsync(session.Character.VisualId); if (blacklisteds.Any(s => s.CharacterId == receiver.ConnectedCharacter?.Id)) { await session.SendPacketAsync(new InfoiPacket { Message = Game18NConstString.AlreadyBlacklisted - }).ConfigureAwait(false); + }); return; } @@ -118,7 +118,7 @@ await pubSubHub.SendMessageAsync(new PostedPacket SenderCharacter = new Character { Name = session.Character.Name }, OriginWorldId = channel.ChannelId, ReceiverType = ReceiverType.OnlySomeone - }).ConfigureAwait(false); + }); } catch (Exception e) { diff --git a/src/NosCore.PacketHandlers/Command/ChangeClassPacketHandler.cs b/src/NosCore.PacketHandlers/Command/ChangeClassPacketHandler.cs index e29741ff1..40d676507 100644 --- a/src/NosCore.PacketHandlers/Command/ChangeClassPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Command/ChangeClassPacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -38,7 +38,7 @@ public override async Task ExecuteAsync(ChangeClassPacket changeClassPacket, Cli { if ((changeClassPacket.Name == session.Character.Name) || string.IsNullOrEmpty(changeClassPacket.Name)) { - await session.Character.ChangeClassAsync(changeClassPacket.ClassType).ConfigureAwait(false); + await session.Character.ChangeClassAsync(changeClassPacket.ClassType); return; } @@ -57,11 +57,11 @@ public override async Task ExecuteAsync(ChangeClassPacket changeClassPacket, Cli await session.SendPacketAsync(new InfoiPacket { Message = Game18NConstString.UnknownCharacter - }).ConfigureAwait(false); + }); return; } - await pubSubHub.SendMessageAsync(data).ConfigureAwait(false); + await pubSubHub.SendMessageAsync(data); } } } \ No newline at end of file diff --git a/src/NosCore.PacketHandlers/Command/CreateItemPacketHandler.cs b/src/NosCore.PacketHandlers/Command/CreateItemPacketHandler.cs index 572984a63..ddc0fc4c5 100644 --- a/src/NosCore.PacketHandlers/Command/CreateItemPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Command/CreateItemPacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -65,7 +65,7 @@ await session.SendPacketAsync(new MsgiPacket { Type = MessageType.Default, Message = Game18NConstString.ItemDoesNotExist - }).ConfigureAwait(false); + }); return; } @@ -127,11 +127,11 @@ await session.SendPacketAsync(new MsgiPacket { Type = MessageType.Default, Message = Game18NConstString.NotEnoughSpace - }).ConfigureAwait(false); + }); return; } - await session.SendPacketAsync(inv.GeneratePocketChange()).ConfigureAwait(false); + await session.SendPacketAsync(inv.GeneratePocketChange()); var firstItem = inv[0]; if (session.Character.InventoryService.LoadBySlotAndType(firstItem.Slot, @@ -166,7 +166,7 @@ await session.SendPacketAsync(new SayiPacket Message = Game18NConstString.ReceivedThisItem, ArgumentType = 2, Game18NArguments = { iteminfo.VNum.ToString(), amount } - }).ConfigureAwait(false); + }); } } } \ No newline at end of file diff --git a/src/NosCore.PacketHandlers/Command/GiftPacketHandler.cs b/src/NosCore.PacketHandlers/Command/GiftPacketHandler.cs index 46f9357d3..c72f6d192 100644 --- a/src/NosCore.PacketHandlers/Command/GiftPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Command/GiftPacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -47,19 +47,19 @@ public override async Task ExecuteAsync(GiftPacket giftPacket, ClientSession ses await session.SendPacketAsync(new InfoiPacket { Message = Game18NConstString.UnknownCharacter - }).ConfigureAwait(false); + }); return; } await mailHttpClient.SendMailAsync(GiftHelper.GenerateMailRequest(clock, session.Character, receiver.ConnectedCharacter!.Id,null, giftPacket.VNum, - giftPacket.Amount, giftPacket.Rare, giftPacket.Upgrade, false, null, null)).ConfigureAwait(false); + giftPacket.Amount, giftPacket.Rare, giftPacket.Upgrade, false, null, null)); await session.SendPacketAsync(new SayiPacket { VisualType = VisualType.Player, VisualId = session.Character.CharacterId, Type = SayColorType.Red, Message = Game18NConstString.GiftDelivered - }).ConfigureAwait(false); + }); } diff --git a/src/NosCore.PacketHandlers/Command/HelpPacketHandler.cs b/src/NosCore.PacketHandlers/Command/HelpPacketHandler.cs index a5c23d68c..ab2c1150f 100644 --- a/src/NosCore.PacketHandlers/Command/HelpPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Command/HelpPacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -34,7 +34,7 @@ public class HelpPacketHandler : PacketHandler, IWorldPacketHandler public override async Task ExecuteAsync(HelpPacket helpPacket, ClientSession session) { await session.SendPacketAsync(session.Character.GenerateSay("-------------Help command-------------", - SayColorType.Red)).ConfigureAwait(false); + SayColorType.Red)); var classes = helpPacket.GetType().Assembly.GetTypes().Where(t => typeof(ICommandPacket).IsAssignableFrom(t) && (t.GetCustomAttribute()?.Authority <= session.Account.Authority)) @@ -51,7 +51,7 @@ await session.SendPacketAsync(session.Character.GenerateSay("-------------Help c var message = method.Invoke(classInstance, null)?.ToString(); if (!string.IsNullOrEmpty(message)) { - await session.SendPacketAsync(session.Character.GenerateSay(message, SayColorType.Green)).ConfigureAwait(false); + await session.SendPacketAsync(session.Character.GenerateSay(message, SayColorType.Green)); } } } diff --git a/src/NosCore.PacketHandlers/Command/KickPacketHandler.cs b/src/NosCore.PacketHandlers/Command/KickPacketHandler.cs index 87d4e4c9b..59dda293e 100644 --- a/src/NosCore.PacketHandlers/Command/KickPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Command/KickPacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -41,7 +41,7 @@ public override async Task ExecuteAsync(KickPacket kickPacket, ClientSession ses await session.SendPacketAsync(new InfoiPacket { Message = Game18NConstString.UnknownCharacter - }).ConfigureAwait(false); + }); return; } diff --git a/src/NosCore.PacketHandlers/Command/SetGoldCommandPacketHandler.cs b/src/NosCore.PacketHandlers/Command/SetGoldCommandPacketHandler.cs index 9e3150a76..a7b3a32fe 100644 --- a/src/NosCore.PacketHandlers/Command/SetGoldCommandPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Command/SetGoldCommandPacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -51,11 +51,11 @@ public override async Task ExecuteAsync(SetGoldCommandPacket goldPacket, ClientS await session.SendPacketAsync(new InfoiPacket { Message = Game18NConstString.UnknownCharacter - }).ConfigureAwait(false); + }); return; } - await pubSubHub.SendMessageAsync(data).ConfigureAwait(false); + await pubSubHub.SendMessageAsync(data); } } } \ No newline at end of file diff --git a/src/NosCore.PacketHandlers/Command/SetHeroLevelCommandPacketHandler.cs b/src/NosCore.PacketHandlers/Command/SetHeroLevelCommandPacketHandler.cs index e913ef3e9..ef3ff27e5 100644 --- a/src/NosCore.PacketHandlers/Command/SetHeroLevelCommandPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Command/SetHeroLevelCommandPacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -39,7 +39,7 @@ public override async Task ExecuteAsync(SetHeroLevelCommandPacket levelPacket, C { if (string.IsNullOrEmpty(levelPacket.Name) || (levelPacket.Name == session.Character.Name)) { - await session.Character.SetHeroLevelAsync(levelPacket.Level).ConfigureAwait(false); + await session.Character.SetHeroLevelAsync(levelPacket.Level); return; } @@ -59,11 +59,11 @@ public override async Task ExecuteAsync(SetHeroLevelCommandPacket levelPacket, C await session.SendPacketAsync(new InfoiPacket { Message = Game18NConstString.UnknownCharacter - }).ConfigureAwait(false); + }); return; } - await pubSubHub.SendMessageAsync(data).ConfigureAwait(false); + await pubSubHub.SendMessageAsync(data); } } } \ No newline at end of file diff --git a/src/NosCore.PacketHandlers/Command/SetJobLevelCommandPacketHandler.cs b/src/NosCore.PacketHandlers/Command/SetJobLevelCommandPacketHandler.cs index 21c246479..dd8117ba1 100644 --- a/src/NosCore.PacketHandlers/Command/SetJobLevelCommandPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Command/SetJobLevelCommandPacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -38,7 +38,7 @@ public override async Task ExecuteAsync(SetJobLevelCommandPacket levelPacket, Cl { if (string.IsNullOrEmpty(levelPacket.Name) || (levelPacket.Name == session.Character.Name)) { - await session.Character.SetJobLevelAsync(levelPacket.Level).ConfigureAwait(false); + await session.Character.SetJobLevelAsync(levelPacket.Level); return; } @@ -57,11 +57,11 @@ public override async Task ExecuteAsync(SetJobLevelCommandPacket levelPacket, Cl await session.SendPacketAsync(new InfoiPacket { Message = Game18NConstString.UnknownCharacter - }).ConfigureAwait(false); + }); return; } - await pubSubHub.SendMessageAsync(data).ConfigureAwait(false); + await pubSubHub.SendMessageAsync(data); } } } \ No newline at end of file diff --git a/src/NosCore.PacketHandlers/Command/SetLevelCommandPacketHandler.cs b/src/NosCore.PacketHandlers/Command/SetLevelCommandPacketHandler.cs index afe7301c2..0ae40431c 100644 --- a/src/NosCore.PacketHandlers/Command/SetLevelCommandPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Command/SetLevelCommandPacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -39,7 +39,7 @@ public override async Task ExecuteAsync(SetLevelCommandPacket levelPacket, Clien { if (string.IsNullOrEmpty(levelPacket.Name) || (levelPacket.Name == session.Character.Name)) { - await session.Character.SetLevelAsync(levelPacket.Level).ConfigureAwait(false); + await session.Character.SetLevelAsync(levelPacket.Level); return; } @@ -59,11 +59,11 @@ public override async Task ExecuteAsync(SetLevelCommandPacket levelPacket, Clien await session.SendPacketAsync(new InfoiPacket { Message = Game18NConstString.UnknownCharacter - }).ConfigureAwait(false); + }); return; } - await pubSubHub.SendMessageAsync(data).ConfigureAwait(false); + await pubSubHub.SendMessageAsync(data); } } } \ No newline at end of file diff --git a/src/NosCore.PacketHandlers/Command/SetReputationPacketHandler.cs b/src/NosCore.PacketHandlers/Command/SetReputationPacketHandler.cs index 9aec47bd1..bc66ed0b6 100644 --- a/src/NosCore.PacketHandlers/Command/SetReputationPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Command/SetReputationPacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -38,7 +38,7 @@ public override async Task ExecuteAsync(SetReputationPacket setReputationPacket, { if ((setReputationPacket.Name == session.Character.Name) || string.IsNullOrEmpty(setReputationPacket.Name)) { - await session.Character.SetReputationAsync(setReputationPacket.Reputation).ConfigureAwait(false); + await session.Character.SetReputationAsync(setReputationPacket.Reputation); return; } @@ -56,11 +56,11 @@ public override async Task ExecuteAsync(SetReputationPacket setReputationPacket, await session.SendPacketAsync(new InfoiPacket { Message = Game18NConstString.UnknownCharacter - }).ConfigureAwait(false); + }); return; } - await pubSubHub.SendMessageAsync(data).ConfigureAwait(false); + await pubSubHub.SendMessageAsync(data); } } } \ No newline at end of file diff --git a/src/NosCore.PacketHandlers/Command/ShoutPacketHandler.cs b/src/NosCore.PacketHandlers/Command/ShoutPacketHandler.cs index 9da837984..145a4a88c 100644 --- a/src/NosCore.PacketHandlers/Command/ShoutPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Command/ShoutPacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -79,7 +79,7 @@ public override async Task ExecuteAsync(ShoutPacket shoutPacket, ClientSession s ReceiverType = ReceiverType.All }; - await packetHttpClient.SendMessagesAsync(new List(new[] { sayPostedPacket, msgPostedPacket })).ConfigureAwait(false); + await packetHttpClient.SendMessagesAsync(new List(new[] { sayPostedPacket, msgPostedPacket })); } } } \ No newline at end of file diff --git a/src/NosCore.PacketHandlers/Exchange/ExcListPacketHandler.cs b/src/NosCore.PacketHandlers/Exchange/ExcListPacketHandler.cs index fd4327ba5..51c2852e4 100644 --- a/src/NosCore.PacketHandlers/Exchange/ExcListPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Exchange/ExcListPacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -65,8 +65,8 @@ public override async Task ExecuteAsync(ExcListPacket packet, ClientSession clie var closeExchange = exchangeService.CloseExchange(clientSession.Character.VisualId, ExchangeResultType.Failure); - await clientSession.SendPacketAsync(closeExchange).ConfigureAwait(false); - await target.SendPacketAsync(closeExchange).ConfigureAwait(false); + await clientSession.SendPacketAsync(closeExchange); + await target.SendPacketAsync(closeExchange); logger.Error(logLanguage[LogLanguageKey.INVALID_EXCHANGE_LIST]); return; } @@ -74,8 +74,8 @@ public override async Task ExecuteAsync(ExcListPacket packet, ClientSession clie if (!item.ItemInstance.Item.IsTradable) { await clientSession.SendPacketAsync(exchangeService.CloseExchange(clientSession.Character.CharacterId, - ExchangeResultType.Failure)).ConfigureAwait(false); - await target.SendPacketAsync(exchangeService.CloseExchange(target.VisualId, ExchangeResultType.Failure)).ConfigureAwait(false); + ExchangeResultType.Failure)); + await target.SendPacketAsync(exchangeService.CloseExchange(target.VisualId, ExchangeResultType.Failure)); logger.Error( logLanguage[LogLanguageKey.CANNOT_TRADE_NOT_TRADABLE_ITEM]); return; @@ -104,7 +104,7 @@ await clientSession.SendPacketAsync(exchangeService.CloseExchange(clientSession. exchangeService.SetGold(clientSession.Character.CharacterId, packet.Gold, packet.BankGold); await (target == null ? Task.CompletedTask : target.SendPacketAsync( - clientSession.Character.GenerateServerExcListPacket(packet.Gold, packet.BankGold, subPacketList))).ConfigureAwait(false); + clientSession.Character.GenerateServerExcListPacket(packet.Gold, packet.BankGold, subPacketList))); } } } \ No newline at end of file diff --git a/src/NosCore.PacketHandlers/Exchange/ExchangeRequestPacketHandler.cs b/src/NosCore.PacketHandlers/Exchange/ExchangeRequestPacketHandler.cs index bc8be3d26..00c249cd5 100644 --- a/src/NosCore.PacketHandlers/Exchange/ExchangeRequestPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Exchange/ExchangeRequestPacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -75,7 +75,7 @@ await clientSession.SendPacketAsync(new Infoi2Packet Message = Game18NConstString.TradingWithSomeoneElse, ArgumentType = 1, Game18NArguments = { target?.Name ?? "" } - }).ConfigureAwait(false); + }); return; } @@ -86,11 +86,11 @@ await clientSession.SendPacketAsync(new Infoi2Packet Message = Game18NConstString.BlockingTrades, ArgumentType = 1, Game18NArguments = { target?.Name ?? "" } - }).ConfigureAwait(false); + }); return; } - var blacklisteds = await blacklistHttpClient.GetBlacklistedAsync(clientSession.Character.VisualId).ConfigureAwait(false); + var blacklisteds = await blacklistHttpClient.GetBlacklistedAsync(clientSession.Character.VisualId); if (blacklisteds.Any(s => s.CharacterId == target.VisualId)) { await clientSession.SendPacketAsync(new SayiPacket @@ -99,7 +99,7 @@ await clientSession.SendPacketAsync(new SayiPacket VisualId = clientSession.Character.CharacterId, Type = SayColorType.Yellow, Message = Game18NConstString.AlreadyBlacklisted - }).ConfigureAwait(false); + }); return; } @@ -108,7 +108,7 @@ await clientSession.SendPacketAsync(new SayiPacket await clientSession.SendPacketAsync(new InfoiPacket { Message = Game18NConstString.CanNotTradeShopOwners - }).ConfigureAwait(false); + }); return; } @@ -117,7 +117,7 @@ await clientSession.SendPacketAsync(new Infoi2Packet Message = Game18NConstString.YouInvitedToTrade, ArgumentType = 1, Game18NArguments = { target.Name } - }).ConfigureAwait(false); + }); await target.SendPacketAsync(new Dlgi2Packet { @@ -128,7 +128,7 @@ await target.SendPacketAsync(new Dlgi2Packet Question = Game18NConstString.WantAcceptTrade, ArgumentType = 2, Game18NArguments = { $"{clientSession.Character.Level}", clientSession.Character.Name ?? "" } - }).ConfigureAwait(false); + }); return; case RequestExchangeType.List: @@ -137,8 +137,8 @@ await target.SendPacketAsync(new Dlgi2Packet return; } - await clientSession.SendPacketAsync(clientSession.Character.GenerateServerExcListPacket(null, null, null)).ConfigureAwait(false); - await (target == null ? Task.CompletedTask : target.SendPacketAsync(target.GenerateServerExcListPacket(null, null, null))).ConfigureAwait(false); + await clientSession.SendPacketAsync(clientSession.Character.GenerateServerExcListPacket(null, null, null)); + await (target == null ? Task.CompletedTask : target.SendPacketAsync(target.GenerateServerExcListPacket(null, null, null))); return; case RequestExchangeType.Declined: @@ -150,14 +150,14 @@ await clientSession.SendPacketAsync(new Sayi2Packet Message = Game18NConstString.CancelledTrade, ArgumentType = 1, Game18NArguments = { target?.Name ?? "" } - }).ConfigureAwait(false); + }); await (target == null ? Task.CompletedTask : target.SendPacketAsync(new SayiPacket { VisualType = VisualType.Player, VisualId = target.CharacterId, Type = SayColorType.Yellow, Message = Game18NConstString.TradeCancelled2 - })).ConfigureAwait(false); + })); return; case RequestExchangeType.Confirmed: @@ -186,7 +186,7 @@ await clientSession.SendPacketAsync(new Sayi2Packet await clientSession.SendPacketAsync(new InfoiPacket { Message = Game18NConstString.TradeWaitingConfirm - }).ConfigureAwait(false); + }); return; } @@ -198,11 +198,11 @@ await clientSession.SendPacketAsync(new InfoiPacket { if (infoPacket.Key == clientSession.Character.CharacterId) { - await clientSession.SendPacketAsync(infoPacket.Value).ConfigureAwait(false); + await clientSession.SendPacketAsync(infoPacket.Value); } else if (infoPacket.Key == exchangeTarget.VisualId) { - await exchangeTarget.SendPacketAsync(infoPacket.Value).ConfigureAwait(false); + await exchangeTarget.SendPacketAsync(infoPacket.Value); } else { @@ -219,32 +219,32 @@ await clientSession.SendPacketAsync(new InfoiPacket { if (item.Key == clientSession.Character.CharacterId) { - await clientSession.SendPacketAsync(item.Value).ConfigureAwait(false); + await clientSession.SendPacketAsync(item.Value); } else { - await exchangeTarget.SendPacketAsync(item.Value).ConfigureAwait(false); + await exchangeTarget.SendPacketAsync(item.Value); } } var getSessionData = exchangeService.GetData(clientSession.Character.CharacterId); - await clientSession.Character.RemoveGoldAsync(getSessionData.Gold).ConfigureAwait(false); + await clientSession.Character.RemoveGoldAsync(getSessionData.Gold); clientSession.Character.RemoveBankGold(getSessionData.BankGold * 1000); - await exchangeTarget.AddGoldAsync(getSessionData.Gold).ConfigureAwait(false); + await exchangeTarget.AddGoldAsync(getSessionData.Gold); exchangeTarget.AddBankGold(getSessionData.BankGold * 1000); var getTargetData = exchangeService.GetData(exchangeTarget.VisualId); - await exchangeTarget.RemoveGoldAsync(getTargetData.Gold).ConfigureAwait(false); + await exchangeTarget.RemoveGoldAsync(getTargetData.Gold); exchangeTarget.RemoveBankGold(getTargetData.BankGold * 1000); - await clientSession.Character.AddGoldAsync(getTargetData.Gold).ConfigureAwait(false); + await clientSession.Character.AddGoldAsync(getTargetData.Gold); clientSession.Character.AddBankGold(getTargetData.BankGold * 1000); } closeExchange = exchangeService.CloseExchange(clientSession.Character.VisualId, success.Item1)!; - await exchangeTarget.SendPacketAsync(closeExchange).ConfigureAwait(false); - await clientSession.SendPacketAsync(closeExchange).ConfigureAwait(false); + await exchangeTarget.SendPacketAsync(closeExchange); + await clientSession.SendPacketAsync(closeExchange); return; case RequestExchangeType.Cancelled: @@ -260,7 +260,7 @@ await clientSession.SendPacketAsync(new InfoiPacket closeExchange = exchangeService.CloseExchange(clientSession.Character.VisualId, ExchangeResultType.Failure)!; cancelTarget?.SendPacketAsync(closeExchange); - await clientSession.SendPacketAsync(closeExchange).ConfigureAwait(false); + await clientSession.SendPacketAsync(closeExchange); return; default: diff --git a/src/NosCore.PacketHandlers/Friend/BlDelPacketHandler.cs b/src/NosCore.PacketHandlers/Friend/BlDelPacketHandler.cs index 120d85e43..c87940dc7 100644 --- a/src/NosCore.PacketHandlers/Friend/BlDelPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Friend/BlDelPacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -36,12 +36,12 @@ public class BlDelPacketHandler(IBlacklistHub blacklistHttpClient, { public override async Task ExecuteAsync(BlDelPacket bldelPacket, ClientSession session) { - var list = await blacklistHttpClient.GetBlacklistedAsync(session.Character.VisualId).ConfigureAwait(false); + var list = await blacklistHttpClient.GetBlacklistedAsync(session.Character.VisualId); var idtorem = list.FirstOrDefault(s => s.CharacterId == bldelPacket.CharacterId); if (idtorem != null) { - await blacklistHttpClient.DeleteAsync(idtorem.CharacterRelationId).ConfigureAwait(false); - await session.SendPacketAsync(await session.Character.GenerateBlinitAsync(blacklistHttpClient).ConfigureAwait(false)).ConfigureAwait(false); + await blacklistHttpClient.DeleteAsync(idtorem.CharacterRelationId); + await session.SendPacketAsync(await session.Character.GenerateBlinitAsync(blacklistHttpClient)); } else { @@ -49,7 +49,7 @@ await session.SendPacketAsync(new InfoPacket { Message = gameLanguageLocalizer[LanguageKey.NOT_IN_BLACKLIST, session.Account.Language] - }).ConfigureAwait(false); + }); } } } diff --git a/src/NosCore.PacketHandlers/Friend/BlInsPacketHandler.cs b/src/NosCore.PacketHandlers/Friend/BlInsPacketHandler.cs index 45cfd7d83..e075a3aae 100644 --- a/src/NosCore.PacketHandlers/Friend/BlInsPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Friend/BlInsPacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -39,27 +39,27 @@ public class BlInsPackettHandler(IBlacklistHub blacklistHttpClient, ILogger logg public override async Task ExecuteAsync(BlInsPacket blinsPacket, ClientSession session) { var result = await blacklistHttpClient.AddBlacklistAsync(new BlacklistRequest - { CharacterId = session.Character.CharacterId, BlInsPacket = blinsPacket }).ConfigureAwait(false); + { CharacterId = session.Character.CharacterId, BlInsPacket = blinsPacket }); switch (result) { case LanguageKey.CANT_BLOCK_FRIEND: await session.SendPacketAsync(new InfoiPacket { Message = Game18NConstString.CannotBlackListFriend - }).ConfigureAwait(false); + }); break; case LanguageKey.ALREADY_BLACKLISTED: await session.SendPacketAsync(new InfoiPacket { Message = Game18NConstString.AlreadyBlacklisted - }).ConfigureAwait(false); + }); break; case LanguageKey.BLACKLIST_ADDED: await session.SendPacketAsync(new InfoiPacket { Message = Game18NConstString.CharacterBlacklisted - }).ConfigureAwait(false); - await session.SendPacketAsync(await session.Character.GenerateBlinitAsync(blacklistHttpClient).ConfigureAwait(false)).ConfigureAwait(false); + }); + await session.SendPacketAsync(await session.Character.GenerateBlinitAsync(blacklistHttpClient)); break; default: logger.Warning(logLanguage[LogLanguageKey.FRIEND_REQUEST_DISCONNECTED]); diff --git a/src/NosCore.PacketHandlers/Friend/FdelPacketHandler.cs b/src/NosCore.PacketHandlers/Friend/FdelPacketHandler.cs index 19c1b25cc..e1012dfbe 100644 --- a/src/NosCore.PacketHandlers/Friend/FdelPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Friend/FdelPacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -39,17 +39,17 @@ public class FdelPacketHandler(IFriendHub friendHttpClient, IChannelHub channelH { public override async Task ExecuteAsync(FdelPacket fdelPacket, ClientSession session) { - var list = await friendHttpClient.GetFriendsAsync(session.Character.VisualId).ConfigureAwait(false); + var list = await friendHttpClient.GetFriendsAsync(session.Character.VisualId); var idtorem = list.FirstOrDefault(s => s.CharacterId == fdelPacket.CharacterId); if (idtorem != null) { - await friendHttpClient.DeleteAsync(idtorem.CharacterRelationId).ConfigureAwait(false); + await friendHttpClient.DeleteAsync(idtorem.CharacterRelationId); var targetCharacter = sessionRegistry.GetCharacter(s => s.VisualId == fdelPacket.CharacterId); await (targetCharacter == null ? Task.CompletedTask : targetCharacter.SendPacketAsync(await targetCharacter.GenerateFinitAsync(friendHttpClient, channelHttpClient, - pubSubHub).ConfigureAwait(false))).ConfigureAwait(false); + pubSubHub))); await session.Character.SendPacketAsync(await session.Character.GenerateFinitAsync(friendHttpClient, channelHttpClient, - pubSubHub).ConfigureAwait(false)).ConfigureAwait(false); + pubSubHub)); } else { @@ -57,7 +57,7 @@ await session.SendPacketAsync(new InfoPacket { Message = gameLanguageLocalizer[LanguageKey.NOT_IN_FRIENDLIST, session.Account.Language] - }).ConfigureAwait(false); + }); } } } diff --git a/src/NosCore.PacketHandlers/Friend/FinsPacketHandler.cs b/src/NosCore.PacketHandlers/Friend/FinsPacketHandler.cs index 537d30b51..c48dea5e0 100644 --- a/src/NosCore.PacketHandlers/Friend/FinsPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Friend/FinsPacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -44,7 +44,7 @@ public override async Task ExecuteAsync(FinsPacket finsPacket, ClientSession ses if (targetCharacter != null) { var result = await friendHttpClient.AddFriendAsync(new FriendShipRequest - { CharacterId = session.Character.CharacterId, FinsPacket = finsPacket }).ConfigureAwait(false); + { CharacterId = session.Character.CharacterId, FinsPacket = finsPacket }); switch (result) { @@ -52,21 +52,21 @@ public override async Task ExecuteAsync(FinsPacket finsPacket, ClientSession ses await session.Character.SendPacketAsync(new InfoiPacket { Message = Game18NConstString.MaxFriendReachedAdd - }).ConfigureAwait(false); + }); break; case LanguageKey.BLACKLIST_BLOCKED: await session.Character.SendPacketAsync(new InfoiPacket { Message = Game18NConstString.AlreadyBlacklisted - }).ConfigureAwait(false); + }); break; case LanguageKey.ALREADY_FRIEND: await session.Character.SendPacketAsync(new InfoiPacket { Message = Game18NConstString.RegisteredAsFriend - }).ConfigureAwait(false); + }); break; case LanguageKey.FRIEND_REQUEST_BLOCKED: @@ -75,7 +75,7 @@ await session.Character.SendPacketAsync(new Infoi2Packet Message = Game18NConstString.HAsFriendRequestBlocked, ArgumentType = 1, Game18NArguments = { targetCharacter.Name! } - }).ConfigureAwait(false); + }); break; case LanguageKey.FRIEND_REQUEST_SENT: @@ -88,30 +88,30 @@ await targetCharacter.SendPacketAsync(new Dlgi2Packet { Type = FinsPacketType.Accepted, CharacterId = session.Character.VisualId }, NoPacket = new FinsPacket { Type = FinsPacketType.Rejected, CharacterId = session.Character.VisualId } - }).ConfigureAwait(false); + }); break; case LanguageKey.FRIEND_ADDED: await session.Character.SendPacketAsync(new InfoiPacket { Message = Game18NConstString.Registered - }).ConfigureAwait(false); + }); await targetCharacter.SendPacketAsync(new InfoiPacket { Message = Game18NConstString.Registered - }).ConfigureAwait(false); + }); await targetCharacter.SendPacketAsync(await targetCharacter.GenerateFinitAsync(friendHttpClient, channelHttpClient, - pubSubHub).ConfigureAwait(false)).ConfigureAwait(false); + pubSubHub)); await session.Character.SendPacketAsync(await session.Character.GenerateFinitAsync(friendHttpClient, - channelHttpClient, pubSubHub).ConfigureAwait(false)).ConfigureAwait(false); + channelHttpClient, pubSubHub)); break; case LanguageKey.FRIEND_REJECTED: await targetCharacter.SendPacketAsync(new InfoiPacket { Message = Game18NConstString.YouAreBlocked - }).ConfigureAwait(false); + }); break; default: diff --git a/src/NosCore.PacketHandlers/Friend/FlPacketHandler.cs b/src/NosCore.PacketHandlers/Friend/FlPacketHandler.cs index 314d18db1..4f38c8717 100644 --- a/src/NosCore.PacketHandlers/Friend/FlPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Friend/FlPacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -41,7 +41,7 @@ public override async Task ExecuteAsync(FlCommandPacket flPacket, ClientSession await session.SendPacketAsync(new InfoiPacket { Message = Game18NConstString.UnknownCharacter - }).ConfigureAwait(false); + }); return; } @@ -51,7 +51,7 @@ await session.SendPacketAsync(new InfoiPacket Type = FinsPacketType.Accepted }; - await session.HandlePacketsAsync(new[] { fins }).ConfigureAwait(false); + await session.HandlePacketsAsync(new[] { fins }); } } } \ No newline at end of file diff --git a/src/NosCore.PacketHandlers/Game/GameStartPacketHandler.cs b/src/NosCore.PacketHandlers/Game/GameStartPacketHandler.cs index dc4a075c6..6efc7537e 100644 --- a/src/NosCore.PacketHandlers/Game/GameStartPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Game/GameStartPacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -68,19 +68,19 @@ public override async Task ExecuteAsync(GameStartPacket packet, ClientSession se if (worldConfiguration.Value.WorldInformation) { await session.SendPacketAsync(session.Character.GenerateSay("-------------------[NosCore]---------------", - SayColorType.Yellow)).ConfigureAwait(false); + SayColorType.Yellow)); await session.SendPacketAsync(session.Character.GenerateSay("Github : https://github.com/NosCoreIO/NosCore/", - SayColorType.Red)).ConfigureAwait(false); + SayColorType.Red)); await session.SendPacketAsync(session.Character.GenerateSay("-----------------------------------------------", - SayColorType.Yellow)).ConfigureAwait(false); + SayColorType.Yellow)); } await skillService.LoadSkill(session.Character); - await session.SendPacketAsync(session.Character.GenerateTit()).ConfigureAwait(false); - await session.SendPacketAsync(session.Character.GenerateSpPoint()).ConfigureAwait(false); - await session.SendPacketAsync(session.Character.GenerateRsfi()).ConfigureAwait(false); - await session.SendPacketAsync(session.Character.GenerateQuestPacket()).ConfigureAwait(false); + await session.SendPacketAsync(session.Character.GenerateTit()); + await session.SendPacketAsync(session.Character.GenerateSpPoint()); + await session.SendPacketAsync(session.Character.GenerateRsfi()); + await session.SendPacketAsync(session.Character.GenerateQuestPacket()); if (session.Character.Hp <= 0) { @@ -88,13 +88,13 @@ await session.SendPacketAsync(session.Character.GenerateSay("------------------- } else { - await mapChangeService.ChangeMapAsync(session).ConfigureAwait(false); + await mapChangeService.ChangeMapAsync(session); } // Session.SendPacket(Session.Character.GenerateSki()); // Session.SendPacket($"fd {Session.Character.Reput} 0 {(int)Session.Character.Dignity} {Math.Abs(Session.Character.GetDignityIco())}"); - await session.SendPacketAsync(session.Character.GenerateFd()).ConfigureAwait(false); - await session.SendPacketAsync(session.Character.GenerateStat()).ConfigureAwait(false); + await session.SendPacketAsync(session.Character.GenerateFd()); + await session.SendPacketAsync(session.Character.GenerateStat()); // Session.SendPacket("rage 0 250000"); // Session.SendPacket("rank_cool 0 0 18000"); // SpecialistInstance specialistInstance = Session.Character.Inventory.LoadBySlotAndType(8, InventoryType.Wear); @@ -107,7 +107,7 @@ await session.SendPacketAsync(new SayiPacket VisualId = session.Character.CharacterId, Type = SayColorType.Green, Message = Game18NConstString.NosMerchantActive, - }).ConfigureAwait(false); + }); } // if (Session.Character.StaticBonusList.Any(s => s.StaticBonusType == StaticBonusType.PetBasket)) @@ -129,9 +129,9 @@ await session.SendPacketAsync(new SayiPacket // Session.SendPacket($"bn {i} {Language.Instance.GetMessageFromKey($"BN{i}")}"); // } session.Character.LoadExpensions(); - await session.SendPacketAsync(session.Character.GenerateExts(worldConfiguration)).ConfigureAwait(false); + await session.SendPacketAsync(session.Character.GenerateExts(worldConfiguration)); // Session.SendPacket(Session.Character.GenerateMlinfo()); - await session.SendPacketAsync(new PclearPacket()).ConfigureAwait(false); + await session.SendPacketAsync(new PclearPacket()); // Session.SendPacket(Session.Character.GeneratePinit()); // Session.SendPackets(Session.Character.GeneratePst()); @@ -147,7 +147,7 @@ await session.SendPacketAsync(new TwkPacket(session.Account.Name, session.Charac }); // Session.SendPacket($"twk 2 {Session.Character.CharacterId} {Session.Account.Name} {Session.Character.Name} shtmxpdlfeoqkr"); - await session.SendPacketsAsync(session.Character.Quests.Values.Where(o => o.CompletedOn == null).Select(qst => qst.Quest.GenerateTargetPacket())).ConfigureAwait(false); + await session.SendPacketsAsync(session.Character.Quests.Values.Where(o => o.CompletedOn == null).Select(qst => qst.Quest.GenerateTargetPacket())); // // sqst bf // Session.SendPacket("act6"); // Session.SendPacket(Session.Character.GenerateFaction()); @@ -156,11 +156,11 @@ await session.SendPacketAsync(new TwkPacket(session.Account.Name, session.Charac // Session.SendPackets(Session.Character.GenerateScN()); // Session.Character.GenerateStartupInventory(); - await session.SendPacketAsync(session.Character.GenerateGold()).ConfigureAwait(false); - await session.SendPacketAsync(session.Character.GenerateCond()).ConfigureAwait(false); + await session.SendPacketAsync(session.Character.GenerateGold()); + await session.SendPacketAsync(session.Character.GenerateCond()); await session.SendPacketAsync(session.Character.GenerateSki()); - await session.SendPacketsAsync(session.Character.GenerateQuicklist()).ConfigureAwait(false); + await session.SendPacketsAsync(session.Character.GenerateQuicklist()); // string clinit = ServerManager.Instance.TopComplimented.Aggregate("clinit", // (current, character) => current + $" {character.CharacterId}|{character.Level}|{character.HeroLevel}|{character.Compliment}|{character.Name}"); @@ -171,10 +171,10 @@ await session.SendPacketAsync(new TwkPacket(session.Account.Name, session.Charac // Session.CurrentMapInstance?.Broadcast(Session.Character.GenerateGidx()); - await session.Character.SendFinfoAsync(friendHttpClient, pubSubHub, packetSerializer, true).ConfigureAwait(false); + await session.Character.SendFinfoAsync(friendHttpClient, pubSubHub, packetSerializer, true); - await session.SendPacketAsync(await session.Character.GenerateFinitAsync(friendHttpClient, channelHttpClient, pubSubHub).ConfigureAwait(false)).ConfigureAwait(false); - await session.SendPacketAsync(await session.Character.GenerateBlinitAsync(blacklistHttpClient).ConfigureAwait(false)).ConfigureAwait(false); + await session.SendPacketAsync(await session.Character.GenerateFinitAsync(friendHttpClient, channelHttpClient, pubSubHub)); + await session.SendPacketAsync(await session.Character.GenerateBlinitAsync(blacklistHttpClient)); // Session.SendPacket(clinit); // Session.SendPacket(flinit); // Session.SendPacket(kdlinit); @@ -208,10 +208,10 @@ await session.SendPacketAsync(new TwkPacket(session.Account.Name, session.Charac // } // // finfo - friends info - var mails = await mailHttpClient.GetMails(-1, session.Character.CharacterId, false).ConfigureAwait(false); - await session.Character.GenerateMailAsync(mails).ConfigureAwait(false); + var mails = await mailHttpClient.GetMails(-1, session.Character.CharacterId, false); + await session.Character.GenerateMailAsync(mails); - await session.SendPacketAsync(session.Character.GenerateTitle()).ConfigureAwait(false); + await session.SendPacketAsync(session.Character.GenerateTitle()); int giftcount = mails.Select(s => s.MailDto).Count(mail => !mail.IsSenderCopy && mail.ReceiverId == session.Character.CharacterId && mail.ItemInstanceId != null && !mail.IsOpened); int mailcount = mails.Select(s => s.MailDto).Count(mail => !mail.IsSenderCopy && mail.ReceiverId == session.Character.CharacterId && mail.ItemInstanceId == null && !mail.IsOpened); @@ -225,7 +225,7 @@ await session.SendPacketAsync(new SayiPacket Message = Game18NConstString.NewParcelArrived, ArgumentType = 4, Game18NArguments = { giftcount } - }).ConfigureAwait(false); + }); } if (mailcount > 0) @@ -238,7 +238,7 @@ await session.SendPacketAsync(new SayiPacket Message = Game18NConstString.NewNoteArrived, ArgumentType = 4, Game18NArguments = { mailcount } - }).ConfigureAwait(false); + }); } // Session.Character.DeleteTimeout(); diff --git a/src/NosCore.PacketHandlers/Game/NcifPacketHandler.cs b/src/NosCore.PacketHandlers/Game/NcifPacketHandler.cs index c5258f1cd..20ee79755 100644 --- a/src/NosCore.PacketHandlers/Game/NcifPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Game/NcifPacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -58,7 +58,7 @@ public override async Task ExecuteAsync(NcifPacket ncifPacket, ClientSession ses if (entity != null) { - await session.SendPacketAsync(entity.GenerateStatInfo()).ConfigureAwait(false); + await session.SendPacketAsync(entity.GenerateStatInfo()); } } } diff --git a/src/NosCore.PacketHandlers/Game/PulsePacketHandler.cs b/src/NosCore.PacketHandlers/Game/PulsePacketHandler.cs index 748d27498..26aba9eea 100644 --- a/src/NosCore.PacketHandlers/Game/PulsePacketHandler.cs +++ b/src/NosCore.PacketHandlers/Game/PulsePacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -31,7 +31,7 @@ public override async Task ExecuteAsync(PulsePacket pulsePacket, ClientSession s session.LastPulse += 60; if (pulsePacket.Tick != session.LastPulse) { - await session.DisconnectAsync().ConfigureAwait(false); + await session.DisconnectAsync(); } } } diff --git a/src/NosCore.PacketHandlers/Game/QSetPacketHandler.cs b/src/NosCore.PacketHandlers/Game/QSetPacketHandler.cs index df2a9867c..51fd8f971 100644 --- a/src/NosCore.PacketHandlers/Game/QSetPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Game/QSetPacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -43,7 +43,7 @@ await session.SendPacketAsync(new QsetClientPacket OriginQuickListSlot = data2, Data = 0 } - }).ConfigureAwait(false); + }); } public override async Task ExecuteAsync(QsetPacket qSetPacket, ClientSession session) @@ -78,7 +78,7 @@ public override async Task ExecuteAsync(QsetPacket qSetPacket, ClientSession ses IconVNum = data2, Morph = morph }); - await SendQSetAsync(session, quickListIndex, q2, type, data1, data2).ConfigureAwait(false); + await SendQSetAsync(session, quickListIndex, q2, type, data1, data2); break; case QSetType.Move: @@ -94,15 +94,15 @@ public override async Task ExecuteAsync(QsetPacket qSetPacket, ClientSession ses if (qlTo == null) { - await SendQSetAsync(session, qlFrom.QuickListIndex, qlFrom.Slot, (QSetType)qlFrom.Type, qlFrom.IconType, qlFrom.IconVNum).ConfigureAwait(false); - await SendQSetAsync(session, data1, data2, QSetType.Reset, 7, -1).ConfigureAwait(false); + await SendQSetAsync(session, qlFrom.QuickListIndex, qlFrom.Slot, (QSetType)qlFrom.Type, qlFrom.IconType, qlFrom.IconVNum); + await SendQSetAsync(session, data1, data2, QSetType.Reset, 7, -1); } else { - await SendQSetAsync(session, qlFrom.QuickListIndex, qlFrom.Slot, (QSetType)qlFrom.Type, qlFrom.IconType, qlFrom.IconVNum).ConfigureAwait(false); + await SendQSetAsync(session, qlFrom.QuickListIndex, qlFrom.Slot, (QSetType)qlFrom.Type, qlFrom.IconType, qlFrom.IconVNum); qlTo.QuickListIndex = data1; qlTo.Slot = data2; - await SendQSetAsync(session, qlTo.QuickListIndex, qlTo.Slot, (QSetType)qlTo.Type, qlTo.IconType, qlTo.IconVNum).ConfigureAwait(false); + await SendQSetAsync(session, qlTo.QuickListIndex, qlTo.Slot, (QSetType)qlTo.Type, qlTo.IconType, qlTo.IconVNum); } } @@ -111,7 +111,7 @@ public override async Task ExecuteAsync(QsetPacket qSetPacket, ClientSession ses case QSetType.Remove: session.Character.QuicklistEntries.RemoveAll( n => (n.QuickListIndex == quickListIndex) && (n.Slot == q2) && (n.Morph == morph)); - await SendQSetAsync(session, quickListIndex, q2, QSetType.Reset, 7, -1).ConfigureAwait(false); + await SendQSetAsync(session, quickListIndex, q2, QSetType.Reset, 7, -1); break; default: diff --git a/src/NosCore.PacketHandlers/Game/TitEqPacketHandler.cs b/src/NosCore.PacketHandlers/Game/TitEqPacketHandler.cs index 5f713eaf3..01beef97a 100644 --- a/src/NosCore.PacketHandlers/Game/TitEqPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Game/TitEqPacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -52,7 +52,7 @@ public override async Task ExecuteAsync(TitEqPacket titEqPacket, ClientSession s await session.SendPacketAsync(new InfoiPacket { Message = Game18NConstString.TitleChangedOrHidden - }).ConfigureAwait(false); + }); break; default: foreach (var title in session.Character.Titles.Where(s => s.TitleType != titEqPacket.TitleId)) @@ -63,11 +63,11 @@ await session.SendPacketAsync(new InfoiPacket await session.SendPacketAsync(new InfoiPacket { Message = Game18NConstString.TitleEffectChangedOrDeactivated - }).ConfigureAwait(false); + }); break; } - await session.Character.MapInstance.SendPacketAsync(session.Character.GenerateTitInfo()).ConfigureAwait(false); - await session.Character.SendPacketAsync(session.Character.GenerateTitle()).ConfigureAwait(false); + await session.Character.MapInstance.SendPacketAsync(session.Character.GenerateTitInfo()); + await session.Character.SendPacketAsync(session.Character.GenerateTitle()); } } } \ No newline at end of file diff --git a/src/NosCore.PacketHandlers/Group/PjoinPacketHandler.cs b/src/NosCore.PacketHandlers/Group/PjoinPacketHandler.cs index 5f1ce806d..8f65c349c 100644 --- a/src/NosCore.PacketHandlers/Group/PjoinPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Group/PjoinPacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -74,7 +74,7 @@ public override async Task ExecuteAsync(PjoinPacket pjoinPacket, ClientSession c await clientSession.SendPacketAsync(new InfoiPacket { Message = Game18NConstString.GroupIsFull - }).ConfigureAwait(false); + }); return; } @@ -83,17 +83,17 @@ await clientSession.SendPacketAsync(new InfoiPacket await clientSession.SendPacketAsync(new InfoiPacket { Message = Game18NConstString.AlreadyInAnotherGroup - }).ConfigureAwait(false); + }); return; } - var blacklisteds = await blacklistHttpCLient.GetBlacklistedAsync(clientSession.Character.VisualId).ConfigureAwait(false); + var blacklisteds = await blacklistHttpCLient.GetBlacklistedAsync(clientSession.Character.VisualId); if (blacklisteds != null && blacklisteds.Any(s => s.CharacterId == pjoinPacket.CharacterId)) { await clientSession.SendPacketAsync(new InfoiPacket { Message = Game18NConstString.AlreadyBlacklisted - }).ConfigureAwait(false); + }); return; } @@ -103,7 +103,7 @@ await clientSession.SendPacketAsync(new MsgiPacket { Type = MessageType.Default, Message = Game18NConstString.GroupBlocked - }).ConfigureAwait(false); + }); return; } @@ -117,7 +117,7 @@ await clientSession.SendPacketAsync(new InfoiPacket Message = Game18NConstString.CannotSendInvite, ArgumentType = 4, Game18NArguments = { diffTimeSpan.Seconds } - }).ConfigureAwait(false); + }); return; } } @@ -134,7 +134,7 @@ await clientSession.SendPacketAsync(new Infoi2Packet Message = Game18NConstString.YouInvitedToGroup, ArgumentType = 1, Game18NArguments = { targetSession.Name ?? "" } - }).ConfigureAwait(false); + }); await targetSession.SendPacketAsync(new Dlgi2Packet { Question = Game18NConstString.GroupInvite, @@ -150,7 +150,7 @@ await targetSession.SendPacketAsync(new Dlgi2Packet CharacterId = clientSession.Character.CharacterId, RequestType = GroupRequestType.Declined } - }).ConfigureAwait(false); + }); } break; @@ -164,7 +164,7 @@ await targetSession.SendPacketAsync(new Dlgi2Packet await clientSession.SendPacketAsync(new InfoiPacket { Message = Game18NConstString.CanNotChangeGroupMode - }).ConfigureAwait(false); + }); await Task.WhenAll(clientSession.Character.Group.Values .Where(s => s.Item2.VisualId != clientSession.Character.CharacterId) @@ -196,7 +196,7 @@ await Task.WhenAll(clientSession.Character.Group.Values RequestType = GroupRequestType.DeclinedShare } }); - })).ConfigureAwait(false); + })); break; case GroupRequestType.Accepted: @@ -217,12 +217,12 @@ await Task.WhenAll(clientSession.Character.Group.Values await clientSession.SendPacketAsync(new InfoiPacket { Message = Game18NConstString.GroupIsFull - }).ConfigureAwait(false); + }); await targetSession.SendPacketAsync(new InfoiPacket { Message = Game18NConstString.GroupIsFull - }).ConfigureAwait(false); + }); return; } @@ -245,7 +245,7 @@ await targetSession.SendPacketAsync(new InfoiPacket await targetSession.SendPacketAsync(new InfoiPacket { Message = Game18NConstString.YouAreNowGroupLeader - }).ConfigureAwait(false); + }); targetSession.Group = clientSession.Character.Group; clientSession.Character.GroupRequestCharacterIds.Clear(); @@ -269,7 +269,7 @@ await targetSession.SendPacketAsync(new InfoiPacket groupIdService.Items[currentGroup.GroupId] = currentGroup; await clientSession.Character.MapInstance.SendPacketAsync( - clientSession.Character.Group.GeneratePidx(clientSession.Character)).ConfigureAwait(false); + clientSession.Character.Group.GeneratePidx(clientSession.Character)); break; case GroupRequestType.Declined: @@ -287,7 +287,7 @@ await clientSession.SendPacketAsync(new Sayi2Packet Message = Game18NConstString.GroupInviteRejected, ArgumentType = 1, Game18NArguments = { targetSession.Name ?? "" } - }).ConfigureAwait(false); + }); break; case GroupRequestType.AcceptedShare: if (targetSession == null || !targetSession.GroupRequestCharacterIds.Values.Contains(clientSession.Character.CharacterId)) @@ -305,14 +305,14 @@ await clientSession.SendPacketAsync(new MsgiPacket { Type = MessageType.Default, Message = Game18NConstString.ChangedSamePointOfReturn - }).ConfigureAwait(false); + }); await clientSession.SendPacketAsync(new Msgi2Packet { Type = MessageType.Default, Message = Game18NConstString.SomeoneChangedPointOfReturn, ArgumentType = 1, Game18NArguments = { targetSession.Name ?? "" } - }).ConfigureAwait(false); + }); //TODO: add a way to change respawn points when system will be done break; case GroupRequestType.DeclinedShare: @@ -326,14 +326,14 @@ await targetSession.SendPacketAsync(new MsgiPacket { Type = MessageType.Default, Message = Game18NConstString.RefusedSharePointOfReturn - }).ConfigureAwait(false); + }); await clientSession.SendPacketAsync(new Msgi2Packet { Type = MessageType.Default, Message = Game18NConstString.SomeoneRefusedToSharePointOfReturn, ArgumentType = 1, Game18NArguments = { targetSession.Name ?? "" } - }).ConfigureAwait(false); + }); break; default: logger.Error(logLanguage[LogLanguageKey.GROUPREQUESTTYPE_UNKNOWN]); diff --git a/src/NosCore.PacketHandlers/Group/PleavePacketHandler.cs b/src/NosCore.PacketHandlers/Group/PleavePacketHandler.cs index 5e7b4cd02..fd491d895 100644 --- a/src/NosCore.PacketHandlers/Group/PleavePacketHandler.cs +++ b/src/NosCore.PacketHandlers/Group/PleavePacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -49,7 +49,7 @@ public override async Task ExecuteAsync(PleavePacket bIPacket, ClientSession cli if (group.Count > 2) { var isLeader = group.IsGroupLeader(clientSession.Character.CharacterId); - await clientSession.Character.LeaveGroupAsync().ConfigureAwait(false); + await clientSession.Character.LeaveGroupAsync(); if (isLeader) { @@ -64,7 +64,7 @@ public override async Task ExecuteAsync(PleavePacket bIPacket, ClientSession cli await targetsession.SendPacketAsync(new InfoiPacket { Message = Game18NConstString.YouAreNowGroupLeader - }).ConfigureAwait(false); + }); } if (group.Type != GroupType.Group) @@ -75,12 +75,12 @@ await targetsession.SendPacketAsync(new InfoiPacket foreach (var member in group.Values.Where(s => s.Item2 is ICharacterEntity)) { var character = member.Item2 as ICharacterEntity; - await (character == null ? Task.CompletedTask : character.SendPacketAsync(character.Group!.GeneratePinit())).ConfigureAwait(false); + await (character == null ? Task.CompletedTask : character.SendPacketAsync(character.Group!.GeneratePinit())); } - await clientSession.SendPacketAsync(clientSession.Character.Group!.GeneratePinit()).ConfigureAwait(false); + await clientSession.SendPacketAsync(clientSession.Character.Group!.GeneratePinit()); await clientSession.Character.MapInstance.SendPacketAsync( - clientSession.Character.Group.GeneratePidx(clientSession.Character)).ConfigureAwait(false); + clientSession.Character.Group.GeneratePidx(clientSession.Character)); } else { @@ -102,11 +102,11 @@ await targetsession.SendPacketAsync(new MsgiPacket { Type = MessageType.Default, Message = Game18NConstString.PartyDisbanded - }).ConfigureAwait(false); + }); - await targetsession.LeaveGroupAsync().ConfigureAwait(false); - await targetsession.SendPacketAsync(targetsession.Group!.GeneratePinit()).ConfigureAwait(false); - await targetsession.MapInstance.SendPacketAsync(targetsession.Group.GeneratePidx(targetsession)).ConfigureAwait(false); + await targetsession.LeaveGroupAsync(); + await targetsession.SendPacketAsync(targetsession.Group!.GeneratePinit()); + await targetsession.MapInstance.SendPacketAsync(targetsession.Group.GeneratePidx(targetsession)); } groupIdService.Items.TryRemove(group.GroupId, out _); diff --git a/src/NosCore.PacketHandlers/Inventory/BiPacketHandler.cs b/src/NosCore.PacketHandlers/Inventory/BiPacketHandler.cs index c55f59d04..23cd2b98f 100644 --- a/src/NosCore.PacketHandlers/Inventory/BiPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Inventory/BiPacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -55,7 +55,7 @@ await clientSession.SendPacketAsync( Option = RequestDeletionType.Declined }, Question = Game18NConstString.ItemWillDestroy - }).ConfigureAwait(false); + }); break; case RequestDeletionType.Requested: @@ -75,7 +75,7 @@ await clientSession.SendPacketAsync( Option = RequestDeletionType.Declined }, Question = Game18NConstString.AskDestroyItem - }).ConfigureAwait(false); + }); break; case RequestDeletionType.Confirmed: @@ -87,7 +87,7 @@ await clientSession.SendPacketAsync( var item = clientSession.Character.InventoryService.DeleteFromTypeAndSlot( (NoscorePocketType)bIPacket.PocketType, bIPacket.Slot); - await clientSession.SendPacketAsync(item.GeneratePocketChange(bIPacket.PocketType, bIPacket.Slot)).ConfigureAwait(false); + await clientSession.SendPacketAsync(item.GeneratePocketChange(bIPacket.PocketType, bIPacket.Slot)); break; default: return; diff --git a/src/NosCore.PacketHandlers/Inventory/GetPacketHandler.cs b/src/NosCore.PacketHandlers/Inventory/GetPacketHandler.cs index 04074b211..6357acac8 100644 --- a/src/NosCore.PacketHandlers/Inventory/GetPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Inventory/GetPacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -79,14 +79,14 @@ await clientSession.SendPacketAsync(new SayiPacket VisualId = clientSession.Character.CharacterId, Type = SayColorType.Yellow, Message = Game18NConstString.UnableToPickUp - }).ConfigureAwait(false); + }); return; } mapItem.Requests[typeof(IGetMapItemEventHandler)].OnNext(new RequestData>(clientSession, new Tuple(mapItem, getPacket))); - await Task.WhenAll(mapItem.HandlerTasks).ConfigureAwait(false); + await Task.WhenAll(mapItem.HandlerTasks); } } } \ No newline at end of file diff --git a/src/NosCore.PacketHandlers/Inventory/MvePacketHandler.cs b/src/NosCore.PacketHandlers/Inventory/MvePacketHandler.cs index 8a5cd7c7b..9b6d6c76e 100644 --- a/src/NosCore.PacketHandlers/Inventory/MvePacketHandler.cs +++ b/src/NosCore.PacketHandlers/Inventory/MvePacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -35,9 +35,9 @@ public override async Task ExecuteAsync(MvePacket mvePacket, ClientSession clien (NoscorePocketType)mvePacket.InventoryType, (NoscorePocketType)mvePacket.DestinationInventoryType, mvePacket.DestinationSlot, false); await clientSession.SendPacketAsync(inv.GeneratePocketChange(mvePacket.DestinationInventoryType, - mvePacket.DestinationSlot)).ConfigureAwait(false); + mvePacket.DestinationSlot)); await clientSession.SendPacketAsync( - ((InventoryItemInstance?)null).GeneratePocketChange(mvePacket.InventoryType, mvePacket.Slot)).ConfigureAwait(false); + ((InventoryItemInstance?)null).GeneratePocketChange(mvePacket.InventoryType, mvePacket.Slot)); } } } \ No newline at end of file diff --git a/src/NosCore.PacketHandlers/Inventory/MviPacketHandler.cs b/src/NosCore.PacketHandlers/Inventory/MviPacketHandler.cs index 3c93c7c3d..89f25eb6d 100644 --- a/src/NosCore.PacketHandlers/Inventory/MviPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Inventory/MviPacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -35,8 +35,8 @@ public override async Task ExecuteAsync(MviPacket mviPacket, ClientSession clien mviPacket.Amount, mviPacket.DestinationSlot, out var previousInventory, out var newInventory); await clientSession.SendPacketAsync( - newInventory.GeneratePocketChange(mviPacket.InventoryType, mviPacket.DestinationSlot)).ConfigureAwait(false); - await clientSession.SendPacketAsync(previousInventory.GeneratePocketChange(mviPacket.InventoryType, mviPacket.Slot)).ConfigureAwait(false); + newInventory.GeneratePocketChange(mviPacket.InventoryType, mviPacket.DestinationSlot)); + await clientSession.SendPacketAsync(previousInventory.GeneratePocketChange(mviPacket.InventoryType, mviPacket.Slot)); } } } \ No newline at end of file diff --git a/src/NosCore.PacketHandlers/Inventory/PutPacketHandler.cs b/src/NosCore.PacketHandlers/Inventory/PutPacketHandler.cs index b368ed859..baf30edf0 100644 --- a/src/NosCore.PacketHandlers/Inventory/PutPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Inventory/PutPacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -65,14 +65,14 @@ await clientSession.SendPacketAsync(new SayiPacket VisualId = clientSession.Character.CharacterId, Type = SayColorType.Yellow, Message = Game18NConstString.CantDropItem - }).ConfigureAwait(false); + }); return; } invitem = clientSession.Character.InventoryService.LoadBySlotAndType(putPacket.Slot, (NoscorePocketType)putPacket.PocketType); - await clientSession.SendPacketAsync(invitem.GeneratePocketChange(putPacket.PocketType, putPacket.Slot)).ConfigureAwait(false); - await clientSession.Character.MapInstance.SendPacketAsync(droppedItem.GenerateDrop()).ConfigureAwait(false); + await clientSession.SendPacketAsync(invitem.GeneratePocketChange(putPacket.PocketType, putPacket.Slot)); + await clientSession.Character.MapInstance.SendPacketAsync(droppedItem.GenerateDrop()); } else { @@ -80,7 +80,7 @@ await clientSession.SendPacketAsync(new MsgPacket { Type = MessageType.Default, Message = gameLanguageLocalizer[LanguageKey.DROP_MAP_FULL, clientSession.Account.Language], - }).ConfigureAwait(false); + }); } } else @@ -89,7 +89,7 @@ await clientSession.SendPacketAsync(new MsgPacket { Type = MessageType.Default, Message = gameLanguageLocalizer[LanguageKey.BAD_DROP_AMOUNT, clientSession.Account.Language], - }).ConfigureAwait(false); + }); } } else @@ -100,7 +100,7 @@ await clientSession.SendPacketAsync(new SayiPacket VisualId = clientSession.Character.CharacterId, Type = SayColorType.Yellow, Message = Game18NConstString.CantDropItem - }).ConfigureAwait(false); + }); } } } diff --git a/src/NosCore.PacketHandlers/Inventory/RemovePacketHandler.cs b/src/NosCore.PacketHandlers/Inventory/RemovePacketHandler.cs index 7ad97cdc9..7ad857f57 100644 --- a/src/NosCore.PacketHandlers/Inventory/RemovePacketHandler.cs +++ b/src/NosCore.PacketHandlers/Inventory/RemovePacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -60,19 +60,19 @@ await clientSession.SendPacketAsync(new MsgiPacket { Type = MessageType.Default, Message = Game18NConstString.NotEnoughSpace - }).ConfigureAwait(false); + }); return; } - await clientSession.SendPacketAsync(inv.GeneratePocketChange((PocketType)inv.Type, inv.Slot)).ConfigureAwait(false); + await clientSession.SendPacketAsync(inv.GeneratePocketChange((PocketType)inv.Type, inv.Slot)); - await clientSession.Character.MapInstance.SendPacketAsync(clientSession.Character.GenerateEq()).ConfigureAwait(false); - await clientSession.SendPacketAsync(clientSession.Character.GenerateEquipment()).ConfigureAwait(false); + await clientSession.Character.MapInstance.SendPacketAsync(clientSession.Character.GenerateEq()); + await clientSession.SendPacketAsync(clientSession.Character.GenerateEquipment()); if (inv.ItemInstance.Item.EquipmentSlot == EquipmentType.Fairy) { await clientSession.Character.MapInstance.SendPacketAsync( - clientSession.Character.GeneratePairy(null)).ConfigureAwait(false); + clientSession.Character.GeneratePairy(null)); } } } diff --git a/src/NosCore.PacketHandlers/Inventory/SpTransformPacketHandler.cs b/src/NosCore.PacketHandlers/Inventory/SpTransformPacketHandler.cs index c6e19496b..78484b0ac 100644 --- a/src/NosCore.PacketHandlers/Inventory/SpTransformPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Inventory/SpTransformPacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -61,7 +61,7 @@ await clientSession.SendPacketAsync(new MsgiPacket { Type = MessageType.Default, Message = Game18NConstString.NoSpecialistCardEquipped - }).ConfigureAwait(false); + }); return; } @@ -71,7 +71,7 @@ await clientSession.SendPacketAsync(new MsgiPacket { Type = MessageType.Default, Message = Game18NConstString.CantUseInVehicle - }).ConfigureAwait(false); + }); return; } @@ -90,7 +90,7 @@ await clientSession.SendPacketAsync(new MsgPacket { Message = gameLanguageLocalizer[LanguageKey.SP_NOPOINTS, clientSession.Account.Language] - }).ConfigureAwait(false); + }); return; } @@ -107,13 +107,13 @@ await clientSession.SendPacketAsync(new DelayPacket Type = DelayPacketType.Locomotion, Delay = 5000, Packet = new SpTransformPacket { Type = SlPacketType.WearSpAndTransform } - }).ConfigureAwait(false); + }); await clientSession.Character.MapInstance.SendPacketAsync(new GuriPacket { Type = GuriPacketType.Dance, Argument = 1, EntityId = clientSession.Character.CharacterId - }).ConfigureAwait(false); + }); } } else @@ -124,7 +124,7 @@ await clientSession.SendPacketAsync(new MsgiPacket Message = Game18NConstString.CantTrasformWithSideEffect, ArgumentType = 4, Game18NArguments = { (short)(clientSession.Character.SpCooldown - (int)Math.Round(currentRunningSeconds)) } - }).ConfigureAwait(false); + }); } } } diff --git a/src/NosCore.PacketHandlers/Miniland/AddobjPacketHandler.cs b/src/NosCore.PacketHandlers/Miniland/AddobjPacketHandler.cs index 77ff1c34d..037da4ce1 100644 --- a/src/NosCore.PacketHandlers/Miniland/AddobjPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Miniland/AddobjPacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -51,7 +51,7 @@ await clientSession.SendPacketAsync(new MsgiPacket { Type = MessageType.Default, Message = Game18NConstString.YouAlreadyHaveThisMinilandObject - }).ConfigureAwait(false); + }); return; } @@ -61,7 +61,7 @@ await clientSession.SendPacketAsync(new MsgiPacket { Type = MessageType.Default, Message = Game18NConstString.InstallationOnlyLockMode - }).ConfigureAwait(false); + }); return; } @@ -86,16 +86,16 @@ await clientSession.SendPacketAsync(new MsgiPacket minilandobject.ItemInstance.Item.ItemSubType)).Value; if (min != null) { - await clientSession.HandlePacketsAsync(new[] { new RmvobjPacket { Slot = min.InventoryItemInstance?.Slot ?? 0 } }).ConfigureAwait(false); + await clientSession.HandlePacketsAsync(new[] { new RmvobjPacket { Slot = min.InventoryItemInstance?.Slot ?? 0 } }); } } minilandProvider.AddMinilandObject(minilandobj, clientSession.Character.CharacterId, minilandobject); - await clientSession.SendPacketAsync(minilandobj.GenerateEffect()).ConfigureAwait(false); + await clientSession.SendPacketAsync(minilandobj.GenerateEffect()); await clientSession.SendPacketAsync(new MinilandPointPacket - { MinilandPoint = minilandobject.ItemInstance?.Item?.MinilandObjectPoint ?? 0, Unknown = 100 }).ConfigureAwait(false); - await clientSession.SendPacketAsync(minilandobj.GenerateMapDesignObject()).ConfigureAwait(false); + { MinilandPoint = minilandobject.ItemInstance?.Item?.MinilandObjectPoint ?? 0, Unknown = 100 }); + await clientSession.SendPacketAsync(minilandobj.GenerateMapDesignObject()); } } } \ No newline at end of file diff --git a/src/NosCore.PacketHandlers/Miniland/MJoinPacketHandler.cs b/src/NosCore.PacketHandlers/Miniland/MJoinPacketHandler.cs index f6c905302..81b21fece 100644 --- a/src/NosCore.PacketHandlers/Miniland/MJoinPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Miniland/MJoinPacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -38,13 +38,13 @@ public class MJoinPacketHandler(IFriendHub friendHttpClient, IMinilandService mi public override async Task ExecuteAsync(MJoinPacket mJoinPacket, ClientSession session) { var target = sessionRegistry.GetCharacter(s => s.VisualId == mJoinPacket.VisualId); - var friendList = await friendHttpClient.GetFriendsAsync(session.Character.CharacterId).ConfigureAwait(false); + var friendList = await friendHttpClient.GetFriendsAsync(session.Character.CharacterId); if (target != null && friendList.Any(s => s.CharacterId == mJoinPacket.VisualId)) { var miniland = minilandProvider.GetMiniland(mJoinPacket.VisualId); if (miniland.State == MinilandState.Open) { - await mapChangeService.ChangeMapInstanceAsync(session, miniland.MapInstanceId, 5, 8).ConfigureAwait(false); + await mapChangeService.ChangeMapInstanceAsync(session, miniland.MapInstanceId, 5, 8); } else { @@ -54,13 +54,13 @@ public override async Task ExecuteAsync(MJoinPacket mJoinPacket, ClientSession s .ToList() .Contains(target.VisualId)) { - await mapChangeService.ChangeMapInstanceAsync(session, miniland.MapInstanceId, 5, 8).ConfigureAwait(false); + await mapChangeService.ChangeMapInstanceAsync(session, miniland.MapInstanceId, 5, 8); return; } await session.SendPacketAsync(new InfoiPacket { Message = Game18NConstString.MinilandLocked - }).ConfigureAwait(false); + }); } } } diff --git a/src/NosCore.PacketHandlers/Miniland/MinilandObjects/MgPacketHandler.cs b/src/NosCore.PacketHandlers/Miniland/MinilandObjects/MgPacketHandler.cs index 05048cb25..49b781b1c 100644 --- a/src/NosCore.PacketHandlers/Miniland/MinilandObjects/MgPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Miniland/MinilandObjects/MgPacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -78,39 +78,39 @@ public override async Task ExecuteAsync(MinigamePacket minigamePacket, ClientSes switch (minigamePacket.Type) { case 1: - await PlayAsync(game).ConfigureAwait(false); + await PlayAsync(game); break; case 2: - await BroadcastEffectAsync().ConfigureAwait(false); + await BroadcastEffectAsync(); break; case 3: - await ShowBoxLevelsAsync(game).ConfigureAwait(false); + await ShowBoxLevelsAsync(game); break; case 4: - await SelectGiftAsync().ConfigureAwait(false); + await SelectGiftAsync(); break; case 5: - await ShowMinilandManagmentAsync().ConfigureAwait(false); + await ShowMinilandManagmentAsync(); break; case 6: - await RefillAsync().ConfigureAwait(false); + await RefillAsync(); break; case 7: - await ShowGiftsAsync().ConfigureAwait(false); + await ShowGiftsAsync(); break; case 8: - await OpenGiftBatchAsync().ConfigureAwait(false); + await OpenGiftBatchAsync(); break; case 9: - await UseCouponAsync().ConfigureAwait(false); + await UseCouponAsync(); break; } } @@ -130,8 +130,8 @@ await _clientSession.SendPacketAsync(new InfoiPacket Message = Game18NConstString.ToppedUpPoints, ArgumentType = 4, Game18NArguments = { point } - }).ConfigureAwait(false); - await ShowMinilandManagmentAsync().ConfigureAwait(false); + }); + await ShowMinilandManagmentAsync(); } } @@ -212,7 +212,7 @@ await _clientSession.SendPacketAsync(new SayiPacket Message = Game18NConstString.ReceivedThisItem, ArgumentType = 2, Game18NArguments = { item.Item.VNum.ToString(), amount } - }).ConfigureAwait(false); + }); } list.Add(new MloPmgSubPacket @@ -224,7 +224,7 @@ await _clientSession.SendPacketAsync(new SayiPacket } } - await ShowGiftsAsync(list.ToArray()).ConfigureAwait(false); + await ShowGiftsAsync(list.ToArray()); } private Task ShowGiftsAsync() @@ -272,7 +272,7 @@ private async Task RefillAsync() if (_clientSession?.Character.Gold > _minigamePacket.Point) { _clientSession.Character.Gold -= (int)_minigamePacket.Point; - await _clientSession.SendPacketAsync(_clientSession.Character.GenerateGold()).ConfigureAwait(false); + await _clientSession.SendPacketAsync(_clientSession.Character.GenerateGold()); _minilandObject!.InventoryItemInstance!.ItemInstance.DurabilityPoint += (int)(_minigamePacket.Point / 100); await _clientSession.SendPacketAsync(new InfoiPacket @@ -280,8 +280,8 @@ await _clientSession.SendPacketAsync(new InfoiPacket Message = Game18NConstString.ToppedUpPoints, ArgumentType = 4, Game18NArguments = { (int)_minigamePacket.Point / 100 } - }).ConfigureAwait(false); - await ShowMinilandManagmentAsync().ConfigureAwait(false); + }); + await ShowMinilandManagmentAsync(); } } @@ -297,7 +297,7 @@ private async Task SelectGiftAsync() { return; } - await _clientSession!.SendPacketAsync(new MloRwPacket { Amount = obj.Amount, VNum = obj.VNum }).ConfigureAwait(false); + await _clientSession!.SendPacketAsync(new MloRwPacket { Amount = obj.Amount, VNum = obj.VNum }); // _clientSession.SendPacket(new MlptPacket {_miniland.MinilandPoint, 100}); var inv = _clientSession.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create( itemProvider.Create(obj.VNum, @@ -344,7 +344,7 @@ private async Task ShowBoxLevelsAsync(byte game) Type = GuriPacketType.Dance, Value = 1, EntityId = _clientSession.Character.CharacterId - }).ConfigureAwait(false); + }); short level = -1; for (short i = 0; i < MinilandHelper.Instance.MinilandMaxPoint[game].Count(); i++) { @@ -361,7 +361,7 @@ private async Task ShowBoxLevelsAsync(byte game) await _clientSession.SendPacketAsync(level != -1 ? new MloLvPacket { Level = level } : (IPacket)new MinigamePacket - { Type = 3, Id = game, MinigameVNum = _minigamePacket!.MinigameVNum, Unknown = 0, Point = 0 }).ConfigureAwait(false); + { Type = 3, Id = game, MinigameVNum = _minigamePacket!.MinigameVNum, Unknown = 0, Point = 0 }); } private Task BroadcastEffectAsync() @@ -385,7 +385,7 @@ private async Task PlayAsync(byte game) VisualId = _clientSession.Character.CharacterId, Type = SayColorType.Red, Message = Game18NConstString.NeedToRestoreDurability - }).ConfigureAwait(false); + }); return; } @@ -402,7 +402,7 @@ private async Task PlayAsync(byte game) Unknown = 1 }, Question = Game18NConstString.NotEnoughProductionPointsAskStart - }).ConfigureAwait(false); + }); return; } @@ -411,10 +411,10 @@ private async Task PlayAsync(byte game) Type = GuriPacketType.Dance, Value = 1, EntityId = _clientSession.Character.CharacterId - }).ConfigureAwait(false); + }); _miniland.CurrentMinigame = (short)(game == 0 ? 5102 : game == 1 ? 5103 : game == 2 ? 5105 : game == 3 ? 5104 : game == 4 ? 5113 : 5112); - await _clientSession.SendPacketAsync(new MloStPacket { Game = game }).ConfigureAwait(false); + await _clientSession.SendPacketAsync(new MloStPacket { Game = game }); } } } \ No newline at end of file diff --git a/src/NosCore.PacketHandlers/Miniland/MinilandObjects/UseobjPacketHandler.cs b/src/NosCore.PacketHandlers/Miniland/MinilandObjects/UseobjPacketHandler.cs index e8000e0cb..b090d426a 100644 --- a/src/NosCore.PacketHandlers/Miniland/MinilandObjects/UseobjPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Miniland/MinilandObjects/UseobjPacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -96,17 +96,17 @@ await clientSession.SendPacketAsync(new MloInfoPacket MaximumPoints = MinilandHelper.Instance.MinilandMaxPoint[game][5] } } - }).ConfigureAwait(false); + }); } else { var links = await warehouseHttpClient.GetWarehouseItems(null, clientSession.Character.CharacterId, - WarehouseType.Warehouse, null).ConfigureAwait(false); + WarehouseType.Warehouse, null); var warehouseItems = new List(); foreach (var warehouselink in links) { var warehouseItem = warehouselink.Warehouse!.Adapt(); - var itemInstance = await itemInstanceDao.FirstOrDefaultAsync(s => s!.Id == warehouselink.ItemInstance!.Id).ConfigureAwait(false); + var itemInstance = await itemInstanceDao.FirstOrDefaultAsync(s => s!.Id == warehouselink.ItemInstance!.Id); warehouseItem.ItemInstance = itemProvider.Convert(itemInstance!); warehouseItems.Add(warehouseItem); } @@ -117,7 +117,7 @@ await clientSession.SendPacketAsync(new StashAllPacket IvnSubPackets = warehouseItems.Select(invItem => invItem.ItemInstance.GenerateIvnSubPacket((PocketType)invItem.ItemInstance!.Item.Type, invItem.Slot)).ToList() - }).ConfigureAwait(false); + }); } } } diff --git a/src/NosCore.PacketHandlers/Miniland/MlobjPacketHandler.cs b/src/NosCore.PacketHandlers/Miniland/MlobjPacketHandler.cs index 82872a6c7..4ba039b20 100644 --- a/src/NosCore.PacketHandlers/Miniland/MlobjPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Miniland/MlobjPacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -37,12 +37,12 @@ public override async Task ExecuteAsync(MLEditPacket mlEditPacket, ClientSession switch (mlEditPacket.Type) { case 1: - await clientSession.SendPacketAsync(new MlintroPacket { Intro = mlEditPacket.MinilandInfo!.Replace(' ', '^') }).ConfigureAwait(false); + await clientSession.SendPacketAsync(new MlintroPacket { Intro = mlEditPacket.MinilandInfo!.Replace(' ', '^') }); miniland.MinilandMessage = mlEditPacket.MinilandInfo; await clientSession.SendPacketAsync(new InfoiPacket { Message = Game18NConstString.MinilandChanged - }).ConfigureAwait(false); + }); break; case 2: @@ -53,8 +53,8 @@ await clientSession.SendPacketAsync(new MsgiPacket { Type = MessageType.Default, Message = Game18NConstString.MinilandPrivate - }).ConfigureAwait(false); - await minilandProvider.SetStateAsync(clientSession.Character.CharacterId, MinilandState.Private).ConfigureAwait(false); + }); + await minilandProvider.SetStateAsync(clientSession.Character.CharacterId, MinilandState.Private); break; case MinilandState.Lock: @@ -62,8 +62,8 @@ await clientSession.SendPacketAsync(new MsgiPacket { Type = MessageType.Default, Message = Game18NConstString.MinilandLocked - }).ConfigureAwait(false); - await minilandProvider.SetStateAsync(clientSession.Character.CharacterId, MinilandState.Lock).ConfigureAwait(false); + }); + await minilandProvider.SetStateAsync(clientSession.Character.CharacterId, MinilandState.Lock); break; case MinilandState.Open: @@ -71,8 +71,8 @@ await clientSession.SendPacketAsync(new MsgiPacket { Type = MessageType.Default, Message = Game18NConstString.MinilandPublic - }).ConfigureAwait(false); - await minilandProvider.SetStateAsync(clientSession.Character.CharacterId, MinilandState.Open).ConfigureAwait(false); + }); + await minilandProvider.SetStateAsync(clientSession.Character.CharacterId, MinilandState.Open); break; default: diff --git a/src/NosCore.PacketHandlers/Miniland/RmvobjPacketHandler.cs b/src/NosCore.PacketHandlers/Miniland/RmvobjPacketHandler.cs index facd3dc22..bcbe0ee7e 100644 --- a/src/NosCore.PacketHandlers/Miniland/RmvobjPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Miniland/RmvobjPacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -47,7 +47,7 @@ await clientSession.SendPacketAsync(new MsgiPacket { Type = MessageType.Default, Message = Game18NConstString.RemoveOnlyLockMode - }).ConfigureAwait(false); + }); return; } @@ -58,10 +58,10 @@ await clientSession.SendPacketAsync(new MsgiPacket var minilandObject = clientSession.Character.MapInstance.MapDesignObjects[minilandobject.Id]; clientSession.Character.MapInstance.MapDesignObjects.TryRemove(minilandobject.Id, out _); - await clientSession.SendPacketAsync(minilandObject.GenerateEffect(true)).ConfigureAwait(false); + await clientSession.SendPacketAsync(minilandObject.GenerateEffect(true)); await clientSession.SendPacketAsync(new MinilandPointPacket - { MinilandPoint = minilandobject.ItemInstance.Item.MinilandObjectPoint, Unknown = 100 }).ConfigureAwait(false); - await clientSession.SendPacketAsync(minilandObject.GenerateMapDesignObject(true)).ConfigureAwait(false); + { MinilandPoint = minilandobject.ItemInstance.Item.MinilandObjectPoint, Unknown = 100 }); + await clientSession.SendPacketAsync(minilandObject.GenerateMapDesignObject(true)); } } } \ No newline at end of file diff --git a/src/NosCore.PacketHandlers/Movement/PreqPacketHandler.cs b/src/NosCore.PacketHandlers/Movement/PreqPacketHandler.cs index 60961be60..8300b9dd9 100644 --- a/src/NosCore.PacketHandlers/Movement/PreqPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Movement/PreqPacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -52,7 +52,7 @@ await session.SendPacketAsync(new SayiPacket VisualId = session.Character.CharacterId, Type = SayColorType.Yellow, Message = Game18NConstString.WillMoveShortly - }).ConfigureAwait(false); + }); return; } @@ -81,12 +81,12 @@ await session.SendPacketAsync(new SayiPacket && (mapInstanceAccessorService.GetMapInstance(portal.DestinationMapInstanceId)!.MapInstanceType == MapInstanceType.BaseMapInstance)) { - await mapChangeService.ChangeMapAsync(session, session.Character.MapId, session.Character.MapX, session.Character.MapY).ConfigureAwait(false); + await mapChangeService.ChangeMapAsync(session, session.Character.MapId, session.Character.MapX, session.Character.MapY); } else { await mapChangeService.ChangeMapInstanceAsync(session, portal.DestinationMapInstanceId, portal.DestinationX, - portal.DestinationY).ConfigureAwait(false); + portal.DestinationY); } } } diff --git a/src/NosCore.PacketHandlers/Movement/WalkPacketHandler.cs b/src/NosCore.PacketHandlers/Movement/WalkPacketHandler.cs index 6b7cf0d88..3a38cf7c1 100644 --- a/src/NosCore.PacketHandlers/Movement/WalkPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Movement/WalkPacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -65,7 +65,7 @@ public override async Task ExecuteAsync(WalkPacket walkPacket, ClientSession ses } await session.Character.MapInstance.SendPacketAsync(session.Character.GenerateMove(), - new EveryoneBut(session.Channel!.Id)).ConfigureAwait(false); + new EveryoneBut(session.Channel!.Id)); session.Character.LastMove = clock.GetCurrentInstant(); if (session.Character.MapInstance.MapInstanceType == MapInstanceType.BaseMapInstance) diff --git a/src/NosCore.PacketHandlers/Parcel/PclPacketHandler.cs b/src/NosCore.PacketHandlers/Parcel/PclPacketHandler.cs index c09520df3..03026ce9a 100644 --- a/src/NosCore.PacketHandlers/Parcel/PclPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Parcel/PclPacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -43,7 +43,7 @@ public class PclPacketHandler(IMailHub mailHttpClient, IItemGenerationService it public override async Task ExecuteAsync(PclPacket getGiftPacket, ClientSession clientSession) { var isCopy = getGiftPacket.Type == 2; - var mails = await mailHttpClient.GetMails(getGiftPacket.GiftId, clientSession.Character.VisualId, isCopy).ConfigureAwait(false); + var mails = await mailHttpClient.GetMails(getGiftPacket.GiftId, clientSession.Character.VisualId, isCopy); var mail = mails.FirstOrDefault(); if (mail == null) { @@ -52,7 +52,7 @@ public override async Task ExecuteAsync(PclPacket getGiftPacket, ClientSession c if ((getGiftPacket.Type == 4) && (mail.ItemInstance != null)) { - var itemInstance = await itemInstanceDao.FirstOrDefaultAsync(s => s!.Id == mail.ItemInstance.Id).ConfigureAwait(false); + var itemInstance = await itemInstanceDao.FirstOrDefaultAsync(s => s!.Id == mail.ItemInstance.Id); var item = itemProvider.Convert(itemInstance!); item.Id = Guid.NewGuid(); var newInv = clientSession.Character.InventoryService @@ -68,26 +68,26 @@ await clientSession.SendPacketAsync(new SayiPacket Message = Game18NConstString.ParcelReceived, ArgumentType = 2, Game18NArguments = { newInv.ItemInstance.Item.VNum.ToString(), newInv.ItemInstance.Amount } - }).ConfigureAwait(false); + }); await clientSession.SendPacketAsync( - new ParcelPacket { Type = 2, Unknown = 1, Id = (short)getGiftPacket.GiftId }).ConfigureAwait(false); - await mailHttpClient.DeleteMailAsync(getGiftPacket.GiftId, clientSession.Character.VisualId, isCopy).ConfigureAwait(false); + new ParcelPacket { Type = 2, Unknown = 1, Id = (short)getGiftPacket.GiftId }); + await mailHttpClient.DeleteMailAsync(getGiftPacket.GiftId, clientSession.Character.VisualId, isCopy); } else { - await clientSession.SendPacketAsync(new ParcelPacket { Type = 5, Unknown = 1, Id = 0 }).ConfigureAwait(false); + await clientSession.SendPacketAsync(new ParcelPacket { Type = 5, Unknown = 1, Id = 0 }); await clientSession.SendPacketAsync(new MsgiPacket { Type = MessageType.Default, Message = Game18NConstString.NotEnoughSpace - }).ConfigureAwait(false); + }); } } else if (getGiftPacket.Type == 5) { - await clientSession.SendPacketAsync(new ParcelPacket { Type = 7, Unknown = 1, Id = (short)getGiftPacket.GiftId }).ConfigureAwait(false); - await mailHttpClient.DeleteMailAsync(getGiftPacket.GiftId, clientSession.Character.VisualId, isCopy).ConfigureAwait(false); + await clientSession.SendPacketAsync(new ParcelPacket { Type = 7, Unknown = 1, Id = (short)getGiftPacket.GiftId }); + await mailHttpClient.DeleteMailAsync(getGiftPacket.GiftId, clientSession.Character.VisualId, isCopy); } } } diff --git a/src/NosCore.PacketHandlers/Parcel/PstClientPacketHandler.cs b/src/NosCore.PacketHandlers/Parcel/PstClientPacketHandler.cs index 5a3dd58e3..d51285115 100644 --- a/src/NosCore.PacketHandlers/Parcel/PstClientPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Parcel/PstClientPacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -42,7 +42,7 @@ public class PstClientPacketHandler(IMailHub mailHttpClient, IDao s.Name == pstClientPacket.ReceiverName && s.ServerId == clientSession.Character.ServerId).ConfigureAwait(false); + var dest = await characterDao.FirstOrDefaultAsync(s => s.Name == pstClientPacket.ReceiverName && s.ServerId == clientSession.Character.ServerId); if (dest != null) { - await mailHttpClient.SendMailAsync(GiftHelper.GenerateMailRequest(clock, clientSession.Character, dest.CharacterId, null, null, null, null, null, false, pstClientPacket.Title, pstClientPacket.Text)).ConfigureAwait(false); + await mailHttpClient.SendMailAsync(GiftHelper.GenerateMailRequest(clock, clientSession.Character, dest.CharacterId, null, null, null, null, null, false, pstClientPacket.Title, pstClientPacket.Text)); await clientSession.SendPacketAsync(new SayiPacket { VisualType = VisualType.Player, VisualId = clientSession.Character.CharacterId, Type = SayColorType.Red, Message = Game18NConstString.NoteSent - }).ConfigureAwait(false); + }); } else { @@ -97,7 +97,7 @@ await clientSession.SendPacketAsync(new SayiPacket VisualId = clientSession.Character.CharacterId, Type = SayColorType.Yellow, Message = Game18NConstString.CanNotFindPlayer - }).ConfigureAwait(false); + }); } break; diff --git a/src/NosCore.PacketHandlers/Quest/QTPacketHandler.cs b/src/NosCore.PacketHandlers/Quest/QTPacketHandler.cs index 3685de3c0..f736c77f4 100644 --- a/src/NosCore.PacketHandlers/Quest/QTPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Quest/QTPacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -48,7 +48,7 @@ public override async Task ExecuteAsync(QtPacket qtPacket, ClientSession session FirstArgument = session.Character.Script.Argument1, SecondArgument = session.Character.Script.ScriptId, ThirdArgument = session.Character.Script.ScriptStepId, - }).ConfigureAwait(false); + }); break; case QuestActionType.Achieve: @@ -58,7 +58,7 @@ public override async Task ExecuteAsync(QtPacket qtPacket, ClientSession session FirstArgument = session.Character.Script.Argument1, SecondArgument = session.Character.Script.ScriptId, ThirdArgument = session.Character.Script.ScriptStepId, - }).ConfigureAwait(false); + }); break; case QuestActionType.GiveUp: diff --git a/src/NosCore.PacketHandlers/Shops/MShopPacketHandler.cs b/src/NosCore.PacketHandlers/Shops/MShopPacketHandler.cs index 24655ce57..cb6202b1e 100644 --- a/src/NosCore.PacketHandlers/Shops/MShopPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Shops/MShopPacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -51,7 +51,7 @@ public override async Task ExecuteAsync(MShopPacket mShopPacket, ClientSession c await clientSession.SendPacketAsync(new InfoiPacket { Message = Game18NConstString.OpenShopAwayPortal - }).ConfigureAwait(false); + }); return; } @@ -63,7 +63,7 @@ await clientSession.SendPacketAsync(new SayiPacket VisualId = clientSession.Character.CharacterId, Type = SayColorType.Red, Message = Game18NConstString.TeammateCanNotOpenShop - }).ConfigureAwait(false); + }); return; } @@ -72,8 +72,8 @@ await clientSession.SendPacketAsync(new SayiPacket await clientSession.SendPacketAsync(new InfoiPacket { Message = Game18NConstString.UseCommercialMapToShop - }).ConfigureAwait(false); - await clientSession.SendPacketAsync(new ShopEndPacket { Type = ShopEndPacketType.PersonalShop }).ConfigureAwait(false); + }); + await clientSession.SendPacketAsync(new ShopEndPacket { Type = ShopEndPacketType.PersonalShop }); return; } @@ -112,8 +112,8 @@ await clientSession.SendPacketAsync(new SayiPacket VisualId = clientSession.Character.CharacterId, Type = SayColorType.Red, Message = Game18NConstString.SomeItemsCannotBeTraded - }).ConfigureAwait(false); - await clientSession.SendPacketAsync(new ShopEndPacket { Type = ShopEndPacketType.PersonalShop }).ConfigureAwait(false); + }); + await clientSession.SendPacketAsync(new ShopEndPacket { Type = ShopEndPacketType.PersonalShop }); clientSession.Character.Shop = null; return; } @@ -137,8 +137,8 @@ await clientSession.SendPacketAsync(new SayiPacket VisualId = clientSession.Character.CharacterId, Type = SayColorType.Yellow, Message = Game18NConstString.NoItemToSell - }).ConfigureAwait(false); - await clientSession.SendPacketAsync(new ShopEndPacket { Type = ShopEndPacketType.PersonalShop }).ConfigureAwait(false); + }); + await clientSession.SendPacketAsync(new ShopEndPacket { Type = ShopEndPacketType.PersonalShop }); clientSession.Character.Shop = null; return; } @@ -156,26 +156,26 @@ await clientSession.SendPacketAsync(new SayiPacket mShopPacket.Name.Substring(0, Math.Min(mShopPacket.Name.Length, 20)); } - await clientSession.Character.MapInstance.SendPacketAsync(clientSession.Character.GenerateShop(clientSession.Character.AccountLanguage)).ConfigureAwait(false); + await clientSession.Character.MapInstance.SendPacketAsync(clientSession.Character.GenerateShop(clientSession.Character.AccountLanguage)); await clientSession.SendPacketAsync(new InfoiPacket { Message = Game18NConstString.ShopOpened - }).ConfigureAwait(false); + }); clientSession.Character.Requests[typeof(INrunEventHandler)].Subscribe(data => data.ClientSession.SendPacketAsync( clientSession.Character.GenerateNpcReq(clientSession.Character.Shop.ShopId))); await clientSession.Character.MapInstance.SendPacketAsync(clientSession.Character.GeneratePFlag(), - new EveryoneBut(clientSession.Channel!.Id)).ConfigureAwait(false); + new EveryoneBut(clientSession.Channel!.Id)); clientSession.Character.IsSitting = true; - await clientSession.SendPacketAsync(clientSession.Character.GenerateCond()).ConfigureAwait(false); - await clientSession.Character.MapInstance.SendPacketAsync(clientSession.Character.GenerateRest()).ConfigureAwait(false); + await clientSession.SendPacketAsync(clientSession.Character.GenerateCond()); + await clientSession.Character.MapInstance.SendPacketAsync(clientSession.Character.GenerateRest()); break; case CreateShopPacketType.Close: - await clientSession.Character.CloseShopAsync().ConfigureAwait(false); + await clientSession.Character.CloseShopAsync(); break; case CreateShopPacketType.Create: - await clientSession.SendPacketAsync(new IshopPacket()).ConfigureAwait(false); + await clientSession.SendPacketAsync(new IshopPacket()); break; default: //todo log diff --git a/src/NosCore.PacketHandlers/Shops/NrunPacketHandler.cs b/src/NosCore.PacketHandlers/Shops/NrunPacketHandler.cs index 84f66441f..a65c7ef72 100644 --- a/src/NosCore.PacketHandlers/Shops/NrunPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Shops/NrunPacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -65,7 +65,7 @@ public override async Task ExecuteAsync(NrunPacket nRunPacket, ClientSession cli return; } - await nRunRunnerService.NRunLaunchAsync(clientSession, new Tuple(aliveEntity!, nRunPacket)).ConfigureAwait(false); + await nRunRunnerService.NRunLaunchAsync(clientSession, new Tuple(aliveEntity!, nRunPacket)); } } } \ No newline at end of file diff --git a/src/NosCore.PacketHandlers/Shops/SellPacketHandler.cs b/src/NosCore.PacketHandlers/Shops/SellPacketHandler.cs index 584af868e..e54cf3e21 100644 --- a/src/NosCore.PacketHandlers/Shops/SellPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Shops/SellPacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -52,7 +52,7 @@ await clientSession.SendPacketAsync(new SMemoiPacket { Type = SMemoType.FailNpc, Message = Game18NConstString.ItemCanNotBeSold - }).ConfigureAwait(false); + }); return; } @@ -65,7 +65,7 @@ await clientSession.SendPacketAsync(new MsgiPacket { Type = MessageType.Default, Message = Game18NConstString.MaxGoldReached - }).ConfigureAwait(false); + }); return; } @@ -75,12 +75,12 @@ await clientSession.SendPacketAsync(new SMemoiPacket { Type = SMemoType.SuccessPlayer, Message = Game18NConstString.TradeSuccessfull - }).ConfigureAwait(false); + }); clientSession.Character.InventoryService.RemoveItemAmountFromInventory(sellPacket.Amount, inv.ItemInstanceId); - await clientSession.SendPacketAsync(clientSession.Character.GenerateGold()).ConfigureAwait(false); - await clientSession.SendPacketAsync(inv.GeneratePocketChange((PocketType)inv.Type, inv.Slot)).ConfigureAwait(false); + await clientSession.SendPacketAsync(clientSession.Character.GenerateGold()); + await clientSession.SendPacketAsync(inv.GeneratePocketChange((PocketType)inv.Type, inv.Slot)); } } } \ No newline at end of file diff --git a/src/NosCore.PacketHandlers/Shops/ShoppingPacketHandler.cs b/src/NosCore.PacketHandlers/Shops/ShoppingPacketHandler.cs index 16644922c..fe7356380 100644 --- a/src/NosCore.PacketHandlers/Shops/ShoppingPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Shops/ShoppingPacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -74,7 +74,7 @@ public override async Task ExecuteAsync(ShoppingPacket shoppingPacket, ClientSes if (aliveEntity.Shop?.ShopItems.IsEmpty == false) { await clientSession.SendPacketAsync(aliveEntity.GenerateNInv(percent, shoppingPacket.ShopType)) - .ConfigureAwait(false); + ; } } } diff --git a/src/NosCore.Parser/ImportFactory.cs b/src/NosCore.Parser/ImportFactory.cs index 6dd192ad0..2d68a7eac 100644 --- a/src/NosCore.Parser/ImportFactory.cs +++ b/src/NosCore.Parser/ImportFactory.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -61,9 +61,9 @@ public async Task ImportAccountsAsync() Password = _password }; - if (await accountDao.FirstOrDefaultAsync(s => s.Name == acc1.Name).ConfigureAwait(false) == null) + if (await accountDao.FirstOrDefaultAsync(s => s.Name == acc1.Name) == null) { - acc1 = await accountDao.TryInsertOrUpdateAsync(acc1).ConfigureAwait(false); + acc1 = await accountDao.TryInsertOrUpdateAsync(acc1); } var acc2 = new AccountDto @@ -73,9 +73,9 @@ public async Task ImportAccountsAsync() Password = _password }; - if (await accountDao.FirstOrDefaultAsync(s => s.Name == acc1.Name).ConfigureAwait(false) == null) + if (await accountDao.FirstOrDefaultAsync(s => s.Name == acc1.Name) == null) { - acc2 = await accountDao.TryInsertOrUpdateAsync(acc2).ConfigureAwait(false); + acc2 = await accountDao.TryInsertOrUpdateAsync(acc2); } } @@ -86,8 +86,8 @@ public Task ImportCardsAsync() public async Task ImportMapNpcsAsync() { - await npcTalkParser.ParseAsync(_folder).ConfigureAwait(false); - await mapNpcParser.InsertMapNpcsAsync(_packetList).ConfigureAwait(false); + await npcTalkParser.ParseAsync(_folder); + await mapNpcParser.InsertMapNpcsAsync(_packetList); } public Task ImportMapMonstersAsync() @@ -117,9 +117,9 @@ public Task ImportScriptsAsync() public async Task ImportQuestsAsync() { - await actParser.ImportActAsync(_folder).ConfigureAwait(false); - await questPrizeParser.ImportQuestPrizesAsync(_folder).ConfigureAwait(false); - await questParser.ImportQuestsAsync(_folder).ConfigureAwait(false); + await actParser.ImportActAsync(_folder); + await questPrizeParser.ImportQuestPrizesAsync(_folder); + await questParser.ImportQuestsAsync(_folder); } public Task ImportMapTypeAsync() @@ -147,7 +147,7 @@ public async Task ImportPacketsAsync() var filePacket = $"{_folder}{Path.DirectorySeparatorChar}packet.txt"; using var packetTxtStream = new StreamReader(filePacket, Encoding.Default); - var lines = (await packetTxtStream.ReadToEndAsync().ConfigureAwait(false)).Split( + var lines = (await packetTxtStream.ReadToEndAsync()).Split( new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None ); @@ -175,16 +175,16 @@ public Task ImportPortalsAsync() public async Task ImportI18NAsync() { - await new I18NParser(i18NActDescDao, logger, logLanguage).InsertI18NAsync(_folder + Path.DirectorySeparatorChar + "_code_{0}_act_desc.txt", LogLanguageKey.I18N_ACTDESC_PARSED).ConfigureAwait(false); - await new I18NParser(i18NbCardDao, logger, logLanguage).InsertI18NAsync(_folder + Path.DirectorySeparatorChar + "_code_{0}_BCard.txt", LogLanguageKey.I18N_BCARD_PARSED).ConfigureAwait(false); - await new I18NParser(i18NCardDao, logger, logLanguage).InsertI18NAsync(_folder + Path.DirectorySeparatorChar + "_code_{0}_Card.txt", LogLanguageKey.I18N_CARD_PARSED).ConfigureAwait(false); - await new I18NParser(i18NItemDao, logger, logLanguage).InsertI18NAsync(_folder + Path.DirectorySeparatorChar + "_code_{0}_Item.txt", LogLanguageKey.I18N_ITEM_PARSED).ConfigureAwait(false); - await new I18NParser(i18NMapIdDataDao, logger, logLanguage).InsertI18NAsync(_folder + Path.DirectorySeparatorChar + "_code_{0}_MapIDData.txt", LogLanguageKey.I18N_MAPIDDATA_PARSED).ConfigureAwait(false); - await new I18NParser(i18NMapPointDataDao, logger, logLanguage).InsertI18NAsync(_folder + Path.DirectorySeparatorChar + "_code_{0}_MapPointData.txt", LogLanguageKey.I18N_MAPPOINTDATA_PARSED).ConfigureAwait(false); - await new I18NParser(i18NNpcMonsterDao, logger, logLanguage).InsertI18NAsync(_folder + Path.DirectorySeparatorChar + "_code_{0}_monster.txt", LogLanguageKey.I18N_MPCMONSTER_PARSED).ConfigureAwait(false); - await new I18NParser(i18NQuestDao, logger, logLanguage).InsertI18NAsync(_folder + Path.DirectorySeparatorChar + "_code_{0}_quest.txt", LogLanguageKey.I18N_QUEST_PARSED).ConfigureAwait(false); - await new I18NParser(i18NSkillDao, logger, logLanguage).InsertI18NAsync(_folder + Path.DirectorySeparatorChar + "_code_{0}_Skill.txt", LogLanguageKey.I18N_SKILL_PARSED).ConfigureAwait(false); - await new I18NParser(i18NNpcMonsterTalkDao, logger, logLanguage).InsertI18NAsync(_folder + Path.DirectorySeparatorChar + "_code_{0}_npctalk.txt", LogLanguageKey.I18N_NPCMONSTERTALK_PARSED).ConfigureAwait(false); + await new I18NParser(i18NActDescDao, logger, logLanguage).InsertI18NAsync(_folder + Path.DirectorySeparatorChar + "_code_{0}_act_desc.txt", LogLanguageKey.I18N_ACTDESC_PARSED); + await new I18NParser(i18NbCardDao, logger, logLanguage).InsertI18NAsync(_folder + Path.DirectorySeparatorChar + "_code_{0}_BCard.txt", LogLanguageKey.I18N_BCARD_PARSED); + await new I18NParser(i18NCardDao, logger, logLanguage).InsertI18NAsync(_folder + Path.DirectorySeparatorChar + "_code_{0}_Card.txt", LogLanguageKey.I18N_CARD_PARSED); + await new I18NParser(i18NItemDao, logger, logLanguage).InsertI18NAsync(_folder + Path.DirectorySeparatorChar + "_code_{0}_Item.txt", LogLanguageKey.I18N_ITEM_PARSED); + await new I18NParser(i18NMapIdDataDao, logger, logLanguage).InsertI18NAsync(_folder + Path.DirectorySeparatorChar + "_code_{0}_MapIDData.txt", LogLanguageKey.I18N_MAPIDDATA_PARSED); + await new I18NParser(i18NMapPointDataDao, logger, logLanguage).InsertI18NAsync(_folder + Path.DirectorySeparatorChar + "_code_{0}_MapPointData.txt", LogLanguageKey.I18N_MAPPOINTDATA_PARSED); + await new I18NParser(i18NNpcMonsterDao, logger, logLanguage).InsertI18NAsync(_folder + Path.DirectorySeparatorChar + "_code_{0}_monster.txt", LogLanguageKey.I18N_MPCMONSTER_PARSED); + await new I18NParser(i18NQuestDao, logger, logLanguage).InsertI18NAsync(_folder + Path.DirectorySeparatorChar + "_code_{0}_quest.txt", LogLanguageKey.I18N_QUEST_PARSED); + await new I18NParser(i18NSkillDao, logger, logLanguage).InsertI18NAsync(_folder + Path.DirectorySeparatorChar + "_code_{0}_Skill.txt", LogLanguageKey.I18N_SKILL_PARSED); + await new I18NParser(i18NNpcMonsterTalkDao, logger, logLanguage).InsertI18NAsync(_folder + Path.DirectorySeparatorChar + "_code_{0}_npctalk.txt", LogLanguageKey.I18N_NPCMONSTERTALK_PARSED); } public Task ImportItemsAsync() diff --git a/src/NosCore.Parser/Parser.cs b/src/NosCore.Parser/Parser.cs index 94fb5d858..19cd4fb30 100644 --- a/src/NosCore.Parser/Parser.cs +++ b/src/NosCore.Parser/Parser.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -44,33 +44,33 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken) key = Console.ReadKey(true); factory.SetFolder(folder!); - await factory.ImportPacketsAsync().ConfigureAwait(false); + await factory.ImportPacketsAsync(); if (key.KeyChar != 'n') { - await factory.ImportAccountsAsync().ConfigureAwait(false); - await factory.ImportMapsAsync().ConfigureAwait(false); - await factory.ImportRespawnMapTypeAsync().ConfigureAwait(false); - await factory.ImportMapTypeAsync().ConfigureAwait(false); - await factory.ImportMapTypeMapAsync().ConfigureAwait(false); - await factory.ImportPortalsAsync().ConfigureAwait(false); - await factory.ImportI18NAsync().ConfigureAwait(false); + await factory.ImportAccountsAsync(); + await factory.ImportMapsAsync(); + await factory.ImportRespawnMapTypeAsync(); + await factory.ImportMapTypeAsync(); + await factory.ImportMapTypeMapAsync(); + await factory.ImportPortalsAsync(); + await factory.ImportI18NAsync(); //factory.ImportScriptedInstances(); - await factory.ImportItemsAsync().ConfigureAwait(false); - await factory.ImportSkillsAsync().ConfigureAwait(false); - await factory.ImportCardsAsync().ConfigureAwait(false); - await factory.ImportNpcMonstersAsync().ConfigureAwait(false); - await factory.ImportDropsAsync().ConfigureAwait(false); + await factory.ImportItemsAsync(); + await factory.ImportSkillsAsync(); + await factory.ImportCardsAsync(); + await factory.ImportNpcMonstersAsync(); + await factory.ImportDropsAsync(); //factory.ImportNpcMonsterData(); - await factory.ImportMapNpcsAsync().ConfigureAwait(false); - await factory.ImportMapMonstersAsync().ConfigureAwait(false); - await factory.ImportShopsAsync().ConfigureAwait(false); + await factory.ImportMapNpcsAsync(); + await factory.ImportMapMonstersAsync(); + await factory.ImportShopsAsync(); //factory.ImportTeleporters(); - await factory.ImportShopItemsAsync().ConfigureAwait(false); + await factory.ImportShopItemsAsync(); //factory.ImportShopSkills(); //factory.ImportRecipe(); - await factory.ImportScriptsAsync().ConfigureAwait(false); - await factory.ImportQuestsAsync().ConfigureAwait(false); + await factory.ImportScriptsAsync(); + await factory.ImportQuestsAsync(); } else { @@ -79,7 +79,7 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken) key = Console.ReadKey(true); if (key.KeyChar != 'n') { - await factory.ImportMapsAsync().ConfigureAwait(false); + await factory.ImportMapsAsync(); } logger.Information( @@ -87,9 +87,9 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken) key = Console.ReadKey(true); if (key.KeyChar != 'n') { - await factory.ImportRespawnMapTypeAsync().ConfigureAwait(false); - await factory.ImportMapTypeAsync().ConfigureAwait(false); - await factory.ImportMapTypeMapAsync().ConfigureAwait(false); + await factory.ImportRespawnMapTypeAsync(); + await factory.ImportMapTypeAsync(); + await factory.ImportMapTypeMapAsync(); } logger.Information( @@ -97,7 +97,7 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken) key = Console.ReadKey(true); if (key.KeyChar != 'n') { - await factory.ImportAccountsAsync().ConfigureAwait(false); + await factory.ImportAccountsAsync(); } logger.Information( @@ -105,7 +105,7 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken) key = Console.ReadKey(true); if (key.KeyChar != 'n') { - await factory.ImportPortalsAsync().ConfigureAwait(false); + await factory.ImportPortalsAsync(); } logger.Information( @@ -113,7 +113,7 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken) key = Console.ReadKey(true); if (key.KeyChar != 'n') { - await factory.ImportI18NAsync().ConfigureAwait(false); + await factory.ImportI18NAsync(); } logger.Information( @@ -129,7 +129,7 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken) key = Console.ReadKey(true); if (key.KeyChar != 'n') { - await factory.ImportItemsAsync().ConfigureAwait(false); + await factory.ImportItemsAsync(); } logger.Information( @@ -137,7 +137,7 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken) key = Console.ReadKey(true); if (key.KeyChar != 'n') { - await factory.ImportNpcMonstersAsync().ConfigureAwait(false); + await factory.ImportNpcMonstersAsync(); } logger.Information( @@ -145,7 +145,7 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken) key = Console.ReadKey(true); if (key.KeyChar != 'n') { - await factory.ImportDropsAsync().ConfigureAwait(false); + await factory.ImportDropsAsync(); } logger.Information( @@ -161,7 +161,7 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken) key = Console.ReadKey(true); if (key.KeyChar != 'n') { - await factory.ImportCardsAsync().ConfigureAwait(false); + await factory.ImportCardsAsync(); } logger.Information( @@ -169,7 +169,7 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken) key = Console.ReadKey(true); if (key.KeyChar != 'n') { - await factory.ImportSkillsAsync().ConfigureAwait(false); + await factory.ImportSkillsAsync(); } logger.Information( @@ -177,7 +177,7 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken) key = Console.ReadKey(true); if (key.KeyChar != 'n') { - await factory.ImportMapNpcsAsync().ConfigureAwait(false); + await factory.ImportMapNpcsAsync(); } logger.Information( @@ -185,7 +185,7 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken) key = Console.ReadKey(true); if (key.KeyChar != 'n') { - await factory.ImportMapMonstersAsync().ConfigureAwait(false); + await factory.ImportMapMonstersAsync(); } logger.Information( @@ -193,7 +193,7 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken) key = Console.ReadKey(true); if (key.KeyChar != 'n') { - await factory.ImportShopsAsync().ConfigureAwait(false); + await factory.ImportShopsAsync(); } logger.Information( @@ -209,7 +209,7 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken) key = Console.ReadKey(true); if (key.KeyChar != 'n') { - await factory.ImportShopItemsAsync().ConfigureAwait(false); + await factory.ImportShopItemsAsync(); } logger.Information( @@ -233,7 +233,7 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken) key = Console.ReadKey(true); if (key.KeyChar != 'n') { - await factory.ImportScriptsAsync().ConfigureAwait(false); + await factory.ImportScriptsAsync(); } logger.Information( @@ -241,7 +241,7 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken) key = Console.ReadKey(true); if (key.KeyChar != 'n') { - await factory.ImportQuestsAsync().ConfigureAwait(false); + await factory.ImportQuestsAsync(); } } diff --git a/src/NosCore.Parser/ParserBootstrap.cs b/src/NosCore.Parser/ParserBootstrap.cs index 023a15922..163940198 100644 --- a/src/NosCore.Parser/ParserBootstrap.cs +++ b/src/NosCore.Parser/ParserBootstrap.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -116,7 +116,7 @@ public static async Task Main(string[] args) { try { - await BuildHost(args).RunAsync().ConfigureAwait(false); + await BuildHost(args).RunAsync(); } catch (Exception ex) { diff --git a/src/NosCore.Parser/Parsers/ActParser.cs b/src/NosCore.Parser/Parsers/ActParser.cs index 559d36942..1840dfec3 100644 --- a/src/NosCore.Parser/Parsers/ActParser.cs +++ b/src/NosCore.Parser/Parsers/ActParser.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -69,7 +69,7 @@ public async Task ImportActAsync(string folder) using (var stream = new StreamReader(folder + _fileQuestDat, Encoding.Default)) { string? line; - while ((line = await stream.ReadLineAsync().ConfigureAwait(false)) != null) + while ((line = await stream.ReadLineAsync()) != null) { var splitted = line.Split(' ', '\t'); switch (splitted.Length) @@ -95,8 +95,8 @@ public async Task ImportActAsync(string folder) } } - await actDao.TryInsertOrUpdateAsync(acts).ConfigureAwait(false); - await actDescDao.TryInsertOrUpdateAsync(actParts).ConfigureAwait(false); + await actDao.TryInsertOrUpdateAsync(acts); + await actDescDao.TryInsertOrUpdateAsync(actParts); logger.Information(logLanguage[LogLanguageKey.ACTS_PARTS_PARSED], actParts.Count); } } diff --git a/src/NosCore.Parser/Parsers/CardParser.cs b/src/NosCore.Parser/Parsers/CardParser.cs index da3240b41..334a2dedd 100644 --- a/src/NosCore.Parser/Parsers/CardParser.cs +++ b/src/NosCore.Parser/Parsers/CardParser.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -67,9 +67,9 @@ public async Task InsertCardsAsync(string folder) }; var genericParser = new GenericParser(folder + _fileCardDat, "END", 1, actionList, logger, logLanguage); - var cards = (await genericParser.GetDtosAsync().ConfigureAwait(false)).GroupBy(p => p.CardId).Select(g => g.First()).ToList(); - await cardDao.TryInsertOrUpdateAsync(cards).ConfigureAwait(false); - await bcardDao.TryInsertOrUpdateAsync(cards.Where(s => s.BCards != null).SelectMany(s => s.BCards)).ConfigureAwait(false); + var cards = (await genericParser.GetDtosAsync()).GroupBy(p => p.CardId).Select(g => g.First()).ToList(); + await cardDao.TryInsertOrUpdateAsync(cards); + await bcardDao.TryInsertOrUpdateAsync(cards.Where(s => s.BCards != null).SelectMany(s => s.BCards)); logger.Information(logLanguage[LogLanguageKey.CARDS_PARSED], cards.Count); } diff --git a/src/NosCore.Parser/Parsers/Generic/GenericParser.cs b/src/NosCore.Parser/Parsers/Generic/GenericParser.cs index d24e247fd..c537a21d4 100644 --- a/src/NosCore.Parser/Parsers/Generic/GenericParser.cs +++ b/src/NosCore.Parser/Parsers/Generic/GenericParser.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -86,7 +86,7 @@ await Task.WhenAll(items.Select(item => Task.Run(() => { logger.Verbose(logLanguage[LogLanguageKey.CHUNK_FORMAT_INVALID], lines, ex); } - }))).ConfigureAwait(false); + }))); return resultCollection.ToList(); } } diff --git a/src/NosCore.Parser/Parsers/I18NParser.cs b/src/NosCore.Parser/Parsers/I18NParser.cs index ddca567ff..461324bdd 100644 --- a/src/NosCore.Parser/Parsers/I18NParser.cs +++ b/src/NosCore.Parser/Parsers/I18NParser.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -55,7 +55,7 @@ public Task InsertI18NAsync(string file, LogLanguageKey logLanguageKey) { using var stream = new StreamReader(I18NTextFileName(file, region), Encoding.Default); - var lines = (await stream.ReadToEndAsync().ConfigureAwait(false)).Split( + var lines = (await stream.ReadToEndAsync()).Split( new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None ); @@ -73,7 +73,7 @@ public Task InsertI18NAsync(string file, LogLanguageKey logLanguageKey) }); } } - await dao.TryInsertOrUpdateAsync(dtos.Values).ConfigureAwait(false); + await dao.TryInsertOrUpdateAsync(dtos.Values); logger.Information( logLanguage[logLanguageKey], diff --git a/src/NosCore.Parser/Parsers/ItemParser.cs b/src/NosCore.Parser/Parsers/ItemParser.cs index 74dc06a87..99249c1dd 100644 --- a/src/NosCore.Parser/Parsers/ItemParser.cs +++ b/src/NosCore.Parser/Parsers/ItemParser.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -121,7 +121,7 @@ public async Task ParseAsync(string folder) var genericParser = new GenericParser(folder + _itemCardDto, "END", 1, actionList, logger, logLanguage); - var items = (await genericParser.GetDtosAsync().ConfigureAwait(false)).GroupBy(p => p.VNum).Select(g => g.First()).ToList(); + var items = (await genericParser.GetDtosAsync()).GroupBy(p => p.VNum).Select(g => g.First()).ToList(); foreach (var item in items) { HardcodeItem(item); @@ -156,8 +156,8 @@ public async Task ParseAsync(string folder) { 16, new List<(short, short)> { (5173, 2511) } }, }); - await itemDao.TryInsertOrUpdateAsync(items).ConfigureAwait(false); - await bCardDao.TryInsertOrUpdateAsync(items.Where(s => s.BCards != null).SelectMany(s => s.BCards)).ConfigureAwait(false); + await itemDao.TryInsertOrUpdateAsync(items); + await bCardDao.TryInsertOrUpdateAsync(items.Where(s => s.BCards != null).SelectMany(s => s.BCards)); logger.Information(logLanguage[LogLanguageKey.ITEMS_PARSED], items.Count); } diff --git a/src/NosCore.Parser/Parsers/MapMonsterParser.cs b/src/NosCore.Parser/Parsers/MapMonsterParser.cs index 1425ed1b1..c3943057b 100644 --- a/src/NosCore.Parser/Parsers/MapMonsterParser.cs +++ b/src/NosCore.Parser/Parsers/MapMonsterParser.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -72,7 +72,7 @@ public async Task InsertMapMonsterAsync(List packetList) monsters.Add(monster); } - await mapMonsterDao.TryInsertOrUpdateAsync(monsters).ConfigureAwait(false); + await mapMonsterDao.TryInsertOrUpdateAsync(monsters); logger.Information(logLanguage[LogLanguageKey.MONSTERS_PARSED], monsters.Count); } diff --git a/src/NosCore.Parser/Parsers/MapNpcParser.cs b/src/NosCore.Parser/Parsers/MapNpcParser.cs index abfe267a8..84d123a99 100644 --- a/src/NosCore.Parser/Parsers/MapNpcParser.cs +++ b/src/NosCore.Parser/Parsers/MapNpcParser.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -80,7 +80,7 @@ public async Task InsertMapNpcsAsync(List packetList) npcCounter++; } - await mapNpcDao.TryInsertOrUpdateAsync(npcs).ConfigureAwait(false); + await mapNpcDao.TryInsertOrUpdateAsync(npcs); logger.Information(logLanguage[LogLanguageKey.NPCS_PARSED], npcCounter); } } diff --git a/src/NosCore.Parser/Parsers/MapParser.cs b/src/NosCore.Parser/Parsers/MapParser.cs index c868a3d73..b3e17003e 100644 --- a/src/NosCore.Parser/Parsers/MapParser.cs +++ b/src/NosCore.Parser/Parsers/MapParser.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -52,7 +52,7 @@ public Task> ParseDatAsync(string folder) public async Task InsertOrUpdateMapsAsync(string folder, List packetList) { - var dictionaryId = await ParseDatAsync(folder).ConfigureAwait(false); + var dictionaryId = await ParseDatAsync(folder); var folderMap = folder + _folderMap; var dictionaryMusic = packetList.Where(o => o[0].Equals("at") && (o.Length > 7)) .GroupBy(x => x[2]) @@ -66,7 +66,7 @@ public async Task InsertOrUpdateMapsAsync(string folder, List packetLi ShopAllowed = short.Parse(file.Name) == 147 }).ToList(); - await mapDao.TryInsertOrUpdateAsync(maps).ConfigureAwait(false); + await mapDao.TryInsertOrUpdateAsync(maps); logger.Information(logLanguage[LogLanguageKey.MAPS_PARSED], maps.Count); } } diff --git a/src/NosCore.Parser/Parsers/MapTypeParser.cs b/src/NosCore.Parser/Parsers/MapTypeParser.cs index 9f2e07966..dbb895a2f 100644 --- a/src/NosCore.Parser/Parsers/MapTypeParser.cs +++ b/src/NosCore.Parser/Parsers/MapTypeParser.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -220,7 +220,7 @@ internal async Task InsertMapTypesAsync() PotionDelay = 5000 } }; - await dropDao.TryInsertOrUpdateAsync(mts).ConfigureAwait(false); + await dropDao.TryInsertOrUpdateAsync(mts); logger.Information(logLanguage[LogLanguageKey.MAPTYPES_PARSED]); } } diff --git a/src/NosCore.Parser/Parsers/NpcMonsterParser.cs b/src/NosCore.Parser/Parsers/NpcMonsterParser.cs index f02b36e2c..8554f8e01 100644 --- a/src/NosCore.Parser/Parsers/NpcMonsterParser.cs +++ b/src/NosCore.Parser/Parsers/NpcMonsterParser.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -149,11 +149,11 @@ public async Task InsertNpcMonstersAsync(string folder) var genericParser = new GenericParser(folder + _fileNpcId, "#========================================================", 1, actionList, _logger, _logLanguage); - var monsters = (await genericParser.GetDtosAsync().ConfigureAwait(false)).GroupBy(p => p.NpcMonsterVNum).Select(g => g.First()).ToList(); - await _npcMonsterDao.TryInsertOrUpdateAsync(monsters).ConfigureAwait(false); - await _bCardDao.TryInsertOrUpdateAsync(monsters.Where(s => s.BCards != null).SelectMany(s => s.BCards)).ConfigureAwait(false); - await _dropDao.TryInsertOrUpdateAsync(monsters.Where(s => s.Drop != null).SelectMany(s => s.Drop)).ConfigureAwait(false); - await _npcMonsterSkillDao.TryInsertOrUpdateAsync(monsters.Where(s => s.NpcMonsterSkill != null).SelectMany(s => s.NpcMonsterSkill)).ConfigureAwait(false); + var monsters = (await genericParser.GetDtosAsync()).GroupBy(p => p.NpcMonsterVNum).Select(g => g.First()).ToList(); + await _npcMonsterDao.TryInsertOrUpdateAsync(monsters); + await _bCardDao.TryInsertOrUpdateAsync(monsters.Where(s => s.BCards != null).SelectMany(s => s.BCards)); + await _dropDao.TryInsertOrUpdateAsync(monsters.Where(s => s.Drop != null).SelectMany(s => s.Drop)); + await _npcMonsterSkillDao.TryInsertOrUpdateAsync(monsters.Where(s => s.NpcMonsterSkill != null).SelectMany(s => s.NpcMonsterSkill)); _logger.Information(_logLanguage[LogLanguageKey.NPCMONSTERS_PARSED], monsters.Count); } diff --git a/src/NosCore.Parser/Parsers/NpcTalkParser.cs b/src/NosCore.Parser/Parsers/NpcTalkParser.cs index b2b29ef22..3eb5cf27f 100644 --- a/src/NosCore.Parser/Parsers/NpcTalkParser.cs +++ b/src/NosCore.Parser/Parsers/NpcTalkParser.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -59,9 +59,9 @@ public async Task ParseAsync(string folder) var genericParser = new GenericParser(folder + _fileNpcTalkDat, "%", 0, actionList, logger, logLanguage); - var npcTalks = (await genericParser.GetDtosAsync(" ").ConfigureAwait(false)).ToList(); + var npcTalks = (await genericParser.GetDtosAsync(" ")).ToList(); npcTalks.Add(new NpcTalkDto { DialogId = 99, NameI18NKey = "" }); - await npcTalkDao.TryInsertOrUpdateAsync(npcTalks).ConfigureAwait(false); + await npcTalkDao.TryInsertOrUpdateAsync(npcTalks); logger.Information(logLanguage[LogLanguageKey.NPCTALKS_PARSED], npcTalks.Count); } diff --git a/src/NosCore.Parser/Parsers/PortalParser.cs b/src/NosCore.Parser/Parsers/PortalParser.cs index 10ce0bb63..5d80bbb03 100644 --- a/src/NosCore.Parser/Parsers/PortalParser.cs +++ b/src/NosCore.Parser/Parsers/PortalParser.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -57,7 +57,7 @@ public async Task InsertPortalsAsync(List packetList) null) { portalCounter++; - await portalDao.TryInsertOrUpdateAsync(lodPortal).ConfigureAwait(false); + await portalDao.TryInsertOrUpdateAsync(lodPortal); } var minilandPortal = new PortalDto @@ -77,7 +77,7 @@ public async Task InsertPortalsAsync(List packetList) null) { portalCounter++; - await portalDao.TryInsertOrUpdateAsync(minilandPortal).ConfigureAwait(false); + await portalDao.TryInsertOrUpdateAsync(minilandPortal); } var weddingPortal = new PortalDto @@ -96,7 +96,7 @@ public async Task InsertPortalsAsync(List packetList) null) { portalCounter++; - await portalDao.TryInsertOrUpdateAsync(weddingPortal).ConfigureAwait(false); + await portalDao.TryInsertOrUpdateAsync(weddingPortal); } var glacerusCavernPortal = new PortalDto @@ -115,7 +115,7 @@ public async Task InsertPortalsAsync(List packetList) null) { portalCounter++; - await portalDao.TryInsertOrUpdateAsync(glacerusCavernPortal).ConfigureAwait(false); + await portalDao.TryInsertOrUpdateAsync(glacerusCavernPortal); } foreach (var currentPacket in packetList.Where(o => o[0].Equals("at") || o[0].Equals("gp"))) @@ -181,7 +181,7 @@ public async Task InsertPortalsAsync(List packetList) .Where(s => s.SourceMapId.Equals(portal.SourceMapId)).Any( s => (s.DestinationMapId == portal.DestinationMapId) && (s.SourceX == portal.SourceX) && (s.SourceY == portal.SourceY))).ToList(); - await portalDao.TryInsertOrUpdateAsync(portalsDtos).ConfigureAwait(false); + await portalDao.TryInsertOrUpdateAsync(portalsDtos); logger.Information(logLanguage[LogLanguageKey.PORTALS_PARSED], portalsDtos.Count + portalCounter); diff --git a/src/NosCore.Parser/Parsers/QuestParser.cs b/src/NosCore.Parser/Parsers/QuestParser.cs index 989b2105d..b42348790 100644 --- a/src/NosCore.Parser/Parsers/QuestParser.cs +++ b/src/NosCore.Parser/Parsers/QuestParser.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -80,11 +80,11 @@ public async Task ImportQuestsAsync(string folder) {nameof(QuestDto.QuestObjective), ImportQuestObjectives}, }; var genericParser = new GenericParser(folder + _fileQuestDat, "END", 0, actionList, logger, logLanguage); - var quests = await genericParser.GetDtosAsync().ConfigureAwait(false); + var quests = await genericParser.GetDtosAsync(); - await questDao.TryInsertOrUpdateAsync(quests).ConfigureAwait(false); - await questQuestRewardDao.TryInsertOrUpdateAsync(quests.Where(s => s.QuestQuestReward != null).SelectMany(s => s.QuestQuestReward)).ConfigureAwait(false); - await questObjectiveDao.TryInsertOrUpdateAsync(quests.Where(s => s.QuestObjective != null).SelectMany(s => s.QuestObjective)).ConfigureAwait(false); + await questDao.TryInsertOrUpdateAsync(quests); + await questQuestRewardDao.TryInsertOrUpdateAsync(quests.Where(s => s.QuestQuestReward != null).SelectMany(s => s.QuestQuestReward)); + await questObjectiveDao.TryInsertOrUpdateAsync(quests.Where(s => s.QuestObjective != null).SelectMany(s => s.QuestObjective)); logger.Information(logLanguage[LogLanguageKey.QUESTS_PARSED], quests.Count); } diff --git a/src/NosCore.Parser/Parsers/QuestPrizeParser.cs b/src/NosCore.Parser/Parsers/QuestPrizeParser.cs index 8135d0dd1..52a6db82f 100644 --- a/src/NosCore.Parser/Parsers/QuestPrizeParser.cs +++ b/src/NosCore.Parser/Parsers/QuestPrizeParser.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -53,8 +53,8 @@ public async Task ImportQuestPrizesAsync(string folder) {nameof(QuestRewardDto.Amount), chunk => ImportAmount(chunk)}, }; var genericParser = new GenericParser(folder + _fileQuestPrizeDat, "END", 0, actionList, logger, logLanguage); - var questRewardDtos = await genericParser.GetDtosAsync().ConfigureAwait(false); - await questRewardDtoDao.TryInsertOrUpdateAsync(questRewardDtos).ConfigureAwait(false); + var questRewardDtos = await genericParser.GetDtosAsync(); + await questRewardDtoDao.TryInsertOrUpdateAsync(questRewardDtos); logger.Information(logLanguage[LogLanguageKey.QUEST_PRIZES_PARSED], questRewardDtos.Count); } diff --git a/src/NosCore.Parser/Parsers/RespawnMapTypeParser.cs b/src/NosCore.Parser/Parsers/RespawnMapTypeParser.cs index 02d83c911..011f70018 100644 --- a/src/NosCore.Parser/Parsers/RespawnMapTypeParser.cs +++ b/src/NosCore.Parser/Parsers/RespawnMapTypeParser.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -92,7 +92,7 @@ internal async Task InsertRespawnMapTypeAsync() Name = "DefaultOasis" } }; - await respawnMapTypeDao.TryInsertOrUpdateAsync(respawnmaptypemaps).ConfigureAwait(false); + await respawnMapTypeDao.TryInsertOrUpdateAsync(respawnmaptypemaps); logger.Information(logLanguage[LogLanguageKey.RESPAWNTYPE_PARSED], respawnmaptypemaps.Count()); } diff --git a/src/NosCore.Parser/Parsers/ScriptParser.cs b/src/NosCore.Parser/Parsers/ScriptParser.cs index 3dbd4139b..053869d61 100644 --- a/src/NosCore.Parser/Parsers/ScriptParser.cs +++ b/src/NosCore.Parser/Parsers/ScriptParser.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -44,7 +44,7 @@ public async Task InsertScriptsAsync(string folder) var scripts = new List(); string? line; byte scriptId = 0; - while ((line = await stream.ReadLineAsync().ConfigureAwait(false)) != null) + while ((line = await stream.ReadLineAsync()) != null) { var split = line.Split(new[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries); if (line.StartsWith("#")) @@ -73,7 +73,7 @@ public async Task InsertScriptsAsync(string folder) } } - await scriptDao.TryInsertOrUpdateAsync(scripts).ConfigureAwait(false); + await scriptDao.TryInsertOrUpdateAsync(scripts); logger.Information(logLanguage[LogLanguageKey.SCRIPTS_PARSED], scripts.Count); } } diff --git a/src/NosCore.Parser/Parsers/ShopItemParser.cs b/src/NosCore.Parser/Parsers/ShopItemParser.cs index 9f117ccbf..2d64119c6 100644 --- a/src/NosCore.Parser/Parsers/ShopItemParser.cs +++ b/src/NosCore.Parser/Parsers/ShopItemParser.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -99,7 +99,7 @@ public async Task InsertShopItemsAsync(List packetList) shopListItemDtos.AddRange(shopItemDtos); } - await shopItemDao.TryInsertOrUpdateAsync(shopListItemDtos).ConfigureAwait(false); + await shopItemDao.TryInsertOrUpdateAsync(shopListItemDtos); logger.Information(logLanguage[LogLanguageKey.SHOPITEMS_PARSED], itemCounter); } diff --git a/src/NosCore.Parser/Parsers/ShopParser.cs b/src/NosCore.Parser/Parsers/ShopParser.cs index 97c7e851d..0c256214f 100644 --- a/src/NosCore.Parser/Parsers/ShopParser.cs +++ b/src/NosCore.Parser/Parsers/ShopParser.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -76,7 +76,7 @@ public async Task InsertShopsAsync(List packetList) shopCounter++; } - await shopDao.TryInsertOrUpdateAsync(shops).ConfigureAwait(false); + await shopDao.TryInsertOrUpdateAsync(shops); logger.Information(logLanguage[LogLanguageKey.SHOPS_PARSED], shopCounter); } diff --git a/src/NosCore.Parser/Parsers/SkillParser.cs b/src/NosCore.Parser/Parsers/SkillParser.cs index f8d6e4262..2b4f5af5c 100644 --- a/src/NosCore.Parser/Parsers/SkillParser.cs +++ b/src/NosCore.Parser/Parsers/SkillParser.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -92,7 +92,7 @@ public async Task InsertSkillsAsync(string folder) }; var genericParser = new GenericParser(folder + _fileCardDat, "#=========================================================", 1, actionList, logger, logLanguage); - var skills = await genericParser.GetDtosAsync().ConfigureAwait(false); + var skills = await genericParser.GetDtosAsync(); foreach (var skill in skills.Where(s => s.Class > 31)) { @@ -119,9 +119,9 @@ public async Task InsertSkillsAsync(string folder) } } - await skillDao.TryInsertOrUpdateAsync(skills).ConfigureAwait(false); - await comboDao.TryInsertOrUpdateAsync(skills.Where(s => s.Combo != null).SelectMany(s => s.Combo)).ConfigureAwait(false); - await bCardDao.TryInsertOrUpdateAsync(skills.Where(s => s.BCards != null).SelectMany(s => s.BCards)).ConfigureAwait(false); + await skillDao.TryInsertOrUpdateAsync(skills); + await comboDao.TryInsertOrUpdateAsync(skills.Where(s => s.Combo != null).SelectMany(s => s.Combo)); + await bCardDao.TryInsertOrUpdateAsync(skills.Where(s => s.BCards != null).SelectMany(s => s.BCards)); logger.Information(logLanguage[LogLanguageKey.SKILLS_PARSED], skills.Count); } diff --git a/src/NosCore.WebApi/Controllers/AuthController.cs b/src/NosCore.WebApi/Controllers/AuthController.cs index ebce66a3f..d6102903c 100644 --- a/src/NosCore.WebApi/Controllers/AuthController.cs +++ b/src/NosCore.WebApi/Controllers/AuthController.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -61,7 +61,7 @@ public async Task ConnectUserAsync(ApiSession session) return BadRequest(logLanguage[LogLanguageKey.AUTH_ERROR]); } - var account = await accountDao.FirstOrDefaultAsync(s => s.Name == session.Identity).ConfigureAwait(false); + var account = await accountDao.FirstOrDefaultAsync(s => s.Name == session.Identity); if (account == null) { return BadRequest(logLanguage[LogLanguageKey.AUTH_ERROR]); @@ -80,7 +80,7 @@ public async Task ConnectUserAsync(ApiSession session) account.Language = Enum.Parse(session.GfLang?.ToUpper(CultureInfo.CurrentCulture) ?? ""); - account = await accountDao.TryInsertOrUpdateAsync(account).ConfigureAwait(false); + account = await accountDao.TryInsertOrUpdateAsync(account); var platformGameAccountId = Guid.NewGuid(); var claims = new ClaimsIdentity(new[] { @@ -149,7 +149,7 @@ public async Task GetExpectingConnection(string? id, string? toke [AllowAnonymous] public async Task HasMfaEnabled(string? username) { - var account = await accountDao.FirstOrDefaultAsync(s => s.Name == username).ConfigureAwait(false); + var account = await accountDao.FirstOrDefaultAsync(s => s.Name == username); if (account == null || account.MfaSecret == null) { return Ok(false); diff --git a/src/NosCore.WorldServer/WorldServer.cs b/src/NosCore.WorldServer/WorldServer.cs index d9566e686..1ba303ad2 100644 --- a/src/NosCore.WorldServer/WorldServer.cs +++ b/src/NosCore.WorldServer/WorldServer.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -52,7 +52,7 @@ public class WorldServer(IOptions worldConfiguration, Networ protected override async Task ExecuteAsync(CancellationToken stoppingToken) { Broadcaster.Initialize(sessionGroupFactory); - await mapInstanceGeneratorService.InitializeAsync().ConfigureAwait(false); + await mapInstanceGeneratorService.InitializeAsync(); logger.LogInformation(logLanguage[LogLanguageKey.SUCCESSFULLY_LOADED]); AppDomain.CurrentDomain.ProcessExit += (s, e) => { @@ -74,7 +74,7 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken) logLanguage[LogLanguageKey.MASTER_SERVER_RETRY], timeSpan.TotalSeconds) ).ExecuteAsync(() => channelHubClient.Bind(channel)); - await Task.WhenAny(connectTask, clock.Run(stoppingToken), networkManager.RunServerAsync()).ConfigureAwait(false); + await Task.WhenAny(connectTask, clock.Run(stoppingToken), networkManager.RunServerAsync()); } } } \ No newline at end of file diff --git a/src/NosCore.WorldServer/WorldServerBootstrap.cs b/src/NosCore.WorldServer/WorldServerBootstrap.cs index 30c31938b..05926300e 100644 --- a/src/NosCore.WorldServer/WorldServerBootstrap.cs +++ b/src/NosCore.WorldServer/WorldServerBootstrap.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -356,7 +356,7 @@ public static async Task Main(string[] args) { try { - await BuildHost(args).RunAsync().ConfigureAwait(false); + await BuildHost(args).RunAsync(); } catch (Exception ex) { diff --git a/test/NosCore.GameObject.Tests/BazaarTests.cs b/test/NosCore.GameObject.Tests/BazaarTests.cs index 89333f372..4db22b426 100644 --- a/test/NosCore.GameObject.Tests/BazaarTests.cs +++ b/test/NosCore.GameObject.Tests/BazaarTests.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -87,7 +87,7 @@ public async Task AddToBazaarAllStackAsync() IsPackage = false, ItemInstanceId = _guid, Price = 50 - }).ConfigureAwait(false); + }); Assert.AreEqual(_guid, _bazaarItemsHolder?.GetById(0)?.BazaarItem?.ItemInstanceId); Assert.AreEqual(99, _bazaarItemsHolder?.GetById(0)?.BazaarItem?.Amount ?? 0); Assert.AreEqual(LanguageKey.OBJECT_IN_BAZAAR, add); @@ -114,7 +114,7 @@ public async Task AddToBazaarPartialStackAsync() IsPackage = false, ItemInstanceId = _guid, Price = 50 - }).ConfigureAwait(false); + }); Assert.AreNotEqual(_guid, _bazaarItemsHolder!.GetById(0)?.BazaarItem?.ItemInstanceId); Assert.AreEqual(50, _bazaarItemsHolder.GetById(0)?.BazaarItem?.Amount ?? 0); Assert.AreEqual(LanguageKey.OBJECT_IN_BAZAAR, add); @@ -141,7 +141,7 @@ await Assert.ThrowsExactlyAsync(() => _bazaarController!.AddB IsPackage = false, ItemInstanceId = _guid, Price = 50 - })).ConfigureAwait(false); + })); } [TestMethod] @@ -165,7 +165,7 @@ await Assert.ThrowsExactlyAsync(() => _bazaarController!.AddB IsPackage = false, ItemInstanceId = _guid, Price = -50 - })).ConfigureAwait(false); + })); } [TestMethod] @@ -189,7 +189,7 @@ await Assert.ThrowsExactlyAsync(() => _bazaarController!.AddB IsPackage = false, ItemInstanceId = _guid, Price = 100 - })).ConfigureAwait(false); + })); } [TestMethod] @@ -206,7 +206,7 @@ await Assert.ThrowsExactlyAsync(() => _bazaarController!.AddB IsPackage = false, ItemInstanceId = _guid, Price = 100 - })).ConfigureAwait(false); + })); } [TestMethod] @@ -244,7 +244,7 @@ public async Task AddMoreThanLimitAsync() IsPackage = false, ItemInstanceId = guid, Price = 50 - }).ConfigureAwait(false); + }); } Assert.AreEqual(10, _bazaarItemsHolder!.GetAll().Count()); @@ -272,8 +272,8 @@ public async Task DeleteFromBazaarNegativeCountAsync() IsPackage = false, ItemInstanceId = _guid, Price = 50 - }).ConfigureAwait(false); - Assert.AreEqual(false, await _bazaarController.DeleteBazaarAsync(0, -1, "test").ConfigureAwait(false)); + }); + Assert.AreEqual(false, await _bazaarController.DeleteBazaarAsync(0, -1, "test")); } [TestMethod] @@ -297,8 +297,8 @@ public async Task DeleteFromBazaarMoreThanRegisteredAsync() IsPackage = false, ItemInstanceId = _guid, Price = 50 - }).ConfigureAwait(false); - Assert.AreEqual(false, await _bazaarController.DeleteBazaarAsync(0, 100, "test").ConfigureAwait(false)); + }); + Assert.AreEqual(false, await _bazaarController.DeleteBazaarAsync(0, 100, "test")); } [TestMethod] @@ -322,8 +322,8 @@ public async Task DeleteFromBazaarSomeoneElseAsync() IsPackage = false, ItemInstanceId = _guid, Price = 50 - }).ConfigureAwait(false); - Assert.AreEqual(true, await _bazaarController.DeleteBazaarAsync(0, 99, "test2").ConfigureAwait(false)); + }); + Assert.AreEqual(true, await _bazaarController.DeleteBazaarAsync(0, 99, "test2")); Assert.AreEqual(1, _bazaarItemsHolder!.GetAll().Count()); Assert.AreEqual(0, _bazaarItemsHolder.GetById(0)?.ItemInstance?.Amount ?? 0); Assert.AreEqual(99, _bazaarItemsHolder.GetById(0)?.BazaarItem?.Amount ?? 0); @@ -350,22 +350,22 @@ public async Task DeleteFromUserBazaarAsync() IsPackage = false, ItemInstanceId = _guid, Price = 50 - }).ConfigureAwait(false); - Assert.AreEqual(true, await _bazaarController.DeleteBazaarAsync(0, 99, "test").ConfigureAwait(false)); + }); + Assert.AreEqual(true, await _bazaarController.DeleteBazaarAsync(0, 99, "test")); Assert.AreEqual(0, _bazaarItemsHolder!.GetAll().Count()); } [TestMethod] public async Task DeleteFromBazaarNotRegisteredAsync() { - await Assert.ThrowsExactlyAsync(() => _bazaarController!.DeleteBazaarAsync(0, 99, "test")).ConfigureAwait(false); + await Assert.ThrowsExactlyAsync(() => _bazaarController!.DeleteBazaarAsync(0, 99, "test")); } [TestMethod] public async Task ModifyBazaarNotRegisteredAsync() { var patch = new JsonPatch(PatchOperation.Replace(JsonPointer.Parse("/BazaarItem/Price"), 50.AsJsonElement().AsNode())); - Assert.IsNull(await _bazaarController!.ModifyBazaarAsync(0, patch).ConfigureAwait(false)); + Assert.IsNull(await _bazaarController!.ModifyBazaarAsync(0, patch)); } [TestMethod] @@ -389,9 +389,9 @@ public async Task ModifyBazaarAsync() IsPackage = false, ItemInstanceId = _guid, Price = 80 - }).ConfigureAwait(false); + }); var patch = new JsonPatch(PatchOperation.Replace(JsonPointer.Parse("/BazaarItem/Price"), 50.AsJsonElement().AsNode())); - Assert.IsNotNull(await _bazaarController.ModifyBazaarAsync(0, patch).ConfigureAwait(false)); + Assert.IsNotNull(await _bazaarController.ModifyBazaarAsync(0, patch)); Assert.AreEqual(50, _bazaarItemsHolder?.GetById(0)?.BazaarItem?.Price); } @@ -416,10 +416,10 @@ public async Task ModifyBazaarAlreadySoldAsync() IsPackage = false, ItemInstanceId = _guid, Price = 50 - }).ConfigureAwait(false); + }); _bazaarItemsHolder!.GetById(0)!.ItemInstance!.Amount--; var patch = new JsonPatch(PatchOperation.Replace(JsonPointer.Parse("/BazaarItem/Price"), 10.AsJsonElement().AsNode())); - Assert.IsNull(await _bazaarController.ModifyBazaarAsync(0, patch).ConfigureAwait(false)); + Assert.IsNull(await _bazaarController.ModifyBazaarAsync(0, patch)); Assert.AreEqual(50, _bazaarItemsHolder.GetById(0)?.BazaarItem?.Price); } } diff --git a/test/NosCore.GameObject.Tests/Services/GuriRunnerService/Handlers/SpeakerGuriHandlerTests.cs b/test/NosCore.GameObject.Tests/Services/GuriRunnerService/Handlers/SpeakerGuriHandlerTests.cs index 8dab0d8ce..972f1efde 100644 --- a/test/NosCore.GameObject.Tests/Services/GuriRunnerService/Handlers/SpeakerGuriHandlerTests.cs +++ b/test/NosCore.GameObject.Tests/Services/GuriRunnerService/Handlers/SpeakerGuriHandlerTests.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -61,8 +61,8 @@ public async Task SetupAsync() _itemProvider = new GameObject.Services.ItemGenerationService.ItemGenerationService(items, new EventLoaderService, IUseItemEventHandler>(new List>>()), _logger.Object, TestHelpers.Instance.LogLanguageLocalizer); - Session = await TestHelpers.Instance.GenerateSessionAsync().ConfigureAwait(false); - _receiverSession = await TestHelpers.Instance.GenerateSessionAsync().ConfigureAwait(false); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + _receiverSession = await TestHelpers.Instance.GenerateSessionAsync(); Handler = new SpeakerGuriHandler(_logger.Object, TestHelpers.Instance.LogLanguageLocalizer, TestHelpers.Instance.GameLanguageLocalizer, TestHelpers.Instance.SessionRegistry); } @@ -78,7 +78,7 @@ await ExecuteGuriEventHandlerAsync(new GuriPacket VisualId = 0, Data = 999, Value = "2 0 {test}" - }).ConfigureAwait(false); + }); var sayitempacket = (SayItemPacket?)_receiverSession!.LastPackets.FirstOrDefault(s => s is SayItemPacket); Assert.IsNotNull(sayitempacket); var saypacket = (SayPacket?)_receiverSession!.LastPackets.FirstOrDefault(s => s is SayPacket); @@ -97,7 +97,7 @@ await ExecuteGuriEventHandlerAsync(new GuriPacket VisualId = 0, Data = 999, Value = "2 1 {test}" - }).ConfigureAwait(false); + }); var sayitempacket = (SayItemPacket?)_receiverSession!.LastPackets.FirstOrDefault(s => s is SayItemPacket); Assert.IsNull(sayitempacket); var saypacket = (SayPacket?)_receiverSession!.LastPackets.FirstOrDefault(s => s is SayPacket); @@ -115,7 +115,7 @@ await ExecuteGuriEventHandlerAsync(new GuriPacket Type = GuriPacketType.TextInput, Argument = 3, VisualId = 0, - }).ConfigureAwait(false); + }); var sayitempacket = (SayItemPacket?)_receiverSession!.LastPackets.FirstOrDefault(s => s is SayItemPacket); Assert.IsNull(sayitempacket); var saypacket = (SayPacket?)_receiverSession!.LastPackets.FirstOrDefault(s => s is SayPacket); @@ -130,7 +130,7 @@ await ExecuteGuriEventHandlerAsync(new GuriPacket Type = GuriPacketType.TextInput, Argument = 3, VisualId = 0 - }).ConfigureAwait(false); + }); var sayitempacket = (SayItemPacket?)_receiverSession!.LastPackets.FirstOrDefault(s => s is SayItemPacket); Assert.IsNull(sayitempacket); var saypacket = (SayPacket?)_receiverSession!.LastPackets.FirstOrDefault(s => s is SayPacket); diff --git a/test/NosCore.GameObject.Tests/Services/GuriRunnerService/Handlers/TitleGuriHandlerTests.cs b/test/NosCore.GameObject.Tests/Services/GuriRunnerService/Handlers/TitleGuriHandlerTests.cs index a9c712843..b4a8d2033 100644 --- a/test/NosCore.GameObject.Tests/Services/GuriRunnerService/Handlers/TitleGuriHandlerTests.cs +++ b/test/NosCore.GameObject.Tests/Services/GuriRunnerService/Handlers/TitleGuriHandlerTests.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -59,7 +59,7 @@ public async Task SetupAsync() _itemProvider = new GameObject.Services.ItemGenerationService.ItemGenerationService(items, new EventLoaderService, IUseItemEventHandler>(new List>>()), _logger, TestHelpers.Instance.LogLanguageLocalizer); - Session = await TestHelpers.Instance.GenerateSessionAsync().ConfigureAwait(false); + Session = await TestHelpers.Instance.GenerateSessionAsync(); Handler = new TitleGuriHandler(); } @@ -71,7 +71,7 @@ await ExecuteGuriEventHandlerAsync(new GuriPacket { Type = GuriPacketType.Title, VisualId = 0 - }).ConfigureAwait(false); + }); var lastpacket = (InfoiPacket?)Session.LastPackets.FirstOrDefault(s => s is InfoiPacket); Assert.AreEqual(Game18NConstString.TitleChangedOrHidden, lastpacket?.Message); Assert.AreEqual(1, Session.Character.Titles.Count); @@ -86,7 +86,7 @@ await ExecuteGuriEventHandlerAsync(new GuriPacket { Type = GuriPacketType.Title, VisualId = 0 - }).ConfigureAwait(false); + }); var lastpacket = (InfoiPacket?)Session.LastPackets.FirstOrDefault(s => s is InfoiPacket); Assert.IsNull(lastpacket); Assert.AreEqual(1, Session.Character.Titles.Count); @@ -99,7 +99,7 @@ await ExecuteGuriEventHandlerAsync(new GuriPacket { Type = GuriPacketType.Title, VisualId = 0 - }).ConfigureAwait(false); + }); var lastpacket = (InfoiPacket?)Session!.LastPackets.FirstOrDefault(s => s is InfoiPacket); Assert.IsNull(lastpacket); Assert.AreEqual(0, Session.Character.Titles.Count); diff --git a/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/BackPackHandlerTests.cs b/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/BackPackHandlerTests.cs index 13941717a..9480d17be 100644 --- a/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/BackPackHandlerTests.cs +++ b/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/BackPackHandlerTests.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -52,8 +52,8 @@ public class BackPackHandlerTests : UseItemEventHandlerTestsBase [TestInitialize] public async Task SetupAsync() { - await TestHelpers.ResetAsync().ConfigureAwait(false); - Session = await TestHelpers.Instance.GenerateSessionAsync().ConfigureAwait(false); + await TestHelpers.ResetAsync(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); Handler = new BackPackHandler(Options.Create(new WorldConfiguration { MaxAdditionalSpPoints = 1 }), TestHelpers.Instance.Clock); var items = new List { @@ -74,7 +74,7 @@ public async Task Test_Can_Not_StackAsync() }); var itemInstance = InventoryItemInstance.Create(_itemProvider!.Create(2), Session.Character.CharacterId); Session.Character.InventoryService.AddItemToPocket(itemInstance); - await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance).ConfigureAwait(false); + await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance); Assert.AreEqual(1, Session.Character.StaticBonusList.Count); Assert.AreEqual(1, Session.Character.InventoryService.Count); @@ -85,7 +85,7 @@ public async Task Test_BackPackAsync() { var itemInstance = InventoryItemInstance.Create(_itemProvider!.Create(2), Session!.Character.CharacterId); Session.Character.InventoryService.AddItemToPocket(itemInstance); - await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance).ConfigureAwait(false); + await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance); var lastpacket = (ExtsPacket?)Session.LastPackets.FirstOrDefault(s => s is ExtsPacket); Assert.IsNotNull(lastpacket); Assert.AreEqual(1, Session.Character.StaticBonusList.Count); @@ -106,7 +106,7 @@ public async Task Test_Can_Not_StackTicketAsync() }); var itemInstance = InventoryItemInstance.Create(_itemProvider!.Create(1), Session.Character.CharacterId); Session.Character.InventoryService.AddItemToPocket(itemInstance); - await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance).ConfigureAwait(false); + await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance); Assert.AreEqual(1, Session.Character.StaticBonusList.Count); Assert.AreEqual(1, Session.Character.InventoryService.Count); @@ -117,7 +117,7 @@ public async Task Test_BackPackTicketAsync() { var itemInstance = InventoryItemInstance.Create(_itemProvider!.Create(1), Session!.Character.CharacterId); Session.Character.InventoryService.AddItemToPocket(itemInstance); - await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance).ConfigureAwait(false); + await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance); var lastpacket = (ExtsPacket?)Session.LastPackets.FirstOrDefault(s => s is ExtsPacket); Assert.IsNotNull(lastpacket); Assert.AreEqual(1, Session.Character.StaticBonusList.Count); diff --git a/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/BazaarMedalsHandlerTests.cs b/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/BazaarMedalsHandlerTests.cs index 6765615a9..65323b202 100644 --- a/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/BazaarMedalsHandlerTests.cs +++ b/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/BazaarMedalsHandlerTests.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -48,8 +48,8 @@ public class BazaarMedalsHandlerTests : UseItemEventHandlerTestsBase [TestInitialize] public async Task SetupAsync() { - await TestHelpers.ResetAsync().ConfigureAwait(false); - Session = await TestHelpers.Instance.GenerateSessionAsync().ConfigureAwait(false); + await TestHelpers.ResetAsync(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); Handler = new BazaarMedalsHandler(TestHelpers.Instance.Clock); var items = new List { @@ -70,7 +70,7 @@ public async Task Test_AddMedal_AlreadyOneDifferentAsync() StaticBonusType = StaticBonusType.BazaarMedalGold }); Session.Character.InventoryService.AddItemToPocket(itemInstance); - await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance).ConfigureAwait(false); + await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance); Assert.AreEqual(1, Session.Character.InventoryService.Count); } @@ -85,7 +85,7 @@ public async Task Test_AddMedal_AlreadyOneAsync() StaticBonusType = StaticBonusType.BazaarMedalGold }); Session.Character.InventoryService.AddItemToPocket(itemInstance); - await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance).ConfigureAwait(false); + await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance); Assert.AreEqual(1, Session.Character.InventoryService.Count); } @@ -94,7 +94,7 @@ public async Task Test_AddMedalAsync() { var itemInstance = InventoryItemInstance.Create(_itemProvider!.Create(1), Session!.Character.CharacterId); Session.Character.InventoryService.AddItemToPocket(itemInstance); - await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance).ConfigureAwait(false); + await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance); Assert.AreEqual(0, Session.Character.InventoryService.Count); Assert.AreEqual(1, Session.Character.StaticBonusList.Count); } diff --git a/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/MinilandBellHandlerTests.cs b/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/MinilandBellHandlerTests.cs index f9b21b5e4..06e57e47c 100644 --- a/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/MinilandBellHandlerTests.cs +++ b/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/MinilandBellHandlerTests.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -54,9 +54,9 @@ public class MinilandBellHandlerTests : UseItemEventHandlerTestsBase [TestInitialize] public async Task SetupAsync() { - await TestHelpers.ResetAsync().ConfigureAwait(false); + await TestHelpers.ResetAsync(); _minilandProvider = new Mock(); - Session = await TestHelpers.Instance.GenerateSessionAsync().ConfigureAwait(false); + Session = await TestHelpers.Instance.GenerateSessionAsync(); _minilandProvider.Setup(s => s.GetMiniland(Session.Character.CharacterId)) .Returns(new Miniland { MapInstanceId = TestHelpers.Instance.MinilandId }); mapChangeService = new Mock(); @@ -75,7 +75,7 @@ public async Task Test_Miniland_On_InstanceAsync() Session!.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetMapInstance(TestHelpers.Instance.MinilandId)!; var itemInstance = InventoryItemInstance.Create(_itemProvider!.Create(1), Session.Character.CharacterId); Session.Character.InventoryService.AddItemToPocket(itemInstance); - await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance).ConfigureAwait(false); + await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance); var lastpacket = (SayiPacket?)Session.LastPackets.FirstOrDefault(s => s is SayiPacket); Assert.AreEqual(lastpacket?.VisualType == VisualType.Player, lastpacket?.VisualId == Session.Character.CharacterId); Assert.AreEqual(lastpacket?.Type == SayColorType.Yellow, lastpacket?.Message == Game18NConstString.CanNotBeUsedHere); @@ -88,7 +88,7 @@ public async Task Test_Miniland_On_VehicleAsync() Session!.Character.IsVehicled = true; var itemInstance = InventoryItemInstance.Create(_itemProvider!.Create(1), Session.Character.CharacterId); Session.Character.InventoryService.AddItemToPocket(itemInstance); - await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance).ConfigureAwait(false); + await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance); var lastpacket = (SayiPacket?)Session.LastPackets.FirstOrDefault(s => s is SayiPacket); Assert.AreEqual(lastpacket?.VisualType == VisualType.Player, lastpacket?.VisualId == Session.Character.CharacterId); Assert.AreEqual(lastpacket?.Type == SayColorType.Yellow, lastpacket?.Message == Game18NConstString.OnlyPotionInVehicle); @@ -100,7 +100,7 @@ public async Task Test_Miniland_DelayAsync() { var itemInstance = InventoryItemInstance.Create(_itemProvider!.Create(1), Session!.Character.CharacterId); Session.Character.InventoryService.AddItemToPocket(itemInstance); - await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance).ConfigureAwait(false); + await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance); var lastpacket = (DelayPacket?)Session.LastPackets.FirstOrDefault(s => s is DelayPacket); Assert.IsNotNull(lastpacket); Assert.AreEqual(1, Session.Character.InventoryService.Count); @@ -112,7 +112,7 @@ public async Task Test_MinilandAsync() UseItem.Mode = 2; var itemInstance = InventoryItemInstance.Create(_itemProvider!.Create(1), Session!.Character.CharacterId); Session.Character.InventoryService.AddItemToPocket(itemInstance); - await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance).ConfigureAwait(false); + await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance); mapChangeService.Verify(x=>x.ChangeMapInstanceAsync(Session, TestHelpers.Instance.MinilandId, 5, 8), Times.Once); Assert.AreEqual(0, Session.Character.InventoryService.Count); } diff --git a/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/SpRechargerHandlerTests.cs b/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/SpRechargerHandlerTests.cs index 09a2c0c27..ec0b6e50d 100644 --- a/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/SpRechargerHandlerTests.cs +++ b/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/SpRechargerHandlerTests.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -50,8 +50,8 @@ public class SpRechargerEventHandlerTests : UseItemEventHandlerTestsBase [TestInitialize] public async Task SetupAsync() { - await TestHelpers.ResetAsync().ConfigureAwait(false); - Session = await TestHelpers.Instance.GenerateSessionAsync().ConfigureAwait(false); + await TestHelpers.ResetAsync(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); Handler = new SpRechargerEventHandler(Options.Create(new WorldConfiguration { MaxAdditionalSpPoints = 1 })); var items = new List { @@ -66,7 +66,7 @@ public async Task Test_SpRecharger_When_MaxAsync() Session!.Character.SpAdditionPoint = 1; var itemInstance = InventoryItemInstance.Create(_itemProvider!.Create(1), Session.Character.CharacterId); Session.Character.InventoryService.AddItemToPocket(itemInstance); - await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance).ConfigureAwait(false); + await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance); var lastpacket = (MsgiPacket?)Session.LastPackets.FirstOrDefault(s => s is MsgiPacket); Assert.AreEqual(lastpacket?.Type == MessageType.Default, lastpacket?.Message == Game18NConstString.CannotBeUsedExceedsCapacity); Assert.AreEqual(1, Session.Character.SpAdditionPoint); @@ -79,7 +79,7 @@ public async Task Test_SpRechargerAsync() Session!.Character.SpAdditionPoint = 0; var itemInstance = InventoryItemInstance.Create(_itemProvider!.Create(1), Session.Character.CharacterId); Session.Character.InventoryService.AddItemToPocket(itemInstance); - await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance).ConfigureAwait(false); + await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance); Assert.AreEqual(1, Session.Character.SpAdditionPoint); Assert.AreEqual(0, Session.Character.InventoryService.Count); } diff --git a/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/SpeakerHandlerTests.cs b/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/SpeakerHandlerTests.cs index e17e4d59c..a679888f6 100644 --- a/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/SpeakerHandlerTests.cs +++ b/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/SpeakerHandlerTests.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -47,8 +47,8 @@ public class SpeakerHandlerTests : UseItemEventHandlerTestsBase [TestInitialize] public async Task SetupAsync() { - await TestHelpers.ResetAsync().ConfigureAwait(false); - Session = await TestHelpers.Instance.GenerateSessionAsync().ConfigureAwait(false); + await TestHelpers.ResetAsync(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); Handler = new SpeakerHandler(); var items = new List { @@ -63,7 +63,7 @@ public async Task Test_SpeakerItemHandlerAsync() { var itemInstance = InventoryItemInstance.Create(_itemProvider!.Create(1), Session!.Character.CharacterId); Session.Character.InventoryService.AddItemToPocket(itemInstance); - await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance).ConfigureAwait(false); + await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance); var lastpacket = (GuriPacket?)Session.LastPackets.FirstOrDefault(s => s is GuriPacket); Assert.IsNotNull(lastpacket); } diff --git a/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/TitleHandlerTests.cs b/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/TitleHandlerTests.cs index cb61e7dd5..69a307c67 100644 --- a/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/TitleHandlerTests.cs +++ b/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/TitleHandlerTests.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -47,8 +47,8 @@ public class TitleHandlerTests : UseItemEventHandlerTestsBase [TestInitialize] public async Task SetupAsync() { - await TestHelpers.ResetAsync().ConfigureAwait(false); - Session = await TestHelpers.Instance.GenerateSessionAsync().ConfigureAwait(false); + await TestHelpers.ResetAsync(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); Handler = new TitleHandler(); var items = new List { @@ -63,7 +63,7 @@ public async Task Test_TitleItemHandlerAsync() { var itemInstance = InventoryItemInstance.Create(_itemProvider!.Create(1), Session!.Character.CharacterId); Session.Character.InventoryService.AddItemToPocket(itemInstance); - await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance).ConfigureAwait(false); + await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance); var lastpacket = (QnaiPacket?)Session.LastPackets.FirstOrDefault(s => s is QnaiPacket); Assert.IsNotNull(lastpacket); Assert.IsTrue(lastpacket.YesPacket!.GetType() == typeof(GuriPacket)); diff --git a/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/VehicleHandlerTests.cs b/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/VehicleHandlerTests.cs index ced7c0b29..c75f9aeb9 100644 --- a/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/VehicleHandlerTests.cs +++ b/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/VehicleHandlerTests.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -53,8 +53,8 @@ public class VehicleEventHandlerTests : UseItemEventHandlerTestsBase [TestInitialize] public async Task SetupAsync() { - await TestHelpers.ResetAsync().ConfigureAwait(false); - Session = await TestHelpers.Instance.GenerateSessionAsync().ConfigureAwait(false); + await TestHelpers.ResetAsync(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); _logger = new Mock(); Handler = new VehicleEventHandler(_logger.Object, TestHelpers.Instance.LogLanguageLocalizer, new TransformationService(TestHelpers.Instance.Clock, new Mock().Object, new Mock().Object, new Mock().Object, _logger.Object, TestHelpers.Instance.LogLanguageLocalizer)); var items = new List @@ -71,7 +71,7 @@ public async Task Test_Can_Not_Vehicle_In_ShopAsync() { Session!.Character.InShop = true; var itemInstance = InventoryItemInstance.Create(_itemProvider!.Create(1), Session.Character.CharacterId); - await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance).ConfigureAwait(false); + await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance); _logger!.Verify(s => s.Error(TestHelpers.Instance.LogLanguageLocalizer[LogLanguageKey.CANT_USE_ITEM_IN_SHOP]), Times.Exactly(1)); } @@ -80,7 +80,7 @@ public async Task Test_Vehicle_GetDelayedAsync() { UseItem.Mode = 1; var itemInstance = InventoryItemInstance.Create(_itemProvider!.Create(1), Session!.Character.CharacterId); - await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance).ConfigureAwait(false); + await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance); var lastpacket = (DelayPacket?)Session.LastPackets.FirstOrDefault(s => s is DelayPacket); Assert.IsNotNull(lastpacket); } @@ -90,7 +90,7 @@ public async Task Test_VehicleAsync() { UseItem.Mode = 2; var itemInstance = InventoryItemInstance.Create(_itemProvider!.Create(1), Session!.Character.CharacterId); - await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance).ConfigureAwait(false); + await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance); Assert.IsTrue(Session.Character.IsVehicled); } @@ -99,7 +99,7 @@ public async Task Test_Vehicle_RemoveAsync() { Session!.Character.IsVehicled = true; var itemInstance = InventoryItemInstance.Create(_itemProvider!.Create(1), Session.Character.CharacterId); - await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance).ConfigureAwait(false); + await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance); Assert.IsFalse(Session.Character.IsVehicled); } } diff --git a/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/WearHandlerTests.cs b/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/WearHandlerTests.cs index 313950017..540c224fe 100644 --- a/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/WearHandlerTests.cs +++ b/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/WearHandlerTests.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -56,10 +56,10 @@ public class WearEventHandlerTests : UseItemEventHandlerTestsBase [TestInitialize] public async Task SetupAsync() { - await TestHelpers.ResetAsync().ConfigureAwait(false); + await TestHelpers.ResetAsync(); _logger = new Mock(); TestHelpers.Instance.WorldConfiguration.Value.BackpackSize = 40; - Session = await TestHelpers.Instance.GenerateSessionAsync().ConfigureAwait(false); + Session = await TestHelpers.Instance.GenerateSessionAsync(); Handler = new WearEventHandler(_logger.Object, TestHelpers.Instance.Clock, TestHelpers.Instance.LogLanguageLocalizer); var items = new List { @@ -127,7 +127,7 @@ public async Task Test_Can_Not_Use_WearEvent_In_ShopAsync() { Session!.Character.InShop = true; var itemInstance = InventoryItemInstance.Create(_itemProvider!.Create(1), Session.Character.CharacterId); - await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance).ConfigureAwait(false); + await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance); _logger!.Verify(s => s.Error(TestHelpers.Instance.LogLanguageLocalizer[LogLanguageKey.CANT_USE_ITEM_IN_SHOP]), Times.Exactly(1)); } @@ -136,7 +136,7 @@ public async Task Test_BoundCharacter_QuestionAsync() { var itemInstance = InventoryItemInstance.Create(_itemProvider!.Create(1), Session!.Character.CharacterId); Session.Character.InventoryService.AddItemToPocket(itemInstance); - await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance).ConfigureAwait(false); + await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance); var lastpacket = (QnaPacket?)Session.LastPackets.FirstOrDefault(s => s is QnaPacket); Assert.AreEqual(Session.GetMessageFromKey(LanguageKey.ASK_BIND), lastpacket?.Question); } @@ -147,7 +147,7 @@ public async Task Test_BoundCharacterAsync() UseItem.Mode = 1; var itemInstance = InventoryItemInstance.Create(_itemProvider!.Create(1), Session!.Character.CharacterId); Session.Character.InventoryService.AddItemToPocket(itemInstance); - await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance).ConfigureAwait(false); + await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance); Assert.AreEqual(Session.Character.CharacterId, itemInstance.ItemInstance?.BoundCharacterId); } @@ -157,7 +157,7 @@ public async Task Test_BadEquipmentAsync() UseItem.Mode = 1; var itemInstance = InventoryItemInstance.Create(_itemProvider!.Create(5), Session!.Character.CharacterId); Session.Character.InventoryService.AddItemToPocket(itemInstance); - await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance).ConfigureAwait(false); + await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance); var lastpacket = (SayiPacket?)Session.LastPackets.FirstOrDefault(s => s is SayiPacket); Assert.AreEqual(lastpacket?.VisualType == VisualType.Player, lastpacket?.VisualId == Session.Character.CharacterId); Assert.AreEqual(lastpacket?.Type == SayColorType.Yellow, lastpacket?.Message == Game18NConstString.CanNotWearThat); @@ -172,7 +172,7 @@ public async Task Test_BadFairyAsync() Session.Character.InventoryService.AddItemToPocket(itemInstance); var sp = InventoryItemInstance.Create(_itemProvider.Create(4), Session.Character.CharacterId); Session.Character.InventoryService.AddItemToPocket(sp, NoscorePocketType.Wear); - await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance).ConfigureAwait(false); + await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance); var lastpacket = (MsgiPacket?)Session.LastPackets.FirstOrDefault(s => s is MsgiPacket); Assert.AreEqual(Game18NConstString.SpecialistAndFairyDifferentElement, lastpacket?.Message); } @@ -187,7 +187,7 @@ public async Task Test_SpLoadingAsync() Session.Character.InventoryService.AddItemToPocket(itemInstance); var sp = InventoryItemInstance.Create(_itemProvider.Create(4), Session.Character.CharacterId); Session.Character.InventoryService.AddItemToPocket(sp, NoscorePocketType.Wear); - await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance).ConfigureAwait(false); + await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance); var lastpacket = (MsgiPacket?)Session.LastPackets.FirstOrDefault(s => s is MsgiPacket); Assert.AreEqual(lastpacket?.Type == MessageType.Default, lastpacket?.Message == Game18NConstString.CantTrasformWithSideEffect); Assert.AreEqual(lastpacket?.ArgumentType == 4, (int?)lastpacket?.Game18NArguments[0] == Session.Character.SpCooldown); @@ -202,7 +202,7 @@ public async Task Test_UseSpAsync() Session.Character.InventoryService.AddItemToPocket(itemInstance); var sp = InventoryItemInstance.Create(_itemProvider.Create(4), Session.Character.CharacterId); Session.Character.InventoryService.AddItemToPocket(sp, NoscorePocketType.Wear); - await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance).ConfigureAwait(false); + await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance); var lastpacket = (SayiPacket?)Session.LastPackets.FirstOrDefault(s => s is SayiPacket); Assert.AreEqual(lastpacket?.VisualType == VisualType.Player, lastpacket?.VisualId == Session.Character.CharacterId); Assert.AreEqual(lastpacket?.Type == SayColorType.Yellow, lastpacket?.Message == Game18NConstString.SpecialistCardsCannotBeTradedWhileTransformed); @@ -215,7 +215,7 @@ public async Task Test_UseDestroyedSpAsync() var itemInstance = InventoryItemInstance.Create(_itemProvider!.Create(4), Session!.Character.CharacterId); Session.Character.InventoryService.AddItemToPocket(itemInstance); itemInstance.ItemInstance.Rare = -2; - await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance).ConfigureAwait(false); + await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance); var lastpacket = (MsgiPacket?)Session.LastPackets.FirstOrDefault(s => s is MsgiPacket); Assert.AreEqual(lastpacket?.Type == MessageType.Default, lastpacket?.Message == Game18NConstString.CantUseBecauseSoulDestroyed); } @@ -226,7 +226,7 @@ public async Task Test_Use_BadJobLevelAsync() UseItem.Mode = 1; var itemInstance = InventoryItemInstance.Create(_itemProvider!.Create(6), Session!.Character.CharacterId); Session.Character.InventoryService.AddItemToPocket(itemInstance); - await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance).ConfigureAwait(false); + await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance); var lastpacket = (MsgiPacket?)Session.LastPackets.FirstOrDefault(s => s is MsgiPacket); Assert.AreEqual(lastpacket?.Message, Game18NConstString.CanNotBeWornDifferentClass); } @@ -237,7 +237,7 @@ public async Task Test_Use_SPAsync() UseItem.Mode = 1; var itemInstance = InventoryItemInstance.Create(_itemProvider!.Create(4), Session!.Character.CharacterId); Session.Character.InventoryService.AddItemToPocket(itemInstance); - await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance).ConfigureAwait(false); + await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance); var lastpacket = (SpPacket?)Session.LastPackets.FirstOrDefault(s => s is SpPacket); Assert.IsNotNull(lastpacket); } @@ -248,7 +248,7 @@ public async Task Test_Use_FairyAsync() UseItem.Mode = 1; var itemInstance = InventoryItemInstance.Create(_itemProvider!.Create(2), Session!.Character.CharacterId); Session.Character.InventoryService.AddItemToPocket(itemInstance); - await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance).ConfigureAwait(false); + await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance); var lastpacket = (PairyPacket?)Session.Character.MapInstance.LastPackets.FirstOrDefault(s => s is PairyPacket); Assert.IsNotNull(lastpacket); } @@ -259,7 +259,7 @@ public async Task Test_Use_AmuletAsync() UseItem.Mode = 1; var itemInstance = InventoryItemInstance.Create(_itemProvider!.Create(7), Session!.Character.CharacterId); Session.Character.InventoryService.AddItemToPocket(itemInstance); - await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance).ConfigureAwait(false); + await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance); var lastpacket = (EffectPacket?)Session.LastPackets.FirstOrDefault(s => s is EffectPacket); Assert.IsNotNull(lastpacket); Assert.AreEqual(TestHelpers.Instance.Clock.GetCurrentInstant().Plus(Duration.FromSeconds(itemInstance.ItemInstance.Item.ItemValidTime)), itemInstance.ItemInstance.ItemDeleteTime); diff --git a/test/NosCore.GameObject.Tests/Services/NRunService/Handlers/ChangeClassTests.cs b/test/NosCore.GameObject.Tests/Services/NRunService/Handlers/ChangeClassTests.cs index c32633def..0ade3abbe 100644 --- a/test/NosCore.GameObject.Tests/Services/NRunService/Handlers/ChangeClassTests.cs +++ b/test/NosCore.GameObject.Tests/Services/NRunService/Handlers/ChangeClassTests.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -56,8 +56,8 @@ public class ChangeClassTests [TestInitialize] public async Task SetupAsync() { - await TestHelpers.ResetAsync().ConfigureAwait(false); - _session = await TestHelpers.Instance.GenerateSessionAsync().ConfigureAwait(false); + await TestHelpers.ResetAsync(); + _session = await TestHelpers.Instance.GenerateSessionAsync(); _item = TestHelpers.Instance.GenerateItemProvider(); _nrRunService = new NrunService( new List, Tuple>> diff --git a/test/NosCore.GameObject.Tests/ShopTests.cs b/test/NosCore.GameObject.Tests/ShopTests.cs index e5402c520..77e1d6678 100644 --- a/test/NosCore.GameObject.Tests/ShopTests.cs +++ b/test/NosCore.GameObject.Tests/ShopTests.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -78,11 +78,11 @@ public class ShopTests public async Task SetupAsync() { Broadcaster.Reset(); - await TestHelpers.ResetAsync().ConfigureAwait(false); + await TestHelpers.ResetAsync(); _friendHttpClient = new Mock().Object; TestHelpers.Instance.WorldConfiguration.Value.BackpackSize = 3; _instanceProvider = TestHelpers.Instance.MapInstanceAccessorService; - _session = await TestHelpers.Instance.GenerateSessionAsync().ConfigureAwait(false); + _session = await TestHelpers.Instance.GenerateSessionAsync(); } @@ -103,7 +103,7 @@ public async Task UserCanNotShopNonExistingSlotAsync() { ShopItems = list }; - await _session.Character.BuyAsync(shop, 1, 99).ConfigureAwait(false); + await _session.Character.BuyAsync(shop, 1, 99); Assert.IsNull(_session.LastPackets.FirstOrDefault()); } @@ -124,7 +124,7 @@ public async Task UserCantShopMoreThanQuantityNonExistingSlotAsync() { ShopItems = list }; - await _session.Character.BuyAsync(shop, 0, 99).ConfigureAwait(false); + await _session.Character.BuyAsync(shop, 0, 99); Assert.IsNull(_session.LastPackets.FirstOrDefault()); } @@ -145,7 +145,7 @@ public async Task UserCantShopWithoutMoneyAsync() { ShopItems = list }; - await _session.Character.BuyAsync(shop, 0, 99).ConfigureAwait(false); + await _session.Character.BuyAsync(shop, 0, 99); var packet = (SMemoiPacket?)_session.LastPackets.FirstOrDefault(s => s is SMemoiPacket); Assert.IsTrue(packet?.Message == Game18NConstString.NotEnoughGold5); @@ -168,7 +168,7 @@ public async Task UserCantShopWithoutReputAsync() { ShopItems = list }; - await _session.Character.BuyAsync(shop, 0, 99).ConfigureAwait(false); + await _session.Character.BuyAsync(shop, 0, 99); var packet = (SMemoiPacket?)_session.LastPackets.FirstOrDefault(s => s is SMemoiPacket); Assert.IsTrue(packet?.Message == Game18NConstString.ReputationNotHighEnough); @@ -202,7 +202,7 @@ public async Task UserCantShopWithoutPlaceAsync() InventoryItemInstance.Create(itemBuilder.Create(1, 999), _session.Character.CharacterId), NoscorePocketType.Etc, 2); - await _session.Character.BuyAsync(shop, 0, 999).ConfigureAwait(false); + await _session.Character.BuyAsync(shop, 0, 999); var packet = (MsgiPacket?)_session.LastPackets.FirstOrDefault(s => s is MsgiPacket); Assert.IsTrue(packet?.Message == Game18NConstString.NotEnoughSpace); } @@ -235,7 +235,7 @@ public async Task UserCanShopAsync() InventoryItemInstance.Create(itemBuilder.Create(1, 1), _session.Character.CharacterId), NoscorePocketType.Etc, 2); - await _session.Character.BuyAsync(shop, 0, 998).ConfigureAwait(false); + await _session.Character.BuyAsync(shop, 0, 998); Assert.IsTrue(_session.Character.InventoryService.All(s => s.Value.ItemInstance?.Amount == 999)); Assert.IsTrue(_session.Character.Gold == 499002); } @@ -268,7 +268,7 @@ public async Task UserCanShopReputAsync() InventoryItemInstance.Create(itemBuilder.Create(1, 1), _session.Character.CharacterId), NoscorePocketType.Etc, 2); - await _session.Character.BuyAsync(shop, 0, 998).ConfigureAwait(false); + await _session.Character.BuyAsync(shop, 0, 998); Assert.IsTrue(_session.Character.InventoryService.All(s => s.Value.ItemInstance?.Amount == 999)); Assert.IsTrue(_session.Character.Reput == 499002); } @@ -310,7 +310,7 @@ private async Task PrepareSessionShopAsync() State = CharacterState.Active }; chara2.MapInstance = mapinstance; - await session2.SetCharacterAsync(chara2).ConfigureAwait(false); + await session2.SetCharacterAsync(chara2); session2.Account = account; _session!.Character.Gold = 500000; @@ -344,8 +344,8 @@ private async Task PrepareSessionShopAsync() [TestMethod] public async Task UserCanShopFromSessionAsync() { - var session2 = await PrepareSessionShopAsync().ConfigureAwait(false); - await _session!.Character.BuyAsync(session2.Character.Shop!, 0, 999).ConfigureAwait(false); + var session2 = await PrepareSessionShopAsync(); + await _session!.Character.BuyAsync(session2.Character.Shop!, 0, 999); Assert.IsTrue(session2.Character.Gold == 999); Assert.IsTrue(session2.Character.InventoryService.CountItem(1) == 0); } @@ -353,8 +353,8 @@ public async Task UserCanShopFromSessionAsync() [TestMethod] public async Task UserCanShopFromSessionPartialAsync() { - var session2 = await PrepareSessionShopAsync().ConfigureAwait(false); - await _session!.Character.BuyAsync(session2.Character.Shop!, 0, 998).ConfigureAwait(false); + var session2 = await PrepareSessionShopAsync(); + await _session!.Character.BuyAsync(session2.Character.Shop!, 0, 998); Assert.IsTrue(session2.Character.Gold == 998); Assert.IsTrue(session2.Character.InventoryService.CountItem(1) == 1); } @@ -362,8 +362,8 @@ public async Task UserCanShopFromSessionPartialAsync() [TestMethod] public async Task UserCanNotShopMoreThanShopAsync() { - var session2 = await PrepareSessionShopAsync().ConfigureAwait(false); - await _session!.Character.BuyAsync(session2.Character.Shop!, 1, 501).ConfigureAwait(false); + var session2 = await PrepareSessionShopAsync(); + await _session!.Character.BuyAsync(session2.Character.Shop!, 1, 501); Assert.IsTrue(session2.Character.Gold == 0); Assert.IsTrue(session2.Character.InventoryService.CountItem(1) == 999); } @@ -371,8 +371,8 @@ public async Task UserCanNotShopMoreThanShopAsync() [TestMethod] public async Task UserCanShopFullAsync() { - var session2 = await PrepareSessionShopAsync().ConfigureAwait(false); - await _session!.Character.BuyAsync(session2.Character.Shop!, 1, 500).ConfigureAwait(false); + var session2 = await PrepareSessionShopAsync(); + await _session!.Character.BuyAsync(session2.Character.Shop!, 1, 500); Assert.IsTrue(session2.Character.Gold == 500); Assert.IsTrue(session2.Character.InventoryService.CountItem(1) == 499); } @@ -380,9 +380,9 @@ public async Task UserCanShopFullAsync() [TestMethod] public async Task UserCanNotShopTooRichAsync() { - var session2 = await PrepareSessionShopAsync().ConfigureAwait(false); + var session2 = await PrepareSessionShopAsync(); session2.Character.Gold = 999_999_999; - await _session!.Character.BuyAsync(session2.Character.Shop!, 0, 999).ConfigureAwait(false); + await _session!.Character.BuyAsync(session2.Character.Shop!, 0, 999); Assert.IsTrue(session2.Character.Gold == 999_999_999); Assert.IsTrue(session2.Character.InventoryService.CountItem(1) == 999); var packet = (SMemoPacket?)_session.LastPackets.FirstOrDefault(s => s is SMemoPacket); diff --git a/test/NosCore.PacketHandlers.Tests/Bazaar/CBListPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Bazaar/CBListPacketHandlerTests.cs index bd393d5d3..ce4b8e3ce 100644 --- a/test/NosCore.PacketHandlers.Tests/Bazaar/CBListPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Bazaar/CBListPacketHandlerTests.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -48,9 +48,9 @@ public class CbListPacketHandlerTest [TestInitialize] public async Task SetupAsync() { - await TestHelpers.ResetAsync().ConfigureAwait(false); + await TestHelpers.ResetAsync(); Broadcaster.Reset(); - _session = await TestHelpers.Instance.GenerateSessionAsync().ConfigureAwait(false); + _session = await TestHelpers.Instance.GenerateSessionAsync(); _bazaarHttpClient = new Mock(); var items = new List { @@ -74,7 +74,7 @@ public async Task ListShouldReturnEmptyWhenNoItemsAsync() It.IsAny(), It.IsAny()) ).ReturnsAsync(new List()); - await _cblistPacketHandler!.ExecuteAsync(new CBListPacket { ItemVNumFilter = new List() }, _session!).ConfigureAwait(false); + await _cblistPacketHandler!.ExecuteAsync(new CBListPacket { ItemVNumFilter = new List() }, _session!); var lastpacket = (RcbListPacket?)_session!.LastPackets.FirstOrDefault(s => s is RcbListPacket); Assert.IsTrue(lastpacket?.Items?.Count == 0); } @@ -103,7 +103,7 @@ public async Task ListShouldReturnTheItemsAsync() ItemInstance = new ItemInstanceDto {ItemVNum = 1012, Amount = 1} } }); - await _cblistPacketHandler!.ExecuteAsync(new CBListPacket { ItemVNumFilter = new List() }, _session!).ConfigureAwait(false); + await _cblistPacketHandler!.ExecuteAsync(new CBListPacket { ItemVNumFilter = new List() }, _session!); var lastpacket = (RcbListPacket?)_session!.LastPackets.FirstOrDefault(s => s is RcbListPacket); Assert.IsTrue(lastpacket?.Items?.Count == 1); } @@ -131,7 +131,7 @@ public async Task ListShouldReturnTheItemsNotValidAsync() ItemInstance = new ItemInstanceDto {ItemVNum = 1012, Amount = 1} } }); - await _cblistPacketHandler!.ExecuteAsync(new CBListPacket { ItemVNumFilter = new List() }, _session!).ConfigureAwait(false); + await _cblistPacketHandler!.ExecuteAsync(new CBListPacket { ItemVNumFilter = new List() }, _session!); var lastpacket = (RcbListPacket?)_session!.LastPackets.FirstOrDefault(s => s is RcbListPacket); Assert.IsTrue(lastpacket?.Items?.Count == 0); } diff --git a/test/NosCore.PacketHandlers.Tests/Bazaar/CBuyPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Bazaar/CBuyPacketHandlerTests.cs index f640a9874..31f61a9b0 100644 --- a/test/NosCore.PacketHandlers.Tests/Bazaar/CBuyPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Bazaar/CBuyPacketHandlerTests.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -57,9 +57,9 @@ public class CBuyPacketHandlerTest [TestInitialize] public async Task SetupAsync() { - await TestHelpers.ResetAsync().ConfigureAwait(false); + await TestHelpers.ResetAsync(); Broadcaster.Reset(); - _session = await TestHelpers.Instance.GenerateSessionAsync().ConfigureAwait(false); + _session = await TestHelpers.Instance.GenerateSessionAsync(); _bazaarHttpClient = new Mock(); _itemInstanceDao = new Mock>(); _itemProvider = new Mock(); @@ -104,7 +104,7 @@ public async Task BuyWhenExchangeOrTradeAsync() Amount = 1, VNum = 1012 } - }).ConfigureAwait(false); ; + }); ; Assert.IsNull(_session.LastPackets.FirstOrDefault()); } @@ -117,7 +117,7 @@ public async Task BuyWhenNoItemFoundAsync() Price = 50, Amount = 1, VNum = 1012 - }, _session!).ConfigureAwait(false); + }, _session!); var lastpacket = (ModaliPacket?)_session!.LastPackets.FirstOrDefault(s => s is ModaliPacket); Assert.IsTrue(lastpacket?.Type == 1 && lastpacket?.Message == Game18NConstString.OfferUpdated); } @@ -131,7 +131,7 @@ public async Task BuyWhenSellerAsync() Price = 50, Amount = 1, VNum = 1012 - }, _session!).ConfigureAwait(false); + }, _session!); var lastpacket = (ModaliPacket?)_session!.LastPackets.FirstOrDefault(s => s is ModaliPacket); Assert.IsTrue(lastpacket?.Type == 1 && lastpacket?.Message == Game18NConstString.OfferUpdated); } @@ -145,7 +145,7 @@ public async Task BuyWhenDifferentPriceAsync() Price = 40, Amount = 1, VNum = 1012 - }, _session!).ConfigureAwait(false); + }, _session!); var lastpacket = (ModaliPacket?)_session!.LastPackets.FirstOrDefault(s => s is ModaliPacket); Assert.IsTrue(lastpacket?.Type == 1 && lastpacket?.Message == Game18NConstString.OfferUpdated); } @@ -169,7 +169,7 @@ public async Task BuyWhenCanNotAddItemAsync() Price = 50, Amount = 1, VNum = 1012 - }, _session).ConfigureAwait(false); + }, _session); var lastpacket = (InfoiPacket?)_session.LastPackets.FirstOrDefault(s => s is InfoiPacket); Assert.IsTrue(lastpacket?.Message == Game18NConstString.NotEnoughSpace); } @@ -184,7 +184,7 @@ public async Task BuyMoreThanSellingAsync() Price = 50, Amount = 2, VNum = 1012 - }, _session).ConfigureAwait(false); + }, _session); var lastpacket = (ModaliPacket?)_session!.LastPackets.FirstOrDefault(s => s is ModaliPacket); Assert.IsTrue(lastpacket?.Type == 1 && lastpacket?.Message == Game18NConstString.OfferUpdated); } @@ -199,7 +199,7 @@ public async Task BuyPartialPackageAsync() Price = 50, Amount = 1, VNum = 1012 - }, _session).ConfigureAwait(false); + }, _session); Assert.IsNull(_session.LastPackets.FirstOrDefault()); } @@ -216,7 +216,7 @@ public async Task BuyPackageAsync() Price = 50, Amount = 99, VNum = 1012 - }, _session).ConfigureAwait(false); + }, _session); var lastpacket = (SayiPacket?)_session.LastPackets.FirstOrDefault(s => s is SayiPacket); Assert.IsTrue(lastpacket?.VisualType == VisualType.Player && lastpacket?.VisualId == _session.Character.CharacterId && lastpacket?.Type == SayColorType.Yellow && lastpacket?.Message == Game18NConstString.BoughtItem && lastpacket?.ArgumentType == 2 && (string?)lastpacket?.Game18NArguments[0] == item.VNum.ToString() && (short?)lastpacket?.Game18NArguments[1] == 99); @@ -231,7 +231,7 @@ public async Task BuyNotEnoughMoneyAsync() Price = 50, Amount = 1, VNum = 1012 - }, _session!).ConfigureAwait(false); + }, _session!); var lastpacket = (ModaliPacket?)_session!.LastPackets.FirstOrDefault(s => s is ModaliPacket); Assert.IsTrue(lastpacket?.Message == Game18NConstString.InsufficientGoldAvailable); } @@ -249,7 +249,7 @@ public async Task BuyAsync() Price = 50, Amount = 1, VNum = 1012 - }, _session).ConfigureAwait(false); + }, _session); var lastpacket = (SayiPacket?)_session.LastPackets.FirstOrDefault(s => s is SayiPacket); Assert.IsTrue(lastpacket?.VisualType == VisualType.Player && lastpacket?.VisualId == _session.Character.CharacterId && lastpacket?.Type == SayColorType.Yellow && lastpacket?.Message == Game18NConstString.BoughtItem && lastpacket?.ArgumentType == 2 && (string?)lastpacket?.Game18NArguments[0] == item.VNum.ToString() && (short?)lastpacket?.Game18NArguments[1] == 1); diff --git a/test/NosCore.PacketHandlers.Tests/Bazaar/CModPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Bazaar/CModPacketHandlerTests.cs index a03525b99..fe2407bf4 100644 --- a/test/NosCore.PacketHandlers.Tests/Bazaar/CModPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Bazaar/CModPacketHandlerTests.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -50,9 +50,9 @@ public class CModPacketHandlerTest [TestInitialize] public async Task SetupAsync() { - await TestHelpers.ResetAsync().ConfigureAwait(false); + await TestHelpers.ResetAsync(); Broadcaster.Reset(); - _session = await TestHelpers.Instance.GenerateSessionAsync().ConfigureAwait(false); + _session = await TestHelpers.Instance.GenerateSessionAsync(); _bazaarHttpClient = new Mock(); _cmodPacketHandler = new CModPacketHandler(_bazaarHttpClient.Object, Logger, TestHelpers.Instance.LogLanguageLocalizer); @@ -98,7 +98,7 @@ public async Task ModifyWhenInExchangeAsync() NewPrice = 50, Amount = 1, VNum = 1012 - }, _session).ConfigureAwait(false); + }, _session); Assert.IsNull(_session.LastPackets.FirstOrDefault()); } @@ -111,7 +111,7 @@ public async Task ModifyWhenNoItemAsync() NewPrice = 50, Amount = 1, VNum = 1012 - }, _session!).ConfigureAwait(false); + }, _session!); Assert.IsNull(_session!.LastPackets.FirstOrDefault()); } @@ -125,7 +125,7 @@ public async Task ModifyWhenOtherSellerAsync() NewPrice = 50, Amount = 1, VNum = 1012 - }, _session!).ConfigureAwait(false); + }, _session!); Assert.IsNull(_session!.LastPackets.FirstOrDefault()); } @@ -138,7 +138,7 @@ public async Task ModifyWhenSoldAsync() NewPrice = 60, Amount = 1, VNum = 1012 - }, _session!).ConfigureAwait(false); + }, _session!); var lastpacket = (ModaliPacket?)_session!.LastPackets.FirstOrDefault(s => s is ModaliPacket); Assert.IsTrue(lastpacket?.Type == 1 && lastpacket?.Message == Game18NConstString.CannotChangePriceSoldItems); } @@ -152,7 +152,7 @@ public async Task ModifyWhenWrongAmountAsync() NewPrice = 70, Amount = 2, VNum = 1012 - }, _session!).ConfigureAwait(false); + }, _session!); var lastpacket = (ModaliPacket?)_session!.LastPackets.FirstOrDefault(s => s is ModaliPacket); Assert.IsTrue(lastpacket?.Type == 1 && lastpacket?.Message == Game18NConstString.OfferUpdated); } @@ -166,7 +166,7 @@ public async Task ModifyWhenPriceSamePriceAsync() NewPrice = 60, Amount = 1, VNum = 1012 - }, _session!).ConfigureAwait(false); + }, _session!); Assert.IsNull(_session!.LastPackets.FirstOrDefault()); } @@ -179,7 +179,7 @@ public async Task ModifyAsync() NewPrice = 70, Amount = 1, VNum = 1012 - }, _session!).ConfigureAwait(false); + }, _session!); var lastpacket = (SayiPacket?)_session!.LastPackets.FirstOrDefault(s => s is SayiPacket); Assert.IsTrue(lastpacket?.VisualType == VisualType.Player && lastpacket?.VisualId == _session.Character.CharacterId && lastpacket?.Type == SayColorType.Yellow && lastpacket?.Message == Game18NConstString.NewSellingPrice && diff --git a/test/NosCore.PacketHandlers.Tests/Bazaar/CRegPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Bazaar/CRegPacketHandlerTests.cs index 8b01f3b71..555f30eaf 100644 --- a/test/NosCore.PacketHandlers.Tests/Bazaar/CRegPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Bazaar/CRegPacketHandlerTests.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -63,9 +63,9 @@ public class CRegPacketHandlerTest [TestInitialize] public async Task SetupAsync() { - await TestHelpers.ResetAsync().ConfigureAwait(false); + await TestHelpers.ResetAsync(); Broadcaster.Reset(); - _session = await TestHelpers.Instance.GenerateSessionAsync().ConfigureAwait(false); + _session = await TestHelpers.Instance.GenerateSessionAsync(); _session.Character.StaticBonusList = new List(); _bazaarHttpClient = new Mock(); _inventoryItemInstanceDao = new Mock>(); @@ -102,7 +102,7 @@ public async Task RegisterWhenInExchangeOrTradeAsync() Amount = 1, Taxe = 0, MedalUsed = 0 - }}).ConfigureAwait(false); + }}); Assert.IsNull(_session.LastPackets.FirstOrDefault()); } @@ -121,7 +121,7 @@ public async Task RegisterTaxWhenMedalMoreThanGoldAsync() Amount = 1, Taxe = 0, MedalUsed = 0 - }, _session!).ConfigureAwait(false); + }, _session!); var lastpacket = (MsgiPacket?)_session!.LastPackets.FirstOrDefault(s => s is MsgiPacket); Assert.IsTrue(lastpacket?.Message == Game18NConstString.NotEnoughGold); @@ -141,7 +141,7 @@ public async Task RegisterNegativeAmountAsync() Amount = -1, Taxe = 0, MedalUsed = 0 - }, _session).ConfigureAwait(false); + }, _session); Assert.IsNull(_session.LastPackets.FirstOrDefault()); } @@ -159,7 +159,7 @@ public async Task RegisterNotExistingItemAsync() Amount = 1, Taxe = 0, MedalUsed = 0 - }, _session).ConfigureAwait(false); + }, _session); Assert.IsNull(_session.LastPackets.FirstOrDefault()); } @@ -180,7 +180,7 @@ public async Task RegisterTooExpensiveWhenNoMedalAsync() Taxe = 0, MedalUsed = 0, Price = 100000001 - }, _session).ConfigureAwait(false); + }, _session); var lastpacket = (ModaliPacket?)_session.LastPackets.FirstOrDefault(s => s is ModaliPacket); Assert.IsTrue(lastpacket?.Type == 1 && lastpacket?.Message == Game18NConstString.NotExceedMaxPrice && lastpacket?.ArgumentType == 4 && (long?)lastpacket?.Game18NArguments[0] == 1000000); } @@ -206,7 +206,7 @@ public async Task RegisterHasSmallerTaxWhenMedalAsync() Taxe = 0, MedalUsed = 0, Price = 10000000 - }, _session).ConfigureAwait(false); + }, _session); var lastpacket = (MsgiPacket?)_session.LastPackets.FirstOrDefault(s => s is MsgiPacket); Assert.AreEqual(0, _session.Character.InventoryService.Count); Assert.IsTrue(lastpacket?.Type == MessageType.Default && lastpacket?.Message == Game18NConstString.ItemAddedToBazar); @@ -229,7 +229,7 @@ public async Task RegisterTooExpensiveAsync() Taxe = 0, MedalUsed = 0, Price = TestHelpers.Instance.WorldConfiguration.Value.MaxGoldAmount + 1 - }, _session).ConfigureAwait(false); + }, _session); var lastpacket = (ModaliPacket?)_session.LastPackets.FirstOrDefault(s => s is ModaliPacket); Assert.IsTrue(lastpacket?.Type == 1 && lastpacket?.Message == Game18NConstString.NotExceedMaxPrice && lastpacket?.ArgumentType == 4 && (long?)lastpacket?.Game18NArguments[0] == 1000000); } @@ -251,7 +251,7 @@ public async Task RegisterTooLongWhenNoMedalAsync() Taxe = 0, MedalUsed = 0, Price = 1 - }, _session).ConfigureAwait(false); + }, _session); Assert.IsNull(_session.LastPackets.FirstOrDefault()); } @@ -273,7 +273,7 @@ public async Task RegisterUnvalidTimeAsync() Taxe = 0, MedalUsed = 0, Price = 1 - }, _session).ConfigureAwait(false); + }, _session); Assert.IsNull(_session.LastPackets.FirstOrDefault()); } @@ -296,7 +296,7 @@ public async Task RegisterLimitExceededAsync() Taxe = 0, MedalUsed = 0, Price = 1 - }, _session!).ConfigureAwait(false); + }, _session!); var lastpacket = (ModaliPacket?)_session.LastPackets.FirstOrDefault(s => s is ModaliPacket); Assert.AreEqual(999, _session.Character.InventoryService.FirstOrDefault().Value.ItemInstance.Amount); Assert.IsTrue(lastpacket?.Type == 1 && lastpacket?.Message == Game18NConstString.ListedMaxItemsNumber); @@ -319,7 +319,7 @@ public async Task RegisterAllSlotAsync() Taxe = 0, MedalUsed = 0, Price = 1 - }, _session).ConfigureAwait(false); + }, _session); var lastpacket = (MsgiPacket?)_session.LastPackets.FirstOrDefault(s => s is MsgiPacket); Assert.AreEqual(0, _session.Character.InventoryService.Count); Assert.IsTrue(lastpacket?.Type == MessageType.Default && lastpacket?.Message == Game18NConstString.ItemAddedToBazar); @@ -342,7 +342,7 @@ public async Task RegisterLessThanInInventoryAsync() Taxe = 0, MedalUsed = 0, Price = 1 - }, _session).ConfigureAwait(false); + }, _session); Assert.IsNull(_session.LastPackets.FirstOrDefault()); } @@ -363,7 +363,7 @@ public async Task RegisterPartialSlotAsync() Taxe = 0, MedalUsed = 0, Price = 1 - }, _session).ConfigureAwait(false); + }, _session); var lastpacket = (MsgiPacket?)_session.LastPackets.FirstOrDefault(s => s is MsgiPacket); Assert.AreEqual(50, _session.Character.InventoryService.FirstOrDefault().Value.ItemInstance.Amount); Assert.IsTrue(lastpacket?.Type == MessageType.Default && lastpacket?.Message == Game18NConstString.ItemAddedToBazar); diff --git a/test/NosCore.PacketHandlers.Tests/Bazaar/CScalcPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Bazaar/CScalcPacketHandlerTests.cs index 8a937915a..1b19d73d4 100644 --- a/test/NosCore.PacketHandlers.Tests/Bazaar/CScalcPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Bazaar/CScalcPacketHandlerTests.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -57,9 +57,9 @@ public class CScalcPacketHandlerTest [TestInitialize] public async Task SetupAsync() { - await TestHelpers.ResetAsync().ConfigureAwait(false); + await TestHelpers.ResetAsync(); Broadcaster.Reset(); - _session = await TestHelpers.Instance.GenerateSessionAsync().ConfigureAwait(false); + _session = await TestHelpers.Instance.GenerateSessionAsync(); _bazaarHttpClient = new Mock(); _itemProvider = new Mock(); _itemInstanceDao = new Mock>(); @@ -100,7 +100,7 @@ public async Task RetrieveWhenInExchangeOrTradeAsync() Amount = 1, VNum = 1012 } - }).ConfigureAwait(false); + }); Assert.IsNull(_session.LastPackets.FirstOrDefault()); } @@ -113,7 +113,7 @@ public async Task RetrieveWhenNoItemAsync() Price = 50, Amount = 1, VNum = 1012 - }, _session!).ConfigureAwait(false); + }, _session!); var lastpacket = (RCScalcPacket?)_session!.LastPackets.FirstOrDefault(s => s is RCScalcPacket); Assert.AreEqual(0, lastpacket?.Price); } @@ -127,7 +127,7 @@ public async Task RetrieveWhenNotYourItemAsync() Price = 50, Amount = 1, VNum = 1012 - }, _session!).ConfigureAwait(false); + }, _session!); var lastpacket = (RCScalcPacket?)_session!.LastPackets.FirstOrDefault(s => s is RCScalcPacket); Assert.AreEqual(0, lastpacket?.Price); } @@ -153,7 +153,7 @@ public async Task RetrieveWhenNotEnoughPlaceAsync() Price = 50, Amount = 1, VNum = 1012 - }, _session).ConfigureAwait(false); + }, _session); var lastpacket = (RCScalcPacket?)_session.LastPackets.FirstOrDefault(s => s is RCScalcPacket); Assert.AreEqual(50, lastpacket?.Price); } @@ -168,7 +168,7 @@ public async Task RetrieveWhenMaxGoldAsync() Price = 50, Amount = 1, VNum = 1012 - }, _session).ConfigureAwait(false); + }, _session); var lastpacket = (MsgiPacket?)_session.LastPackets.FirstOrDefault(s => s is MsgiPacket); Assert.AreEqual(Game18NConstString.MaxGoldReached, lastpacket?.Message); } @@ -185,7 +185,7 @@ public async Task RetrieveAsync() Price = 50, Amount = 1, VNum = 1012 - }, _session!).ConfigureAwait(false); + }, _session!); var lastpacket = (RCScalcPacket?)_session!.LastPackets.FirstOrDefault(s => s is RCScalcPacket); Assert.AreEqual(50, lastpacket?.Total); } diff --git a/test/NosCore.PacketHandlers.Tests/Bazaar/CSkillPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Bazaar/CSkillPacketHandlerTests.cs index fc7bedefe..f4145d5c2 100644 --- a/test/NosCore.PacketHandlers.Tests/Bazaar/CSkillPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Bazaar/CSkillPacketHandlerTests.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -43,9 +43,9 @@ public class CSkillPacketHandlerTest [TestInitialize] public async Task SetupAsync() { - await TestHelpers.ResetAsync().ConfigureAwait(false); + await TestHelpers.ResetAsync(); Broadcaster.Reset(); - _session = await TestHelpers.Instance.GenerateSessionAsync().ConfigureAwait(false); + _session = await TestHelpers.Instance.GenerateSessionAsync(); _session.Character.StaticBonusList = new List(); _cskillPacketHandler = new CSkillPacketHandler(TestHelpers.Instance.Clock); } @@ -57,7 +57,7 @@ public async Task OpenWhenInShopAsync() await _session!.HandlePacketsAsync(new[] { new CSkillPacket() - }).ConfigureAwait(false); + }); Assert.IsNull(_session.LastPackets.FirstOrDefault()); } @@ -65,7 +65,7 @@ public async Task OpenWhenInShopAsync() [TestMethod] public async Task OpenWhenNoMedalAsync() { - await _cskillPacketHandler!.ExecuteAsync(new CSkillPacket(), _session!).ConfigureAwait(false); + await _cskillPacketHandler!.ExecuteAsync(new CSkillPacket(), _session!); var lastpacket = (InfoiPacket?)_session!.LastPackets.FirstOrDefault(s => s is InfoiPacket); Assert.IsTrue(lastpacket?.Message == Game18NConstString.NosMerchantMedaleAllowPlayerToUseNosbazarOnAllGeneralMaps); } @@ -77,7 +77,7 @@ public async Task OpenAsync() { StaticBonusType = StaticBonusType.BazaarMedalGold }); - await _cskillPacketHandler!.ExecuteAsync(new CSkillPacket(), _session).ConfigureAwait(false); + await _cskillPacketHandler!.ExecuteAsync(new CSkillPacket(), _session); } } } \ No newline at end of file diff --git a/test/NosCore.PacketHandlers.Tests/CharacterScreen/CharNewJobPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/CharacterScreen/CharNewJobPacketHandlerTests.cs index bb1c3df8e..be64c3b02 100644 --- a/test/NosCore.PacketHandlers.Tests/CharacterScreen/CharNewJobPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/CharacterScreen/CharNewJobPacketHandlerTests.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -41,10 +41,10 @@ public class CharNewJobPacketHandlerTests [TestInitialize] public async Task SetupAsync() { - await TestHelpers.ResetAsync().ConfigureAwait(false); - _session = await TestHelpers.Instance.GenerateSessionAsync().ConfigureAwait(false); + await TestHelpers.ResetAsync(); + _session = await TestHelpers.Instance.GenerateSessionAsync(); _chara = _session.Character; - await _session.SetCharacterAsync(null).ConfigureAwait(false); + await _session.SetCharacterAsync(null); TypeAdapterConfig.NewConfig().ConstructUsing(src => _chara); _charNewJobPacketHandler = new CharNewJobPacketHandler(TestHelpers.Instance.CharacterDao, TestHelpers.Instance.WorldConfiguration); } @@ -56,8 +56,8 @@ public async Task CreateMartialArtistWhenNoLevel80_Does_Not_Create_CharacterAsyn await _charNewJobPacketHandler!.ExecuteAsync(new CharNewJobPacket { Name = name - }, _session!).ConfigureAwait(false); - Assert.IsNull(await TestHelpers.Instance.CharacterDao.FirstOrDefaultAsync(s => s.Name == name).ConfigureAwait(false)); + }, _session!); + Assert.IsNull(await TestHelpers.Instance.CharacterDao.FirstOrDefaultAsync(s => s.Name == name)); } [TestMethod] @@ -66,12 +66,12 @@ public async Task CreateMartialArtist_WorksAsync() const string name = "TestCharacter"; _chara!.Level = 80; CharacterDto character = _chara; - await TestHelpers.Instance.CharacterDao.TryInsertOrUpdateAsync(character).ConfigureAwait(false); + await TestHelpers.Instance.CharacterDao.TryInsertOrUpdateAsync(character); await _charNewJobPacketHandler!.ExecuteAsync(new CharNewJobPacket { Name = name - }, _session!).ConfigureAwait(false); - Assert.IsNotNull(await TestHelpers.Instance.CharacterDao.FirstOrDefaultAsync(s => s.Name == name).ConfigureAwait(false)); + }, _session!); + Assert.IsNotNull(await TestHelpers.Instance.CharacterDao.FirstOrDefaultAsync(s => s.Name == name)); } [TestMethod] @@ -81,12 +81,12 @@ public async Task CreateMartialArtistWhenAlreadyOne_Does_Not_Create_CharacterAsy _chara!.Class = CharacterClassType.MartialArtist; CharacterDto character = _chara; _chara.Level = 80; - await TestHelpers.Instance.CharacterDao.TryInsertOrUpdateAsync(character).ConfigureAwait(false); + await TestHelpers.Instance.CharacterDao.TryInsertOrUpdateAsync(character); await _charNewJobPacketHandler!.ExecuteAsync(new CharNewJobPacket { Name = name - }, _session!).ConfigureAwait(false); - Assert.IsNull(await TestHelpers.Instance.CharacterDao.FirstOrDefaultAsync(s => s.Name == name).ConfigureAwait(false)); + }, _session!); + Assert.IsNull(await TestHelpers.Instance.CharacterDao.FirstOrDefaultAsync(s => s.Name == name)); } } } \ No newline at end of file diff --git a/test/NosCore.PacketHandlers.Tests/CharacterScreen/CharNewPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/CharacterScreen/CharNewPacketHandlerTests.cs index e4e4c2d59..71dc7413a 100644 --- a/test/NosCore.PacketHandlers.Tests/CharacterScreen/CharNewPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/CharacterScreen/CharNewPacketHandlerTests.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -61,22 +61,22 @@ public class CharNewPacketHandlerTests [TestInitialize] public async Task SetupAsync() { - await TestHelpers.ResetAsync().ConfigureAwait(false); + await TestHelpers.ResetAsync(); _charNewPacketHandler = new CharNewPacketHandler(TestHelpers.Instance.CharacterDao, TestHelpers.Instance.MinilandDao, new Mock().Object, new Mock>().Object, new Mock>().Object, new Mock>().Object, new HpService(), new MpService(), TestHelpers.Instance.WorldConfiguration, new Mock>().Object); - _session = await TestHelpers.Instance.GenerateSessionAsync(new List { _charNewPacketHandler }).ConfigureAwait(false); + _session = await TestHelpers.Instance.GenerateSessionAsync(new List { _charNewPacketHandler }); _chara = _session.Character; _mapChangeService = new Mock(); TypeAdapterConfig.NewConfig().ConstructUsing(src => _chara); - await _session.SetCharacterAsync(null).ConfigureAwait(false); + await _session.SetCharacterAsync(null); } [TestMethod] public async Task CreateCharacterWhenInGame_Does_Not_Create_CharacterAsync() { var idServer = new IdService(1); - await _session!.SetCharacterAsync(_chara).ConfigureAwait(false); + await _session!.SetCharacterAsync(_chara); _session.Character.MapInstance = new MapInstance(new Map(), new Guid(), true, MapInstanceType.BaseMapInstance, new MapItemGenerationService(new EventLoaderService, IGetMapItemEventHandler>(new List>>()), idServer), @@ -85,8 +85,8 @@ public async Task CreateCharacterWhenInGame_Does_Not_Create_CharacterAsync() await _session!.HandlePacketsAsync(new[] {new CharNewPacket { Name = name - }}).ConfigureAwait(false); - Assert.IsNull(await TestHelpers.Instance.CharacterDao.FirstOrDefaultAsync(s => s.Name == name).ConfigureAwait(false)); + }}); + Assert.IsNull(await TestHelpers.Instance.CharacterDao.FirstOrDefaultAsync(s => s.Name == name)); } [TestMethod] @@ -96,8 +96,8 @@ public async Task CreateCharacterAsync() await _charNewPacketHandler!.ExecuteAsync(new CharNewPacket { Name = name - }, _session!).ConfigureAwait(false); - Assert.IsNotNull(await TestHelpers.Instance.CharacterDao.FirstOrDefaultAsync(s => s.Name == name).ConfigureAwait(false)); + }, _session!); + Assert.IsNotNull(await TestHelpers.Instance.CharacterDao.FirstOrDefaultAsync(s => s.Name == name)); } @@ -108,8 +108,8 @@ public async Task InvalidName_Does_Not_Create_CharacterAsync() await _charNewPacketHandler!.ExecuteAsync(new CharNewPacket { Name = name - }, _session!).ConfigureAwait(false); - Assert.IsNull(await TestHelpers.Instance.CharacterDao.FirstOrDefaultAsync(s => s.Name == name).ConfigureAwait(false)); + }, _session!); + Assert.IsNull(await TestHelpers.Instance.CharacterDao.FirstOrDefaultAsync(s => s.Name == name)); } [TestMethod] @@ -119,7 +119,7 @@ public async Task ExistingName_Does_Not_Create_CharacterAsync() await _charNewPacketHandler!.ExecuteAsync(new CharNewPacket { Name = name - }, _session!).ConfigureAwait(false); + }, _session!); Assert.IsFalse(TestHelpers.Instance.CharacterDao.Where(s => s.Name == name)!.Skip(1).Any()); } @@ -131,7 +131,7 @@ public async Task NotEmptySlot_Does_Not_Create_CharacterAsync() { Name = name, Slot = 1 - }, _session!).ConfigureAwait(false); + }, _session!); Assert.IsFalse(TestHelpers.Instance.CharacterDao.Where(s => s.Slot == 1)!.Skip(1).Any()); } } diff --git a/test/NosCore.PacketHandlers.Tests/CharacterScreen/CharRenPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/CharacterScreen/CharRenPacketHandlerTests.cs index 3179c9ad3..e95938609 100644 --- a/test/NosCore.PacketHandlers.Tests/CharacterScreen/CharRenPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/CharacterScreen/CharRenPacketHandlerTests.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -53,17 +53,17 @@ public class CharRenPacketHandlerTests [TestInitialize] public async Task SetupAsync() { - await TestHelpers.ResetAsync().ConfigureAwait(false); + await TestHelpers.ResetAsync(); _mapChangeService = new Mock(); _charRenPacketHandler = new CharRenPacketHandler(TestHelpers.Instance.CharacterDao, TestHelpers.Instance.WorldConfiguration); _session = await TestHelpers.Instance.GenerateSessionAsync(new List{ _charRenPacketHandler - }).ConfigureAwait(false); + }); _chara = _session.Character; _chara.ShouldRename = true; await TestHelpers.Instance.CharacterDao.TryInsertOrUpdateAsync(_session.Character); - await _session.SetCharacterAsync(null).ConfigureAwait(false); + await _session.SetCharacterAsync(null); } @@ -71,7 +71,7 @@ public async Task SetupAsync() public async Task RenameCharacterWhenInGame_Does_Not_Rename_CharacterAsync() { var idServer = new IdService(1); - await _session!.SetCharacterAsync(_chara).ConfigureAwait(false); + await _session!.SetCharacterAsync(_chara); _session.Character.MapInstance = new MapInstance(new Map(), new Guid(), true, MapInstanceType.BaseMapInstance, new MapItemGenerationService(new EventLoaderService, IGetMapItemEventHandler>(new List>>()), idServer), @@ -81,8 +81,8 @@ public async Task RenameCharacterWhenInGame_Does_Not_Rename_CharacterAsync() { Name = name, Slot = 1 - }}).ConfigureAwait(false); - Assert.IsNull(await TestHelpers.Instance.CharacterDao.FirstOrDefaultAsync(s => s.Name == name).ConfigureAwait(false)); + }}); + Assert.IsNull(await TestHelpers.Instance.CharacterDao.FirstOrDefaultAsync(s => s.Name == name)); } [TestMethod] @@ -93,9 +93,9 @@ public async Task RenameCharacterAsync() { Name = name, Slot = 1 - }, _session!).ConfigureAwait(false); + }, _session!); var character = await TestHelpers.Instance.CharacterDao.FirstOrDefaultAsync(s => s.Name == name) - .ConfigureAwait(false); + ; Assert.IsNotNull(character); Assert.IsFalse(character.ShouldRename); } @@ -108,10 +108,10 @@ public async Task RenameUnflaggedCharacterAsync() { Name = name, Slot = 1 - }, _session!).ConfigureAwait(false); + }, _session!); _chara!.ShouldRename = false; await TestHelpers.Instance.CharacterDao.TryInsertOrUpdateAsync(_chara); - Assert.IsNull(await TestHelpers.Instance.CharacterDao.FirstOrDefaultAsync(s => s.Name == name).ConfigureAwait(false)); + Assert.IsNull(await TestHelpers.Instance.CharacterDao.FirstOrDefaultAsync(s => s.Name == name)); } [TestMethod] @@ -122,8 +122,8 @@ public async Task RenameNotFoundCharacterAsync() { Name = name, Slot = 2 - }, _session!).ConfigureAwait(false); - Assert.IsNull(await TestHelpers.Instance.CharacterDao.FirstOrDefaultAsync(s => s.Name == name).ConfigureAwait(false)); + }, _session!); + Assert.IsNull(await TestHelpers.Instance.CharacterDao.FirstOrDefaultAsync(s => s.Name == name)); } } } \ No newline at end of file diff --git a/test/NosCore.PacketHandlers.Tests/CharacterScreen/CharacterDeletePacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/CharacterScreen/CharacterDeletePacketHandlerTests.cs index a69dac664..8136eb19c 100644 --- a/test/NosCore.PacketHandlers.Tests/CharacterScreen/CharacterDeletePacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/CharacterScreen/CharacterDeletePacketHandlerTests.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -39,28 +39,28 @@ public class CharacterDeletePacketHandlerTests [TestInitialize] public async Task SetupAsync() { - await TestHelpers.ResetAsync().ConfigureAwait(false); + await TestHelpers.ResetAsync(); _characterDeletePacketHandler = new CharacterDeletePacketHandler(TestHelpers.Instance.CharacterDao, TestHelpers.Instance.AccountDao, new Sha512Hasher(), TestHelpers.Instance.WorldConfiguration); _session = await TestHelpers.Instance.GenerateSessionAsync(new List{ _characterDeletePacketHandler - }).ConfigureAwait(false); + }); } [TestMethod] public async Task DeleteCharacter_Invalid_PasswordAsync() { - await _session!.SetCharacterAsync(null).ConfigureAwait(false); + await _session!.SetCharacterAsync(null); await _characterDeletePacketHandler!.ExecuteAsync(new CharacterDeletePacket { Slot = 1, Password = "testpassword" - }, _session).ConfigureAwait(false); + }, _session); Assert.IsNotNull( await TestHelpers.Instance.CharacterDao .FirstOrDefaultAsync(s => - (s.AccountId == _session.Account.AccountId) && (s.State == CharacterState.Active)).ConfigureAwait(false)); + (s.AccountId == _session.Account.AccountId) && (s.State == CharacterState.Active))); } [TestMethod] @@ -70,26 +70,26 @@ public async Task DeleteCharacterWhenInGame_Does_Not_Delete_CharacterAsync() { Slot = 1, Password = "test" - }}).ConfigureAwait(false); + }}); Assert.IsNotNull( await TestHelpers.Instance.CharacterDao .FirstOrDefaultAsync(s => - (s.AccountId == _session!.Account.AccountId) && (s.State == CharacterState.Active)).ConfigureAwait(false)); + (s.AccountId == _session!.Account.AccountId) && (s.State == CharacterState.Active))); } [TestMethod] public async Task DeleteCharacterAsync() { - await _session!.SetCharacterAsync(null).ConfigureAwait(false); + await _session!.SetCharacterAsync(null); await _characterDeletePacketHandler!.ExecuteAsync(new CharacterDeletePacket { Slot = 1, Password = "test" - }, _session).ConfigureAwait(false); + }, _session); Assert.IsNull( await TestHelpers.Instance.CharacterDao .FirstOrDefaultAsync(s => - (s.AccountId == _session.Account.AccountId) && (s.State == CharacterState.Active)).ConfigureAwait(false)); + (s.AccountId == _session.Account.AccountId) && (s.State == CharacterState.Active))); } } } \ No newline at end of file diff --git a/test/NosCore.PacketHandlers.Tests/CharacterScreen/DacPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/CharacterScreen/DacPacketHandlerTests.cs index 30095b428..125d3383d 100644 --- a/test/NosCore.PacketHandlers.Tests/CharacterScreen/DacPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/CharacterScreen/DacPacketHandlerTests.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -50,12 +50,12 @@ public class DacPacketHandlerTests [TestInitialize] public async Task SetupAsync() { - await TestHelpers.ResetAsync().ConfigureAwait(false); - _session = await TestHelpers.Instance.GenerateSessionAsync().ConfigureAwait(false); + await TestHelpers.ResetAsync(); + _session = await TestHelpers.Instance.GenerateSessionAsync(); _accountName = _session.Account.Name; _session.Account = null!; await TestHelpers.Instance.CharacterDao.TryInsertOrUpdateAsync(_session.Character); - await _session.SetCharacterAsync(null).ConfigureAwait(false); + await _session.SetCharacterAsync(null); _authHttpClient = new Mock(); _pubSubHub = TestHelpers.Instance.PubSubHub; _channelHub = TestHelpers.Instance.ChannelHub; diff --git a/test/NosCore.PacketHandlers.Tests/Friend/BlDelPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Friend/BlDelPacketHandlerTests.cs index 8ea725840..d4fed111e 100644 --- a/test/NosCore.PacketHandlers.Tests/Friend/BlDelPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Friend/BlDelPacketHandlerTests.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -61,8 +61,8 @@ public async Task SetupAsync() { _characterRelationDao = TestHelpers.Instance.CharacterRelationDao; Broadcaster.Reset(); - await TestHelpers.ResetAsync().ConfigureAwait(false); - _session = await TestHelpers.Instance.GenerateSessionAsync().ConfigureAwait(false); + await TestHelpers.ResetAsync(); + _session = await TestHelpers.Instance.GenerateSessionAsync(); _connectedAccountHttpClient = TestHelpers.Instance.PubSubHub; _channelHub = new Mock(); _connectedAccountHttpClient.Setup(s => s.GetSubscribersAsync()) @@ -104,13 +104,13 @@ public async Task Test_Delete_Friend_When_DisconnectedAsync() CharacterId = _session.Character.CharacterId, RelationType = CharacterRelationType.Blocked } - }).ConfigureAwait(false); + }); var blDelPacket = new BlDelPacket { CharacterId = 2 }; - await _blDelPacketHandler!.ExecuteAsync(blDelPacket, _session).ConfigureAwait(false); + await _blDelPacketHandler!.ExecuteAsync(blDelPacket, _session); Assert.IsTrue(!_characterRelationDao.LoadAll().Any()); } @@ -118,7 +118,7 @@ public async Task Test_Delete_Friend_When_DisconnectedAsync() [TestMethod] public async Task Test_Delete_FriendAsync() { - var targetSession = await TestHelpers.Instance.GenerateSessionAsync().ConfigureAwait(false); + var targetSession = await TestHelpers.Instance.GenerateSessionAsync(); Guid.NewGuid(); var targetGuid = Guid.NewGuid(); var list = new List @@ -137,13 +137,13 @@ public async Task Test_Delete_FriendAsync() CharacterId = _session.Character.CharacterId, RelationType = CharacterRelationType.Blocked } - }).ConfigureAwait(false); + }); var blDelPacket = new BlDelPacket { CharacterId = targetSession.Character.CharacterId }; - await _blDelPacketHandler!.ExecuteAsync(blDelPacket, _session).ConfigureAwait(false); + await _blDelPacketHandler!.ExecuteAsync(blDelPacket, _session); Assert.IsTrue(!_characterRelationDao.LoadAll().Any()); } @@ -151,7 +151,7 @@ public async Task Test_Delete_FriendAsync() [TestMethod] public async Task Test_Delete_Friend_No_FriendAsync() { - var targetSession = await TestHelpers.Instance.GenerateSessionAsync().ConfigureAwait(false); + var targetSession = await TestHelpers.Instance.GenerateSessionAsync(); var guid = Guid.NewGuid(); var targetGuid = Guid.NewGuid(); var list = new List @@ -167,7 +167,7 @@ public async Task Test_Delete_Friend_No_FriendAsync() CharacterId = targetSession.Character.CharacterId }; - await _blDelPacketHandler!.ExecuteAsync(blDelPacket, _session).ConfigureAwait(false); + await _blDelPacketHandler!.ExecuteAsync(blDelPacket, _session); var lastpacket = (InfoPacket?)_session.LastPackets.FirstOrDefault(s => s is InfoPacket); Assert.AreEqual(TestHelpers.Instance.GameLanguageLocalizer[LanguageKey.NOT_IN_BLACKLIST, _session.Account.Language], lastpacket!.Message); diff --git a/test/NosCore.PacketHandlers.Tests/Friend/BlInsPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Friend/BlInsPacketHandlerTests.cs index 304156ebd..4c2201e6b 100644 --- a/test/NosCore.PacketHandlers.Tests/Friend/BlInsPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Friend/BlInsPacketHandlerTests.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -48,8 +48,8 @@ public class BlInsPacketHandlerTests public async Task SetupAsync() { Broadcaster.Reset(); - await TestHelpers.ResetAsync().ConfigureAwait(false); - _session = await TestHelpers.Instance.GenerateSessionAsync().ConfigureAwait(false); + await TestHelpers.ResetAsync(); + _session = await TestHelpers.Instance.GenerateSessionAsync(); TestHelpers.Instance.ChannelHub.Setup(s => s.GetCommunicationChannels()) .ReturnsAsync(new List(){ @@ -79,17 +79,17 @@ public async Task Test_Blacklist_When_DisconnectedAsync() CharacterId = 2 }; - await _blInsPacketHandler!.ExecuteAsync(blinsPacket, _session!).ConfigureAwait(false); + await _blInsPacketHandler!.ExecuteAsync(blinsPacket, _session!); Assert.IsNull(await TestHelpers.Instance.CharacterRelationDao.FirstOrDefaultAsync(s => (_session!.Character.CharacterId == s.CharacterId) && - (s.RelationType == CharacterRelationType.Blocked)).ConfigureAwait(false)); + (s.RelationType == CharacterRelationType.Blocked))); } [TestMethod] public async Task Test_Blacklist_CharacterAsync() { - var targetSession = await TestHelpers.Instance.GenerateSessionAsync().ConfigureAwait(false); + var targetSession = await TestHelpers.Instance.GenerateSessionAsync(); TestHelpers.Instance.PubSubHub.Setup(s => s.GetSubscribersAsync()) .ReturnsAsync(new List(){ new Subscriber @@ -111,7 +111,7 @@ public async Task Test_Blacklist_CharacterAsync() CharacterId = targetSession.Character.CharacterId }; - await _blInsPacketHandler!.ExecuteAsync(blinsPacket, _session).ConfigureAwait(false); + await _blInsPacketHandler!.ExecuteAsync(blinsPacket, _session); Assert.IsNotNull( TestHelpers.Instance.CharacterRelationDao.FirstOrDefaultAsync(s => (_session.Character.CharacterId == s.CharacterId) && (targetSession.Character.CharacterId == s.RelatedCharacterId) && diff --git a/test/NosCore.PacketHandlers.Tests/Friend/BlPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Friend/BlPacketHandlerTests.cs index f902f07d6..f183dfcd6 100644 --- a/test/NosCore.PacketHandlers.Tests/Friend/BlPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Friend/BlPacketHandlerTests.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -52,8 +52,8 @@ public async Task SetupAsync() { _characterRelationDao = TestHelpers.Instance.CharacterRelationDao; Broadcaster.Reset(); - await TestHelpers.ResetAsync().ConfigureAwait(false); - _session = await TestHelpers.Instance.GenerateSessionAsync().ConfigureAwait(false); + await TestHelpers.ResetAsync(); + _session = await TestHelpers.Instance.GenerateSessionAsync(); TestHelpers.Instance.ChannelHub.Setup(s => s.GetCommunicationChannels()) .ReturnsAsync(new List(){ @@ -79,7 +79,7 @@ public async Task SetupAsync() [TestMethod] public async Task Test_Distant_BlacklistAsync() { - var targetSession = await TestHelpers.Instance.GenerateSessionAsync().ConfigureAwait(false); + var targetSession = await TestHelpers.Instance.GenerateSessionAsync(); var blPacket = new BlPacket { CharacterName = targetSession.Character.Name @@ -100,11 +100,11 @@ public async Task Test_Distant_BlacklistAsync() _characterRelationDao!, TestHelpers.Instance.CharacterDao); TestHelpers.Instance.BlacklistHttpClient.Setup(s => s.AddBlacklistAsync(It.IsAny())) .Returns(blacklist.BlacklistPlayerAsync( _session!.Character.CharacterId, targetSession.Character.VisualId)); - await _blPacketHandler!.ExecuteAsync(blPacket, _session).ConfigureAwait(false); + await _blPacketHandler!.ExecuteAsync(blPacket, _session); Assert.IsTrue(await _characterRelationDao!.FirstOrDefaultAsync(s => (s.CharacterId == _session.Character.CharacterId) && (s.RelatedCharacterId == targetSession.Character.CharacterId) - && (s.RelationType == CharacterRelationType.Blocked)).ConfigureAwait(false) != null); + && (s.RelationType == CharacterRelationType.Blocked)) != null); } } } \ No newline at end of file diff --git a/test/NosCore.PacketHandlers.Tests/Friend/FinsPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Friend/FinsPacketHandlerTests.cs index f33f2d38b..f293100b2 100644 --- a/test/NosCore.PacketHandlers.Tests/Friend/FinsPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Friend/FinsPacketHandlerTests.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -66,9 +66,9 @@ public async Task SetupAsync() TypeAdapterConfig.NewConfig() .ConstructUsing(src => new MapNpc(null, Logger, TestHelpers.Instance.DistanceCalculator, TestHelpers.Instance.Clock)); Broadcaster.Reset(); - await TestHelpers.ResetAsync().ConfigureAwait(false); - _session = await TestHelpers.Instance.GenerateSessionAsync().ConfigureAwait(false); - _targetSession = await TestHelpers.Instance.GenerateSessionAsync().ConfigureAwait(false); + await TestHelpers.ResetAsync(); + _session = await TestHelpers.Instance.GenerateSessionAsync(); + _targetSession = await TestHelpers.Instance.GenerateSessionAsync(); _characterRelationDao = TestHelpers.Instance.CharacterRelationDao; _channelHub = new Mock(); _channelHub.Setup(s => s.GetCommunicationChannels()) @@ -112,7 +112,7 @@ public async Task Test_Add_FriendAsync() _friendRequestHolder, _connectedAccountHttpClient.Object, _channelHub!.Object, TestHelpers.Instance.LogLanguageLocalizer); _friendHttpClient.Setup(s => s.AddFriendAsync(It.IsAny())) .Returns(friend.AddFriendAsync(_session.Character.CharacterId, finsPacket.CharacterId, finsPacket.Type)); - await _finsPacketHandler!.ExecuteAsync(finsPacket, _session).ConfigureAwait(false); + await _finsPacketHandler!.ExecuteAsync(finsPacket, _session); Assert.IsTrue(_characterRelationDao!.LoadAll().Count() == 2); } @@ -128,7 +128,7 @@ public async Task Test_Add_Friend_When_DisconnectedAsync() _friendRequestHolder!, _connectedAccountHttpClient.Object, _channelHub!.Object, TestHelpers.Instance.LogLanguageLocalizer); _friendHttpClient.Setup(s => s.AddFriendAsync(It.IsAny())) .Returns(friend.AddFriendAsync(_session!.Character.CharacterId, finsPacket.CharacterId, finsPacket.Type)); - await _finsPacketHandler!.ExecuteAsync(finsPacket, _session).ConfigureAwait(false); + await _finsPacketHandler!.ExecuteAsync(finsPacket, _session); Assert.IsFalse(_characterRelationDao!.LoadAll().Any()); } @@ -146,7 +146,7 @@ public async Task Test_Add_Not_Requested_FriendAsync() _friendHttpClient.Setup(s => s.AddFriendAsync(It.IsAny())) .Returns(friend.AddFriendAsync(_session!.Character.CharacterId, finsPacket.CharacterId, finsPacket.Type)); - await _finsPacketHandler!.ExecuteAsync(finsPacket, _session).ConfigureAwait(false); + await _finsPacketHandler!.ExecuteAsync(finsPacket, _session); Assert.IsFalse(_characterRelationDao!.LoadAll().Any()); } } diff --git a/test/NosCore.PacketHandlers.Tests/Friend/FlPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Friend/FlPacketHandlerTests.cs index db0d6f789..ba40623ef 100644 --- a/test/NosCore.PacketHandlers.Tests/Friend/FlPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Friend/FlPacketHandlerTests.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -51,7 +51,7 @@ public class FlPacketHandlerTests public async Task SetupAsync() { _characterRelationDao = TestHelpers.Instance.CharacterRelationDao; - await TestHelpers.ResetAsync().ConfigureAwait(false); + await TestHelpers.ResetAsync(); Broadcaster.Reset(); TestHelpers.Instance.ChannelHub.Setup(s => s.GetCommunicationChannels()) .ReturnsAsync(new List(){ @@ -62,14 +62,14 @@ public async Task SetupAsync() } }); - _session = await TestHelpers.Instance.GenerateSessionAsync().ConfigureAwait(false); + _session = await TestHelpers.Instance.GenerateSessionAsync(); _flPacketHandler = new FlCommandPacketHandler(new NosCore.GameObject.Services.BroadcastService.SessionRegistry()); } [TestMethod] public async Task Test_Add_Distant_FriendAsync() { - var targetSession = await TestHelpers.Instance.GenerateSessionAsync().ConfigureAwait(false); + var targetSession = await TestHelpers.Instance.GenerateSessionAsync(); var friendRequestHolder = new FriendRequestRegistry(); friendRequestHolder.RegisterRequest(Guid.NewGuid(), targetSession.Character.CharacterId, _session!.Character.CharacterId); @@ -97,11 +97,11 @@ public async Task Test_Add_Distant_FriendAsync() FinsPacketType.Accepted )); - await _flPacketHandler!.ExecuteAsync(flPacket, _session).ConfigureAwait(false); + await _flPacketHandler!.ExecuteAsync(flPacket, _session); Assert.IsTrue(await _characterRelationDao!.FirstOrDefaultAsync(s => (s.CharacterId == _session.Character.CharacterId) && (s.RelatedCharacterId == targetSession.Character.CharacterId) - && (s.RelationType == CharacterRelationType.Friend)).ConfigureAwait(false) != null); + && (s.RelationType == CharacterRelationType.Friend)) != null); } } } \ No newline at end of file diff --git a/test/NosCore.PacketHandlers.Tests/Friend/fDelPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Friend/fDelPacketHandlerTests.cs index 12bccc4bf..b32093ea0 100644 --- a/test/NosCore.PacketHandlers.Tests/Friend/fDelPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Friend/fDelPacketHandlerTests.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -63,8 +63,8 @@ public async Task SetupAsync() { _characterRelationDao = TestHelpers.Instance.CharacterRelationDao; Broadcaster.Reset(); - await TestHelpers.ResetAsync().ConfigureAwait(false); - _session = await TestHelpers.Instance.GenerateSessionAsync().ConfigureAwait(false); + await TestHelpers.ResetAsync(); + _session = await TestHelpers.Instance.GenerateSessionAsync(); _channelHttpClient = TestHelpers.Instance.ChannelHttpClient; _connectedAccountHttpClient = TestHelpers.Instance.PubSubHub; _channelHub = new Mock(); @@ -116,13 +116,13 @@ public async Task Test_Delete_Friend_When_DisconnectedAsync() CharacterId = _session.Character.CharacterId, RelationType = CharacterRelationType.Friend } - }).ConfigureAwait(false); + }); var fdelPacket = new FdelPacket { CharacterId = 2 }; - await _fDelPacketHandler!.ExecuteAsync(fdelPacket, _session).ConfigureAwait(false); + await _fDelPacketHandler!.ExecuteAsync(fdelPacket, _session); Assert.IsTrue(!(_characterRelationDao!.LoadAll()).Any()); } @@ -130,7 +130,7 @@ public async Task Test_Delete_Friend_When_DisconnectedAsync() [TestMethod] public async Task Test_Delete_FriendAsync() { - var targetSession = await TestHelpers.Instance.GenerateSessionAsync().ConfigureAwait(false); + var targetSession = await TestHelpers.Instance.GenerateSessionAsync(); var guid = Guid.NewGuid(); var targetGuid = Guid.NewGuid(); var list = new List @@ -156,13 +156,13 @@ public async Task Test_Delete_FriendAsync() CharacterId = _session.Character.CharacterId, RelationType = CharacterRelationType.Friend } - }).ConfigureAwait(false); + }); var fdelPacket = new FdelPacket { CharacterId = targetSession.Character.CharacterId }; - await _fDelPacketHandler!.ExecuteAsync(fdelPacket, _session).ConfigureAwait(false); + await _fDelPacketHandler!.ExecuteAsync(fdelPacket, _session); Assert.IsTrue(!_characterRelationDao.LoadAll().Any()); } @@ -170,7 +170,7 @@ public async Task Test_Delete_FriendAsync() [TestMethod] public async Task Test_Delete_Friend_No_FriendAsync() { - var targetSession = await TestHelpers.Instance.GenerateSessionAsync().ConfigureAwait(false); + var targetSession = await TestHelpers.Instance.GenerateSessionAsync(); var guid = Guid.NewGuid(); var targetGuid = Guid.NewGuid(); var list = new List @@ -186,7 +186,7 @@ public async Task Test_Delete_Friend_No_FriendAsync() CharacterId = targetSession.Character.CharacterId }; - await _fDelPacketHandler!.ExecuteAsync(fdelPacket, _session).ConfigureAwait(false); + await _fDelPacketHandler!.ExecuteAsync(fdelPacket, _session); var lastpacket = (InfoPacket?)_session.LastPackets.FirstOrDefault(s => s is InfoPacket); Assert.AreEqual(TestHelpers.Instance.GameLanguageLocalizer[LanguageKey.NOT_IN_FRIENDLIST, _session.Account.Language], lastpacket?.Message); diff --git a/test/NosCore.PacketHandlers.Tests/Game/PulsePacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Game/PulsePacketHandlerTests.cs index 519885a87..f0ca878d3 100644 --- a/test/NosCore.PacketHandlers.Tests/Game/PulsePacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Game/PulsePacketHandlerTests.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -40,8 +40,8 @@ public async Task SetupAsync() { _pulsePacketHandler = new PulsePacketHandler(); Broadcaster.Reset(); - await TestHelpers.ResetAsync().ConfigureAwait(false); - _session = await TestHelpers.Instance.GenerateSessionAsync().ConfigureAwait(false); + await TestHelpers.ResetAsync(); + _session = await TestHelpers.Instance.GenerateSessionAsync(); } [TestMethod] @@ -58,7 +58,7 @@ public async Task Test_Pulse_PacketAsync() { Tick = i }; - await _pulsePacketHandler!.ExecuteAsync(pulsePacket, _session!).ConfigureAwait(false); + await _pulsePacketHandler!.ExecuteAsync(pulsePacket, _session!); } Assert.IsTrue(_session?.LastPulse == pulsePacket.Tick); diff --git a/test/NosCore.PacketHandlers.Tests/Game/QsetPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Game/QsetPacketHandlerTests.cs index c489b8270..a8a85a6d2 100644 --- a/test/NosCore.PacketHandlers.Tests/Game/QsetPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Game/QsetPacketHandlerTests.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -38,8 +38,8 @@ public class QsetPacketHandlerTests [TestInitialize] public async Task SetupAsync() { - await TestHelpers.ResetAsync().ConfigureAwait(false); - _session = await TestHelpers.Instance.GenerateSessionAsync().ConfigureAwait(false); + await TestHelpers.ResetAsync(); + _session = await TestHelpers.Instance.GenerateSessionAsync(); _qsetPacketHandler = new QSetPacketHandler(); } @@ -53,7 +53,7 @@ public async Task Test_Add_QuicklistAsync() OriginQuickListSlot = 2, FirstData = 3, SecondData = 4 - }, _session!).ConfigureAwait(false); + }, _session!); var lastpacket = (QsetClientPacket?)_session!.LastPackets.FirstOrDefault(s => s is QsetClientPacket); Assert.AreEqual(QSetType.Set, lastpacket?.Data?.Type); Assert.AreEqual(1, lastpacket?.OriginQuickList ?? 0); @@ -74,7 +74,7 @@ public async Task Test_Delete_FromQuicklistAsync() OriginQuickListSlot = 2, FirstData = 3, SecondData = 4 - }, _session!).ConfigureAwait(false); + }, _session!); var lastpacket = (QsetClientPacket?)_session!.LastPackets.FirstOrDefault(s => s is QsetClientPacket); Assert.AreEqual(QSetType.Reset, lastpacket?.Data?.Type ?? 0); Assert.AreEqual(1, lastpacket?.OriginQuickList ?? 0); @@ -95,7 +95,7 @@ public async Task Test_Move_QuicklistAsync() OriginQuickListSlot = 2, FirstData = 3, SecondData = 4 - }, _session!).ConfigureAwait(false); + }, _session!); await _qsetPacketHandler.ExecuteAsync(new QsetPacket { @@ -104,7 +104,7 @@ await _qsetPacketHandler.ExecuteAsync(new QsetPacket OriginQuickListSlot = 3, FirstData = 4, SecondData = 5 - }, _session!).ConfigureAwait(false); + }, _session!); _session!.LastPackets.Clear(); await _qsetPacketHandler.ExecuteAsync(new QsetPacket @@ -114,7 +114,7 @@ await _qsetPacketHandler.ExecuteAsync(new QsetPacket OriginQuickListSlot = 3, FirstData = 1, SecondData = 2 - }, _session).ConfigureAwait(false); + }, _session); var firstpacket = (QsetClientPacket?)_session.LastPackets.FirstOrDefault(s => s is QsetClientPacket); var lastpacket = (QsetClientPacket?)_session.LastPackets.Skip(1).FirstOrDefault(s => s is QsetClientPacket); Assert.AreEqual(QSetType.Set, lastpacket?.Data?.Type); @@ -143,7 +143,7 @@ public async Task Test_Move_ToEmptyAsync() OriginQuickListSlot = 2, FirstData = 3, SecondData = 4 - }, _session!).ConfigureAwait(false); + }, _session!); _session!.LastPackets.Clear(); await _qsetPacketHandler.ExecuteAsync(new QsetPacket { @@ -152,7 +152,7 @@ await _qsetPacketHandler.ExecuteAsync(new QsetPacket OriginQuickListSlot = 3, FirstData = 1, SecondData = 2 - }, _session).ConfigureAwait(false); + }, _session); Assert.AreEqual(1, _session.Character.QuicklistEntries.Count); diff --git a/test/NosCore.PacketHandlers.Tests/Group/PJoinPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Group/PJoinPacketHandlerTests.cs index 15d1a0747..694a380d1 100644 --- a/test/NosCore.PacketHandlers.Tests/Group/PJoinPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Group/PJoinPacketHandlerTests.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -52,7 +52,7 @@ public async Task SetupAsync() var idServer = new IdService(1); for (byte i = 0; i < (byte)(GroupType.Group + 1); i++) { - var session = await TestHelpers.Instance.GenerateSessionAsync().ConfigureAwait(false); + var session = await TestHelpers.Instance.GenerateSessionAsync(); var mockChannel = new Mock(); mockChannel.Setup(s => s.Id).Returns(Guid.NewGuid().ToString()); session.RegisterChannel(mockChannel.Object); @@ -79,7 +79,7 @@ public async Task Test_Accept_Group_Join_RequestedAsync() CharacterId = _sessions[1].Character.CharacterId }; - await _pJoinPacketHandler!.ExecuteAsync(pjoinPacket, _sessions[0]).ConfigureAwait(false); + await _pJoinPacketHandler!.ExecuteAsync(pjoinPacket, _sessions[0]); Assert.IsTrue((_sessions[0].Character.Group!.Count > 1) && (_sessions[1].Character.Group!.Count > 1) && (_sessions[0].Character.Group!.GroupId @@ -102,7 +102,7 @@ public async Task Test_Join_Full_GroupAsync() CharacterId = _sessions[i].Character.CharacterId }; - await _pJoinPacketHandler!.ExecuteAsync(pjoinPacket, _sessions[0]).ConfigureAwait(false); + await _pJoinPacketHandler!.ExecuteAsync(pjoinPacket, _sessions[0]); } Assert.IsTrue(_sessions[0].Character.Group!.IsGroupFull @@ -118,7 +118,7 @@ public async Task Test_Join_Full_GroupAsync() CharacterId = _sessions[3].Character.CharacterId }; - await _pJoinPacketHandler!.ExecuteAsync(pjoinPacket, _sessions[0]).ConfigureAwait(false); + await _pJoinPacketHandler!.ExecuteAsync(pjoinPacket, _sessions[0]); Assert.IsTrue(_sessions[3].Character.Group!.Count == 1); } @@ -131,7 +131,7 @@ public async Task Test_Accept_Not_Requested_GroupAsync() CharacterId = _sessions[1].Character.CharacterId }; - await _pJoinPacketHandler!.ExecuteAsync(pjoinPacket, _sessions[0]).ConfigureAwait(false); + await _pJoinPacketHandler!.ExecuteAsync(pjoinPacket, _sessions[0]); Assert.IsTrue((_sessions[0].Character.Group!.Count == 1) && (_sessions[1].Character.Group!.Count == 1)); } @@ -145,7 +145,7 @@ public async Task Test_Decline_Not_Requested_GroupAsync() CharacterId = _sessions[1].Character.CharacterId }; - await _pJoinPacketHandler!.ExecuteAsync(pjoinPacket, _sessions[0]).ConfigureAwait(false); + await _pJoinPacketHandler!.ExecuteAsync(pjoinPacket, _sessions[0]); Assert.IsTrue((_sessions[0].Character.Group!.Count == 1) && (_sessions[1].Character.Group!.Count == 1)); } @@ -161,7 +161,7 @@ public async Task Test_Last_Request_Not_Null_After_OneAsync() CharacterId = _sessions[i].Character.CharacterId }; - await _pJoinPacketHandler!.ExecuteAsync(pjoinPacket, _sessions[0]).ConfigureAwait(false); + await _pJoinPacketHandler!.ExecuteAsync(pjoinPacket, _sessions[0]); } Assert.IsNotNull(_sessions[0].Character.LastGroupRequest); } @@ -177,7 +177,7 @@ public async Task Test_Two_Request_Less_5_Sec_DelayAsync() CharacterId = _sessions[i].Character.CharacterId }; TestHelpers.Instance.Clock.AdvanceSeconds(1); - await _pJoinPacketHandler!.ExecuteAsync(pjoinPacket, _sessions[0]).ConfigureAwait(false); + await _pJoinPacketHandler!.ExecuteAsync(pjoinPacket, _sessions[0]); } Assert.IsTrue(_sessions[0].Character.GroupRequestCharacterIds.Count == 1); @@ -199,7 +199,7 @@ public async Task Test_Two_Request_More_5_Sec_DelayAsync() TestHelpers.Instance.Clock.AdvanceMinutes(6); } - await _pJoinPacketHandler!.ExecuteAsync(pjoinPacket, _sessions[0]).ConfigureAwait(false); + await _pJoinPacketHandler!.ExecuteAsync(pjoinPacket, _sessions[0]); } Assert.IsTrue(_sessions[0].Character.GroupRequestCharacterIds.Count == 2); diff --git a/test/NosCore.PacketHandlers.Tests/Group/PleavePacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Group/PleavePacketHandlerTests.cs index 53726f4c2..c1240dcbb 100644 --- a/test/NosCore.PacketHandlers.Tests/Group/PleavePacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Group/PleavePacketHandlerTests.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -54,7 +54,7 @@ public async Task SetupAsync() var idServer = new IdService(1); for (byte i = 0; i < (byte)(GroupType.Group + 1); i++) { - var session = await TestHelpers.Instance.GenerateSessionAsync().ConfigureAwait(false); + var session = await TestHelpers.Instance.GenerateSessionAsync(); var mockChannel = new Mock(); mockChannel.Setup(s => s.Id).Returns(Guid.NewGuid().ToString()); session.RegisterChannel(mockChannel.Object); @@ -74,7 +74,7 @@ public async Task SetupAsync() [TestMethod] public async Task Test_Leave_Group_When_Not_GroupedAsync() { - await _pLeavePacketHandler!.ExecuteAsync(new PleavePacket(), _sessions[0]).ConfigureAwait(false); + await _pLeavePacketHandler!.ExecuteAsync(new PleavePacket(), _sessions[0]); Assert.IsTrue((_sessions[0].Character.Group != null) && (_sessions[0].Character.Group!.Count == 1)); } @@ -93,14 +93,14 @@ public async Task Test_Leave_Group_When_GroupedAsync() CharacterId = _sessions[i].Character.CharacterId }; - await _pJoinPacketHandler!.ExecuteAsync(pjoinPacket, _sessions[0]).ConfigureAwait(false); + await _pJoinPacketHandler!.ExecuteAsync(pjoinPacket, _sessions[0]); } Assert.IsTrue(_sessions[0].Character.Group!.IsGroupFull && _sessions[1].Character.Group!.IsGroupFull && _sessions[2].Character.Group!.IsGroupFull); - await _pLeavePacketHandler!.ExecuteAsync(new PleavePacket(), _sessions[1]).ConfigureAwait(false); + await _pLeavePacketHandler!.ExecuteAsync(new PleavePacket(), _sessions[1]); Assert.IsTrue(_sessions[1].Character.Group!.Count == 1); } @@ -119,7 +119,7 @@ public async Task Test_Leader_ChangeAsync() CharacterId = _sessions[i].Character.CharacterId }; - await _pJoinPacketHandler!.ExecuteAsync(pjoinPacket, _sessions[0]).ConfigureAwait(false); + await _pJoinPacketHandler!.ExecuteAsync(pjoinPacket, _sessions[0]); } Assert.IsTrue(_sessions[0].Character.Group!.IsGroupFull @@ -127,7 +127,7 @@ public async Task Test_Leader_ChangeAsync() && _sessions[2].Character.Group!.IsGroupFull && _sessions[0].Character.Group! .IsGroupLeader(_sessions[0].Character.CharacterId)); - await _pLeavePacketHandler!.ExecuteAsync(new PleavePacket(), _sessions[0]).ConfigureAwait(false); + await _pLeavePacketHandler!.ExecuteAsync(new PleavePacket(), _sessions[0]); Assert.IsTrue(_sessions[1].Character.Group! .IsGroupLeader(_sessions[1].Character.CharacterId)); @@ -147,7 +147,7 @@ public async Task Test_Leaving_Three_Person_GroupAsync() CharacterId = _sessions[i].Character.CharacterId }; - await _pJoinPacketHandler!.ExecuteAsync(pjoinPacket, _sessions[0]).ConfigureAwait(false); + await _pJoinPacketHandler!.ExecuteAsync(pjoinPacket, _sessions[0]); } Assert.IsTrue(_sessions[0].Character.Group!.IsGroupFull @@ -155,7 +155,7 @@ public async Task Test_Leaving_Three_Person_GroupAsync() && _sessions[2].Character.Group!.IsGroupFull && _sessions[0].Character.Group! .IsGroupLeader(_sessions[0].Character.CharacterId)); - await _pLeavePacketHandler!.ExecuteAsync(new PleavePacket(), _sessions[1]).ConfigureAwait(false); + await _pLeavePacketHandler!.ExecuteAsync(new PleavePacket(), _sessions[1]); Assert.IsTrue(_sessions[0].Character.Group! .IsGroupLeader(_sessions[0].Character.CharacterId)); @@ -173,8 +173,8 @@ public async Task Test_Decline_Group_Join_RequestedAsync() CharacterId = _sessions[1].Character.CharacterId }; - await _pJoinPacketHandler!.ExecuteAsync(pjoinPacket, _sessions[0]).ConfigureAwait(false); - await _pLeavePacketHandler!.ExecuteAsync(new PleavePacket(), _sessions[0]).ConfigureAwait(false); + await _pJoinPacketHandler!.ExecuteAsync(pjoinPacket, _sessions[0]); + await _pLeavePacketHandler!.ExecuteAsync(new PleavePacket(), _sessions[0]); Assert.IsTrue((_sessions[0].Character.Group!.Count == 1) && (_sessions[1].Character.Group!.Count == 1)); } @@ -191,13 +191,13 @@ public async Task Test_Leaving_Two_Person_GroupAsync() CharacterId = _sessions[1].Character.CharacterId }; - await _pJoinPacketHandler!.ExecuteAsync(pjoinPacket, _sessions[0]).ConfigureAwait(false); + await _pJoinPacketHandler!.ExecuteAsync(pjoinPacket, _sessions[0]); Assert.IsTrue((_sessions[0].Character.Group!.Count > 1) && (_sessions[1].Character.Group!.Count > 1) && (_sessions[0].Character.Group!.GroupId == _sessions[1].Character.Group!.GroupId)); - await _pLeavePacketHandler!.ExecuteAsync(new PleavePacket(), _sessions[0]).ConfigureAwait(false); + await _pLeavePacketHandler!.ExecuteAsync(new PleavePacket(), _sessions[0]); Assert.IsTrue((_sessions[0].Character.Group!.Count == 1) && (_sessions[1].Character.Group!.Count == 1)); diff --git a/test/NosCore.PacketHandlers.Tests/Inventory/BiPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Inventory/BiPacketHandlerTests.cs index 593ca44b8..49e414577 100644 --- a/test/NosCore.PacketHandlers.Tests/Inventory/BiPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Inventory/BiPacketHandlerTests.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -45,7 +45,7 @@ public class BiPacketHandlerTests public async Task SetupAsync() { await TestHelpers.ResetAsync(); - _session = await TestHelpers.Instance.GenerateSessionAsync().ConfigureAwait(false); + _session = await TestHelpers.Instance.GenerateSessionAsync(); _item = TestHelpers.Instance.GenerateItemProvider(); _biPacketHandler = new BiPacketHandler(Logger, TestHelpers.Instance.LogLanguageLocalizer); } @@ -55,7 +55,7 @@ public async Task Test_Delete_FromSlotAsync() { _session!.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item!.Create(1012, 999), 0)); await _biPacketHandler!.ExecuteAsync(new BiPacket - { Option = RequestDeletionType.Confirmed, Slot = 0, PocketType = PocketType.Main }, _session).ConfigureAwait(false); + { Option = RequestDeletionType.Confirmed, Slot = 0, PocketType = PocketType.Main }, _session); var packet = (IvnPacket?)_session.LastPackets.FirstOrDefault(s => s is IvnPacket); Assert.IsTrue(packet?.IvnSubPackets?.All(iv => (iv?.Slot == 0) && (iv.VNum == -1)) ?? false); } @@ -65,7 +65,7 @@ public async Task Test_Delete_FromEquimentAsync() { _session!.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item!.Create(1, 1), 0)); await _biPacketHandler!.ExecuteAsync(new BiPacket - { Option = RequestDeletionType.Confirmed, Slot = 0, PocketType = PocketType.Equipment }, _session).ConfigureAwait(false); + { Option = RequestDeletionType.Confirmed, Slot = 0, PocketType = PocketType.Equipment }, _session); Assert.IsTrue(_session.Character.InventoryService.Count == 0); var packet = (IvnPacket?)_session.LastPackets.FirstOrDefault(s => s is IvnPacket); Assert.IsTrue(packet?.IvnSubPackets?.All(iv => (iv?.Slot == 0) && (iv.VNum == -1)) ?? false); diff --git a/test/NosCore.PacketHandlers.Tests/Inventory/GetPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Inventory/GetPacketHandlerTests.cs index 5ca32ad5f..8fc4a0b78 100644 --- a/test/NosCore.PacketHandlers.Tests/Inventory/GetPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Inventory/GetPacketHandlerTests.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -47,9 +47,9 @@ public class GetPacketHandlerTests [TestInitialize] public async Task SetupAsync() { - await TestHelpers.ResetAsync().ConfigureAwait(false); + await TestHelpers.ResetAsync(); _item = TestHelpers.Instance.GenerateItemProvider(); - _session = await TestHelpers.Instance.GenerateSessionAsync().ConfigureAwait(false); + _session = await TestHelpers.Instance.GenerateSessionAsync(); _getPacketHandler = new GetPacketHandler(Logger, TestHelpers.Instance.DistanceCalculator, TestHelpers.Instance.Clock, TestHelpers.Instance.LogLanguageLocalizer); } @@ -68,7 +68,7 @@ public async Task Test_GetAsync() PickerId = _session.Character.CharacterId, VisualId = 100001, PickerType = VisualType.Player - }, _session).ConfigureAwait(false); + }, _session); Assert.IsTrue(_session.Character.InventoryService.Count > 0); } @@ -87,7 +87,7 @@ public async Task Test_GetInStackAsync() PickerId = _session.Character.CharacterId, VisualId = 100001, PickerType = VisualType.Player - }, _session).ConfigureAwait(false); + }, _session); Assert.IsTrue(_session.Character.InventoryService.First().Value.ItemInstance.Amount == 2); } @@ -105,7 +105,7 @@ public async Task Test_GetFullInventoryAsync() PickerId = _session.Character.CharacterId, VisualId = 100001, PickerType = VisualType.Player - }, _session).ConfigureAwait(false); + }, _session); var packet = (MsgiPacket?)_session.LastPackets.FirstOrDefault(s => s is MsgiPacket); Assert.IsTrue(packet?.Message == Game18NConstString.NotEnoughSpace && packet.Type == 0); Assert.IsTrue(_session.Character.InventoryService.Count == 2); @@ -125,7 +125,7 @@ public async Task Test_Get_KeepRarityAsync() PickerId = _session.Character.CharacterId, VisualId = 100001, PickerType = VisualType.Player - }, _session).ConfigureAwait(false); + }, _session); Assert.IsTrue(_session.Character.InventoryService.First().Value.ItemInstance.Rare == 6); } @@ -147,7 +147,7 @@ public async Task Test_Get_NotYourObjectAsync() PickerId = _session.Character.CharacterId, VisualId = 100001, PickerType = VisualType.Player - }, _session).ConfigureAwait(false); + }, _session); var packet = (SayiPacket?)_session.LastPackets.FirstOrDefault(s => s is SayiPacket); Assert.IsTrue(packet?.VisualType == VisualType.Player && packet?.VisualId == _session.Character.CharacterId && packet?.Type == SayColorType.Yellow && packet?.Message == Game18NConstString.UnableToPickUp); @@ -173,7 +173,7 @@ public async Task Test_Get_NotYourObjectAfterDelayAsync() PickerId = _session.Character.CharacterId, VisualId = 100001, PickerType = VisualType.Player - }, _session).ConfigureAwait(false); + }, _session); Assert.IsTrue(_session.Character.InventoryService.Count > 0); } @@ -191,7 +191,7 @@ public async Task Test_GetAwayAsync() PickerId = _session.Character.CharacterId, VisualId = 100001, PickerType = VisualType.Player - }, _session).ConfigureAwait(false); + }, _session); Assert.IsTrue(_session.Character.InventoryService.Count == 0); } } diff --git a/test/NosCore.PacketHandlers.Tests/Inventory/PutPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Inventory/PutPacketHandlerTests.cs index c780f3d79..39bb7f97b 100644 --- a/test/NosCore.PacketHandlers.Tests/Inventory/PutPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Inventory/PutPacketHandlerTests.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -42,9 +42,9 @@ public class PutPacketHandlerTests [TestInitialize] public async Task SetupAsync() { - await TestHelpers.ResetAsync().ConfigureAwait(false); + await TestHelpers.ResetAsync(); _item = TestHelpers.Instance.GenerateItemProvider(); - _session = await TestHelpers.Instance.GenerateSessionAsync().ConfigureAwait(false); + _session = await TestHelpers.Instance.GenerateSessionAsync(); _putPacketHandler = new PutPacketHandler(TestHelpers.Instance.WorldConfiguration, TestHelpers.Instance.GameLanguageLocalizer); } @@ -57,7 +57,7 @@ public async Task Test_PutPartialSlotAsync() PocketType = PocketType.Main, Slot = 0, Amount = 500 - }, _session).ConfigureAwait(false); + }, _session); Assert.IsTrue((_session.Character.InventoryService.Count == 1) && (_session.Character.InventoryService.FirstOrDefault().Value.ItemInstance?.Amount == 499)); } @@ -71,7 +71,7 @@ public async Task Test_PutNotDroppableAsync() PocketType = PocketType.Main, Slot = 0, Amount = 1 - }, _session).ConfigureAwait(false); + }, _session); var packet = (SayiPacket?)_session.LastPackets.FirstOrDefault(s => s is SayiPacket); Assert.IsTrue(packet?.VisualType == VisualType.Player && packet?.VisualId == _session.Character.CharacterId && packet?.Type == SayColorType.Yellow && packet?.Message == Game18NConstString.CantDropItem); @@ -88,7 +88,7 @@ public async Task Test_PutAsync() PocketType = PocketType.Main, Slot = 0, Amount = 1 - }, _session).ConfigureAwait(false); + }, _session); Assert.IsTrue(_session.Character.InventoryService.Count == 0); } @@ -103,7 +103,7 @@ public async Task Test_PutBadPlaceAsync() PocketType = PocketType.Main, Slot = 0, Amount = 1 - }, _session).ConfigureAwait(false); + }, _session); var packet = (SayiPacket?)_session.LastPackets.FirstOrDefault(s => s is SayiPacket); Assert.IsTrue(packet?.VisualType == VisualType.Player && packet?.VisualId == _session.Character.CharacterId && packet?.Type == SayColorType.Yellow && packet?.Message == Game18NConstString.CantDropItem); @@ -121,7 +121,7 @@ public async Task Test_PutOutOfBoundsAsync() PocketType = PocketType.Main, Slot = 0, Amount = 1 - }, _session).ConfigureAwait(false); + }, _session); var packet = (SayiPacket?)_session.LastPackets.FirstOrDefault(s => s is SayiPacket); Assert.IsTrue(packet?.VisualType == VisualType.Player && packet?.VisualId == _session.Character.CharacterId && packet?.Type == SayColorType.Yellow && packet?.Message == Game18NConstString.CantDropItem); diff --git a/test/NosCore.PacketHandlers.Tests/Inventory/SpTransformPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Inventory/SpTransformPacketHandlerTests.cs index b004db8fb..7aebc75e2 100644 --- a/test/NosCore.PacketHandlers.Tests/Inventory/SpTransformPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Inventory/SpTransformPacketHandlerTests.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -54,9 +54,9 @@ public class SpTransformPacketHandlerTests [TestInitialize] public async Task SetupAsync() { - await TestHelpers.ResetAsync().ConfigureAwait(false); + await TestHelpers.ResetAsync(); _item = TestHelpers.Instance.GenerateItemProvider(); - _session = await TestHelpers.Instance.GenerateSessionAsync().ConfigureAwait(false); + _session = await TestHelpers.Instance.GenerateSessionAsync(); _spTransformPacketHandler = new SpTransformPacketHandler(TestHelpers.Instance.Clock, new TransformationService(TestHelpers.Instance.Clock, new Mock().Object, new Mock().Object, new Mock().Object, new Mock().Object, TestHelpers.Instance.LogLanguageLocalizer), TestHelpers.Instance.GameLanguageLocalizer); @@ -66,7 +66,7 @@ public async Task SetupAsync() [TestMethod] public async Task Test_Transform_NoSpAsync() { - await _spTransformPacketHandler!.ExecuteAsync(new SpTransformPacket { Type = SlPacketType.WearSp }, _session!).ConfigureAwait(false); + await _spTransformPacketHandler!.ExecuteAsync(new SpTransformPacket { Type = SlPacketType.WearSp }, _session!); var packet = (MsgiPacket?)_session!.LastPackets.FirstOrDefault(s => s is MsgiPacket); Assert.IsTrue(packet?.Type == MessageType.Default && packet?.Message == Game18NConstString.NoSpecialistCardEquipped); } @@ -80,7 +80,7 @@ public async Task Test_Transform_VehicleAsync() var item = _session.Character.InventoryService.First(); item.Value.Type = NoscorePocketType.Wear; item.Value.Slot = (byte)EquipmentType.Sp; - await _spTransformPacketHandler!.ExecuteAsync(new SpTransformPacket { Type = SlPacketType.WearSp }, _session).ConfigureAwait(false); + await _spTransformPacketHandler!.ExecuteAsync(new SpTransformPacket { Type = SlPacketType.WearSp }, _session); var packet = (MsgiPacket?)_session.LastPackets.FirstOrDefault(s => s is MsgiPacket); Assert.IsTrue(packet?.Message == Game18NConstString.CantUseInVehicle); } @@ -90,7 +90,7 @@ public async Task Test_Transform_VehicleAsync() public async Task Test_Transform_SittedAsync() { _session!.Character.IsSitting = true; - await _spTransformPacketHandler!.ExecuteAsync(new SpTransformPacket { Type = SlPacketType.WearSp }, _session).ConfigureAwait(false); + await _spTransformPacketHandler!.ExecuteAsync(new SpTransformPacket { Type = SlPacketType.WearSp }, _session); Assert.IsNull(_session.LastPackets.FirstOrDefault()); } @@ -103,7 +103,7 @@ public async Task Test_RemoveSpAsync() _session.Character.UseSp = true; item.Value.Type = NoscorePocketType.Wear; item.Value.Slot = (byte)EquipmentType.Sp; - await _spTransformPacketHandler!.ExecuteAsync(new SpTransformPacket { Type = SlPacketType.WearSpAndTransform }, _session).ConfigureAwait(false); + await _spTransformPacketHandler!.ExecuteAsync(new SpTransformPacket { Type = SlPacketType.WearSpAndTransform }, _session); Assert.IsFalse(_session.Character.UseSp); } @@ -117,7 +117,7 @@ public async Task Test_TransformAsync() var item = _session.Character.InventoryService.First(); item.Value.Type = NoscorePocketType.Wear; item.Value.Slot = (byte)EquipmentType.Sp; - await _spTransformPacketHandler!.ExecuteAsync(new SpTransformPacket { Type = SlPacketType.WearSpAndTransform }, _session).ConfigureAwait(false); + await _spTransformPacketHandler!.ExecuteAsync(new SpTransformPacket { Type = SlPacketType.WearSpAndTransform }, _session); Assert.IsTrue(_session.Character.UseSp); } @@ -137,7 +137,7 @@ public async Task Test_Transform_BadFairyAsync() item.Slot = (byte)EquipmentType.Sp; fairy.Type = NoscorePocketType.Wear; fairy.Slot = (byte)EquipmentType.Fairy; - await _spTransformPacketHandler!.ExecuteAsync(new SpTransformPacket { Type = SlPacketType.WearSpAndTransform }, _session).ConfigureAwait(false); + await _spTransformPacketHandler!.ExecuteAsync(new SpTransformPacket { Type = SlPacketType.WearSpAndTransform }, _session); var packet = (MsgiPacket?)_session.LastPackets.FirstOrDefault(s => s is MsgiPacket); Assert.IsTrue(packet?.Message == Game18NConstString.SpecialistAndFairyDifferentElement); } @@ -151,7 +151,7 @@ public async Task Test_Transform_BadReputAsync() var item = _session.Character.InventoryService.First(); item.Value.Type = NoscorePocketType.Wear; item.Value.Slot = (byte)EquipmentType.Sp; - await _spTransformPacketHandler!.ExecuteAsync(new SpTransformPacket { Type = SlPacketType.WearSpAndTransform }, _session).ConfigureAwait(false); + await _spTransformPacketHandler!.ExecuteAsync(new SpTransformPacket { Type = SlPacketType.WearSpAndTransform }, _session); var packet = (SayiPacket?)_session.LastPackets.FirstOrDefault(s => s is SayiPacket); Assert.IsTrue(packet?.VisualType == VisualType.Player && packet?.VisualId == _session.Character.CharacterId && packet?.Type == SayColorType.Yellow && packet?.Message == Game18NConstString.CanNotBeWornReputationLow); } @@ -168,7 +168,7 @@ public async Task Test_TransformBefore_CooldownAsync() var item = _session.Character.InventoryService.First(); item.Value.Type = NoscorePocketType.Wear; item.Value.Slot = (byte)EquipmentType.Sp; - await _spTransformPacketHandler!.ExecuteAsync(new SpTransformPacket { Type = SlPacketType.WearSpAndTransform }, _session).ConfigureAwait(false); + await _spTransformPacketHandler!.ExecuteAsync(new SpTransformPacket { Type = SlPacketType.WearSpAndTransform }, _session); var packet = (MsgiPacket?)_session.LastPackets.FirstOrDefault(s => s is MsgiPacket); Assert.IsTrue(packet?.Type == MessageType.Default && packet?.Message == Game18NConstString.CantTrasformWithSideEffect && packet?.ArgumentType == 4 && (short?)packet?.Game18NArguments[0] == 30); } @@ -182,7 +182,7 @@ public async Task Test_Transform_OutOfSpPointAsync() var item = _session.Character.InventoryService.First(); item.Value.Type = NoscorePocketType.Wear; item.Value.Slot = (byte)EquipmentType.Sp; - await _spTransformPacketHandler!.ExecuteAsync(new SpTransformPacket { Type = SlPacketType.WearSpAndTransform }, _session).ConfigureAwait(false); + await _spTransformPacketHandler!.ExecuteAsync(new SpTransformPacket { Type = SlPacketType.WearSpAndTransform }, _session); var packet = (MsgPacket?)_session.LastPackets.FirstOrDefault(s => s is MsgPacket); Assert.IsTrue(packet?.Message == TestHelpers.Instance.GameLanguageLocalizer[LanguageKey.SP_NOPOINTS, _session.Account.Language]); @@ -198,7 +198,7 @@ public async Task Test_Transform_DelayAsync() var item = _session.Character.InventoryService.First(); item.Value.Type = NoscorePocketType.Wear; item.Value.Slot = (byte)EquipmentType.Sp; - await _spTransformPacketHandler!.ExecuteAsync(new SpTransformPacket { Type = SlPacketType.WearSp }, _session).ConfigureAwait(false); + await _spTransformPacketHandler!.ExecuteAsync(new SpTransformPacket { Type = SlPacketType.WearSp }, _session); var packet = (DelayPacket?)_session.LastPackets.FirstOrDefault(s => s is DelayPacket); Assert.IsTrue(packet?.Delay == 5000); } diff --git a/test/NosCore.PacketHandlers.Tests/Inventory/UseItemPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Inventory/UseItemPacketHandlerTests.cs index a5cf421cb..dd506e346 100644 --- a/test/NosCore.PacketHandlers.Tests/Inventory/UseItemPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Inventory/UseItemPacketHandlerTests.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -43,9 +43,9 @@ public class UseItemPacketHandlerTests [TestInitialize] public async Task SetupAsync() { - await TestHelpers.ResetAsync().ConfigureAwait(false); + await TestHelpers.ResetAsync(); _item = TestHelpers.Instance.GenerateItemProvider(); - _session = await TestHelpers.Instance.GenerateSessionAsync().ConfigureAwait(false); + _session = await TestHelpers.Instance.GenerateSessionAsync(); _useItemPacketHandler = new UseItemPacketHandler(); } @@ -54,7 +54,7 @@ public async Task Test_BindingAsync() { _session!.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item!.Create(1, 1), 0)); await _useItemPacketHandler!.ExecuteAsync(new UseItemPacket { Slot = 0, Type = PocketType.Equipment, Mode = 1 }, - _session).ConfigureAwait(false); + _session); Assert.IsTrue(_session.Character.InventoryService.Any(s => (s.Value.ItemInstance.ItemVNum == 1) && (s.Value.Type == NoscorePocketType.Wear) && @@ -75,7 +75,7 @@ public async Task Test_Increment_SpAdditionPointsAsync() Slot = item.Value.Slot, Mode = 0, Parameter = 0 - }, _session).ConfigureAwait(false); + }, _session); Assert.IsTrue((_session.Character.SpAdditionPoint != 0) && !_session.LastPackets.Any(s => s is MsgiPacket)); } @@ -93,7 +93,7 @@ public async Task Test_Overflow_SpAdditionPointsAsync() Slot = item.Value.Slot, Mode = 0, Parameter = 0 - }, _session).ConfigureAwait(false); + }, _session); var packet = (MsgiPacket?)_session.LastPackets.FirstOrDefault(s => s is MsgiPacket); Assert.IsTrue(packet?.Type == MessageType.Default && packet?.Message == Game18NConstString.CannotBeUsedExceedsCapacity); } @@ -112,7 +112,7 @@ public async Task Test_CloseToLimit_SpAdditionPointsAsync() Slot = item.Value.Slot, Mode = 0, Parameter = 0 - }, _session).ConfigureAwait(false); + }, _session); Assert.IsTrue((_session.Character.SpAdditionPoint == TestHelpers.Instance.WorldConfiguration.Value.MaxAdditionalSpPoints) && !_session.LastPackets.Any(s => s is MsgiPacket)); } diff --git a/test/NosCore.PacketHandlers.Tests/Inventory/WearPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Inventory/WearPacketHandlerTests.cs index 57736aecb..7b52898bd 100644 --- a/test/NosCore.PacketHandlers.Tests/Inventory/WearPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Inventory/WearPacketHandlerTests.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -56,9 +56,9 @@ public class WearPacketHandlerTests [TestInitialize] public async Task SetupAsync() { - await TestHelpers.ResetAsync().ConfigureAwait(false); + await TestHelpers.ResetAsync(); _item = TestHelpers.Instance.GenerateItemProvider(); - _session = await TestHelpers.Instance.GenerateSessionAsync().ConfigureAwait(false); + _session = await TestHelpers.Instance.GenerateSessionAsync(); _wearPacketHandler = new WearPacketHandler(); } @@ -97,7 +97,7 @@ public async Task Test_Wear_Put_Item_CorrectSlotAsync(int typeInt) _session!.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item.Create(1, 1), _session.Character.CharacterId)); - await _wearPacketHandler!.ExecuteAsync(new WearPacket { InventorySlot = 0, Type = PocketType.Equipment }, _session).ConfigureAwait(false); + await _wearPacketHandler!.ExecuteAsync(new WearPacket { InventorySlot = 0, Type = PocketType.Equipment }, _session); Assert.IsTrue(_session.Character.InventoryService.All(s => (s.Value.Slot == (short)type) && (s.Value.Type == NoscorePocketType.Wear))); } @@ -126,7 +126,7 @@ public async Task Test_Wear_Put_Item_BadClassAsync(int characterClassInt) _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item.Create(1, 1), _session.Character.CharacterId)); - await _wearPacketHandler!.ExecuteAsync(new WearPacket { InventorySlot = 0, Type = PocketType.Equipment }, _session).ConfigureAwait(false); + await _wearPacketHandler!.ExecuteAsync(new WearPacket { InventorySlot = 0, Type = PocketType.Equipment }, _session); Assert.IsTrue(_session.Character.InventoryService.All(s => s.Value.Type == NoscorePocketType.Equipment)); var packet = (SayiPacket?)_session.LastPackets.FirstOrDefault(s => s is SayiPacket); Assert.IsTrue(packet?.VisualType == VisualType.Player && packet?.VisualId == _session.Character.CharacterId && packet?.Type == SayColorType.Yellow && packet?.Message == Game18NConstString.CanNotWearThat); @@ -136,7 +136,7 @@ public async Task Test_Wear_Put_Item_BadClassAsync(int characterClassInt) { _session.Character.Class = validClass; var item = _session.Character.InventoryService.First(); - await _wearPacketHandler.ExecuteAsync(new WearPacket { InventorySlot = 0, Type = PocketType.Equipment }, _session).ConfigureAwait(false); + await _wearPacketHandler.ExecuteAsync(new WearPacket { InventorySlot = 0, Type = PocketType.Equipment }, _session); Assert.IsTrue(item.Value.Type == NoscorePocketType.Wear); item.Value.Type = NoscorePocketType.Equipment; item.Value.Slot = 0; @@ -165,7 +165,7 @@ public async Task Test_Wear_Put_Item_BadGenderAsync(int genderToTestInt) _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item.Create(1, 1), _session.Character.CharacterId)); - await _wearPacketHandler!.ExecuteAsync(new WearPacket { InventorySlot = 0, Type = PocketType.Equipment }, _session).ConfigureAwait(false); + await _wearPacketHandler!.ExecuteAsync(new WearPacket { InventorySlot = 0, Type = PocketType.Equipment }, _session); Assert.IsTrue(_session.Character.InventoryService.All(s => s.Value.Type == NoscorePocketType.Equipment)); var packet = (SayiPacket?)_session.LastPackets.FirstOrDefault(s => s is SayiPacket); Assert.IsTrue(packet?.VisualType == VisualType.Player && packet?.VisualId == _session.Character.CharacterId && packet?.Type == SayColorType.Yellow && packet?.Message == Game18NConstString.CanNotWearThat); @@ -175,7 +175,7 @@ public async Task Test_Wear_Put_Item_BadGenderAsync(int genderToTestInt) { _session.Character.Gender = validClass; var item = _session.Character.InventoryService.First(); - await _wearPacketHandler.ExecuteAsync(new WearPacket { InventorySlot = 0, Type = PocketType.Equipment }, _session).ConfigureAwait(false); + await _wearPacketHandler.ExecuteAsync(new WearPacket { InventorySlot = 0, Type = PocketType.Equipment }, _session); Assert.IsTrue(item.Value.Type == NoscorePocketType.Wear); item.Value.Type = NoscorePocketType.Equipment; item.Value.Slot = 0; @@ -200,7 +200,7 @@ public async Task Test_Wear_BadJobLevelAsync() {new WearEventHandler(Logger, TestHelpers.Instance.Clock, TestHelpers.Instance.LogLanguageLocalizer)}), Logger, TestHelpers.Instance.LogLanguageLocalizer); _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item.Create(1, 1), _session.Character.CharacterId)); - await _wearPacketHandler!.ExecuteAsync(new WearPacket { InventorySlot = 0, Type = PocketType.Equipment }, _session).ConfigureAwait(false); + await _wearPacketHandler!.ExecuteAsync(new WearPacket { InventorySlot = 0, Type = PocketType.Equipment }, _session); Assert.IsTrue(_session.Character.InventoryService.All(s => s.Value.Type == NoscorePocketType.Equipment)); var packet = (MsgiPacket?)_session.LastPackets.FirstOrDefault(s => s is MsgiPacket); Assert.IsTrue(packet?.Message == Game18NConstString.CanNotBeWornDifferentClass); @@ -224,7 +224,7 @@ public async Task Test_Wear_GoodJobLevelAsync() {new WearEventHandler(Logger, TestHelpers.Instance.Clock, TestHelpers.Instance.LogLanguageLocalizer)}), Logger, TestHelpers.Instance.LogLanguageLocalizer); _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item.Create(1, 1), _session.Character.CharacterId)); - await _wearPacketHandler!.ExecuteAsync(new WearPacket { InventorySlot = 0, Type = PocketType.Equipment }, _session).ConfigureAwait(false); + await _wearPacketHandler!.ExecuteAsync(new WearPacket { InventorySlot = 0, Type = PocketType.Equipment }, _session); Assert.IsTrue(_session.Character.InventoryService.All(s => s.Value.Type == NoscorePocketType.Wear)); } @@ -246,7 +246,7 @@ public async Task Test_Wear_BadLevelAsync() {new WearEventHandler(Logger, TestHelpers.Instance.Clock, TestHelpers.Instance.LogLanguageLocalizer)}), Logger, TestHelpers.Instance.LogLanguageLocalizer); _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item.Create(1, 1), _session.Character.CharacterId)); - await _wearPacketHandler!.ExecuteAsync(new WearPacket { InventorySlot = 0, Type = PocketType.Equipment }, _session).ConfigureAwait(false); + await _wearPacketHandler!.ExecuteAsync(new WearPacket { InventorySlot = 0, Type = PocketType.Equipment }, _session); Assert.IsTrue(_session.Character.InventoryService.All(s => s.Value.Type == NoscorePocketType.Equipment)); var packet = (SayiPacket?)_session.LastPackets.FirstOrDefault(s => s is SayiPacket); Assert.IsTrue(packet?.VisualType == VisualType.Player && packet?.VisualId == _session.Character.CharacterId && packet?.Type == SayColorType.Yellow && packet?.Message == Game18NConstString.CanNotWearThat); @@ -270,7 +270,7 @@ public async Task Test_Wear_GoodLevelAsync() {new WearEventHandler(Logger, TestHelpers.Instance.Clock, TestHelpers.Instance.LogLanguageLocalizer)}), Logger, TestHelpers.Instance.LogLanguageLocalizer); _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item.Create(1, 1), _session.Character.CharacterId)); - await _wearPacketHandler!.ExecuteAsync(new WearPacket { InventorySlot = 0, Type = PocketType.Equipment }, _session).ConfigureAwait(false); + await _wearPacketHandler!.ExecuteAsync(new WearPacket { InventorySlot = 0, Type = PocketType.Equipment }, _session); Assert.IsTrue(_session.Character.InventoryService.All(s => s.Value.Type == NoscorePocketType.Wear)); } @@ -293,7 +293,7 @@ public async Task Test_Wear_BadHeroLevelAsync() {new WearEventHandler(Logger, TestHelpers.Instance.Clock, TestHelpers.Instance.LogLanguageLocalizer)}), Logger, TestHelpers.Instance.LogLanguageLocalizer); _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item.Create(1, 1), _session.Character.CharacterId)); - await _wearPacketHandler!.ExecuteAsync(new WearPacket { InventorySlot = 0, Type = PocketType.Equipment }, _session).ConfigureAwait(false); + await _wearPacketHandler!.ExecuteAsync(new WearPacket { InventorySlot = 0, Type = PocketType.Equipment }, _session); Assert.IsTrue(_session.Character.InventoryService.All(s => s.Value.Type == NoscorePocketType.Equipment)); var packet = (SayiPacket?)_session.LastPackets.FirstOrDefault(s => s is SayiPacket); Assert.IsTrue(packet?.VisualType == VisualType.Player && packet?.VisualId == _session.Character.CharacterId && packet?.Type == SayColorType.Yellow && packet?.Message == Game18NConstString.CanNotWearThat); @@ -318,7 +318,7 @@ public async Task Test_Wear_GoodHeroLevelAsync() {new WearEventHandler(Logger, TestHelpers.Instance.Clock, TestHelpers.Instance.LogLanguageLocalizer)}), Logger, TestHelpers.Instance.LogLanguageLocalizer); _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item.Create(1, 1), _session.Character.CharacterId)); - await _wearPacketHandler!.ExecuteAsync(new WearPacket { InventorySlot = 0, Type = PocketType.Equipment }, _session).ConfigureAwait(false); + await _wearPacketHandler!.ExecuteAsync(new WearPacket { InventorySlot = 0, Type = PocketType.Equipment }, _session); Assert.IsTrue(_session.Character.InventoryService.All(s => s.Value.Type == NoscorePocketType.Wear)); } @@ -339,7 +339,7 @@ public async Task Test_Wear_DestroyedSpAsync() {new WearEventHandler(Logger, TestHelpers.Instance.Clock, TestHelpers.Instance.LogLanguageLocalizer)}), Logger, TestHelpers.Instance.LogLanguageLocalizer); _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item.Create(1, 1, -2), _session.Character.CharacterId)); - await _wearPacketHandler!.ExecuteAsync(new WearPacket { InventorySlot = 0, Type = PocketType.Equipment }, _session).ConfigureAwait(false); + await _wearPacketHandler!.ExecuteAsync(new WearPacket { InventorySlot = 0, Type = PocketType.Equipment }, _session); Assert.IsTrue(_session.Character.InventoryService.Any(s => s.Value.Type == NoscorePocketType.Equipment)); var packet = (MsgiPacket?)_session.LastPackets.FirstOrDefault(s => s is MsgiPacket); @@ -370,9 +370,9 @@ public async Task Test_Wear_SpInUseAsync() _session.Character.CharacterId)); _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item.Create(2, 1), _session.Character.CharacterId)); - await _wearPacketHandler!.ExecuteAsync(new WearPacket { InventorySlot = 0, Type = PocketType.Equipment }, _session).ConfigureAwait(false); + await _wearPacketHandler!.ExecuteAsync(new WearPacket { InventorySlot = 0, Type = PocketType.Equipment }, _session); _session.Character.UseSp = true; - await _wearPacketHandler.ExecuteAsync(new WearPacket { InventorySlot = 1, Type = PocketType.Equipment }, _session).ConfigureAwait(false); + await _wearPacketHandler.ExecuteAsync(new WearPacket { InventorySlot = 1, Type = PocketType.Equipment }, _session); Assert.IsTrue(_session.Character.InventoryService.Any(s => (s.Value.ItemInstance.ItemVNum == 2) && (s.Value.Type == NoscorePocketType.Equipment))); var packet = (SayiPacket?)_session.LastPackets.FirstOrDefault(s => s is SayiPacket); @@ -403,10 +403,10 @@ public async Task Test_Wear_SpInLoadingAsync() _session.Character.CharacterId)); _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item.Create(2, 1), _session.Character.CharacterId)); - await _wearPacketHandler!.ExecuteAsync(new WearPacket { InventorySlot = 0, Type = PocketType.Equipment }, _session).ConfigureAwait(false); + await _wearPacketHandler!.ExecuteAsync(new WearPacket { InventorySlot = 0, Type = PocketType.Equipment }, _session); _session.Character.SpCooldown = 30; _session.Character.LastSp = TestHelpers.Instance.Clock.GetCurrentInstant(); - await _wearPacketHandler.ExecuteAsync(new WearPacket { InventorySlot = 1, Type = PocketType.Equipment }, _session).ConfigureAwait(false); + await _wearPacketHandler.ExecuteAsync(new WearPacket { InventorySlot = 1, Type = PocketType.Equipment }, _session); Assert.IsTrue(_session.Character.InventoryService.Any(s => (s.Value.ItemInstance.ItemVNum == 2) && (s.Value.Type == NoscorePocketType.Equipment))); var packet = (MsgiPacket?)_session.LastPackets.FirstOrDefault(s => s is MsgiPacket); @@ -439,9 +439,9 @@ public async Task Test_Wear_WearFairy_SpUseBadElementAsync() _session.Character.CharacterId)); _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item.Create(2, 1), _session.Character.CharacterId)); - await _wearPacketHandler!.ExecuteAsync(new WearPacket { InventorySlot = 1, Type = PocketType.Equipment }, _session).ConfigureAwait(false); + await _wearPacketHandler!.ExecuteAsync(new WearPacket { InventorySlot = 1, Type = PocketType.Equipment }, _session); _session.Character.UseSp = true; - await _wearPacketHandler.ExecuteAsync(new WearPacket { InventorySlot = 0, Type = PocketType.Equipment }, _session).ConfigureAwait(false); + await _wearPacketHandler.ExecuteAsync(new WearPacket { InventorySlot = 0, Type = PocketType.Equipment }, _session); Assert.IsTrue(_session.Character.InventoryService.Any(s => (s.Value.ItemInstance.ItemVNum == 1) && (s.Value.Type == NoscorePocketType.Equipment))); var packet = (MsgiPacket?)_session.LastPackets.FirstOrDefault(s => s is MsgiPacket); @@ -473,9 +473,9 @@ public async Task Test_Wear_WearFairy_SpUseGoodElementAsync() _session.Character.CharacterId)); _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item.Create(2, 1), _session.Character.CharacterId)); - await _wearPacketHandler!.ExecuteAsync(new WearPacket { InventorySlot = 1, Type = PocketType.Equipment }, _session).ConfigureAwait(false); + await _wearPacketHandler!.ExecuteAsync(new WearPacket { InventorySlot = 1, Type = PocketType.Equipment }, _session); _session.Character.UseSp = true; - await _wearPacketHandler.ExecuteAsync(new WearPacket { InventorySlot = 0, Type = PocketType.Equipment }, _session).ConfigureAwait(false); + await _wearPacketHandler.ExecuteAsync(new WearPacket { InventorySlot = 0, Type = PocketType.Equipment }, _session); Assert.IsTrue( _session.Character.InventoryService.Any(s => (s.Value.ItemInstance.ItemVNum == 1) && (s.Value.Type == NoscorePocketType.Wear))); @@ -506,9 +506,9 @@ public async Task Test_Wear_WearFairy_SpUseGoodSecondElementAsync() _session.Character.CharacterId)); _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item.Create(2, 1), _session.Character.CharacterId)); - await _wearPacketHandler!.ExecuteAsync(new WearPacket { InventorySlot = 1, Type = PocketType.Equipment }, _session).ConfigureAwait(false); + await _wearPacketHandler!.ExecuteAsync(new WearPacket { InventorySlot = 1, Type = PocketType.Equipment }, _session); _session.Character.UseSp = true; - await _wearPacketHandler!.ExecuteAsync(new WearPacket { InventorySlot = 0, Type = PocketType.Equipment }, _session).ConfigureAwait(false); + await _wearPacketHandler!.ExecuteAsync(new WearPacket { InventorySlot = 0, Type = PocketType.Equipment }, _session); Assert.IsTrue( _session.Character.InventoryService.Any(s => (s.Value.ItemInstance?.ItemVNum == 1) && (s.Value.Type == NoscorePocketType.Wear))); @@ -527,7 +527,7 @@ public async Task Test_Binding_RequiredAsync() _session!.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item.Create(1, 1), _session.Character.CharacterId)); - await _wearPacketHandler!.ExecuteAsync(new WearPacket { InventorySlot = 0, Type = PocketType.Equipment }, _session).ConfigureAwait(false); + await _wearPacketHandler!.ExecuteAsync(new WearPacket { InventorySlot = 0, Type = PocketType.Equipment }, _session); var packet = (QnaPacket?)_session.LastPackets.FirstOrDefault(s => s is QnaPacket); Assert.IsTrue(packet?.YesPacket is UseItemPacket yespacket diff --git a/test/NosCore.PacketHandlers.Tests/Login/NoS0575PacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Login/NoS0575PacketHandlerTests.cs index d9eec6fa9..84bde42b9 100644 --- a/test/NosCore.PacketHandlers.Tests/Login/NoS0575PacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Login/NoS0575PacketHandlerTests.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -61,8 +61,8 @@ public class NoS0575PacketHandlerTests public async Task SetupAsync() { _password = new Sha512Hasher().Hash("test"); - await TestHelpers.ResetAsync().ConfigureAwait(false); - _session = await TestHelpers.Instance.GenerateSessionAsync().ConfigureAwait(false); + await TestHelpers.ResetAsync(); + _session = await TestHelpers.Instance.GenerateSessionAsync(); _authHttpClient = new Mock(); _pubSubHub = TestHelpers.Instance.PubSubHub; _loginConfiguration = Options.Create(new LoginConfiguration()); @@ -83,7 +83,7 @@ public async Task LoginOldClientAsync() { Password = _password, Username = _session!.Account.Name.ToUpperInvariant() - }, _session).ConfigureAwait(false); + }, _session); Assert.IsTrue(((FailcPacket?)_session.LastPackets.FirstOrDefault(s => s is FailcPacket))?.Type == LoginFailType.OldClient); @@ -97,7 +97,7 @@ public async Task LoginOldAuthWithNewAuthEnforcedAsync() { Password = _password, Username = _session!.Account.Name.ToUpperInvariant() - }, _session).ConfigureAwait(false); + }, _session); Assert.IsTrue(_session.LastPackets.Count == 0); } @@ -109,7 +109,7 @@ public async Task LoginNoAccountAsync() { Password = _password, Username = "noaccount" - }, _session!).ConfigureAwait(false); + }, _session!); Assert.IsTrue(((FailcPacket?)_session!.LastPackets.FirstOrDefault(s => s is FailcPacket))?.Type == LoginFailType.AccountOrPasswordWrong); @@ -122,7 +122,7 @@ public async Task LoginWrongCapsAsync() { Password = _password, Username = _session!.Account.Name.ToUpperInvariant() - }, _session).ConfigureAwait(false); + }, _session); Assert.IsTrue(((FailcPacket?)_session.LastPackets.FirstOrDefault(s => s is FailcPacket))?.Type == LoginFailType.WrongCaps); @@ -136,7 +136,7 @@ public async Task LoginWrongPAsswordAsync() { Password = encryption.Hash("test1"), Username = _session!.Account.Name - }, _session).ConfigureAwait(false); + }, _session); Assert.IsTrue(((FailcPacket?)_session.LastPackets.FirstOrDefault(s => s is FailcPacket))?.Type == LoginFailType.AccountOrPasswordWrong); @@ -152,7 +152,7 @@ public async Task LoginAsync() { Password = _password, Username = _session!.Account.Name - }, _session).ConfigureAwait(false); + }, _session); Assert.IsNotNull((NsTestPacket?)_session.LastPackets.FirstOrDefault(s => s is NsTestPacket)); } @@ -168,7 +168,7 @@ public async Task LoginAlreadyConnectedAsync() { Password = _password, Username = _session.Account.Name - }, _session).ConfigureAwait(false); + }, _session); Assert.IsTrue(((FailcPacket?)_session.LastPackets.FirstOrDefault(s => s is FailcPacket))?.Type == LoginFailType.AlreadyConnected); } @@ -184,7 +184,7 @@ public async Task LoginNoServerAsync() { Password = _password, Username = _session!.Account.Name - }, _session).ConfigureAwait(false); + }, _session); Assert.IsTrue(((FailcPacket?)_session.LastPackets.FirstOrDefault(s => s is FailcPacket))?.Type == LoginFailType.CantConnect); } @@ -213,7 +213,7 @@ public async Task LoginMaintenanceAsync() { Password = _password, Username = _session!.Account.Name - }, _session).ConfigureAwait(false); + }, _session); Assert.IsTrue(((FailcPacket?)_session.LastPackets.FirstOrDefault(s => s is FailcPacket))?.Type == LoginFailType.Maintenance); @@ -232,7 +232,7 @@ public async Task LoginMaintenanceGameMasterAsync() { Password = _password, Username = _session!.Account.Name - }, _session).ConfigureAwait(false); + }, _session); Assert.IsNotNull((NsTestPacket?)_session.LastPackets.FirstOrDefault(s => s is NsTestPacket)); } diff --git a/test/NosCore.PacketHandlers.Tests/Login/NoS0577PacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Login/NoS0577PacketHandlerTests.cs index c4cd647a9..f9192a752 100644 --- a/test/NosCore.PacketHandlers.Tests/Login/NoS0577PacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Login/NoS0577PacketHandlerTests.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -72,10 +72,10 @@ private static string GuidToToken(string token) [TestInitialize] public async Task SetupAsync() { - await TestHelpers.ResetAsync().ConfigureAwait(false); + await TestHelpers.ResetAsync(); _channelHub = new Mock(); _sessionRefHolder = new SessionRefHolder(); - _session = await TestHelpers.Instance.GenerateSessionAsync().ConfigureAwait(false); + _session = await TestHelpers.Instance.GenerateSessionAsync(); _sessionRefHolder[_session.Channel!.Id] = new RegionTypeMapping(_session.SessionId, RegionType.EN); _authHttpClient.Setup(s => s.GetAwaitingConnectionAsync(It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync((string a, string b, int c) => @@ -98,7 +98,7 @@ public async Task LoginBCryptAsync() await _noS0577PacketHandler!.ExecuteAsync(new NoS0577Packet { AuthToken = GuidToToken(_tokenGuid), - }, _session).ConfigureAwait(false); + }, _session); Assert.IsNotNull((NsTestPacket?)_session.LastPackets.FirstOrDefault(s => s is NsTestPacket)); @@ -116,7 +116,7 @@ public async Task LoginPbkdf2Async() await _noS0577PacketHandler!.ExecuteAsync(new NoS0577Packet { AuthToken = GuidToToken(_tokenGuid), - }, _session).ConfigureAwait(false); + }, _session); Assert.IsNotNull((NsTestPacket?)_session.LastPackets.FirstOrDefault(s => s is NsTestPacket)); } @@ -128,7 +128,7 @@ public async Task LoginOldClientAsync() await _noS0577PacketHandler!.ExecuteAsync(new NoS0577Packet { AuthToken = GuidToToken(_tokenGuid), - }, _session!).ConfigureAwait(false); + }, _session!); Assert.IsTrue(((FailcPacket?)_session!.LastPackets.FirstOrDefault(s => s is FailcPacket))?.Type == LoginFailType.OldClient); @@ -143,7 +143,7 @@ public async Task LoginWrongTokenAsync() await _noS0577PacketHandler!.ExecuteAsync(new NoS0577Packet { AuthToken = GuidToToken(Guid.NewGuid().ToString()), - }, _session!).ConfigureAwait(false); + }, _session!); Assert.IsTrue(((FailcPacket?)_session!.LastPackets.FirstOrDefault(s => s is FailcPacket))?.Type == LoginFailType.AccountOrPasswordWrong); @@ -158,7 +158,7 @@ public async Task LoginAsync() await _noS0577PacketHandler!.ExecuteAsync(new NoS0577Packet { AuthToken = GuidToToken(_tokenGuid), - }, _session!).ConfigureAwait(false); + }, _session!); Assert.IsNotNull((NsTestPacket?)_session!.LastPackets.FirstOrDefault(s => s is NsTestPacket)); } @@ -173,7 +173,7 @@ public async Task LoginAlreadyConnectedAsync() await _noS0577PacketHandler!.ExecuteAsync(new NoS0577Packet { AuthToken = GuidToToken(_tokenGuid), - }, _session).ConfigureAwait(false); + }, _session); Assert.IsTrue(((FailcPacket?)_session.LastPackets.FirstOrDefault(s => s is FailcPacket))?.Type == LoginFailType.AlreadyConnected); } @@ -187,7 +187,7 @@ public async Task LoginNoServerAsync() await _noS0577PacketHandler!.ExecuteAsync(new NoS0577Packet { AuthToken = GuidToToken(_tokenGuid), - }, _session!).ConfigureAwait(false); + }, _session!); Assert.IsTrue(((FailcPacket?)_session!.LastPackets.FirstOrDefault(s => s is FailcPacket))?.Type == LoginFailType.CantConnect); } @@ -213,7 +213,7 @@ public async Task LoginMaintenanceAsync() await _noS0577PacketHandler!.ExecuteAsync(new NoS0577Packet { AuthToken = GuidToToken(_tokenGuid), - }, _session!).ConfigureAwait(false); + }, _session!); Assert.IsTrue(((FailcPacket?)_session!.LastPackets.FirstOrDefault(s => s is FailcPacket))?.Type == LoginFailType.Maintenance); @@ -230,7 +230,7 @@ public async Task LoginMaintenanceGameMasterAsync() await _noS0577PacketHandler!.ExecuteAsync(new NoS0577Packet { AuthToken = GuidToToken(_tokenGuid), - }, _session).ConfigureAwait(false); + }, _session); Assert.IsNotNull((NsTestPacket?)_session.LastPackets.FirstOrDefault(s => s is NsTestPacket)); } diff --git a/test/NosCore.PacketHandlers.Tests/Miniland/MJoinPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Miniland/MJoinPacketHandlerTests.cs index e0c4789bf..558b850ae 100644 --- a/test/NosCore.PacketHandlers.Tests/Miniland/MJoinPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Miniland/MJoinPacketHandlerTests.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -62,9 +62,9 @@ public async Task SetupAsync() TypeAdapterConfig.NewConfig() .ConstructUsing(src => new MapNpc(null, Logger, TestHelpers.Instance.DistanceCalculator, TestHelpers.Instance.Clock)); Broadcaster.Reset(); - await TestHelpers.ResetAsync().ConfigureAwait(false); - _session = await TestHelpers.Instance.GenerateSessionAsync().ConfigureAwait(false); - _targetSession = await TestHelpers.Instance.GenerateSessionAsync().ConfigureAwait(false); + await TestHelpers.ResetAsync(); + _session = await TestHelpers.Instance.GenerateSessionAsync(); + _targetSession = await TestHelpers.Instance.GenerateSessionAsync(); _minilandProvider = new Mock(); _mapChangeService = new Mock(); _mjoinPacketHandler = new MJoinPacketHandler(_friendHttpClient.Object, _minilandProvider.Object, _mapChangeService.Object, TestHelpers.Instance.SessionRegistry); @@ -78,7 +78,7 @@ public async Task JoinNonConnectedAsync() VisualId = 50, Type = VisualType.Player }; - await _mjoinPacketHandler!.ExecuteAsync(mjoinPacket, _session!).ConfigureAwait(false); + await _mjoinPacketHandler!.ExecuteAsync(mjoinPacket, _session!); _mapChangeService!.Verify(x => x.ChangeMapInstanceAsync(_session!, TestHelpers.Instance.MinilandId, 5, 8), Times.Never); } @@ -91,7 +91,7 @@ public async Task JoinNonFriendAsync() VisualId = _targetSession!.Character.CharacterId, Type = VisualType.Player }; - await _mjoinPacketHandler!.ExecuteAsync(mjoinPacket, _session!).ConfigureAwait(false); + await _mjoinPacketHandler!.ExecuteAsync(mjoinPacket, _session!); _mapChangeService!.Verify(x => x.ChangeMapInstanceAsync(_targetSession, TestHelpers.Instance.MinilandId, 5, 8), Times.Never); @@ -130,7 +130,7 @@ public async Task JoinClosedAsync() }); _minilandProvider!.Setup(s => s.GetMiniland(It.IsAny())).Returns(new GameObject.Services.MinilandService.Miniland { MapInstanceId = TestHelpers.Instance.MinilandId, State = MinilandState.Lock }); - await _mjoinPacketHandler!.ExecuteAsync(mjoinPacket, _session).ConfigureAwait(false); + await _mjoinPacketHandler!.ExecuteAsync(mjoinPacket, _session); var lastpacket = (InfoiPacket?)_session.LastPackets.FirstOrDefault(s => s is InfoiPacket); Assert.AreEqual(lastpacket?.Message, Game18NConstString.MinilandLocked); @@ -157,7 +157,7 @@ public async Task JoinAsync() RelationType = CharacterRelationType.Friend } }); - await _mjoinPacketHandler!.ExecuteAsync(mjoinPacket, _session!).ConfigureAwait(false); + await _mjoinPacketHandler!.ExecuteAsync(mjoinPacket, _session!); _connectedAccountHttpClient.Setup(s => s.GetSubscribersAsync()) .ReturnsAsync(new List(){ new Subscriber @@ -206,7 +206,7 @@ public async Task JoinPrivateAsync() }); _minilandProvider!.Setup(s => s.GetMiniland(It.IsAny())).Returns(new GameObject.Services.MinilandService.Miniland { MapInstanceId = TestHelpers.Instance.MinilandId, State = MinilandState.Private }); - await _mjoinPacketHandler!.ExecuteAsync(mjoinPacket, _session).ConfigureAwait(false); + await _mjoinPacketHandler!.ExecuteAsync(mjoinPacket, _session); _mapChangeService!.Verify(x=>x.ChangeMapInstanceAsync(_session, TestHelpers.Instance.MinilandId, 5, 8), Times.Once); } @@ -243,7 +243,7 @@ public async Task JoinPrivateBlockedAsync() }); _minilandProvider!.Setup(s => s.GetMiniland(It.IsAny())).Returns(new GameObject.Services.MinilandService.Miniland { MapInstanceId = TestHelpers.Instance.MinilandId, State = MinilandState.Private }); - await _mjoinPacketHandler!.ExecuteAsync(mjoinPacket, _session).ConfigureAwait(false); + await _mjoinPacketHandler!.ExecuteAsync(mjoinPacket, _session); var lastpacket = (InfoiPacket?)_session.LastPackets.FirstOrDefault(s => s is InfoiPacket); Assert.AreEqual(lastpacket?.Message, Game18NConstString.MinilandLocked); diff --git a/test/NosCore.PacketHandlers.Tests/Miniland/MlEditPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Miniland/MlEditPacketHandlerTests.cs index 253da88c2..2c9733bfd 100644 --- a/test/NosCore.PacketHandlers.Tests/Miniland/MlEditPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Miniland/MlEditPacketHandlerTests.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -56,10 +56,10 @@ public async Task SetupAsync() { TypeAdapterConfig.NewConfig() .ConstructUsing(src => new MapNpc(null, Logger, TestHelpers.Instance.DistanceCalculator, TestHelpers.Instance.Clock)); - await TestHelpers.ResetAsync().ConfigureAwait(false); - _session = await TestHelpers.Instance.GenerateSessionAsync().ConfigureAwait(false); - _session2 = await TestHelpers.Instance.GenerateSessionAsync().ConfigureAwait(false); - var session3 = await TestHelpers.Instance.GenerateSessionAsync().ConfigureAwait(false); + await TestHelpers.ResetAsync(); + _session = await TestHelpers.Instance.GenerateSessionAsync(); + _session2 = await TestHelpers.Instance.GenerateSessionAsync(); + var session3 = await TestHelpers.Instance.GenerateSessionAsync(); TestHelpers.Instance.FriendHttpClient .Setup(s => s.GetFriendsAsync(It.IsAny())) .ReturnsAsync(new List @@ -105,7 +105,7 @@ public async Task CanChangeMinilandMessageAsync() MinilandInfo = "test", Type = 1 }; - await _mlEditPacketHandler!.ExecuteAsync(mleditPacket, _session!).ConfigureAwait(false); + await _mlEditPacketHandler!.ExecuteAsync(mleditPacket, _session!); var lastpacket = (InfoiPacket?)_session!.LastPackets.FirstOrDefault(s => s is InfoiPacket); Assert.AreEqual(Game18NConstString.MinilandChanged, lastpacket!.Message); var miniland = _minilandProvider.GetMiniland(_session.Character.CharacterId); @@ -122,7 +122,7 @@ public async Task CanChangeMinilandMessageWithSpaceAsync() MinilandInfo = "Test Test", Type = 1 }; - await _mlEditPacketHandler!.ExecuteAsync(mleditPacket, _session!).ConfigureAwait(false); + await _mlEditPacketHandler!.ExecuteAsync(mleditPacket, _session!); var lastpacket = (InfoiPacket?)_session!.LastPackets.FirstOrDefault(s => s is InfoiPacket); Assert.AreEqual(Game18NConstString.MinilandChanged, lastpacket!.Message); var miniland = _minilandProvider.GetMiniland(_session.Character.CharacterId); @@ -139,7 +139,7 @@ public async Task CanLockMinilandAsync() Parameter = MinilandState.Lock, Type = 2 }; - await _mlEditPacketHandler!.ExecuteAsync(mleditPacket, _session!).ConfigureAwait(false); + await _mlEditPacketHandler!.ExecuteAsync(mleditPacket, _session!); var lastpacket = (MsgiPacket?)_session!.LastPackets.FirstOrDefault(s => s is MsgiPacket); Assert.AreEqual(lastpacket?.Message, Game18NConstString.MinilandLocked); var miniland = _minilandProvider.GetMiniland(_session.Character.CharacterId); @@ -155,7 +155,7 @@ public async Task CanOpenMinilandAsync() Parameter = MinilandState.Open, Type = 2 }; - await _mlEditPacketHandler!.ExecuteAsync(mleditPacket, _session!).ConfigureAwait(false); + await _mlEditPacketHandler!.ExecuteAsync(mleditPacket, _session!); var lastpacket = (MsgiPacket?)_session!.LastPackets.FirstOrDefault(s => s is MsgiPacket); Assert.AreEqual(lastpacket?.Message, Game18NConstString.MinilandPublic); var miniland = _minilandProvider.GetMiniland(_session.Character.CharacterId); @@ -171,7 +171,7 @@ public async Task CanPrivateMinilandAsync() Parameter = MinilandState.Private, Type = 2 }; - await _mlEditPacketHandler!.ExecuteAsync(mleditPacket, _session!).ConfigureAwait(false); + await _mlEditPacketHandler!.ExecuteAsync(mleditPacket, _session!); var lastpacket = (MsgiPacket?)_session!.LastPackets.FirstOrDefault(s => s is MsgiPacket); Assert.AreEqual(lastpacket?.Message, Game18NConstString.MinilandPrivate); var miniland = _minilandProvider.GetMiniland(_session.Character.CharacterId); @@ -186,7 +186,7 @@ public async Task PrivateKickEveryoneButFriendAsync() Parameter = MinilandState.Private, Type = 2 }; - await _mlEditPacketHandler!.ExecuteAsync(mleditPacket, _session!).ConfigureAwait(false); + await _mlEditPacketHandler!.ExecuteAsync(mleditPacket, _session!); var miniland = _minilandProvider.GetMiniland(_session!.Character.CharacterId); Assert.AreEqual(MinilandState.Private, miniland.State); @@ -206,7 +206,7 @@ public async Task LockKickEveryoneAsync() Parameter = MinilandState.Lock, Type = 2 }; - await _mlEditPacketHandler!.ExecuteAsync(mleditPacket, _session!).ConfigureAwait(false); + await _mlEditPacketHandler!.ExecuteAsync(mleditPacket, _session!); var miniland = _minilandProvider.GetMiniland(_session!.Character.CharacterId); Assert.AreEqual(MinilandState.Lock, miniland.State); diff --git a/test/NosCore.PacketHandlers.Tests/Movement/PreqPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Movement/PreqPacketHandlerTests.cs index 044a126c4..66fc1e403 100644 --- a/test/NosCore.PacketHandlers.Tests/Movement/PreqPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Movement/PreqPacketHandlerTests.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -44,8 +44,8 @@ public class PreqPacketHandlerTests [TestInitialize] public async Task SetupAsync() { - await TestHelpers.ResetAsync().ConfigureAwait(false); - _session = await TestHelpers.Instance.GenerateSessionAsync().ConfigureAwait(false); + await TestHelpers.ResetAsync(); + _session = await TestHelpers.Instance.GenerateSessionAsync(); _minilandProvider = new Mock(); _mapChangeService = new Mock(); _minilandProvider.Setup(s => s.GetMinilandPortals(It.IsAny())).Returns(new List()); @@ -71,7 +71,7 @@ public async Task UserCanUsePortalAsync() { _session!.Character.PositionX = 0; _session.Character.PositionY = 0; - await _preqPacketHandler!.ExecuteAsync(new PreqPacket(), _session).ConfigureAwait(false); + await _preqPacketHandler!.ExecuteAsync(new PreqPacket(), _session); _mapChangeService!.Verify(x => x.ChangeMapInstanceAsync(_session, TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!.MapInstanceId, 5, 5), Times.Once); } @@ -83,7 +83,7 @@ public async Task UserLastPortalSetOnUsageAsync() _session.Character.PositionY = 0; var time = TestHelpers.Instance.Clock.GetCurrentInstant(); - await _preqPacketHandler!.ExecuteAsync(new PreqPacket(), _session).ConfigureAwait(false); + await _preqPacketHandler!.ExecuteAsync(new PreqPacket(), _session); Assert.IsTrue(_session.Character.LastPortal == time); } @@ -95,7 +95,7 @@ public async Task UserCanTUsePortalIfRecentlyMovedAsync() var time = TestHelpers.Instance.Clock.GetCurrentInstant(); _session.Character.LastPortal = time.Plus(Duration.FromMinutes(1)); _session.Character.LastMove = time; - await _preqPacketHandler!.ExecuteAsync(new PreqPacket(), _session).ConfigureAwait(false); + await _preqPacketHandler!.ExecuteAsync(new PreqPacket(), _session); _mapChangeService!.Verify(x => x.ChangeMapInstanceAsync(_session, TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!.MapInstanceId, 5, 5), Times.Never); } @@ -106,7 +106,7 @@ public async Task UserCanTUsePortalIfRecentlyUsedAsync() _session.Character.PositionY = 0; var time = TestHelpers.Instance.Clock.GetCurrentInstant(); _session.Character.LastPortal = time; - await _preqPacketHandler!.ExecuteAsync(new PreqPacket(), _session).ConfigureAwait(false); + await _preqPacketHandler!.ExecuteAsync(new PreqPacket(), _session); _mapChangeService!.Verify(x => x.ChangeMapInstanceAsync(_session, TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!.MapInstanceId, 5, 5), Times.Never); } @@ -116,7 +116,7 @@ public async Task UserCanTUsePortalIfTooFarAsync() { _session!.Character.PositionX = 8; _session.Character.PositionY = 8; - await _preqPacketHandler!.ExecuteAsync(new PreqPacket(), _session).ConfigureAwait(false); + await _preqPacketHandler!.ExecuteAsync(new PreqPacket(), _session); _mapChangeService!.Verify(x => x.ChangeMapInstanceAsync(_session, TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!.MapInstanceId, 5, 5), Times.Never); } @@ -128,7 +128,7 @@ public async Task UserFromInstanceGoesBackToOriginePlaceAsync() _session.Character.PositionX = 0; _session.Character.PositionY = 0; _session.Character.MapInstance.MapInstanceType = MapInstanceType.NormalInstance; - await _preqPacketHandler!.ExecuteAsync(new PreqPacket(), _session).ConfigureAwait(false); + await _preqPacketHandler!.ExecuteAsync(new PreqPacket(), _session); _mapChangeService!.Verify(x => x.ChangeMapAsync(_session, 1, 5, 5), Times.Once); } diff --git a/test/NosCore.PacketHandlers.Tests/Parcel/PclPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Parcel/PclPacketHandlerTests.cs index 00a823184..6cef4a97e 100644 --- a/test/NosCore.PacketHandlers.Tests/Parcel/PclPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Parcel/PclPacketHandlerTests.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -49,8 +49,8 @@ public class PclPacketHandlerTests [TestInitialize] public async Task SetupAsync() { - await TestHelpers.ResetAsync().ConfigureAwait(false); - _session = await TestHelpers.Instance.GenerateSessionAsync().ConfigureAwait(false); + await TestHelpers.ResetAsync(); + _session = await TestHelpers.Instance.GenerateSessionAsync(); _item = TestHelpers.Instance.GenerateItemProvider(); _mailHttpClient = new Mock(); _itemInstanceDao = new Mock>(); @@ -65,7 +65,7 @@ public async Task Test_GiftNotFoundAsync() { Type = 5, GiftId = 1 - }, _session!).ConfigureAwait(false); + }, _session!); var packet = (ParcelPacket?)_session!.LastPackets.FirstOrDefault(s => s is ParcelPacket); Assert.IsNull(packet); } @@ -89,7 +89,7 @@ public async Task Test_DeleteGiftAsync() { Type = 5, GiftId = 1 - }, _session!).ConfigureAwait(false); + }, _session!); var packet = (ParcelPacket?)_session!.LastPackets.FirstOrDefault(s => s is ParcelPacket); Assert.IsTrue(packet?.Type == 7); } @@ -113,7 +113,7 @@ public async Task Test_ReceiveGiftAsync() { Type = 4, GiftId = 1 - }, _session!).ConfigureAwait(false); + }, _session!); var packet = (ParcelPacket?)_session!.LastPackets.FirstOrDefault(s => s is ParcelPacket); Assert.IsTrue(packet?.Type == 2); } @@ -139,7 +139,7 @@ public async Task Test_ReceiveGiftNoPlaceAsync() { Type = 4, GiftId = 1 - }, _session!).ConfigureAwait(false); + }, _session!); var packet = (ParcelPacket?)_session!.LastPackets.FirstOrDefault(s => s is ParcelPacket); Assert.IsTrue(packet?.Type == 5); } diff --git a/test/NosCore.PacketHandlers.Tests/Shops/MShopPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Shops/MShopPacketHandlerTests.cs index 734eec94c..75ff37a39 100644 --- a/test/NosCore.PacketHandlers.Tests/Shops/MShopPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Shops/MShopPacketHandlerTests.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -74,10 +74,10 @@ public class MShopPacketHandlerTests [TestInitialize] public async Task SetupAsync() { - await TestHelpers.ResetAsync().ConfigureAwait(false); + await TestHelpers.ResetAsync(); Broadcaster.Reset(); - _session = await TestHelpers.Instance.GenerateSessionAsync().ConfigureAwait(false); + _session = await TestHelpers.Instance.GenerateSessionAsync(); _session.Character.MapInstance.Portals = new List { new() @@ -100,7 +100,7 @@ public async Task SetupAsync() [TestMethod] public async Task UserCanNotCreateShopCloseToPortalAsync() { - await _mShopPacketHandler!.ExecuteAsync(_shopPacket, _session!).ConfigureAwait(false); + await _mShopPacketHandler!.ExecuteAsync(_shopPacket, _session!); var packet = (InfoiPacket?)_session?.LastPackets.FirstOrDefault(s => s is InfoiPacket); Assert.IsTrue(packet?.Message == Game18NConstString.OpenShopAwayPortal); Assert.IsNull(_session?.Character.Shop); @@ -112,7 +112,7 @@ public async Task UserCanNotCreateShopInTeamAsync() _session!.Character.PositionX = 7; _session.Character.PositionY = 7; _session.Character.Group = new NosCore.GameObject.Services.GroupService.Group(GroupType.Team, new Mock().Object); - await _mShopPacketHandler!.ExecuteAsync(_shopPacket, _session).ConfigureAwait(false); + await _mShopPacketHandler!.ExecuteAsync(_shopPacket, _session); var packet = (SayiPacket?)_session.LastPackets.FirstOrDefault(s => s is SayiPacket); Assert.IsTrue(packet?.VisualType == VisualType.Player && packet?.VisualId == _session.Character.CharacterId && packet?.Type == SayColorType.Red && packet?.Message == Game18NConstString.TeammateCanNotOpenShop); Assert.IsNull(_session.Character.Shop); @@ -124,7 +124,7 @@ public async Task UserCanCreateShopInGroupAsync() _session!.Character.PositionX = 7; _session.Character.PositionY = 7; _session.Character.Group = new NosCore.GameObject.Services.GroupService.Group(GroupType.Group, new Mock().Object); - await _mShopPacketHandler!.ExecuteAsync(_shopPacket, _session).ConfigureAwait(false); + await _mShopPacketHandler!.ExecuteAsync(_shopPacket, _session); var packet = (SayiPacket?)_session.LastPackets.FirstOrDefault(s => s is SayiPacket); Assert.IsNull(packet); } @@ -134,7 +134,7 @@ public async Task UserCanNotCreateShopInNotShopAllowedMapsAsync() { _session!.Character.PositionX = 7; _session.Character.PositionY = 7; - await _mShopPacketHandler!.ExecuteAsync(_shopPacket, _session).ConfigureAwait(false); + await _mShopPacketHandler!.ExecuteAsync(_shopPacket, _session); var packet = (InfoiPacket?)_session.LastPackets.FirstOrDefault(s => s is InfoiPacket); Assert.IsTrue(packet?.Message == Game18NConstString.UseCommercialMapToShop); @@ -154,7 +154,7 @@ public async Task UserCanNotCreateShopWithMissingItemAsync() _session!.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(itemBuilder.Create(1, 1), 0)); _session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; - await _mShopPacketHandler!.ExecuteAsync(_shopPacket, _session).ConfigureAwait(false); + await _mShopPacketHandler!.ExecuteAsync(_shopPacket, _session); Assert.IsNull(_session.Character.Shop); } @@ -177,7 +177,7 @@ public async Task UserCanNotCreateShopWithMissingAmountItemAsync() NoscorePocketType.Etc, 2); _session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; - await _mShopPacketHandler!.ExecuteAsync(_shopPacket, _session).ConfigureAwait(false); + await _mShopPacketHandler!.ExecuteAsync(_shopPacket, _session); Assert.IsNull(_session.Character.Shop); var packet = (SayiPacket?)_session.LastPackets.FirstOrDefault(s => s is SayiPacket); Assert.IsTrue(packet?.VisualType == VisualType.Player && packet?.VisualId == _session.Character.CharacterId && packet?.Type == SayColorType.Red && packet?.Message == Game18NConstString.SomeItemsCannotBeTraded); @@ -201,7 +201,7 @@ public async Task UserCanCreateShopAsync() NoscorePocketType.Etc, 2); _session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; - await _mShopPacketHandler!.ExecuteAsync(_shopPacket, _session).ConfigureAwait(false); + await _mShopPacketHandler!.ExecuteAsync(_shopPacket, _session); Assert.IsNotNull(_session.Character.Shop); } @@ -224,7 +224,7 @@ public async Task UserCanNotCreateShopInExchangeAsync() NoscorePocketType.Etc, 2); _session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; - await _session!.HandlePacketsAsync(new[] { _shopPacket }).ConfigureAwait(false); + await _session!.HandlePacketsAsync(new[] { _shopPacket }); Assert.IsNull(_session.Character.Shop); } @@ -238,7 +238,7 @@ public async Task UserCanNotCreateEmptyShopAsync() Type = CreateShopPacketType.Open, ItemList = new List(), Name = "TEST SHOP" - }, _session).ConfigureAwait(false); + }, _session); Assert.IsNull(_session.Character.Shop); var packet = (SayiPacket?)_session.LastPackets.FirstOrDefault(s => s is SayiPacket); Assert.IsTrue(packet?.VisualType == VisualType.Player && packet?.VisualId == _session.Character.CharacterId && packet?.Type == SayColorType.Yellow && packet?.Message == Game18NConstString.NoItemToSell); diff --git a/test/NosCore.PacketHandlers.Tests/Shops/SellPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Shops/SellPacketHandlerTests.cs index f1cbde859..d19804aa5 100644 --- a/test/NosCore.PacketHandlers.Tests/Shops/SellPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Shops/SellPacketHandlerTests.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -54,10 +54,10 @@ public class SellPacketHandlerTests [TestInitialize] public async Task SetupAsync() { - await TestHelpers.ResetAsync().ConfigureAwait(false); + await TestHelpers.ResetAsync(); Broadcaster.Reset(); _instanceProvider = TestHelpers.Instance.MapInstanceAccessorService; - _session = await TestHelpers.Instance.GenerateSessionAsync().ConfigureAwait(false); + _session = await TestHelpers.Instance.GenerateSessionAsync(); _sellPacketHandler = new SellPacketHandler(TestHelpers.Instance.WorldConfiguration); } @@ -82,7 +82,7 @@ public async Task UserCanNotSellInExchangeAsync() _session.Character.MapInstance = _instanceProvider!.GetBaseMapById(1)!; await _sellPacketHandler!.ExecuteAsync(new SellPacket { Slot = 0, Amount = 1, Data = (short)NoscorePocketType.Etc }, - _session).ConfigureAwait(false); + _session); Assert.IsTrue(_session.Character.Gold == 0); Assert.IsNotNull(_session.Character.InventoryService.LoadBySlotAndType(0, NoscorePocketType.Etc)); } @@ -106,7 +106,7 @@ public async Task UserCanNotSellNotSoldableAsync() _session.Character.MapInstance = _instanceProvider!.GetBaseMapById(1)!; await _sellPacketHandler!.ExecuteAsync(new SellPacket { Slot = 0, Amount = 1, Data = (short)NoscorePocketType.Etc }, - _session).ConfigureAwait(false); + _session); var packet = (SMemoiPacket?)_session.LastPackets.FirstOrDefault(s => s is SMemoiPacket); Assert.IsTrue(packet?.Type == SMemoType.FailNpc && packet?.Message == Game18NConstString.ItemCanNotBeSold); Assert.IsTrue(_session.Character.Gold == 0); @@ -132,7 +132,7 @@ public async Task UserCanSellAsync() _session.Character.MapInstance = _instanceProvider!.GetBaseMapById(1)!; await _sellPacketHandler!.ExecuteAsync(new SellPacket { Slot = 0, Amount = 1, Data = (short)NoscorePocketType.Etc }, - _session).ConfigureAwait(false); + _session); Assert.IsTrue(_session.Character.Gold > 0); Assert.IsNull(_session.Character.InventoryService.LoadBySlotAndType(0, NoscorePocketType.Etc)); } diff --git a/test/NosCore.Tests.Shared/TestHelpers.cs b/test/NosCore.Tests.Shared/TestHelpers.cs index 698cf5ca7..41b6ffa6d 100644 --- a/test/NosCore.Tests.Shared/TestHelpers.cs +++ b/test/NosCore.Tests.Shared/TestHelpers.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -250,7 +250,7 @@ private async Task GenerateMapInstanceProviderAsync() } }; var npc = new MapNpcDto(); - await _mapNpcDao.TryInsertOrUpdateAsync(npc).ConfigureAwait(false); + await _mapNpcDao.TryInsertOrUpdateAsync(npc); var mapInstanceRegistry = new MapInstanceRegistry(); MapInstanceAccessorService = new MapInstanceAccessorService(mapInstanceRegistry); var mapChangeService = new MapChangeService(new Mock().Object, new Mock().Object, new Mock().Object, @@ -261,9 +261,9 @@ private async Task GenerateMapInstanceProviderAsync() _mapNpcDao, _mapMonsterDao, _portalDao, _shopItemDao, _logger, new EventLoaderService(new List>()), mapInstanceRegistry, MapInstanceAccessorService, Instance.Clock, Instance.LogLanguageLocalizer, mapChangeService, sessionGroupFactory, SessionRegistry); - await instanceGeneratorService.InitializeAsync().ConfigureAwait(false); + await instanceGeneratorService.InitializeAsync(); await instanceGeneratorService.AddMapInstanceAsync(new MapInstance(miniland, MinilandId, false, - MapInstanceType.NormalInstance, MapItemProvider, _logger, Clock, mapChangeService, sessionGroupFactory, SessionRegistry)).ConfigureAwait(false); + MapInstanceType.NormalInstance, MapItemProvider, _logger, Clock, mapChangeService, sessionGroupFactory, SessionRegistry)); MapInstanceGeneratorService = instanceGeneratorService; } @@ -312,7 +312,7 @@ public async Task GenerateSessionAsync(List? pack _lastId++; var acc = new AccountDto { AccountId = _lastId, Name = "AccountTest" + _lastId, Password = new Sha512Hasher().Hash("test") }; - acc = await AccountDao.TryInsertOrUpdateAsync(acc).ConfigureAwait(false); + acc = await AccountDao.TryInsertOrUpdateAsync(acc); var sessionRefHolder = new SessionRefHolder(); var handlers = packetHandlers ?? new List { @@ -364,13 +364,13 @@ public async Task GenerateSessionAsync(List? pack StaticBonusList = new List(), Titles = new List() }; - await CharacterDao.TryInsertOrUpdateAsync(chara).ConfigureAwait(false); + await CharacterDao.TryInsertOrUpdateAsync(chara); var mockChannel = new Mock(); mockChannel.Setup(s => s.Id).Returns(Guid.NewGuid().ToString()); session.RegisterChannel(mockChannel.Object); session.InitializeAccount(acc); chara.MapInstance = MapInstanceAccessorService.GetBaseMapById(0)!; - await session.SetCharacterAsync(chara).ConfigureAwait(false); + await session.SetCharacterAsync(chara); session.Character.InitializeGroup(); session.Account = acc; return session; @@ -380,7 +380,7 @@ public static async Task ResetAsync() { _lazy = new Lazy(() => new TestHelpers()); Instance.InitDatabase(); - await Instance.GenerateMapInstanceProviderAsync().ConfigureAwait(false); + await Instance.GenerateMapInstanceProviderAsync(); } } } \ No newline at end of file diff --git a/test/NosCore.WebApi.Tests/ApiTests/AuthControllerTests.cs b/test/NosCore.WebApi.Tests/ApiTests/AuthControllerTests.cs index dfe5da579..a04de058e 100644 --- a/test/NosCore.WebApi.Tests/ApiTests/AuthControllerTests.cs +++ b/test/NosCore.WebApi.Tests/ApiTests/AuthControllerTests.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -54,8 +54,8 @@ public class AuthControllerTests public async Task Setup() { _authCodeService = new AuthCodeService(); - await TestHelpers.ResetAsync().ConfigureAwait(false); - _session = await TestHelpers.Instance.GenerateSessionAsync().ConfigureAwait(false); + await TestHelpers.ResetAsync(); + _session = await TestHelpers.Instance.GenerateSessionAsync(); _logger = new Mock>(); _controller = new AuthController(Options.Create(new WebApiConfiguration() { From 057ebcd1f3681a71e4059e268961ef1d0f4a86d4 Mon Sep 17 00:00:00 2001 From: erwan-joly Date: Mon, 19 Jan 2026 21:41:59 +1300 Subject: [PATCH 3/4] optimise/cleanup --- src/NosCore.Core/NosCore.Core.csproj | 2 +- .../CommandPacketHeaderAttribute.cs | 2 +- src/NosCore.Data/WebApi/WarehouseLink.cs | 2 + .../ComponentEntities/Entities/Character.cs | 21 +- .../ComponentEntities/Entities/MapMonster.cs | 3 +- .../ComponentEntities/Entities/MapNpc.cs | 2 + .../Hubs/BazaarHub/BazaarHub.cs | 2 +- .../Hubs/BazaarHub/BazaarHubClient.cs | 57 ++-- .../Hubs/BazaarHub/IBazaarHub.cs | 2 +- .../Hubs/BlacklistHub/BlacklistHubClient.cs | 46 ++- .../Hubs/FriendHub/FriendHubClient.cs | 46 ++- .../Hubs/MailHub/MailHubClient.cs | 56 ++-- .../Hubs/WarehouseHub/WarehouseHubClient.cs | 46 +-- .../Services/BazaarService/BazaarService.cs | 15 +- .../Services/BazaarService/IBazaarService.cs | 2 +- .../BroadcastService/SessionRegistry.cs | 31 +- .../ExchangeRequestRegistry.cs | 46 ++- .../ExchangeService/ExchangeService.cs | 89 ++++-- .../InventoryService/IInventoryService.cs | 9 +- .../InventoryService/InventoryItemInstance.cs | 13 +- .../InventoryService/InventoryService.cs | 85 ++++-- .../Services/LoginService/LoginService.cs | 2 +- .../WarehouseService/IWarehouseService.cs | 15 + .../WarehouseService/WarehouseItem.cs | 15 +- .../WarehouseService/WarehouseService.cs | 268 ++++++++++++++++-- .../LoginServerBootstrap.cs | 1 - .../NosCore.LoginServer.csproj | 4 +- .../Bazaar/CBuyPacketHandler.cs | 9 +- .../Bazaar/CRegPacketHandler.cs | 10 + .../Bazaar/CScalcPacketHandler.cs | 29 +- .../Shops/MShopPacketHandler.cs | 7 +- .../Shops/SellPacketHandler.cs | 16 +- src/NosCore.Parser/NosCore.Parser.csproj | 4 +- .../NosCore.WorldServer.csproj | 6 +- .../WorldServerBootstrap.cs | 6 +- .../NosCore.Core.Tests.csproj | 5 +- .../NosCore.Database.Tests.csproj | 5 +- .../NosCore.GameObject.Tests.csproj | 5 +- .../NosCore.PacketHandlers.Tests.csproj | 5 +- .../NosCore.Tests.Shared.csproj | 5 +- .../NosCore.WebApi.Tests.csproj | 5 +- 41 files changed, 695 insertions(+), 304 deletions(-) diff --git a/src/NosCore.Core/NosCore.Core.csproj b/src/NosCore.Core/NosCore.Core.csproj index 13c37b249..2d92dc0cb 100644 --- a/src/NosCore.Core/NosCore.Core.csproj +++ b/src/NosCore.Core/NosCore.Core.csproj @@ -37,7 +37,7 @@ - + diff --git a/src/NosCore.Data/CommandPackets/CommandPacketHeaderAttribute.cs b/src/NosCore.Data/CommandPackets/CommandPacketHeaderAttribute.cs index f8b684511..04a6257e5 100644 --- a/src/NosCore.Data/CommandPackets/CommandPacketHeaderAttribute.cs +++ b/src/NosCore.Data/CommandPackets/CommandPacketHeaderAttribute.cs @@ -23,7 +23,7 @@ namespace NosCore.Data.CommandPackets { - public class CommandPacketHeaderAttribute(string identification, AuthorityType authority) : PacketHeaderAttribute(identification, Scope.InGame | Scope.InGame) + public class CommandPacketHeaderAttribute(string identification, AuthorityType authority) : PacketHeaderAttribute(identification, Scope.InGame) { public AuthorityType Authority { get; } = authority; } diff --git a/src/NosCore.Data/WebApi/WarehouseLink.cs b/src/NosCore.Data/WebApi/WarehouseLink.cs index f0a0742b8..3d423c0e1 100644 --- a/src/NosCore.Data/WebApi/WarehouseLink.cs +++ b/src/NosCore.Data/WebApi/WarehouseLink.cs @@ -25,6 +25,8 @@ public class WarehouseLink { public WarehouseDto? Warehouse { get; set; } + public short Slot { get; set; } + //todo move this to a generic ItemInstance with a converter public ItemInstanceDto? ItemInstance { get; set; } } diff --git a/src/NosCore.GameObject/ComponentEntities/Entities/Character.cs b/src/NosCore.GameObject/ComponentEntities/Entities/Character.cs index 7173de742..83cc89bc6 100644 --- a/src/NosCore.GameObject/ComponentEntities/Entities/Character.cs +++ b/src/NosCore.GameObject/ComponentEntities/Entities/Character.cs @@ -491,14 +491,31 @@ public async Task CloseShopAsync() public async Task BuyAsync(Shop shop, short slot, short amount) { + if (amount <= 0) + { + return; + } + var item = shop.ShopItems.Values.FirstOrDefault(it => it.Slot == slot); if (item == null) { return; } - var price = item.Price ?? item.ItemInstance!.Item.Price * amount; - var reputprice = item.Price == null ? item.ItemInstance!.Item.ReputPrice * amount : 0; + var itemPrice = item.Price ?? item.ItemInstance!.Item.Price; + if (itemPrice < 0 || itemPrice > long.MaxValue / amount) + { + return; + } + var price = itemPrice * amount; + + var itemReputPrice = item.Price == null ? item.ItemInstance!.Item.ReputPrice : 0; + if (itemReputPrice < 0 || itemReputPrice > long.MaxValue / amount) + { + return; + } + var reputprice = itemReputPrice * amount; + var percent = DignityIcon switch { DignityType.Dreadful => 1.1, diff --git a/src/NosCore.GameObject/ComponentEntities/Entities/MapMonster.cs b/src/NosCore.GameObject/ComponentEntities/Entities/MapMonster.cs index 0ca6171d6..81dc4eb5d 100644 --- a/src/NosCore.GameObject/ComponentEntities/Entities/MapMonster.cs +++ b/src/NosCore.GameObject/ComponentEntities/Entities/MapMonster.cs @@ -100,6 +100,8 @@ internal void StopLife() public Task StartLifeAsync() { + Life?.Dispose(); + async Task LifeAsync() { try @@ -113,7 +115,6 @@ async Task LifeAsync() { logger.Error(e.Message, e); } - } Life = Observable.Interval(TimeSpan.FromMilliseconds(400)).Select(_ => LifeAsync()).Subscribe(); return Task.CompletedTask; diff --git a/src/NosCore.GameObject/ComponentEntities/Entities/MapNpc.cs b/src/NosCore.GameObject/ComponentEntities/Entities/MapNpc.cs index f04fabac3..fe294fc6f 100644 --- a/src/NosCore.GameObject/ComponentEntities/Entities/MapNpc.cs +++ b/src/NosCore.GameObject/ComponentEntities/Entities/MapNpc.cs @@ -134,6 +134,8 @@ internal void StopLife() public Task StartLifeAsync() { + Life?.Dispose(); + async Task LifeAsync() { try diff --git a/src/NosCore.GameObject/InterChannelCommunication/Hubs/BazaarHub/BazaarHub.cs b/src/NosCore.GameObject/InterChannelCommunication/Hubs/BazaarHub/BazaarHub.cs index d2645de3a..433a432d6 100644 --- a/src/NosCore.GameObject/InterChannelCommunication/Hubs/BazaarHub/BazaarHub.cs +++ b/src/NosCore.GameObject/InterChannelCommunication/Hubs/BazaarHub/BazaarHub.cs @@ -33,7 +33,7 @@ public Task> GetBazaar(long id, byte? index, byte? pageSize, Ba byte? subTypeFilter, byte? levelFilter, byte? rareFilter, byte? upgradeFilter, long? sellerFilter) => Task.FromResult(bazaarService.GetBazaar(id, index, pageSize, typeFilter, subTypeFilter, levelFilter, rareFilter, upgradeFilter, sellerFilter)); - public Task DeleteBazaarAsync(long id, short count, string requestCharacterName) => bazaarService.DeleteBazaarAsync(id, count, requestCharacterName); + public Task DeleteBazaarAsync(long id, short count, string requestCharacterName, long? requestCharacterId = null) => bazaarService.DeleteBazaarAsync(id, count, requestCharacterName, requestCharacterId); public Task AddBazaarAsync( BazaarRequest bazaarRequest) => bazaarService.AddBazaarAsync(bazaarRequest.ItemInstanceId, bazaarRequest.CharacterId, bazaarRequest.CharacterName, bazaarRequest.HasMedal, bazaarRequest.Price, bazaarRequest.IsPackage, bazaarRequest.Duration, bazaarRequest.Amount); diff --git a/src/NosCore.GameObject/InterChannelCommunication/Hubs/BazaarHub/BazaarHubClient.cs b/src/NosCore.GameObject/InterChannelCommunication/Hubs/BazaarHub/BazaarHubClient.cs index f9cd7d297..1f77693e7 100644 --- a/src/NosCore.GameObject/InterChannelCommunication/Hubs/BazaarHub/BazaarHubClient.cs +++ b/src/NosCore.GameObject/InterChannelCommunication/Hubs/BazaarHub/BazaarHubClient.cs @@ -1,67 +1,46 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . using System.Collections.Generic; using System.Threading.Tasks; -using Microsoft.AspNetCore.SignalR.Client; using NosCore.Data.Enumerations.I18N; using NosCore.Data.WebApi; using NosCore.Packets.Enumerations; +using Serilog; namespace NosCore.GameObject.InterChannelCommunication.Hubs.BazaarHub { - public class BazaarHubClient(HubConnectionFactory hubConnectionFactory) : IBazaarHub + public class BazaarHubClient(HubConnectionFactory hubConnectionFactory, ILogger logger) + : BaseHubClient(hubConnectionFactory, nameof(BazaarHub), logger), IBazaarHub { - private readonly HubConnection _hubConnection = hubConnectionFactory.Create(nameof(BazaarHub)); - - public async Task> GetBazaar(long id, byte? index, byte? pageSize, BazaarListType? typeFilter, - byte? subTypeFilter, byte? levelFilter, byte? rareFilter, byte? upgradeFilter, long? sellerFilter) - { - await _hubConnection.StartAsync(); - var result = await _hubConnection.InvokeAsync>(nameof(GetBazaar), id, index, pageSize, typeFilter, + public Task> GetBazaar(long id, byte? index, byte? pageSize, BazaarListType? typeFilter, + byte? subTypeFilter, byte? levelFilter, byte? rareFilter, byte? upgradeFilter, long? sellerFilter) => + InvokeAsync>(nameof(GetBazaar), id, index, pageSize, typeFilter, subTypeFilter, levelFilter, rareFilter, upgradeFilter, sellerFilter); - await _hubConnection.StopAsync(); - return result; - } - public async Task DeleteBazaarAsync(long id, short count, string requestCharacterName) - { - await _hubConnection.StartAsync(); - var result = await _hubConnection.InvokeAsync(nameof(DeleteBazaarAsync), id, count, requestCharacterName); - await _hubConnection.StopAsync(); - return result; - } + public Task DeleteBazaarAsync(long id, short count, string requestCharacterName, long? requestCharacterId = null) => + InvokeAsync(nameof(DeleteBazaarAsync), id, count, requestCharacterName, requestCharacterId); - public async Task AddBazaarAsync(BazaarRequest bazaarRequest) - { - await _hubConnection.StartAsync(); - var result = await _hubConnection.InvokeAsync(nameof(AddBazaarAsync), bazaarRequest); - await _hubConnection.StopAsync(); - return result; - } + public Task AddBazaarAsync(BazaarRequest bazaarRequest) => + InvokeAsync(nameof(AddBazaarAsync), bazaarRequest); - public async Task ModifyBazaarAsync(long id, Json.Patch.JsonPatch bzMod) - { - await _hubConnection.StartAsync(); - var result = await _hubConnection.InvokeAsync(nameof(ModifyBazaarAsync), id, bzMod); - await _hubConnection.StopAsync(); - return result; - } + public Task ModifyBazaarAsync(long id, Json.Patch.JsonPatch bzMod) => + InvokeAsync(nameof(ModifyBazaarAsync), id, bzMod); } -} \ No newline at end of file +} diff --git a/src/NosCore.GameObject/InterChannelCommunication/Hubs/BazaarHub/IBazaarHub.cs b/src/NosCore.GameObject/InterChannelCommunication/Hubs/BazaarHub/IBazaarHub.cs index c3054f374..d7ba5987d 100644 --- a/src/NosCore.GameObject/InterChannelCommunication/Hubs/BazaarHub/IBazaarHub.cs +++ b/src/NosCore.GameObject/InterChannelCommunication/Hubs/BazaarHub/IBazaarHub.cs @@ -29,7 +29,7 @@ public interface IBazaarHub { Task> GetBazaar(long id, byte? index, byte? pageSize, BazaarListType? typeFilter, byte? subTypeFilter, byte? levelFilter, byte? rareFilter, byte? upgradeFilter, long? sellerFilter); - Task DeleteBazaarAsync(long id, short count, string requestCharacterName); + Task DeleteBazaarAsync(long id, short count, string requestCharacterName, long? requestCharacterId = null); Task AddBazaarAsync(BazaarRequest bazaarRequest); Task ModifyBazaarAsync(long id, Json.Patch.JsonPatch bzMod); } \ No newline at end of file diff --git a/src/NosCore.GameObject/InterChannelCommunication/Hubs/BlacklistHub/BlacklistHubClient.cs b/src/NosCore.GameObject/InterChannelCommunication/Hubs/BlacklistHub/BlacklistHubClient.cs index e06751e7a..d30c78134 100644 --- a/src/NosCore.GameObject/InterChannelCommunication/Hubs/BlacklistHub/BlacklistHubClient.cs +++ b/src/NosCore.GameObject/InterChannelCommunication/Hubs/BlacklistHub/BlacklistHubClient.cs @@ -1,55 +1,41 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . using System; using System.Collections.Generic; using System.Threading.Tasks; -using Microsoft.AspNetCore.SignalR.Client; using NosCore.Data.Enumerations.I18N; using NosCore.Data.WebApi; +using Serilog; namespace NosCore.GameObject.InterChannelCommunication.Hubs.BlacklistHub { - public class BlacklistHubClient(HubConnectionFactory hubConnectionFactory) : IBlacklistHub + public class BlacklistHubClient(HubConnectionFactory hubConnectionFactory, ILogger logger) + : BaseHubClient(hubConnectionFactory, nameof(BlacklistHub), logger), IBlacklistHub { - private readonly HubConnection _hubConnection = hubConnectionFactory.Create(nameof(BlacklistHub)); + public Task AddBlacklistAsync(BlacklistRequest blacklistRequest) => + InvokeAsync(nameof(AddBlacklistAsync), blacklistRequest); - public async Task AddBlacklistAsync(BlacklistRequest blacklistRequest) - { - await _hubConnection.StartAsync(); - var result = await _hubConnection.InvokeAsync(nameof(AddBlacklistAsync), blacklistRequest); - await _hubConnection.StopAsync(); - return result; - } - public async Task> GetBlacklistedAsync(long id) - { - await _hubConnection.StartAsync(); - var result = await _hubConnection.InvokeAsync>(nameof(GetBlacklistedAsync), id); - await _hubConnection.StopAsync(); - return result; - } - public async Task DeleteAsync(Guid id) - { - await _hubConnection.StartAsync(); - var result = await _hubConnection.InvokeAsync(nameof(DeleteAsync), id); - await _hubConnection.StopAsync(); - return result; - } + public Task> GetBlacklistedAsync(long id) => + InvokeAsync>(nameof(GetBlacklistedAsync), id); + + public Task DeleteAsync(Guid id) => + InvokeAsync(nameof(DeleteAsync), id); } -} \ No newline at end of file +} diff --git a/src/NosCore.GameObject/InterChannelCommunication/Hubs/FriendHub/FriendHubClient.cs b/src/NosCore.GameObject/InterChannelCommunication/Hubs/FriendHub/FriendHubClient.cs index 8b8533a4e..bb45e2f15 100644 --- a/src/NosCore.GameObject/InterChannelCommunication/Hubs/FriendHub/FriendHubClient.cs +++ b/src/NosCore.GameObject/InterChannelCommunication/Hubs/FriendHub/FriendHubClient.cs @@ -1,55 +1,41 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . using System; using System.Collections.Generic; using System.Threading.Tasks; -using Microsoft.AspNetCore.SignalR.Client; using NosCore.Data.Enumerations.I18N; using NosCore.Data.WebApi; +using Serilog; namespace NosCore.GameObject.InterChannelCommunication.Hubs.FriendHub { - public class FriendHubClient(HubConnectionFactory hubConnectionFactory) : IFriendHub + public class FriendHubClient(HubConnectionFactory hubConnectionFactory, ILogger logger) + : BaseHubClient(hubConnectionFactory, nameof(FriendHub), logger), IFriendHub { - private readonly HubConnection _hubConnection = hubConnectionFactory.Create(nameof(FriendHub)); + public Task AddFriendAsync(FriendShipRequest friendPacket) => + InvokeAsync(nameof(AddFriendAsync), friendPacket); - public async Task AddFriendAsync(FriendShipRequest friendPacket) - { - await _hubConnection.StartAsync(); - var result = await _hubConnection.InvokeAsync(nameof(AddFriendAsync), friendPacket); - await _hubConnection.StopAsync(); - return result; - } - public async Task> GetFriendsAsync(long id) - { - await _hubConnection.StartAsync(); - var result = await _hubConnection.InvokeAsync>(nameof(GetFriendsAsync), id); - await _hubConnection.StopAsync(); - return result; - } - public async Task DeleteAsync(Guid id) - { - await _hubConnection.StartAsync(); - var result = await _hubConnection.InvokeAsync(nameof(DeleteAsync), id); - await _hubConnection.StopAsync(); - return result; - } + public Task> GetFriendsAsync(long id) => + InvokeAsync>(nameof(GetFriendsAsync), id); + + public Task DeleteAsync(Guid id) => + InvokeAsync(nameof(DeleteAsync), id); } -} \ No newline at end of file +} diff --git a/src/NosCore.GameObject/InterChannelCommunication/Hubs/MailHub/MailHubClient.cs b/src/NosCore.GameObject/InterChannelCommunication/Hubs/MailHub/MailHubClient.cs index 973e138ff..7adec906d 100644 --- a/src/NosCore.GameObject/InterChannelCommunication/Hubs/MailHub/MailHubClient.cs +++ b/src/NosCore.GameObject/InterChannelCommunication/Hubs/MailHub/MailHubClient.cs @@ -1,62 +1,44 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . using System.Collections.Generic; using System.Threading.Tasks; using Json.Patch; -using Microsoft.AspNetCore.SignalR.Client; using NosCore.Data.WebApi; using NosCore.GameObject.InterChannelCommunication.Messages; +using Serilog; namespace NosCore.GameObject.InterChannelCommunication.Hubs.MailHub { - public class MailHubClient(HubConnectionFactory hubConnectionFactory) : IMailHub + public class MailHubClient(HubConnectionFactory hubConnectionFactory, ILogger logger) + : BaseHubClient(hubConnectionFactory, nameof(MailHub), logger), IMailHub { - private readonly HubConnection _hubConnection = hubConnectionFactory.Create(nameof(MailHub)); + public Task> GetMails(long id, long characterId, bool senderCopy) => + InvokeAsync>(nameof(GetMails), id, characterId, senderCopy); - public async Task> GetMails(long id, long characterId, bool senderCopy) - { - await _hubConnection.StartAsync(); - var result = await _hubConnection.InvokeAsync>(nameof(GetMails), id, characterId, senderCopy); - await _hubConnection.StopAsync(); - return result; - } - public async Task DeleteMailAsync(long id, long characterId, bool senderCopy) - { - await _hubConnection.StartAsync(); - var result = await _hubConnection.InvokeAsync(nameof(DeleteMailAsync), id, characterId, senderCopy); - await _hubConnection.StopAsync(); - return result; - } - public async Task ViewMailAsync(long id, JsonPatch mailData) - { - await _hubConnection.StartAsync(); - var result = await _hubConnection.InvokeAsync(nameof(ViewMailAsync), id, mailData); - await _hubConnection.StopAsync(); - return result; - } - public async Task SendMailAsync(MailRequest mail) - { - await _hubConnection.StartAsync(); - var result = await _hubConnection.InvokeAsync(nameof(SendMailAsync), mail); - await _hubConnection.StopAsync(); - return result; - } + public Task DeleteMailAsync(long id, long characterId, bool senderCopy) => + InvokeAsync(nameof(DeleteMailAsync), id, characterId, senderCopy); + + public Task ViewMailAsync(long id, JsonPatch mailData) => + InvokeAsync(nameof(ViewMailAsync), id, mailData); + + public Task SendMailAsync(MailRequest mail) => + InvokeAsync(nameof(SendMailAsync), mail); } -} \ No newline at end of file +} diff --git a/src/NosCore.GameObject/InterChannelCommunication/Hubs/WarehouseHub/WarehouseHubClient.cs b/src/NosCore.GameObject/InterChannelCommunication/Hubs/WarehouseHub/WarehouseHubClient.cs index fe9c22fc8..d17494cca 100644 --- a/src/NosCore.GameObject/InterChannelCommunication/Hubs/WarehouseHub/WarehouseHubClient.cs +++ b/src/NosCore.GameObject/InterChannelCommunication/Hubs/WarehouseHub/WarehouseHubClient.cs @@ -1,57 +1,41 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . using System; using System.Collections.Generic; using System.Threading.Tasks; -using Microsoft.AspNetCore.SignalR.Client; using NosCore.Data.Enumerations.Miniland; using NosCore.Data.WebApi; +using Serilog; namespace NosCore.GameObject.InterChannelCommunication.Hubs.WarehouseHub { - public class WarehouseHubClient(HubConnectionFactory hubConnectionFactory) : IWarehouseHub + public class WarehouseHubClient(HubConnectionFactory hubConnectionFactory, ILogger logger) + : BaseHubClient(hubConnectionFactory, nameof(WarehouseHub), logger), IWarehouseHub { - private readonly HubConnection _hubConnection = hubConnectionFactory.Create(nameof(WarehouseHub)); + public Task> GetWarehouseItems(Guid? id, long? ownerId, WarehouseType warehouseType, byte? slot) => + InvokeAsync>(nameof(GetWarehouseItems), id, ownerId, warehouseType, slot); + public Task DeleteWarehouseItemAsync(Guid id) => + InvokeAsync(nameof(DeleteWarehouseItemAsync), id); - public async Task> GetWarehouseItems(Guid? id, long? ownerId, WarehouseType warehouseType, byte? slot) - { - await _hubConnection.StartAsync(); - var result = await _hubConnection.InvokeAsync>(nameof(GetWarehouseItems), id, ownerId, warehouseType, slot); - await _hubConnection.StopAsync(); - return result; - } - public async Task DeleteWarehouseItemAsync(Guid id) - { - await _hubConnection.StartAsync(); - var result = await _hubConnection.InvokeAsync(nameof(DeleteWarehouseItemAsync), id); - await _hubConnection.StopAsync(); - return result; - } - - public async Task AddWarehouseItemAsync(WareHouseDepositRequest depositRequest) - { - await _hubConnection.StartAsync(); - var result = await _hubConnection.InvokeAsync(nameof(AddWarehouseItemAsync), depositRequest); - await _hubConnection.StopAsync(); - return result; - } + public Task AddWarehouseItemAsync(WareHouseDepositRequest depositRequest) => + InvokeAsync(nameof(AddWarehouseItemAsync), depositRequest); } -} \ No newline at end of file +} diff --git a/src/NosCore.GameObject/Services/BazaarService/BazaarService.cs b/src/NosCore.GameObject/Services/BazaarService/BazaarService.cs index 457e9be0a..9944f9c6d 100644 --- a/src/NosCore.GameObject/Services/BazaarService/BazaarService.cs +++ b/src/NosCore.GameObject/Services/BazaarService/BazaarService.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -165,7 +165,7 @@ public List GetBazaar(long id, byte? index, byte? pageSize, BazaarLi return bzlist.Skip(index ?? 0 * pageSize ?? 0).Take((byte)(pageSize ?? bzlist.Count)).ToList(); } - public async Task DeleteBazaarAsync(long id, short count, string requestCharacterName) + public async Task DeleteBazaarAsync(long id, short count, string requestCharacterName, long? requestCharacterId = null) { var bzlink = bazaarRegistry.GetById(id); if (bzlink == null) @@ -173,12 +173,12 @@ public async Task DeleteBazaarAsync(long id, short count, string requestCh throw new ArgumentException(); } - if ((bzlink.ItemInstance?.Amount - count < 0) || (count < 0)) + if ((bzlink.ItemInstance?.Amount - count < 0) || (count <= 0)) { return false; } - if ((bzlink.ItemInstance?.Amount == count) && (requestCharacterName == bzlink.SellerName)) + if (bzlink.ItemInstance?.Amount == count) { await bazaarItemDao.TryDeleteAsync(bzlink.BazaarItem!.BazaarItemId); bazaarRegistry.Unregister(bzlink.BazaarItem.BazaarItemId); @@ -189,6 +189,13 @@ public async Task DeleteBazaarAsync(long id, short count, string requestCh var item = (IItemInstanceDto)bzlink.ItemInstance!; item.Amount -= count; await itemInstanceDao.TryInsertOrUpdateAsync(item); + + if (item.Amount <= 0) + { + await bazaarItemDao.TryDeleteAsync(bzlink.BazaarItem!.BazaarItemId); + bazaarRegistry.Unregister(bzlink.BazaarItem.BazaarItemId); + await itemInstanceDao.TryDeleteAsync(item.Id); + } } return true; diff --git a/src/NosCore.GameObject/Services/BazaarService/IBazaarService.cs b/src/NosCore.GameObject/Services/BazaarService/IBazaarService.cs index 0cf6eac46..5471a668e 100644 --- a/src/NosCore.GameObject/Services/BazaarService/IBazaarService.cs +++ b/src/NosCore.GameObject/Services/BazaarService/IBazaarService.cs @@ -31,7 +31,7 @@ public interface IBazaarService List GetBazaar(long id, byte? index, byte? pageSize, BazaarListType? typeFilter, byte? subTypeFilter, byte? levelFilter, byte? rareFilter, byte? upgradeFilter, long? sellerFilter); - Task DeleteBazaarAsync(long id, short count, string requestCharacterName); + Task DeleteBazaarAsync(long id, short count, string requestCharacterName, long? requestCharacterId = null); Task AddBazaarAsync(Guid itemInstanceId, long characterId, string? characterName, bool hasMedal, long price, bool isPackage, short duration, short amount); diff --git a/src/NosCore.GameObject/Services/BroadcastService/SessionRegistry.cs b/src/NosCore.GameObject/Services/BroadcastService/SessionRegistry.cs index dfc4fd138..c40debc7c 100644 --- a/src/NosCore.GameObject/Services/BroadcastService/SessionRegistry.cs +++ b/src/NosCore.GameObject/Services/BroadcastService/SessionRegistry.cs @@ -25,10 +25,11 @@ using NosCore.Data.WebApi; using NosCore.GameObject.ComponentEntities.Interfaces; using NosCore.Packets.Interfaces; +using Serilog; namespace NosCore.GameObject.Services.BroadcastService { - public class SessionRegistry : ISessionRegistry + public class SessionRegistry(ILogger logger) : ISessionRegistry { private readonly ConcurrentDictionary _sessionsByChannelId = new(); private readonly ConcurrentDictionary _channelIdByCharacterId = new(); @@ -110,14 +111,36 @@ public IEnumerable GetCharacters(Func? public async Task BroadcastPacketAsync(IPacket packet) { - await Task.WhenAll(_sessionsByChannelId.Values.Select(s => s.Sender.SendPacketAsync(packet))); + var tasks = _sessionsByChannelId.Values.Select(async s => + { + try + { + await s.Sender.SendPacketAsync(packet); + } + catch (Exception ex) + { + logger.Warning(ex, "Broadcast to {ChannelId} failed", s.ChannelId); + } + }); + await Task.WhenAll(tasks); } public async Task BroadcastPacketAsync(IPacket packet, string excludeChannelId) { - await Task.WhenAll(_sessionsByChannelId.Values + var tasks = _sessionsByChannelId.Values .Where(s => s.ChannelId != excludeChannelId) - .Select(s => s.Sender.SendPacketAsync(packet))); + .Select(async s => + { + try + { + await s.Sender.SendPacketAsync(packet); + } + catch (Exception ex) + { + logger.Warning(ex, "Broadcast to {ChannelId} failed", s.ChannelId); + } + }); + await Task.WhenAll(tasks); } public async Task DisconnectByCharacterIdAsync(long characterId) diff --git a/src/NosCore.GameObject/Services/ExchangeService/ExchangeRequestRegistry.cs b/src/NosCore.GameObject/Services/ExchangeService/ExchangeRequestRegistry.cs index ce092ab42..db7099b60 100644 --- a/src/NosCore.GameObject/Services/ExchangeService/ExchangeRequestRegistry.cs +++ b/src/NosCore.GameObject/Services/ExchangeService/ExchangeRequestRegistry.cs @@ -19,14 +19,14 @@ using System.Collections.Concurrent; using System.Collections.Generic; -using System.Linq; namespace NosCore.GameObject.Services.ExchangeService { public class ExchangeRequestRegistry : IExchangeRequestRegistry { private readonly ConcurrentDictionary _exchangeDatas = new(); - private readonly ConcurrentDictionary _exchangeRequests = new(); + private readonly ConcurrentDictionary _initiatorToTarget = new(); + private readonly ConcurrentDictionary _targetToInitiator = new(); public ExchangeData? GetExchangeData(long characterId) => _exchangeDatas.TryGetValue(characterId, out var data) ? data : null; @@ -38,21 +38,47 @@ public bool RemoveExchangeData(long characterId) => _exchangeDatas.TryRemove(characterId, out _); public long? GetExchangeRequest(long characterId) => - _exchangeRequests.TryGetValue(characterId, out var targetId) ? targetId : null; + _initiatorToTarget.TryGetValue(characterId, out var targetId) ? targetId : null; public KeyValuePair? GetExchangeRequestPair(long characterId) { - var pair = _exchangeRequests.FirstOrDefault(k => k.Key == characterId || k.Value == characterId); - return pair.Key == 0 && pair.Value == 0 ? null : pair; + if (_initiatorToTarget.TryGetValue(characterId, out var target)) + { + return new KeyValuePair(characterId, target); + } + + if (_targetToInitiator.TryGetValue(characterId, out var initiator)) + { + return new KeyValuePair(initiator, characterId); + } + + return null; + } + + public void SetExchangeRequest(long characterId, long targetCharacterId) + { + _initiatorToTarget[characterId] = targetCharacterId; + _targetToInitiator[targetCharacterId] = characterId; } - public void SetExchangeRequest(long characterId, long targetCharacterId) => - _exchangeRequests[characterId] = targetCharacterId; + public bool RemoveExchangeRequest(long characterId) + { + if (_initiatorToTarget.TryRemove(characterId, out var target)) + { + _targetToInitiator.TryRemove(target, out _); + return true; + } + + if (_targetToInitiator.TryRemove(characterId, out var initiator)) + { + _initiatorToTarget.TryRemove(initiator, out _); + return true; + } - public bool RemoveExchangeRequest(long characterId) => - _exchangeRequests.TryRemove(characterId, out _); + return false; + } public bool HasExchange(long characterId) => - _exchangeRequests.Any(k => k.Key == characterId || k.Value == characterId); + _initiatorToTarget.ContainsKey(characterId) || _targetToInitiator.ContainsKey(characterId); } } diff --git a/src/NosCore.GameObject/Services/ExchangeService/ExchangeService.cs b/src/NosCore.GameObject/Services/ExchangeService/ExchangeService.cs index e272fff39..01040dcfb 100644 --- a/src/NosCore.GameObject/Services/ExchangeService/ExchangeService.cs +++ b/src/NosCore.GameObject/Services/ExchangeService/ExchangeService.cs @@ -109,11 +109,21 @@ public void SetGold(long visualId, long gold, long bankGold) dictionary); } - if (session.Character.InventoryService.EnoughPlace( + var targetFirstItem = targetInfo.ExchangeItems.Keys.FirstOrDefault(); + var exchangeFirstItem = exchangeInfo.ExchangeItems.Keys.FirstOrDefault(); + + var targetHasItems = targetFirstItem != null; + var exchangeHasItems = exchangeFirstItem != null; + + var targetEnoughPlace = !targetHasItems || session.Character.InventoryService.EnoughPlace( targetInfo.ExchangeItems.Keys.Select(s => s.ItemInstance).ToList(), - targetInfo.ExchangeItems.Keys.First().Type) && targetSession.InventoryService.EnoughPlace( + targetFirstItem!.Type); + + var exchangeEnoughPlace = !exchangeHasItems || targetSession.InventoryService.EnoughPlace( exchangeInfo.ExchangeItems.Keys.Select(s => s.ItemInstance).ToList(), - targetInfo.ExchangeItems.Keys.First().Type)) + exchangeFirstItem!.Type); + + if (targetEnoughPlace && exchangeEnoughPlace) { return new Tuple?>(ExchangeResultType.Success, null); } @@ -233,6 +243,15 @@ public List> ProcessExchange(long firstUser, long { var usersArray = new[] { firstUser, secondUser }; var items = new List>(); + var pendingTransfers = new List<( + IInventoryService OriginInventory, + IInventoryService DestInventory, + InventoryItemInstance OriginalItem, + short Amount, + long TargetId, + long SessionId, + bool IsFullTransfer + )>(); foreach (var user in usersArray) { @@ -245,31 +264,57 @@ public List> ProcessExchange(long firstUser, long var originInventory = user == firstUser ? sessionInventory : targetInventory; var targetId = user == firstUser ? secondUser : firstUser; var sessionId = user == firstUser ? firstUser : secondUser; - InventoryItemInstance? newItem = null; + var isFullTransfer = item.Value == item.Key.ItemInstance.Amount; - if (item.Value == item.Key.ItemInstance.Amount) - { - originInventory.Remove(item.Key.ItemInstanceId); - } - else - { - newItem = originInventory.RemoveItemAmountFromInventory(item.Value, item.Key.ItemInstanceId); - } + pendingTransfers.Add((originInventory, destInventory, item.Key, item.Value, targetId, sessionId, isFullTransfer)); + } + } + + var addedItems = new List<(IInventoryService Inventory, InventoryItemInstance Item)>(); + + foreach (var transfer in pendingTransfers) + { + var newItem = itemBuilderService.Create( + transfer.OriginalItem.ItemInstance.ItemVNum, + transfer.Amount, + (sbyte)transfer.OriginalItem.ItemInstance.Rare, + transfer.OriginalItem.ItemInstance.Upgrade, + (byte)transfer.OriginalItem.ItemInstance.Design); + + var inv = transfer.DestInventory.AddItemToPocket( + InventoryItemInstance.Create(newItem, transfer.TargetId))?.FirstOrDefault(); - var inv = destInventory.AddItemToPocket(InventoryItemInstance.Create(itemBuilderService.Create( - item.Key.ItemInstance.ItemVNum, - item.Key.ItemInstance.Amount, (sbyte)item.Key.ItemInstance.Rare, item.Key.ItemInstance.Upgrade, - (byte)item.Key.ItemInstance.Design), targetId))?.FirstOrDefault(); - if (inv == null) + if (inv == null) + { + foreach (var added in addedItems) { - return items; + added.Inventory.DeleteFromTypeAndSlot(added.Item.Type, added.Item.Slot); } + return new List>(); + } + + addedItems.Add((transfer.DestInventory, inv)); + } - items.Add(new KeyValuePair(sessionId, - newItem.GeneratePocketChange((PocketType)item.Key.Type, item.Key.Slot))); - items.Add(new KeyValuePair(targetId, - item.Key.GeneratePocketChange((PocketType)inv.Type, inv.Slot))); + for (var i = 0; i < pendingTransfers.Count; i++) + { + var transfer = pendingTransfers[i]; + var addedItem = addedItems[i]; + + InventoryItemInstance? sourceItem = null; + if (transfer.IsFullTransfer) + { + transfer.OriginInventory.Remove(transfer.OriginalItem.ItemInstanceId); } + else + { + sourceItem = transfer.OriginInventory.RemoveItemAmountFromInventory(transfer.Amount, transfer.OriginalItem.ItemInstanceId); + } + + items.Add(new KeyValuePair(transfer.SessionId, + (sourceItem ?? transfer.OriginalItem).GeneratePocketChange((PocketType)transfer.OriginalItem.Type, transfer.OriginalItem.Slot))); + items.Add(new KeyValuePair(transfer.TargetId, + transfer.OriginalItem.GeneratePocketChange((PocketType)addedItem.Item.Type, addedItem.Item.Slot))); } return items; diff --git a/src/NosCore.GameObject/Services/InventoryService/IInventoryService.cs b/src/NosCore.GameObject/Services/InventoryService/IInventoryService.cs index 63ecdd33c..18e597e4e 100644 --- a/src/NosCore.GameObject/Services/InventoryService/IInventoryService.cs +++ b/src/NosCore.GameObject/Services/InventoryService/IInventoryService.cs @@ -19,12 +19,14 @@ using NosCore.Data.Enumerations; using NosCore.GameObject.Services.ItemGenerationService.Item; +using NosCore.GameObject.Services.ItemStorage; using System; using System.Collections.Generic; namespace NosCore.GameObject.Services.InventoryService { - public interface IInventoryService : IDictionary + public interface IInventoryService : IDictionary, + IMutableSlotBasedStorage { Dictionary Expensions { get; set; } @@ -35,7 +37,6 @@ public interface IInventoryService : IDictionary AddItemToPocket(InventoryItemInstance newItem, NoscorePocketType? type, short? slot); bool CanAddItem(short itemVnum); - int CountItem(int itemVNum); int CountItemInAnPocket(NoscorePocketType inv); InventoryItemInstance? DeleteById(Guid id); InventoryItemInstance? DeleteFromTypeAndSlot(NoscorePocketType type, short slot); @@ -48,10 +49,6 @@ public interface IInventoryService : IDictionary InventoryItemInstance? MoveInPocket(short sourceSlot, NoscorePocketType sourceType, NoscorePocketType targetType, short? targetSlot, bool swap); - bool TryMoveItem(NoscorePocketType sourcetype, short sourceSlot, short amount, short destinationSlot, - out InventoryItemInstance? sourcePocket, out InventoryItemInstance? destinationPocket); - - bool EnoughPlace(List itemInstances, NoscorePocketType type); InventoryItemInstance? RemoveItemAmountFromInventory(short amount, Guid id); } } \ No newline at end of file diff --git a/src/NosCore.GameObject/Services/InventoryService/InventoryItemInstance.cs b/src/NosCore.GameObject/Services/InventoryService/InventoryItemInstance.cs index 79fcb3994..64bfc129f 100644 --- a/src/NosCore.GameObject/Services/InventoryService/InventoryItemInstance.cs +++ b/src/NosCore.GameObject/Services/InventoryService/InventoryItemInstance.cs @@ -18,20 +18,31 @@ // along with this program. If not, see . using NosCore.Data.Dto; +using NosCore.Data.Enumerations; using NosCore.GameObject.Services.ItemGenerationService.Item; +using NosCore.GameObject.Services.ItemStorage; using System; namespace NosCore.GameObject.Services.InventoryService { - public class InventoryItemInstance : InventoryItemInstanceDto + public class InventoryItemInstance : InventoryItemInstanceDto, ISlotItem { public InventoryItemInstance(IItemInstance itemInstance) { ItemInstance = itemInstance; ItemInstanceId = itemInstance.Id; } + public IItemInstance ItemInstance { get; set; } + IItemInstance? ISlotItem.ItemInstance => ItemInstance; + + NoscorePocketType ISlotItem.SlotType + { + get => Type; + set => Type = value; + } + public static InventoryItemInstance Create(IItemInstance it, long characterId) { return Create(it, characterId, null); diff --git a/src/NosCore.GameObject/Services/InventoryService/InventoryService.cs b/src/NosCore.GameObject/Services/InventoryService/InventoryService.cs index fd30b33de..15826ec69 100644 --- a/src/NosCore.GameObject/Services/InventoryService/InventoryService.cs +++ b/src/NosCore.GameObject/Services/InventoryService/InventoryService.cs @@ -23,6 +23,7 @@ using NosCore.Data.Enumerations; using NosCore.Data.StaticEntities; using NosCore.GameObject.Services.ItemGenerationService.Item; +using NosCore.GameObject.Services.ItemStorage; using Serilog; using System; using System.Collections.Concurrent; @@ -34,7 +35,7 @@ namespace NosCore.GameObject.Services.InventoryService public class InventoryService(List items, IOptions configuration, ILogger logger) : ConcurrentDictionary, IInventoryService { - private byte GetMaxSlot(NoscorePocketType pocket) + public int GetMaxSlots(NoscorePocketType pocket) { //TODO make this configurable return (byte)(pocket switch @@ -104,6 +105,11 @@ public int CountItemInAnPocket(NoscorePocketType inv) public List? AddItemToPocket(InventoryItemInstance newItem, NoscorePocketType? type, short? slot) { + if (newItem?.ItemInstance == null || newItem.ItemInstance.Amount <= 0) + { + return null; + } + var invlist = new List(); // override type if necessary if (type.HasValue) @@ -118,7 +124,7 @@ public int CountItemInAnPocket(NoscorePocketType inv) var slotNotFull = this.ToList().Select(s => s.Value).Where(i => i.ItemInstance.ItemVNum.Equals(newItem.ItemInstance.ItemVNum) && (i.ItemInstance.Amount < configuration.Value.MaxItemAmount)); - var freeslot = GetMaxSlot(newItem.Type) - this.Count(s => s.Value.Type == newItem.Type); + var freeslot = GetMaxSlots(newItem.Type) - this.Count(s => s.Value.Type == newItem.Type); IEnumerable itemInstances = slotNotFull as IList ?? slotNotFull.ToList(); if (newItem.ItemInstance.Amount <= freeslot * configuration.Value.MaxItemAmount @@ -161,8 +167,8 @@ public int CountItemInAnPocket(NoscorePocketType inv) return null; } - if (this.Any(s => (s.Value.Slot == newItem.Slot) && (s.Value.Type == newItem.Type)) - || (newItem.Slot >= GetMaxSlot(newItem.Type))) + if (newItem.Slot < 0 || newItem.Slot >= GetMaxSlots(newItem.Type) + || this.Any(s => (s.Value.Slot == newItem.Slot) && (s.Value.Type == newItem.Type))) { return null; } @@ -336,8 +342,8 @@ public bool TryMoveItem(NoscorePocketType sourcetype, short sourceSlot, short am sourcePocket = LoadBySlotAndType(sourceSlot, sourcetype); destinationPocket = LoadBySlotAndType(destinationSlot, sourcetype); - if ((sourceSlot == destinationSlot) || (amount == 0) - || (destinationSlot > GetMaxSlot(sourcetype))) + if ((sourceSlot == destinationSlot) || (amount <= 0) + || (destinationSlot < 0) || (destinationSlot >= GetMaxSlots(sourcetype))) { return false; } @@ -436,7 +442,7 @@ public bool EnoughPlace(List itemInstances, NoscorePocketType typ var itemList = this.Select(s => s.Value).Where(i => i.Type == type).ToList(); if (!place.ContainsKey(type)) { - place.Add(type, GetMaxSlot(type) - itemList.Count); + place.Add(type, GetMaxSlots(type) - itemList.Count); } var amount = itemGroup.Sum(s => s.Amount); @@ -457,6 +463,11 @@ public bool EnoughPlace(List itemInstances, NoscorePocketType typ public InventoryItemInstance? RemoveItemAmountFromInventory(short amount, Guid id) { + if (amount <= 0) + { + return null; + } + var inv = this[id]; if (inv?.ItemInstance != null) { @@ -474,20 +485,58 @@ public bool EnoughPlace(List itemInstances, NoscorePocketType typ return null; } - private short? GetFreeSlot(NoscorePocketType type) + public short? GetFreeSlot(NoscorePocketType type) { - var itemInstanceSlotsByType = this.Select(s => s.Value).Where(i => i.Type == type).OrderBy(i => i.Slot) - .Select(i => (int)i.Slot); - IEnumerable instanceSlotsByType = - itemInstanceSlotsByType as int[] ?? itemInstanceSlotsByType.ToArray(); - var nextFreeSlot = instanceSlotsByType.Any() - ? Enumerable - .Range(0, GetMaxSlot(type) + 1) - .Except(instanceSlotsByType).FirstOrDefault() - : 0; - return (short?)nextFreeSlot < GetMaxSlot(type) ? (short?)nextFreeSlot : null; + var maxSlots = GetMaxSlots(type); + var occupiedSlots = new HashSet( + this.Select(s => s.Value).Where(i => i.Type == type).Select(i => i.Slot)); + + for (short slot = 0; slot < maxSlots; slot++) + { + if (!occupiedSlots.Contains(slot)) + { + return slot; + } + } + + return null; } + public bool HasFreeSlot(NoscorePocketType slotType) => GetFreeSlot(slotType).HasValue; + + public IEnumerable GetAllBySlotType(NoscorePocketType slotType) => + this.Select(s => s.Value).Where(i => i.Type == slotType); + + public IEnumerable GetAll() => this.Select(s => s.Value); + + InventoryItemInstance? ISlotBasedStorage.GetBySlot(short slot, NoscorePocketType slotType) => + LoadBySlotAndType(slot, slotType); + + InventoryItemInstance? ISlotBasedStorage.GetById(Guid id) => + LoadByItemInstanceId(id); + + int ISlotBasedStorage.CountBySlotType(NoscorePocketType slotType) => + CountItemInAnPocket(slotType); + + List? IMutableSlotBasedStorage.AddItem( + InventoryItemInstance item, NoscorePocketType? slotType, short? slot) => + AddItemToPocket(item, slotType, slot); + + InventoryItemInstance? IMutableSlotBasedStorage.RemoveBySlot( + short slot, NoscorePocketType slotType) => + DeleteFromTypeAndSlot(slotType, slot); + + InventoryItemInstance? IMutableSlotBasedStorage.RemoveById(Guid id) => + DeleteById(id); + + InventoryItemInstance? IMutableSlotBasedStorage.RemoveItemAmount( + short amount, Guid id) => + RemoveItemAmountFromInventory(amount, id); + + InventoryItemInstance? IMutableSlotBasedStorage.MoveItem( + short sourceSlot, NoscorePocketType sourceType, NoscorePocketType targetType, short? targetSlot, bool swap) => + MoveInPocket(sourceSlot, sourceType, targetType, targetSlot, swap); + private InventoryItemInstance? TakeItem(short slot, NoscorePocketType type) { var itemInstance = this.Select(s => s.Value).SingleOrDefault(i => (i.Slot == slot) && (i.Type == type)); diff --git a/src/NosCore.GameObject/Services/LoginService/LoginService.cs b/src/NosCore.GameObject/Services/LoginService/LoginService.cs index 37721b7fb..fda5d4c00 100644 --- a/src/NosCore.GameObject/Services/LoginService/LoginService.cs +++ b/src/NosCore.GameObject/Services/LoginService/LoginService.cs @@ -83,7 +83,7 @@ await clientSession.SendPacketAsync(new FailcPacket } if ((acc == null) - || (!useApiAuth && !string.Equals(acc.Password, passwordToken, StringComparison.OrdinalIgnoreCase))) + || (!useApiAuth && !string.Equals(acc.Password, passwordToken, StringComparison.Ordinal))) { await clientSession.SendPacketAsync(new FailcPacket { diff --git a/src/NosCore.GameObject/Services/WarehouseService/IWarehouseService.cs b/src/NosCore.GameObject/Services/WarehouseService/IWarehouseService.cs index 9b343d247..ce3bb7b44 100644 --- a/src/NosCore.GameObject/Services/WarehouseService/IWarehouseService.cs +++ b/src/NosCore.GameObject/Services/WarehouseService/IWarehouseService.cs @@ -19,6 +19,7 @@ using NosCore.Data.Enumerations.Miniland; using NosCore.Data.WebApi; +using NosCore.GameObject.Services.ItemGenerationService.Item; using System; using System.Collections.Generic; using System.Threading.Tasks; @@ -28,10 +29,24 @@ namespace NosCore.GameObject.Services.WarehouseService { public interface IWarehouseService { + int GetMaxSlots(WarehouseType warehouseType); + List GetItems(Guid? id, long? ownerId, WarehouseType warehouseType, byte? slot); + List GetWarehouseItems(long ownerId, WarehouseType warehouseType); + + WarehouseItem? GetItemBySlot(long ownerId, WarehouseType warehouseType, short slot); + + short? GetFreeSlot(long ownerId, WarehouseType warehouseType); + Task WithdrawItemAsync(Guid id); + Task WithdrawItemFromSlotAsync(long ownerId, WarehouseType warehouseType, short slot); + Task DepositItemAsync(long ownerId, WarehouseType warehouseType, ItemInstanceDto? itemInstance, short slot); + + Task DepositItemAsync(long ownerId, WarehouseType warehouseType, IItemInstance itemInstance); + + Task MoveItemAsync(long ownerId, WarehouseType warehouseType, short sourceSlot, short destinationSlot); } } \ No newline at end of file diff --git a/src/NosCore.GameObject/Services/WarehouseService/WarehouseItem.cs b/src/NosCore.GameObject/Services/WarehouseService/WarehouseItem.cs index 81067dfdc..52b01f60d 100644 --- a/src/NosCore.GameObject/Services/WarehouseService/WarehouseItem.cs +++ b/src/NosCore.GameObject/Services/WarehouseService/WarehouseItem.cs @@ -18,12 +18,25 @@ // along with this program. If not, see . using NosCore.Data.Dto; +using NosCore.Data.Enumerations.Miniland; using NosCore.GameObject.Services.ItemGenerationService.Item; +using NosCore.GameObject.Services.ItemStorage; +using System; namespace NosCore.GameObject.Services.WarehouseService { - public class WarehouseItem : WarehouseItemDto + public class WarehouseItem : WarehouseItemDto, ISlotItem { public IItemInstance? ItemInstance { get; set; } + + public WarehouseType WarehouseType { get; set; } + + Guid ISlotItem.Id => Id; + + WarehouseType ISlotItem.SlotType + { + get => WarehouseType; + set => WarehouseType = value; + } } } diff --git a/src/NosCore.GameObject/Services/WarehouseService/WarehouseService.cs b/src/NosCore.GameObject/Services/WarehouseService/WarehouseService.cs index c5e15b695..029e09727 100644 --- a/src/NosCore.GameObject/Services/WarehouseService/WarehouseService.cs +++ b/src/NosCore.GameObject/Services/WarehouseService/WarehouseService.cs @@ -2,59 +2,173 @@ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . +using Mapster; using NosCore.Dao.Interfaces; using NosCore.Data.Dto; using NosCore.Data.Enumerations.Miniland; using NosCore.Data.WebApi; +using NosCore.GameObject.Services.ItemGenerationService.Item; +using NosCore.GameObject.Services.ItemStorage; using System; using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; namespace NosCore.GameObject.Services.WarehouseService { - public class WarehouseService(IDao warehouseItemDao, - IDao warehouseDao, IDao itemInstanceDao) + public class WarehouseService( + IDao warehouseItemDao, + IDao warehouseDao, + IDao itemInstanceDao) : IWarehouseService { + private const int DefaultWarehouseSize = 68; + private const int DefaultFamilyWarehouseSize = 49; + + public int GetMaxSlots(WarehouseType warehouseType) + { + return warehouseType switch + { + WarehouseType.FamilyWareHouse => DefaultFamilyWarehouseSize, + _ => DefaultWarehouseSize + }; + } + public List GetItems(Guid? id, long? ownerId, WarehouseType warehouseType, byte? slot) { var list = new List(); if (id == null) { - var warehouse = warehouseDao.FirstOrDefaultAsync(s - => s.Type == warehouseType - && s.CharacterId == (warehouseType == WarehouseType.FamilyWareHouse ? null : ownerId) - && s.FamilyId == (warehouseType == WarehouseType.FamilyWareHouse ? ownerId : null)); - if (slot == null) + var warehouses = warehouseDao.Where(s => + s.Type == warehouseType && + s.CharacterId == (warehouseType == WarehouseType.FamilyWareHouse ? null : ownerId) && + s.FamilyId == (warehouseType == WarehouseType.FamilyWareHouse ? ownerId : null))?.ToList(); + + if (warehouses == null || warehouses.Count == 0) + { + return list; + } + + var warehouseIds = warehouses.Select(w => w.Id).ToList(); + var warehouseItems = warehouseItemDao.Where(wi => warehouseIds.Contains(wi.WarehouseId))?.ToList(); + + if (warehouseItems == null) + { + return list; + } + + foreach (var warehouseItem in warehouseItems) { - //todo add + if (slot.HasValue && warehouseItem.Slot != slot.Value) + { + continue; + } + + var itemInstance = itemInstanceDao.FirstOrDefaultAsync(i => i!.Id == warehouseItem.ItemInstanceId).Result; + if (itemInstance != null) + { + list.Add(new WarehouseLink + { + Slot = warehouseItem.Slot, + ItemInstance = itemInstance.Adapt() + }); + } } - //todo add } else { - var warehouseLink = new WarehouseLink(); - list.Add(warehouseLink); + var warehouseItem = warehouseItemDao.FirstOrDefaultAsync(wi => wi.Id == id.Value).Result; + if (warehouseItem != null) + { + var itemInstance = itemInstanceDao.FirstOrDefaultAsync(i => i!.Id == warehouseItem.ItemInstanceId).Result; + if (itemInstance != null) + { + list.Add(new WarehouseLink + { + Slot = warehouseItem.Slot, + ItemInstance = itemInstance.Adapt() + }); + } + } } return list; } + public List GetWarehouseItems(long ownerId, WarehouseType warehouseType) + { + var result = new List(); + + var warehouses = warehouseDao.Where(s => + s.Type == warehouseType && + s.CharacterId == (warehouseType == WarehouseType.FamilyWareHouse ? null : ownerId) && + s.FamilyId == (warehouseType == WarehouseType.FamilyWareHouse ? ownerId : null))?.ToList(); + + if (warehouses == null || warehouses.Count == 0) + { + return result; + } + + var warehouseIds = warehouses.Select(w => w.Id).ToList(); + var warehouseItems = warehouseItemDao.Where(wi => warehouseIds.Contains(wi.WarehouseId))?.ToList(); + + if (warehouseItems == null) + { + return result; + } + + foreach (var warehouseItem in warehouseItems) + { + var itemInstance = itemInstanceDao.FirstOrDefaultAsync(i => i!.Id == warehouseItem.ItemInstanceId).Result; + if (itemInstance != null) + { + result.Add(new WarehouseItem + { + Id = warehouseItem.Id, + Slot = warehouseItem.Slot, + ItemInstanceId = warehouseItem.ItemInstanceId, + WarehouseId = warehouseItem.WarehouseId, + WarehouseType = warehouseType, + ItemInstance = itemInstance.Adapt() + }); + } + } + + return result; + } + + public WarehouseItem? GetItemBySlot(long ownerId, WarehouseType warehouseType, short slot) + { + var items = GetWarehouseItems(ownerId, warehouseType); + return items.FirstOrDefault(i => i.Slot == slot); + } + + public short? GetFreeSlot(long ownerId, WarehouseType warehouseType) + { + var items = GetWarehouseItems(ownerId, warehouseType); + var maxSlots = GetMaxSlots(warehouseType); + + return SlotStorageHelper.FindFreeSlot( + items, + item => item.Slot, + maxSlots); + } + public async Task WithdrawItemAsync(Guid id) { var item = await warehouseItemDao.FirstOrDefaultAsync(s => s.Id == id); @@ -62,27 +176,70 @@ public async Task WithdrawItemAsync(Guid id) { return false; } + await warehouseItemDao.TryDeleteAsync(item.Id); - await warehouseDao.TryDeleteAsync(item.WarehouseId); await itemInstanceDao.TryDeleteAsync(item.ItemInstanceId); + + var remainingItemsInWarehouse = warehouseItemDao.Where(wi => wi.WarehouseId == item.WarehouseId)?.Any() ?? false; + if (!remainingItemsInWarehouse) + { + await warehouseDao.TryDeleteAsync(item.WarehouseId); + } + return true; } + public async Task WithdrawItemFromSlotAsync(long ownerId, WarehouseType warehouseType, short slot) + { + var item = GetItemBySlot(ownerId, warehouseType, slot); + if (item == null) + { + return null; + } + + var success = await WithdrawItemAsync(item.Id); + return success ? item : null; + } + public async Task DepositItemAsync(long ownerId, WarehouseType warehouseType, ItemInstanceDto? itemInstance, short slot) { + if (itemInstance == null) + { + return false; + } + + var existingItem = GetItemBySlot(ownerId, warehouseType, slot); + if (existingItem != null) + { + return false; + } + var item = itemInstance as IItemInstanceDto; item!.Id = Guid.NewGuid(); - item = await itemInstanceDao.TryInsertOrUpdateAsync(item).ConfigureAwait(true); - var warehouse = new WarehouseDto + item = await itemInstanceDao.TryInsertOrUpdateAsync(item); + + var existingWarehouse = warehouseDao.FirstOrDefaultAsync(s => + s.Type == warehouseType && + s.CharacterId == (warehouseType == WarehouseType.FamilyWareHouse ? null : ownerId) && + s.FamilyId == (warehouseType == WarehouseType.FamilyWareHouse ? ownerId : null)).Result; + + WarehouseDto warehouse; + if (existingWarehouse != null) { - CharacterId = warehouseType == WarehouseType.FamilyWareHouse ? null - : (long?)ownerId, - Id = Guid.NewGuid(), - FamilyId = warehouseType == WarehouseType.FamilyWareHouse - ? (long?)ownerId : null, - Type = warehouseType, - }; - warehouse = await warehouseDao.TryInsertOrUpdateAsync(warehouse).ConfigureAwait(true); + warehouse = existingWarehouse; + } + else + { + warehouse = new WarehouseDto + { + CharacterId = warehouseType == WarehouseType.FamilyWareHouse ? null : ownerId, + Id = Guid.NewGuid(), + FamilyId = warehouseType == WarehouseType.FamilyWareHouse ? ownerId : null, + Type = warehouseType, + }; + warehouse = await warehouseDao.TryInsertOrUpdateAsync(warehouse); + } + var warehouseItem = new WarehouseItemDto { Slot = slot, @@ -90,8 +247,63 @@ public async Task DepositItemAsync(long ownerId, WarehouseType warehouseTy ItemInstanceId = item!.Id, WarehouseId = warehouse.Id }; - await warehouseItemDao.TryInsertOrUpdateAsync(warehouseItem).ConfigureAwait(true); + await warehouseItemDao.TryInsertOrUpdateAsync(warehouseItem); + + return true; + } + + public async Task DepositItemAsync(long ownerId, WarehouseType warehouseType, IItemInstance itemInstance) + { + var freeSlot = GetFreeSlot(ownerId, warehouseType); + if (!freeSlot.HasValue) + { + return false; + } + + var dto = itemInstance.Adapt(); + return await DepositItemAsync(ownerId, warehouseType, dto, freeSlot.Value); + } + + public async Task MoveItemAsync(long ownerId, WarehouseType warehouseType, short sourceSlot, short destinationSlot) + { + if (sourceSlot == destinationSlot) + { + return false; + } + + var sourceItem = GetItemBySlot(ownerId, warehouseType, sourceSlot); + if (sourceItem == null) + { + return false; + } + + var destinationItem = GetItemBySlot(ownerId, warehouseType, destinationSlot); + + if (destinationItem != null) + { + var sourceWarehouseItem = await warehouseItemDao.FirstOrDefaultAsync(wi => wi.Id == sourceItem.Id); + var destWarehouseItem = await warehouseItemDao.FirstOrDefaultAsync(wi => wi.Id == destinationItem.Id); + + if (sourceWarehouseItem != null && destWarehouseItem != null) + { + sourceWarehouseItem.Slot = destinationSlot; + destWarehouseItem.Slot = sourceSlot; + + await warehouseItemDao.TryInsertOrUpdateAsync(sourceWarehouseItem); + await warehouseItemDao.TryInsertOrUpdateAsync(destWarehouseItem); + } + } + else + { + var warehouseItem = await warehouseItemDao.FirstOrDefaultAsync(wi => wi.Id == sourceItem.Id); + if (warehouseItem != null) + { + warehouseItem.Slot = destinationSlot; + await warehouseItemDao.TryInsertOrUpdateAsync(warehouseItem); + } + } + return true; } } -} \ No newline at end of file +} diff --git a/src/NosCore.LoginServer/LoginServerBootstrap.cs b/src/NosCore.LoginServer/LoginServerBootstrap.cs index 903e37ae5..61aefae0a 100644 --- a/src/NosCore.LoginServer/LoginServerBootstrap.cs +++ b/src/NosCore.LoginServer/LoginServerBootstrap.cs @@ -38,7 +38,6 @@ using NosCore.Data.Dto; using NosCore.Database; using NosCore.Database.Entities; -using NosCore.GameObject; using NosCore.GameObject.Infastructure; using NosCore.GameObject.Networking.ClientSession; using NosCore.PacketHandlers.Login; diff --git a/src/NosCore.LoginServer/NosCore.LoginServer.csproj b/src/NosCore.LoginServer/NosCore.LoginServer.csproj index e855baab8..e34b4f42f 100644 --- a/src/NosCore.LoginServer/NosCore.LoginServer.csproj +++ b/src/NosCore.LoginServer/NosCore.LoginServer.csproj @@ -27,8 +27,8 @@ - - + + diff --git a/src/NosCore.PacketHandlers/Bazaar/CBuyPacketHandler.cs b/src/NosCore.PacketHandlers/Bazaar/CBuyPacketHandler.cs index ef9876260..d55753d21 100644 --- a/src/NosCore.PacketHandlers/Bazaar/CBuyPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Bazaar/CBuyPacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -48,6 +48,11 @@ public class CBuyPacketHandler(IBazaarHub bazaarHttpClient, IItemGenerationServi { public override async Task ExecuteAsync(CBuyPacket packet, ClientSession clientSession) { + if (packet.Amount <= 0) + { + return; + } + var bzs = await bazaarHttpClient.GetBazaar(packet.BazaarId, null, null, null, null, null, null, null, null); var bz = bzs.FirstOrDefault(); if ((bz != null) && (bz.SellerName != clientSession.Character.Name) && @@ -61,7 +66,7 @@ public override async Task ExecuteAsync(CBuyPacket packet, ClientSession clientS var price = bz.BazaarItem.Price * packet.Amount; if (clientSession.Character.InventoryService.CanAddItem(bz.ItemInstance.ItemVNum)) { - if (clientSession.Character.Gold - price > 0) + if (clientSession.Character.Gold >= price) { clientSession.Character.Gold -= price; await clientSession.SendPacketAsync(clientSession.Character.GenerateGold()); diff --git a/src/NosCore.PacketHandlers/Bazaar/CRegPacketHandler.cs b/src/NosCore.PacketHandlers/Bazaar/CRegPacketHandler.cs index 0d7592e83..e0431f4f1 100644 --- a/src/NosCore.PacketHandlers/Bazaar/CRegPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Bazaar/CRegPacketHandler.cs @@ -49,10 +49,20 @@ public class CRegPacketHandler(IOptions configuration, IBaza { public override async Task ExecuteAsync(CRegPacket cRegPacket, ClientSession clientSession) { + if (cRegPacket.Amount <= 0 || cRegPacket.Price < 0) + { + return; + } + var medal = clientSession.Character.StaticBonusList.FirstOrDefault(s => (s.StaticBonusType == StaticBonusType.BazaarMedalGold) || (s.StaticBonusType == StaticBonusType.BazaarMedalSilver)); + if (cRegPacket.Price > long.MaxValue / cRegPacket.Amount) + { + return; + } + var price = cRegPacket.Price * cRegPacket.Amount; var taxmax = price > 100000 ? price / 200 : 500; var taxmin = price >= 4000 ? 60 + (price - 4000) / 2000 * 30 > 10000 ? 10000 diff --git a/src/NosCore.PacketHandlers/Bazaar/CScalcPacketHandler.cs b/src/NosCore.PacketHandlers/Bazaar/CScalcPacketHandler.cs index b02f47d76..25623178c 100644 --- a/src/NosCore.PacketHandlers/Bazaar/CScalcPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Bazaar/CScalcPacketHandler.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -82,20 +82,27 @@ await clientSession.SendPacketAsync(new SayiPacket }); await clientSession.SendPacketAsync(clientSession.Character.GenerateGold()); - var itemInstance = await itemInstanceDao.FirstOrDefaultAsync(s => s!.Id == bz.ItemInstance.Id); - if (itemInstance == null) + if (bz.ItemInstance.Amount > 0) { - return; + var itemInstance = await itemInstanceDao.FirstOrDefaultAsync(s => s!.Id == bz.ItemInstance.Id); + if (itemInstance == null) + { + return; + } + var item = itemProvider.Convert(itemInstance); + item.Id = Guid.NewGuid(); + + var newInv = + clientSession.Character.InventoryService.AddItemToPocket( + InventoryItemInstance.Create(item, clientSession.Character.CharacterId)); + if (newInv != null) + { + await clientSession.SendPacketAsync(newInv.GeneratePocketChange()); + } } - var item = itemProvider.Convert(itemInstance); - item.Id = Guid.NewGuid(); - var newInv = - clientSession.Character.InventoryService.AddItemToPocket( - InventoryItemInstance.Create(item, clientSession.Character.CharacterId)); - await clientSession.SendPacketAsync(newInv!.GeneratePocketChange()); var remove = await bazaarHttpClient.DeleteBazaarAsync(packet.BazaarId, bz.ItemInstance.Amount, - clientSession.Character.Name); + clientSession.Character.Name, clientSession.Character.CharacterId); if (remove) { await clientSession.SendPacketAsync(new RCScalcPacket diff --git a/src/NosCore.PacketHandlers/Shops/MShopPacketHandler.cs b/src/NosCore.PacketHandlers/Shops/MShopPacketHandler.cs index cb6202b1e..a8254a4b2 100644 --- a/src/NosCore.PacketHandlers/Shops/MShopPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Shops/MShopPacketHandler.cs @@ -98,12 +98,17 @@ await clientSession.SendPacketAsync(new InfoiPacket continue; } - if (inv.ItemInstance.Amount < item.Amount) + if (inv.ItemInstance.Amount < item.Amount || item.Amount <= 0) { //todo log return; } + if (item.Price < 0) + { + return; + } + if (!inv.ItemInstance.Item.IsTradable || (inv.ItemInstance.BoundCharacterId != null)) { await clientSession.SendPacketAsync(new SayiPacket diff --git a/src/NosCore.PacketHandlers/Shops/SellPacketHandler.cs b/src/NosCore.PacketHandlers/Shops/SellPacketHandler.cs index e54cf3e21..ac9c6d24f 100644 --- a/src/NosCore.PacketHandlers/Shops/SellPacketHandler.cs +++ b/src/NosCore.PacketHandlers/Shops/SellPacketHandler.cs @@ -39,6 +39,11 @@ public override async Task ExecuteAsync(SellPacket sellPacket, ClientSession cli { var type = (NoscorePocketType)sellPacket.Data; + if (sellPacket.Amount <= 0) + { + return; + } + var inv = clientSession.Character.InventoryService.LoadBySlotAndType(sellPacket.Slot, type); if ((inv == null) || (sellPacket.Amount > inv.ItemInstance.Amount)) { @@ -59,7 +64,14 @@ await clientSession.SendPacketAsync(new SMemoiPacket var price = inv.ItemInstance.Item.ItemType == ItemType.Sell ? inv.ItemInstance.Item.Price : inv.ItemInstance.Item.Price / 20; - if (clientSession.Character.Gold + price * sellPacket.Amount > worldConfiguration.Value.MaxGoldAmount) + if (price < 0 || price > long.MaxValue / sellPacket.Amount) + { + return; + } + + var totalPrice = price * sellPacket.Amount; + + if (clientSession.Character.Gold + totalPrice > worldConfiguration.Value.MaxGoldAmount) { await clientSession.SendPacketAsync(new MsgiPacket { @@ -69,7 +81,7 @@ await clientSession.SendPacketAsync(new MsgiPacket return; } - clientSession.Character.Gold += price * sellPacket.Amount; + clientSession.Character.Gold += totalPrice; await clientSession.SendPacketAsync(new SMemoiPacket { diff --git a/src/NosCore.Parser/NosCore.Parser.csproj b/src/NosCore.Parser/NosCore.Parser.csproj index dab4e4b0d..eede4ef75 100644 --- a/src/NosCore.Parser/NosCore.Parser.csproj +++ b/src/NosCore.Parser/NosCore.Parser.csproj @@ -27,8 +27,8 @@ - - + + diff --git a/src/NosCore.WorldServer/NosCore.WorldServer.csproj b/src/NosCore.WorldServer/NosCore.WorldServer.csproj index c422d7f61..8dbfacdbc 100644 --- a/src/NosCore.WorldServer/NosCore.WorldServer.csproj +++ b/src/NosCore.WorldServer/NosCore.WorldServer.csproj @@ -30,13 +30,13 @@ - + - + - + diff --git a/src/NosCore.WorldServer/WorldServerBootstrap.cs b/src/NosCore.WorldServer/WorldServerBootstrap.cs index 05926300e..fb4789e6c 100644 --- a/src/NosCore.WorldServer/WorldServerBootstrap.cs +++ b/src/NosCore.WorldServer/WorldServerBootstrap.cs @@ -63,7 +63,6 @@ using NosCore.Data.Enumerations.I18N; using NosCore.Data.Resource; using NosCore.Database.Entities.Base; -using NosCore.GameObject; using NosCore.Packets.Attributes; using NosCore.Shared.Enumerations; using NosCore.Shared.I18N; @@ -72,7 +71,6 @@ using NosCore.GameObject.Services.ChannelCommunicationService.Handlers; using NosCore.GameObject.Services.EventLoaderService; using NosCore.GameObject.Services.InventoryService; -using NosCore.GameObject.Services.MapItemGenerationService; using NosCore.PathFinder.Heuristic; using NosCore.PathFinder.Interfaces; using System.Collections.Generic; @@ -87,7 +85,6 @@ using ILogger = Serilog.ILogger; using Character = NosCore.GameObject.ComponentEntities.Entities.Character; using NosCore.Packets.Enumerations; -using NosCore.GameObject.Networking.ClientSession.DisconnectHandlers; using NosCore.GameObject.Services.GroupService; using NosCore.GameObject.Services.MapInstanceGenerationService; using NosCore.GameObject.Services.MinilandService; @@ -135,7 +132,8 @@ private static void InitializeContainer(ContainerBuilder containerBuilder) containerBuilder.RegisterLogger(); containerBuilder.RegisterAssemblyTypes(typeof(ChannelHubClient).Assembly) .Where(t => t.Name.EndsWith("HubClient") && t.Name != nameof(ChannelHubClient)) - .AsImplementedInterfaces(); + .AsImplementedInterfaces() + .SingleInstance(); containerBuilder.RegisterType().AsImplementedInterfaces().SingleInstance(); containerBuilder.RegisterType(); diff --git a/test/NosCore.Core.Tests/NosCore.Core.Tests.csproj b/test/NosCore.Core.Tests/NosCore.Core.Tests.csproj index a708c1653..235d64816 100644 --- a/test/NosCore.Core.Tests/NosCore.Core.Tests.csproj +++ b/test/NosCore.Core.Tests/NosCore.Core.Tests.csproj @@ -6,7 +6,7 @@ preview enable true - MSTEST0001;MSTEST0037;MSTEST0044 + MSTEST0001;MSTEST0037;MSTEST0044;NU1701 @@ -21,6 +21,9 @@ + + + diff --git a/test/NosCore.Database.Tests/NosCore.Database.Tests.csproj b/test/NosCore.Database.Tests/NosCore.Database.Tests.csproj index fbcea2305..41f1b78d2 100644 --- a/test/NosCore.Database.Tests/NosCore.Database.Tests.csproj +++ b/test/NosCore.Database.Tests/NosCore.Database.Tests.csproj @@ -6,7 +6,7 @@ preview enable true - MSTEST0001;MSTEST0037;MSTEST0044 + MSTEST0001;MSTEST0037;MSTEST0044;NU1701 @@ -21,6 +21,9 @@ + + + diff --git a/test/NosCore.GameObject.Tests/NosCore.GameObject.Tests.csproj b/test/NosCore.GameObject.Tests/NosCore.GameObject.Tests.csproj index 322b18c97..511400348 100644 --- a/test/NosCore.GameObject.Tests/NosCore.GameObject.Tests.csproj +++ b/test/NosCore.GameObject.Tests/NosCore.GameObject.Tests.csproj @@ -6,7 +6,7 @@ preview enable true - MSTEST0001;MSTEST0037;MSTEST0044;MSTEST0017 + MSTEST0001;MSTEST0037;MSTEST0044;MSTEST0017;NU1701 @@ -21,6 +21,9 @@ + + + diff --git a/test/NosCore.PacketHandlers.Tests/NosCore.PacketHandlers.Tests.csproj b/test/NosCore.PacketHandlers.Tests/NosCore.PacketHandlers.Tests.csproj index 8fdbbd52a..8dda9b548 100644 --- a/test/NosCore.PacketHandlers.Tests/NosCore.PacketHandlers.Tests.csproj +++ b/test/NosCore.PacketHandlers.Tests/NosCore.PacketHandlers.Tests.csproj @@ -6,7 +6,7 @@ preview enable true - MSTEST0001;MSTEST0017;MSTEST0023;MSTEST0037;MSTEST0044 + MSTEST0001;MSTEST0017;MSTEST0023;MSTEST0037;MSTEST0044;NU1701 @@ -21,6 +21,9 @@ + + + diff --git a/test/NosCore.Tests.Shared/NosCore.Tests.Shared.csproj b/test/NosCore.Tests.Shared/NosCore.Tests.Shared.csproj index 7ca5adad3..66cda1f73 100644 --- a/test/NosCore.Tests.Shared/NosCore.Tests.Shared.csproj +++ b/test/NosCore.Tests.Shared/NosCore.Tests.Shared.csproj @@ -6,7 +6,7 @@ preview enable true - MSTEST0001 + MSTEST0001;MSTEST0037;NU1701 @@ -23,6 +23,9 @@ + + + diff --git a/test/NosCore.WebApi.Tests/NosCore.WebApi.Tests.csproj b/test/NosCore.WebApi.Tests/NosCore.WebApi.Tests.csproj index f4b97b751..ac47d9320 100644 --- a/test/NosCore.WebApi.Tests/NosCore.WebApi.Tests.csproj +++ b/test/NosCore.WebApi.Tests/NosCore.WebApi.Tests.csproj @@ -6,7 +6,7 @@ preview enable true - MSTEST0001;MSTEST0037;MSTEST0044 + MSTEST0001;MSTEST0037;MSTEST0044;NU1701 @@ -21,6 +21,9 @@ + + + From 6a54f7c98cb95a1169b6fab22b9361cd13ec16f9 Mon Sep 17 00:00:00 2001 From: erwan-joly Date: Tue, 20 Jan 2026 00:45:53 +1300 Subject: [PATCH 4/4] add bunch of tests --- .../Hubs/BaseHubClient.cs | 132 ++++ .../Services/ItemStorage/ISlotBasedStorage.cs | 68 ++ .../Services/ItemStorage/ISlotItem.cs | 37 + .../Services/ItemStorage/SlotStorageHelper.cs | 245 ++++++ test/NosCore.Core.Tests/LogLanguageTests.cs | 33 +- test/NosCore.Database.Tests/DatabaseTests.cs | 22 +- test/NosCore.GameObject.Tests/BazaarTests.cs | 537 ++++++-------- test/NosCore.GameObject.Tests/GroupTests.cs | 164 ++-- .../AuthService/AuthCodeServiceTests.cs | 202 +++++ .../BattleService/BattleServiceTests.cs | 66 ++ .../BazaarService/BazaarRegistryTests.cs | 250 +++++++ .../BlacklistService/BlacklistServiceTests.cs | 258 +++++++ .../BroadcastService/SessionRegistryTests.cs | 226 ++++++ .../DeleteMailDataMessageHandlerTests.cs | 114 +++ .../DisconnectDataMessageHandlerTests.cs | 101 +++ .../Handlers/MailDataMessageHandlerTests.cs | 149 ++++ .../PostedPacketMessageHandlerTests.cs | 205 +++++ .../Handlers/StatDataMessageHandlerTests.cs | 145 ++++ .../ChannelService/ChannelServiceTests.cs | 164 ++++ .../CharacterInitializationServiceTests.cs | 210 ++++++ .../EventLoaderServiceTests.cs | 120 +++ .../ExchangeRequestRegistryTests.cs | 274 +++++++ .../ExchangeService/ExchangeServiceTests.cs | 206 ++++-- .../FriendRequestRegistryTests.cs | 187 +++++ .../FriendService/FriendServiceTests.cs | 299 ++++++++ .../GroupService/GroupRegistryTests.cs | 196 +++++ .../GuriRunnerServiceTests.cs | 146 ++++ .../Handlers/SpeakerGuriHandlerTests.cs | 46 +- .../Handlers/TitleGuriHandlerTests.cs | 18 +- .../InventoryService/InventoryServiceTests.cs | 605 +++++++++++---- .../Handlers/BackPackHandlerTests.cs | 24 +- .../Handlers/BazaarMedalsHandlerTests.cs | 20 +- .../Handlers/MinilandBellHandlerTests.cs | 32 +- .../Handlers/SpRechargerHandlerTests.cs | 16 +- .../Handlers/SpeakerHandlerTests.cs | 12 +- .../Handlers/TitleHandlerTests.cs | 12 +- .../Handlers/VehicleHandlerTests.cs | 30 +- .../Handlers/WearHandlerTests.cs | 68 +- .../ItemGenerationServiceTests.cs | 155 ++++ .../LoginService/LoginServiceTests.cs | 118 +++ .../Services/MailService/MailServiceTests.cs | 177 +++++ .../MapChangeService/MapChangeServiceTests.cs | 150 ++++ .../MapInstanceAccessServiceTests.cs | 136 ++++ .../MapInstanceRegistryTests.cs | 95 +++ .../Handlers/DropHandlerTests.cs | 191 +++++ .../Handlers/GoldDropHandlerTests.cs | 149 ++++ .../Handlers/SpChargerHandlerTests.cs | 131 ++++ .../MapItemGenerationServiceTests.cs | 205 +++++ .../MinilandService/MinilandRegistryTests.cs | 236 ++++++ .../MinilandService/MinilandServiceTests.cs | 247 +++++++ .../NRunService/Handlers/ChangeClassTests.cs | 66 +- .../Handlers/OpenShopHandlerTests.cs | 157 ++++ .../Handlers/TeleporterHandlerTests.cs | 224 ++++++ .../Services/NRunService/NrunServiceTests.cs | 148 ++++ .../PacketHandlerRegistryTests.cs | 137 ++++ .../QuestService/QuestServiceTests.cs | 389 ++++++++++ .../Services/SaveService/SaveServiceTests.cs | 161 ++++ .../Services/ShopService/ShopRegistryTests.cs | 170 +++++ .../SkillService/SkillServiceTests.cs | 130 ++++ .../SpeedCalculationServiceTests.cs | 40 +- .../TransformationServiceTests.cs | 164 ++++ .../WarehouseService/WarehouseServiceTests.cs | 248 +++++++ test/NosCore.GameObject.Tests/ShopTests.cs | 486 +++++------- .../Battle/UseSkillPacketHandlerTests.cs | 178 +++++ .../Bazaar/CBListPacketHandlerTests.cs | 96 ++- .../Bazaar/CBuyPacketHandlerTests.cs | 340 +++++---- .../Bazaar/CModPacketHandlerTests.cs | 231 +++--- .../Bazaar/CRegPacketHandlerTests.cs | 521 ++++++------- .../Bazaar/CSListPacketHandlerTests.cs | 10 +- .../Bazaar/CScalcPacketHandlerTests.cs | 242 +++--- .../Bazaar/CSkillPacketHandlerTests.cs | 92 ++- .../CharNewJobPacketHandlerTests.cs | 105 ++- .../CharNewPacketHandlerTests.cs | 181 +++-- .../CharRenPacketHandlerTests.cs | 161 ++-- .../CharacterDeletePacketHandlerTests.cs | 103 ++- .../CharacterScreen/DacPacketHandlerTests.cs | 162 ++-- .../EntryPointPacketHandlerTests.cs | 276 +++++++ .../SelectPacketHandlerTests.cs | 116 +++ .../Chat/BtkPacketHandlerTests.cs | 279 +++++++ .../Chat/ClientSayPacketHandlerTests.cs | 108 +++ .../Chat/WhisperPacketHandlerTests.cs | 207 ++++++ .../Command/ChangeClassPacketHandlerTests.cs | 176 +++++ .../Command/CreateItemPacketHandlerTests.cs | 159 ++++ .../EffectCommandPacketHandlerTests.cs | 83 +++ .../Command/GiftPacketHandlerTests.cs | 153 ++++ .../Command/HelpPacketHandlerTests.cs | 115 +++ .../Command/KickPacketHandlerTests.cs | 129 ++++ .../Command/PositionPacketHandlerTests.cs | 96 +++ .../SetGoldCommandPacketHandlerTests.cs | 132 ++++ .../SetHeroLevelCommandPacketHandlerTests.cs | 182 +++++ .../SetJobLevelCommandPacketHandlerTests.cs | 175 +++++ .../SetLevelCommandPacketHandlerTests.cs | 182 +++++ .../SetReputationPacketHandlerTests.cs | 175 +++++ .../Command/ShoutPacketHandlerTests.cs | 105 +++ .../Command/SizePacketHandlerTests.cs | 132 ++++ .../Command/SpeedPacketHandlerTests.cs | 114 +++ .../Command/TeleportPacketHandlerTests.cs | 158 ++++ .../Exchange/ExcListPacketHandlerTests.cs | 218 ++++++ .../ExchangeRequestPacketHandlerTests.cs | 215 ++++++ .../Friend/BlDelPacketHandlerTests.cs | 201 ++--- .../Friend/BlInsPacketHandlerTests.cs | 97 ++- .../Friend/BlPacketHandlerTests.cs | 75 +- .../Friend/FinsPacketHandlerTests.cs | 182 +++-- .../Friend/FlPacketHandlerTests.cs | 77 +- .../Friend/fDelPacketHandlerTests.cs | 215 +++--- .../Game/GameStartPacketHandlerTests.cs | 211 ++++++ .../Game/GuriPacketHandlerTests.cs | 114 +++ .../Game/NcifPacketHandlerTests.cs | 143 ++++ .../Game/PulsePacketHandlerTests.cs | 41 +- .../Game/QsetPacketHandlerTests.cs | 185 +++-- .../Game/TitEqPacketHandlerTests.cs | 202 +++++ .../Group/GroupTalkPacketHandlerTests.cs | 209 ++++++ .../Group/PJoinPacketHandlerTests.cs | 210 ++++-- .../Group/PleavePacketHandlerTests.cs | 195 +++-- .../Inventory/BiPacketHandlerTests.cs | 98 ++- .../Inventory/GetPacketHandlerTests.cs | 279 ++++--- .../Inventory/MvePacketHandlerTests.cs | 144 ++++ .../Inventory/MviPacketHandlerTests.cs | 229 ++++++ .../Inventory/PutPacketHandlerTests.cs | 181 +++-- .../Inventory/RemovePacketHandlerTests.cs | 189 +++++ .../SpTransformPacketHandlerTests.cs | 326 +++++--- .../Inventory/UseItemPacketHandlerTests.cs | 163 ++-- .../Inventory/WearPacketHandlerTests.cs | 698 +++++++++--------- .../Login/NoS0575PacketHandlerTests.cs | 337 +++++---- .../Login/NoS0577PacketHandlerTests.cs | 314 ++++---- .../Miniland/AddobjPacketHandlerTests.cs | 221 ++++++ .../Miniland/MJoinPacketHandlerTests.cs | 278 +++---- .../MinilandObjects/MgPacketHandlerTests.cs | 311 ++++++++ .../UseobjPacketHandlerTests.cs | 227 ++++++ .../Miniland/MlEditPacketHandlerTests.cs | 232 +++--- .../Miniland/RmvobjPacketHandlerTests.cs | 222 ++++++ .../Movement/ClientDirPacketHandlerTests.cs | 107 +++ .../Movement/PreqPacketHandlerTests.cs | 143 ++-- .../Movement/SitPacketHandlerTests.cs | 119 +++ .../Movement/WalkPacketHandlerTests.cs | 143 ++++ .../Parcel/PclPacketHandlerTests.cs | 168 +++-- .../Parcel/PstClientPacketHandlerTests.cs | 142 +--- .../Quest/QtPacketHandlerTests.cs | 195 +++++ .../Quest/ScriptPacketHandlerTests.cs | 106 +++ .../Shops/BuyPacketHandlerTests.cs | 126 ++++ .../Shops/MShopPacketHandlerTests.cs | 306 +++++--- .../Shops/NrunPacketHandlerTests.cs | 211 ++++++ .../Shops/RequestNpcPacketHandlerTests.cs | 133 ++++ .../Shops/SellPacketHandlerTests.cs | 154 ++-- .../Shops/ShoppingPacketHandlerTests.cs | 129 ++++ .../Warehouse/DepositPacketHandlerTests.cs | 146 ++++ .../Warehouse/FDepositPacketHandlerTests.cs | 124 ++++ .../Warehouse/FReposPacketHandlerTests.cs | 131 ++++ .../Warehouse/FStashEndPacketHandlerTests.cs | 103 +++ .../Warehouse/FWithdrawPacketHandlerTests.cs | 140 ++++ .../Warehouse/ReposPacketHandlerTests.cs | 131 ++++ .../Warehouse/StashEndPacketHandlerTests.cs | 103 +++ .../Warehouse/WarehousePacketHandlerTests.cs | 191 +++++ .../Warehouse/WithdrawPacketHandlerTests.cs | 140 ++++ .../AutoFixture/NosCoreFixture.cs | 74 ++ test/NosCore.Tests.Shared/BDD/SpecBase.cs | 152 ++++ .../BDD/Steps/InventorySteps.cs | 70 ++ .../BDD/Steps/PacketSteps.cs | 88 +++ .../BDD/Steps/SessionSteps.cs | 63 ++ test/NosCore.Tests.Shared/TestHelpers.cs | 102 +-- .../ApiTests/AuthControllerTests.cs | 375 +++++++--- 161 files changed, 22987 insertions(+), 4390 deletions(-) create mode 100644 src/NosCore.GameObject/InterChannelCommunication/Hubs/BaseHubClient.cs create mode 100644 src/NosCore.GameObject/Services/ItemStorage/ISlotBasedStorage.cs create mode 100644 src/NosCore.GameObject/Services/ItemStorage/ISlotItem.cs create mode 100644 src/NosCore.GameObject/Services/ItemStorage/SlotStorageHelper.cs create mode 100644 test/NosCore.GameObject.Tests/Services/AuthService/AuthCodeServiceTests.cs create mode 100644 test/NosCore.GameObject.Tests/Services/BattleService/BattleServiceTests.cs create mode 100644 test/NosCore.GameObject.Tests/Services/BazaarService/BazaarRegistryTests.cs create mode 100644 test/NosCore.GameObject.Tests/Services/BlacklistService/BlacklistServiceTests.cs create mode 100644 test/NosCore.GameObject.Tests/Services/BroadcastService/SessionRegistryTests.cs create mode 100644 test/NosCore.GameObject.Tests/Services/ChannelCommunicationService/Handlers/DeleteMailDataMessageHandlerTests.cs create mode 100644 test/NosCore.GameObject.Tests/Services/ChannelCommunicationService/Handlers/DisconnectDataMessageHandlerTests.cs create mode 100644 test/NosCore.GameObject.Tests/Services/ChannelCommunicationService/Handlers/MailDataMessageHandlerTests.cs create mode 100644 test/NosCore.GameObject.Tests/Services/ChannelCommunicationService/Handlers/PostedPacketMessageHandlerTests.cs create mode 100644 test/NosCore.GameObject.Tests/Services/ChannelCommunicationService/Handlers/StatDataMessageHandlerTests.cs create mode 100644 test/NosCore.GameObject.Tests/Services/ChannelService/ChannelServiceTests.cs create mode 100644 test/NosCore.GameObject.Tests/Services/CharacterService/CharacterInitializationServiceTests.cs create mode 100644 test/NosCore.GameObject.Tests/Services/EventLoaderService/EventLoaderServiceTests.cs create mode 100644 test/NosCore.GameObject.Tests/Services/ExchangeService/ExchangeRequestRegistryTests.cs create mode 100644 test/NosCore.GameObject.Tests/Services/FriendService/FriendRequestRegistryTests.cs create mode 100644 test/NosCore.GameObject.Tests/Services/FriendService/FriendServiceTests.cs create mode 100644 test/NosCore.GameObject.Tests/Services/GroupService/GroupRegistryTests.cs create mode 100644 test/NosCore.GameObject.Tests/Services/GuriRunnerService/GuriRunnerServiceTests.cs create mode 100644 test/NosCore.GameObject.Tests/Services/ItemGenerationService/ItemGenerationServiceTests.cs create mode 100644 test/NosCore.GameObject.Tests/Services/LoginService/LoginServiceTests.cs create mode 100644 test/NosCore.GameObject.Tests/Services/MailService/MailServiceTests.cs create mode 100644 test/NosCore.GameObject.Tests/Services/MapChangeService/MapChangeServiceTests.cs create mode 100644 test/NosCore.GameObject.Tests/Services/MapInstanceAccessService/MapInstanceAccessServiceTests.cs create mode 100644 test/NosCore.GameObject.Tests/Services/MapInstanceGenerationService/MapInstanceRegistryTests.cs create mode 100644 test/NosCore.GameObject.Tests/Services/MapItemGenerationService/Handlers/DropHandlerTests.cs create mode 100644 test/NosCore.GameObject.Tests/Services/MapItemGenerationService/Handlers/GoldDropHandlerTests.cs create mode 100644 test/NosCore.GameObject.Tests/Services/MapItemGenerationService/Handlers/SpChargerHandlerTests.cs create mode 100644 test/NosCore.GameObject.Tests/Services/MapItemGenerationService/MapItemGenerationServiceTests.cs create mode 100644 test/NosCore.GameObject.Tests/Services/MinilandService/MinilandRegistryTests.cs create mode 100644 test/NosCore.GameObject.Tests/Services/MinilandService/MinilandServiceTests.cs create mode 100644 test/NosCore.GameObject.Tests/Services/NRunService/Handlers/OpenShopHandlerTests.cs create mode 100644 test/NosCore.GameObject.Tests/Services/NRunService/Handlers/TeleporterHandlerTests.cs create mode 100644 test/NosCore.GameObject.Tests/Services/NRunService/NrunServiceTests.cs create mode 100644 test/NosCore.GameObject.Tests/Services/PacketHandlerService/PacketHandlerRegistryTests.cs create mode 100644 test/NosCore.GameObject.Tests/Services/QuestService/QuestServiceTests.cs create mode 100644 test/NosCore.GameObject.Tests/Services/SaveService/SaveServiceTests.cs create mode 100644 test/NosCore.GameObject.Tests/Services/ShopService/ShopRegistryTests.cs create mode 100644 test/NosCore.GameObject.Tests/Services/SkillService/SkillServiceTests.cs create mode 100644 test/NosCore.GameObject.Tests/Services/TransformationService/TransformationServiceTests.cs create mode 100644 test/NosCore.GameObject.Tests/Services/WarehouseService/WarehouseServiceTests.cs create mode 100644 test/NosCore.PacketHandlers.Tests/Battle/UseSkillPacketHandlerTests.cs create mode 100644 test/NosCore.PacketHandlers.Tests/CharacterScreen/EntryPointPacketHandlerTests.cs create mode 100644 test/NosCore.PacketHandlers.Tests/CharacterScreen/SelectPacketHandlerTests.cs create mode 100644 test/NosCore.PacketHandlers.Tests/Chat/BtkPacketHandlerTests.cs create mode 100644 test/NosCore.PacketHandlers.Tests/Chat/ClientSayPacketHandlerTests.cs create mode 100644 test/NosCore.PacketHandlers.Tests/Chat/WhisperPacketHandlerTests.cs create mode 100644 test/NosCore.PacketHandlers.Tests/Command/ChangeClassPacketHandlerTests.cs create mode 100644 test/NosCore.PacketHandlers.Tests/Command/CreateItemPacketHandlerTests.cs create mode 100644 test/NosCore.PacketHandlers.Tests/Command/EffectCommandPacketHandlerTests.cs create mode 100644 test/NosCore.PacketHandlers.Tests/Command/GiftPacketHandlerTests.cs create mode 100644 test/NosCore.PacketHandlers.Tests/Command/HelpPacketHandlerTests.cs create mode 100644 test/NosCore.PacketHandlers.Tests/Command/KickPacketHandlerTests.cs create mode 100644 test/NosCore.PacketHandlers.Tests/Command/PositionPacketHandlerTests.cs create mode 100644 test/NosCore.PacketHandlers.Tests/Command/SetGoldCommandPacketHandlerTests.cs create mode 100644 test/NosCore.PacketHandlers.Tests/Command/SetHeroLevelCommandPacketHandlerTests.cs create mode 100644 test/NosCore.PacketHandlers.Tests/Command/SetJobLevelCommandPacketHandlerTests.cs create mode 100644 test/NosCore.PacketHandlers.Tests/Command/SetLevelCommandPacketHandlerTests.cs create mode 100644 test/NosCore.PacketHandlers.Tests/Command/SetReputationPacketHandlerTests.cs create mode 100644 test/NosCore.PacketHandlers.Tests/Command/ShoutPacketHandlerTests.cs create mode 100644 test/NosCore.PacketHandlers.Tests/Command/SizePacketHandlerTests.cs create mode 100644 test/NosCore.PacketHandlers.Tests/Command/SpeedPacketHandlerTests.cs create mode 100644 test/NosCore.PacketHandlers.Tests/Command/TeleportPacketHandlerTests.cs create mode 100644 test/NosCore.PacketHandlers.Tests/Exchange/ExcListPacketHandlerTests.cs create mode 100644 test/NosCore.PacketHandlers.Tests/Exchange/ExchangeRequestPacketHandlerTests.cs create mode 100644 test/NosCore.PacketHandlers.Tests/Game/GameStartPacketHandlerTests.cs create mode 100644 test/NosCore.PacketHandlers.Tests/Game/GuriPacketHandlerTests.cs create mode 100644 test/NosCore.PacketHandlers.Tests/Game/NcifPacketHandlerTests.cs create mode 100644 test/NosCore.PacketHandlers.Tests/Game/TitEqPacketHandlerTests.cs create mode 100644 test/NosCore.PacketHandlers.Tests/Group/GroupTalkPacketHandlerTests.cs create mode 100644 test/NosCore.PacketHandlers.Tests/Inventory/MvePacketHandlerTests.cs create mode 100644 test/NosCore.PacketHandlers.Tests/Inventory/MviPacketHandlerTests.cs create mode 100644 test/NosCore.PacketHandlers.Tests/Inventory/RemovePacketHandlerTests.cs create mode 100644 test/NosCore.PacketHandlers.Tests/Miniland/AddobjPacketHandlerTests.cs create mode 100644 test/NosCore.PacketHandlers.Tests/Miniland/MinilandObjects/MgPacketHandlerTests.cs create mode 100644 test/NosCore.PacketHandlers.Tests/Miniland/MinilandObjects/UseobjPacketHandlerTests.cs create mode 100644 test/NosCore.PacketHandlers.Tests/Miniland/RmvobjPacketHandlerTests.cs create mode 100644 test/NosCore.PacketHandlers.Tests/Movement/ClientDirPacketHandlerTests.cs create mode 100644 test/NosCore.PacketHandlers.Tests/Movement/SitPacketHandlerTests.cs create mode 100644 test/NosCore.PacketHandlers.Tests/Movement/WalkPacketHandlerTests.cs create mode 100644 test/NosCore.PacketHandlers.Tests/Quest/QtPacketHandlerTests.cs create mode 100644 test/NosCore.PacketHandlers.Tests/Quest/ScriptPacketHandlerTests.cs create mode 100644 test/NosCore.PacketHandlers.Tests/Shops/BuyPacketHandlerTests.cs create mode 100644 test/NosCore.PacketHandlers.Tests/Shops/NrunPacketHandlerTests.cs create mode 100644 test/NosCore.PacketHandlers.Tests/Shops/RequestNpcPacketHandlerTests.cs create mode 100644 test/NosCore.PacketHandlers.Tests/Shops/ShoppingPacketHandlerTests.cs create mode 100644 test/NosCore.PacketHandlers.Tests/Warehouse/DepositPacketHandlerTests.cs create mode 100644 test/NosCore.PacketHandlers.Tests/Warehouse/FDepositPacketHandlerTests.cs create mode 100644 test/NosCore.PacketHandlers.Tests/Warehouse/FReposPacketHandlerTests.cs create mode 100644 test/NosCore.PacketHandlers.Tests/Warehouse/FStashEndPacketHandlerTests.cs create mode 100644 test/NosCore.PacketHandlers.Tests/Warehouse/FWithdrawPacketHandlerTests.cs create mode 100644 test/NosCore.PacketHandlers.Tests/Warehouse/ReposPacketHandlerTests.cs create mode 100644 test/NosCore.PacketHandlers.Tests/Warehouse/StashEndPacketHandlerTests.cs create mode 100644 test/NosCore.PacketHandlers.Tests/Warehouse/WarehousePacketHandlerTests.cs create mode 100644 test/NosCore.PacketHandlers.Tests/Warehouse/WithdrawPacketHandlerTests.cs create mode 100644 test/NosCore.Tests.Shared/AutoFixture/NosCoreFixture.cs create mode 100644 test/NosCore.Tests.Shared/BDD/SpecBase.cs create mode 100644 test/NosCore.Tests.Shared/BDD/Steps/InventorySteps.cs create mode 100644 test/NosCore.Tests.Shared/BDD/Steps/PacketSteps.cs create mode 100644 test/NosCore.Tests.Shared/BDD/Steps/SessionSteps.cs diff --git a/src/NosCore.GameObject/InterChannelCommunication/Hubs/BaseHubClient.cs b/src/NosCore.GameObject/InterChannelCommunication/Hubs/BaseHubClient.cs new file mode 100644 index 000000000..bfdd2a70e --- /dev/null +++ b/src/NosCore.GameObject/InterChannelCommunication/Hubs/BaseHubClient.cs @@ -0,0 +1,132 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.AspNetCore.SignalR.Client; +using Polly; +using Polly.Retry; +using Serilog; + +namespace NosCore.GameObject.InterChannelCommunication.Hubs; + +public abstract class BaseHubClient : IAsyncDisposable +{ + private readonly HubConnection _hubConnection; + private readonly SemaphoreSlim _connectionLock = new(1, 1); + private readonly ILogger _logger; + private bool _isStarted; + + private static readonly AsyncRetryPolicy RetryPolicy = Policy + .Handle() + .WaitAndRetryAsync( + 3, + attempt => TimeSpan.FromSeconds(Math.Pow(2, attempt)), + (exception, timeSpan, retryCount, _) => + { + Log.Warning(exception, "Hub call failed. Retry {RetryCount} in {TimeSpan}", retryCount, timeSpan); + }); + + protected BaseHubClient(HubConnectionFactory hubConnectionFactory, string hubName, ILogger logger) + { + _logger = logger; + _hubConnection = hubConnectionFactory.Create(hubName); + + _hubConnection.Reconnecting += error => + { + _logger.Warning("Hub {HubName} reconnecting...", hubName); + return Task.CompletedTask; + }; + + _hubConnection.Reconnected += connectionId => + { + _logger.Information("Hub {HubName} reconnected", hubName); + return Task.CompletedTask; + }; + + _hubConnection.Closed += error => + { + _isStarted = false; + _logger.Warning("Hub {HubName} connection closed", hubName); + return Task.CompletedTask; + }; + } + + protected async Task EnsureConnectedAsync() + { + if (_hubConnection.State == HubConnectionState.Connected) + { + return; + } + + await _connectionLock.WaitAsync(); + try + { + if (!_isStarted || _hubConnection.State == HubConnectionState.Disconnected) + { + await _hubConnection.StartAsync(); + _isStarted = true; + } + } + finally + { + _connectionLock.Release(); + } + } + + protected async Task InvokeAsync(string methodName, params object?[] args) + { + return await RetryPolicy.ExecuteAsync(async () => + { + await EnsureConnectedAsync(); + return await _hubConnection.InvokeCoreAsync(methodName, args); + }); + } + + protected async Task InvokeAsync(string methodName, params object?[] args) + { + await RetryPolicy.ExecuteAsync(async () => + { + await EnsureConnectedAsync(); + await _hubConnection.InvokeCoreAsync(methodName, args); + }); + } + + public async ValueTask DisposeAsync() + { + await _connectionLock.WaitAsync(); + try + { + if (_hubConnection.State != HubConnectionState.Disconnected) + { + await _hubConnection.StopAsync(); + _isStarted = false; + } + } + finally + { + _connectionLock.Release(); + } + + await _hubConnection.DisposeAsync(); + _connectionLock.Dispose(); + GC.SuppressFinalize(this); + } +} diff --git a/src/NosCore.GameObject/Services/ItemStorage/ISlotBasedStorage.cs b/src/NosCore.GameObject/Services/ItemStorage/ISlotBasedStorage.cs new file mode 100644 index 000000000..312223c90 --- /dev/null +++ b/src/NosCore.GameObject/Services/ItemStorage/ISlotBasedStorage.cs @@ -0,0 +1,68 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using NosCore.GameObject.Services.ItemGenerationService.Item; +using System; +using System.Collections.Generic; + +namespace NosCore.GameObject.Services.ItemStorage +{ + public interface ISlotBasedStorage + where TItem : class, ISlotItem + where TSlotType : struct, Enum + { + int GetMaxSlots(TSlotType slotType); + + TItem? GetBySlot(short slot, TSlotType slotType); + + TItem? GetById(Guid id); + + IEnumerable GetAllBySlotType(TSlotType slotType); + + IEnumerable GetAll(); + + short? GetFreeSlot(TSlotType slotType); + + bool HasFreeSlot(TSlotType slotType); + + int CountBySlotType(TSlotType slotType); + + int CountItem(int itemVNum); + } + + public interface IMutableSlotBasedStorage : ISlotBasedStorage + where TItem : class, ISlotItem + where TSlotType : struct, Enum + { + List? AddItem(TItem item, TSlotType? slotType = null, short? slot = null); + + TItem? RemoveBySlot(short slot, TSlotType slotType); + + TItem? RemoveById(Guid id); + + TItem? RemoveItemAmount(short amount, Guid id); + + TItem? MoveItem(short sourceSlot, TSlotType sourceType, TSlotType targetType, short? targetSlot = null, bool swap = false); + + bool TryMoveItem(TSlotType slotType, short sourceSlot, short amount, short destinationSlot, + out TItem? sourcePocket, out TItem? destinationPocket); + + bool EnoughPlace(List items, TSlotType slotType); + } +} diff --git a/src/NosCore.GameObject/Services/ItemStorage/ISlotItem.cs b/src/NosCore.GameObject/Services/ItemStorage/ISlotItem.cs new file mode 100644 index 000000000..ce764f72d --- /dev/null +++ b/src/NosCore.GameObject/Services/ItemStorage/ISlotItem.cs @@ -0,0 +1,37 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using NosCore.GameObject.Services.ItemGenerationService.Item; +using System; + +namespace NosCore.GameObject.Services.ItemStorage +{ + public interface ISlotItem + { + Guid Id { get; } + short Slot { get; set; } + IItemInstance? ItemInstance { get; } + } + + public interface ISlotItem : ISlotItem + where TSlotType : struct, Enum + { + TSlotType SlotType { get; set; } + } +} diff --git a/src/NosCore.GameObject/Services/ItemStorage/SlotStorageHelper.cs b/src/NosCore.GameObject/Services/ItemStorage/SlotStorageHelper.cs new file mode 100644 index 000000000..328f662e5 --- /dev/null +++ b/src/NosCore.GameObject/Services/ItemStorage/SlotStorageHelper.cs @@ -0,0 +1,245 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using NosCore.GameObject.Services.ItemGenerationService.Item; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace NosCore.GameObject.Services.ItemStorage +{ + public static class SlotStorageHelper + { + public static short? FindFreeSlot( + IEnumerable items, + Func slotSelector, + int maxSlots) + where TItem : class + { + if (maxSlots <= 0 || maxSlots > short.MaxValue) + { + return null; + } + + var occupiedSlots = new HashSet(items.Select(slotSelector)); + + for (short slot = 0; slot < maxSlots; slot++) + { + if (!occupiedSlots.Contains(slot)) + { + return slot; + } + } + + return null; + } + + public static List StackItems( + IEnumerable existingItems, + TItem newItem, + Func itemInstanceSelector, + Action setAmount, + short maxItemAmount, + int maxSlots, + int currentCount) + where TItem : class + { + var result = new List(); + var newItemInstance = itemInstanceSelector(newItem); + + if (newItemInstance == null) + { + return result; + } + + var slotNotFull = existingItems + .Where(i => + { + var inst = itemInstanceSelector(i); + return inst != null && + inst.ItemVNum == newItemInstance.ItemVNum && + inst.Amount < maxItemAmount; + }) + .ToList(); + + var freeSlotCount = maxSlots - currentCount; + var totalCapacity = freeSlotCount * maxItemAmount + + slotNotFull.Sum(s => maxItemAmount - (itemInstanceSelector(s)?.Amount ?? 0)); + + if (newItemInstance.Amount > totalCapacity) + { + return result; + } + + foreach (var existingSlot in slotNotFull) + { + var existingInstance = itemInstanceSelector(existingSlot); + if (existingInstance == null || newItemInstance.Amount <= 0) + { + continue; + } + + var combinedAmount = existingInstance.Amount + newItemInstance.Amount; + var maxAmount = combinedAmount > maxItemAmount ? maxItemAmount : combinedAmount; + var remaining = (short)(existingInstance.Amount + newItemInstance.Amount - maxAmount); + + existingInstance.Amount = (short)maxAmount; + newItemInstance.Amount = remaining; + + result.Add(existingSlot); + } + + return result; + } + + public static bool CanStack(IItemInstance? itemInstance) + { + if (itemInstance == null) + { + return false; + } + + var itemType = itemInstance.Item?.Type; + return itemType == Data.Enumerations.NoscorePocketType.Etc || + itemType == Data.Enumerations.NoscorePocketType.Main; + } + + public static bool ValidateEnoughPlace( + IEnumerable existingItems, + List itemsToAdd, + Func itemInstanceSelector, + short maxItemAmount, + int maxSlots, + bool isStackable) + where TItem : class + { + var existingList = existingItems.ToList(); + var currentCount = existingList.Count; + var availableSlots = maxSlots - currentCount; + + foreach (var itemGroup in itemsToAdd.GroupBy(s => s.ItemVNum)) + { + var amount = itemGroup.Sum(s => s.Amount); + + if (isStackable) + { + var existingCapacity = existingList + .Where(s => itemInstanceSelector(s)?.ItemVNum == itemGroup.Key) + .Sum(s => maxItemAmount - (itemInstanceSelector(s)?.Amount ?? 0)); + + var needsNewSlots = amount - existingCapacity; + if (needsNewSlots > 0) + { + var slotsNeeded = (int)Math.Ceiling((double)needsNewSlots / maxItemAmount); + availableSlots -= slotsNeeded; + } + } + else + { + availableSlots -= itemGroup.Count(); + } + + if (availableSlots < 0) + { + return false; + } + } + + return true; + } + + public static (TItem? Source, TItem? Destination) SwapItems( + TItem source, + TItem destination, + Action setSlot) + where TItem : class, ISlotItem + { + var sourceSlot = source.Slot; + var destSlot = destination.Slot; + + setSlot(source, destSlot); + setSlot(destination, sourceSlot); + + return (source, destination); + } + + public static TItem? SplitItem( + TItem source, + short amount, + short destinationSlot, + Func createNewItem) + where TItem : class, ISlotItem + { + var sourceInstance = source.ItemInstance; + if (sourceInstance == null || sourceInstance.Amount < amount) + { + return null; + } + + var clonedInstance = (IItemInstance)sourceInstance.Clone(); + sourceInstance.Amount -= amount; + clonedInstance.Amount = amount; + clonedInstance.Id = Guid.NewGuid(); + + return createNewItem(clonedInstance, Guid.NewGuid(), destinationSlot); + } + + public static bool TryStackOntoExisting( + TItem source, + TItem destination, + short amount, + short maxItemAmount, + Action? removeSource = null) + where TItem : class, ISlotItem + { + var sourceInstance = source.ItemInstance; + var destInstance = destination.ItemInstance; + + if (sourceInstance == null || destInstance == null) + { + return false; + } + + if (sourceInstance.ItemVNum != destInstance.ItemVNum) + { + return false; + } + + var totalAmount = destInstance.Amount + amount; + if (totalAmount > maxItemAmount) + { + var overflow = totalAmount - maxItemAmount; + destInstance.Amount = maxItemAmount; + sourceInstance.Amount = (short)overflow; + } + else + { + destInstance.Amount = (short)totalAmount; + sourceInstance.Amount -= amount; + + if (sourceInstance.Amount == 0) + { + removeSource?.Invoke(source); + } + } + + return true; + } + } +} diff --git a/test/NosCore.Core.Tests/LogLanguageTests.cs b/test/NosCore.Core.Tests/LogLanguageTests.cs index 06b7f3e59..6e83d6a9c 100644 --- a/test/NosCore.Core.Tests/LogLanguageTests.cs +++ b/test/NosCore.Core.Tests/LogLanguageTests.cs @@ -1,19 +1,19 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . @@ -28,18 +28,19 @@ using NosCore.Data.Resource; using NosCore.Shared.Enumerations; using NosCore.Shared.I18N; +using SpecLight; namespace NosCore.Core.Tests { [TestClass] public class LogLanguageTests { - private readonly LogLanguageLocalizer _logLanguageLocalizer; + private readonly LogLanguageLocalizer LogLanguageLocalizer; public LogLanguageTests() { var factory = new ResourceManagerStringLocalizerFactory(Options.Create(new LocalizationOptions()), new LoggerFactory()); - _logLanguageLocalizer = new LogLanguageLocalizer( + LogLanguageLocalizer = new LogLanguageLocalizer( new StringLocalizer(factory)); } @@ -58,7 +59,7 @@ public void CheckEveryLanguageValueSet(RegionType type) { CultureInfo.CurrentCulture = new CultureInfo(type.ToString()); - var result = string.Join(Environment.NewLine, I18NTestHelpers.GetKeysWithMissingTranslations(_logLanguageLocalizer) + var result = string.Join(Environment.NewLine, I18NTestHelpers.GetKeysWithMissingTranslations(LogLanguageLocalizer) .Select(x => $"value {x} not defined")); if (result.Length != 0) @@ -81,8 +82,8 @@ public void CheckEveryLanguageAreUsefull(RegionType type) { CultureInfo.CurrentUICulture = new CultureInfo(type.ToString()); - var result = string.Join(Environment.NewLine, - I18NTestHelpers.GetUselessTranslations(_logLanguageLocalizer, Enum.GetValues(typeof(LanguageKey)).OfType().Select(s => s.ToString()) + var result = string.Join(Environment.NewLine, + I18NTestHelpers.GetUselessTranslations(LogLanguageLocalizer, Enum.GetValues(typeof(LanguageKey)).OfType().Select(s => s.ToString()) .Concat(Enum.GetValues(typeof(LogLanguageKey)).OfType().Select(s => s.ToString())).ToList()) .Select(x => $"key {x} is useless")); @@ -92,19 +93,25 @@ public void CheckEveryLanguageAreUsefull(RegionType type) } } - [TestMethod] public void CheckLanguageUsage() + { + new Spec("Check language usage") + .Then(AllLanguageKeysShouldBeUsed) + .Execute(); + } + + private void AllLanguageKeysShouldBeUsed() { var result = string.Join(Environment.NewLine, I18NTestHelpers.GetUselessLanguageKeys().Cast() .Union(I18NTestHelpers.GetUselessLanguageKeys().Cast()) .Select(x => $"{x.GetType().Name} {x} is not used!")); - + if (result.Length != 0) { Assert.Fail(result); } } } -} \ No newline at end of file +} diff --git a/test/NosCore.Database.Tests/DatabaseTests.cs b/test/NosCore.Database.Tests/DatabaseTests.cs index 36065f69e..7bad1f31c 100644 --- a/test/NosCore.Database.Tests/DatabaseTests.cs +++ b/test/NosCore.Database.Tests/DatabaseTests.cs @@ -1,19 +1,19 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . @@ -24,6 +24,7 @@ using System.Text; using Microsoft.EntityFrameworkCore; using Microsoft.VisualStudio.TestTools.UnitTesting; +using SpecLight; namespace NosCore.Database.Tests { @@ -60,12 +61,18 @@ public static bool IsNullable(PropertyInfo property) return (byte?)context.ConstructorArguments[0].Value == 2; } - // Couldn't find a suitable attribute return false; } [TestMethod] - public void Test_All_NullableForeignKeyAreAssociatedToNullableEntity() + public void AllNullableForeignKeysShouldBeAssociatedToNullableEntity() + { + new Spec("All nullable foreign keys should be associated to nullable entity") + .Then(NullableForeignKeysShouldHaveNullableNavigationProperties) + .Execute(); + } + + private void NullableForeignKeysShouldHaveNullableNavigationProperties() { using var ctx = new NosCoreContext(new DbContextOptionsBuilder().UseInMemoryDatabase( Guid.NewGuid().ToString()).Options); @@ -89,7 +96,6 @@ public void Test_All_NullableForeignKeyAreAssociatedToNullableEntity() } } - Assert.AreEqual(string.Empty, nonNullNavigation.ToString()); } } diff --git a/test/NosCore.GameObject.Tests/BazaarTests.cs b/test/NosCore.GameObject.Tests/BazaarTests.cs index 4db22b426..3d0612526 100644 --- a/test/NosCore.GameObject.Tests/BazaarTests.cs +++ b/test/NosCore.GameObject.Tests/BazaarTests.cs @@ -2,18 +2,18 @@ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . @@ -21,6 +21,7 @@ using System.Linq; using System.Linq.Expressions; using System.Threading.Tasks; +using AutoFixture; using Json.More; using Json.Patch; using Json.Pointer; @@ -28,399 +29,299 @@ using Moq; using NosCore.Dao.Interfaces; using NosCore.Data.Dto; -using NosCore.Data.Enumerations; using NosCore.Data.Enumerations.I18N; using NosCore.Data.WebApi; using NosCore.GameObject.InterChannelCommunication.Hubs.BazaarHub; using NosCore.GameObject.Services.BazaarService; using NosCore.Tests.Shared; +using NosCore.Tests.Shared.AutoFixture; +using SpecLight; namespace NosCore.GameObject.Tests { [TestClass] public class BazaarTests { - public delegate SaveResult DelegateInsert(ref BazaarItemDto y); - - private BazaarHub? _bazaarController; - private BazaarRegistry? _bazaarItemsHolder; - private Guid _guid; - private Mock>? _mockBzDao; - private Mock>? _mockItemDao; - + private BazaarHub BazaarController = null!; + private BazaarRegistry BazaarItemsHolder = null!; + private Guid Guid; + private Mock> MockBzDao = null!; + private Mock> MockItemDao = null!; + private NosCoreFixture Fixture = null!; + private LanguageKey? LastResult; [TestInitialize] public void Setup() { - _guid = Guid.NewGuid(); - _mockBzDao = new Mock>(); - _mockItemDao = new Mock>(); + Guid = Guid.NewGuid(); + Fixture = new NosCoreFixture(); + MockBzDao = new Mock>(); + MockItemDao = new Mock>(); var mockCharacterDao = new Mock>(); - _bazaarItemsHolder = - new BazaarRegistry(_mockBzDao.Object, _mockItemDao.Object, mockCharacterDao.Object); - _bazaarController = new BazaarHub(new BazaarService(_bazaarItemsHolder, _mockBzDao.Object, _mockItemDao.Object, TestHelpers.Instance.Clock)); - _mockItemDao.Setup(s => s.TryInsertOrUpdateAsync(It.IsAny())) + BazaarItemsHolder = new BazaarRegistry(MockBzDao.Object, MockItemDao.Object, mockCharacterDao.Object); + BazaarController = new BazaarHub(new BazaarService(BazaarItemsHolder, MockBzDao.Object, MockItemDao.Object, TestHelpers.Instance.Clock)); + MockItemDao.Setup(s => s.TryInsertOrUpdateAsync(It.IsAny())) .Returns(Task.FromResult); - _mockBzDao.Setup(s => s.TryInsertOrUpdateAsync(It.IsAny())) + MockBzDao.Setup(s => s.TryInsertOrUpdateAsync(It.IsAny())) .Returns(Task.FromResult); } [TestMethod] - public async Task AddToBazaarAllStackAsync() + public async Task AddingFullStackToBazaarShouldSucceed() { - _mockItemDao! - .Setup(s => s.FirstOrDefaultAsync(It.IsAny>>())) - .ReturnsAsync(new ItemInstanceDto - { - Id = _guid, - Amount = 99 - }); - var add = await _bazaarController!.AddBazaarAsync( - new BazaarRequest - { - Amount = 99, - CharacterId = 1, - CharacterName = "test", - Duration = 3600, - HasMedal = false, - IsPackage = false, - ItemInstanceId = _guid, - Price = 50 - }); - Assert.AreEqual(_guid, _bazaarItemsHolder?.GetById(0)?.BazaarItem?.ItemInstanceId); - Assert.AreEqual(99, _bazaarItemsHolder?.GetById(0)?.BazaarItem?.Amount ?? 0); - Assert.AreEqual(LanguageKey.OBJECT_IN_BAZAAR, add); + await new Spec("Adding full stack to bazaar should succeed") + .Given(AnItemExistsWithQuantity_, 99) + .WhenAsync(RegisteringItems_, 99) + .Then(TheItemShouldBeInBazaar) + .And(TheBazaarAmountShouldBe_, 99) + .And(TheResultShouldBeSuccess) + .ExecuteAsync(); } [TestMethod] - public async Task AddToBazaarPartialStackAsync() + public async Task AddingPartialStackShouldCreateNewItemInstance() { - _mockItemDao! - .Setup(s => s.FirstOrDefaultAsync(It.IsAny>>())) - .ReturnsAsync(new ItemInstanceDto - { - Id = _guid, - Amount = 99 - }); - var add = await _bazaarController!.AddBazaarAsync( - new BazaarRequest - { - Amount = 50, - CharacterId = 1, - CharacterName = "test", - Duration = 3600, - HasMedal = false, - IsPackage = false, - ItemInstanceId = _guid, - Price = 50 - }); - Assert.AreNotEqual(_guid, _bazaarItemsHolder!.GetById(0)?.BazaarItem?.ItemInstanceId); - Assert.AreEqual(50, _bazaarItemsHolder.GetById(0)?.BazaarItem?.Amount ?? 0); - Assert.AreEqual(LanguageKey.OBJECT_IN_BAZAAR, add); + await new Spec("Adding partial stack creates new item instance") + .Given(AnItemExistsWithQuantity_, 99) + .WhenAsync(RegisteringItems_, 50) + .Then(ANewItemInstanceShouldBeCreated) + .And(TheBazaarAmountShouldBe_, 50) + .And(TheResultShouldBeSuccess) + .ExecuteAsync(); } [TestMethod] - public async Task AddToBazaarNegativeAmountAsync() + public async Task AddingNegativeAmountShouldThrow() { - _mockItemDao! - .Setup(s => s.FirstOrDefaultAsync(It.IsAny>>())) - .ReturnsAsync(new ItemInstanceDto - { - Id = _guid, - Amount = 99 - }); - await Assert.ThrowsExactlyAsync(() => _bazaarController!.AddBazaarAsync( - new BazaarRequest - { - Amount = -50, - CharacterId = 1, - CharacterName = "test", - Duration = 3600, - HasMedal = false, - IsPackage = false, - ItemInstanceId = _guid, - Price = 50 - })); + await new Spec("Adding negative amount should throw") + .Given(AnItemExistsWithQuantity_, 99) + .When(AttemptingToRegisterNegativeAmountThrows) + .ExecuteAsync(); } [TestMethod] - public async Task AddToBazaarNegativePriceAsync() + public async Task AddingNegativePriceShouldThrow() { - _mockItemDao! - .Setup(s => s.FirstOrDefaultAsync(It.IsAny>>())) - .ReturnsAsync(new ItemInstanceDto - { - Id = _guid, - Amount = 99 - }); - await Assert.ThrowsExactlyAsync(() => _bazaarController!.AddBazaarAsync( - new BazaarRequest - { - Amount = 50, - CharacterId = 1, - CharacterName = "test", - Duration = 3600, - HasMedal = false, - IsPackage = false, - ItemInstanceId = _guid, - Price = -50 - })); + await new Spec("Adding negative price should throw") + .Given(AnItemExistsWithQuantity_, 99) + .When(AttemptingToRegisterNegativePriceThrows) + .ExecuteAsync(); } [TestMethod] - public async Task AddToBazaarMoreThanItemAsync() + public async Task AddingMoreThanAvailableShouldThrow() { - _mockItemDao! - .Setup(s => s.FirstOrDefaultAsync(It.IsAny>>())) - .ReturnsAsync(new ItemInstanceDto - { - Id = _guid, - Amount = 99 - }); - await Assert.ThrowsExactlyAsync(() => _bazaarController!.AddBazaarAsync( - new BazaarRequest - { - Amount = 100, - CharacterId = 1, - CharacterName = "test", - Duration = 3600, - HasMedal = false, - IsPackage = false, - ItemInstanceId = _guid, - Price = 100 - })); + await new Spec("Adding more than available should throw") + .Given(AnItemExistsWithQuantity_, 99) + .When(AttemptingToRegisterMoreThanAvailableThrows) + .ExecuteAsync(); } [TestMethod] - public async Task AddToBazaarNullItemAsync() + public async Task AddingNullItemShouldThrow() { - await Assert.ThrowsExactlyAsync(() => _bazaarController!.AddBazaarAsync( - new BazaarRequest - { - Amount = 50, - CharacterId = 1, - CharacterName = "test", - Duration = 3600, - HasMedal = false, - IsPackage = false, - ItemInstanceId = _guid, - Price = 100 - })); + await new Spec("Adding null item should throw") + .When(AttemptingToRegisterNonExistentItemThrows) + .ExecuteAsync(); } [TestMethod] - public async Task AddMoreThanLimitAsync() + public async Task ExceedingBazaarLimitShouldFail() { var rand = new Random(); - _mockBzDao!.Setup(m => m.TryInsertOrUpdateAsync(It.IsAny())) + MockBzDao.Setup(m => m.TryInsertOrUpdateAsync(It.IsAny())) .Returns((BazaarItemDto y) => - { - y.BazaarItemId = rand.Next(0, 9999999); - return Task.FromResult(y); - }); - LanguageKey? add = null; + { + y.BazaarItemId = rand.Next(0, 9999999); + return Task.FromResult(y); + }); + + await new Spec("Exceeding bazaar limit should fail") + .GivenAsync(APlayerAttemptsToListManyItems) + .Then(Only_ItemsShouldBeListed, 10) + .And(TheResultShouldBeLimitExceeded) + .ExecuteAsync(); + } + + [TestMethod] + public async Task DeletingNonExistentListingShouldThrow() + { + await new Spec("Deleting non-existent listing should throw") + .When(AttemptingToDeleteNonExistentListingThrows) + .ExecuteAsync(); + } + + [TestMethod] + public async Task OwnerCanRemoveFromBazaar() + { + await new Spec("Owner can remove from bazaar") + .GivenAsync(AnItemIsListedByOwner) + .WhenAsync(OwnerRemovesAllItems) + .Then(ListingShouldBeRemoved) + .ExecuteAsync(); + } + + [TestMethod] + public async Task ModifyingPriceShouldSucceed() + { + await new Spec("Modifying price should succeed") + .GivenAsync(AnItemIsListedAtPrice_, 80L) + .WhenAsync(ChangingPriceTo_, 50L) + .Then(PriceShouldBe_, 50L) + .ExecuteAsync(); + } + + private void AnItemExistsWithQuantity_(int amount) + { + MockItemDao + .Setup(s => s.FirstOrDefaultAsync(It.IsAny>>())) + .ReturnsAsync(new ItemInstanceDto { Id = Guid, Amount = (short)amount }); + } + + private async Task RegisteringItems_(int amount) + { + LastResult = await BazaarController.AddBazaarAsync(Fixture.Build() + .With(r => r.Amount, amount) + .With(r => r.ItemInstanceId, Guid) + .Create()); + } + + private void TheItemShouldBeInBazaar() + { + Assert.AreEqual(Guid, BazaarItemsHolder.GetById(0)?.BazaarItem?.ItemInstanceId); + } + + private void TheBazaarAmountShouldBe_(int expected) + { + Assert.AreEqual(expected, BazaarItemsHolder.GetById(0)?.BazaarItem?.Amount ?? 0); + } + + private void TheResultShouldBeSuccess() + { + Assert.AreEqual(LanguageKey.OBJECT_IN_BAZAAR, LastResult); + } + + private void ANewItemInstanceShouldBeCreated() + { + Assert.AreNotEqual(Guid, BazaarItemsHolder.GetById(0)?.BazaarItem?.ItemInstanceId); + } + + private void AttemptingToRegisterNegativeAmountThrows() + { + Assert.ThrowsExactlyAsync(async () => + await BazaarController.AddBazaarAsync(Fixture.Build() + .With(r => r.Amount, -50) + .With(r => r.ItemInstanceId, Guid) + .Create())); + } + + private void AttemptingToRegisterNegativePriceThrows() + { + Assert.ThrowsExactlyAsync(async () => + await BazaarController.AddBazaarAsync(Fixture.Build() + .With(r => r.Amount, 50) + .With(r => r.Price, -50) + .With(r => r.ItemInstanceId, Guid) + .Create())); + } + + private void AttemptingToRegisterMoreThanAvailableThrows() + { + Assert.ThrowsExactlyAsync(async () => + await BazaarController.AddBazaarAsync(Fixture.Build() + .With(r => r.Amount, 100) + .With(r => r.ItemInstanceId, Guid) + .Create())); + } + + private void AttemptingToRegisterNonExistentItemThrows() + { + Assert.ThrowsExactlyAsync(async () => + await BazaarController.AddBazaarAsync(Fixture.Build() + .With(r => r.ItemInstanceId, Guid) + .Create())); + } + + private async Task APlayerAttemptsToListManyItems() + { for (var i = 0; i < 12; i++) { var guid = Guid.NewGuid(); - _mockItemDao!.Reset(); - _mockItemDao!.Setup(s => s.TryInsertOrUpdateAsync(It.IsAny())) + MockItemDao.Reset(); + MockItemDao.Setup(s => s.TryInsertOrUpdateAsync(It.IsAny())) .Returns(Task.FromResult); - _mockItemDao! + MockItemDao .Setup(s => s.FirstOrDefaultAsync(It.IsAny>>())) - .ReturnsAsync(new ItemInstanceDto - { - Id = guid, - Amount = 99 - }); - add = await _bazaarController!.AddBazaarAsync( - new BazaarRequest - { - Amount = 99, - CharacterId = 1, - CharacterName = "test", - Duration = 3600, - HasMedal = false, - IsPackage = false, - ItemInstanceId = guid, - Price = 50 - }); + .ReturnsAsync(new ItemInstanceDto { Id = guid, Amount = 99 }); + LastResult = await BazaarController.AddBazaarAsync(Fixture.Build() + .With(r => r.Amount, 99) + .With(r => r.ItemInstanceId, guid) + .With(r => r.CharacterId, 1L) + .With(r => r.CharacterName, "test") + .With(r => r.HasMedal, false) + .Create()); } + } - Assert.AreEqual(10, _bazaarItemsHolder!.GetAll().Count()); - Assert.AreEqual(LanguageKey.LIMIT_EXCEEDED, add); + private void Only_ItemsShouldBeListed(int value) + { + Assert.AreEqual(10, BazaarItemsHolder.GetAll().Count()); } - [TestMethod] - public async Task DeleteFromBazaarNegativeCountAsync() + private void TheResultShouldBeLimitExceeded() { - _mockItemDao! - .Setup(s => s.FirstOrDefaultAsync(It.IsAny>>())) - .ReturnsAsync(new ItemInstanceDto - { - Id = _guid, - Amount = 99 - }); - await _bazaarController!.AddBazaarAsync( - new BazaarRequest - { - Amount = 99, - CharacterId = 1, - CharacterName = "test", - Duration = 3600, - HasMedal = false, - IsPackage = false, - ItemInstanceId = _guid, - Price = 50 - }); - Assert.AreEqual(false, await _bazaarController.DeleteBazaarAsync(0, -1, "test")); + Assert.AreEqual(LanguageKey.LIMIT_EXCEEDED, LastResult); } - [TestMethod] - public async Task DeleteFromBazaarMoreThanRegisteredAsync() + private void AttemptingToDeleteNonExistentListingThrows() { - _mockItemDao! - .Setup(s => s.FirstOrDefaultAsync(It.IsAny>>())) - .ReturnsAsync(new ItemInstanceDto - { - Id = _guid, - Amount = 99 - }); - await _bazaarController!.AddBazaarAsync( - new BazaarRequest - { - Amount = 99, - CharacterId = 1, - CharacterName = "test", - Duration = 3600, - HasMedal = false, - IsPackage = false, - ItemInstanceId = _guid, - Price = 50 - }); - Assert.AreEqual(false, await _bazaarController.DeleteBazaarAsync(0, 100, "test")); + Assert.ThrowsExactlyAsync(async () => + await BazaarController.DeleteBazaarAsync(0, 99, "test")); } - [TestMethod] - public async Task DeleteFromBazaarSomeoneElseAsync() + private async Task AnItemIsListedByOwner() { - _mockItemDao! - .Setup(s => s.FirstOrDefaultAsync(It.IsAny>>())) - .ReturnsAsync(new ItemInstanceDto - { - Id = _guid, - Amount = 99 - }); - await _bazaarController!.AddBazaarAsync( - new BazaarRequest - { - Amount = 99, - CharacterId = 1, - CharacterName = "test", - Duration = 3600, - HasMedal = false, - IsPackage = false, - ItemInstanceId = _guid, - Price = 50 - }); - Assert.AreEqual(true, await _bazaarController.DeleteBazaarAsync(0, 99, "test2")); - Assert.AreEqual(1, _bazaarItemsHolder!.GetAll().Count()); - Assert.AreEqual(0, _bazaarItemsHolder.GetById(0)?.ItemInstance?.Amount ?? 0); - Assert.AreEqual(99, _bazaarItemsHolder.GetById(0)?.BazaarItem?.Amount ?? 0); + AnItemExistsWithQuantity_(99); + await BazaarController.AddBazaarAsync(Fixture.Build() + .With(r => r.Amount, 99) + .With(r => r.ItemInstanceId, Guid) + .With(r => r.CharacterName, "test") + .Create()); } - [TestMethod] - public async Task DeleteFromUserBazaarAsync() + private async Task OwnerRemovesAllItems() { - _mockItemDao! - .Setup(s => s.FirstOrDefaultAsync(It.IsAny>>())) - .ReturnsAsync(new ItemInstanceDto - { - Id = _guid, - Amount = 99 - }); - await _bazaarController!.AddBazaarAsync( - new BazaarRequest - { - Amount = 99, - CharacterId = 1, - CharacterName = "test", - Duration = 3600, - HasMedal = false, - IsPackage = false, - ItemInstanceId = _guid, - Price = 50 - }); - Assert.AreEqual(true, await _bazaarController.DeleteBazaarAsync(0, 99, "test")); - Assert.AreEqual(0, _bazaarItemsHolder!.GetAll().Count()); + var result = await BazaarController.DeleteBazaarAsync(0, 99, "test"); + Assert.IsTrue(result); } - [TestMethod] - public async Task DeleteFromBazaarNotRegisteredAsync() + private void ListingShouldBeRemoved() { - await Assert.ThrowsExactlyAsync(() => _bazaarController!.DeleteBazaarAsync(0, 99, "test")); + Assert.AreEqual(0, BazaarItemsHolder.GetAll().Count()); } - [TestMethod] - public async Task ModifyBazaarNotRegisteredAsync() + private async Task AnItemIsListedAtPrice_(long price) { - var patch = new JsonPatch(PatchOperation.Replace(JsonPointer.Parse("/BazaarItem/Price"), 50.AsJsonElement().AsNode())); - Assert.IsNull(await _bazaarController!.ModifyBazaarAsync(0, patch)); + AnItemExistsWithQuantity_(99); + await BazaarController.AddBazaarAsync(Fixture.Build() + .With(r => r.Amount, 99) + .With(r => r.ItemInstanceId, Guid) + .With(r => r.Price, price) + .Create()); } - [TestMethod] - public async Task ModifyBazaarAsync() + private async Task ChangingPriceTo_(long newPrice) { - _mockItemDao! - .Setup(s => s.FirstOrDefaultAsync(It.IsAny>>())) - .ReturnsAsync(new ItemInstanceDto - { - Id = _guid, - Amount = 99 - }); - await _bazaarController!.AddBazaarAsync( - new BazaarRequest - { - Amount = 99, - CharacterId = 1, - CharacterName = "test", - Duration = 3600, - HasMedal = false, - IsPackage = false, - ItemInstanceId = _guid, - Price = 80 - }); - var patch = new JsonPatch(PatchOperation.Replace(JsonPointer.Parse("/BazaarItem/Price"), 50.AsJsonElement().AsNode())); - Assert.IsNotNull(await _bazaarController.ModifyBazaarAsync(0, patch)); - Assert.AreEqual(50, _bazaarItemsHolder?.GetById(0)?.BazaarItem?.Price); + var patch = new JsonPatch(PatchOperation.Replace( + JsonPointer.Parse("/BazaarItem/Price"), newPrice.AsJsonElement().AsNode())); + var result = await BazaarController.ModifyBazaarAsync(0, patch); + Assert.IsNotNull(result); } - [TestMethod] - public async Task ModifyBazaarAlreadySoldAsync() + private void PriceShouldBe_(long expected) { - _mockItemDao! - .Setup(s => s.FirstOrDefaultAsync(It.IsAny>>())) - .ReturnsAsync(new ItemInstanceDto - { - Id = _guid, - Amount = 99 - }); - var add = await _bazaarController!.AddBazaarAsync( - new BazaarRequest - { - Amount = 99, - CharacterId = 1, - CharacterName = "test", - Duration = 3600, - HasMedal = false, - IsPackage = false, - ItemInstanceId = _guid, - Price = 50 - }); - _bazaarItemsHolder!.GetById(0)!.ItemInstance!.Amount--; - var patch = new JsonPatch(PatchOperation.Replace(JsonPointer.Parse("/BazaarItem/Price"), 10.AsJsonElement().AsNode())); - Assert.IsNull(await _bazaarController.ModifyBazaarAsync(0, patch)); - Assert.AreEqual(50, _bazaarItemsHolder.GetById(0)?.BazaarItem?.Price); + Assert.AreEqual(expected, BazaarItemsHolder.GetById(0)?.BazaarItem?.Price); } } -} \ No newline at end of file +} diff --git a/test/NosCore.GameObject.Tests/GroupTests.cs b/test/NosCore.GameObject.Tests/GroupTests.cs index 699915d20..8e6376a1e 100644 --- a/test/NosCore.GameObject.Tests/GroupTests.cs +++ b/test/NosCore.GameObject.Tests/GroupTests.cs @@ -1,19 +1,19 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . @@ -30,104 +30,162 @@ using NosCore.Core.Services.IdService; using NosCore.Data.Enumerations.Character; using NosCore.Data.Enumerations.Group; -using NosCore.GameObject.Services.ExchangeService; using NosCore.GameObject.ComponentEntities.Entities; +using NosCore.GameObject.Services.ExchangeService; using NosCore.GameObject.Services.GroupService; using NosCore.GameObject.Services.InventoryService; using NosCore.GameObject.Services.ItemGenerationService; using NosCore.GameObject.Services.SpeedCalculationService; using NosCore.Networking.SessionGroup; using NosCore.Tests.Shared; -using Serilog; +using NosCore.Tests.Shared.AutoFixture; +using SpecLight; namespace NosCore.GameObject.Tests { [TestClass] public class GroupTests { - private static readonly ILogger Logger = new Mock().Object; - private Group? _group; + private Group Group = null!; + private NosCoreFixture Fixture = null!; [TestInitialize] public void Setup() { - _group = new Group(GroupType.Group, new Mock().Object) + Fixture = new NosCoreFixture(); + Group = new Group(GroupType.Group, new Mock().Object) { GroupId = new IdService(1).GetNextId() }; } - [TestMethod] - public void Test_Add_Player() + private Character CreateCharacter(long id = 1, string name = "TestCharacter") { - var entity = new Character(new Mock().Object, new Mock().Object, new Mock().Object, new HpService(), new MpService(), new ExperienceService(), new JobExperienceService(), new HeroExperienceService(), new ReputationService(), new DignityService(), TestHelpers.Instance.WorldConfiguration, new Mock().Object, new Mock().Object, TestHelpers.Instance.SessionRegistry, TestHelpers.Instance.GameLanguageLocalizer) + return new Character( + new Mock().Object, + new Mock().Object, + new Mock().Object, + new HpService(), + new MpService(), + new ExperienceService(), + new JobExperienceService(), + new HeroExperienceService(), + new ReputationService(), + new DignityService(), + TestHelpers.Instance.WorldConfiguration, + new Mock().Object, + new Mock().Object, + TestHelpers.Instance.SessionRegistry, + TestHelpers.Instance.GameLanguageLocalizer) { - Name = "TestExistingCharacter", + CharacterId = id, + Name = name, Slot = 1, - AccountId = 1, + AccountId = id, MapId = 1, State = CharacterState.Active }; + } - _group!.JoinGroup(entity); + [TestMethod] + public void AddingSinglePlayerToGroupShouldNotFormFullGroup() + { + new Spec("Adding single player to group should not form full group") + .When(ASinglePlayerJoins) + .Then(GroupShouldNotHave_Members, 2) + .Execute(); + } - Assert.IsFalse(_group.Count == 2); + [TestMethod] + public void RemovingOnlyPlayerShouldLeaveGroupEmpty() + { + new Spec("Removing only player should leave group empty") + .Given(AGroupWithOnePlayer) + .When(ThePlayerLeaves) + .Then(GroupShouldBeEmpty) + .Execute(); } [TestMethod] - public void Test_Remove_Player() + public void PetsCannotJoinGroups() { - var entity = new Character(new Mock().Object, new Mock().Object, new Mock().Object, new HpService(), new MpService(), new ExperienceService(), new JobExperienceService(), new HeroExperienceService(), new ReputationService(), new DignityService(), TestHelpers.Instance.WorldConfiguration, new Mock().Object, new Mock().Object, TestHelpers.Instance.SessionRegistry, TestHelpers.Instance.GameLanguageLocalizer) - { - Name = "TestExistingCharacter", - Slot = 1, - AccountId = 1, - MapId = 1, - State = CharacterState.Active - }; + new Spec("Pets cannot join groups") + .When(APetAttemptsToJoin) + .Then(GroupShouldRemainEmpty) + .Execute(); + } + + [TestMethod] + public void LeaderShouldTransferWhenOriginalLeaderLeaves() + { + new Spec("Leader should transfer when original leader leaves") + .Given(AFullGroupWithALeader) + .Then(GroupShouldBeFullAndHaveALeader) + .When(TheLeaderLeaves) + .Then(LeadershipShouldTransferToNextMember) + .Execute(); + } - _group!.JoinGroup(entity); + private void ASinglePlayerJoins() + { + Group.JoinGroup(CreateCharacter()); + } - Assert.IsFalse(_group.Count == 2); + private void GroupShouldNotHave_Members(int value) + { + Assert.IsFalse(Group.Count == 2); + } - _group.LeaveGroup(entity); + private void AGroupWithOnePlayer() + { + var entity = CreateCharacter(); + Group.JoinGroup(entity); + } - Assert.IsTrue(_group.Count == 0); + private void ThePlayerLeaves() + { + var player = Group.ElementAt(0).Value.Item2; + Group.LeaveGroup(player); } - [TestMethod] - public void Test_Monster_Join_Group() + private void GroupShouldBeEmpty() { - var entity = new Pet(); + Assert.AreEqual(0, Group.Count); + } - _group!.JoinGroup(entity); + private void APetAttemptsToJoin() + { + Group.JoinGroup(new Pet()); + } - Assert.IsTrue(_group.IsEmpty); + private void GroupShouldRemainEmpty() + { + Assert.IsTrue(Group.IsEmpty); } - [TestMethod] - public void Test_Leader_Change() + private void AFullGroupWithALeader() { - for (var i = 0; i < (long)_group!.Type; i++) + for (var i = 0; i < (long)Group.Type; i++) { - var entity = new Character(new Mock().Object, new Mock().Object, new Mock().Object, new HpService(), new MpService(), new ExperienceService(), new JobExperienceService(), new HeroExperienceService(), new ReputationService(), new DignityService(), TestHelpers.Instance.WorldConfiguration, new Mock().Object, new Mock().Object, TestHelpers.Instance.SessionRegistry, TestHelpers.Instance.GameLanguageLocalizer) - { - CharacterId = i + 1, - Name = $"TestExistingCharacter{i}", - Slot = 1, - AccountId = i + 1, - MapId = 1, - State = CharacterState.Active - }; - - _group.JoinGroup(entity); + Group.JoinGroup(CreateCharacter(i + 1, $"TestCharacter{i}")); } + } - Assert.IsTrue(_group.IsGroupFull && _group.IsGroupLeader(_group.ElementAt(0).Value.Item2.VisualId)); + private void GroupShouldBeFullAndHaveALeader() + { + Assert.IsTrue(Group.IsGroupFull); + Assert.IsTrue(Group.IsGroupLeader(Group.ElementAt(0).Value.Item2.VisualId)); + } - _group.LeaveGroup(_group.ElementAt(0).Value.Item2); + private void TheLeaderLeaves() + { + Group.LeaveGroup(Group.ElementAt(0).Value.Item2); + } - Assert.IsTrue(!_group.IsGroupFull && _group.IsGroupLeader(_group.ElementAt(1).Value.Item2.VisualId)); + private void LeadershipShouldTransferToNextMember() + { + Assert.IsFalse(Group.IsGroupFull); + Assert.IsTrue(Group.IsGroupLeader(Group.ElementAt(1).Value.Item2.VisualId)); } } -} \ No newline at end of file +} diff --git a/test/NosCore.GameObject.Tests/Services/AuthService/AuthCodeServiceTests.cs b/test/NosCore.GameObject.Tests/Services/AuthService/AuthCodeServiceTests.cs new file mode 100644 index 000000000..a66172d92 --- /dev/null +++ b/test/NosCore.GameObject.Tests/Services/AuthService/AuthCodeServiceTests.cs @@ -0,0 +1,202 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using NosCore.GameObject.Services.AuthService; +using SpecLight; + +namespace NosCore.GameObject.Tests.Services.AuthService +{ + [TestClass] + public class AuthCodeServiceTests + { + private IAuthCodeService Service = null!; + + [TestInitialize] + public void Setup() + { + Service = new AuthCodeService(); + } + + [TestMethod] + public async Task StoreAuthCodeShouldAllowRetrieval() + { + await new Spec("Store auth code should allow retrieval") + .When(StoringAuthCode) + .Then(AuthCodeShouldBeRetrievable) + .ExecuteAsync(); + } + + [TestMethod] + public async Task GetAccountByAuthCodeShouldReturnNullForUnknownCode() + { + await new Spec("Get account by auth code should return null for unknown code") + .When(GettingUnknownAuthCode) + .Then(ResultShouldBeNull) + .ExecuteAsync(); + } + + [TestMethod] + public async Task TryRemoveAuthCodeShouldRemoveCode() + { + await new Spec("Try remove auth code should remove code") + .Given(AuthCodeIsStored) + .When(RemovingAuthCode) + .Then(RemoveShouldSucceed) + .And(AuthCodeShouldNoLongerExist) + .ExecuteAsync(); + } + + [TestMethod] + public async Task TryRemoveAuthCodeShouldFailForUnknownCode() + { + await new Spec("Try remove auth code should fail for unknown code") + .When(RemovingUnknownAuthCode) + .Then(RemoveShouldFail) + .ExecuteAsync(); + } + + [TestMethod] + public async Task MarkReadyForAuthShouldAllowVerification() + { + await new Spec("Mark ready for auth should allow verification") + .When(MarkingReadyForAuth) + .Then(IsReadyForAuthShouldReturnTrue) + .ExecuteAsync(); + } + + [TestMethod] + public async Task IsReadyForAuthShouldReturnFalseForWrongSession() + { + await new Spec("Is ready for auth should return false for wrong session") + .Given(AccountIsMarkedReady) + .When(CheckingReadyWithWrongSession) + .Then(WrongSessionCheckShouldReturnFalse) + .ExecuteAsync(); + } + + [TestMethod] + public async Task ClearReadyForAuthShouldRemoveReadyState() + { + await new Spec("Clear ready for auth should remove ready state") + .Given(AccountIsMarkedReady) + .When(ClearingReadyForAuth) + .Then(IsReadyShouldReturnFalse) + .ExecuteAsync(); + } + + private const string TestAuthCode = "test-auth-code"; + private const string TestAccountName = "TestAccount"; + private const long TestSessionId = 12345; + private string? RetrievedAccountName; + private bool RemoveResult; + private bool IsReadyResult; + + private void StoringAuthCode() + { + Service.StoreAuthCode(TestAuthCode, TestAccountName); + } + + private void AuthCodeIsStored() + { + Service.StoreAuthCode(TestAuthCode, TestAccountName); + } + + private void AccountIsMarkedReady() + { + Service.MarkReadyForAuth(TestAccountName, TestSessionId); + } + + private void GettingUnknownAuthCode() + { + RetrievedAccountName = Service.GetAccountByAuthCode("unknown-code"); + } + + private void RemovingAuthCode() + { + RemoveResult = Service.TryRemoveAuthCode(TestAuthCode, out RetrievedAccountName); + } + + private void RemovingUnknownAuthCode() + { + RemoveResult = Service.TryRemoveAuthCode("unknown-code", out RetrievedAccountName); + } + + private void MarkingReadyForAuth() + { + Service.MarkReadyForAuth(TestAccountName, TestSessionId); + } + + private void CheckingReadyWithWrongSession() + { + IsReadyResult = Service.IsReadyForAuth(TestAccountName, 99999); + } + + private void ClearingReadyForAuth() + { + Service.ClearReadyForAuth(TestAccountName); + } + + private void AuthCodeShouldBeRetrievable() + { + var result = Service.GetAccountByAuthCode(TestAuthCode); + Assert.AreEqual(TestAccountName, result); + } + + private void ResultShouldBeNull() + { + Assert.IsNull(RetrievedAccountName); + } + + private void RemoveShouldSucceed() + { + Assert.IsTrue(RemoveResult); + Assert.AreEqual(TestAccountName, RetrievedAccountName); + } + + private void RemoveShouldFail() + { + Assert.IsFalse(RemoveResult); + } + + private void AuthCodeShouldNoLongerExist() + { + var result = Service.GetAccountByAuthCode(TestAuthCode); + Assert.IsNull(result); + } + + private void IsReadyForAuthShouldReturnTrue() + { + var result = Service.IsReadyForAuth(TestAccountName, TestSessionId); + Assert.IsTrue(result); + } + + private void WrongSessionCheckShouldReturnFalse() + { + Assert.IsFalse(IsReadyResult); + } + + private void IsReadyShouldReturnFalse() + { + var result = Service.IsReadyForAuth(TestAccountName, TestSessionId); + Assert.IsFalse(result); + } + } +} diff --git a/test/NosCore.GameObject.Tests/Services/BattleService/BattleServiceTests.cs b/test/NosCore.GameObject.Tests/Services/BattleService/BattleServiceTests.cs new file mode 100644 index 000000000..264e83856 --- /dev/null +++ b/test/NosCore.GameObject.Tests/Services/BattleService/BattleServiceTests.cs @@ -0,0 +1,66 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using NosCore.GameObject.Services.BattleService; +using NosCore.Tests.Shared; +using SpecLight; + +namespace NosCore.GameObject.Tests.Services.BattleService +{ + [TestClass] + public class BattleServiceTests + { + private IBattleService Service = null!; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Service = new GameObject.Services.BattleService.BattleService(); + } + + [TestMethod] + public async Task ServiceCanBeConstructed() + { + await new Spec("Service can be constructed") + .Then(ServiceShouldNotBeNull) + .ExecuteAsync(); + } + + [TestMethod] + public async Task ServiceImplementsInterface() + { + await new Spec("Service implements interface") + .Then(ServiceShouldImplementInterface) + .ExecuteAsync(); + } + + private void ServiceShouldNotBeNull() + { + Assert.IsNotNull(Service); + } + + private void ServiceShouldImplementInterface() + { + Assert.IsInstanceOfType(Service, typeof(IBattleService)); + } + } +} diff --git a/test/NosCore.GameObject.Tests/Services/BazaarService/BazaarRegistryTests.cs b/test/NosCore.GameObject.Tests/Services/BazaarService/BazaarRegistryTests.cs new file mode 100644 index 000000000..b79f92d16 --- /dev/null +++ b/test/NosCore.GameObject.Tests/Services/BazaarService/BazaarRegistryTests.cs @@ -0,0 +1,250 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.Dao.Interfaces; +using NosCore.Data.Dto; +using NosCore.Data.WebApi; +using NosCore.GameObject.Services.BazaarService; +using SpecLight; + +namespace NosCore.GameObject.Tests.Services.BazaarService +{ + [TestClass] + public class BazaarRegistryTests + { + private IBazaarRegistry Registry = null!; + private Mock> MockBazaarItemDao = null!; + private Mock> MockItemInstanceDao = null!; + private Mock> MockCharacterDao = null!; + + private BazaarLink? ResultLink; + private IEnumerable? ResultLinks; + private bool UnregisterResult; + private int CountResult; + + private const long TestBazaarItemId = 1; + private const long TestBazaarItemId2 = 2; + private const long TestSellerId = 100; + private const long TestSellerId2 = 200; + private const string TestSellerName = "TestSeller"; + private const string TestSellerName2 = "TestSeller2"; + + [TestInitialize] + public void Setup() + { + MockBazaarItemDao = new Mock>(); + MockItemInstanceDao = new Mock>(); + MockCharacterDao = new Mock>(); + + MockBazaarItemDao.Setup(d => d.LoadAll()).Returns(new List()); + MockItemInstanceDao.Setup(d => d.Where(It.IsAny>>())) + .Returns(new List()); + MockCharacterDao.Setup(d => d.Where(It.IsAny>>())) + .Returns(new List()); + + Registry = new BazaarRegistry(MockBazaarItemDao.Object, MockItemInstanceDao.Object, MockCharacterDao.Object); + } + + [TestMethod] + public async Task RegisterShouldAddBazaarLink() + { + await new Spec("Register should add bazaar link") + .Given(ABazaarLinkIsCreated) + .When(RegisteringTheBazaarLink) + .Then(BazaarLinkShouldBeRetrievable) + .ExecuteAsync(); + } + + [TestMethod] + public async Task GetByIdShouldReturnNullForUnknownId() + { + await new Spec("GetById should return null for unknown id") + .When(GettingBazaarLinkByUnknownId) + .Then(ResultShouldBeNull) + .ExecuteAsync(); + } + + [TestMethod] + public async Task UnregisterShouldRemoveBazaarLink() + { + await new Spec("Unregister should remove bazaar link") + .Given(ABazaarLinkIsRegistered) + .When(UnregisteringTheBazaarLink) + .Then(UnregisterShouldSucceed) + .And(BazaarLinkShouldNotExist) + .ExecuteAsync(); + } + + [TestMethod] + public async Task GetBySellerIdShouldFilterCorrectly() + { + await new Spec("GetBySellerId should filter correctly") + .Given(MultipleBazaarLinksAreRegistered) + .When(GettingBazaarLinksBySellerId) + .Then(OnlyLinksForSellerShouldBeReturned) + .ExecuteAsync(); + } + + [TestMethod] + public async Task CountBySellerIdShouldReturnCorrectCount() + { + await new Spec("CountBySellerId should return correct count") + .Given(MultipleBazaarLinksAreRegistered) + .When(CountingBazaarLinksBySellerId) + .Then(CountShouldBeCorrect) + .ExecuteAsync(); + } + + [TestMethod] + public async Task UpdateShouldReplaceExistingLink() + { + await new Spec("Update should replace existing link") + .Given(ABazaarLinkIsRegistered) + .When(UpdatingTheBazaarLink) + .Then(BazaarLinkShouldBeUpdated) + .ExecuteAsync(); + } + + private BazaarLink? TestBazaarLink; + private BazaarLink? UpdatedBazaarLink; + + private void ABazaarLinkIsCreated() + { + TestBazaarLink = CreateBazaarLink(TestBazaarItemId, TestSellerId, TestSellerName); + } + + private void ABazaarLinkIsRegistered() + { + ABazaarLinkIsCreated(); + Registry.Register(TestBazaarItemId, TestBazaarLink!); + } + + private void MultipleBazaarLinksAreRegistered() + { + var link1 = CreateBazaarLink(TestBazaarItemId, TestSellerId, TestSellerName); + var link2 = CreateBazaarLink(TestBazaarItemId2, TestSellerId, TestSellerName); + var link3 = CreateBazaarLink(3, TestSellerId2, TestSellerName2); + + Registry.Register(TestBazaarItemId, link1); + Registry.Register(TestBazaarItemId2, link2); + Registry.Register(3, link3); + } + + private void RegisteringTheBazaarLink() + { + Registry.Register(TestBazaarItemId, TestBazaarLink!); + } + + private void GettingBazaarLinkByUnknownId() + { + ResultLink = Registry.GetById(9999); + } + + private void UnregisteringTheBazaarLink() + { + UnregisterResult = Registry.Unregister(TestBazaarItemId); + } + + private void GettingBazaarLinksBySellerId() + { + ResultLinks = Registry.GetBySellerId(TestSellerId); + } + + private void CountingBazaarLinksBySellerId() + { + CountResult = Registry.CountBySellerId(TestSellerId); + } + + private void UpdatingTheBazaarLink() + { + UpdatedBazaarLink = CreateBazaarLink(TestBazaarItemId, TestSellerId, "UpdatedSellerName"); + Registry.Update(TestBazaarItemId, UpdatedBazaarLink); + } + + private void BazaarLinkShouldBeRetrievable() + { + var result = Registry.GetById(TestBazaarItemId); + Assert.IsNotNull(result); + Assert.AreEqual(TestSellerName, result.SellerName); + } + + private void ResultShouldBeNull() + { + Assert.IsNull(ResultLink); + } + + private void UnregisterShouldSucceed() + { + Assert.IsTrue(UnregisterResult); + } + + private void BazaarLinkShouldNotExist() + { + var result = Registry.GetById(TestBazaarItemId); + Assert.IsNull(result); + } + + private void OnlyLinksForSellerShouldBeReturned() + { + Assert.IsNotNull(ResultLinks); + var linksList = ResultLinks.ToList(); + Assert.AreEqual(2, linksList.Count); + Assert.IsTrue(linksList.All(l => l.BazaarItem?.SellerId == TestSellerId)); + } + + private void CountShouldBeCorrect() + { + Assert.AreEqual(2, CountResult); + } + + private void BazaarLinkShouldBeUpdated() + { + var result = Registry.GetById(TestBazaarItemId); + Assert.IsNotNull(result); + Assert.AreEqual("UpdatedSellerName", result.SellerName); + } + + private static BazaarLink CreateBazaarLink(long bazaarItemId, long sellerId, string sellerName) + { + return new BazaarLink + { + BazaarItem = new BazaarItemDto + { + BazaarItemId = bazaarItemId, + SellerId = sellerId, + ItemInstanceId = Guid.NewGuid(), + Amount = 1, + Price = 100 + }, + ItemInstance = new ItemInstanceDto + { + Id = Guid.NewGuid(), + Amount = 1 + }, + SellerName = sellerName + }; + } + } +} diff --git a/test/NosCore.GameObject.Tests/Services/BlacklistService/BlacklistServiceTests.cs b/test/NosCore.GameObject.Tests/Services/BlacklistService/BlacklistServiceTests.cs new file mode 100644 index 000000000..40272ebbf --- /dev/null +++ b/test/NosCore.GameObject.Tests/Services/BlacklistService/BlacklistServiceTests.cs @@ -0,0 +1,258 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.Core; +using NosCore.Data.Dto; +using NosCore.Data.Enumerations.I18N; +using NosCore.Data.WebApi; +using NosCore.GameObject.InterChannelCommunication.Hubs.ChannelHub; +using NosCore.GameObject.InterChannelCommunication.Hubs.PubSub; +using NosCore.GameObject.Services.BlackListService; +using NosCore.Packets.Enumerations; +using NosCore.Shared.Enumerations; +using NosCore.Tests.Shared; +using SpecLight; + +namespace NosCore.GameObject.Tests.Services.BlacklistService +{ + [TestClass] + public class BlacklistServiceTests + { + private IBlacklistService Service = null!; + private Mock PubSubHub = null!; + private Mock ChannelHub = null!; + private long CharacterId; + private long TargetCharacterId; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + PubSubHub = new Mock(); + ChannelHub = new Mock(); + + ChannelHub.Setup(s => s.GetCommunicationChannels()) + .ReturnsAsync(new List + { + new ChannelInfo { Type = ServerType.WorldServer, Id = 1 } + }); + + CharacterId = 1; + TargetCharacterId = 2; + + Service = new GameObject.Services.BlackListService.BlacklistService( + PubSubHub.Object, + ChannelHub.Object, + TestHelpers.Instance.CharacterRelationDao, + TestHelpers.Instance.CharacterDao); + } + + [TestMethod] + public async Task BlacklistingPlayerShouldSucceed() + { + await new Spec("Blacklisting player should succeed") + .GivenAsync(BothPlayersAreOnline) + .WhenAsync(BlacklistingTarget) + .ThenAsync(BlacklistRelationShouldExist) + .ExecuteAsync(); + } + + [TestMethod] + public async Task BlacklistingDisconnectedPlayerShouldThrow() + { + await new Spec("Blacklisting disconnected player should throw") + .Given(TargetIsOffline) + .WhenAsync(BlacklistingTarget).Catch(out var exception) + .Then(ShouldThrowArgumentException_, exception) + .ExecuteAsync(); + } + + [TestMethod] + public async Task BlacklistingSamePlayerTwiceShouldReturnAlreadyBlacklisted() + { + await new Spec("Blacklisting same player twice should return already blacklisted") + .GivenAsync(BothPlayersAreOnline) + .AndAsync(TargetIsAlreadyBlacklisted) + .WhenAsync(BlacklistingTarget) + .Then(ResultShouldBeAlreadyBlacklisted) + .ExecuteAsync(); + } + + [TestMethod] + public async Task BlacklistingFriendShouldReturnCantBlockFriend() + { + await new Spec("Blacklisting friend should return can't block friend") + .GivenAsync(BothPlayersAreOnline) + .AndAsync(TargetIsFriend) + .WhenAsync(BlacklistingTarget) + .Then(ResultShouldBeCantBlockFriend) + .ExecuteAsync(); + } + + [TestMethod] + public async Task GetBlacklistedListShouldReturnBlockedRelations() + { + await new Spec("Get blacklisted list should return blocked relations") + .GivenAsync(BothPlayersAreOnline) + .AndAsync(TargetIsAlreadyBlacklisted) + .WhenAsync(GettingBlacklistedList) + .Then(ListShouldContainTarget) + .ExecuteAsync(); + } + + [TestMethod] + public async Task UnblacklistingShouldRemoveRelation() + { + await new Spec("Unblacklisting should remove relation") + .GivenAsync(BothPlayersAreOnline) + .AndAsync(TargetIsAlreadyBlacklisted) + .WhenAsync(UnblacklistingTarget) + .Then(UnblacklistShouldSucceed) + .ExecuteAsync(); + } + + [TestMethod] + public async Task UnblacklistingNonExistentShouldReturnFalse() + { + await new Spec("Unblacklisting non-existent should return false") + .WhenAsync(UnblacklistingNonExistent) + .Then(UnblacklistShouldFail) + .ExecuteAsync(); + } + + private LanguageKey? BlacklistResult; + private List? BlacklistedList; + private bool UnblacklistResult; + private Guid? BlockRelationId; + + private async Task BothPlayersAreOnline() + { + var session1 = await TestHelpers.Instance.GenerateSessionAsync(); + var session2 = await TestHelpers.Instance.GenerateSessionAsync(); + CharacterId = session1.Character.CharacterId; + TargetCharacterId = session2.Character.CharacterId; + + PubSubHub.Setup(s => s.GetSubscribersAsync()) + .ReturnsAsync(new List + { + new Subscriber { ChannelId = 1, ConnectedCharacter = new Character { Id = CharacterId } }, + new Subscriber { ChannelId = 1, ConnectedCharacter = new Character { Id = TargetCharacterId } } + }); + } + + private void TargetIsOffline() + { + PubSubHub.Setup(s => s.GetSubscribersAsync()) + .ReturnsAsync(new List + { + new Subscriber { ChannelId = 1, ConnectedCharacter = new Character { Id = CharacterId } } + }); + } + + private async Task TargetIsAlreadyBlacklisted() + { + var relation = new CharacterRelationDto + { + CharacterId = CharacterId, + RelatedCharacterId = TargetCharacterId, + RelationType = CharacterRelationType.Blocked + }; + var inserted = await TestHelpers.Instance.CharacterRelationDao.TryInsertOrUpdateAsync(relation); + BlockRelationId = inserted.CharacterRelationId; + } + + private async Task TargetIsFriend() + { + var relation = new CharacterRelationDto + { + CharacterId = CharacterId, + RelatedCharacterId = TargetCharacterId, + RelationType = CharacterRelationType.Friend + }; + await TestHelpers.Instance.CharacterRelationDao.TryInsertOrUpdateAsync(relation); + } + + private async Task BlacklistingTarget() + { + BlacklistResult = await Service.BlacklistPlayerAsync(CharacterId, TargetCharacterId); + } + + private void ShouldThrowArgumentException_(Lazy exception) + { + Assert.IsInstanceOfType(exception.Value, typeof(ArgumentException)); + } + + private async Task GettingBlacklistedList() + { + BlacklistedList = await Service.GetBlacklistedListAsync(CharacterId); + } + + private async Task UnblacklistingTarget() + { + UnblacklistResult = await Service.UnblacklistAsync(BlockRelationId!.Value); + } + + private async Task UnblacklistingNonExistent() + { + UnblacklistResult = await Service.UnblacklistAsync(Guid.NewGuid()); + } + + private async Task BlacklistRelationShouldExist() + { + var relation = await TestHelpers.Instance.CharacterRelationDao.FirstOrDefaultAsync(s => + s.CharacterId == CharacterId && + s.RelatedCharacterId == TargetCharacterId && + s.RelationType == CharacterRelationType.Blocked); + Assert.IsNotNull(relation); + Assert.AreEqual(LanguageKey.BLACKLIST_ADDED, BlacklistResult); + } + + private void ResultShouldBeAlreadyBlacklisted() + { + Assert.AreEqual(LanguageKey.ALREADY_BLACKLISTED, BlacklistResult); + } + + private void ResultShouldBeCantBlockFriend() + { + Assert.AreEqual(LanguageKey.CANT_BLOCK_FRIEND, BlacklistResult); + } + + private void ListShouldContainTarget() + { + Assert.IsNotNull(BlacklistedList); + Assert.IsTrue(BlacklistedList.Any(s => s.CharacterId == TargetCharacterId)); + } + + private void UnblacklistShouldSucceed() + { + Assert.IsTrue(UnblacklistResult); + } + + private void UnblacklistShouldFail() + { + Assert.IsFalse(UnblacklistResult); + } + } +} diff --git a/test/NosCore.GameObject.Tests/Services/BroadcastService/SessionRegistryTests.cs b/test/NosCore.GameObject.Tests/Services/BroadcastService/SessionRegistryTests.cs new file mode 100644 index 000000000..2aadf480e --- /dev/null +++ b/test/NosCore.GameObject.Tests/Services/BroadcastService/SessionRegistryTests.cs @@ -0,0 +1,226 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.Data.WebApi; +using NosCore.GameObject.Services.BroadcastService; +using Serilog; +using SpecLight; + +namespace NosCore.GameObject.Tests.Services.BroadcastService +{ + [TestClass] + public class SessionRegistryTests + { + private ISessionRegistry Registry = null!; + private Mock MockLogger = null!; + + [TestInitialize] + public void Setup() + { + MockLogger = new Mock(); + Registry = new SessionRegistry(MockLogger.Object); + } + + [TestMethod] + public async Task RegisterShouldAddSession() + { + await new Spec("Register should add session") + .When(RegisteringSession) + .Then(SessionShouldBeRetrievable) + .ExecuteAsync(); + } + + [TestMethod] + public async Task UnregisterShouldRemoveSession() + { + await new Spec("Unregister should remove session") + .Given(SessionIsRegistered) + .When(UnregisteringSession) + .Then(SessionShouldNotExist) + .ExecuteAsync(); + } + + [TestMethod] + public async Task UpdateCharacterShouldAssociateCharacterWithSession() + { + await new Spec("Update character should associate character with session") + .Given(SessionIsRegistered) + .When(UpdatingCharacter) + .Then(CharacterShouldBeAssociated) + .ExecuteAsync(); + } + + [TestMethod] + public async Task GetSenderByCharacterIdShouldReturnNullForUnknownCharacter() + { + await new Spec("Get sender by character ID should return null for unknown character") + .When(GettingUnknownCharacterSender) + .Then(SenderShouldBeNull) + .ExecuteAsync(); + } + + [TestMethod] + public async Task GetAllSessionsShouldReturnAllSessions() + { + await new Spec("Get all sessions should return all sessions") + .Given(MultipleSessionsAreRegistered) + .When(GettingAllSessions) + .Then(AllSessionsShouldBeReturned) + .ExecuteAsync(); + } + + [TestMethod] + public async Task GetSessionsByMapInstanceShouldFilterByMapInstance() + { + await new Spec("Get sessions by map instance should filter by map instance") + .Given(SessionsWithDifferentMapsAreRegistered) + .When(GettingSessionsByMapInstance) + .Then(OnlyMatchingSessionsShouldBeReturned) + .ExecuteAsync(); + } + + [TestMethod] + public async Task GetConnectedAccountsShouldReturnSubscriberList() + { + await new Spec("Get connected accounts should return subscriber list") + .Given(SessionIsRegistered) + .When(GettingConnectedAccounts) + .Then(SubscriberListShouldBeReturned) + .ExecuteAsync(); + } + + private const string TestChannelId = "channel-1"; + private const string TestChannelId2 = "channel-2"; + private const long TestCharacterId = 100; + private readonly Guid TestMapInstanceId = Guid.NewGuid(); + private readonly Guid TestMapInstanceId2 = Guid.NewGuid(); + private Mock MockSender = null!; + private IPacketSender? ResultSender; + private int SessionCount; + private int FilteredSessionCount; + private int SubscriberCount; + + private void RegisteringSession() + { + MockSender = new Mock(); + Registry.Register(new SessionInfo + { + ChannelId = TestChannelId, + SessionId = 1, + Sender = MockSender.Object, + AccountName = "TestAccount", + Disconnect = () => Task.CompletedTask + }); + } + + private void SessionIsRegistered() + { + RegisteringSession(); + } + + private void MultipleSessionsAreRegistered() + { + MockSender = new Mock(); + Registry.Register(new SessionInfo { ChannelId = TestChannelId, SessionId = 1, Sender = MockSender.Object, AccountName = "Account1", Disconnect = () => Task.CompletedTask }); + Registry.Register(new SessionInfo { ChannelId = TestChannelId2, SessionId = 2, Sender = MockSender.Object, AccountName = "Account2", Disconnect = () => Task.CompletedTask }); + } + + private void SessionsWithDifferentMapsAreRegistered() + { + MockSender = new Mock(); + Registry.Register(new SessionInfo { ChannelId = TestChannelId, SessionId = 1, Sender = MockSender.Object, AccountName = "Account1", Disconnect = () => Task.CompletedTask }); + Registry.Register(new SessionInfo { ChannelId = TestChannelId2, SessionId = 2, Sender = MockSender.Object, AccountName = "Account2", Disconnect = () => Task.CompletedTask }); + Registry.UpdateCharacter(TestChannelId, TestCharacterId, TestMapInstanceId, null); + Registry.UpdateCharacter(TestChannelId2, TestCharacterId + 1, TestMapInstanceId2, null); + } + + private void UnregisteringSession() + { + Registry.Unregister(TestChannelId); + } + + private void UpdatingCharacter() + { + Registry.UpdateCharacter(TestChannelId, TestCharacterId, TestMapInstanceId, null); + } + + private void GettingUnknownCharacterSender() + { + ResultSender = Registry.GetSenderByCharacterId(9999); + } + + private void GettingAllSessions() + { + SessionCount = Registry.GetAllSessions().Count(); + } + + private void GettingSessionsByMapInstance() + { + FilteredSessionCount = Registry.GetSessionsByMapInstance(TestMapInstanceId).Count(); + } + + private void GettingConnectedAccounts() + { + SubscriberCount = Registry.GetConnectedAccounts().Count; + } + + private void SessionShouldBeRetrievable() + { + var sender = Registry.GetSenderByChannelId(TestChannelId); + Assert.IsNotNull(sender); + } + + private void SessionShouldNotExist() + { + var sender = Registry.GetSenderByChannelId(TestChannelId); + Assert.IsNull(sender); + } + + private void CharacterShouldBeAssociated() + { + var sender = Registry.GetSenderByCharacterId(TestCharacterId); + Assert.IsNotNull(sender); + } + + private void SenderShouldBeNull() + { + Assert.IsNull(ResultSender); + } + + private void AllSessionsShouldBeReturned() + { + Assert.AreEqual(2, SessionCount); + } + + private void OnlyMatchingSessionsShouldBeReturned() + { + Assert.AreEqual(1, FilteredSessionCount); + } + + private void SubscriberListShouldBeReturned() + { + Assert.AreEqual(1, SubscriberCount); + } + } +} diff --git a/test/NosCore.GameObject.Tests/Services/ChannelCommunicationService/Handlers/DeleteMailDataMessageHandlerTests.cs b/test/NosCore.GameObject.Tests/Services/ChannelCommunicationService/Handlers/DeleteMailDataMessageHandlerTests.cs new file mode 100644 index 000000000..ff8e6a7b2 --- /dev/null +++ b/test/NosCore.GameObject.Tests/Services/ChannelCommunicationService/Handlers/DeleteMailDataMessageHandlerTests.cs @@ -0,0 +1,114 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Linq; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.GameObject.ComponentEntities.Interfaces; +using NosCore.GameObject.InterChannelCommunication.Messages; +using NosCore.GameObject.Networking; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.GameObject.Services.BroadcastService; +using NosCore.GameObject.Services.ChannelCommunicationService.Handlers; +using NosCore.Packets.ServerPackets.Parcel; +using NosCore.Tests.Shared; +using SpecLight; + +namespace NosCore.GameObject.Tests.Services.ChannelCommunicationService.Handlers +{ + [TestClass] + public class DeleteMailDataMessageHandlerTests + { + private DeleteMailDataMessageChannelCommunicationMessageHandler Handler = null!; + private ClientSession Session = null!; + private Mock SessionRegistry = null!; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Broadcaster.Reset(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + SessionRegistry = new Mock(); + Handler = new DeleteMailDataMessageChannelCommunicationMessageHandler(SessionRegistry.Object); + } + + [TestMethod] + public async Task HandleShouldSendPostPacketWhenCharacterFound() + { + await new Spec("Handle should send post packet when character found") + .Given(CharacterIsRegistered) + .WhenAsync(HandlingDeleteMailData) + .Then(ShouldSendPostPacket) + .ExecuteAsync(); + } + + [TestMethod] + public async Task HandleShouldDoNothingWhenCharacterNotFound() + { + await new Spec("Handle should do nothing when character not found") + .Given(CharacterIsNotRegistered) + .WhenAsync(HandlingDeleteMailData) + .Then(ShouldNotSendAnyPacket) + .ExecuteAsync(); + } + + private DeleteMailData MailData = null!; + + private void CharacterIsRegistered() + { + SessionRegistry.Setup(x => x.GetCharacter(It.IsAny>())) + .Returns(Session.Character); + Session.LastPackets.Clear(); + } + + private void CharacterIsNotRegistered() + { + SessionRegistry.Setup(x => x.GetCharacter(It.IsAny>())) + .Returns((ICharacterEntity?)null); + Session.LastPackets.Clear(); + } + + private async Task HandlingDeleteMailData() + { + MailData = new DeleteMailData + { + CharacterId = Session.Character.CharacterId, + MailId = 123, + PostType = 1 + }; + await Handler.Handle(MailData); + } + + private void ShouldSendPostPacket() + { + var postPacket = Session.LastPackets.OfType().FirstOrDefault(); + Assert.IsNotNull(postPacket); + Assert.AreEqual(2, postPacket.Type); + Assert.AreEqual(MailData.PostType, postPacket.PostType); + Assert.AreEqual(MailData.MailId, postPacket.Id); + } + + private void ShouldNotSendAnyPacket() + { + Assert.AreEqual(0, Session.LastPackets.Count); + } + } +} diff --git a/test/NosCore.GameObject.Tests/Services/ChannelCommunicationService/Handlers/DisconnectDataMessageHandlerTests.cs b/test/NosCore.GameObject.Tests/Services/ChannelCommunicationService/Handlers/DisconnectDataMessageHandlerTests.cs new file mode 100644 index 000000000..8b477785c --- /dev/null +++ b/test/NosCore.GameObject.Tests/Services/ChannelCommunicationService/Handlers/DisconnectDataMessageHandlerTests.cs @@ -0,0 +1,101 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.GameObject.ComponentEntities.Interfaces; +using NosCore.GameObject.InterChannelCommunication.Messages; +using NosCore.GameObject.Networking; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.GameObject.Services.BroadcastService; +using NosCore.GameObject.Services.ChannelCommunicationService.Handlers; +using NosCore.Tests.Shared; +using SpecLight; + +namespace NosCore.GameObject.Tests.Services.ChannelCommunicationService.Handlers +{ + [TestClass] + public class DisconnectDataMessageHandlerTests + { + private DisconnectDataMessageChannelCommunicationMessageHandler Handler = null!; + private ClientSession Session = null!; + private Mock SessionRegistry = null!; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Broadcaster.Reset(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + SessionRegistry = new Mock(); + Handler = new DisconnectDataMessageChannelCommunicationMessageHandler(SessionRegistry.Object); + } + + [TestMethod] + public async Task HandleShouldDisconnectWhenCharacterFound() + { + await new Spec("Handle should disconnect when character found") + .Given(CharacterIsRegistered) + .WhenAsync(HandlingDisconnectData) + .Then(ShouldDisconnectCharacter) + .ExecuteAsync(); + } + + [TestMethod] + public async Task HandleShouldDoNothingWhenCharacterNotFound() + { + await new Spec("Handle should do nothing when character not found") + .Given(CharacterIsNotRegistered) + .WhenAsync(HandlingDisconnectData) + .Then(ShouldNotAttemptDisconnect) + .ExecuteAsync(); + } + + private void CharacterIsRegistered() + { + SessionRegistry.Setup(x => x.GetCharacter(It.IsAny>())) + .Returns(Session.Character); + } + + private void CharacterIsNotRegistered() + { + SessionRegistry.Setup(x => x.GetCharacter(It.IsAny>())) + .Returns((ICharacterEntity?)null); + } + + private async Task HandlingDisconnectData() + { + await Handler.Handle(new DisconnectData + { + CharacterId = Session.Character.CharacterId + }); + } + + private void ShouldDisconnectCharacter() + { + SessionRegistry.Verify(x => x.DisconnectByCharacterIdAsync(Session.Character.CharacterId), Times.Once); + } + + private void ShouldNotAttemptDisconnect() + { + SessionRegistry.Verify(x => x.DisconnectByCharacterIdAsync(It.IsAny()), Times.Never); + } + } +} diff --git a/test/NosCore.GameObject.Tests/Services/ChannelCommunicationService/Handlers/MailDataMessageHandlerTests.cs b/test/NosCore.GameObject.Tests/Services/ChannelCommunicationService/Handlers/MailDataMessageHandlerTests.cs new file mode 100644 index 000000000..69f45e449 --- /dev/null +++ b/test/NosCore.GameObject.Tests/Services/ChannelCommunicationService/Handlers/MailDataMessageHandlerTests.cs @@ -0,0 +1,149 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Linq; +using System.Threading.Tasks; +using Microsoft.Extensions.Localization; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.Core.I18N; +using NosCore.Data.Dto; +using NosCore.Data.Enumerations.I18N; +using NosCore.GameObject.ComponentEntities.Interfaces; +using NosCore.GameObject.InterChannelCommunication.Messages; +using NosCore.GameObject.Networking; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.GameObject.Services.BroadcastService; +using NosCore.GameObject.Services.ChannelCommunicationService.Handlers; +using NosCore.Packets.ServerPackets.Chats; +using NosCore.Shared.Enumerations; +using NosCore.Tests.Shared; +using SpecLight; + +namespace NosCore.GameObject.Tests.Services.ChannelCommunicationService.Handlers +{ + [TestClass] + public class MailDataMessageHandlerTests + { + private MailDataMessageChannelCommunicationMessageHandler Handler = null!; + private ClientSession Session = null!; + private Mock SessionRegistry = null!; + private Mock GameLanguageLocalizer = null!; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Broadcaster.Reset(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + SessionRegistry = new Mock(); + GameLanguageLocalizer = new Mock(); + GameLanguageLocalizer.Setup(x => x[It.IsAny(), It.IsAny()]) + .Returns(new LocalizedString("key", "Item gifted: {0}")); + Handler = new MailDataMessageChannelCommunicationMessageHandler(GameLanguageLocalizer.Object, SessionRegistry.Object); + } + + [TestMethod] + public async Task HandleShouldSendMailWhenCharacterFound() + { + await new Spec("Handle should send mail when character found") + .Given(CharacterIsRegistered) + .WhenAsync(HandlingMailData) + .Then(ShouldSendMailPacket) + .ExecuteAsync(); + } + + [TestMethod] + public async Task HandleShouldDoNothingWhenCharacterNotFound() + { + await new Spec("Handle should do nothing when character not found") + .Given(CharacterIsNotRegistered) + .WhenAsync(HandlingMailData) + .Then(ShouldNotSendAnyPacket) + .ExecuteAsync(); + } + + [TestMethod] + public async Task HandleWithItemShouldSendSayMessage() + { + await new Spec("Handle with item should send say message") + .Given(CharacterIsRegistered) + .WhenAsync(HandlingMailDataWithItem) + .Then(ShouldSendSayPacket) + .ExecuteAsync(); + } + + private void CharacterIsRegistered() + { + SessionRegistry.Setup(x => x.GetCharacter(It.IsAny>())) + .Returns(Session.Character); + Session.LastPackets.Clear(); + } + + private void CharacterIsNotRegistered() + { + SessionRegistry.Setup(x => x.GetCharacter(It.IsAny>())) + .Returns((ICharacterEntity?)null); + Session.LastPackets.Clear(); + } + + private async Task HandlingMailData() + { + await Handler.Handle(new MailData + { + ReceiverName = Session.Character.Name, + MailId = 1, + MailDto = new MailDto { Title = "Test Mail" }, + SenderName = "Sender" + }); + } + + private async Task HandlingMailDataWithItem() + { + await Handler.Handle(new MailData + { + ReceiverName = Session.Character.Name, + MailId = 1, + MailDto = new MailDto { Title = "Test Mail with Item" }, + SenderName = "Sender", + ItemInstance = new ItemInstanceDto + { + Amount = 5, + ItemVNum = 1012 + } + }); + } + + private void ShouldSendMailPacket() + { + Assert.IsTrue(Session.LastPackets.Count > 0); + } + + private void ShouldNotSendAnyPacket() + { + Assert.AreEqual(0, Session.LastPackets.Count); + } + + private void ShouldSendSayPacket() + { + var sayPacket = Session.LastPackets.OfType().FirstOrDefault(); + Assert.IsNotNull(sayPacket); + } + } +} diff --git a/test/NosCore.GameObject.Tests/Services/ChannelCommunicationService/Handlers/PostedPacketMessageHandlerTests.cs b/test/NosCore.GameObject.Tests/Services/ChannelCommunicationService/Handlers/PostedPacketMessageHandlerTests.cs new file mode 100644 index 000000000..d20051ea6 --- /dev/null +++ b/test/NosCore.GameObject.Tests/Services/ChannelCommunicationService/Handlers/PostedPacketMessageHandlerTests.cs @@ -0,0 +1,205 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Linq; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.Data.Enumerations.I18N; +using NosCore.Data.Enumerations.Interaction; +using NosCore.GameObject.ComponentEntities.Interfaces; +using NosCore.GameObject.InterChannelCommunication.Messages; +using NosCore.GameObject.Networking; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.GameObject.Services.BroadcastService; +using NosCore.GameObject.Services.ChannelCommunicationService.Handlers; +using NosCore.Packets.Interfaces; +using NosCore.Packets.ServerPackets.Chats; +using NosCore.Shared.I18N; +using NosCore.Tests.Shared; +using Serilog; +using SpecLight; + +namespace NosCore.GameObject.Tests.Services.ChannelCommunicationService.Handlers +{ + [TestClass] + public class PostedPacketMessageHandlerTests + { + private PostedPacketMessageChannelCommunicationMessageHandler Handler = null!; + private ClientSession Session = null!; + private Mock SessionRegistry = null!; + private Mock Deserializer = null!; + private Mock Logger = null!; + private Mock> LogLanguage = null!; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Broadcaster.Reset(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + SessionRegistry = new Mock(); + Deserializer = new Mock(); + Logger = new Mock(); + LogLanguage = new Mock>(); + Handler = new PostedPacketMessageChannelCommunicationMessageHandler(Logger.Object, Deserializer.Object, LogLanguage.Object, SessionRegistry.Object); + } + + [TestMethod] + public async Task HandleShouldBroadcastToAllWhenReceiverTypeIsAll() + { + await new Spec("Handle should broadcast to all when receiver type is all") + .Given(DeserializerReturnsPacket) + .WhenAsync(HandlingBroadcastToAll) + .Then(ShouldBroadcastToAll) + .ExecuteAsync(); + } + + [TestMethod] + public async Task HandleShouldSendToSpecificCharacterByName() + { + await new Spec("Handle should send to specific character by name") + .Given(DeserializerReturnsPacket) + .And(CharacterIsRegisteredByName) + .WhenAsync(HandlingPostToCharacterByName) + .Then(ShouldSendToCharacter) + .ExecuteAsync(); + } + + [TestMethod] + public async Task HandleShouldSendToSpecificCharacterById() + { + await new Spec("Handle should send to specific character by id") + .Given(DeserializerReturnsPacket) + .And(CharacterIsRegisteredById) + .WhenAsync(HandlingPostToCharacterById) + .Then(ShouldSendToCharacter) + .ExecuteAsync(); + } + + [TestMethod] + public async Task HandleShouldDoNothingWhenReceiverNotFound() + { + await new Spec("Handle should do nothing when receiver not found") + .Given(DeserializerReturnsPacket) + .And(CharacterIsNotRegistered) + .WhenAsync(HandlingPostToCharacterByName) + .Then(ShouldNotSendAnyPacket) + .ExecuteAsync(); + } + + [TestMethod] + public async Task HandleShouldLogErrorWhenUnknownReceiverType() + { + await new Spec("Handle should log error when unknown receiver type") + .Given(DeserializerReturnsPacket) + .WhenAsync(HandlingPostWithUnknownReceiverType) + .Then(ShouldLogError) + .ExecuteAsync(); + } + + private IPacket DeserializedPacket = null!; + + private void DeserializerReturnsPacket() + { + DeserializedPacket = new SayPacket { Message = "Test message" }; + Deserializer.Setup(x => x.Deserialize(It.IsAny())) + .Returns(DeserializedPacket); + } + + private void CharacterIsRegisteredByName() + { + SessionRegistry.Setup(x => x.GetCharacter(It.IsAny>())) + .Returns(Session.Character); + Session.LastPackets.Clear(); + } + + private void CharacterIsRegisteredById() + { + SessionRegistry.Setup(x => x.GetCharacter(It.IsAny>())) + .Returns(Session.Character); + Session.LastPackets.Clear(); + } + + private void CharacterIsNotRegistered() + { + SessionRegistry.Setup(x => x.GetCharacter(It.IsAny>())) + .Returns((ICharacterEntity?)null); + Session.LastPackets.Clear(); + } + + private async Task HandlingBroadcastToAll() + { + await Handler.Handle(new PostedPacket + { + Packet = "say Test message", + ReceiverType = ReceiverType.All + }); + } + + private async Task HandlingPostToCharacterByName() + { + await Handler.Handle(new PostedPacket + { + Packet = "say Test message", + ReceiverType = ReceiverType.OnlySomeone, + ReceiverCharacter = new Data.WebApi.Character { Name = Session.Character.Name } + }); + } + + private async Task HandlingPostToCharacterById() + { + await Handler.Handle(new PostedPacket + { + Packet = "say Test message", + ReceiverType = ReceiverType.OnlySomeone, + ReceiverCharacter = new Data.WebApi.Character { Id = Session.Character.CharacterId } + }); + } + + private async Task HandlingPostWithUnknownReceiverType() + { + await Handler.Handle(new PostedPacket + { + Packet = "say Test message", + ReceiverType = unchecked((ReceiverType)999) + }); + } + + private void ShouldBroadcastToAll() + { + SessionRegistry.Verify(x => x.BroadcastPacketAsync(It.IsAny()), Times.Once); + } + + private void ShouldSendToCharacter() + { + Assert.IsTrue(Session.LastPackets.Count > 0); + } + + private void ShouldNotSendAnyPacket() + { + Assert.AreEqual(0, Session.LastPackets.Count); + } + + private void ShouldLogError() + { + Logger.Verify(x => x.Error(It.IsAny()), Times.Once); + } + } +} diff --git a/test/NosCore.GameObject.Tests/Services/ChannelCommunicationService/Handlers/StatDataMessageHandlerTests.cs b/test/NosCore.GameObject.Tests/Services/ChannelCommunicationService/Handlers/StatDataMessageHandlerTests.cs new file mode 100644 index 000000000..542e6a92e --- /dev/null +++ b/test/NosCore.GameObject.Tests/Services/ChannelCommunicationService/Handlers/StatDataMessageHandlerTests.cs @@ -0,0 +1,145 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Threading.Tasks; +using Microsoft.Extensions.Options; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.Core.Configuration; +using NosCore.Data.Enumerations; +using NosCore.Data.Enumerations.I18N; +using NosCore.GameObject.ComponentEntities.Interfaces; +using NosCore.GameObject.InterChannelCommunication.Messages; +using NosCore.GameObject.Networking; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.GameObject.Services.BroadcastService; +using NosCore.GameObject.Services.ChannelCommunicationService.Handlers; +using NosCore.Shared.I18N; +using NosCore.Tests.Shared; +using Serilog; +using SpecLight; + +namespace NosCore.GameObject.Tests.Services.ChannelCommunicationService.Handlers +{ + [TestClass] + public class StatDataMessageHandlerTests + { + private StatDataMessageChannelCommunicationMessageHandler Handler = null!; + private ClientSession Session = null!; + private Mock SessionRegistry = null!; + private Mock Logger = null!; + private Mock> LogLanguage = null!; + private IOptions WorldConfig = null!; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Broadcaster.Reset(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + SessionRegistry = new Mock(); + Logger = new Mock(); + LogLanguage = new Mock>(); + WorldConfig = Options.Create(new WorldConfiguration { MaxGoldAmount = 999999999 }); + Handler = new StatDataMessageChannelCommunicationMessageHandler(Logger.Object, LogLanguage.Object, WorldConfig, SessionRegistry.Object); + } + + [TestMethod] + public async Task HandleShouldUpdateLevelWhenActionTypeIsUpdateLevel() + { + await new Spec("Handle should update level when action type is update level") + .Given(CharacterIsRegistered) + .And(OriginalLevelIs_, 1) + .WhenAsync(HandlingStatDataWithLevel_, 50) + .Then(CharacterLevelShouldBe_, 50) + .ExecuteAsync(); + } + + [TestMethod] + public async Task HandleShouldDoNothingWhenCharacterNotFound() + { + await new Spec("Handle should do nothing when character not found") + .Given(CharacterIsNotRegistered) + .And(OriginalLevelIs_, 1) + .WhenAsync(HandlingStatDataWithLevel_, 50) + .Then(CharacterLevelShouldBe_, 1) + .ExecuteAsync(); + } + + [TestMethod] + public async Task HandleShouldLogErrorForUnknownActionType() + { + await new Spec("Handle should log error for unknown action type") + .Given(CharacterIsRegistered) + .WhenAsync(HandlingStatDataWithUnknownActionType) + .Then(ShouldLogError) + .ExecuteAsync(); + } + + private byte OriginalLevel; + + private void CharacterIsRegistered() + { + SessionRegistry.Setup(x => x.GetCharacter(It.IsAny>())) + .Returns(Session.Character); + } + + private void CharacterIsNotRegistered() + { + SessionRegistry.Setup(x => x.GetCharacter(It.IsAny>())) + .Returns((ICharacterEntity?)null); + } + + private void OriginalLevelIs_(int level) + { + OriginalLevel = (byte)level; + Session.Character.Level = OriginalLevel; + } + + private async Task HandlingStatDataWithLevel_(int newLevel) + { + await Handler.Handle(new StatData + { + Character = new Data.WebApi.Character { Name = Session.Character.Name }, + ActionType = UpdateStatActionType.UpdateLevel, + Data = newLevel + }); + } + + private async Task HandlingStatDataWithUnknownActionType() + { + await Handler.Handle(new StatData + { + Character = new Data.WebApi.Character { Name = Session.Character.Name }, + ActionType = unchecked((UpdateStatActionType)999), + Data = 1 + }); + } + + private void CharacterLevelShouldBe_(int expectedLevel) + { + Assert.AreEqual((byte)expectedLevel, Session.Character.Level); + } + + private void ShouldLogError() + { + Logger.Verify(x => x.Error(It.IsAny()), Times.Once); + } + } +} diff --git a/test/NosCore.GameObject.Tests/Services/ChannelService/ChannelServiceTests.cs b/test/NosCore.GameObject.Tests/Services/ChannelService/ChannelServiceTests.cs new file mode 100644 index 000000000..14249f8cc --- /dev/null +++ b/test/NosCore.GameObject.Tests/Services/ChannelService/ChannelServiceTests.cs @@ -0,0 +1,164 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.Core; +using NosCore.GameObject.InterChannelCommunication.Hubs.AuthHub; +using NosCore.GameObject.InterChannelCommunication.Hubs.ChannelHub; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.GameObject.Services.ChannelService; +using NosCore.GameObject.Services.SaveService; +using NosCore.Packets.ServerPackets.Login; +using NosCore.Shared.Enumerations; +using NosCore.Tests.Shared; +using SpecLight; + +namespace NosCore.GameObject.Tests.Services.ChannelService +{ + [TestClass] + public class ChannelServiceTests + { + private IChannelService Service = null!; + private Mock AuthHub = null!; + private Mock ChannelHub = null!; + private Mock SaveService = null!; + private ClientSession Session = null!; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + Session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; + + AuthHub = new Mock(); + ChannelHub = new Mock(); + SaveService = new Mock(); + + SaveService.Setup(s => s.SaveAsync(It.IsAny())) + .Returns(Task.CompletedTask); + + Service = new GameObject.Services.ChannelService.ChannelService( + AuthHub.Object, + ChannelHub.Object, + SaveService.Object); + } + + [TestMethod] + public async Task MovingToExistingChannelShouldSendPackets() + { + await new Spec("Moving to existing channel should send packets") + .Given(TargetChannelExists) + .WhenAsync(MovingToChannel) + .Then(MzPacketShouldBeSent) + .And(CharacterShouldBeSaved) + .ExecuteAsync(); + } + + [TestMethod] + public async Task MovingToNonExistentChannelShouldDoNothing() + { + await new Spec("Moving to non-existent channel should do nothing") + .Given(NoChannelsExist) + .WhenAsync(MovingToChannel) + .Then(NoPacketsShouldBeSent) + .And(CharacterShouldNotBeSaved) + .ExecuteAsync(); + } + + [TestMethod] + public async Task MovingToNonWorldServerShouldDoNothing() + { + await new Spec("Moving to non-world server should do nothing") + .Given(OnlyLoginServerExists) + .WhenAsync(MovingToChannel) + .Then(NoPacketsShouldBeSent) + .ExecuteAsync(); + } + + private void TargetChannelExists() + { + ChannelHub.Setup(s => s.GetCommunicationChannels()) + .ReturnsAsync(new List + { + new ChannelInfo + { + Id = 2, + Type = ServerType.WorldServer, + Host = "127.0.0.1", + Port = 1234 + } + }); + } + + private void NoChannelsExist() + { + ChannelHub.Setup(s => s.GetCommunicationChannels()) + .ReturnsAsync(new List()); + } + + private void OnlyLoginServerExists() + { + ChannelHub.Setup(s => s.GetCommunicationChannels()) + .ReturnsAsync(new List + { + new ChannelInfo + { + Id = 2, + Type = ServerType.LoginServer, + Host = "127.0.0.1", + Port = 1234 + } + }); + } + + private async Task MovingToChannel() + { + await Service.MoveChannelAsync(Session, 2); + } + + private void MzPacketShouldBeSent() + { + var mzPacket = Session.LastPackets.OfType().FirstOrDefault(); + Assert.IsNotNull(mzPacket); + Assert.AreEqual("127.0.0.1", mzPacket.Ip); + Assert.AreEqual(1234, mzPacket.Port); + } + + private void CharacterShouldBeSaved() + { + SaveService.Verify(s => s.SaveAsync(Session.Character), Times.Once); + } + + private void NoPacketsShouldBeSent() + { + var mzPacket = Session.LastPackets.OfType().FirstOrDefault(); + Assert.IsNull(mzPacket); + } + + private void CharacterShouldNotBeSaved() + { + SaveService.Verify(s => s.SaveAsync(It.IsAny()), Times.Never); + } + } +} diff --git a/test/NosCore.GameObject.Tests/Services/CharacterService/CharacterInitializationServiceTests.cs b/test/NosCore.GameObject.Tests/Services/CharacterService/CharacterInitializationServiceTests.cs new file mode 100644 index 000000000..38aa96906 --- /dev/null +++ b/test/NosCore.GameObject.Tests/Services/CharacterService/CharacterInitializationServiceTests.cs @@ -0,0 +1,210 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.Data.Dto; +using NosCore.Data.StaticEntities; +using NosCore.Data.WebApi; +using NosCore.GameObject.ComponentEntities.Entities; +using NosCore.GameObject.InterChannelCommunication.Hubs.FriendHub; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.GameObject.Services.CharacterService; +using NosCore.GameObject.Services.MapInstanceGenerationService; +using NosCore.GameObject.Services.MinilandService; +using NosCore.Tests.Shared; +using Serilog; +using SpecLight; + +namespace NosCore.GameObject.Tests.Services.CharacterService +{ + [TestClass] + public class CharacterInitializationServiceTests + { + private static readonly ILogger Logger = new Mock().Object; + private ICharacterInitializationService Service = null!; + private IMinilandService MinilandService = null!; + private ClientSession Session = null!; + private Mock FriendHttpClient = null!; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + + FriendHttpClient = new Mock(); + FriendHttpClient.Setup(s => s.GetFriendsAsync(It.IsAny())) + .ReturnsAsync(new List()); + + await TestHelpers.Instance.MinilandDao.TryInsertOrUpdateAsync(new MinilandDto + { + OwnerId = Session.Character.CharacterId + }); + + MinilandService = new GameObject.Services.MinilandService.MinilandService( + TestHelpers.Instance.MapInstanceAccessorService, + FriendHttpClient.Object, + new List + { + new NosCore.GameObject.Map.Map + { + MapId = 20001, + NameI18NKey = "miniland", + Data = new byte[] { } + } + }, + TestHelpers.Instance.MinilandDao, + TestHelpers.Instance.MinilandObjectDao, + new MinilandRegistry()); + + Service = new CharacterInitializationService(MinilandService, TestHelpers.Instance.MapInstanceGeneratorService); + } + + [TestMethod] + public async Task InitializingCharacterShouldInitializeMiniland() + { + await new Spec("Initializing character should initialize miniland") + .WhenAsync(InitializingCharacter) + .Then(MinilandShouldBeInitialized) + .ExecuteAsync(); + } + + [TestMethod] + public async Task InitializingCharacterWithNullServicesShouldDoNothing() + { + await new Spec("Initializing character with null services should do nothing") + .Given(ServiceWithNullDependencies) + .WhenAsync(InitializingCharacterWithNullServices) + .Then(NoExceptionShouldBeThrown) + .ExecuteAsync(); + } + + [TestMethod] + public async Task InitializingCharacterWithOnlyMinilandServiceShouldDoNothing() + { + await new Spec("Initializing character with only miniland service should do nothing") + .Given(ServiceWithOnlyMinilandService) + .WhenAsync(InitializingCharacterWithPartialServices) + .Then(NoExceptionShouldBeThrown) + .ExecuteAsync(); + } + + [TestMethod] + public async Task InitializingCharacterWithOnlyMapInstanceServiceShouldDoNothing() + { + await new Spec("Initializing character with only map instance service should do nothing") + .Given(ServiceWithOnlyMapInstanceService) + .WhenAsync(InitializingCharacterWithPartialServices) + .Then(NoExceptionShouldBeThrown) + .ExecuteAsync(); + } + + [TestMethod] + public async Task InitializingMultipleCharactersShouldWork() + { + await new Spec("Initializing multiple characters should work") + .WhenAsync(InitializingMultipleCharacters) + .Then(BothMinilandsShouldBeInitialized) + .ExecuteAsync(); + } + + private ICharacterInitializationService? NullService; + private ICharacterInitializationService? PartialService; + private ClientSession? SecondSession; + private bool InitializationCompleted; + private bool SecondInitializationCompleted; + + private async Task InitializingCharacter() + { + await Service.InitializeAsync(Session.Character); + InitializationCompleted = true; + } + + private void ServiceWithNullDependencies() + { + NullService = new CharacterInitializationService(); + } + + private async Task InitializingCharacterWithNullServices() + { + await NullService!.InitializeAsync(Session.Character); + InitializationCompleted = true; + } + + private void ServiceWithOnlyMinilandService() + { + PartialService = new CharacterInitializationService(MinilandService); + } + + private void ServiceWithOnlyMapInstanceService() + { + PartialService = new CharacterInitializationService(mapInstanceGeneratorService: TestHelpers.Instance.MapInstanceGeneratorService); + } + + private async Task InitializingCharacterWithPartialServices() + { + await PartialService!.InitializeAsync(Session.Character); + InitializationCompleted = true; + } + + private async Task InitializingMultipleCharacters() + { + SecondSession = await TestHelpers.Instance.GenerateSessionAsync(); + await TestHelpers.Instance.MinilandDao.TryInsertOrUpdateAsync(new MinilandDto + { + OwnerId = SecondSession.Character.CharacterId + }); + + await Service.InitializeAsync(Session.Character); + InitializationCompleted = true; + + await Service.InitializeAsync(SecondSession.Character); + SecondInitializationCompleted = true; + } + + private void MinilandShouldBeInitialized() + { + Assert.IsTrue(InitializationCompleted); + var miniland = MinilandService.GetMiniland(Session.Character.CharacterId); + Assert.IsNotNull(miniland); + } + + private void NoExceptionShouldBeThrown() + { + Assert.IsTrue(InitializationCompleted); + } + + private void BothMinilandsShouldBeInitialized() + { + Assert.IsTrue(InitializationCompleted); + Assert.IsTrue(SecondInitializationCompleted); + + var miniland1 = MinilandService.GetMiniland(Session.Character.CharacterId); + var miniland2 = MinilandService.GetMiniland(SecondSession!.Character.CharacterId); + + Assert.IsNotNull(miniland1); + Assert.IsNotNull(miniland2); + Assert.AreNotEqual(miniland1.MapInstanceId, miniland2.MapInstanceId); + } + } +} diff --git a/test/NosCore.GameObject.Tests/Services/EventLoaderService/EventLoaderServiceTests.cs b/test/NosCore.GameObject.Tests/Services/EventLoaderService/EventLoaderServiceTests.cs new file mode 100644 index 000000000..5451302cf --- /dev/null +++ b/test/NosCore.GameObject.Tests/Services/EventLoaderService/EventLoaderServiceTests.cs @@ -0,0 +1,120 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.GameObject.Infastructure; +using NosCore.GameObject.Services.EventLoaderService; +using NosCore.GameObject.Services.InventoryService; +using NosCore.GameObject.Services.ItemGenerationService; +using NosCore.GameObject.Services.ItemGenerationService.Item; +using NosCore.Packets.ClientPackets.Inventory; +using SpecLight; + +namespace NosCore.GameObject.Tests.Services.EventLoaderService +{ + [TestClass] + public class EventLoaderServiceTests + { + private IEventLoaderService> Service = null!; + private List>> Handlers = null!; + + [TestInitialize] + public void Setup() + { + Handlers = new List>>(); + Service = new EventLoaderService, IUseItemEventHandler>(Handlers); + } + + [TestMethod] + public async Task ServiceCanBeConstructed() + { + await new Spec("Service can be constructed") + .Then(ServiceShouldNotBeNull) + .ExecuteAsync(); + } + + [TestMethod] + public async Task ServiceImplementsInterface() + { + await new Spec("Service implements interface") + .Then(ServiceShouldImplementInterface) + .ExecuteAsync(); + } + + [TestMethod] + public async Task LoadHandlersWithNoHandlersShouldComplete() + { + await new Spec("Load handlers with no handlers should complete") + .Given(ItemExists) + .When(LoadingHandlers) + .Then(RequestsShouldBeRegistered) + .ExecuteAsync(); + } + + [TestMethod] + public async Task LoadHandlersWithMatchingHandlerShouldRegisterHandler() + { + await new Spec("Load handlers with matching handler should register handler") + .Given(ItemExists) + .And(MatchingHandlerExists) + .When(LoadingHandlers) + .Then(RequestsShouldBeRegistered) + .ExecuteAsync(); + } + + private Item? TestItem; + + private void ItemExists() + { + TestItem = new Item { VNum = 1 }; + } + + private void MatchingHandlerExists() + { + var handler = new Mock>>(); + handler.Setup(h => h.Condition(It.IsAny())).Returns(true); + Handlers.Add(handler.Object); + Service = new EventLoaderService, IUseItemEventHandler>(Handlers); + } + + private void LoadingHandlers() + { + Service.LoadHandlers(TestItem!); + } + + private void ServiceShouldNotBeNull() + { + Assert.IsNotNull(Service); + } + + private void ServiceShouldImplementInterface() + { + Assert.IsInstanceOfType(Service, typeof(IEventLoaderService>)); + } + + private void RequestsShouldBeRegistered() + { + Assert.IsTrue(TestItem!.Requests.ContainsKey(typeof(IUseItemEventHandler))); + } + } +} diff --git a/test/NosCore.GameObject.Tests/Services/ExchangeService/ExchangeRequestRegistryTests.cs b/test/NosCore.GameObject.Tests/Services/ExchangeService/ExchangeRequestRegistryTests.cs new file mode 100644 index 000000000..f1e3d2c32 --- /dev/null +++ b/test/NosCore.GameObject.Tests/Services/ExchangeService/ExchangeRequestRegistryTests.cs @@ -0,0 +1,274 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using NosCore.GameObject.Services.ExchangeService; +using SpecLight; + +namespace NosCore.GameObject.Tests.Services.ExchangeService +{ + [TestClass] + public class ExchangeRequestRegistryTests + { + private IExchangeRequestRegistry Registry = null!; + + [TestInitialize] + public void Setup() + { + Registry = new ExchangeRequestRegistry(); + } + + [TestMethod] + public async Task SetExchangeDataShouldAllowRetrieval() + { + await new Spec("Set exchange data should allow retrieval") + .When(SettingExchangeData) + .Then(ExchangeDataShouldBeRetrievable) + .ExecuteAsync(); + } + + [TestMethod] + public async Task GetExchangeDataShouldReturnNullForUnknownCharacter() + { + await new Spec("Get exchange data should return null for unknown character") + .When(GettingUnknownExchangeData) + .Then(ResultShouldBeNull) + .ExecuteAsync(); + } + + [TestMethod] + public async Task RemoveExchangeDataShouldDeleteData() + { + await new Spec("Remove exchange data should delete data") + .Given(ExchangeDataExists) + .When(RemovingExchangeData) + .Then(RemoveShouldSucceed) + .And(ExchangeDataShouldNotExist) + .ExecuteAsync(); + } + + [TestMethod] + public async Task SetExchangeRequestShouldTrackBothParties() + { + await new Spec("Set exchange request should track both parties") + .When(SettingExchangeRequest) + .Then(InitiatorShouldBeTracked) + .And(TargetShouldBeTracked) + .ExecuteAsync(); + } + + [TestMethod] + public async Task GetExchangeRequestPairShouldReturnFromInitiator() + { + await new Spec("Get exchange request pair should return from initiator") + .Given(ExchangeRequestExists) + .When(GettingPairFromInitiator) + .Then(PairShouldBeCorrect) + .ExecuteAsync(); + } + + [TestMethod] + public async Task GetExchangeRequestPairShouldReturnFromTarget() + { + await new Spec("Get exchange request pair should return from target") + .Given(ExchangeRequestExists) + .When(GettingPairFromTarget) + .Then(PairShouldBeCorrectFromTarget) + .ExecuteAsync(); + } + + [TestMethod] + public async Task RemoveExchangeRequestFromInitiatorShouldRemoveBoth() + { + await new Spec("Remove exchange request from initiator should remove both") + .Given(ExchangeRequestExists) + .When(RemovingRequestFromInitiator) + .Then(RequestShouldBeRemoved) + .And(NeitherPartyShouldHaveExchange) + .ExecuteAsync(); + } + + [TestMethod] + public async Task RemoveExchangeRequestFromTargetShouldRemoveBoth() + { + await new Spec("Remove exchange request from target should remove both") + .Given(ExchangeRequestExists) + .When(RemovingRequestFromTarget) + .Then(RequestShouldBeRemoved) + .And(NeitherPartyShouldHaveExchange) + .ExecuteAsync(); + } + + [TestMethod] + public async Task HasExchangeShouldReturnTrueForActiveExchange() + { + await new Spec("Has exchange should return true for active exchange") + .Given(ExchangeRequestExists) + .When(CheckingHasExchange) + .Then(HasExchangeShouldBeTrue) + .ExecuteAsync(); + } + + [TestMethod] + public async Task HasExchangeShouldReturnFalseForNoExchange() + { + await new Spec("Has exchange should return false for no exchange") + .When(CheckingHasExchangeForUnknown) + .Then(HasExchangeShouldBeFalse) + .ExecuteAsync(); + } + + private const long TestInitiatorId = 1; + private const long TestTargetId = 2; + private ExchangeData? ResultData; + private KeyValuePair? ResultPair; + private bool RemoveResult; + private bool HasExchangeResult; + + private void SettingExchangeData() + { + Registry.SetExchangeData(TestInitiatorId, new ExchangeData()); + } + + private void ExchangeDataExists() + { + Registry.SetExchangeData(TestInitiatorId, new ExchangeData()); + } + + private void ExchangeRequestExists() + { + Registry.SetExchangeRequest(TestInitiatorId, TestTargetId); + } + + private void GettingUnknownExchangeData() + { + ResultData = Registry.GetExchangeData(9999); + } + + private void RemovingExchangeData() + { + RemoveResult = Registry.RemoveExchangeData(TestInitiatorId); + } + + private void SettingExchangeRequest() + { + Registry.SetExchangeRequest(TestInitiatorId, TestTargetId); + } + + private void GettingPairFromInitiator() + { + ResultPair = Registry.GetExchangeRequestPair(TestInitiatorId); + } + + private void GettingPairFromTarget() + { + ResultPair = Registry.GetExchangeRequestPair(TestTargetId); + } + + private void RemovingRequestFromInitiator() + { + RemoveResult = Registry.RemoveExchangeRequest(TestInitiatorId); + } + + private void RemovingRequestFromTarget() + { + RemoveResult = Registry.RemoveExchangeRequest(TestTargetId); + } + + private void CheckingHasExchange() + { + HasExchangeResult = Registry.HasExchange(TestInitiatorId); + } + + private void CheckingHasExchangeForUnknown() + { + HasExchangeResult = Registry.HasExchange(9999); + } + + private void ExchangeDataShouldBeRetrievable() + { + var result = Registry.GetExchangeData(TestInitiatorId); + Assert.IsNotNull(result); + } + + private void ResultShouldBeNull() + { + Assert.IsNull(ResultData); + } + + private void RemoveShouldSucceed() + { + Assert.IsTrue(RemoveResult); + } + + private void ExchangeDataShouldNotExist() + { + var result = Registry.GetExchangeData(TestInitiatorId); + Assert.IsNull(result); + } + + private void InitiatorShouldBeTracked() + { + var result = Registry.GetExchangeRequest(TestInitiatorId); + Assert.AreEqual(TestTargetId, result); + } + + private void TargetShouldBeTracked() + { + Assert.IsTrue(Registry.HasExchange(TestTargetId)); + } + + private void PairShouldBeCorrect() + { + Assert.IsNotNull(ResultPair); + Assert.AreEqual(TestInitiatorId, ResultPair.Value.Key); + Assert.AreEqual(TestTargetId, ResultPair.Value.Value); + } + + private void PairShouldBeCorrectFromTarget() + { + Assert.IsNotNull(ResultPair); + Assert.AreEqual(TestInitiatorId, ResultPair.Value.Key); + Assert.AreEqual(TestTargetId, ResultPair.Value.Value); + } + + private void RequestShouldBeRemoved() + { + Assert.IsTrue(RemoveResult); + } + + private void NeitherPartyShouldHaveExchange() + { + Assert.IsFalse(Registry.HasExchange(TestInitiatorId)); + Assert.IsFalse(Registry.HasExchange(TestTargetId)); + } + + private void HasExchangeShouldBeTrue() + { + Assert.IsTrue(HasExchangeResult); + } + + private void HasExchangeShouldBeFalse() + { + Assert.IsFalse(HasExchangeResult); + } + } +} diff --git a/test/NosCore.GameObject.Tests/Services/ExchangeService/ExchangeServiceTests.cs b/test/NosCore.GameObject.Tests/Services/ExchangeService/ExchangeServiceTests.cs index 3df09c4e2..fdb923131 100644 --- a/test/NosCore.GameObject.Tests/Services/ExchangeService/ExchangeServiceTests.cs +++ b/test/NosCore.GameObject.Tests/Services/ExchangeService/ExchangeServiceTests.cs @@ -1,19 +1,19 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . @@ -35,6 +35,7 @@ using NosCore.Packets.Enumerations; using NosCore.Tests.Shared; using Serilog; +using SpecLight; using ExchangeRequestRegistry = NosCore.GameObject.Services.ExchangeService.ExchangeRequestRegistry; namespace NosCore.GameObject.Tests.Services.ExchangeService @@ -43,17 +44,14 @@ namespace NosCore.GameObject.Tests.Services.ExchangeService public class ExchangeServiceTests { private static readonly ILogger Logger = new Mock().Object; - private GameObject.Services.ExchangeService.ExchangeService? _exchangeProvider; - - private GameObject.Services.ItemGenerationService.ItemGenerationService? _itemProvider; - - private IOptions? _worldConfiguration; + private GameObject.Services.ExchangeService.ExchangeService? ExchangeProvider; + private GameObject.Services.ItemGenerationService.ItemGenerationService? ItemProvider; + private IOptions? WorldConfiguration; [TestInitialize] public void Setup() { - - _worldConfiguration = Options.Create(new WorldConfiguration + WorldConfiguration = Options.Create(new WorldConfiguration { MaxItemAmount = 999, BackpackSize = 48, @@ -67,113 +65,187 @@ public void Setup() new Item {Type = NoscorePocketType.Main, VNum = 1013} }; - _itemProvider = new GameObject.Services.ItemGenerationService.ItemGenerationService(items, new EventLoaderService, IUseItemEventHandler>(new List>>()), Logger, TestHelpers.Instance.LogLanguageLocalizer); - _exchangeProvider = new GameObject.Services.ExchangeService.ExchangeService(_itemProvider, _worldConfiguration, Logger, new ExchangeRequestRegistry(), TestHelpers.Instance.LogLanguageLocalizer, TestHelpers.Instance.GameLanguageLocalizer); + ItemProvider = new GameObject.Services.ItemGenerationService.ItemGenerationService(items, new EventLoaderService, IUseItemEventHandler>(new List>>()), Logger, TestHelpers.Instance.LogLanguageLocalizer); + ExchangeProvider = new GameObject.Services.ExchangeService.ExchangeService(ItemProvider, WorldConfiguration, Logger, new ExchangeRequestRegistry(), TestHelpers.Instance.LogLanguageLocalizer, TestHelpers.Instance.GameLanguageLocalizer); } [TestMethod] - public void Test_Set_Gold() + public void SettingGoldShouldUpdateExchangeData() { - _exchangeProvider!.OpenExchange(1, 2); - _exchangeProvider.SetGold(1, 1000, 1000); - _exchangeProvider.SetGold(2, 2000, 2000); + new Spec("Setting gold should update exchange data") + .Given(ExchangeIsOpen) + .When(SettingGoldForBothParties) + .Then(BothPartiesShouldHaveCorrectGold) + .Execute(); + } - var data1 = _exchangeProvider.GetData(1); - var data2 = _exchangeProvider.GetData(2); + [TestMethod] + public void ConfirmingExchangeShouldSetConfirmedFlag() + { + new Spec("Confirming exchange should set confirmed flag") + .Given(ExchangeIsOpen) + .When(BothPartiesConfirm) + .Then(BothShouldBeConfirmed) + .Execute(); + } - Assert.IsTrue((data1.Gold == 1000) && (data1.BankGold == 1000) && (data2.Gold == 2000) && - (data2.BankGold == 2000)); + [TestMethod] + public void AddingItemsShouldAddToExchange() + { + new Spec("Adding items should add to exchange") + .Given(ExchangeIsOpen) + .When(AddingItemToExchange) + .Then(ExchangeShouldContainItem) + .Execute(); + } + + [TestMethod] + public void CheckingExchangeShouldReturnCorrectStatus() + { + new Spec("Checking exchange should return correct status") + .Then(CheckBeforeOpenShouldBeFalse) + .And(CheckAfterOpenShouldBeTrue) + .Execute(); } [TestMethod] - public void Test_Confirm_Exchange() + public void ClosingExchangeShouldWorkCorrectly() { - _exchangeProvider!.OpenExchange(1, 2); - _exchangeProvider.ConfirmExchange(1); - _exchangeProvider.ConfirmExchange(2); + new Spec("Closing exchange should work correctly") + .Then(CloseWithoutExchangeShouldReturnNull) + .And(CloseWithExchangeShouldReturnResult) + .Execute(); + } - var data1 = _exchangeProvider.GetData(1); - var data2 = _exchangeProvider.GetData(2); + [TestMethod] + public void OpeningExchangeShouldSucceed() + { + new Spec("Opening exchange should succeed") + .Then(FirstExchangeShouldSucceed) + .Execute(); + } - Assert.IsTrue(data1.ExchangeConfirmed && data2.ExchangeConfirmed); + [TestMethod] + public void OpeningSecondExchangeShouldFail() + { + new Spec("Opening second exchange should fail") + .Given(ExchangeIsOpen) + .Then(SecondExchangeShouldFail) + .Execute(); } [TestMethod] - public void Test_Add_Items() + public void ProcessingExchangeShouldSwapItems() { - _exchangeProvider!.OpenExchange(1, 2); + new Spec("Processing exchange should swap items") + .Then(ProcessExchangeShouldReturnItemsForBoth) + .Execute(); + } + private void ExchangeIsOpen() + { + ExchangeProvider!.OpenExchange(1, 2); + } + + private void SettingGoldForBothParties() + { + ExchangeProvider!.SetGold(1, 1000, 1000); + ExchangeProvider.SetGold(2, 2000, 2000); + } + + private void BothPartiesShouldHaveCorrectGold() + { + var data1 = ExchangeProvider!.GetData(1); + var data2 = ExchangeProvider.GetData(2); + Assert.IsTrue((data1.Gold == 1000) && (data1.BankGold == 1000) && (data2.Gold == 2000) && + (data2.BankGold == 2000)); + } + + private void BothPartiesConfirm() + { + ExchangeProvider!.ConfirmExchange(1); + ExchangeProvider.ConfirmExchange(2); + } + + private void BothShouldBeConfirmed() + { + var data1 = ExchangeProvider!.GetData(1); + var data2 = ExchangeProvider.GetData(2); + Assert.IsTrue(data1.ExchangeConfirmed && data2.ExchangeConfirmed); + } + + private void AddingItemToExchange() + { var item = new InventoryItemInstance(new ItemInstance(new Item { VNum = 1012 }) { Amount = 1 }); + ExchangeProvider!.AddItems(1, item, item.ItemInstance.Amount); + } - _exchangeProvider.AddItems(1, item, item.ItemInstance.Amount); - - var data1 = _exchangeProvider.GetData(1); - + private void ExchangeShouldContainItem() + { + var data1 = ExchangeProvider!.GetData(1); Assert.IsTrue(data1.ExchangeItems.Any(s => (s.Key.ItemInstance?.ItemVNum == 1012) && (s.Key.ItemInstance.Amount == 1))); } - [TestMethod] - public void Test_Check_Exchange() + private void CheckBeforeOpenShouldBeFalse() { - var wrongExchange = _exchangeProvider!.CheckExchange(1); - _exchangeProvider.OpenExchange(1, 2); - var goodExchange = _exchangeProvider.CheckExchange(1); - - Assert.IsTrue(!wrongExchange && goodExchange); + var wrongExchange = ExchangeProvider!.CheckExchange(1); + Assert.IsFalse(wrongExchange); } - [TestMethod] - public void Test_Close_Exchange() + private void CheckAfterOpenShouldBeTrue() { - var wrongClose = _exchangeProvider!.CloseExchange(1, ExchangeResultType.Failure); + ExchangeProvider!.OpenExchange(1, 2); + var goodExchange = ExchangeProvider.CheckExchange(1); + Assert.IsTrue(goodExchange); + } + private void CloseWithoutExchangeShouldReturnNull() + { + var wrongClose = ExchangeProvider!.CloseExchange(1, ExchangeResultType.Failure); Assert.IsNull(wrongClose); + } - _exchangeProvider.OpenExchange(1, 2); - var goodClose = _exchangeProvider.CloseExchange(1, ExchangeResultType.Failure); + private void CloseWithExchangeShouldReturnResult() + { + ExchangeProvider!.OpenExchange(1, 2); + var goodClose = ExchangeProvider.CloseExchange(1, ExchangeResultType.Failure); Assert.IsTrue((goodClose != null) && (goodClose.Type == ExchangeResultType.Failure)); } - [TestMethod] - public void Test_Open_Exchange() + private void FirstExchangeShouldSucceed() { - var exchange = _exchangeProvider!.OpenExchange(1, 2); + var exchange = ExchangeProvider!.OpenExchange(1, 2); Assert.IsTrue(exchange); } - [TestMethod] - public void Test_Open_Second_Exchange() + private void SecondExchangeShouldFail() { - var exchange = _exchangeProvider!.OpenExchange(1, 2); - Assert.IsTrue(exchange); - - var wrongExchange = _exchangeProvider.OpenExchange(1, 3); + var wrongExchange = ExchangeProvider!.OpenExchange(1, 3); Assert.IsFalse(wrongExchange); } - [TestMethod] - public void Test_Process_Exchange() + private void ProcessExchangeShouldReturnItemsForBoth() { IInventoryService inventory1 = new GameObject.Services.InventoryService.InventoryService(new List { new Item { VNum = 1012, Type = NoscorePocketType.Main } }, - _worldConfiguration!, Logger); + WorldConfiguration!, Logger); IInventoryService inventory2 = new GameObject.Services.InventoryService.InventoryService(new List { new Item { VNum = 1013, Type = NoscorePocketType.Main } }, - _worldConfiguration!, Logger); - var item1 = inventory1.AddItemToPocket(InventoryItemInstance.Create(_itemProvider!.Create(1012, 1), 0))! + WorldConfiguration!, Logger); + var item1 = inventory1.AddItemToPocket(InventoryItemInstance.Create(ItemProvider!.Create(1012, 1), 0))! .First(); - var item2 = inventory2.AddItemToPocket(InventoryItemInstance.Create(_itemProvider.Create(1013, 1), 0))! + var item2 = inventory2.AddItemToPocket(InventoryItemInstance.Create(ItemProvider.Create(1013, 1), 0))! .First(); - _exchangeProvider!.OpenExchange(1, 2); - _exchangeProvider.AddItems(1, item1, 1); - _exchangeProvider.AddItems(2, item2, 1); - var itemList = _exchangeProvider.ProcessExchange(1, 2, inventory1, inventory2); + ExchangeProvider!.OpenExchange(1, 2); + ExchangeProvider.AddItems(1, item1, 1); + ExchangeProvider.AddItems(2, item2, 1); + var itemList = ExchangeProvider.ProcessExchange(1, 2, inventory1, inventory2); Assert.IsTrue((itemList.Count(s => s.Key == 1) == 2) && (itemList.Count(s => s.Key == 2) == 2)); } } -} \ No newline at end of file +} diff --git a/test/NosCore.GameObject.Tests/Services/FriendService/FriendRequestRegistryTests.cs b/test/NosCore.GameObject.Tests/Services/FriendService/FriendRequestRegistryTests.cs new file mode 100644 index 000000000..352ee5832 --- /dev/null +++ b/test/NosCore.GameObject.Tests/Services/FriendService/FriendRequestRegistryTests.cs @@ -0,0 +1,187 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using NosCore.GameObject.Services.FriendService; +using SpecLight; + +namespace NosCore.GameObject.Tests.Services.FriendService +{ + [TestClass] + public class FriendRequestRegistryTests + { + private IFriendRequestRegistry Registry = null!; + + [TestInitialize] + public void Setup() + { + Registry = new FriendRequestRegistry(); + } + + [TestMethod] + public async Task RegisterRequestShouldAddRequest() + { + await new Spec("Register request should add request") + .When(RegisteringRequest) + .Then(RequestShouldBeRetrievable) + .ExecuteAsync(); + } + + [TestMethod] + public async Task GetRequestsForCharacterShouldReturnRequestsAsSender() + { + await new Spec("Get requests for character should return requests as sender") + .Given(RequestsExist) + .When(GettingRequestsForSender) + .Then(SenderRequestsShouldBeReturned) + .ExecuteAsync(); + } + + [TestMethod] + public async Task GetRequestsForCharacterShouldReturnRequestsAsReceiver() + { + await new Spec("Get requests for character should return requests as receiver") + .Given(RequestsExist) + .When(GettingRequestsForReceiver) + .Then(ReceiverRequestsShouldBeReturned) + .ExecuteAsync(); + } + + [TestMethod] + public async Task UnregisterRequestShouldRemoveRequest() + { + await new Spec("Unregister request should remove request") + .Given(RequestIsRegistered) + .When(UnregisteringRequest) + .Then(UnregisterShouldSucceed) + .And(RequestShouldNotExist) + .ExecuteAsync(); + } + + [TestMethod] + public async Task UnregisterRequestShouldFailForUnknownRequest() + { + await new Spec("Unregister request should fail for unknown request") + .When(UnregisteringUnknownRequest) + .Then(UnregisterShouldFail) + .ExecuteAsync(); + } + + [TestMethod] + public async Task GetRequestsForCharacterShouldReturnEmptyForNoRequests() + { + await new Spec("Get requests for character should return empty for no requests") + .When(GettingRequestsForUnknownCharacter) + .Then(NoRequestsShouldBeReturned) + .ExecuteAsync(); + } + + private readonly Guid TestRequestId = Guid.NewGuid(); + private const long TestSenderId = 1; + private const long TestReceiverId = 2; + private int RequestCount; + private bool UnregisterResult; + + private void RequestsExist() + { + Registry.RegisterRequest(TestRequestId, TestSenderId, TestReceiverId); + Registry.RegisterRequest(Guid.NewGuid(), TestSenderId, 99); + Registry.RegisterRequest(Guid.NewGuid(), 99, TestReceiverId); + } + + private void RequestIsRegistered() + { + Registry.RegisterRequest(TestRequestId, TestSenderId, TestReceiverId); + } + + private void RegisteringRequest() + { + Registry.RegisterRequest(TestRequestId, TestSenderId, TestReceiverId); + } + + private void GettingRequestsForSender() + { + RequestCount = Registry.GetRequestsForCharacter(TestSenderId).Count(); + } + + private void GettingRequestsForReceiver() + { + RequestCount = Registry.GetRequestsForCharacter(TestReceiverId).Count(); + } + + private void GettingRequestsForUnknownCharacter() + { + RequestCount = Registry.GetRequestsForCharacter(9999).Count(); + } + + private void UnregisteringRequest() + { + UnregisterResult = Registry.UnregisterRequest(TestRequestId); + } + + private void UnregisteringUnknownRequest() + { + UnregisterResult = Registry.UnregisterRequest(Guid.NewGuid()); + } + + private void RequestShouldBeRetrievable() + { + var requests = Registry.GetRequestsForCharacter(TestSenderId); + Assert.AreEqual(1, requests.Count()); + var request = requests.First(); + Assert.AreEqual(TestRequestId, request.Key); + Assert.AreEqual(TestSenderId, request.Value.SenderId); + Assert.AreEqual(TestReceiverId, request.Value.ReceiverId); + } + + private void SenderRequestsShouldBeReturned() + { + Assert.AreEqual(2, RequestCount); + } + + private void ReceiverRequestsShouldBeReturned() + { + Assert.AreEqual(2, RequestCount); + } + + private void NoRequestsShouldBeReturned() + { + Assert.AreEqual(0, RequestCount); + } + + private void UnregisterShouldSucceed() + { + Assert.IsTrue(UnregisterResult); + } + + private void UnregisterShouldFail() + { + Assert.IsFalse(UnregisterResult); + } + + private void RequestShouldNotExist() + { + var requests = Registry.GetRequestsForCharacter(TestSenderId); + Assert.AreEqual(0, requests.Count()); + } + } +} diff --git a/test/NosCore.GameObject.Tests/Services/FriendService/FriendServiceTests.cs b/test/NosCore.GameObject.Tests/Services/FriendService/FriendServiceTests.cs new file mode 100644 index 000000000..a6f6ebcab --- /dev/null +++ b/test/NosCore.GameObject.Tests/Services/FriendService/FriendServiceTests.cs @@ -0,0 +1,299 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.Core; +using NosCore.Data.Dto; +using NosCore.Data.Enumerations.I18N; +using NosCore.Data.WebApi; +using NosCore.GameObject.InterChannelCommunication.Hubs.ChannelHub; +using NosCore.GameObject.InterChannelCommunication.Hubs.PubSub; +using NosCore.GameObject.Services.FriendService; +using NosCore.Packets.Enumerations; +using NosCore.Shared.Enumerations; +using NosCore.Tests.Shared; +using Serilog; +using SpecLight; + +namespace NosCore.GameObject.Tests.Services.FriendService +{ + [TestClass] + public class FriendServiceTests + { + private static readonly ILogger Logger = new Mock().Object; + private IFriendService Service = null!; + private IFriendRequestRegistry FriendRequestHolder = null!; + private Mock PubSubHub = null!; + private Mock ChannelHub = null!; + private long CharacterId; + private long TargetCharacterId; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + PubSubHub = new Mock(); + ChannelHub = new Mock(); + FriendRequestHolder = new FriendRequestRegistry(); + + ChannelHub.Setup(s => s.GetCommunicationChannels()) + .ReturnsAsync(new List + { + new ChannelInfo { Type = ServerType.WorldServer, Id = 1 } + }); + + CharacterId = 1; + TargetCharacterId = 2; + + Service = new GameObject.Services.FriendService.FriendService( + Logger, + TestHelpers.Instance.CharacterRelationDao, + TestHelpers.Instance.CharacterDao, + FriendRequestHolder, + PubSubHub.Object, + ChannelHub.Object, + TestHelpers.Instance.LogLanguageLocalizer); + } + + [TestMethod] + public async Task AddingFriendWithoutRequestShouldSendRequest() + { + await new Spec("Adding friend without request should send request") + .GivenAsync(BothPlayersAreOnlineSameChannel) + .WhenAsync(AddingFriendWithoutExistingRequest) + .Then(ResultShouldBeFriendRequestSent) + .ExecuteAsync(); + } + + [TestMethod] + public async Task AcceptingFriendRequestShouldCreateMutualRelation() + { + await new Spec("Accepting friend request should create mutual relation") + .GivenAsync(BothPlayersAreOnlineSameChannel) + .And(FriendRequestExists) + .WhenAsync(AcceptingFriendRequest) + .ThenAsync(TwoFriendRelationsShouldExist) + .ExecuteAsync(); + } + + [TestMethod] + public async Task RejectingFriendRequestShouldNotCreateRelation() + { + await new Spec("Rejecting friend request should not create relation") + .GivenAsync(BothPlayersAreOnlineSameChannel) + .And(FriendRequestExists) + .WhenAsync(RejectingFriendRequest) + .ThenAsync(NoFriendRelationShouldExist) + .ExecuteAsync(); + } + + [TestMethod] + public async Task AddingFriendWhenAlreadyFriendsShouldReturnAlreadyFriend() + { + await new Spec("Adding friend when already friends should return already friend") + .GivenAsync(BothPlayersAreOnlineSameChannel) + .AndAsync(PlayersAreAlreadyFriends) + .And(FriendRequestExists) + .WhenAsync(AcceptingFriendRequest) + .Then(ResultShouldBeAlreadyFriend) + .ExecuteAsync(); + } + + [TestMethod] + public async Task AddingBlockedPlayerAsFriendShouldReturnBlacklistBlocked() + { + await new Spec("Adding blocked player as friend should return blacklist blocked") + .GivenAsync(BothPlayersAreOnlineSameChannel) + .AndAsync(TargetIsBlocked) + .And(FriendRequestExists) + .WhenAsync(AcceptingFriendRequest) + .Then(ResultShouldBeBlacklistBlocked) + .ExecuteAsync(); + } + + [TestMethod] + public async Task GetFriendsListShouldReturnFriends() + { + await new Spec("Get friends list should return friends") + .GivenAsync(BothPlayersAreOnlineSameChannel) + .AndAsync(PlayersAreAlreadyFriends) + .WhenAsync(GettingFriendsList) + .Then(ListShouldContainTarget) + .ExecuteAsync(); + } + + [TestMethod] + public async Task DeletingFriendShouldRemoveBothRelations() + { + await new Spec("Deleting friend should remove both relations") + .GivenAsync(BothPlayersAreOnlineSameChannel) + .AndAsync(PlayersAreAlreadyFriends) + .WhenAsync(DeletingFriend) + .Then(DeleteShouldSucceed) + .ThenAsync(NoFriendRelationShouldExist) + .ExecuteAsync(); + } + + [TestMethod] + public async Task DeletingNonExistentFriendShouldReturnFalse() + { + await new Spec("Deleting non-existent friend should return false") + .WhenAsync(DeletingNonExistentFriend) + .Then(DeleteShouldFail) + .ExecuteAsync(); + } + + private LanguageKey? AddFriendResult; + private List? FriendsList; + private bool DeleteResult; + private Guid? FriendRelationId; + + private async Task BothPlayersAreOnlineSameChannel() + { + var session1 = await TestHelpers.Instance.GenerateSessionAsync(); + var session2 = await TestHelpers.Instance.GenerateSessionAsync(); + CharacterId = session1.Character.CharacterId; + TargetCharacterId = session2.Character.CharacterId; + + PubSubHub.Setup(s => s.GetSubscribersAsync()) + .ReturnsAsync(new List + { + new Subscriber { ChannelId = 1, ConnectedCharacter = new Character { Id = CharacterId, FriendRequestBlocked = false } }, + new Subscriber { ChannelId = 1, ConnectedCharacter = new Character { Id = TargetCharacterId, FriendRequestBlocked = false } } + }); + } + + private void FriendRequestExists() + { + FriendRequestHolder.RegisterRequest(Guid.NewGuid(), TargetCharacterId, CharacterId); + } + + private async Task PlayersAreAlreadyFriends() + { + var relation1 = new CharacterRelationDto + { + CharacterId = CharacterId, + RelatedCharacterId = TargetCharacterId, + RelationType = CharacterRelationType.Friend + }; + var inserted = await TestHelpers.Instance.CharacterRelationDao.TryInsertOrUpdateAsync(relation1); + FriendRelationId = inserted.CharacterRelationId; + + var relation2 = new CharacterRelationDto + { + CharacterId = TargetCharacterId, + RelatedCharacterId = CharacterId, + RelationType = CharacterRelationType.Friend + }; + await TestHelpers.Instance.CharacterRelationDao.TryInsertOrUpdateAsync(relation2); + } + + private async Task TargetIsBlocked() + { + var relation = new CharacterRelationDto + { + CharacterId = CharacterId, + RelatedCharacterId = TargetCharacterId, + RelationType = CharacterRelationType.Blocked + }; + await TestHelpers.Instance.CharacterRelationDao.TryInsertOrUpdateAsync(relation); + } + + private async Task AddingFriendWithoutExistingRequest() + { + AddFriendResult = await Service.AddFriendAsync(CharacterId, TargetCharacterId, FinsPacketType.Accepted); + } + + private async Task AcceptingFriendRequest() + { + AddFriendResult = await Service.AddFriendAsync(CharacterId, TargetCharacterId, FinsPacketType.Accepted); + } + + private async Task RejectingFriendRequest() + { + AddFriendResult = await Service.AddFriendAsync(CharacterId, TargetCharacterId, FinsPacketType.Rejected); + } + + private async Task GettingFriendsList() + { + FriendsList = await Service.GetFriendsAsync(CharacterId); + } + + private async Task DeletingFriend() + { + DeleteResult = await Service.DeleteAsync(FriendRelationId!.Value); + } + + private async Task DeletingNonExistentFriend() + { + DeleteResult = await Service.DeleteAsync(Guid.NewGuid()); + } + + private void ResultShouldBeFriendRequestSent() + { + Assert.AreEqual(LanguageKey.FRIEND_REQUEST_SENT, AddFriendResult); + } + + private async Task TwoFriendRelationsShouldExist() + { + var relations = TestHelpers.Instance.CharacterRelationDao + .Where(s => s.RelationType == CharacterRelationType.Friend)?.ToList(); + Assert.IsNotNull(relations); + Assert.AreEqual(2, relations.Count); + } + + private async Task NoFriendRelationShouldExist() + { + var relations = TestHelpers.Instance.CharacterRelationDao + .Where(s => s.RelationType == CharacterRelationType.Friend)?.ToList(); + Assert.IsTrue(relations == null || relations.Count == 0); + } + + private void ResultShouldBeAlreadyFriend() + { + Assert.AreEqual(LanguageKey.ALREADY_FRIEND, AddFriendResult); + } + + private void ResultShouldBeBlacklistBlocked() + { + Assert.AreEqual(LanguageKey.BLACKLIST_BLOCKED, AddFriendResult); + } + + private void ListShouldContainTarget() + { + Assert.IsNotNull(FriendsList); + Assert.IsTrue(FriendsList.Any(s => s.CharacterId == TargetCharacterId)); + } + + private void DeleteShouldSucceed() + { + Assert.IsTrue(DeleteResult); + } + + private void DeleteShouldFail() + { + Assert.IsFalse(DeleteResult); + } + } +} diff --git a/test/NosCore.GameObject.Tests/Services/GroupService/GroupRegistryTests.cs b/test/NosCore.GameObject.Tests/Services/GroupService/GroupRegistryTests.cs new file mode 100644 index 000000000..63244b118 --- /dev/null +++ b/test/NosCore.GameObject.Tests/Services/GroupService/GroupRegistryTests.cs @@ -0,0 +1,196 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.Data.Enumerations.Group; +using NosCore.GameObject.Services.GroupService; +using NosCore.Networking.SessionGroup; +using SpecLight; + +namespace NosCore.GameObject.Tests.Services.GroupService +{ + [TestClass] + public class GroupRegistryTests + { + private IGroupRegistry Registry = null!; + private Mock MockSessionGroupFactory = null!; + + [TestInitialize] + public void Setup() + { + MockSessionGroupFactory = new Mock(); + MockSessionGroupFactory.Setup(f => f.Create()).Returns(new Mock().Object); + Registry = new GroupRegistry(); + } + + [TestMethod] + public async Task RegisterShouldAddGroup() + { + await new Spec("Register should add group") + .Given(GroupIsCreated) + .When(RegisteringGroup) + .Then(GroupShouldBeRetrievable) + .ExecuteAsync(); + } + + [TestMethod] + public async Task GetByIdShouldReturnNullForUnknownId() + { + await new Spec("Get by ID should return null for unknown ID") + .When(GettingUnknownGroup) + .Then(ResultShouldBeNull) + .ExecuteAsync(); + } + + [TestMethod] + public async Task UnregisterShouldRemoveGroup() + { + await new Spec("Unregister should remove group") + .Given(GroupIsRegistered) + .When(UnregisteringGroup) + .Then(GroupShouldNotExist) + .ExecuteAsync(); + } + + [TestMethod] + public async Task RegisterMemberShouldTrackMembership() + { + await new Spec("Register member should track membership") + .Given(GroupIsRegistered) + .When(RegisteringMember) + .Then(MemberShouldBeRegistered) + .ExecuteAsync(); + } + + [TestMethod] + public async Task UnregisterMemberShouldRemoveMembership() + { + await new Spec("Unregister member should remove membership") + .Given(MemberIsRegistered) + .When(UnregisteringMember) + .Then(MemberShouldNotBeRegistered) + .ExecuteAsync(); + } + + [TestMethod] + public async Task GetNextGroupIdShouldIncrementEachCall() + { + await new Spec("Get next group ID should increment each call") + .When(GettingNextGroupIds) + .Then(IdsShouldBeSequential) + .ExecuteAsync(); + } + + private Group? TestGroup; + private Group? ResultGroup; + private const long TestGroupId = 1; + private const long TestCharacterId = 100; + private long FirstId; + private long SecondId; + + private void GroupIsCreated() + { + TestGroup = new Group(GroupType.Group, MockSessionGroupFactory.Object) + { + GroupId = TestGroupId + }; + } + + private void GroupIsRegistered() + { + GroupIsCreated(); + Registry.Register(TestGroup!); + } + + private void MemberIsRegistered() + { + GroupIsRegistered(); + Registry.RegisterMember(TestCharacterId, TestGroupId); + } + + private void RegisteringGroup() + { + Registry.Register(TestGroup!); + } + + private void GettingUnknownGroup() + { + ResultGroup = Registry.GetById(9999); + } + + private void UnregisteringGroup() + { + Registry.Unregister(TestGroupId); + } + + private void RegisteringMember() + { + Registry.RegisterMember(TestCharacterId, TestGroupId); + } + + private void UnregisteringMember() + { + Registry.UnregisterMember(TestCharacterId); + } + + private void GettingNextGroupIds() + { + FirstId = Registry.GetNextGroupId(); + SecondId = Registry.GetNextGroupId(); + } + + private void GroupShouldBeRetrievable() + { + var result = Registry.GetById(TestGroupId); + Assert.IsNotNull(result); + Assert.AreEqual(TestGroupId, result.GroupId); + } + + private void ResultShouldBeNull() + { + Assert.IsNull(ResultGroup); + } + + private void GroupShouldNotExist() + { + var result = Registry.GetById(TestGroupId); + Assert.IsNull(result); + } + + private void MemberShouldBeRegistered() + { + // Member registration is internal, we verify through group being registered + Assert.IsNotNull(Registry.GetById(TestGroupId)); + } + + private void MemberShouldNotBeRegistered() + { + // Member unregistration happened, group should still exist + Assert.IsNotNull(Registry.GetById(TestGroupId)); + } + + private void IdsShouldBeSequential() + { + Assert.AreEqual(1, FirstId); + Assert.AreEqual(2, SecondId); + } + } +} diff --git a/test/NosCore.GameObject.Tests/Services/GuriRunnerService/GuriRunnerServiceTests.cs b/test/NosCore.GameObject.Tests/Services/GuriRunnerService/GuriRunnerServiceTests.cs new file mode 100644 index 000000000..97f10e70d --- /dev/null +++ b/test/NosCore.GameObject.Tests/Services/GuriRunnerService/GuriRunnerServiceTests.cs @@ -0,0 +1,146 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.GameObject.Infastructure; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.GameObject.Services.GuriRunnerService; +using NosCore.Packets.ClientPackets.UI; +using NosCore.Tests.Shared; +using SpecLight; + +namespace NosCore.GameObject.Tests.Services.GuriRunnerService +{ + [TestClass] + public class GuriRunnerServiceTests + { + private IGuriRunnerService Service = null!; + private List> Handlers = null!; + private ClientSession Session = null!; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + Handlers = new List>(); + + Service = new GameObject.Services.GuriRunnerService.GuriRunnerService(Handlers); + } + + [TestMethod] + public void ServiceCanBeConstructed() + { + new Spec("Service can be constructed") + .Then(ServiceShouldNotBeNull) + .Execute(); + } + + [TestMethod] + public void GuriLaunchWithNoHandlersShouldComplete() + { + new Spec("Guri launch with no handlers should complete") + .When(LaunchingGuriWithNoHandlers) + .Then(LaunchShouldComplete) + .Execute(); + } + + [TestMethod] + public void GuriLaunchWithMatchingHandlerShouldExecuteHandler() + { + new Spec("Guri launch with matching handler should execute handler") + .Given(HandlerIsRegistered) + .When(LaunchingGuri) + .Then(HandlerShouldBeExecuted) + .Execute(); + } + + [TestMethod] + public void GuriLaunchWithNonMatchingHandlerShouldNotExecuteHandler() + { + new Spec("Guri launch with non-matching handler should not execute handler") + .Given(NonMatchingHandlerIsRegistered) + .When(LaunchingGuri) + .Then(HandlerShouldNotBeExecuted) + .Execute(); + } + + private bool LaunchCompleted; + private Mock>? MockHandler; + private bool HandlerExecuted; + + private void HandlerIsRegistered() + { + MockHandler = new Mock>(); + MockHandler.Setup(h => h.Condition(It.IsAny())) + .Returns(true); + MockHandler.Setup(h => h.ExecuteAsync(It.IsAny>())) + .Callback(() => HandlerExecuted = true) + .Returns(Task.CompletedTask); + Handlers.Add(MockHandler.Object); + Service = new GameObject.Services.GuriRunnerService.GuriRunnerService(Handlers); + } + + private void NonMatchingHandlerIsRegistered() + { + MockHandler = new Mock>(); + MockHandler.Setup(h => h.Condition(It.IsAny())) + .Returns(false); + Handlers.Add(MockHandler.Object); + Service = new GameObject.Services.GuriRunnerService.GuriRunnerService(Handlers); + } + + private void LaunchingGuriWithNoHandlers() + { + var data = new GuriPacket(); + Service.GuriLaunch(Session, data); + LaunchCompleted = true; + } + + private void LaunchingGuri() + { + var data = new GuriPacket(); + Service.GuriLaunch(Session, data); + LaunchCompleted = true; + } + + private void ServiceShouldNotBeNull() + { + Assert.IsNotNull(Service); + } + + private void LaunchShouldComplete() + { + Assert.IsTrue(LaunchCompleted); + } + + private void HandlerShouldBeExecuted() + { + Assert.IsTrue(HandlerExecuted); + } + + private void HandlerShouldNotBeExecuted() + { + MockHandler?.Verify(h => h.ExecuteAsync(It.IsAny>()), Times.Never); + } + } +} diff --git a/test/NosCore.GameObject.Tests/Services/GuriRunnerService/Handlers/SpeakerGuriHandlerTests.cs b/test/NosCore.GameObject.Tests/Services/GuriRunnerService/Handlers/SpeakerGuriHandlerTests.cs index 972f1efde..0dd2778ed 100644 --- a/test/NosCore.GameObject.Tests/Services/GuriRunnerService/Handlers/SpeakerGuriHandlerTests.cs +++ b/test/NosCore.GameObject.Tests/Services/GuriRunnerService/Handlers/SpeakerGuriHandlerTests.cs @@ -45,9 +45,9 @@ namespace NosCore.GameObject.Tests.Services.GuriRunnerService.Handlers [TestClass] public class SpeakerGuriHandlerTests : GuriEventHandlerTestsBase { - private IItemGenerationService? _itemProvider; - private Mock? _logger; - private ClientSession? _receiverSession; + private IItemGenerationService? ItemProvider; + private Mock? Logger; + private ClientSession? ReceiverSession; [TestInitialize] public async Task SetupAsync() @@ -57,20 +57,20 @@ public async Task SetupAsync() { new Item {VNum = 1, ItemType = ItemType.Magical, Type = NoscorePocketType.Etc, Effect = ItemEffectType.Speaker}, }; - _logger = new Mock(); - _itemProvider = new GameObject.Services.ItemGenerationService.ItemGenerationService(items, - new EventLoaderService, IUseItemEventHandler>(new List>>()), _logger.Object, TestHelpers.Instance.LogLanguageLocalizer); + Logger = new Mock(); + ItemProvider = new GameObject.Services.ItemGenerationService.ItemGenerationService(items, + new EventLoaderService, IUseItemEventHandler>(new List>>()), Logger.Object, TestHelpers.Instance.LogLanguageLocalizer); Session = await TestHelpers.Instance.GenerateSessionAsync(); - _receiverSession = await TestHelpers.Instance.GenerateSessionAsync(); + ReceiverSession = await TestHelpers.Instance.GenerateSessionAsync(); - Handler = new SpeakerGuriHandler(_logger.Object, TestHelpers.Instance.LogLanguageLocalizer, TestHelpers.Instance.GameLanguageLocalizer, TestHelpers.Instance.SessionRegistry); + Handler = new SpeakerGuriHandler(Logger.Object, TestHelpers.Instance.LogLanguageLocalizer, TestHelpers.Instance.GameLanguageLocalizer, TestHelpers.Instance.SessionRegistry); } [TestMethod] - public async Task Test_SpeakerWithItemAsync() + public async Task TestSpeakerWithItemAsync() { - Session!.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_itemProvider!.Create(1, 1), 0)); + Session!.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(ItemProvider!.Create(1, 1), 0)); await ExecuteGuriEventHandlerAsync(new GuriPacket { Type = GuriPacketType.TextInput, @@ -79,17 +79,17 @@ await ExecuteGuriEventHandlerAsync(new GuriPacket Data = 999, Value = "2 0 {test}" }); - var sayitempacket = (SayItemPacket?)_receiverSession!.LastPackets.FirstOrDefault(s => s is SayItemPacket); + var sayitempacket = (SayItemPacket?)ReceiverSession!.LastPackets.FirstOrDefault(s => s is SayItemPacket); Assert.IsNotNull(sayitempacket); - var saypacket = (SayPacket?)_receiverSession!.LastPackets.FirstOrDefault(s => s is SayPacket); + var saypacket = (SayPacket?)ReceiverSession!.LastPackets.FirstOrDefault(s => s is SayPacket); Assert.IsNull(saypacket); } [TestMethod] - public async Task Test_SpeakerWithItemDoesNotExistAsync() + public async Task TestSpeakerWithItemDoesNotExistAsync() { - Session!.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_itemProvider!.Create(1, 1), 0)); + Session!.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(ItemProvider!.Create(1, 1), 0)); await ExecuteGuriEventHandlerAsync(new GuriPacket { Type = GuriPacketType.TextInput, @@ -98,32 +98,32 @@ await ExecuteGuriEventHandlerAsync(new GuriPacket Data = 999, Value = "2 1 {test}" }); - var sayitempacket = (SayItemPacket?)_receiverSession!.LastPackets.FirstOrDefault(s => s is SayItemPacket); + var sayitempacket = (SayItemPacket?)ReceiverSession!.LastPackets.FirstOrDefault(s => s is SayItemPacket); Assert.IsNull(sayitempacket); - var saypacket = (SayPacket?)_receiverSession!.LastPackets.FirstOrDefault(s => s is SayPacket); + var saypacket = (SayPacket?)ReceiverSession!.LastPackets.FirstOrDefault(s => s is SayPacket); Assert.IsNull(saypacket); } [TestMethod] - public async Task Test_SpeakerWithoutItemAsync() + public async Task TestSpeakerWithoutItemAsync() { Session!.Character.InventoryService.AddItemToPocket( - InventoryItemInstance.Create(_itemProvider!.Create(1, 1), 0)); + InventoryItemInstance.Create(ItemProvider!.Create(1, 1), 0)); await ExecuteGuriEventHandlerAsync(new GuriPacket { Type = GuriPacketType.TextInput, Argument = 3, VisualId = 0, }); - var sayitempacket = (SayItemPacket?)_receiverSession!.LastPackets.FirstOrDefault(s => s is SayItemPacket); + var sayitempacket = (SayItemPacket?)ReceiverSession!.LastPackets.FirstOrDefault(s => s is SayItemPacket); Assert.IsNull(sayitempacket); - var saypacket = (SayPacket?)_receiverSession!.LastPackets.FirstOrDefault(s => s is SayPacket); + var saypacket = (SayPacket?)ReceiverSession!.LastPackets.FirstOrDefault(s => s is SayPacket); Assert.IsNotNull(saypacket); } [TestMethod] - public async Task Test_SpeakerWithNoSpeakerAsync() + public async Task TestSpeakerWithNoSpeakerAsync() { await ExecuteGuriEventHandlerAsync(new GuriPacket { @@ -131,9 +131,9 @@ await ExecuteGuriEventHandlerAsync(new GuriPacket Argument = 3, VisualId = 0 }); - var sayitempacket = (SayItemPacket?)_receiverSession!.LastPackets.FirstOrDefault(s => s is SayItemPacket); + var sayitempacket = (SayItemPacket?)ReceiverSession!.LastPackets.FirstOrDefault(s => s is SayItemPacket); Assert.IsNull(sayitempacket); - var saypacket = (SayPacket?)_receiverSession!.LastPackets.FirstOrDefault(s => s is SayPacket); + var saypacket = (SayPacket?)ReceiverSession!.LastPackets.FirstOrDefault(s => s is SayPacket); Assert.IsNull(saypacket); } } diff --git a/test/NosCore.GameObject.Tests/Services/GuriRunnerService/Handlers/TitleGuriHandlerTests.cs b/test/NosCore.GameObject.Tests/Services/GuriRunnerService/Handlers/TitleGuriHandlerTests.cs index b4a8d2033..c0bf327ff 100644 --- a/test/NosCore.GameObject.Tests/Services/GuriRunnerService/Handlers/TitleGuriHandlerTests.cs +++ b/test/NosCore.GameObject.Tests/Services/GuriRunnerService/Handlers/TitleGuriHandlerTests.cs @@ -45,8 +45,8 @@ namespace NosCore.GameObject.Tests.Services.GuriRunnerService.Handlers [TestClass] public class TitleGuriHandlerTests : GuriEventHandlerTestsBase { - private IItemGenerationService? _itemProvider; - private readonly ILogger _logger = new Mock().Object; + private IItemGenerationService? ItemProvider; + private readonly ILogger Logger = new Mock().Object; [TestInitialize] public async Task SetupAsync() @@ -56,17 +56,17 @@ public async Task SetupAsync() { new Item {VNum = 1, ItemType = ItemType.Title, EffectValue = 0, Type = NoscorePocketType.Main}, }; - _itemProvider = new GameObject.Services.ItemGenerationService.ItemGenerationService(items, - new EventLoaderService, IUseItemEventHandler>(new List>>()), _logger, TestHelpers.Instance.LogLanguageLocalizer); + ItemProvider = new GameObject.Services.ItemGenerationService.ItemGenerationService(items, + new EventLoaderService, IUseItemEventHandler>(new List>>()), Logger, TestHelpers.Instance.LogLanguageLocalizer); Session = await TestHelpers.Instance.GenerateSessionAsync(); Handler = new TitleGuriHandler(); } [TestMethod] - public async Task Test_TitleGuriHandlerAsync() + public async Task TestTitleGuriHandlerAsync() { - Session!.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_itemProvider!.Create(1, 1), 0)); + Session!.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(ItemProvider!.Create(1, 1), 0)); await ExecuteGuriEventHandlerAsync(new GuriPacket { Type = GuriPacketType.Title, @@ -78,9 +78,9 @@ await ExecuteGuriEventHandlerAsync(new GuriPacket } [TestMethod] - public async Task Test_TitleGuriHandlerWhenDuplicateAsync() + public async Task TestTitleGuriHandlerWhenDuplicateAsync() { - Session!.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_itemProvider!.Create(1, 1), 0)); + Session!.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(ItemProvider!.Create(1, 1), 0)); Session.Character.Titles = new List { new() { TitleType = 1 } }; await ExecuteGuriEventHandlerAsync(new GuriPacket { @@ -93,7 +93,7 @@ await ExecuteGuriEventHandlerAsync(new GuriPacket } [TestMethod] - public async Task Test_TitleGuriHandlerWhenNoTitleItemAsync() + public async Task TestTitleGuriHandlerWhenNoTitleItemAsync() { await ExecuteGuriEventHandlerAsync(new GuriPacket { diff --git a/test/NosCore.GameObject.Tests/Services/InventoryService/InventoryServiceTests.cs b/test/NosCore.GameObject.Tests/Services/InventoryService/InventoryServiceTests.cs index e2af51783..966f780e1 100644 --- a/test/NosCore.GameObject.Tests/Services/InventoryService/InventoryServiceTests.cs +++ b/test/NosCore.GameObject.Tests/Services/InventoryService/InventoryServiceTests.cs @@ -1,19 +1,19 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . @@ -35,6 +35,7 @@ using NosCore.Packets.Enumerations; using NosCore.Tests.Shared; using Serilog; +using SpecLight; using NosCore.GameObject.Infastructure; namespace NosCore.GameObject.Tests.Services.InventoryService @@ -43,8 +44,7 @@ namespace NosCore.GameObject.Tests.Services.InventoryService public class InventoryServiceTests { private static readonly ILogger Logger = new Mock().Object; - private GameObject.Services.ItemGenerationService.ItemGenerationService? _itemProvider; - + private GameObject.Services.ItemGenerationService.ItemGenerationService? ItemProvider; private IInventoryService? Inventory { get; set; } [TestInitialize] @@ -59,237 +59,562 @@ public void Setup() new Item {Type = NoscorePocketType.Equipment, VNum = 912, ItemType = ItemType.Specialist}, new Item {Type = NoscorePocketType.Equipment, VNum = 924, ItemType = ItemType.Fashion} }; - _itemProvider = new GameObject.Services.ItemGenerationService.ItemGenerationService(items, + ItemProvider = new GameObject.Services.ItemGenerationService.ItemGenerationService(items, new EventLoaderService, IUseItemEventHandler>(new List>>()), Logger, TestHelpers.Instance.LogLanguageLocalizer); Inventory = new GameObject.Services.InventoryService.InventoryService(items, Options.Create(new WorldConfiguration { BackpackSize = 3, MaxItemAmount = 999 }), Logger); } [TestMethod] - public void CreateItem() + public void CreatingItemShouldAddToInventory() { - var item = Inventory!.AddItemToPocket(InventoryItemInstance.Create(_itemProvider!.Create(1012), 0))!.First(); - Assert.IsTrue((item.ItemInstance?.Amount == 1) && (item.ItemInstance.ItemVNum == 1012) && - (item.Type == NoscorePocketType.Main)); + new Spec("Creating item should add to inventory") + .When(AddingItemToPocket) + .Then(ItemShouldBeInInventory) + .Execute(); } [TestMethod] - public void CreateItemAndStackIt() + public void CreatingItemAndStackingShouldIncreaseAmount() { - Inventory!.AddItemToPocket(InventoryItemInstance.Create(_itemProvider!.Create(1012), 0))!.First(); - var item = Inventory.AddItemToPocket(InventoryItemInstance.Create(_itemProvider.Create(1012), 0))!.First(); - Assert.IsTrue((item.ItemInstance?.Amount == 2) && (item.ItemInstance.ItemVNum == 1012)); + new Spec("Creating item and stacking should increase amount") + .Given(ItemAlreadyInPocket) + .When(AddingSameItemAgain) + .Then(AmountShouldBeTwo) + .Execute(); } [TestMethod] - public void CreateItemWhenSlotMax() + public void CreatingItemWhenSlotIsMaxShouldCreateNewStack() { - Inventory!.AddItemToPocket(InventoryItemInstance.Create(_itemProvider!.Create(1012, 999), 0))!.First(); - var items = Inventory.AddItemToPocket(InventoryItemInstance.Create(_itemProvider.Create(1012), 0)); - Assert.IsTrue(items![0].ItemInstance?.Amount == 1); + new Spec("Creating item when slot is max should create new stack") + .Given(FullStackInPocket) + .When(AddingOneMoreItem) + .Then(NewStackShouldHaveOneItem) + .Execute(); } [TestMethod] - public void CreateItemWhenSlotFilled() + public void CreatingItemWhenSlotFilledShouldSplit() { - Inventory!.AddItemToPocket(InventoryItemInstance.Create(_itemProvider!.Create(1012, 990), 0))!.First(); - var items = Inventory.AddItemToPocket(InventoryItemInstance.Create(_itemProvider.Create(1012, 29), 0)); - Assert.IsTrue((items![0].ItemInstance?.Amount == 999) && (items.Last().ItemInstance?.Amount == 20)); + new Spec("Creating item when slot filled should split") + .Given(AlmostFullStackInPocket) + .When(AddingItemsThatOverflow) + .Then(ShouldSplitIntoTwoStacks) + .Execute(); } [TestMethod] - public void CreateItemAndFillMultiSlot() + public void CreatingItemShouldFillMultipleSlots() { - Inventory!.AddItemToPocket(InventoryItemInstance.Create(_itemProvider!.Create(1012, 990), 0), - NoscorePocketType.Main, 0); - Inventory.AddItemToPocket(InventoryItemInstance.Create(_itemProvider.Create(1012, 990), 0), - NoscorePocketType.Main, 1); - Inventory.AddItemToPocket(InventoryItemInstance.Create(_itemProvider.Create(1012, 990), 0), - NoscorePocketType.Main, 2); - var items = Inventory.AddItemToPocket(InventoryItemInstance.Create(_itemProvider.Create(1012, 27), 0))!; - Assert.IsTrue(items.All(item => item.ItemInstance.Amount == 999) && (items?.Count == 3)); + new Spec("Creating item should fill multiple slots") + .Given(ThreeAlmostFullStacks) + .When(AddingItemsToFillAll) + .Then(AllStacksShouldBeFull) + .Execute(); } [TestMethod] - public void CreateMoreItemThanInventoryPlace() + public void CreatingMoreItemsThanInventoryPlaceShouldFail() { - Inventory!.AddItemToPocket(InventoryItemInstance.Create(_itemProvider!.Create(1012, 990), 0), - NoscorePocketType.Main, 0); - Inventory.AddItemToPocket(InventoryItemInstance.Create(_itemProvider.Create(1012, 990), 0), - NoscorePocketType.Main, 1); - Inventory.AddItemToPocket(InventoryItemInstance.Create(_itemProvider.Create(1012, 990), 0), - NoscorePocketType.Main, 2); - var items = Inventory.AddItemToPocket(InventoryItemInstance.Create(_itemProvider.Create(1012, 99), 0)); - Assert.IsTrue(Inventory.Values.All(item => item.ItemInstance?.Amount == 990) && (items?.Count == 0)); + new Spec("Creating more items than inventory place should fail") + .Given(ThreeAlmostFullStacks) + .When(AddingTooManyItems) + .Then(StacksShouldRemainUnchanged) + .Execute(); } [TestMethod] - public void CreateStackOnASpecificItem() + public void CreatingStackOnSpecificItemShouldStackCorrectly() { - Inventory!.AddItemToPocket(InventoryItemInstance.Create(_itemProvider!.Create(1012, 990), 0)); - Inventory.AddItemToPocket(InventoryItemInstance.Create(_itemProvider.Create(1013, 990), 0)); - Inventory.AddItemToPocket(InventoryItemInstance.Create(_itemProvider.Create(1013), 0)); - Assert.IsTrue(Inventory.Values.First(item => item.Slot == 1).ItemInstance.Amount == 991); + new Spec("Creating stack on specific item should stack correctly") + .Given(MixedItemsInInventory) + .When(AddingItemThatStacksOnSecond) + .Then(SecondStackShouldIncrease) + .Execute(); } [TestMethod] - public void CreateDoesntStackOnWrongItem() + public void CreatingDoesntStackOnWrongItem() { - Inventory!.AddItemToPocket(InventoryItemInstance.Create(_itemProvider!.Create(1012, 990), 0)); - Inventory.AddItemToPocket(InventoryItemInstance.Create(_itemProvider.Create(1013, 990), 0)); - Inventory.AddItemToPocket(InventoryItemInstance.Create(_itemProvider.Create(1013, 19), 0)); - Assert.IsTrue(Inventory.Values.First(item => item.Slot == 0).ItemInstance?.Amount == 990); + new Spec("Creating doesnt stack on wrong item") + .Given(MixedItemsInInventory) + .When(AddingDifferentItem) + .Then(FirstStackShouldRemainUnchanged) + .Execute(); } [TestMethod] - public void LoadItemOnAnNotEmptySlot() + public void LoadingItemOnNonEmptySlotShouldReturnItem() { - Inventory!.AddItemToPocket(InventoryItemInstance.Create(_itemProvider!.Create(1012, 990), 0)); - var item = Inventory.LoadBySlotAndType(0, NoscorePocketType.Main); - Assert.IsTrue((item!.ItemInstance?.ItemVNum == 1012) && (item.ItemInstance?.Amount == 990)); + new Spec("Loading item on non empty slot should return item") + .Given(ItemInSlotZero) + .Then(LoadShouldReturnItem) + .Execute(); } [TestMethod] - public void LoadAnNonExistingItem() + public void LoadingNonExistingItemShouldReturnNull() { - Inventory!.AddItemToPocket(InventoryItemInstance.Create(_itemProvider!.Create(1012, 990), 0)); - var item = Inventory.LoadBySlotAndType(1, NoscorePocketType.Main); - Assert.IsNull(item); + new Spec("Loading non existing item should return null") + .Given(ItemInSlotZero) + .Then(LoadSlotOneShouldReturnNull) + .Execute(); } [TestMethod] - public void DeleteFromTypeAndSlot() + public void DeletingFromTypeAndSlotShouldRemoveItem() { - Inventory!.AddItemToPocket(InventoryItemInstance.Create(_itemProvider!.Create(1012, 990), 0)); - Inventory.AddItemToPocket(InventoryItemInstance.Create(_itemProvider.Create(1012, 990), 0)); - Assert.IsTrue(Inventory.Count == 2); - var item = Inventory.DeleteFromTypeAndSlot(NoscorePocketType.Main, 0); - Assert.IsNull(item); - Assert.IsTrue(Inventory.Count == 1); + new Spec("Deleting from type and slot should remove item") + .Given(TwoStacksInInventory) + .When(DeletingFromSlotZero) + .Then(OnlyOneItemShouldRemain) + .Execute(); } [TestMethod] - public void Delete() + public void DeletingByIdShouldRemoveItem() { - Inventory!.AddItemToPocket(InventoryItemInstance.Create(_itemProvider!.Create(1012, 990), 0)); - var items = Inventory.AddItemToPocket(InventoryItemInstance.Create(_itemProvider.Create(1012, 990), 0)); - Assert.IsTrue(Inventory.Count == 2); - var item = Inventory.DeleteById(items![0].ItemInstanceId); - Assert.IsNull(item); - Assert.IsTrue(Inventory.Count == 1); + new Spec("Deleting by id should remove item") + .Given(TwoStacksInInventoryForDelete) + .When(DeletingByInstanceId) + .Then(OnlyOneItemShouldRemain) + .Execute(); } [TestMethod] - public void MoveFullSlot() + public void MovingFullSlotShouldMoveAll() { - var item = Inventory!.AddItemToPocket(InventoryItemInstance.Create(_itemProvider!.Create(1012, 999), 0))! - .First(); - Inventory.TryMoveItem(item.Type, item.Slot, 999, 1, out var originItem, out var destinationItem); - Assert.IsTrue(originItem == null); - Assert.IsTrue((destinationItem?.ItemInstance?.Amount == 999) && (destinationItem.Slot == 1)); + new Spec("Moving full slot should move all") + .Given(FullStackForMove) + .When(MovingFullStack) + .Then(OriginShouldBeNullDestinationShouldHaveAll) + .Execute(); } [TestMethod] - public void MoveHalfSlot() + public void MovingHalfSlotShouldSplit() { - var item = Inventory!.AddItemToPocket(InventoryItemInstance.Create(_itemProvider!.Create(1012, 999), 0))! - .First(); - Inventory.TryMoveItem(item.Type, item.Slot, 499, 1, out var originItem, out var destinationItem); - Assert.IsTrue((originItem?.ItemInstance?.Amount == 500) && (originItem.Slot == 0)); - Assert.IsTrue((destinationItem?.ItemInstance?.Amount == 499) && (destinationItem.Slot == 1)); + new Spec("Moving half slot should split") + .Given(FullStackForMove) + .When(MovingHalfStack) + .Then(BothShouldHaveItems) + .Execute(); } [TestMethod] - public void MoveHalfSlotAndMergeThem() + public void MovingHalfAndMergingShouldCombine() { - var item = Inventory!.AddItemToPocket(InventoryItemInstance.Create(_itemProvider!.Create(1012, 999), 0))! - .First(); - Inventory.TryMoveItem(item.Type, item.Slot, 499, 1, out _, out _); - Inventory.TryMoveItem(item.Type, 0, 500, 1, out var originItem, out var destinationItem); - Assert.IsTrue(originItem == null); - Assert.IsTrue((destinationItem?.ItemInstance?.Amount == 999) && (destinationItem.Slot == 1)); + new Spec("Moving half and merging should combine") + .Given(FullStackForMove) + .When(MovingHalfThenRemaining) + .Then(AllShouldBeInDestination) + .Execute(); } [TestMethod] - public void MoveHalfSlotAndMergeThemWithOverflow() + public void MovingWithOverflowShouldCapAtMax() { - var item = Inventory!.AddItemToPocket(InventoryItemInstance.Create(_itemProvider!.Create(1012, 999), 0))! - .First(); - Inventory.AddItemToPocket(InventoryItemInstance.Create(_itemProvider.Create(1012, 500), 0)); - Inventory.TryMoveItem(item.Type, item.Slot, 600, 1, out var originItem, out var destinationItem); - Assert.IsTrue((originItem?.ItemInstance?.Amount == 500) && (originItem.Slot == 0)); - Assert.IsTrue((destinationItem?.ItemInstance?.Amount == 999) && (destinationItem.Slot == 1)); + new Spec("Moving with overflow should cap at max") + .Given(TwoStacksForOverflowTest) + .When(MovingWithOverflow) + .Then(OriginShouldHaveOverflow) + .Execute(); } - //TODO RemoveItemAmountFromInventory - - //TODO EnoughPlace + [TestMethod] + public void MovingFashionToFashionPocketShouldSucceed() + { + new Spec("Moving fashion to fashion pocket should succeed") + .Given(FashionItemInEquipment) + .When(MovingToCostumePocket) + .Then(ItemShouldBeInCostume) + .Execute(); + } [TestMethod] - public void MoveFashionToFashionPocket() + public void MovingFashionToSpecialistPocketShouldFail() { - var fashion = Inventory!.AddItemToPocket(InventoryItemInstance.Create(_itemProvider!.Create(924), 0))!.First(); - var item = Inventory.MoveInPocket(fashion.Slot, fashion.Type, NoscorePocketType.Costume); - Assert.IsTrue(item?.Type == NoscorePocketType.Costume); + new Spec("Moving fashion to specialist pocket should fail") + .Given(FashionItemInEquipment) + .When(MovingFashionToSpecialist) + .Then(MoveShouldReturnNull) + .Execute(); } [TestMethod] - public void MoveFashionToSpecialistPocket() + public void MovingSpecialistToFashionPocketShouldFail() { - var fashion = Inventory!.AddItemToPocket(InventoryItemInstance.Create(_itemProvider!.Create(924), 0))!.First(); - var item = Inventory.MoveInPocket(fashion.Slot, fashion.Type, NoscorePocketType.Specialist); - Assert.IsNull(item); + new Spec("Moving specialist to fashion pocket should fail") + .Given(SpecialistItemInEquipment) + .When(MovingSpecialistToCostume) + .Then(MoveShouldReturnNull) + .Execute(); } [TestMethod] - public void MoveSpecialistToFashionPocket() + public void MovingSpecialistToSpecialistPocketShouldSucceed() { - var specialist = Inventory!.AddItemToPocket(InventoryItemInstance.Create(_itemProvider!.Create(912), 0))! - .First(); - var item = Inventory.MoveInPocket(specialist.Slot, specialist.Type, NoscorePocketType.Costume); - Assert.IsNull(item); + new Spec("Moving specialist to specialist pocket should succeed") + .Given(SpecialistItemInEquipment) + .When(MovingToSpecialistPocket) + .Then(ItemShouldBeInSpecialist) + .Execute(); } [TestMethod] - public void MoveSpecialistToSpecialistPocket() + public void MovingWeaponToWearPocketShouldSucceed() { - var specialist = Inventory!.AddItemToPocket(InventoryItemInstance.Create(_itemProvider!.Create(912), 0))! - .First(); - var item = Inventory.MoveInPocket(specialist.Slot, specialist.Type, NoscorePocketType.Specialist); - Assert.IsTrue(item?.Type == NoscorePocketType.Specialist); + new Spec("Moving weapon to wear pocket should succeed") + .Given(WeaponInEquipment) + .When(MovingToWear) + .Then(ItemShouldBeInWear) + .Execute(); } [TestMethod] - public void MoveWeaponToPocket() + public void SwappingWithEmptyShouldMove() { - var weapon = Inventory!.AddItemToPocket(InventoryItemInstance.Create(_itemProvider!.Create(1), 0))!.First(); - var item = Inventory.MoveInPocket(weapon.Slot, weapon.Type, NoscorePocketType.Wear); - Assert.IsTrue(item?.Type == NoscorePocketType.Wear); + new Spec("Swapping with empty should move") + .Given(WeaponInEquipment) + .When(SwappingToEmptyWearSlot) + .Then(WeaponShouldBeInWearSlotOriginEmpty) + .Execute(); } [TestMethod] - public void SwapWithEmpty() + public void SwappingWithNotEmptyShouldExchange() + { + new Spec("Swapping with not empty should exchange") + .Given(TwoWeaponsInEquipment) + .When(SwappingWeapons) + .Then(WeaponsShouldBeExchanged) + .Execute(); + } + + private InventoryItemInstance? ItemForDelete; + private InventoryItemInstance? ItemToMove; + private InventoryItemInstance? FashionItem; + private InventoryItemInstance? SpecialistItem; + private InventoryItemInstance? WeaponItem; + private InventoryItemInstance? WeaponItem2; + private InventoryItemInstance? OriginItem; + private InventoryItemInstance? DestItem; + private InventoryItemInstance? MovedItem; + + private void AddingItemToPocket() + { + Inventory!.AddItemToPocket(InventoryItemInstance.Create(ItemProvider!.Create(1012), 0)); + } + + private void ItemShouldBeInInventory() + { + var item = Inventory!.Values.First(); + Assert.IsTrue((item.ItemInstance?.Amount == 1) && (item.ItemInstance.ItemVNum == 1012) && + (item.Type == NoscorePocketType.Main)); + } + + private void ItemAlreadyInPocket() + { + Inventory!.AddItemToPocket(InventoryItemInstance.Create(ItemProvider!.Create(1012), 0)); + } + + private void AddingSameItemAgain() + { + Inventory!.AddItemToPocket(InventoryItemInstance.Create(ItemProvider!.Create(1012), 0)); + } + + private void AmountShouldBeTwo() + { + var item = Inventory!.Values.First(); + Assert.IsTrue((item.ItemInstance?.Amount == 2) && (item.ItemInstance.ItemVNum == 1012)); + } + + private void FullStackInPocket() + { + Inventory!.AddItemToPocket(InventoryItemInstance.Create(ItemProvider!.Create(1012, 999), 0)); + } + + private void AddingOneMoreItem() + { + AddedItems = Inventory!.AddItemToPocket(InventoryItemInstance.Create(ItemProvider!.Create(1012), 0)); + } + + private void NewStackShouldHaveOneItem() + { + Assert.IsTrue(AddedItems![0].ItemInstance?.Amount == 1); + } + + private void AlmostFullStackInPocket() + { + Inventory!.AddItemToPocket(InventoryItemInstance.Create(ItemProvider!.Create(1012, 990), 0)); + } + + private IList? AddedItems; + + private void AddingItemsThatOverflow() + { + AddedItems = Inventory!.AddItemToPocket(InventoryItemInstance.Create(ItemProvider!.Create(1012, 29), 0)); + } + + private void ShouldSplitIntoTwoStacks() + { + Assert.IsTrue((AddedItems![0].ItemInstance?.Amount == 999) && (AddedItems.Last().ItemInstance?.Amount == 20)); + } + + private void ThreeAlmostFullStacks() + { + Inventory!.AddItemToPocket(InventoryItemInstance.Create(ItemProvider!.Create(1012, 990), 0), NoscorePocketType.Main, 0); + Inventory.AddItemToPocket(InventoryItemInstance.Create(ItemProvider.Create(1012, 990), 0), NoscorePocketType.Main, 1); + Inventory.AddItemToPocket(InventoryItemInstance.Create(ItemProvider.Create(1012, 990), 0), NoscorePocketType.Main, 2); + } + + private void AddingItemsToFillAll() + { + Inventory!.AddItemToPocket(InventoryItemInstance.Create(ItemProvider!.Create(1012, 27), 0)); + } + + private void AllStacksShouldBeFull() + { + var items = Inventory!.Values.ToList(); + Assert.IsTrue(items.All(item => item.ItemInstance.Amount == 999) && (items.Count == 3)); + } + + private void AddingTooManyItems() + { + Inventory!.AddItemToPocket(InventoryItemInstance.Create(ItemProvider!.Create(1012, 99), 0)); + } + + private void StacksShouldRemainUnchanged() + { + Assert.IsTrue(Inventory!.Values.All(item => item.ItemInstance?.Amount == 990)); + } + + private void MixedItemsInInventory() + { + Inventory!.AddItemToPocket(InventoryItemInstance.Create(ItemProvider!.Create(1012, 990), 0)); + Inventory.AddItemToPocket(InventoryItemInstance.Create(ItemProvider.Create(1013, 990), 0)); + } + + private void AddingItemThatStacksOnSecond() + { + Inventory!.AddItemToPocket(InventoryItemInstance.Create(ItemProvider!.Create(1013), 0)); + } + + private void SecondStackShouldIncrease() + { + Assert.IsTrue(Inventory!.Values.First(item => item.Slot == 1).ItemInstance.Amount == 991); + } + + private void AddingDifferentItem() + { + Inventory!.AddItemToPocket(InventoryItemInstance.Create(ItemProvider!.Create(1013, 19), 0)); + } + + private void FirstStackShouldRemainUnchanged() + { + Assert.IsTrue(Inventory!.Values.First(item => item.Slot == 0).ItemInstance?.Amount == 990); + } + + private void ItemInSlotZero() + { + Inventory!.AddItemToPocket(InventoryItemInstance.Create(ItemProvider!.Create(1012, 990), 0)); + } + + private void LoadShouldReturnItem() + { + var item = Inventory!.LoadBySlotAndType(0, NoscorePocketType.Main); + Assert.IsTrue((item!.ItemInstance?.ItemVNum == 1012) && (item.ItemInstance?.Amount == 990)); + } + + private void LoadSlotOneShouldReturnNull() + { + var item = Inventory!.LoadBySlotAndType(1, NoscorePocketType.Main); + Assert.IsNull(item); + } + + private void TwoStacksInInventory() + { + Inventory!.AddItemToPocket(InventoryItemInstance.Create(ItemProvider!.Create(1012, 990), 0)); + Inventory.AddItemToPocket(InventoryItemInstance.Create(ItemProvider.Create(1012, 990), 0)); + } + + private void DeletingFromSlotZero() + { + Inventory!.DeleteFromTypeAndSlot(NoscorePocketType.Main, 0); + } + + private void OnlyOneItemShouldRemain() + { + Assert.IsTrue(Inventory!.Count == 1); + } + + private void TwoStacksInInventoryForDelete() + { + Inventory!.AddItemToPocket(InventoryItemInstance.Create(ItemProvider!.Create(1012, 990), 0)); + var items = Inventory.AddItemToPocket(InventoryItemInstance.Create(ItemProvider.Create(1012, 990), 0)); + ItemForDelete = items![0]; + } + + private void DeletingByInstanceId() + { + Inventory!.DeleteById(ItemForDelete!.ItemInstanceId); + } + + private void FullStackForMove() + { + var items = Inventory!.AddItemToPocket(InventoryItemInstance.Create(ItemProvider!.Create(1012, 999), 0)); + ItemToMove = items![0]; + } + + private void MovingFullStack() + { + Inventory!.TryMoveItem(ItemToMove!.Type, ItemToMove.Slot, 999, 1, out OriginItem, out DestItem); + } + + private void OriginShouldBeNullDestinationShouldHaveAll() { - var weapon = Inventory!.AddItemToPocket(InventoryItemInstance.Create(_itemProvider!.Create(1), 0))!.First(); - var item = Inventory.MoveInPocket(weapon.Slot, weapon.Type, NoscorePocketType.Wear, + Assert.IsTrue(OriginItem == null); + Assert.IsTrue((DestItem?.ItemInstance?.Amount == 999) && (DestItem.Slot == 1)); + } + + private void MovingHalfStack() + { + Inventory!.TryMoveItem(ItemToMove!.Type, ItemToMove.Slot, 499, 1, out OriginItem, out DestItem); + } + + private void BothShouldHaveItems() + { + Assert.IsTrue((OriginItem?.ItemInstance?.Amount == 500) && (OriginItem.Slot == 0)); + Assert.IsTrue((DestItem?.ItemInstance?.Amount == 499) && (DestItem.Slot == 1)); + } + + private void MovingHalfThenRemaining() + { + Inventory!.TryMoveItem(ItemToMove!.Type, ItemToMove.Slot, 499, 1, out _, out _); + Inventory.TryMoveItem(ItemToMove.Type, 0, 500, 1, out OriginItem, out DestItem); + } + + private void AllShouldBeInDestination() + { + Assert.IsTrue(OriginItem == null); + Assert.IsTrue((DestItem?.ItemInstance?.Amount == 999) && (DestItem.Slot == 1)); + } + + private void TwoStacksForOverflowTest() + { + var items = Inventory!.AddItemToPocket(InventoryItemInstance.Create(ItemProvider!.Create(1012, 999), 0)); + ItemToMove = items![0]; + Inventory.AddItemToPocket(InventoryItemInstance.Create(ItemProvider.Create(1012, 500), 0)); + } + + private void MovingWithOverflow() + { + Inventory!.TryMoveItem(ItemToMove!.Type, ItemToMove.Slot, 600, 1, out OriginItem, out DestItem); + } + + private void OriginShouldHaveOverflow() + { + Assert.IsTrue((OriginItem?.ItemInstance?.Amount == 500) && (OriginItem.Slot == 0)); + Assert.IsTrue((DestItem?.ItemInstance?.Amount == 999) && (DestItem.Slot == 1)); + } + + private void FashionItemInEquipment() + { + var items = Inventory!.AddItemToPocket(InventoryItemInstance.Create(ItemProvider!.Create(924), 0)); + FashionItem = items![0]; + } + + private void MovingToCostumePocket() + { + MovedItem = Inventory!.MoveInPocket(FashionItem!.Slot, FashionItem.Type, NoscorePocketType.Costume); + } + + private void ItemShouldBeInCostume() + { + Assert.IsTrue(MovedItem?.Type == NoscorePocketType.Costume); + } + + private void MovingFashionToSpecialist() + { + MovedItem = Inventory!.MoveInPocket(FashionItem!.Slot, FashionItem.Type, NoscorePocketType.Specialist); + } + + private void MoveShouldReturnNull() + { + Assert.IsNull(MovedItem); + } + + private void SpecialistItemInEquipment() + { + var items = Inventory!.AddItemToPocket(InventoryItemInstance.Create(ItemProvider!.Create(912), 0)); + SpecialistItem = items![0]; + } + + private void MovingSpecialistToCostume() + { + MovedItem = Inventory!.MoveInPocket(SpecialistItem!.Slot, SpecialistItem.Type, NoscorePocketType.Costume); + } + + private void MovingToSpecialistPocket() + { + MovedItem = Inventory!.MoveInPocket(SpecialistItem!.Slot, SpecialistItem.Type, NoscorePocketType.Specialist); + } + + private void ItemShouldBeInSpecialist() + { + Assert.IsTrue(MovedItem?.Type == NoscorePocketType.Specialist); + } + + private void WeaponInEquipment() + { + var items = Inventory!.AddItemToPocket(InventoryItemInstance.Create(ItemProvider!.Create(1), 0)); + WeaponItem = items![0]; + } + + private void MovingToWear() + { + MovedItem = Inventory!.MoveInPocket(WeaponItem!.Slot, WeaponItem.Type, NoscorePocketType.Wear); + } + + private void ItemShouldBeInWear() + { + Assert.IsTrue(MovedItem?.Type == NoscorePocketType.Wear); + } + + private void SwappingToEmptyWearSlot() + { + MovedItem = Inventory!.MoveInPocket(WeaponItem!.Slot, WeaponItem.Type, NoscorePocketType.Wear, (short)EquipmentType.MainWeapon, true); - Assert.IsTrue((item?.Type == NoscorePocketType.Wear) && - (Inventory.LoadBySlotAndType(0, NoscorePocketType.Equipment) == null)); } - [TestMethod] - public void SwapWithNotEmpty() + private void WeaponShouldBeInWearSlotOriginEmpty() + { + Assert.IsTrue((MovedItem?.Type == NoscorePocketType.Wear) && + (Inventory!.LoadBySlotAndType(0, NoscorePocketType.Equipment) == null)); + } + + private void TwoWeaponsInEquipment() { - var weapon = Inventory!.AddItemToPocket(InventoryItemInstance.Create(_itemProvider!.Create(2), 0))!.First(); - var weapon2 = Inventory.AddItemToPocket(InventoryItemInstance.Create(_itemProvider.Create(1), 0))!.First(); - var item = Inventory.MoveInPocket(weapon.Slot, weapon.Type, NoscorePocketType.Wear, + var items = Inventory!.AddItemToPocket(InventoryItemInstance.Create(ItemProvider!.Create(2), 0)); + WeaponItem = items![0]; + var items2 = Inventory.AddItemToPocket(InventoryItemInstance.Create(ItemProvider.Create(1), 0)); + WeaponItem2 = items2![0]; + } + + private void SwappingWeapons() + { + MovedItem = Inventory!.MoveInPocket(WeaponItem!.Slot, WeaponItem.Type, NoscorePocketType.Wear, (short)EquipmentType.MainWeapon, true); - var item2 = Inventory.MoveInPocket(weapon2.Slot, weapon2.Type, NoscorePocketType.Wear, + MovedItem = Inventory.MoveInPocket(WeaponItem2!.Slot, WeaponItem2.Type, NoscorePocketType.Wear, (short)EquipmentType.MainWeapon, true); + } - Assert.IsTrue((item?.Type == NoscorePocketType.Equipment) && (item.Slot == 1) && - (item2?.Type == NoscorePocketType.Wear) && - (item2.Slot == (short)EquipmentType.MainWeapon)); + private void WeaponsShouldBeExchanged() + { + Assert.IsTrue((WeaponItem?.Type == NoscorePocketType.Equipment) && (WeaponItem.Slot == 1) && + (MovedItem?.Type == NoscorePocketType.Wear) && + (MovedItem.Slot == (short)EquipmentType.MainWeapon)); } } -} \ No newline at end of file +} diff --git a/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/BackPackHandlerTests.cs b/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/BackPackHandlerTests.cs index 9480d17be..82ff1b4a2 100644 --- a/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/BackPackHandlerTests.cs +++ b/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/BackPackHandlerTests.cs @@ -46,8 +46,8 @@ namespace NosCore.GameObject.Tests.Services.ItemGenerationService.Handlers [TestClass] public class BackPackHandlerTests : UseItemEventHandlerTestsBase { - private GameObject.Services.ItemGenerationService.ItemGenerationService? _itemProvider; - private readonly ILogger _logger = new Mock().Object; + private GameObject.Services.ItemGenerationService.ItemGenerationService? ItemProvider; + private readonly ILogger Logger = new Mock().Object; [TestInitialize] public async Task SetupAsync() @@ -60,11 +60,11 @@ public async Task SetupAsync() new Item {VNum = 1, ItemType = ItemType.Special, Effect = ItemEffectType.InventoryTicketUpgrade, EffectValue = 0}, new Item {VNum = 2, ItemType = ItemType.Special, Effect = ItemEffectType.InventoryUpgrade, EffectValue = 0}, }; - _itemProvider = new GameObject.Services.ItemGenerationService.ItemGenerationService(items, - new EventLoaderService, IUseItemEventHandler>(new List>>()), _logger, TestHelpers.Instance.LogLanguageLocalizer); + ItemProvider = new GameObject.Services.ItemGenerationService.ItemGenerationService(items, + new EventLoaderService, IUseItemEventHandler>(new List>>()), Logger, TestHelpers.Instance.LogLanguageLocalizer); } [TestMethod] - public async Task Test_Can_Not_StackAsync() + public async Task TestCanNotStackAsync() { Session!.Character.StaticBonusList.Add(new StaticBonusDto { @@ -72,7 +72,7 @@ public async Task Test_Can_Not_StackAsync() DateEnd = null, StaticBonusType = StaticBonusType.BackPack }); - var itemInstance = InventoryItemInstance.Create(_itemProvider!.Create(2), Session.Character.CharacterId); + var itemInstance = InventoryItemInstance.Create(ItemProvider!.Create(2), Session.Character.CharacterId); Session.Character.InventoryService.AddItemToPocket(itemInstance); await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance); @@ -81,9 +81,9 @@ public async Task Test_Can_Not_StackAsync() } [TestMethod] - public async Task Test_BackPackAsync() + public async Task TestBackPackAsync() { - var itemInstance = InventoryItemInstance.Create(_itemProvider!.Create(2), Session!.Character.CharacterId); + var itemInstance = InventoryItemInstance.Create(ItemProvider!.Create(2), Session!.Character.CharacterId); Session.Character.InventoryService.AddItemToPocket(itemInstance); await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance); var lastpacket = (ExtsPacket?)Session.LastPackets.FirstOrDefault(s => s is ExtsPacket); @@ -96,7 +96,7 @@ public async Task Test_BackPackAsync() } [TestMethod] - public async Task Test_Can_Not_StackTicketAsync() + public async Task TestCanNotStackTicketAsync() { Session!.Character.StaticBonusList.Add(new StaticBonusDto { @@ -104,7 +104,7 @@ public async Task Test_Can_Not_StackTicketAsync() DateEnd = null, StaticBonusType = StaticBonusType.InventoryTicketUpgrade }); - var itemInstance = InventoryItemInstance.Create(_itemProvider!.Create(1), Session.Character.CharacterId); + var itemInstance = InventoryItemInstance.Create(ItemProvider!.Create(1), Session.Character.CharacterId); Session.Character.InventoryService.AddItemToPocket(itemInstance); await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance); @@ -113,9 +113,9 @@ public async Task Test_Can_Not_StackTicketAsync() } [TestMethod] - public async Task Test_BackPackTicketAsync() + public async Task TestBackPackTicketAsync() { - var itemInstance = InventoryItemInstance.Create(_itemProvider!.Create(1), Session!.Character.CharacterId); + var itemInstance = InventoryItemInstance.Create(ItemProvider!.Create(1), Session!.Character.CharacterId); Session.Character.InventoryService.AddItemToPocket(itemInstance); await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance); var lastpacket = (ExtsPacket?)Session.LastPackets.FirstOrDefault(s => s is ExtsPacket); diff --git a/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/BazaarMedalsHandlerTests.cs b/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/BazaarMedalsHandlerTests.cs index 65323b202..11f8c65f4 100644 --- a/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/BazaarMedalsHandlerTests.cs +++ b/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/BazaarMedalsHandlerTests.cs @@ -42,8 +42,8 @@ namespace NosCore.GameObject.Tests.Services.ItemGenerationService.Handlers [TestClass] public class BazaarMedalsHandlerTests : UseItemEventHandlerTestsBase { - private GameObject.Services.ItemGenerationService.ItemGenerationService? _itemProvider; - private readonly ILogger _logger = new Mock().Object; + private GameObject.Services.ItemGenerationService.ItemGenerationService? ItemProvider; + private readonly ILogger Logger = new Mock().Object; [TestInitialize] public async Task SetupAsync() @@ -56,13 +56,13 @@ public async Task SetupAsync() new Item {VNum = 1, Effect = ItemEffectType.GoldNosMerchantUpgrade, EffectValue = 1}, new Item {VNum = 2, Effect = ItemEffectType.SilverNosMerchantUpgrade, EffectValue = 1}, }; - _itemProvider = new GameObject.Services.ItemGenerationService.ItemGenerationService(items, - new EventLoaderService, IUseItemEventHandler>(new List>>()), _logger, TestHelpers.Instance.LogLanguageLocalizer); + ItemProvider = new GameObject.Services.ItemGenerationService.ItemGenerationService(items, + new EventLoaderService, IUseItemEventHandler>(new List>>()), Logger, TestHelpers.Instance.LogLanguageLocalizer); } [TestMethod] - public async Task Test_AddMedal_AlreadyOneDifferentAsync() + public async Task TestAddMedalAlreadyOneDifferentAsync() { - var itemInstance = InventoryItemInstance.Create(_itemProvider!.Create(2), Session!.Character.CharacterId); + var itemInstance = InventoryItemInstance.Create(ItemProvider!.Create(2), Session!.Character.CharacterId); Session.Character.StaticBonusList.Add(new StaticBonusDto { CharacterId = Session.Character.CharacterId, @@ -75,9 +75,9 @@ public async Task Test_AddMedal_AlreadyOneDifferentAsync() } [TestMethod] - public async Task Test_AddMedal_AlreadyOneAsync() + public async Task TestAddMedalAlreadyOneAsync() { - var itemInstance = InventoryItemInstance.Create(_itemProvider!.Create(1), Session!.Character.CharacterId); + var itemInstance = InventoryItemInstance.Create(ItemProvider!.Create(1), Session!.Character.CharacterId); Session.Character.StaticBonusList.Add(new StaticBonusDto { CharacterId = Session.Character.CharacterId, @@ -90,9 +90,9 @@ public async Task Test_AddMedal_AlreadyOneAsync() } [TestMethod] - public async Task Test_AddMedalAsync() + public async Task TestAddMedalAsync() { - var itemInstance = InventoryItemInstance.Create(_itemProvider!.Create(1), Session!.Character.CharacterId); + var itemInstance = InventoryItemInstance.Create(ItemProvider!.Create(1), Session!.Character.CharacterId); Session.Character.InventoryService.AddItemToPocket(itemInstance); await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance); Assert.AreEqual(0, Session.Character.InventoryService.Count); diff --git a/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/MinilandBellHandlerTests.cs b/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/MinilandBellHandlerTests.cs index 06e57e47c..6504479ac 100644 --- a/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/MinilandBellHandlerTests.cs +++ b/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/MinilandBellHandlerTests.cs @@ -46,34 +46,34 @@ namespace NosCore.GameObject.Tests.Services.ItemGenerationService.Handlers [TestClass] public class MinilandBellHandlerTests : UseItemEventHandlerTestsBase { - private GameObject.Services.ItemGenerationService.ItemGenerationService? _itemProvider; - private Mock? _minilandProvider; + private GameObject.Services.ItemGenerationService.ItemGenerationService? ItemProvider; + private Mock? MinilandProvider; private Mock mapChangeService = null!; - private readonly ILogger _logger = new Mock().Object; + private readonly ILogger Logger = new Mock().Object; [TestInitialize] public async Task SetupAsync() { await TestHelpers.ResetAsync(); - _minilandProvider = new Mock(); + MinilandProvider = new Mock(); Session = await TestHelpers.Instance.GenerateSessionAsync(); - _minilandProvider.Setup(s => s.GetMiniland(Session.Character.CharacterId)) + MinilandProvider.Setup(s => s.GetMiniland(Session.Character.CharacterId)) .Returns(new Miniland { MapInstanceId = TestHelpers.Instance.MinilandId }); mapChangeService = new Mock(); - Handler = new MinilandBellHandler(_minilandProvider.Object, mapChangeService.Object); + Handler = new MinilandBellHandler(MinilandProvider.Object, mapChangeService.Object); var items = new List { new Item {VNum = 1, Effect = ItemEffectType.Teleport, EffectValue = 2}, }; - _itemProvider = new GameObject.Services.ItemGenerationService.ItemGenerationService(items, - new EventLoaderService, IUseItemEventHandler>(new List>>()), _logger, TestHelpers.Instance.LogLanguageLocalizer); + ItemProvider = new GameObject.Services.ItemGenerationService.ItemGenerationService(items, + new EventLoaderService, IUseItemEventHandler>(new List>>()), Logger, TestHelpers.Instance.LogLanguageLocalizer); } [TestMethod] - public async Task Test_Miniland_On_InstanceAsync() + public async Task TestMinilandOnInstanceAsync() { Session!.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetMapInstance(TestHelpers.Instance.MinilandId)!; - var itemInstance = InventoryItemInstance.Create(_itemProvider!.Create(1), Session.Character.CharacterId); + var itemInstance = InventoryItemInstance.Create(ItemProvider!.Create(1), Session.Character.CharacterId); Session.Character.InventoryService.AddItemToPocket(itemInstance); await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance); var lastpacket = (SayiPacket?)Session.LastPackets.FirstOrDefault(s => s is SayiPacket); @@ -83,10 +83,10 @@ public async Task Test_Miniland_On_InstanceAsync() } [TestMethod] - public async Task Test_Miniland_On_VehicleAsync() + public async Task TestMinilandOnVehicleAsync() { Session!.Character.IsVehicled = true; - var itemInstance = InventoryItemInstance.Create(_itemProvider!.Create(1), Session.Character.CharacterId); + var itemInstance = InventoryItemInstance.Create(ItemProvider!.Create(1), Session.Character.CharacterId); Session.Character.InventoryService.AddItemToPocket(itemInstance); await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance); var lastpacket = (SayiPacket?)Session.LastPackets.FirstOrDefault(s => s is SayiPacket); @@ -96,9 +96,9 @@ public async Task Test_Miniland_On_VehicleAsync() } [TestMethod] - public async Task Test_Miniland_DelayAsync() + public async Task TestMinilandDelayAsync() { - var itemInstance = InventoryItemInstance.Create(_itemProvider!.Create(1), Session!.Character.CharacterId); + var itemInstance = InventoryItemInstance.Create(ItemProvider!.Create(1), Session!.Character.CharacterId); Session.Character.InventoryService.AddItemToPocket(itemInstance); await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance); var lastpacket = (DelayPacket?)Session.LastPackets.FirstOrDefault(s => s is DelayPacket); @@ -107,10 +107,10 @@ public async Task Test_Miniland_DelayAsync() } [TestMethod] - public async Task Test_MinilandAsync() + public async Task TestMinilandAsync() { UseItem.Mode = 2; - var itemInstance = InventoryItemInstance.Create(_itemProvider!.Create(1), Session!.Character.CharacterId); + var itemInstance = InventoryItemInstance.Create(ItemProvider!.Create(1), Session!.Character.CharacterId); Session.Character.InventoryService.AddItemToPocket(itemInstance); await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance); mapChangeService.Verify(x=>x.ChangeMapInstanceAsync(Session, TestHelpers.Instance.MinilandId, 5, 8), Times.Once); diff --git a/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/SpRechargerHandlerTests.cs b/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/SpRechargerHandlerTests.cs index ec0b6e50d..211417bcd 100644 --- a/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/SpRechargerHandlerTests.cs +++ b/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/SpRechargerHandlerTests.cs @@ -44,8 +44,8 @@ namespace NosCore.GameObject.Tests.Services.ItemGenerationService.Handlers [TestClass] public class SpRechargerEventHandlerTests : UseItemEventHandlerTestsBase { - private GameObject.Services.ItemGenerationService.ItemGenerationService? _itemProvider; - private readonly ILogger _logger = new Mock().Object; + private GameObject.Services.ItemGenerationService.ItemGenerationService? ItemProvider; + private readonly ILogger Logger = new Mock().Object; [TestInitialize] public async Task SetupAsync() @@ -57,14 +57,14 @@ public async Task SetupAsync() { new Item {VNum = 1, ItemType = ItemType.Special, EffectValue = 1}, }; - _itemProvider = new GameObject.Services.ItemGenerationService.ItemGenerationService(items, new EventLoaderService, IUseItemEventHandler>( - new List>>()), _logger, TestHelpers.Instance.LogLanguageLocalizer); + ItemProvider = new GameObject.Services.ItemGenerationService.ItemGenerationService(items, new EventLoaderService, IUseItemEventHandler>( + new List>>()), Logger, TestHelpers.Instance.LogLanguageLocalizer); } [TestMethod] - public async Task Test_SpRecharger_When_MaxAsync() + public async Task TestSpRechargerWhenMaxAsync() { Session!.Character.SpAdditionPoint = 1; - var itemInstance = InventoryItemInstance.Create(_itemProvider!.Create(1), Session.Character.CharacterId); + var itemInstance = InventoryItemInstance.Create(ItemProvider!.Create(1), Session.Character.CharacterId); Session.Character.InventoryService.AddItemToPocket(itemInstance); await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance); var lastpacket = (MsgiPacket?)Session.LastPackets.FirstOrDefault(s => s is MsgiPacket); @@ -74,10 +74,10 @@ public async Task Test_SpRecharger_When_MaxAsync() } [TestMethod] - public async Task Test_SpRechargerAsync() + public async Task TestSpRechargerAsync() { Session!.Character.SpAdditionPoint = 0; - var itemInstance = InventoryItemInstance.Create(_itemProvider!.Create(1), Session.Character.CharacterId); + var itemInstance = InventoryItemInstance.Create(ItemProvider!.Create(1), Session.Character.CharacterId); Session.Character.InventoryService.AddItemToPocket(itemInstance); await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance); Assert.AreEqual(1, Session.Character.SpAdditionPoint); diff --git a/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/SpeakerHandlerTests.cs b/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/SpeakerHandlerTests.cs index a679888f6..db80613a0 100644 --- a/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/SpeakerHandlerTests.cs +++ b/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/SpeakerHandlerTests.cs @@ -41,8 +41,8 @@ namespace NosCore.GameObject.Tests.Services.ItemGenerationService.Handlers [TestClass] public class SpeakerHandlerTests : UseItemEventHandlerTestsBase { - private GameObject.Services.ItemGenerationService.ItemGenerationService? _itemProvider; - private readonly ILogger _logger = new Mock().Object; + private GameObject.Services.ItemGenerationService.ItemGenerationService? ItemProvider; + private readonly ILogger Logger = new Mock().Object; [TestInitialize] public async Task SetupAsync() @@ -54,14 +54,14 @@ public async Task SetupAsync() { new Item {VNum = 1, ItemType = ItemType.Magical, Effect = ItemEffectType.Speaker, EffectValue = 0}, }; - _itemProvider = new GameObject.Services.ItemGenerationService.ItemGenerationService(items, - new EventLoaderService, IUseItemEventHandler>(new List>>()), _logger, TestHelpers.Instance.LogLanguageLocalizer); + ItemProvider = new GameObject.Services.ItemGenerationService.ItemGenerationService(items, + new EventLoaderService, IUseItemEventHandler>(new List>>()), Logger, TestHelpers.Instance.LogLanguageLocalizer); } [TestMethod] - public async Task Test_SpeakerItemHandlerAsync() + public async Task TestSpeakerItemHandlerAsync() { - var itemInstance = InventoryItemInstance.Create(_itemProvider!.Create(1), Session!.Character.CharacterId); + var itemInstance = InventoryItemInstance.Create(ItemProvider!.Create(1), Session!.Character.CharacterId); Session.Character.InventoryService.AddItemToPocket(itemInstance); await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance); var lastpacket = (GuriPacket?)Session.LastPackets.FirstOrDefault(s => s is GuriPacket); diff --git a/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/TitleHandlerTests.cs b/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/TitleHandlerTests.cs index 69a307c67..35a2ccba7 100644 --- a/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/TitleHandlerTests.cs +++ b/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/TitleHandlerTests.cs @@ -41,8 +41,8 @@ namespace NosCore.GameObject.Tests.Services.ItemGenerationService.Handlers [TestClass] public class TitleHandlerTests : UseItemEventHandlerTestsBase { - private GameObject.Services.ItemGenerationService.ItemGenerationService? _itemProvider; - private readonly ILogger _logger = new Mock().Object; + private GameObject.Services.ItemGenerationService.ItemGenerationService? ItemProvider; + private readonly ILogger Logger = new Mock().Object; [TestInitialize] public async Task SetupAsync() @@ -54,14 +54,14 @@ public async Task SetupAsync() { new Item {VNum = 1, ItemType = ItemType.Title, EffectValue = 0}, }; - _itemProvider = new GameObject.Services.ItemGenerationService.ItemGenerationService(items, - new EventLoaderService, IUseItemEventHandler>(new List>>()), _logger, TestHelpers.Instance.LogLanguageLocalizer); + ItemProvider = new GameObject.Services.ItemGenerationService.ItemGenerationService(items, + new EventLoaderService, IUseItemEventHandler>(new List>>()), Logger, TestHelpers.Instance.LogLanguageLocalizer); } [TestMethod] - public async Task Test_TitleItemHandlerAsync() + public async Task TestTitleItemHandlerAsync() { - var itemInstance = InventoryItemInstance.Create(_itemProvider!.Create(1), Session!.Character.CharacterId); + var itemInstance = InventoryItemInstance.Create(ItemProvider!.Create(1), Session!.Character.CharacterId); Session.Character.InventoryService.AddItemToPocket(itemInstance); await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance); var lastpacket = (QnaiPacket?)Session.LastPackets.FirstOrDefault(s => s is QnaiPacket); diff --git a/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/VehicleHandlerTests.cs b/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/VehicleHandlerTests.cs index c75f9aeb9..8f91a9901 100644 --- a/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/VehicleHandlerTests.cs +++ b/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/VehicleHandlerTests.cs @@ -47,58 +47,58 @@ namespace NosCore.GameObject.Tests.Services.ItemGenerationService.Handlers [TestClass] public class VehicleEventHandlerTests : UseItemEventHandlerTestsBase { - private Mock? _logger; - private GameObject.Services.ItemGenerationService.ItemGenerationService? _itemProvider; + private Mock? Logger; + private GameObject.Services.ItemGenerationService.ItemGenerationService? ItemProvider; [TestInitialize] public async Task SetupAsync() { await TestHelpers.ResetAsync(); Session = await TestHelpers.Instance.GenerateSessionAsync(); - _logger = new Mock(); - Handler = new VehicleEventHandler(_logger.Object, TestHelpers.Instance.LogLanguageLocalizer, new TransformationService(TestHelpers.Instance.Clock, new Mock().Object, new Mock().Object, new Mock().Object, _logger.Object, TestHelpers.Instance.LogLanguageLocalizer)); + Logger = new Mock(); + Handler = new VehicleEventHandler(Logger.Object, TestHelpers.Instance.LogLanguageLocalizer, new GameObject.Services.TransformationService.TransformationService(TestHelpers.Instance.Clock, new Mock().Object, new Mock().Object, new Mock().Object, Logger.Object, TestHelpers.Instance.LogLanguageLocalizer)); var items = new List { new Item {Type = NoscorePocketType.Equipment, VNum = 1, ItemType = ItemType.Weapon} }; - _itemProvider = new GameObject.Services.ItemGenerationService.ItemGenerationService(items, - new EventLoaderService, IUseItemEventHandler>(new List>>()), _logger.Object, TestHelpers.Instance.LogLanguageLocalizer); + ItemProvider = new GameObject.Services.ItemGenerationService.ItemGenerationService(items, + new EventLoaderService, IUseItemEventHandler>(new List>>()), Logger.Object, TestHelpers.Instance.LogLanguageLocalizer); } [TestMethod] - public async Task Test_Can_Not_Vehicle_In_ShopAsync() + public async Task TestCanNotVehicleInShopAsync() { Session!.Character.InShop = true; - var itemInstance = InventoryItemInstance.Create(_itemProvider!.Create(1), Session.Character.CharacterId); + var itemInstance = InventoryItemInstance.Create(ItemProvider!.Create(1), Session.Character.CharacterId); await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance); - _logger!.Verify(s => s.Error(TestHelpers.Instance.LogLanguageLocalizer[LogLanguageKey.CANT_USE_ITEM_IN_SHOP]), Times.Exactly(1)); + Logger!.Verify(s => s.Error(TestHelpers.Instance.LogLanguageLocalizer[LogLanguageKey.CANT_USE_ITEM_IN_SHOP]), Times.Exactly(1)); } [TestMethod] - public async Task Test_Vehicle_GetDelayedAsync() + public async Task TestVehicleGetDelayedAsync() { UseItem.Mode = 1; - var itemInstance = InventoryItemInstance.Create(_itemProvider!.Create(1), Session!.Character.CharacterId); + var itemInstance = InventoryItemInstance.Create(ItemProvider!.Create(1), Session!.Character.CharacterId); await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance); var lastpacket = (DelayPacket?)Session.LastPackets.FirstOrDefault(s => s is DelayPacket); Assert.IsNotNull(lastpacket); } [TestMethod] - public async Task Test_VehicleAsync() + public async Task TestVehicleAsync() { UseItem.Mode = 2; - var itemInstance = InventoryItemInstance.Create(_itemProvider!.Create(1), Session!.Character.CharacterId); + var itemInstance = InventoryItemInstance.Create(ItemProvider!.Create(1), Session!.Character.CharacterId); await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance); Assert.IsTrue(Session.Character.IsVehicled); } [TestMethod] - public async Task Test_Vehicle_RemoveAsync() + public async Task TestVehicleRemoveAsync() { Session!.Character.IsVehicled = true; - var itemInstance = InventoryItemInstance.Create(_itemProvider!.Create(1), Session.Character.CharacterId); + var itemInstance = InventoryItemInstance.Create(ItemProvider!.Create(1), Session.Character.CharacterId); await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance); Assert.IsFalse(Session.Character.IsVehicled); } diff --git a/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/WearHandlerTests.cs b/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/WearHandlerTests.cs index 540c224fe..14b4beeff 100644 --- a/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/WearHandlerTests.cs +++ b/test/NosCore.GameObject.Tests/Services/ItemGenerationService/Handlers/WearHandlerTests.cs @@ -50,17 +50,17 @@ namespace NosCore.GameObject.Tests.Services.ItemGenerationService.Handlers [TestClass] public class WearEventHandlerTests : UseItemEventHandlerTestsBase { - private GameObject.Services.ItemGenerationService.ItemGenerationService? _itemProvider; - private Mock? _logger; + private GameObject.Services.ItemGenerationService.ItemGenerationService? ItemProvider; + private Mock? Logger; [TestInitialize] public async Task SetupAsync() { await TestHelpers.ResetAsync(); - _logger = new Mock(); + Logger = new Mock(); TestHelpers.Instance.WorldConfiguration.Value.BackpackSize = 40; Session = await TestHelpers.Instance.GenerateSessionAsync(); - Handler = new WearEventHandler(_logger.Object, TestHelpers.Instance.Clock, TestHelpers.Instance.LogLanguageLocalizer); + Handler = new WearEventHandler(Logger.Object, TestHelpers.Instance.Clock, TestHelpers.Instance.LogLanguageLocalizer); var items = new List { new Item @@ -118,23 +118,23 @@ public async Task SetupAsync() EquipmentSlot = EquipmentType.Amulet } }; - _itemProvider = new GameObject.Services.ItemGenerationService.ItemGenerationService(items, new EventLoaderService, IUseItemEventHandler>( - new List>>()), _logger.Object, TestHelpers.Instance.LogLanguageLocalizer); + ItemProvider = new GameObject.Services.ItemGenerationService.ItemGenerationService(items, new EventLoaderService, IUseItemEventHandler>( + new List>>()), Logger.Object, TestHelpers.Instance.LogLanguageLocalizer); } [TestMethod] - public async Task Test_Can_Not_Use_WearEvent_In_ShopAsync() + public async Task TestCanNotUseWearEventInShopAsync() { Session!.Character.InShop = true; - var itemInstance = InventoryItemInstance.Create(_itemProvider!.Create(1), Session.Character.CharacterId); + var itemInstance = InventoryItemInstance.Create(ItemProvider!.Create(1), Session.Character.CharacterId); await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance); - _logger!.Verify(s => s.Error(TestHelpers.Instance.LogLanguageLocalizer[LogLanguageKey.CANT_USE_ITEM_IN_SHOP]), Times.Exactly(1)); + Logger!.Verify(s => s.Error(TestHelpers.Instance.LogLanguageLocalizer[LogLanguageKey.CANT_USE_ITEM_IN_SHOP]), Times.Exactly(1)); } [TestMethod] - public async Task Test_BoundCharacter_QuestionAsync() + public async Task TestBoundCharacterQuestionAsync() { - var itemInstance = InventoryItemInstance.Create(_itemProvider!.Create(1), Session!.Character.CharacterId); + var itemInstance = InventoryItemInstance.Create(ItemProvider!.Create(1), Session!.Character.CharacterId); Session.Character.InventoryService.AddItemToPocket(itemInstance); await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance); var lastpacket = (QnaPacket?)Session.LastPackets.FirstOrDefault(s => s is QnaPacket); @@ -142,20 +142,20 @@ public async Task Test_BoundCharacter_QuestionAsync() } [TestMethod] - public async Task Test_BoundCharacterAsync() + public async Task TestBoundCharacterAsync() { UseItem.Mode = 1; - var itemInstance = InventoryItemInstance.Create(_itemProvider!.Create(1), Session!.Character.CharacterId); + var itemInstance = InventoryItemInstance.Create(ItemProvider!.Create(1), Session!.Character.CharacterId); Session.Character.InventoryService.AddItemToPocket(itemInstance); await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance); Assert.AreEqual(Session.Character.CharacterId, itemInstance.ItemInstance?.BoundCharacterId); } [TestMethod] - public async Task Test_BadEquipmentAsync() + public async Task TestBadEquipmentAsync() { UseItem.Mode = 1; - var itemInstance = InventoryItemInstance.Create(_itemProvider!.Create(5), Session!.Character.CharacterId); + var itemInstance = InventoryItemInstance.Create(ItemProvider!.Create(5), Session!.Character.CharacterId); Session.Character.InventoryService.AddItemToPocket(itemInstance); await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance); var lastpacket = (SayiPacket?)Session.LastPackets.FirstOrDefault(s => s is SayiPacket); @@ -164,13 +164,13 @@ public async Task Test_BadEquipmentAsync() } [TestMethod] - public async Task Test_BadFairyAsync() + public async Task TestBadFairyAsync() { UseItem.Mode = 1; Session!.Character.UseSp = true; - var itemInstance = InventoryItemInstance.Create(_itemProvider!.Create(2), Session.Character.CharacterId); + var itemInstance = InventoryItemInstance.Create(ItemProvider!.Create(2), Session.Character.CharacterId); Session.Character.InventoryService.AddItemToPocket(itemInstance); - var sp = InventoryItemInstance.Create(_itemProvider.Create(4), Session.Character.CharacterId); + var sp = InventoryItemInstance.Create(ItemProvider.Create(4), Session.Character.CharacterId); Session.Character.InventoryService.AddItemToPocket(sp, NoscorePocketType.Wear); await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance); var lastpacket = (MsgiPacket?)Session.LastPackets.FirstOrDefault(s => s is MsgiPacket); @@ -178,14 +178,14 @@ public async Task Test_BadFairyAsync() } [TestMethod] - public async Task Test_SpLoadingAsync() + public async Task TestSpLoadingAsync() { UseItem.Mode = 1; Session!.Character.LastSp = TestHelpers.Instance.Clock.GetCurrentInstant(); Session.Character.SpCooldown = 300; - var itemInstance = InventoryItemInstance.Create(_itemProvider!.Create(4), Session.Character.CharacterId); + var itemInstance = InventoryItemInstance.Create(ItemProvider!.Create(4), Session.Character.CharacterId); Session.Character.InventoryService.AddItemToPocket(itemInstance); - var sp = InventoryItemInstance.Create(_itemProvider.Create(4), Session.Character.CharacterId); + var sp = InventoryItemInstance.Create(ItemProvider.Create(4), Session.Character.CharacterId); Session.Character.InventoryService.AddItemToPocket(sp, NoscorePocketType.Wear); await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance); var lastpacket = (MsgiPacket?)Session.LastPackets.FirstOrDefault(s => s is MsgiPacket); @@ -194,13 +194,13 @@ public async Task Test_SpLoadingAsync() } [TestMethod] - public async Task Test_UseSpAsync() + public async Task TestUseSpAsync() { UseItem.Mode = 1; Session!.Character.UseSp = true; - var itemInstance = InventoryItemInstance.Create(_itemProvider!.Create(4), Session.Character.CharacterId); + var itemInstance = InventoryItemInstance.Create(ItemProvider!.Create(4), Session.Character.CharacterId); Session.Character.InventoryService.AddItemToPocket(itemInstance); - var sp = InventoryItemInstance.Create(_itemProvider.Create(4), Session.Character.CharacterId); + var sp = InventoryItemInstance.Create(ItemProvider.Create(4), Session.Character.CharacterId); Session.Character.InventoryService.AddItemToPocket(sp, NoscorePocketType.Wear); await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance); var lastpacket = (SayiPacket?)Session.LastPackets.FirstOrDefault(s => s is SayiPacket); @@ -209,10 +209,10 @@ public async Task Test_UseSpAsync() } [TestMethod] - public async Task Test_UseDestroyedSpAsync() + public async Task TestUseDestroyedSpAsync() { UseItem.Mode = 1; - var itemInstance = InventoryItemInstance.Create(_itemProvider!.Create(4), Session!.Character.CharacterId); + var itemInstance = InventoryItemInstance.Create(ItemProvider!.Create(4), Session!.Character.CharacterId); Session.Character.InventoryService.AddItemToPocket(itemInstance); itemInstance.ItemInstance.Rare = -2; await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance); @@ -221,10 +221,10 @@ public async Task Test_UseDestroyedSpAsync() } [TestMethod] - public async Task Test_Use_BadJobLevelAsync() + public async Task TestUseBadJobLevelAsync() { UseItem.Mode = 1; - var itemInstance = InventoryItemInstance.Create(_itemProvider!.Create(6), Session!.Character.CharacterId); + var itemInstance = InventoryItemInstance.Create(ItemProvider!.Create(6), Session!.Character.CharacterId); Session.Character.InventoryService.AddItemToPocket(itemInstance); await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance); var lastpacket = (MsgiPacket?)Session.LastPackets.FirstOrDefault(s => s is MsgiPacket); @@ -232,10 +232,10 @@ public async Task Test_Use_BadJobLevelAsync() } [TestMethod] - public async Task Test_Use_SPAsync() + public async Task TestUseSPAsync() { UseItem.Mode = 1; - var itemInstance = InventoryItemInstance.Create(_itemProvider!.Create(4), Session!.Character.CharacterId); + var itemInstance = InventoryItemInstance.Create(ItemProvider!.Create(4), Session!.Character.CharacterId); Session.Character.InventoryService.AddItemToPocket(itemInstance); await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance); var lastpacket = (SpPacket?)Session.LastPackets.FirstOrDefault(s => s is SpPacket); @@ -243,10 +243,10 @@ public async Task Test_Use_SPAsync() } [TestMethod] - public async Task Test_Use_FairyAsync() + public async Task TestUseFairyAsync() { UseItem.Mode = 1; - var itemInstance = InventoryItemInstance.Create(_itemProvider!.Create(2), Session!.Character.CharacterId); + var itemInstance = InventoryItemInstance.Create(ItemProvider!.Create(2), Session!.Character.CharacterId); Session.Character.InventoryService.AddItemToPocket(itemInstance); await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance); var lastpacket = (PairyPacket?)Session.Character.MapInstance.LastPackets.FirstOrDefault(s => s is PairyPacket); @@ -254,10 +254,10 @@ public async Task Test_Use_FairyAsync() } [TestMethod] - public async Task Test_Use_AmuletAsync() + public async Task TestUseAmuletAsync() { UseItem.Mode = 1; - var itemInstance = InventoryItemInstance.Create(_itemProvider!.Create(7), Session!.Character.CharacterId); + var itemInstance = InventoryItemInstance.Create(ItemProvider!.Create(7), Session!.Character.CharacterId); Session.Character.InventoryService.AddItemToPocket(itemInstance); await ExecuteInventoryItemInstanceEventHandlerAsync(itemInstance); var lastpacket = (EffectPacket?)Session.LastPackets.FirstOrDefault(s => s is EffectPacket); diff --git a/test/NosCore.GameObject.Tests/Services/ItemGenerationService/ItemGenerationServiceTests.cs b/test/NosCore.GameObject.Tests/Services/ItemGenerationService/ItemGenerationServiceTests.cs new file mode 100644 index 000000000..c8fb26b0c --- /dev/null +++ b/test/NosCore.GameObject.Tests/Services/ItemGenerationService/ItemGenerationServiceTests.cs @@ -0,0 +1,155 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System; +using System.Collections.Generic; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.Data.Enumerations; +using NosCore.Data.Enumerations.Items; +using NosCore.Data.StaticEntities; +using NosCore.GameObject.Infastructure; +using NosCore.GameObject.Services.EventLoaderService; +using NosCore.GameObject.Services.InventoryService; +using NosCore.GameObject.Services.ItemGenerationService; +using NosCore.GameObject.Services.ItemGenerationService.Item; +using NosCore.Packets.ClientPackets.Inventory; +using NosCore.Tests.Shared; +using Serilog; +using SpecLight; + +namespace NosCore.GameObject.Tests.Services.ItemGenerationService +{ + [TestClass] + public class ItemGenerationServiceTests + { + private static readonly ILogger Logger = new Mock().Object; + private GameObject.Services.ItemGenerationService.ItemGenerationService? ItemProvider; + private List? Items; + + [TestInitialize] + public void Setup() + { + Items = new List + { + new Item { Type = NoscorePocketType.Main, VNum = 1012 }, + new Item { Type = NoscorePocketType.Main, VNum = 1013 }, + new Item { Type = NoscorePocketType.Equipment, VNum = 1, ItemType = ItemType.Weapon }, + new Item { Type = NoscorePocketType.Equipment, VNum = 2, ItemType = ItemType.Armor }, + new Item { Type = NoscorePocketType.Equipment, VNum = 912, ItemType = ItemType.Specialist }, + new Item { Type = NoscorePocketType.Equipment, VNum = 924, ItemType = ItemType.Fashion }, + new Item { Type = NoscorePocketType.Miniland, VNum = 3000, MinilandObjectPoint = 100 } + }; + + ItemProvider = new GameObject.Services.ItemGenerationService.ItemGenerationService( + Items, + new EventLoaderService, IUseItemEventHandler>( + new List>>()), + Logger, + TestHelpers.Instance.LogLanguageLocalizer); + } + + [TestMethod] + public void CreateItemShouldReturnItemInstance() + { + new Spec("Create item should return item instance") + .When(CreatingBasicItem) + .Then(ItemShouldBeBasicItemInstance) + .Execute(); + } + + [TestMethod] + public void CreateSpecialistItemShouldReturnSpecialistInstance() + { + new Spec("Create specialist item should return specialist instance") + .When(CreatingSpecialistItem) + .Then(ItemShouldBeSpecialistInstance) + .Execute(); + } + + [TestMethod] + public void CreateWearableItemShouldReturnWearableInstance() + { + new Spec("Create wearable item should return wearable instance") + .When(CreatingWearableItem) + .Then(ItemShouldBeWearableInstance) + .Execute(); + } + + [TestMethod] + public void GenerateWithInvalidVNumShouldThrow() + { + new Spec("Generate with invalid VNum should throw") + .When(GeneratingWithInvalidVNum).Catch(out var exception) + .Then(ShouldThrowNullReferenceException_, exception) + .Execute(); + } + + private IItemInstance? CreatedItem; + + private void CreatingBasicItem() + { + CreatedItem = ItemProvider!.Create(1012); + } + + private void ItemShouldBeBasicItemInstance() + { + Assert.IsNotNull(CreatedItem); + Assert.IsInstanceOfType(CreatedItem, typeof(ItemInstance)); + Assert.AreEqual(1012, CreatedItem.ItemVNum); + Assert.AreEqual(1, CreatedItem.Amount); + } + + private void CreatingSpecialistItem() + { + CreatedItem = ItemProvider!.Create(912); + } + + private void ItemShouldBeSpecialistInstance() + { + Assert.IsNotNull(CreatedItem); + Assert.IsInstanceOfType(CreatedItem, typeof(SpecialistInstance)); + Assert.AreEqual(912, CreatedItem.ItemVNum); + var specialist = (SpecialistInstance)CreatedItem; + Assert.AreEqual((byte)1, specialist.SpLevel); + } + + private void CreatingWearableItem() + { + CreatedItem = ItemProvider!.Create(1); + } + + private void ItemShouldBeWearableInstance() + { + Assert.IsNotNull(CreatedItem); + Assert.IsInstanceOfType(CreatedItem, typeof(WearableInstance)); + Assert.AreEqual(1, CreatedItem.ItemVNum); + } + + private void GeneratingWithInvalidVNum() + { + ItemProvider!.Create(9999); + } + + private void ShouldThrowNullReferenceException_(Lazy exception) + { + Assert.IsInstanceOfType(exception.Value, typeof(NullReferenceException)); + } + } +} diff --git a/test/NosCore.GameObject.Tests/Services/LoginService/LoginServiceTests.cs b/test/NosCore.GameObject.Tests/Services/LoginService/LoginServiceTests.cs new file mode 100644 index 000000000..cacbbaa55 --- /dev/null +++ b/test/NosCore.GameObject.Tests/Services/LoginService/LoginServiceTests.cs @@ -0,0 +1,118 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Threading.Tasks; +using Microsoft.Extensions.Options; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.Core.Configuration; +using NosCore.GameObject.InterChannelCommunication.Hubs.AuthHub; +using NosCore.GameObject.InterChannelCommunication.Hubs.ChannelHub; +using NosCore.GameObject.InterChannelCommunication.Hubs.PubSub; +using NosCore.GameObject.Services.LoginService; +using NosCore.Networking.SessionRef; +using NosCore.Packets.ClientPackets.Login; +using NosCore.Tests.Shared; +using SpecLight; + +namespace NosCore.GameObject.Tests.Services.LoginService +{ + [TestClass] + public class LoginServiceTests + { + private ILoginService Service = null!; + private Mock AuthHub = null!; + private Mock PubSubHub = null!; + private Mock ChannelHub = null!; + private SessionRefHolder SessionRefHolder = null!; + private IOptions LoginConfig = null!; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + SessionRefHolder = new SessionRefHolder(); + + AuthHub = new Mock(); + PubSubHub = new Mock(); + ChannelHub = new Mock(); + + LoginConfig = Options.Create(new LoginConfiguration()); + + Service = new GameObject.Services.LoginService.LoginService( + LoginConfig, + TestHelpers.Instance.AccountDao, + AuthHub.Object, + PubSubHub.Object, + ChannelHub.Object, + TestHelpers.Instance.CharacterDao, + SessionRefHolder); + } + + [TestMethod] + public async Task ServiceCanBeConstructed() + { + await new Spec("Service can be constructed") + .Then(ServiceShouldNotBeNull) + .ExecuteAsync(); + } + + [TestMethod] + public async Task ServiceImplementsInterface() + { + await new Spec("Service implements interface") + .Then(ServiceShouldImplementILoginService) + .ExecuteAsync(); + } + + [TestMethod] + public async Task LoginConfigCanBeSet() + { + await new Spec("Login config can be set") + .Given(LoginConfigWithClientVersion) + .Then(ConfigShouldHaveClientVersion) + .ExecuteAsync(); + } + + private void ServiceShouldNotBeNull() + { + Assert.IsNotNull(Service); + } + + private void ServiceShouldImplementILoginService() + { + Assert.IsInstanceOfType(Service, typeof(ILoginService)); + } + + private void LoginConfigWithClientVersion() + { + LoginConfig = Options.Create(new LoginConfiguration + { + ClientVersion = new ClientVersionSubPacket { Major = 1 }, + Md5String = "testmd5" + }); + } + + private void ConfigShouldHaveClientVersion() + { + Assert.IsNotNull(LoginConfig.Value.ClientVersion); + Assert.AreEqual(1, LoginConfig.Value.ClientVersion.Major); + } + } +} diff --git a/test/NosCore.GameObject.Tests/Services/MailService/MailServiceTests.cs b/test/NosCore.GameObject.Tests/Services/MailService/MailServiceTests.cs new file mode 100644 index 000000000..11766b5c0 --- /dev/null +++ b/test/NosCore.GameObject.Tests/Services/MailService/MailServiceTests.cs @@ -0,0 +1,177 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.Dao.Interfaces; +using NosCore.Data.Dto; +using NosCore.Data.StaticEntities; +using NosCore.GameObject.InterChannelCommunication.Hubs.ChannelHub; +using NosCore.GameObject.InterChannelCommunication.Hubs.PubSub; +using NosCore.GameObject.Services.ItemGenerationService; +using NosCore.GameObject.Services.MailService; +using NosCore.Tests.Shared; +using SpecLight; +using MailData = NosCore.GameObject.InterChannelCommunication.Messages.MailData; + +namespace NosCore.GameObject.Tests.Services.MailService +{ + [TestClass] + public class MailServiceTests + { + private IMailService Service = null!; + private Mock> MailDao = null!; + private Mock> ItemInstanceDao = null!; + private Mock PubSubHub = null!; + private Mock ChannelHub = null!; + private Mock ItemProvider = null!; + private Mock ParcelRegistry = null!; + private Mock> CharacterDao = null!; + private List Items = null!; + private long CharacterId = 1; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + + MailDao = new Mock>(); + ItemInstanceDao = new Mock>(); + PubSubHub = new Mock(); + ChannelHub = new Mock(); + ItemProvider = new Mock(); + ParcelRegistry = new Mock(); + CharacterDao = new Mock>(); + Items = new List(); + + Service = new GameObject.Services.MailService.MailService( + MailDao.Object, + ItemInstanceDao.Object, + PubSubHub.Object, + ChannelHub.Object, + Items, + ItemProvider.Object, + ParcelRegistry.Object, + CharacterDao.Object); + } + + [TestMethod] + public async Task GetMailsShouldReturnEmptyListWhenNoMails() + { + await new Spec("Get mails should return empty list when no mails") + .Given(NoMailsExist) + .When(GettingAllMails) + .Then(ResultShouldBeEmptyList) + .ExecuteAsync(); + } + + [TestMethod] + public async Task GetMailsShouldReturnMailsWhenMailsExist() + { + await new Spec("Get mails should return mails when mails exist") + .Given(MailsExist) + .When(GettingAllMails) + .Then(ResultShouldContainMails) + .ExecuteAsync(); + } + + [TestMethod] + public async Task GetMailsShouldReturnSpecificMailWhenIdProvided() + { + await new Spec("Get mails should return specific mail when ID provided") + .Given(MailsExist) + .And(SpecificMailExists) + .When(GettingSpecificMail) + .Then(ResultShouldContainOneMail) + .ExecuteAsync(); + } + + [TestMethod] + public async Task ServiceCanBeConstructed() + { + await new Spec("Service can be constructed") + .Then(ServiceShouldNotBeNull) + .ExecuteAsync(); + } + + private List? MailResult; + + private void NoMailsExist() + { + ParcelRegistry.Setup(s => s.GetMails(CharacterId, false)) + .Returns(new ConcurrentDictionary()); + ParcelRegistry.Setup(s => s.GetMails(CharacterId, true)) + .Returns(new ConcurrentDictionary()); + } + + private void MailsExist() + { + var mails = new ConcurrentDictionary(); + mails.TryAdd(1, new MailData { MailDto = new MailDto { MailId = 1 } }); + mails.TryAdd(2, new MailData { MailDto = new MailDto { MailId = 2 } }); + ParcelRegistry.Setup(s => s.GetMails(CharacterId, false)) + .Returns(mails); + ParcelRegistry.Setup(s => s.GetMails(CharacterId, true)) + .Returns(new ConcurrentDictionary()); + } + + private void SpecificMailExists() + { + ParcelRegistry.Setup(s => s.GetMail(CharacterId, false, 1)) + .Returns(new MailData { MailDto = new MailDto { MailId = 1 } }); + } + + private void GettingAllMails() + { + MailResult = Service.GetMails(-1, CharacterId, false); + } + + private void GettingSpecificMail() + { + MailResult = Service.GetMails(1, CharacterId, false); + } + + private void ResultShouldBeEmptyList() + { + Assert.IsNotNull(MailResult); + Assert.AreEqual(0, MailResult.Count); + } + + private void ResultShouldContainMails() + { + Assert.IsNotNull(MailResult); + Assert.AreEqual(2, MailResult.Count); + } + + private void ResultShouldContainOneMail() + { + Assert.IsNotNull(MailResult); + Assert.AreEqual(1, MailResult.Count); + } + + private void ServiceShouldNotBeNull() + { + Assert.IsNotNull(Service); + } + } +} diff --git a/test/NosCore.GameObject.Tests/Services/MapChangeService/MapChangeServiceTests.cs b/test/NosCore.GameObject.Tests/Services/MapChangeService/MapChangeServiceTests.cs new file mode 100644 index 000000000..503b61617 --- /dev/null +++ b/test/NosCore.GameObject.Tests/Services/MapChangeService/MapChangeServiceTests.cs @@ -0,0 +1,150 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.Algorithm.ExperienceService; +using NosCore.Algorithm.HeroExperienceService; +using NosCore.Algorithm.JobExperienceService; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.GameObject.Services.MapChangeService; +using NosCore.GameObject.Services.MinilandService; +using NosCore.Tests.Shared; +using Serilog; +using SpecLight; + +namespace NosCore.GameObject.Tests.Services.MapChangeService +{ + [TestClass] + public class MapChangeServiceTests + { + private static readonly ILogger Logger = new Mock().Object; + private IMapChangeService Service = null!; + private ClientSession Session = null!; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + Session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(0)!; + + var minilandService = new Mock(); + minilandService.Setup(s => s.GetMinilandPortals(It.IsAny())) + .Returns(new System.Collections.Generic.List()); + + Service = new GameObject.Services.MapChangeService.MapChangeService( + new Mock().Object, + new Mock().Object, + new Mock().Object, + TestHelpers.Instance.MapInstanceAccessorService, + TestHelpers.Instance.Clock, + TestHelpers.Instance.LogLanguageLocalizer, + minilandService.Object, + Logger, + TestHelpers.Instance.LogLanguageLocalizer, + TestHelpers.Instance.GameLanguageLocalizer, + TestHelpers.Instance.SessionRegistry); + } + + [TestMethod] + public async Task ChangingToNonExistentMapShouldNotChangeMapInstance() + { + await new Spec("Changing to non-existent map should not change map instance") + .Given(CharacterIsOnMap) + .WhenAsync(ChangingToNonExistentMap) + .Then(MapInstanceShouldNotChange) + .ExecuteAsync(); + } + + [TestMethod] + public async Task ChangingMapWithNullCoordinatesShouldNotCrash() + { + await new Spec("Changing map with null coordinates should not crash") + .WhenAsync(ChangingMapWithNullCoordinates) + .Then(NoExceptionShouldBeThrown) + .ExecuteAsync(); + } + + [TestMethod] + public async Task ServiceCanBeConstructed() + { + await new Spec("Service can be constructed") + .Then(ServiceShouldNotBeNull) + .ExecuteAsync(); + } + + [TestMethod] + public async Task MapAccessorReturnsValidMaps() + { + await new Spec("Map accessor returns valid maps") + .Then(Map0ShouldExist) + .And(Map1ShouldExist) + .ExecuteAsync(); + } + + private short OriginalMapId; + private bool OperationCompleted; + + private void CharacterIsOnMap() + { + OriginalMapId = Session.Character.MapInstance.Map.MapId; + } + + private async Task ChangingToNonExistentMap() + { + await Service.ChangeMapAsync(Session, 9999, 10, 20); + OperationCompleted = true; + } + + private async Task ChangingMapWithNullCoordinates() + { + await Service.ChangeMapAsync(Session, null, null, null); + OperationCompleted = true; + } + + private void MapInstanceShouldNotChange() + { + Assert.AreEqual(OriginalMapId, Session.Character.MapInstance.Map.MapId); + } + + private void NoExceptionShouldBeThrown() + { + Assert.IsTrue(OperationCompleted); + } + + private void ServiceShouldNotBeNull() + { + Assert.IsNotNull(Service); + } + + private void Map0ShouldExist() + { + var map0 = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(0); + Assert.IsNotNull(map0); + } + + private void Map1ShouldExist() + { + var map1 = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1); + Assert.IsNotNull(map1); + } + } +} diff --git a/test/NosCore.GameObject.Tests/Services/MapInstanceAccessService/MapInstanceAccessServiceTests.cs b/test/NosCore.GameObject.Tests/Services/MapInstanceAccessService/MapInstanceAccessServiceTests.cs new file mode 100644 index 000000000..ab13856f7 --- /dev/null +++ b/test/NosCore.GameObject.Tests/Services/MapInstanceAccessService/MapInstanceAccessServiceTests.cs @@ -0,0 +1,136 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using NosCore.GameObject.Services.MapInstanceAccessService; +using NosCore.Tests.Shared; +using SpecLight; + +namespace NosCore.GameObject.Tests.Services.MapInstanceAccessService +{ + [TestClass] + public class MapInstanceAccessServiceTests + { + private IMapInstanceAccessorService Service = null!; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Service = TestHelpers.Instance.MapInstanceAccessorService; + } + + [TestMethod] + public async Task GetBaseMapByIdShouldReturnMapForValidId() + { + await new Spec("Get base map by ID should return map for valid ID") + .When(GettingMapById0) + .Then(MapShouldNotBeNull) + .And(MapIdShouldBe0) + .ExecuteAsync(); + } + + [TestMethod] + public async Task GetBaseMapByIdShouldReturnNullForInvalidId() + { + await new Spec("Get base map by ID should return null for invalid ID") + .When(GettingMapByInvalidId) + .Then(MapShouldBeNull) + .ExecuteAsync(); + } + + [TestMethod] + public async Task GetMapInstanceShouldReturnNullForInvalidGuid() + { + await new Spec("Get map instance should return null for invalid GUID") + .When(GettingMapInstanceByInvalidGuid) + .Then(MapInstanceShouldBeNull) + .ExecuteAsync(); + } + + [TestMethod] + public async Task GetMapInstanceShouldReturnMapForValidGuid() + { + await new Spec("Get map instance should return map for valid GUID") + .Given(MapInstanceIdIsKnown) + .When(GettingMapInstanceByValidGuid) + .Then(MapInstanceShouldNotBeNull) + .ExecuteAsync(); + } + + private GameObject.Services.MapInstanceGenerationService.MapInstance? ResultMap; + private Guid KnownMapInstanceId; + + private void GettingMapById0() + { + ResultMap = Service.GetBaseMapById(0); + } + + private void GettingMapByInvalidId() + { + ResultMap = Service.GetBaseMapById(9999); + } + + private void GettingMapInstanceByInvalidGuid() + { + ResultMap = Service.GetMapInstance(Guid.NewGuid()); + } + + private void MapInstanceIdIsKnown() + { + var map = Service.GetBaseMapById(0); + if (map != null) + { + KnownMapInstanceId = map.MapInstanceId; + } + } + + private void GettingMapInstanceByValidGuid() + { + ResultMap = Service.GetMapInstance(KnownMapInstanceId); + } + + private void MapShouldNotBeNull() + { + Assert.IsNotNull(ResultMap); + } + + private void MapShouldBeNull() + { + Assert.IsNull(ResultMap); + } + + private void MapIdShouldBe0() + { + Assert.AreEqual((short)0, ResultMap?.Map.MapId); + } + + private void MapInstanceShouldBeNull() + { + Assert.IsNull(ResultMap); + } + + private void MapInstanceShouldNotBeNull() + { + Assert.IsNotNull(ResultMap); + } + } +} diff --git a/test/NosCore.GameObject.Tests/Services/MapInstanceGenerationService/MapInstanceRegistryTests.cs b/test/NosCore.GameObject.Tests/Services/MapInstanceGenerationService/MapInstanceRegistryTests.cs new file mode 100644 index 000000000..659fc0fdd --- /dev/null +++ b/test/NosCore.GameObject.Tests/Services/MapInstanceGenerationService/MapInstanceRegistryTests.cs @@ -0,0 +1,95 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using NosCore.GameObject.Services.MapInstanceGenerationService; +using SpecLight; + +namespace NosCore.GameObject.Tests.Services.MapInstanceGenerationService +{ + [TestClass] + public class MapInstanceRegistryTests + { + private IMapInstanceRegistry Registry = null!; + + [TestInitialize] + public void Setup() + { + Registry = new MapInstanceRegistry(); + } + + [TestMethod] + public async Task GetByIdShouldReturnNullForUnknownId() + { + await new Spec("Get by ID should return null for unknown ID") + .When(GettingUnknownMapInstance) + .Then(ResultShouldBeNull) + .ExecuteAsync(); + } + + [TestMethod] + public async Task GetBaseMapByIdShouldReturnNullForUnknownMapId() + { + await new Spec("Get base map by ID should return null for unknown map ID") + .When(GettingUnknownBaseMap) + .Then(ResultShouldBeNull) + .ExecuteAsync(); + } + + [TestMethod] + public async Task GetAllShouldReturnEmptyForEmptyRegistry() + { + await new Spec("Get all should return empty for empty registry") + .When(GettingAllMapInstances) + .Then(CountShouldBeZero) + .ExecuteAsync(); + } + + private MapInstance? ResultMapInstance; + private int MapInstanceCount; + + private void GettingUnknownMapInstance() + { + ResultMapInstance = Registry.GetById(Guid.NewGuid()); + } + + private void GettingUnknownBaseMap() + { + ResultMapInstance = Registry.GetBaseMapById(9999); + } + + private void GettingAllMapInstances() + { + MapInstanceCount = Registry.GetAll().Count(); + } + + private void ResultShouldBeNull() + { + Assert.IsNull(ResultMapInstance); + } + + private void CountShouldBeZero() + { + Assert.AreEqual(0, MapInstanceCount); + } + } +} diff --git a/test/NosCore.GameObject.Tests/Services/MapItemGenerationService/Handlers/DropHandlerTests.cs b/test/NosCore.GameObject.Tests/Services/MapItemGenerationService/Handlers/DropHandlerTests.cs new file mode 100644 index 000000000..2f9eb9465 --- /dev/null +++ b/test/NosCore.GameObject.Tests/Services/MapItemGenerationService/Handlers/DropHandlerTests.cs @@ -0,0 +1,191 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using NosCore.Core.Services.IdService; +using NosCore.Data.Enumerations.Items; +using NosCore.GameObject.ComponentEntities.Entities; +using NosCore.GameObject.Networking; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.GameObject.Services.ItemGenerationService; +using NosCore.GameObject.Services.ItemGenerationService.Item; +using NosCore.GameObject.Services.MapItemGenerationService.Handlers; +using NosCore.Packets.ClientPackets.Drops; +using NosCore.Packets.Enumerations; +using NosCore.Packets.ServerPackets.UI; +using NosCore.Shared.Enumerations; +using NosCore.Tests.Shared; +using SpecLight; + +namespace NosCore.GameObject.Tests.Services.MapItemGenerationService.Handlers +{ + [TestClass] + public class DropHandlerTests + { + private DropEventHandler Handler = null!; + private ClientSession Session = null!; + private IItemGenerationService ItemProvider = null!; + private IIdService IdService = null!; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Broadcaster.Reset(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + Handler = new DropEventHandler(); + ItemProvider = TestHelpers.Instance.GenerateItemProvider(); + IdService = new IdService(1); + } + + [TestMethod] + public void ConditionShouldReturnTrueForNonMapItem() + { + new Spec("Condition should return true for non-map item") + .Given(ItemIsNotMapType) + .When(CheckingCondition) + .Then(ConditionShouldBeTrue) + .Execute(); + } + + [TestMethod] + public async Task PickingUpItemShouldAddToInventory() + { + await new Spec("Picking up item should add to inventory") + .Given(ItemDroppedOnMap) + .And(CharacterHasEmptyInventory) + .WhenAsync(PickingUpItem) + .Then(ItemShouldBeInInventory) + .ExecuteAsync(); + } + + [TestMethod] + public async Task PickingUpItemShouldRemoveFromMap() + { + await new Spec("Picking up item should remove from map") + .Given(ItemDroppedOnMap) + .And(CharacterHasEmptyInventory) + .WhenAsync(PickingUpItem) + .Then(ItemShouldBeRemovedFromMap) + .ExecuteAsync(); + } + + [TestMethod] + public async Task PickingUpItemWithFullInventoryShouldFail() + { + await new Spec("Picking up item with full inventory should fail") + .Given(ItemDroppedOnMap) + .And(CharacterHasFullInventory) + .WhenAsync(PickingUpItem) + .Then(ShouldReceiveNotEnoughSpaceMessage) + .ExecuteAsync(); + } + + private MapItem? DroppedItem; + private IItemInstance? ItemInstance; + private bool ConditionResult; + + private void ItemIsNotMapType() + { + ItemInstance = ItemProvider.Create(1012, 10); + DroppedItem = CreateMapItem(ItemInstance); + } + + private void ItemDroppedOnMap() + { + ItemInstance = ItemProvider.Create(1012, 5); + DroppedItem = CreateMapItem(ItemInstance); + Session.Character.MapInstance.MapItems.TryAdd(DroppedItem.VisualId, DroppedItem); + } + + private void CharacterHasEmptyInventory() + { + Session.Character.InventoryService.Clear(); + } + + private void CharacterHasFullInventory() + { + for (var i = 0; i < 48; i++) + { + var item = ItemProvider.Create(1012, 999); + Session.Character.InventoryService.AddItemToPocket( + GameObject.Services.InventoryService.InventoryItemInstance.Create(item, Session.Character.CharacterId)); + } + } + + private void CheckingCondition() + { + ConditionResult = Handler.Condition(DroppedItem!); + } + + private async Task PickingUpItem() + { + var requestData = new RequestData>( + Session, + new Tuple(DroppedItem!, new GetPacket + { + PickerId = Session.Character.CharacterId, + VisualId = DroppedItem!.VisualId, + PickerType = VisualType.Player + })); + await Handler.ExecuteAsync(requestData); + } + + private void ConditionShouldBeTrue() + { + Assert.IsTrue(ConditionResult); + } + + private void ConditionShouldBeFalse() + { + Assert.IsFalse(ConditionResult); + } + + private void ItemShouldBeInInventory() + { + var invItem = Session.Character.InventoryService.Values.FirstOrDefault(i => i.ItemInstance.ItemVNum == 1012); + Assert.IsNotNull(invItem); + } + + private void ItemShouldBeRemovedFromMap() + { + Assert.IsFalse(Session.Character.MapInstance.MapItems.ContainsKey(DroppedItem!.VisualId)); + } + + private void ShouldReceiveNotEnoughSpaceMessage() + { + Assert.IsTrue(Session.LastPackets.Any(p => p is MsgiPacket msg && msg.Message == Game18NConstString.NotEnoughSpace)); + } + + private MapItem CreateMapItem(IItemInstance item) + { + var mapItem = new MapItem(IdService.GetNextId()) + { + MapInstance = Session.Character.MapInstance, + PositionX = 1, + PositionY = 1, + ItemInstance = item + }; + return mapItem; + } + } +} diff --git a/test/NosCore.GameObject.Tests/Services/MapItemGenerationService/Handlers/GoldDropHandlerTests.cs b/test/NosCore.GameObject.Tests/Services/MapItemGenerationService/Handlers/GoldDropHandlerTests.cs new file mode 100644 index 000000000..75fefa1ad --- /dev/null +++ b/test/NosCore.GameObject.Tests/Services/MapItemGenerationService/Handlers/GoldDropHandlerTests.cs @@ -0,0 +1,149 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using NosCore.Core.Services.IdService; +using NosCore.GameObject.ComponentEntities.Entities; +using NosCore.GameObject.Networking; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.GameObject.Services.ItemGenerationService; +using NosCore.GameObject.Services.ItemGenerationService.Item; +using NosCore.GameObject.Services.MapItemGenerationService.Handlers; +using NosCore.Tests.Shared; +using SpecLight; + +namespace NosCore.GameObject.Tests.Services.MapItemGenerationService.Handlers +{ + [TestClass] + public class GoldDropHandlerTests + { + private GoldDropEventHandler Handler = null!; + private ClientSession Session = null!; + private IItemGenerationService ItemProvider = null!; + private IIdService IdService = null!; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Broadcaster.Reset(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + Handler = new GoldDropEventHandler(TestHelpers.Instance.WorldConfiguration); + ItemProvider = TestHelpers.Instance.GenerateItemProvider(); + IdService = new IdService(1); + } + + [TestMethod] + public void ConditionShouldReturnFalseForRegularItem() + { + new Spec("Condition should return false for regular item") + .Given(ItemIsRegularItem) + .When(CheckingCondition) + .Then(ConditionShouldBeFalse) + .Execute(); + } + + [TestMethod] + public void ConditionShouldReturnFalseForEquipment() + { + new Spec("Condition should return false for equipment") + .Given(ItemIsEquipment) + .When(CheckingCondition) + .Then(ConditionShouldBeFalse) + .Execute(); + } + + [TestMethod] + public void ConditionShouldReturnFalseForSpecialist() + { + new Spec("Condition should return false for specialist card") + .Given(ItemIsSpecialist) + .When(CheckingCondition) + .Then(ConditionShouldBeFalse) + .Execute(); + } + + [TestMethod] + public void ConditionShouldCheckVNum1046() + { + new Spec("Condition should specifically check for VNum 1046") + .Given(ItemIsRegularItem) + .When(CheckingConditionForGoldVNum) + .Then(ConditionChecksShouldWork) + .Execute(); + } + + private MapItem? TestMapItem; + private IItemInstance? ItemInstance; + private bool ConditionResult; + private bool GoldVNumCheckResult; + + private void ItemIsRegularItem() + { + ItemInstance = ItemProvider.Create(1012, 10); + TestMapItem = CreateMapItem(ItemInstance); + } + + private void ItemIsEquipment() + { + ItemInstance = ItemProvider.Create(1, 1); + TestMapItem = CreateMapItem(ItemInstance); + } + + private void ItemIsSpecialist() + { + ItemInstance = ItemProvider.Create(912, 1); + TestMapItem = CreateMapItem(ItemInstance); + } + + private void CheckingCondition() + { + ConditionResult = Handler.Condition(TestMapItem!); + } + + private void CheckingConditionForGoldVNum() + { + GoldVNumCheckResult = TestMapItem!.VNum != 1046; + } + + private void ConditionShouldBeFalse() + { + Assert.IsFalse(ConditionResult); + } + + private void ConditionChecksShouldWork() + { + Assert.IsTrue(GoldVNumCheckResult); + Assert.IsFalse(ConditionResult); + } + + private MapItem CreateMapItem(IItemInstance item) + { + var mapItem = new MapItem(IdService.GetNextId()) + { + MapInstance = Session.Character.MapInstance, + PositionX = 1, + PositionY = 1, + ItemInstance = item + }; + return mapItem; + } + } +} diff --git a/test/NosCore.GameObject.Tests/Services/MapItemGenerationService/Handlers/SpChargerHandlerTests.cs b/test/NosCore.GameObject.Tests/Services/MapItemGenerationService/Handlers/SpChargerHandlerTests.cs new file mode 100644 index 000000000..791430069 --- /dev/null +++ b/test/NosCore.GameObject.Tests/Services/MapItemGenerationService/Handlers/SpChargerHandlerTests.cs @@ -0,0 +1,131 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using NosCore.Core.Services.IdService; +using NosCore.Data.Enumerations.Items; +using NosCore.GameObject.ComponentEntities.Entities; +using NosCore.GameObject.Networking; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.GameObject.Services.ItemGenerationService; +using NosCore.GameObject.Services.ItemGenerationService.Item; +using NosCore.GameObject.Services.MapItemGenerationService.Handlers; +using NosCore.Packets.ClientPackets.Drops; +using NosCore.Shared.Enumerations; +using NosCore.Tests.Shared; +using SpecLight; + +namespace NosCore.GameObject.Tests.Services.MapItemGenerationService.Handlers +{ + [TestClass] + public class SpChargerHandlerTests + { + private SpChargerEventHandler Handler = null!; + private ClientSession Session = null!; + private IItemGenerationService ItemProvider = null!; + private IIdService IdService = null!; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Broadcaster.Reset(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + Handler = new SpChargerEventHandler(); + ItemProvider = TestHelpers.Instance.GenerateItemProvider(); + IdService = new IdService(1); + } + + [TestMethod] + public void ConditionShouldReturnFalseForNonSpCharger() + { + new Spec("Condition should return false for non-SP charger item") + .Given(ItemIsNotSpCharger) + .When(CheckingCondition) + .Then(ConditionShouldBeFalse) + .Execute(); + } + + [TestMethod] + public void ConditionShouldReturnFalseForRegularItem() + { + new Spec("Condition should return false for regular item") + .Given(ItemIsRegularMainItem) + .When(CheckingCondition) + .Then(ConditionShouldBeFalse) + .Execute(); + } + + [TestMethod] + public void ConditionShouldReturnFalseForEquipment() + { + new Spec("Condition should return false for equipment") + .Given(ItemIsEquipment) + .When(CheckingCondition) + .Then(ConditionShouldBeFalse) + .Execute(); + } + + private MapItem? DroppedSpCharger; + private IItemInstance? ItemInstance; + private bool ConditionResult; + + private void ItemIsNotSpCharger() + { + ItemInstance = ItemProvider.Create(1012, 10); + DroppedSpCharger = CreateMapItem(ItemInstance); + } + + private void ItemIsRegularMainItem() + { + ItemInstance = ItemProvider.Create(1013, 5); + DroppedSpCharger = CreateMapItem(ItemInstance); + } + + private void ItemIsEquipment() + { + ItemInstance = ItemProvider.Create(1, 1); + DroppedSpCharger = CreateMapItem(ItemInstance); + } + + private void CheckingCondition() + { + ConditionResult = Handler.Condition(DroppedSpCharger!); + } + + private void ConditionShouldBeFalse() + { + Assert.IsFalse(ConditionResult); + } + + private MapItem CreateMapItem(IItemInstance item) + { + var mapItem = new MapItem(IdService.GetNextId()) + { + MapInstance = Session.Character.MapInstance, + PositionX = 1, + PositionY = 1, + ItemInstance = item + }; + return mapItem; + } + } +} diff --git a/test/NosCore.GameObject.Tests/Services/MapItemGenerationService/MapItemGenerationServiceTests.cs b/test/NosCore.GameObject.Tests/Services/MapItemGenerationService/MapItemGenerationServiceTests.cs new file mode 100644 index 000000000..a5ed01225 --- /dev/null +++ b/test/NosCore.GameObject.Tests/Services/MapItemGenerationService/MapItemGenerationServiceTests.cs @@ -0,0 +1,205 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.Core.Services.IdService; +using NosCore.GameObject.ComponentEntities.Entities; +using NosCore.GameObject.Infastructure; +using NosCore.GameObject.Services.EventLoaderService; +using NosCore.GameObject.Services.ItemGenerationService; +using NosCore.GameObject.Services.ItemGenerationService.Item; +using NosCore.GameObject.Services.MapInstanceGenerationService; +using NosCore.GameObject.Services.MapItemGenerationService; +using NosCore.GameObject.Services.MapItemGenerationService.Handlers; +using NosCore.Packets.ClientPackets.Drops; +using NosCore.Tests.Shared; +using Serilog; +using SpecLight; + +namespace NosCore.GameObject.Tests.Services.MapItemGenerationService +{ + [TestClass] + public class MapItemGenerationServiceTests + { + private static readonly ILogger Logger = new Mock().Object; + private IMapItemGenerationService Service = null!; + private IItemGenerationService ItemProvider = null!; + private MapInstance MapInstance = null!; + private IIdService IdService = null!; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + + ItemProvider = TestHelpers.Instance.GenerateItemProvider(); + IdService = new IdService(1); + + var handlers = new List>> + { + new DropEventHandler(), + new SpChargerEventHandler(), + new GoldDropEventHandler(TestHelpers.Instance.WorldConfiguration) + }; + + var eventLoader = new EventLoaderService, IGetMapItemEventHandler>(handlers); + Service = new GameObject.Services.MapItemGenerationService.MapItemGenerationService(eventLoader, IdService); + MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(0)!; + } + + [TestMethod] + public void CreatingMapItemShouldReturnMapItem() + { + new Spec("Creating map item should return map item") + .When(CreatingMapItem) + .Then(MapItemShouldBeCreated) + .Execute(); + } + + [TestMethod] + public void CreatedMapItemShouldHaveCorrectPosition() + { + new Spec("Created map item should have correct position") + .When(CreatingMapItemAtPosition) + .Then(PositionShouldBeCorrect) + .Execute(); + } + + [TestMethod] + public void CreatedMapItemShouldHaveCorrectItemInstance() + { + new Spec("Created map item should have correct item instance") + .When(CreatingMapItemWithItem) + .Then(ItemInstanceShouldBeCorrect) + .Execute(); + } + + [TestMethod] + public void CreatedMapItemShouldHaveUniqueId() + { + new Spec("Created map item should have unique id") + .When(CreatingMultipleMapItems) + .Then(IdsShouldBeUnique) + .Execute(); + } + + [TestMethod] + public void CreatedMapItemShouldHaveMapInstanceSet() + { + new Spec("Created map item should have map instance set") + .When(CreatingMapItem) + .Then(MapInstanceShouldBeSet) + .Execute(); + } + + [TestMethod] + public void CreatingMapItemWithGoldShouldSucceed() + { + new Spec("Creating map item with gold should succeed") + .When(CreatingGoldMapItem) + .Then(GoldMapItemShouldBeCreated) + .Execute(); + } + + private MapItem? CreatedMapItem; + private MapItem? SecondMapItem; + private IItemInstance? ItemInstance; + private short PositionX = 3; + private short PositionY = 4; + + private void CreatingMapItem() + { + ItemInstance = ItemProvider.Create(1012, 10); + CreatedMapItem = Service.Create(MapInstance, ItemInstance, 1, 1); + } + + private void CreatingMapItemAtPosition() + { + ItemInstance = ItemProvider.Create(1012, 5); + CreatedMapItem = Service.Create(MapInstance, ItemInstance, PositionX, PositionY); + } + + private void CreatingMapItemWithItem() + { + ItemInstance = ItemProvider.Create(1012, 25); + CreatedMapItem = Service.Create(MapInstance, ItemInstance, 1, 1); + } + + private void CreatingMultipleMapItems() + { + var item1 = ItemProvider.Create(1012, 1); + var item2 = ItemProvider.Create(1013, 1); + CreatedMapItem = Service.Create(MapInstance, item1, 1, 1); + SecondMapItem = Service.Create(MapInstance, item2, 2, 2); + } + + private void CreatingGoldMapItem() + { + ItemInstance = ItemProvider.Create(1012, 1000); + CreatedMapItem = Service.Create(MapInstance, ItemInstance, 1, 1); + } + + private void MapItemShouldBeCreated() + { + Assert.IsNotNull(CreatedMapItem); + Assert.IsTrue(CreatedMapItem.VisualId > 0); + } + + private void PositionShouldBeCorrect() + { + Assert.IsNotNull(CreatedMapItem); + Assert.AreEqual(PositionX, CreatedMapItem.PositionX); + Assert.AreEqual(PositionY, CreatedMapItem.PositionY); + } + + private void ItemInstanceShouldBeCorrect() + { + Assert.IsNotNull(CreatedMapItem); + Assert.IsNotNull(CreatedMapItem.ItemInstance); + Assert.AreEqual(1012, CreatedMapItem.ItemInstance.ItemVNum); + Assert.AreEqual((short)25, CreatedMapItem.ItemInstance.Amount); + } + + private void IdsShouldBeUnique() + { + Assert.IsNotNull(CreatedMapItem); + Assert.IsNotNull(SecondMapItem); + Assert.AreNotEqual(CreatedMapItem.VisualId, SecondMapItem.VisualId); + } + + private void MapInstanceShouldBeSet() + { + Assert.IsNotNull(CreatedMapItem); + Assert.IsNotNull(CreatedMapItem.MapInstance); + Assert.AreEqual(MapInstance, CreatedMapItem.MapInstance); + } + + private void GoldMapItemShouldBeCreated() + { + Assert.IsNotNull(CreatedMapItem); + Assert.IsNotNull(CreatedMapItem.ItemInstance); + Assert.AreEqual(1012, CreatedMapItem.ItemInstance.ItemVNum); + Assert.AreEqual((short)1000, CreatedMapItem.ItemInstance.Amount); + } + } +} diff --git a/test/NosCore.GameObject.Tests/Services/MinilandService/MinilandRegistryTests.cs b/test/NosCore.GameObject.Tests/Services/MinilandService/MinilandRegistryTests.cs new file mode 100644 index 000000000..448cab37e --- /dev/null +++ b/test/NosCore.GameObject.Tests/Services/MinilandService/MinilandRegistryTests.cs @@ -0,0 +1,236 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using NosCore.GameObject.Services.MinilandService; +using SpecLight; + +namespace NosCore.GameObject.Tests.Services.MinilandService +{ + [TestClass] + public class MinilandRegistryTests + { + private IMinilandRegistry Registry = null!; + + [TestInitialize] + public void Setup() + { + Registry = new MinilandRegistry(); + } + + [TestMethod] + public async Task RegisterShouldAddMiniland() + { + await new Spec("Register should add miniland") + .Given(MinilandIsCreated) + .When(RegisteringMiniland) + .Then(MinilandShouldBeRetrievable) + .ExecuteAsync(); + } + + [TestMethod] + public async Task GetByCharacterIdShouldReturnNullForUnknownCharacter() + { + await new Spec("Get by character ID should return null for unknown character") + .When(GettingUnknownMiniland) + .Then(ResultShouldBeNull) + .ExecuteAsync(); + } + + [TestMethod] + public async Task GetByMapInstanceIdShouldReturnMiniland() + { + await new Spec("Get by map instance ID should return miniland") + .Given(MinilandIsRegistered) + .When(GettingByMapInstanceId) + .Then(MinilandShouldBeFound) + .ExecuteAsync(); + } + + [TestMethod] + public async Task GetByMapInstanceIdShouldReturnNullForUnknownId() + { + await new Spec("Get by map instance ID should return null for unknown ID") + .When(GettingByUnknownMapInstanceId) + .Then(ResultShouldBeNull) + .ExecuteAsync(); + } + + [TestMethod] + public async Task UnregisterShouldRemoveMiniland() + { + await new Spec("Unregister should remove miniland") + .Given(MinilandIsRegistered) + .When(UnregisteringMiniland) + .Then(UnregisterShouldSucceed) + .And(MinilandShouldNotExist) + .ExecuteAsync(); + } + + [TestMethod] + public async Task ContainsCharacterShouldReturnTrueWhenExists() + { + await new Spec("Contains character should return true when exists") + .Given(MinilandIsRegistered) + .When(CheckingContainsCharacter) + .Then(ContainsShouldBeTrue) + .ExecuteAsync(); + } + + [TestMethod] + public async Task ContainsCharacterShouldReturnFalseWhenNotExists() + { + await new Spec("Contains character should return false when not exists") + .When(CheckingContainsUnknownCharacter) + .Then(ContainsShouldBeFalse) + .ExecuteAsync(); + } + + [TestMethod] + public async Task GetAllShouldReturnAllMinilands() + { + await new Spec("Get all should return all minilands") + .Given(MultipleMinilandsAreRegistered) + .When(GettingAllMinilands) + .Then(AllMinilandsShouldBeReturned) + .ExecuteAsync(); + } + + private Miniland? TestMiniland; + private Miniland? ResultMiniland; + private Miniland? UnregisteredMiniland; + private bool UnregisterResult; + private bool ContainsResult; + private int MinilandCount; + private readonly Guid TestMapInstanceId = Guid.NewGuid(); + private const long TestCharacterId = 1; + private const long TestCharacterId2 = 2; + + private void MinilandIsCreated() + { + TestMiniland = new Miniland + { + MapInstanceId = TestMapInstanceId, + OwnerId = TestCharacterId + }; + } + + private void MinilandIsRegistered() + { + MinilandIsCreated(); + Registry.Register(TestCharacterId, TestMiniland!); + } + + private void MultipleMinilandsAreRegistered() + { + TestMiniland = new Miniland { MapInstanceId = TestMapInstanceId, OwnerId = TestCharacterId }; + var miniland2 = new Miniland { MapInstanceId = Guid.NewGuid(), OwnerId = TestCharacterId2 }; + Registry.Register(TestCharacterId, TestMiniland); + Registry.Register(TestCharacterId2, miniland2); + } + + private void RegisteringMiniland() + { + Registry.Register(TestCharacterId, TestMiniland!); + } + + private void GettingUnknownMiniland() + { + ResultMiniland = Registry.GetByCharacterId(9999); + } + + private void GettingByMapInstanceId() + { + ResultMiniland = Registry.GetByMapInstanceId(TestMapInstanceId); + } + + private void GettingByUnknownMapInstanceId() + { + ResultMiniland = Registry.GetByMapInstanceId(Guid.NewGuid()); + } + + private void UnregisteringMiniland() + { + UnregisterResult = Registry.Unregister(TestCharacterId, out UnregisteredMiniland); + } + + private void CheckingContainsCharacter() + { + ContainsResult = Registry.ContainsCharacter(TestCharacterId); + } + + private void CheckingContainsUnknownCharacter() + { + ContainsResult = Registry.ContainsCharacter(9999); + } + + private void GettingAllMinilands() + { + MinilandCount = Registry.GetAll().Count(); + } + + private void MinilandShouldBeRetrievable() + { + var result = Registry.GetByCharacterId(TestCharacterId); + Assert.IsNotNull(result); + Assert.AreEqual(TestMapInstanceId, result.MapInstanceId); + } + + private void ResultShouldBeNull() + { + Assert.IsNull(ResultMiniland); + } + + private void MinilandShouldBeFound() + { + Assert.IsNotNull(ResultMiniland); + Assert.AreEqual(TestCharacterId, ResultMiniland.OwnerId); + } + + private void UnregisterShouldSucceed() + { + Assert.IsTrue(UnregisterResult); + Assert.IsNotNull(UnregisteredMiniland); + } + + private void MinilandShouldNotExist() + { + var result = Registry.GetByCharacterId(TestCharacterId); + Assert.IsNull(result); + } + + private void ContainsShouldBeTrue() + { + Assert.IsTrue(ContainsResult); + } + + private void ContainsShouldBeFalse() + { + Assert.IsFalse(ContainsResult); + } + + private void AllMinilandsShouldBeReturned() + { + Assert.AreEqual(2, MinilandCount); + } + } +} diff --git a/test/NosCore.GameObject.Tests/Services/MinilandService/MinilandServiceTests.cs b/test/NosCore.GameObject.Tests/Services/MinilandService/MinilandServiceTests.cs new file mode 100644 index 000000000..b7c9b37ad --- /dev/null +++ b/test/NosCore.GameObject.Tests/Services/MinilandService/MinilandServiceTests.cs @@ -0,0 +1,247 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.Data.Dto; +using NosCore.Data.StaticEntities; +using NosCore.Data.WebApi; +using NosCore.GameObject.InterChannelCommunication.Hubs.FriendHub; +using NosCore.GameObject.Map; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.GameObject.Services.MinilandService; +using NosCore.Packets.Enumerations; +using NosCore.Tests.Shared; +using SpecLight; + +namespace NosCore.GameObject.Tests.Services.MinilandService +{ + [TestClass] + public class MinilandServiceTests + { + private IMinilandService Service = null!; + private Mock FriendHttpClient = null!; + private ClientSession Session = null!; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + FriendHttpClient = new Mock(); + FriendHttpClient.Setup(s => s.GetFriendsAsync(It.IsAny())) + .ReturnsAsync(new List()); + + await TestHelpers.Instance.MinilandDao.TryInsertOrUpdateAsync(new MinilandDto + { + OwnerId = Session.Character.CharacterId + }); + + Service = new GameObject.Services.MinilandService.MinilandService( + TestHelpers.Instance.MapInstanceAccessorService, + FriendHttpClient.Object, + new List + { + new NosCore.GameObject.Map.Map + { + MapId = 20001, + NameI18NKey = "miniland", + Data = new byte[] { } + } + }, + TestHelpers.Instance.MinilandDao, + TestHelpers.Instance.MinilandObjectDao, + new MinilandRegistry()); + } + + [TestMethod] + public async Task InitializingMinilandShouldSucceed() + { + await new Spec("Initializing miniland should succeed") + .WhenAsync(InitializingMiniland) + .Then(MinilandShouldBeInitialized) + .ExecuteAsync(); + } + + [TestMethod] + public async Task GettingMinilandShouldReturnMiniland() + { + await new Spec("Getting miniland should return miniland") + .GivenAsync(MinilandIsInitialized) + .When(GettingMiniland) + .Then(MinilandShouldBeReturned) + .ExecuteAsync(); + } + + [TestMethod] + public async Task GettingNonExistentMinilandShouldThrow() + { + await new Spec("Getting non-existent miniland should throw") + .When(GettingNonExistentMiniland).Catch(out var exception) + .Then(ShouldThrowArgumentException_, exception) + .ExecuteAsync(); + } + + [TestMethod] + public async Task SettingMinilandStateToOpenShouldSucceed() + { + await new Spec("Setting miniland state to open should succeed") + .GivenAsync(MinilandIsInitialized) + .WhenAsync(SettingStateToOpen) + .Then(StateShouldBeOpen) + .ExecuteAsync(); + } + + [TestMethod] + public async Task SettingMinilandStateToPrivateShouldSucceed() + { + await new Spec("Setting miniland state to private should succeed") + .GivenAsync(MinilandIsInitialized) + .WhenAsync(SettingStateToPrivate) + .Then(StateShouldBePrivate) + .ExecuteAsync(); + } + + [TestMethod] + public async Task SettingMinilandStateToLockShouldSucceed() + { + await new Spec("Setting miniland state to lock should succeed") + .GivenAsync(MinilandIsInitialized) + .WhenAsync(SettingStateToLock) + .Then(StateShouldBeLock) + .ExecuteAsync(); + } + + [TestMethod] + public async Task DeletingMinilandShouldSucceed() + { + await new Spec("Deleting miniland should succeed") + .GivenAsync(MinilandIsInitialized) + .WhenAsync(DeletingMiniland) + .Then(DeleteShouldSucceed) + .ExecuteAsync(); + } + + [TestMethod] + public async Task DeletingNonExistentMinilandShouldReturnNull() + { + await new Spec("Deleting non-existent miniland should return null") + .WhenAsync(DeletingNonExistentMiniland) + .Then(DeleteShouldReturnNull) + .ExecuteAsync(); + } + + private Miniland? InitializedMiniland; + private Miniland? RetrievedMiniland; + private Guid? DeleteResult; + + private async Task InitializingMiniland() + { + InitializedMiniland = await Service.InitializeAsync(Session.Character, TestHelpers.Instance.MapInstanceGeneratorService); + } + + private async Task MinilandIsInitialized() + { + InitializedMiniland = await Service.InitializeAsync(Session.Character, TestHelpers.Instance.MapInstanceGeneratorService); + } + + private void GettingMiniland() + { + RetrievedMiniland = Service.GetMiniland(Session.Character.CharacterId); + } + + private void GettingNonExistentMiniland() + { + Service.GetMiniland(99999); + } + + private async Task SettingStateToOpen() + { + await Service.SetStateAsync(Session.Character.CharacterId, MinilandState.Open); + } + + private async Task SettingStateToPrivate() + { + await Service.SetStateAsync(Session.Character.CharacterId, MinilandState.Private); + } + + private async Task SettingStateToLock() + { + await Service.SetStateAsync(Session.Character.CharacterId, MinilandState.Lock); + } + + private async Task DeletingMiniland() + { + DeleteResult = await Service.DeleteMinilandAsync(Session.Character.CharacterId); + } + + private async Task DeletingNonExistentMiniland() + { + DeleteResult = await Service.DeleteMinilandAsync(99999); + } + + private void MinilandShouldBeInitialized() + { + Assert.IsNotNull(InitializedMiniland); + Assert.AreNotEqual(Guid.Empty, InitializedMiniland.MapInstanceId); + } + + private void MinilandShouldBeReturned() + { + Assert.IsNotNull(RetrievedMiniland); + Assert.AreEqual(InitializedMiniland!.MapInstanceId, RetrievedMiniland.MapInstanceId); + } + + private void ShouldThrowArgumentException_(Lazy exception) + { + Assert.IsInstanceOfType(exception.Value, typeof(ArgumentException)); + } + + private void StateShouldBeOpen() + { + var miniland = Service.GetMiniland(Session.Character.CharacterId); + Assert.AreEqual(MinilandState.Open, miniland.State); + } + + private void StateShouldBePrivate() + { + var miniland = Service.GetMiniland(Session.Character.CharacterId); + Assert.AreEqual(MinilandState.Private, miniland.State); + } + + private void StateShouldBeLock() + { + var miniland = Service.GetMiniland(Session.Character.CharacterId); + Assert.AreEqual(MinilandState.Lock, miniland.State); + } + + private void DeleteShouldSucceed() + { + Assert.IsNotNull(DeleteResult); + } + + private void DeleteShouldReturnNull() + { + Assert.IsNull(DeleteResult); + } + } +} diff --git a/test/NosCore.GameObject.Tests/Services/NRunService/Handlers/ChangeClassTests.cs b/test/NosCore.GameObject.Tests/Services/NRunService/Handlers/ChangeClassTests.cs index 0ade3abbe..919371cfe 100644 --- a/test/NosCore.GameObject.Tests/Services/NRunService/Handlers/ChangeClassTests.cs +++ b/test/NosCore.GameObject.Tests/Services/NRunService/Handlers/ChangeClassTests.cs @@ -49,17 +49,17 @@ public class ChangeClassTests { private static readonly ILogger Logger = new Mock().Object; - private IItemGenerationService? _item; - private NrunService _nrRunService = null!; - private ClientSession? _session; + private IItemGenerationService? Item; + private NrunService NrRunService = null!; + private ClientSession? Session; [TestInitialize] public async Task SetupAsync() { await TestHelpers.ResetAsync(); - _session = await TestHelpers.Instance.GenerateSessionAsync(); - _item = TestHelpers.Instance.GenerateItemProvider(); - _nrRunService = new NrunService( + Session = await TestHelpers.Instance.GenerateSessionAsync(); + Item = TestHelpers.Instance.GenerateItemProvider(); + NrRunService = new NrunService( new List, Tuple>> {new ChangeClassEventHandler(Logger, TestHelpers.Instance.LogLanguageLocalizer)}); } @@ -71,8 +71,8 @@ public async Task SetupAsync() public async Task UserCantChangeClassLowLevelAsync(int characterClassInt) { var characterClass = (CharacterClassType)characterClassInt; - _session!.Character.Level = 15; - await _nrRunService.NRunLaunchAsync(_session, new Tuple(_session.Character, (new NrunPacket + Session!.Character.Level = 15; + await NrRunService.NRunLaunchAsync(Session, new Tuple(Session.Character, (new NrunPacket { VisualType = VisualType.Npc, Runner = NrunRunnerType.ChangeClass, @@ -80,7 +80,7 @@ public async Task UserCantChangeClassLowLevelAsync(int characterClassInt) Type = (byte)characterClass }))); - var msgiPacket = (MsgiPacket?)_session.LastPackets.FirstOrDefault(s => s is MsgiPacket); + var msgiPacket = (MsgiPacket?)Session.LastPackets.FirstOrDefault(s => s is MsgiPacket); Assert.IsTrue(msgiPacket?.Type == MessageType.Default && msgiPacket?.Message == Game18NConstString.CanNotChangeJobAtThisLevel); } @@ -91,8 +91,8 @@ public async Task UserCantChangeClassLowLevelAsync(int characterClassInt) public async Task UserCantChangeClassLowJobLevelAsync(int characterClassInt) { var characterClass = (CharacterClassType)characterClassInt; - _session!.Character.JobLevel = 20; - await _nrRunService.NRunLaunchAsync(_session, new Tuple(_session.Character, (new NrunPacket + Session!.Character.JobLevel = 20; + await NrRunService.NRunLaunchAsync(Session, new Tuple(Session.Character, (new NrunPacket { VisualType = VisualType.Npc, Runner = NrunRunnerType.ChangeClass, @@ -100,7 +100,7 @@ public async Task UserCantChangeClassLowJobLevelAsync(int characterClassInt) Type = (byte)characterClass }))); - var msgiPacket = (MsgiPacket?)_session.LastPackets.FirstOrDefault(s => s is MsgiPacket); + var msgiPacket = (MsgiPacket?)Session.LastPackets.FirstOrDefault(s => s is MsgiPacket); Assert.IsTrue(msgiPacket?.Type == MessageType.Default && msgiPacket?.Message == Game18NConstString.CanNotChangeJobAtThisLevel); } @@ -111,15 +111,15 @@ public async Task UserCantChangeClassLowJobLevelAsync(int characterClassInt) public async Task UserCantChangeBadClassAsync(int characterClassInt) { var characterClass = (CharacterClassType)characterClassInt; - _session!.Character.Class = characterClass; - await _nrRunService.NRunLaunchAsync(_session, new Tuple(_session.Character, (new NrunPacket + Session!.Character.Class = characterClass; + await NrRunService.NRunLaunchAsync(Session, new Tuple(Session.Character, (new NrunPacket { VisualType = VisualType.Npc, Runner = NrunRunnerType.ChangeClass, VisualId = 0, Type = (byte)CharacterClassType.Swordsman }))); - var packet = (MsgPacket?)_session.LastPackets.FirstOrDefault(s => s is MsgPacket); + var packet = (MsgPacket?)Session.LastPackets.FirstOrDefault(s => s is MsgPacket); } [DataTestMethod] @@ -128,9 +128,9 @@ public async Task UserCantChangeBadClassAsync(int characterClassInt) public async Task UserCantChangeToBadClassAsync(int characterClassInt) { var characterClass = (CharacterClassType)characterClassInt; - _session!.Character.Level = 15; - _session.Character.JobLevel = 20; - await _nrRunService.NRunLaunchAsync(_session, new Tuple(_session.Character, (new NrunPacket + Session!.Character.Level = 15; + Session.Character.JobLevel = 20; + await NrRunService.NRunLaunchAsync(Session, new Tuple(Session.Character, (new NrunPacket { VisualType = VisualType.Npc, Runner = NrunRunnerType.ChangeClass, @@ -138,9 +138,9 @@ public async Task UserCantChangeToBadClassAsync(int characterClassInt) Type = (byte)characterClass }))); - Assert.IsTrue((_session.Character.Class == CharacterClassType.Adventurer) && - (_session.Character.Level == 15) && - (_session.Character.JobLevel == 20)); + Assert.IsTrue((Session.Character.Class == CharacterClassType.Adventurer) && + (Session.Character.Level == 15) && + (Session.Character.JobLevel == 20)); } [DataTestMethod] @@ -150,9 +150,9 @@ public async Task UserCantChangeToBadClassAsync(int characterClassInt) public async Task UserCanChangeClassAsync(int characterClassInt) { var characterClass = (CharacterClassType)characterClassInt; - _session!.Character.Level = 15; - _session.Character.JobLevel = 20; - await _nrRunService.NRunLaunchAsync(_session, new Tuple(_session.Character, (new NrunPacket + Session!.Character.Level = 15; + Session.Character.JobLevel = 20; + await NrRunService.NRunLaunchAsync(Session, new Tuple(Session.Character, (new NrunPacket { VisualType = VisualType.Npc, Runner = NrunRunnerType.ChangeClass, @@ -160,8 +160,8 @@ public async Task UserCanChangeClassAsync(int characterClassInt) Type = (byte)characterClass }))); - Assert.IsTrue((_session.Character.Class == characterClass) && (_session.Character.Level == 15) && - (_session.Character.JobLevel == 1)); + Assert.IsTrue((Session.Character.Class == characterClass) && (Session.Character.Level == 15) && + (Session.Character.JobLevel == 1)); } [DataTestMethod] @@ -171,12 +171,12 @@ public async Task UserCanChangeClassAsync(int characterClassInt) public async Task UserCanNotChangeClassWhenEquipmentAsync(int characterClassInt) { var characterClass = (CharacterClassType)characterClassInt; - _session!.Character.Level = 15; - _session.Character.JobLevel = 20; - _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item!.Create(1, 1), 0)); - var item = _session.Character.InventoryService.First(); + Session!.Character.Level = 15; + Session.Character.JobLevel = 20; + Session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(Item!.Create(1, 1), 0)); + var item = Session.Character.InventoryService.First(); item.Value.Type = NoscorePocketType.Wear; - await _nrRunService.NRunLaunchAsync(_session, new Tuple(_session.Character, (new NrunPacket + await NrRunService.NRunLaunchAsync(Session, new Tuple(Session.Character, (new NrunPacket { VisualType = VisualType.Npc, Runner = NrunRunnerType.ChangeClass, @@ -184,8 +184,8 @@ public async Task UserCanNotChangeClassWhenEquipmentAsync(int characterClassInt) Type = (byte)characterClass }))); - var packet = (SayiPacket?)_session.LastPackets.FirstOrDefault(s => s is SayiPacket); - Assert.IsTrue(packet?.VisualType == VisualType.Player && packet?.VisualId == _session.Character.CharacterId && packet?.Type == SayColorType.Yellow && packet?.Message == Game18NConstString.RemoveEquipment); + var packet = (SayiPacket?)Session.LastPackets.FirstOrDefault(s => s is SayiPacket); + Assert.IsTrue(packet?.VisualType == VisualType.Player && packet?.VisualId == Session.Character.CharacterId && packet?.Type == SayColorType.Yellow && packet?.Message == Game18NConstString.RemoveEquipment); } } } \ No newline at end of file diff --git a/test/NosCore.GameObject.Tests/Services/NRunService/Handlers/OpenShopHandlerTests.cs b/test/NosCore.GameObject.Tests/Services/NRunService/Handlers/OpenShopHandlerTests.cs new file mode 100644 index 000000000..f0d8860cc --- /dev/null +++ b/test/NosCore.GameObject.Tests/Services/NRunService/Handlers/OpenShopHandlerTests.cs @@ -0,0 +1,157 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.Data.StaticEntities; +using NosCore.GameObject.ComponentEntities.Entities; +using NosCore.GameObject.ComponentEntities.Interfaces; +using NosCore.GameObject.Networking; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.GameObject.Services.NRunService.Handlers; +using NosCore.Packets.ClientPackets.Npcs; +using NosCore.Packets.Enumerations; +using NosCore.Shared.Enumerations; +using NosCore.Tests.Shared; +using Serilog; +using SpecLight; + +namespace NosCore.GameObject.Tests.Services.NRunService.Handlers +{ + [TestClass] + public class OpenShopHandlerTests + { + private static readonly ILogger Logger = new Mock().Object; + private OpenShopEventHandler Handler = null!; + private ClientSession Session = null!; + private MapNpc? Npc; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Broadcaster.Reset(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + Handler = new OpenShopEventHandler(); + } + + [TestMethod] + public void ConditionShouldReturnTrueForOpenShopWithEntity() + { + new Spec("Condition should return true for open shop with entity") + .Given(NpcExists) + .When(CheckingConditionWithOpenShopRunner) + .Then(ConditionShouldBeTrue) + .Execute(); + } + + [TestMethod] + public void ConditionShouldReturnFalseForOpenShopWithNullEntity() + { + new Spec("Condition should return false for open shop with null entity") + .When(CheckingConditionWithNullEntity) + .Then(ConditionShouldBeFalse) + .Execute(); + } + + [TestMethod] + public void ConditionShouldReturnFalseForNonOpenShopRunner() + { + new Spec("Condition should return false for non-open shop runner") + .Given(NpcExists) + .When(CheckingConditionWithTeleportRunner) + .Then(ConditionShouldBeFalse) + .Execute(); + } + + [TestMethod] + public async Task ExecutingShouldNotThrow() + { + await new Spec("Executing open shop should not throw") + .Given(NpcExists) + .WhenAsync(ExecutingOpenShop) + .Then(SessionShouldRemainValid) + .ExecuteAsync(); + } + + private bool ConditionResult; + + private void NpcExists() + { + Npc = new MapNpc( + TestHelpers.Instance.GenerateItemProvider(), + Logger, + TestHelpers.Instance.DistanceCalculator, + TestHelpers.Instance.Clock); + Npc.MapNpcId = 1; + Npc.Initialize(new NpcMonsterDto { NpcMonsterVNum = 1 }, null, null, new List()); + } + + private void CheckingConditionWithOpenShopRunner() + { + var packet = new NrunPacket { Runner = NrunRunnerType.OpenShop }; + ConditionResult = Handler.Condition(new Tuple(Npc!, packet)); + } + + private void CheckingConditionWithNullEntity() + { + var packet = new NrunPacket { Runner = NrunRunnerType.OpenShop }; + ConditionResult = Handler.Condition(new Tuple(null!, packet)); + } + + private void CheckingConditionWithTeleportRunner() + { + var packet = new NrunPacket { Runner = NrunRunnerType.Teleport }; + ConditionResult = Handler.Condition(new Tuple(Npc!, packet)); + } + + private async Task ExecutingOpenShop() + { + var packet = new NrunPacket + { + Runner = NrunRunnerType.OpenShop, + VisualType = VisualType.Npc, + VisualId = Npc!.MapNpcId, + Type = 0 + }; + var requestData = new RequestData>( + Session, + new Tuple(Npc!, packet)); + await Handler.ExecuteAsync(requestData); + } + + private void ConditionShouldBeTrue() + { + Assert.IsTrue(ConditionResult); + } + + private void ConditionShouldBeFalse() + { + Assert.IsFalse(ConditionResult); + } + + private void SessionShouldRemainValid() + { + Assert.IsNotNull(Session.Character); + } + } +} diff --git a/test/NosCore.GameObject.Tests/Services/NRunService/Handlers/TeleporterHandlerTests.cs b/test/NosCore.GameObject.Tests/Services/NRunService/Handlers/TeleporterHandlerTests.cs new file mode 100644 index 000000000..d36899808 --- /dev/null +++ b/test/NosCore.GameObject.Tests/Services/NRunService/Handlers/TeleporterHandlerTests.cs @@ -0,0 +1,224 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.Data.StaticEntities; +using NosCore.GameObject.ComponentEntities.Entities; +using NosCore.GameObject.ComponentEntities.Interfaces; +using NosCore.GameObject.Networking; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.GameObject.Services.MapChangeService; +using NosCore.GameObject.Services.NRunService.Handlers; +using NosCore.Packets.ClientPackets.Npcs; +using NosCore.Packets.Enumerations; +using NosCore.Packets.ServerPackets.Chats; +using NosCore.Shared.Enumerations; +using NosCore.Tests.Shared; +using Serilog; +using SpecLight; + +namespace NosCore.GameObject.Tests.Services.NRunService.Handlers +{ + [TestClass] + public class TeleporterHandlerTests + { + private static readonly ILogger Logger = new Mock().Object; + private TeleporterHandler Handler = null!; + private ClientSession Session = null!; + private Mock MapChangeServiceMock = null!; + private MapNpc? Npc; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Broadcaster.Reset(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + MapChangeServiceMock = new Mock(); + Handler = new TeleporterHandler(MapChangeServiceMock.Object); + } + + [TestMethod] + public void ConditionShouldReturnTrueForTeleportWithValidDialog() + { + new Spec("Condition should return true for teleport with valid dialog") + .Given(NpcWithTeleportDialog) + .When(CheckingConditionWithTeleportRunner) + .Then(ConditionShouldBeTrue) + .Execute(); + } + + [TestMethod] + public void ConditionShouldReturnFalseForNonTeleportRunner() + { + new Spec("Condition should return false for non-teleport runner") + .Given(NpcWithTeleportDialog) + .When(CheckingConditionWithShopRunner) + .Then(ConditionShouldBeFalse) + .Execute(); + } + + [TestMethod] + public void ConditionShouldReturnFalseForInvalidDialog() + { + new Spec("Condition should return false for invalid dialog") + .Given(NpcWithInvalidDialog) + .When(CheckingConditionWithTeleportRunner) + .Then(ConditionShouldBeFalse) + .Execute(); + } + + [TestMethod] + public async Task TeleportWithEnoughGoldShouldChangeMap() + { + await new Spec("Teleport with enough gold should change map") + .Given(NpcWithTeleportDialog) + .And(CharacterHasEnoughGold) + .WhenAsync(ExecutingTeleport) + .Then(MapChangeShouldBeCalled) + .ExecuteAsync(); + } + + [TestMethod] + public async Task TeleportWithEnoughGoldShouldRemoveGold() + { + await new Spec("Teleport with enough gold should remove gold") + .Given(NpcWithTeleportDialog) + .And(CharacterHasEnoughGold) + .WhenAsync(ExecutingTeleport) + .Then(GoldShouldBeRemoved) + .ExecuteAsync(); + } + + [TestMethod] + public async Task TeleportWithoutEnoughGoldShouldNotChangeMap() + { + await new Spec("Teleport without enough gold should not change map") + .Given(NpcWithTeleportDialog) + .And(CharacterHasNoGold) + .WhenAsync(ExecutingTeleport) + .Then(MapChangeShouldNotBeCalled) + .And(ShouldReceiveNotEnoughGoldMessage) + .ExecuteAsync(); + } + + private bool ConditionResult; + private long InitialGold; + + private void NpcWithTeleportDialog() + { + Npc = new MapNpc( + TestHelpers.Instance.GenerateItemProvider(), + Logger, + TestHelpers.Instance.DistanceCalculator, + TestHelpers.Instance.Clock); + Npc.MapNpcId = 1; + Npc.Dialog = 439; + Npc.Initialize(new NpcMonsterDto { NpcMonsterVNum = 1 }, null, null, new List()); + } + + private void NpcWithInvalidDialog() + { + Npc = new MapNpc( + TestHelpers.Instance.GenerateItemProvider(), + Logger, + TestHelpers.Instance.DistanceCalculator, + TestHelpers.Instance.Clock); + Npc.MapNpcId = 1; + Npc.Dialog = 1; + Npc.Initialize(new NpcMonsterDto { NpcMonsterVNum = 1 }, null, null, new List()); + } + + private void CharacterHasEnoughGold() + { + Session.Character.Gold = 5000; + InitialGold = Session.Character.Gold; + } + + private void CharacterHasNoGold() + { + Session.Character.Gold = 0; + InitialGold = 0; + } + + private void CheckingConditionWithTeleportRunner() + { + var packet = new NrunPacket { Runner = NrunRunnerType.Teleport }; + ConditionResult = Handler.Condition(new Tuple(Npc!, packet)); + } + + private void CheckingConditionWithShopRunner() + { + var packet = new NrunPacket { Runner = NrunRunnerType.OpenShop }; + ConditionResult = Handler.Condition(new Tuple(Npc!, packet)); + } + + private async Task ExecutingTeleport() + { + var packet = new NrunPacket + { + Runner = NrunRunnerType.Teleport, + Type = 1 + }; + var requestData = new RequestData>( + Session, + new Tuple(Npc!, packet)); + await Handler.ExecuteAsync(requestData); + } + + private void ConditionShouldBeTrue() + { + Assert.IsTrue(ConditionResult); + } + + private void ConditionShouldBeFalse() + { + Assert.IsFalse(ConditionResult); + } + + private void MapChangeShouldBeCalled() + { + MapChangeServiceMock.Verify( + x => x.ChangeMapAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()), + Times.Once); + } + + private void MapChangeShouldNotBeCalled() + { + MapChangeServiceMock.Verify( + x => x.ChangeMapAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()), + Times.Never); + } + + private void GoldShouldBeRemoved() + { + Assert.IsTrue(Session.Character.Gold < InitialGold); + } + + private void ShouldReceiveNotEnoughGoldMessage() + { + Assert.IsTrue(Session.LastPackets.Any(p => p is SayiPacket sayi && sayi.Message == Game18NConstString.NotEnoughGold)); + } + } +} diff --git a/test/NosCore.GameObject.Tests/Services/NRunService/NrunServiceTests.cs b/test/NosCore.GameObject.Tests/Services/NRunService/NrunServiceTests.cs new file mode 100644 index 000000000..584d9e164 --- /dev/null +++ b/test/NosCore.GameObject.Tests/Services/NRunService/NrunServiceTests.cs @@ -0,0 +1,148 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.GameObject.ComponentEntities.Interfaces; +using NosCore.GameObject.Infastructure; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.GameObject.Services.NRunService; +using NosCore.Packets.ClientPackets.Npcs; +using NosCore.Tests.Shared; +using SpecLight; + +namespace NosCore.GameObject.Tests.Services.NRunService +{ + [TestClass] + public class NrunServiceTests + { + private INrunService Service = null!; + private List, Tuple>> Handlers = null!; + private ClientSession Session = null!; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + Handlers = new List, Tuple>>(); + + Service = new NrunService(Handlers); + } + + [TestMethod] + public async Task ServiceCanBeConstructed() + { + await new Spec("Service can be constructed") + .Then(ServiceShouldNotBeNull) + .ExecuteAsync(); + } + + [TestMethod] + public async Task NRunLaunchWithNoHandlersShouldComplete() + { + await new Spec("NRun launch with no handlers should complete") + .WhenAsync(LaunchingNRunWithNoHandlers) + .Then(LaunchShouldComplete) + .ExecuteAsync(); + } + + [TestMethod] + public async Task NRunLaunchWithMatchingHandlerShouldExecuteHandler() + { + await new Spec("NRun launch with matching handler should execute handler") + .Given(HandlerIsRegistered) + .WhenAsync(LaunchingNRun) + .Then(HandlerShouldBeExecuted) + .ExecuteAsync(); + } + + [TestMethod] + public async Task NRunLaunchWithNonMatchingHandlerShouldNotExecuteHandler() + { + await new Spec("NRun launch with non-matching handler should not execute handler") + .Given(NonMatchingHandlerIsRegistered) + .WhenAsync(LaunchingNRun) + .Then(HandlerShouldNotBeExecuted) + .ExecuteAsync(); + } + + private bool LaunchCompleted; + private Mock, Tuple>>? MockHandler; + private bool HandlerExecuted; + + private void HandlerIsRegistered() + { + MockHandler = new Mock, Tuple>>(); + MockHandler.Setup(h => h.Condition(It.IsAny>())) + .Returns(true); + MockHandler.Setup(h => h.ExecuteAsync(It.IsAny>>())) + .Callback(() => HandlerExecuted = true) + .Returns(Task.CompletedTask); + Handlers.Add(MockHandler.Object); + Service = new NrunService(Handlers); + } + + private void NonMatchingHandlerIsRegistered() + { + MockHandler = new Mock, Tuple>>(); + MockHandler.Setup(h => h.Condition(It.IsAny>())) + .Returns(false); + Handlers.Add(MockHandler.Object); + Service = new NrunService(Handlers); + } + + private async Task LaunchingNRunWithNoHandlers() + { + var data = Tuple.Create(Session.Character, new NrunPacket()); + await Service.NRunLaunchAsync(Session, data); + LaunchCompleted = true; + } + + private async Task LaunchingNRun() + { + var data = Tuple.Create(Session.Character, new NrunPacket()); + await Service.NRunLaunchAsync(Session, data); + LaunchCompleted = true; + } + + private void ServiceShouldNotBeNull() + { + Assert.IsNotNull(Service); + } + + private void LaunchShouldComplete() + { + Assert.IsTrue(LaunchCompleted); + } + + private void HandlerShouldBeExecuted() + { + Assert.IsTrue(HandlerExecuted); + } + + private void HandlerShouldNotBeExecuted() + { + MockHandler?.Verify(h => h.ExecuteAsync(It.IsAny>>()), Times.Never); + } + } +} diff --git a/test/NosCore.GameObject.Tests/Services/PacketHandlerService/PacketHandlerRegistryTests.cs b/test/NosCore.GameObject.Tests/Services/PacketHandlerService/PacketHandlerRegistryTests.cs new file mode 100644 index 000000000..f35fe4fc5 --- /dev/null +++ b/test/NosCore.GameObject.Tests/Services/PacketHandlerService/PacketHandlerRegistryTests.cs @@ -0,0 +1,137 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using NosCore.GameObject.Infastructure; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.GameObject.Services.PacketHandlerService; +using NosCore.Packets.Attributes; +using NosCore.Packets.ClientPackets.Chat; +using SpecLight; + +namespace NosCore.GameObject.Tests.Services.PacketHandlerService +{ + [TestClass] + public class PacketHandlerRegistryTests + { + private IPacketHandlerRegistry Registry = null!; + + [TestInitialize] + public void Setup() + { + Registry = new PacketHandlerRegistry(new List()); + } + + [TestMethod] + public async Task GetHandlerShouldReturnNullForUnregisteredPacket() + { + await new Spec("Get handler should return null for unregistered packet") + .When(GettingUnregisteredHandler) + .Then(HandlerShouldBeNull) + .ExecuteAsync(); + } + + [TestMethod] + public async Task GetPacketAttributeShouldReturnNullForUnregisteredPacket() + { + await new Spec("Get packet attribute should return null for unregistered packet") + .When(GettingUnregisteredAttribute) + .Then(AttributeShouldBeNull) + .ExecuteAsync(); + } + + [TestMethod] + public async Task RegistryWithHandlersShouldRegisterHandlers() + { + await new Spec("Registry with handlers should register handlers") + .Given(RegistryWithHandlersIsCreated) + .When(GettingRegisteredHandler) + .Then(HandlerShouldNotBeNull) + .ExecuteAsync(); + } + + [TestMethod] + public async Task RegistryWithHandlersShouldRegisterAttributes() + { + await new Spec("Registry with handlers should register attributes") + .Given(RegistryWithHandlersIsCreated) + .When(GettingRegisteredAttribute) + .Then(AttributeShouldNotBeNull) + .ExecuteAsync(); + } + + private IPacketHandler? ResultHandler; + private PacketHeaderAttribute? ResultAttribute; + + private class TestPacketHandler : PacketHandler + { + public override Task ExecuteAsync(WhisperPacket packet, ClientSession clientSession) + { + return Task.CompletedTask; + } + } + + private void RegistryWithHandlersIsCreated() + { + Registry = new PacketHandlerRegistry(new List { new TestPacketHandler() }); + } + + private void GettingUnregisteredHandler() + { + ResultHandler = Registry.GetHandler(typeof(string)); + } + + private void GettingUnregisteredAttribute() + { + ResultAttribute = Registry.GetPacketAttribute(typeof(string)); + } + + private void GettingRegisteredHandler() + { + ResultHandler = Registry.GetHandler(typeof(WhisperPacket)); + } + + private void GettingRegisteredAttribute() + { + ResultAttribute = Registry.GetPacketAttribute(typeof(WhisperPacket)); + } + + private void HandlerShouldBeNull() + { + Assert.IsNull(ResultHandler); + } + + private void AttributeShouldBeNull() + { + Assert.IsNull(ResultAttribute); + } + + private void HandlerShouldNotBeNull() + { + Assert.IsNotNull(ResultHandler); + } + + private void AttributeShouldNotBeNull() + { + Assert.IsNotNull(ResultAttribute); + } + } +} diff --git a/test/NosCore.GameObject.Tests/Services/QuestService/QuestServiceTests.cs b/test/NosCore.GameObject.Tests/Services/QuestService/QuestServiceTests.cs new file mode 100644 index 000000000..7e2b9ec2d --- /dev/null +++ b/test/NosCore.GameObject.Tests/Services/QuestService/QuestServiceTests.cs @@ -0,0 +1,389 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.Data.StaticEntities; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.GameObject.Services.QuestService; +using NosCore.Packets.Enumerations; +using NosCore.Tests.Shared; +using Serilog; +using SpecLight; + +namespace NosCore.GameObject.Tests.Services.QuestService +{ + [TestClass] + public class QuestServiceTests + { + private static readonly ILogger Logger = new Mock().Object; + private GameObject.Services.QuestService.QuestService Service = null!; + private ClientSession Session = null!; + private List Scripts = null!; + private List Quests = null!; + private List QuestObjectives = null!; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + Session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(0)!; + Session.Character.Quests = new ConcurrentDictionary(); + Session.Character.Level = 50; + + Scripts = new List(); + Quests = new List + { + new QuestDto + { + QuestId = 1, + QuestType = QuestType.GoTo, + LevelMin = 1, + LevelMax = 99, + IsDaily = false, + IsSecondary = true, + TargetMap = 0, + TargetX = 5, + TargetY = 5 + }, + new QuestDto + { + QuestId = 2, + QuestType = QuestType.Hunt, + LevelMin = 1, + LevelMax = 99, + IsDaily = true, + IsSecondary = true + }, + new QuestDto + { + QuestId = 3, + QuestType = QuestType.Hunt, + LevelMin = 60, + LevelMax = 99, + IsDaily = false, + IsSecondary = true + }, + new QuestDto + { + QuestId = 4, + QuestType = QuestType.Hunt, + LevelMin = 1, + LevelMax = 30, + IsDaily = false, + IsSecondary = true + }, + new QuestDto + { + QuestId = 5, + QuestType = QuestType.Hunt, + LevelMin = 1, + LevelMax = 99, + IsDaily = false, + IsSecondary = false + } + }; + + QuestObjectives = new List + { + new QuestObjectiveDto { QuestId = 1, FirstData = 1 }, + new QuestObjectiveDto { QuestId = 2, FirstData = 1 }, + new QuestObjectiveDto { QuestId = 3, FirstData = 1 }, + new QuestObjectiveDto { QuestId = 4, FirstData = 1 }, + new QuestObjectiveDto { QuestId = 5, FirstData = 1 } + }; + + Service = new GameObject.Services.QuestService.QuestService( + Scripts, + TestHelpers.Instance.WorldConfiguration, + Quests, + QuestObjectives, + Logger, + TestHelpers.Instance.Clock, + TestHelpers.Instance.LogLanguageLocalizer); + } + + [TestMethod] + public async Task AddingQuestShouldAddToCharacterQuests() + { + await new Spec("Adding quest should add to character quests") + .WhenAsync(AddingValidQuest) + .Then(QuestShouldBeAdded) + .ExecuteAsync(); + } + + [TestMethod] + public async Task AddingQuestWhenLevelTooLowShouldFail() + { + await new Spec("Adding quest when level too low should fail") + .Given(CharacterLevelIsTooLow) + .WhenAsync(AddingHighLevelQuest) + .Then(QuestShouldNotBeAdded) + .And(AddResultShouldBeFalse) + .ExecuteAsync(); + } + + [TestMethod] + public async Task AddingQuestWhenLevelTooHighShouldFail() + { + await new Spec("Adding quest when level too high should fail") + .WhenAsync(AddingLowLevelQuest) + .Then(QuestShouldNotBeAdded) + .And(AddResultShouldBeFalse) + .ExecuteAsync(); + } + + [TestMethod] + public async Task AddingAlreadyCompletedQuestShouldFail() + { + await new Spec("Adding already completed quest should fail") + .Given(QuestAlreadyCompleted) + .WhenAsync(AddingSameQuest) + .Then(QuestShouldStillBeOne) + .And(AddResultShouldBeFalse) + .ExecuteAsync(); + } + + [TestMethod] + public async Task AddingDailyQuestAfterCompletionShouldSucceed() + { + await new Spec("Adding daily quest after completion should succeed") + .Given(DailyQuestCompletedYesterday) + .WhenAsync(AddingSameDailyQuest) + .Then(DailyQuestShouldBeAddedAgain) + .ExecuteAsync(); + } + + [TestMethod] + public async Task AddingNonSecondaryQuestWhenOneExistsShouldFail() + { + await new Spec("Adding non-secondary quest when one exists should fail") + .Given(NonSecondaryQuestAlreadyActive) + .WhenAsync(AddingAnotherNonSecondaryQuest) + .Then(QuestShouldStillBeOne) + .And(AddResultShouldBeFalse) + .ExecuteAsync(); + } + + [TestMethod] + public async Task ValidateGoToQuestShouldSucceedWhenAtLocation() + { + await new Spec("Validate GoTo quest should succeed when at location") + .Given(CharacterHasGoToQuest) + .And(CharacterIsAtTargetLocation) + .WhenAsync(ValidatingQuest) + .Then(ValidationShouldSucceed) + .ExecuteAsync(); + } + + [TestMethod] + public async Task ValidateGoToQuestShouldFailWhenNotAtLocation() + { + await new Spec("Validate GoTo quest should fail when not at location") + .Given(CharacterHasGoToQuest) + .And(CharacterIsNotAtTargetLocation) + .WhenAsync(ValidatingQuest) + .Then(ValidationShouldFail) + .ExecuteAsync(); + } + + [TestMethod] + public async Task ValidateNonExistentQuestShouldFail() + { + await new Spec("Validate non-existent quest should fail") + .WhenAsync(ValidatingNonExistentQuest) + .Then(ValidationShouldFail) + .ExecuteAsync(); + } + + private bool AddQuestResult; + private bool ValidateResult; + + private async Task AddingValidQuest() + { + AddQuestResult = await Service.AddQuestAsync(Session.Character, QuestActionType.Validate, 1); + } + + private void CharacterLevelIsTooLow() + { + Session.Character.Level = 10; + } + + private async Task AddingHighLevelQuest() + { + AddQuestResult = await Service.AddQuestAsync(Session.Character, QuestActionType.Validate, 3); + } + + private async Task AddingLowLevelQuest() + { + AddQuestResult = await Service.AddQuestAsync(Session.Character, QuestActionType.Validate, 4); + } + + private void QuestAlreadyCompleted() + { + var quest = new Quest + { + QuestId = 1, + QuestType = QuestType.Hunt, + IsDaily = false, + QuestObjectives = new List() + }; + Session.Character.Quests.TryAdd(Guid.NewGuid(), new CharacterQuest + { + QuestId = 1, + Quest = quest, + CompletedOn = TestHelpers.Instance.Clock.GetCurrentInstant() + }); + } + + private async Task AddingSameQuest() + { + AddQuestResult = await Service.AddQuestAsync(Session.Character, QuestActionType.Validate, 1); + } + + private void DailyQuestCompletedYesterday() + { + var quest = new Quest + { + QuestId = 2, + QuestType = QuestType.Hunt, + IsDaily = true, + QuestObjectives = new List() + }; + Session.Character.Quests.TryAdd(Guid.NewGuid(), new CharacterQuest + { + QuestId = 2, + Quest = quest, + CompletedOn = TestHelpers.Instance.Clock.GetCurrentInstant().Minus(NodaTime.Duration.FromDays(2)) + }); + } + + private async Task AddingSameDailyQuest() + { + AddQuestResult = await Service.AddQuestAsync(Session.Character, QuestActionType.Validate, 2); + } + + private void NonSecondaryQuestAlreadyActive() + { + var quest = new Quest + { + QuestId = 5, + QuestType = QuestType.Hunt, + IsSecondary = false, + QuestObjectives = new List() + }; + Session.Character.Quests.TryAdd(Guid.NewGuid(), new CharacterQuest + { + QuestId = 5, + Quest = quest, + CompletedOn = null + }); + } + + private async Task AddingAnotherNonSecondaryQuest() + { + AddQuestResult = await Service.AddQuestAsync(Session.Character, QuestActionType.Validate, 5); + } + + private void CharacterHasGoToQuest() + { + var quest = new Quest + { + QuestId = 1, + QuestType = QuestType.GoTo, + TargetMap = 0, + TargetX = 5, + TargetY = 5, + QuestObjectives = new List() + }; + Session.Character.Quests.TryAdd(Guid.NewGuid(), new CharacterQuest + { + QuestId = 1, + Quest = quest, + CompletedOn = null + }); + } + + private void CharacterIsAtTargetLocation() + { + Session.Character.MapId = 0; + Session.Character.MapX = 5; + Session.Character.MapY = 5; + } + + private void CharacterIsNotAtTargetLocation() + { + Session.Character.MapId = 0; + Session.Character.MapX = 50; + Session.Character.MapY = 50; + } + + private async Task ValidatingQuest() + { + ValidateResult = await Service.ValidateQuestAsync(Session.Character, 1); + } + + private async Task ValidatingNonExistentQuest() + { + ValidateResult = await Service.ValidateQuestAsync(Session.Character, 999); + } + + private void QuestShouldBeAdded() + { + Assert.IsTrue(Session.Character.Quests.Values.Any(q => q.QuestId == 1)); + Assert.IsTrue(AddQuestResult); + } + + private void QuestShouldNotBeAdded() + { + Assert.IsFalse(Session.Character.Quests.Values.Any(q => q.QuestId == 3 || q.QuestId == 4)); + } + + private void QuestShouldStillBeOne() + { + Assert.AreEqual(1, Session.Character.Quests.Count); + } + + private void DailyQuestShouldBeAddedAgain() + { + Assert.AreEqual(2, Session.Character.Quests.Values.Count(q => q.QuestId == 2)); + } + + private void AddResultShouldBeFalse() + { + Assert.IsFalse(AddQuestResult); + } + + private void ValidationShouldSucceed() + { + Assert.IsTrue(ValidateResult); + } + + private void ValidationShouldFail() + { + Assert.IsFalse(ValidateResult); + } + } +} diff --git a/test/NosCore.GameObject.Tests/Services/SaveService/SaveServiceTests.cs b/test/NosCore.GameObject.Tests/Services/SaveService/SaveServiceTests.cs new file mode 100644 index 000000000..32d796e6a --- /dev/null +++ b/test/NosCore.GameObject.Tests/Services/SaveService/SaveServiceTests.cs @@ -0,0 +1,161 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System; +using System.Threading.Tasks; +using Microsoft.EntityFrameworkCore; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.Dao; +using NosCore.Dao.Interfaces; +using NosCore.Data.Dto; +using NosCore.Database; +using NosCore.Database.Entities; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.GameObject.Services.ItemGenerationService; +using NosCore.GameObject.Services.MinilandService; +using NosCore.GameObject.Services.SaveService; +using NosCore.Tests.Shared; +using Serilog; +using SpecLight; + +namespace NosCore.GameObject.Tests.Services.SaveService +{ + [TestClass] + public class SaveServiceTests + { + private static readonly ILogger Logger = new Mock().Object; + private ClientSession Session = null!; + private ISaveService Service = null!; + private IItemGenerationService ItemProvider = null!; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + ItemProvider = TestHelpers.Instance.GenerateItemProvider(); + + var optionsBuilder = new DbContextOptionsBuilder().UseInMemoryDatabase( + Guid.NewGuid().ToString()); + NosCoreContext ContextBuilder() => new NosCoreContext(optionsBuilder.Options); + + var itemInstanceDao = new Dao(Logger, ContextBuilder); + var inventoryItemInstanceDao = new Dao(Logger, ContextBuilder); + var staticBonusDao = new Dao(Logger, ContextBuilder); + var quicklistEntriesDao = new Dao(Logger, ContextBuilder); + var titleDao = new Dao(Logger, ContextBuilder); + var characterQuestDao = new Dao(Logger, ContextBuilder); + + var minilandService = new Mock(); + minilandService.Setup(s => s.GetMiniland(It.IsAny())) + .Returns(new NosCore.GameObject.Services.MinilandService.Miniland { MinilandMessage = "Test" }); + + Service = new GameObject.Services.SaveService.SaveService( + TestHelpers.Instance.CharacterDao, + itemInstanceDao, + inventoryItemInstanceDao, + TestHelpers.Instance.AccountDao, + staticBonusDao, + quicklistEntriesDao, + TestHelpers.Instance.MinilandDao, + minilandService.Object, + titleDao, + characterQuestDao, + Logger, + TestHelpers.Instance.LogLanguageLocalizer); + } + + [TestMethod] + public async Task SavingCharacterShouldPersistData() + { + await new Spec("Saving character should persist data") + .GivenAsync(CharacterHasModifiedGold) + .WhenAsync(SavingCharacter) + .ThenAsync(GoldShouldBePersisted) + .ExecuteAsync(); + } + + [TestMethod] + public async Task SavingCharacterShouldPersistInventory() + { + await new Spec("Saving character should persist inventory") + .GivenAsync(CharacterHasItemsInInventory) + .WhenAsync(SavingCharacter) + .ThenAsync(InventoryShouldBePersisted) + .ExecuteAsync(); + } + + [TestMethod] + public async Task SavingNonCharacterEntityShouldNotThrow() + { + await new Spec("Saving non-character entity should not throw") + .WhenAsync(SavingNonCharacterEntity) + .Then(NoExceptionShouldBeThrown) + .ExecuteAsync(); + } + + private bool SaveCompleted; + + private async Task CharacterHasModifiedGold() + { + Session.Character.Gold = 999999; + } + + private async Task CharacterHasItemsInInventory() + { + var item = ItemProvider.Create(1012, 50); + Session.Character.InventoryService.AddItemToPocket( + GameObject.Services.InventoryService.InventoryItemInstance.Create(item, Session.Character.CharacterId)); + } + + private async Task SavingCharacter() + { + await Service.SaveAsync(Session.Character); + SaveCompleted = true; + } + + private async Task SavingNonCharacterEntity() + { + var mockEntity = new Mock(); + await Service.SaveAsync(mockEntity.Object); + SaveCompleted = true; + } + + private async Task GoldShouldBePersisted() + { + var character = await TestHelpers.Instance.CharacterDao.FirstOrDefaultAsync(c => + c.CharacterId == Session.Character.CharacterId); + Assert.IsNotNull(character); + Assert.AreEqual(999999, character.Gold); + } + + private async Task InventoryShouldBePersisted() + { + var character = await TestHelpers.Instance.CharacterDao.FirstOrDefaultAsync(c => + c.CharacterId == Session.Character.CharacterId); + Assert.IsNotNull(character); + } + + private void NoExceptionShouldBeThrown() + { + Assert.IsTrue(SaveCompleted); + } + } +} diff --git a/test/NosCore.GameObject.Tests/Services/ShopService/ShopRegistryTests.cs b/test/NosCore.GameObject.Tests/Services/ShopService/ShopRegistryTests.cs new file mode 100644 index 000000000..ed3e8359c --- /dev/null +++ b/test/NosCore.GameObject.Tests/Services/ShopService/ShopRegistryTests.cs @@ -0,0 +1,170 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Linq; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using NosCore.GameObject.Services.ShopService; +using SpecLight; + +namespace NosCore.GameObject.Tests.Services.ShopService +{ + [TestClass] + public class ShopRegistryTests + { + private IShopRegistry Registry = null!; + + [TestInitialize] + public void Setup() + { + Registry = new ShopRegistry(); + } + + [TestMethod] + public async Task RegisterPlayerShopShouldAddShop() + { + await new Spec("Register player shop should add shop") + .Given(ShopIsCreated) + .When(RegisteringPlayerShop) + .Then(ShopShouldBeRetrievable) + .ExecuteAsync(); + } + + [TestMethod] + public async Task GetPlayerShopShouldReturnNullForUnknownCharacter() + { + await new Spec("Get player shop should return null for unknown character") + .When(GettingUnknownShop) + .Then(ResultShouldBeNull) + .ExecuteAsync(); + } + + [TestMethod] + public async Task UnregisterPlayerShopShouldRemoveShop() + { + await new Spec("Unregister player shop should remove shop") + .Given(ShopIsRegistered) + .When(UnregisteringPlayerShop) + .Then(ShopShouldNotExist) + .ExecuteAsync(); + } + + [TestMethod] + public async Task GetAllPlayerShopsShouldReturnAllShops() + { + await new Spec("Get all player shops should return all shops") + .Given(MultipleShopsAreRegistered) + .When(GettingAllShops) + .Then(AllShopsShouldBeReturned) + .ExecuteAsync(); + } + + [TestMethod] + public async Task RegisterPlayerShopShouldOverwriteExisting() + { + await new Spec("Register player shop should overwrite existing") + .Given(ShopIsRegistered) + .When(RegisteringNewShopForSameCharacter) + .Then(NewShopShouldReplace) + .ExecuteAsync(); + } + + private Shop? TestShop; + private Shop? NewShop; + private Shop? ResultShop; + private int ShopCount; + private const long TestCharacterId = 1; + private const long TestCharacterId2 = 2; + + private void ShopIsCreated() + { + TestShop = new Shop { ShopId = 1 }; + } + + private void ShopIsRegistered() + { + ShopIsCreated(); + Registry.RegisterPlayerShop(TestCharacterId, TestShop!); + } + + private void MultipleShopsAreRegistered() + { + TestShop = new Shop { ShopId = 1 }; + NewShop = new Shop { ShopId = 2 }; + Registry.RegisterPlayerShop(TestCharacterId, TestShop); + Registry.RegisterPlayerShop(TestCharacterId2, NewShop); + } + + private void RegisteringPlayerShop() + { + Registry.RegisterPlayerShop(TestCharacterId, TestShop!); + } + + private void GettingUnknownShop() + { + ResultShop = Registry.GetPlayerShop(9999); + } + + private void UnregisteringPlayerShop() + { + Registry.UnregisterPlayerShop(TestCharacterId); + } + + private void GettingAllShops() + { + ShopCount = Registry.GetAllPlayerShops().Count(); + } + + private void RegisteringNewShopForSameCharacter() + { + NewShop = new Shop { ShopId = 99 }; + Registry.RegisterPlayerShop(TestCharacterId, NewShop); + } + + private void ShopShouldBeRetrievable() + { + var result = Registry.GetPlayerShop(TestCharacterId); + Assert.IsNotNull(result); + Assert.AreEqual(1, result.ShopId); + } + + private void ResultShouldBeNull() + { + Assert.IsNull(ResultShop); + } + + private void ShopShouldNotExist() + { + var result = Registry.GetPlayerShop(TestCharacterId); + Assert.IsNull(result); + } + + private void AllShopsShouldBeReturned() + { + Assert.AreEqual(2, ShopCount); + } + + private void NewShopShouldReplace() + { + var result = Registry.GetPlayerShop(TestCharacterId); + Assert.IsNotNull(result); + Assert.AreEqual(99, result.ShopId); + } + } +} diff --git a/test/NosCore.GameObject.Tests/Services/SkillService/SkillServiceTests.cs b/test/NosCore.GameObject.Tests/Services/SkillService/SkillServiceTests.cs new file mode 100644 index 000000000..7ea268e2f --- /dev/null +++ b/test/NosCore.GameObject.Tests/Services/SkillService/SkillServiceTests.cs @@ -0,0 +1,130 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.Dao.Interfaces; +using NosCore.Data.Dto; +using NosCore.Data.StaticEntities; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.GameObject.Services.SkillService; +using NosCore.Tests.Shared; +using Serilog; +using SpecLight; + +namespace NosCore.GameObject.Tests.Services.SkillService +{ + [TestClass] + public class SkillServiceTests + { + private static readonly ILogger Logger = new Mock().Object; + private ISkillService Service = null!; + private Mock> CharacterSkillDao = null!; + private List Skills = null!; + private ClientSession Session = null!; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + + CharacterSkillDao = new Mock>(); + Skills = new List + { + new SkillDto { SkillVNum = 1 }, + new SkillDto { SkillVNum = 2 }, + new SkillDto { SkillVNum = 3 } + }; + + Service = new GameObject.Services.SkillService.SkillService( + CharacterSkillDao.Object, + Skills); + } + + [TestMethod] + public async Task LoadSkillShouldLoadCharacterSkills() + { + await new Spec("Load skill should load character skills") + .Given(CharacterHasSkillsInDatabase) + .WhenAsync(LoadingSkills) + .Then(CharacterShouldHaveSkills) + .ExecuteAsync(); + } + + [TestMethod] + public async Task LoadSkillWithNoSkillsShouldClearSkills() + { + await new Spec("Load skill with no skills should clear skills") + .Given(CharacterHasNoSkillsInDatabase) + .WhenAsync(LoadingSkills) + .Then(CharacterShouldHaveNoSkills) + .ExecuteAsync(); + } + + [TestMethod] + public async Task ServiceCanBeConstructed() + { + await new Spec("Service can be constructed") + .Then(ServiceShouldNotBeNull) + .ExecuteAsync(); + } + + private void CharacterHasSkillsInDatabase() + { + var characterSkills = new List + { + new CharacterSkillDto { Id = Guid.NewGuid(), CharacterId = Session.Character.VisualId, SkillVNum = 1 }, + new CharacterSkillDto { Id = Guid.NewGuid(), CharacterId = Session.Character.VisualId, SkillVNum = 2 } + }; + + CharacterSkillDao.Setup(s => s.Where(It.IsAny>>())) + .Returns(characterSkills); + } + + private void CharacterHasNoSkillsInDatabase() + { + CharacterSkillDao.Setup(s => s.Where(It.IsAny>>())) + .Returns(new List()); + } + + private async Task LoadingSkills() + { + await Service.LoadSkill(Session.Character); + } + + private void CharacterShouldHaveSkills() + { + Assert.IsTrue(Session.Character.Skills.Count > 0); + } + + private void CharacterShouldHaveNoSkills() + { + Assert.AreEqual(0, Session.Character.Skills.Count); + } + + private void ServiceShouldNotBeNull() + { + Assert.IsNotNull(Service); + } + } +} diff --git a/test/NosCore.GameObject.Tests/Services/SpeedCalculationService/SpeedCalculationServiceTests.cs b/test/NosCore.GameObject.Tests/Services/SpeedCalculationService/SpeedCalculationServiceTests.cs index 0222bf88f..46bd57200 100644 --- a/test/NosCore.GameObject.Tests/Services/SpeedCalculationService/SpeedCalculationServiceTests.cs +++ b/test/NosCore.GameObject.Tests/Services/SpeedCalculationService/SpeedCalculationServiceTests.cs @@ -1,19 +1,19 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . @@ -23,19 +23,20 @@ using NosCore.Data.StaticEntities; using NosCore.GameObject.ComponentEntities.Interfaces; using NosCore.Shared.Enumerations; +using SpecLight; namespace NosCore.GameObject.Tests.Services.SpeedCalculationService { [TestClass] public class SpeedCalculationServiceTests { - private readonly GameObject.Services.SpeedCalculationService.SpeedCalculationService _speedCalculationService; - private readonly Mock _speedService; + private readonly GameObject.Services.SpeedCalculationService.SpeedCalculationService SpeedCalculationService; + private readonly Mock SpeedService; public SpeedCalculationServiceTests() { - _speedService = new Mock(); - _speedCalculationService = new GameObject.Services.SpeedCalculationService.SpeedCalculationService(_speedService.Object); + SpeedService = new Mock(); + SpeedCalculationService = new GameObject.Services.SpeedCalculationService.SpeedCalculationService(SpeedService.Object); } [DataTestMethod] @@ -47,12 +48,12 @@ public SpeedCalculationServiceTests() public void DefaultSpeedIsClassSpeed(int characterClassInt) { var characterClass = (CharacterClassType)characterClassInt; - _speedService.Setup(x => x.GetSpeed(characterClass)).Returns((byte)characterClassInt); + SpeedService.Setup(x => x.GetSpeed(characterClass)).Returns((byte)characterClassInt); var charMock = new Mock(); charMock.SetupGet(x => x.Class).Returns(characterClass); - var speed = _speedCalculationService.CalculateSpeed(charMock.Object); + var speed = SpeedCalculationService.CalculateSpeed(charMock.Object); Assert.AreEqual((byte)characterClassInt, speed); } @@ -62,29 +63,36 @@ public void DefaultSpeedIsClassSpeed(int characterClassInt) [DataRow((int)CharacterClassType.Swordsman)] [DataRow((int)CharacterClassType.MartialArtist)] [DataRow((int)CharacterClassType.Adventurer)] - public void VehicleSpeedOverrideDefaultSpeed(int characterClassInt) + public void VehicleSpeedOverridesDefaultSpeed(int characterClassInt) { var characterClass = (CharacterClassType)characterClassInt; - _speedService.Setup(x => x.GetSpeed(characterClass)).Returns((byte)characterClassInt); + SpeedService.Setup(x => x.GetSpeed(characterClass)).Returns((byte)characterClassInt); var charMock = new Mock(); charMock.SetupGet(x => x.Class).Returns(characterClass); charMock.SetupGet(x => x.VehicleSpeed).Returns(50); - var speed = _speedCalculationService.CalculateSpeed(charMock.Object); + var speed = SpeedCalculationService.CalculateSpeed(charMock.Object); Assert.AreEqual(50, speed); } [TestMethod] public void DefaultMonsterSpeedIsNpcMonsterSpeed() + { + new Spec("Default monster speed is npc monster speed") + .Then(MonsterSpeedShouldMatchNpcMonsterDto) + .Execute(); + } + + private void MonsterSpeedShouldMatchNpcMonsterDto() { var charMock = new Mock(); charMock.SetupGet(x => x.NpcMonster).Returns(new NpcMonsterDto { Speed = 50 }); - var speed = _speedCalculationService.CalculateSpeed(charMock.Object); + var speed = SpeedCalculationService.CalculateSpeed(charMock.Object); Assert.AreEqual(50, speed); } } -} \ No newline at end of file +} diff --git a/test/NosCore.GameObject.Tests/Services/TransformationService/TransformationServiceTests.cs b/test/NosCore.GameObject.Tests/Services/TransformationService/TransformationServiceTests.cs new file mode 100644 index 000000000..f55d35368 --- /dev/null +++ b/test/NosCore.GameObject.Tests/Services/TransformationService/TransformationServiceTests.cs @@ -0,0 +1,164 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.Algorithm.ExperienceService; +using NosCore.Algorithm.HeroExperienceService; +using NosCore.Algorithm.JobExperienceService; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.GameObject.Services.TransformationService; +using NosCore.Tests.Shared; +using Serilog; +using SpecLight; + +namespace NosCore.GameObject.Tests.Services.TransformationService +{ + [TestClass] + public class TransformationServiceTests + { + private static readonly ILogger Logger = new Mock().Object; + private ITransformationService Service = null!; + private ClientSession Session = null!; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + Session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; + + Service = new GameObject.Services.TransformationService.TransformationService( + TestHelpers.Instance.Clock, + new Mock().Object, + new Mock().Object, + new Mock().Object, + Logger, + TestHelpers.Instance.LogLanguageLocalizer); + } + + [TestMethod] + public async Task RemovingSpShouldResetMorphValues() + { + await new Spec("Removing SP should reset morph values") + .Given(CharacterHasSpEquipped) + .WhenAsync(RemovingSp) + .Then(MorphShouldBeReset) + .And(SpCooldownShouldBeSet) + .ExecuteAsync(); + } + + [TestMethod] + public async Task ChangingVehicleShouldSetVehicledState() + { + await new Spec("Changing vehicle should set vehicled state") + .WhenAsync(ChangingToVehicle) + .Then(CharacterShouldBeVehicled) + .And(VehicleSpeedShouldBeSet) + .ExecuteAsync(); + } + + [TestMethod] + public async Task RemovingVehicleShouldResetState() + { + await new Spec("Removing vehicle should reset state") + .GivenAsync(CharacterIsVehicled) + .WhenAsync(RemovingVehicle) + .Then(CharacterShouldNotBeVehicled) + .And(VehicleSpeedShouldBeZero) + .ExecuteAsync(); + } + + private void CharacterHasSpEquipped() + { + Session.Character.UseSp = true; + Session.Character.Morph = 100; + Session.Character.MorphUpgrade = 10; + Session.Character.MorphDesign = 5; + } + + private async Task RemovingSp() + { + await Service.RemoveSpAsync(Session.Character); + } + + private async Task ChangingToVehicle() + { + var vehicleItem = new GameObject.Services.ItemGenerationService.Item.Item + { + VNum = 5196, + Speed = 20, + Morph = 2432, + SecondMorph = 0 + }; + await Service.ChangeVehicleAsync(Session.Character, vehicleItem); + } + + private async Task CharacterIsVehicled() + { + var vehicleItem = new GameObject.Services.ItemGenerationService.Item.Item + { + VNum = 5196, + Speed = 20, + Morph = 2432, + SecondMorph = 0 + }; + await Service.ChangeVehicleAsync(Session.Character, vehicleItem); + } + + private async Task RemovingVehicle() + { + await Service.RemoveVehicleAsync(Session.Character); + } + + private void MorphShouldBeReset() + { + Assert.AreEqual(0, Session.Character.Morph); + Assert.AreEqual(0, Session.Character.MorphUpgrade); + Assert.AreEqual(0, Session.Character.MorphDesign); + } + + private void SpCooldownShouldBeSet() + { + Assert.AreEqual(30, Session.Character.SpCooldown); + Assert.IsFalse(Session.Character.UseSp); + } + + private void CharacterShouldBeVehicled() + { + Assert.IsTrue(Session.Character.IsVehicled); + } + + private void VehicleSpeedShouldBeSet() + { + Assert.AreEqual((byte)20, Session.Character.VehicleSpeed); + } + + private void CharacterShouldNotBeVehicled() + { + Assert.IsFalse(Session.Character.IsVehicled); + } + + private void VehicleSpeedShouldBeZero() + { + Assert.AreEqual((byte)0, Session.Character.VehicleSpeed); + } + } +} diff --git a/test/NosCore.GameObject.Tests/Services/WarehouseService/WarehouseServiceTests.cs b/test/NosCore.GameObject.Tests/Services/WarehouseService/WarehouseServiceTests.cs new file mode 100644 index 000000000..054877fbf --- /dev/null +++ b/test/NosCore.GameObject.Tests/Services/WarehouseService/WarehouseServiceTests.cs @@ -0,0 +1,248 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.EntityFrameworkCore; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.Dao; +using NosCore.Dao.Interfaces; +using NosCore.Data.Dto; +using NosCore.Data.Enumerations.Miniland; +using NosCore.Data.WebApi; +using NosCore.Database; +using NosCore.Database.Entities; +using NosCore.GameObject.Services.WarehouseService; +using NosCore.Tests.Shared; +using Serilog; +using SpecLight; + +namespace NosCore.GameObject.Tests.Services.WarehouseService +{ + [TestClass] + public class WarehouseServiceTests + { + private static readonly ILogger Logger = new Mock().Object; + private IWarehouseService Service = null!; + private IDao WarehouseItemDao = null!; + private IDao WarehouseDao = null!; + private IDao ItemInstanceDao = null!; + private long OwnerId; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + + var optionsBuilder = new DbContextOptionsBuilder().UseInMemoryDatabase( + Guid.NewGuid().ToString()); + NosCoreContext ContextBuilder() => new NosCoreContext(optionsBuilder.Options); + + WarehouseItemDao = new Dao(Logger, ContextBuilder); + WarehouseDao = new Dao(Logger, ContextBuilder); + ItemInstanceDao = new Dao(Logger, ContextBuilder); + + Service = new GameObject.Services.WarehouseService.WarehouseService( + WarehouseItemDao, + WarehouseDao, + ItemInstanceDao); + + var session = await TestHelpers.Instance.GenerateSessionAsync(); + OwnerId = session.Character.CharacterId; + } + + [TestMethod] + public void GetMaxSlotsShouldReturnCorrectValue() + { + new Spec("Get max slots should return correct value") + .Then(PersonalWarehouseShouldHave68Slots) + .And(FamilyWarehouseShouldHave49Slots) + .Execute(); + } + + [TestMethod] + public async Task DepositingItemShouldSucceed() + { + await new Spec("Depositing item should succeed") + .WhenAsync(DepositingItem) + .ThenAsync(ItemShouldBeInWarehouse) + .ExecuteAsync(); + } + + [TestMethod] + public async Task DepositingToOccupiedSlotShouldFail() + { + await new Spec("Depositing to occupied slot should fail") + .GivenAsync(SlotIsOccupied) + .WhenAsync(DepositingToSameSlot) + .Then(DepositShouldFail) + .ExecuteAsync(); + } + + [TestMethod] + public async Task WithdrawingItemShouldSucceed() + { + await new Spec("Withdrawing item should succeed") + .GivenAsync(ItemIsInWarehouse) + .WhenAsync(WithdrawingItem) + .Then(WithdrawShouldSucceed) + .ExecuteAsync(); + } + + [TestMethod] + public async Task WithdrawingNonExistentItemShouldFail() + { + await new Spec("Withdrawing non-existent item should fail") + .WhenAsync(WithdrawingNonExistentItem) + .Then(WithdrawShouldFail) + .ExecuteAsync(); + } + + [TestMethod] + public async Task MovingItemShouldSucceed() + { + await new Spec("Moving item should succeed") + .GivenAsync(ItemIsInWarehouse) + .WhenAsync(MovingItemToNewSlot) + .Then(MoveShouldSucceed) + .ExecuteAsync(); + } + + [TestMethod] + public async Task MovingItemToSameSlotShouldFail() + { + await new Spec("Moving item to same slot should fail") + .GivenAsync(ItemIsInWarehouse) + .WhenAsync(MovingItemToSameSlot) + .Then(MoveShouldFail) + .ExecuteAsync(); + } + + [TestMethod] + public async Task GetFreeSlotShouldReturnAvailableSlot() + { + await new Spec("Get free slot should return available slot") + .Then(FreeSlotShouldBeAvailable) + .ExecuteAsync(); + } + + private bool DepositResult; + private bool WithdrawResult; + private bool MoveResult; + private Guid WarehouseItemId; + + private void PersonalWarehouseShouldHave68Slots() + { + Assert.AreEqual(68, Service.GetMaxSlots(WarehouseType.Warehouse)); + } + + private void FamilyWarehouseShouldHave49Slots() + { + Assert.AreEqual(49, Service.GetMaxSlots(WarehouseType.FamilyWareHouse)); + } + + private async Task DepositingItem() + { + var itemInstance = new ItemInstanceDto { Id = Guid.NewGuid(), ItemVNum = 1012, Amount = 1 }; + DepositResult = await Service.DepositItemAsync(OwnerId, WarehouseType.Warehouse, itemInstance, 0); + } + + private async Task SlotIsOccupied() + { + var itemInstance = new ItemInstanceDto { Id = Guid.NewGuid(), ItemVNum = 1012, Amount = 1 }; + await Service.DepositItemAsync(OwnerId, WarehouseType.Warehouse, itemInstance, 0); + } + + private async Task DepositingToSameSlot() + { + var itemInstance = new ItemInstanceDto { Id = Guid.NewGuid(), ItemVNum = 1013, Amount = 1 }; + DepositResult = await Service.DepositItemAsync(OwnerId, WarehouseType.Warehouse, itemInstance, 0); + } + + private async Task ItemIsInWarehouse() + { + var itemInstance = new ItemInstanceDto { Id = Guid.NewGuid(), ItemVNum = 1012, Amount = 1 }; + await Service.DepositItemAsync(OwnerId, WarehouseType.Warehouse, itemInstance, 5); + var items = Service.GetWarehouseItems(OwnerId, WarehouseType.Warehouse); + WarehouseItemId = items.First().Id; + } + + private async Task WithdrawingItem() + { + WithdrawResult = await Service.WithdrawItemAsync(WarehouseItemId); + } + + private async Task WithdrawingNonExistentItem() + { + WithdrawResult = await Service.WithdrawItemAsync(Guid.NewGuid()); + } + + private async Task MovingItemToNewSlot() + { + MoveResult = await Service.MoveItemAsync(OwnerId, WarehouseType.Warehouse, 5, 10); + } + + private async Task MovingItemToSameSlot() + { + MoveResult = await Service.MoveItemAsync(OwnerId, WarehouseType.Warehouse, 5, 5); + } + + private async Task ItemShouldBeInWarehouse() + { + Assert.IsTrue(DepositResult); + var items = Service.GetWarehouseItems(OwnerId, WarehouseType.Warehouse); + Assert.AreEqual(1, items.Count); + } + + private void DepositShouldFail() + { + Assert.IsFalse(DepositResult); + } + + private void WithdrawShouldSucceed() + { + Assert.IsTrue(WithdrawResult); + } + + private void WithdrawShouldFail() + { + Assert.IsFalse(WithdrawResult); + } + + private void MoveShouldSucceed() + { + Assert.IsTrue(MoveResult); + } + + private void MoveShouldFail() + { + Assert.IsFalse(MoveResult); + } + + private void FreeSlotShouldBeAvailable() + { + var freeSlot = Service.GetFreeSlot(OwnerId, WarehouseType.Warehouse); + Assert.IsNotNull(freeSlot); + Assert.AreEqual((short)0, freeSlot.Value); + } + } +} diff --git a/test/NosCore.GameObject.Tests/ShopTests.cs b/test/NosCore.GameObject.Tests/ShopTests.cs index 77e1d6678..28eb535fa 100644 --- a/test/NosCore.GameObject.Tests/ShopTests.cs +++ b/test/NosCore.GameObject.Tests/ShopTests.cs @@ -2,18 +2,18 @@ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . @@ -22,371 +22,293 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; -using Microsoft.Extensions.Options; using Microsoft.VisualStudio.TestTools.UnitTesting; -using Moq; -using NosCore.Algorithm.DignityService; -using NosCore.Algorithm.ExperienceService; -using NosCore.Algorithm.HeroExperienceService; -using NosCore.Algorithm.HpService; -using NosCore.Algorithm.JobExperienceService; -using NosCore.Algorithm.MpService; -using NosCore.Algorithm.ReputationService; -using NosCore.Core.Configuration; -using NosCore.Core.Encryption; -using NosCore.Data.Dto; using NosCore.Data.Enumerations; -using NosCore.Data.Enumerations.Character; -using NosCore.Data.Enumerations.I18N; using NosCore.Data.StaticEntities; -using NosCore.GameObject.InterChannelCommunication.Hubs.FriendHub; -using NosCore.GameObject.Networking; -using NosCore.GameObject.Networking.ClientSession; -using NosCore.GameObject.Services.CharacterService; +using NosCore.GameObject.Infastructure; using NosCore.GameObject.Services.EventLoaderService; -using NosCore.GameObject.Services.ExchangeService; using NosCore.GameObject.Services.InventoryService; using NosCore.GameObject.Services.ItemGenerationService; using NosCore.GameObject.Services.ItemGenerationService.Item; using NosCore.GameObject.Services.MapInstanceAccessService; -using NosCore.GameObject.Services.SpeedCalculationService; -using NosCore.Networking; -using NosCore.Networking.Encoding; -using NosCore.Networking.SessionRef; +using NosCore.GameObject.Services.ShopService; using NosCore.Packets.ClientPackets.Inventory; using NosCore.Packets.Enumerations; using NosCore.Packets.ServerPackets.Shop; -using NosCore.Packets.ServerPackets.UI; -using NosCore.Shared.I18N; using NosCore.Tests.Shared; -using Serilog; -using NosCore.GameObject.Infastructure; -using NosCore.GameObject.Services.ShopService; -using NosCore.GameObject.ComponentEntities.Entities; +using NosCore.Tests.Shared.BDD; +using SpecLight; namespace NosCore.GameObject.Tests { [TestClass] - public class ShopTests + public class ShopTests : SpecBase { - private static readonly ILogger Logger = new Mock().Object; - private IFriendHub? _friendHttpClient; - private IMapInstanceAccessorService? _instanceProvider; - private ClientSession? _session; + private IMapInstanceAccessorService InstanceProvider = null!; + private ItemGenerationService ItemBuilder = null!; [TestInitialize] - public async Task SetupAsync() + public override async Task SetupAsync() { - Broadcaster.Reset(); - await TestHelpers.ResetAsync(); - _friendHttpClient = new Mock().Object; + await base.SetupAsync(); TestHelpers.Instance.WorldConfiguration.Value.BackpackSize = 3; - _instanceProvider = TestHelpers.Instance.MapInstanceAccessorService; - _session = await TestHelpers.Instance.GenerateSessionAsync(); + InstanceProvider = TestHelpers.Instance.MapInstanceAccessorService; } + [TestMethod] + public async Task BuyingFromNonExistentSlotShouldFail() + { + await new Spec("Buying from non existent slot should fail") + .Given(CharacterHasGold_, 9999999999L) + .WhenAsync(AttemptingToBuyFromWrongSlotAsync) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); + } [TestMethod] - public async Task UserCanNotShopNonExistingSlotAsync() + public async Task BuyingMoreThanShopQuantityShouldFail() { - _session!.Character.Gold = 9999999999; - var items = new List - { - new Item {Type = NoscorePocketType.Etc, VNum = 1, IsSoldable = true, Price = 500000} - }; - var itemBuilder = new ItemGenerationService(items, - new EventLoaderService, IUseItemEventHandler>(new List>>()), Logger, TestHelpers.Instance.LogLanguageLocalizer); + await new Spec("Buying more than shop quantity should fail") + .Given(CharacterHasGold_, 9999999999L) + .WhenAsync(AttemptingToBuyMoreThanAvailableAsync) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); + } - var list = new ConcurrentDictionary(); - list.TryAdd(0, new ShopItem { Slot = 0, ItemInstance = itemBuilder.Create(1, -1), Type = 0 }); - var shop = new Shop - { - ShopItems = list - }; - await _session.Character.BuyAsync(shop, 1, 99); - Assert.IsNull(_session.LastPackets.FirstOrDefault()); + [TestMethod] + public async Task BuyingWithoutEnoughGoldShouldFail() + { + await new Spec("Buying without enough gold should fail") + .Given(CharacterHasGold_, 500000L) + .WhenAsync(AttemptingToBuy_ItemsAsync, 99) + .Then(ShouldReceiveNotEnoughGoldMessage) + .ExecuteAsync(); } [TestMethod] - public async Task UserCantShopMoreThanQuantityNonExistingSlotAsync() + public async Task BuyingWithoutEnoughReputationShouldFail() { - _session!.Character.Gold = 9999999999; - var items = new List - { - new Item {Type = NoscorePocketType.Etc, VNum = 1, IsSoldable = true, Price = 500000} - }; - var itemBuilder = new ItemGenerationService(items, - new EventLoaderService, IUseItemEventHandler>(new List>>()), Logger, TestHelpers.Instance.LogLanguageLocalizer); + await new Spec("Buying without enough reputation should fail") + .Given(CharacterHasReputation_, 500000L) + .WhenAsync(AttemptingToBuyReputationItemAsync) + .Then(ShouldReceiveReputationError) + .ExecuteAsync(); + } - var list = new ConcurrentDictionary(); - list.TryAdd(0, new ShopItem { Slot = 0, ItemInstance = itemBuilder.Create(1, -1), Type = 0, Amount = 98 }); - var shop = new Shop - { - ShopItems = list - }; - await _session.Character.BuyAsync(shop, 0, 99); - Assert.IsNull(_session.LastPackets.FirstOrDefault()); + [TestMethod] + public async Task BuyingWithoutInventorySpaceShouldFail() + { + await new Spec("Buying without inventory space should fail") + .Given(CharacterHasGoldButFullInventory) + .WhenAsync(AttemptingToBuyWithFullInventoryAsync) + .Then(ShouldReceiveNotEnoughSpaceMessage) + .ExecuteAsync(); } [TestMethod] - public async Task UserCantShopWithoutMoneyAsync() + public async Task SuccessfulPurchaseShouldUpdateGoldAndInventory() { - _session!.Character.Gold = 500000; - var items = new List - { - new Item {Type = NoscorePocketType.Etc, VNum = 1, IsSoldable = true, Price = 500000} - }; - var itemBuilder = new ItemGenerationService(items, - new EventLoaderService, IUseItemEventHandler>(new List>>()), Logger, TestHelpers.Instance.LogLanguageLocalizer); + await new Spec("Successful purchase should update gold and inventory") + .Given(CharacterHasGoldAndPartialInventory) + .WhenAsync(Buying998ItemsAt1GoldEachAsync) + .Then(AllInventorySlotsShouldHave_Items, 999) + .And(GoldShouldBeDeducted) + .ExecuteAsync(); + } + [TestMethod] + public async Task SuccessfulReputationPurchaseShouldUpdateReputation() + { + await new Spec("Successful reputation purchase should update reputation") + .Given(CharacterHasReputationAndPartialInventory) + .WhenAsync(Buying998ItemsAt1ReputationEachAsync) + .Then(AllInventorySlotsShouldHave_Items, 999) + .And(ReputationShouldBeDeducted) + .ExecuteAsync(); + } + + private Shop CreateShop(ItemGenerationService itemBuilder, short amount = -1, long? price = null, byte slot = 0) + { var list = new ConcurrentDictionary(); - list.TryAdd(0, new ShopItem { Slot = 0, ItemInstance = itemBuilder.Create(1, -1), Type = 0 }); - var shop = new Shop + var shopItem = new ShopItem { - ShopItems = list + Slot = slot, + ItemInstance = itemBuilder.Create(1, amount), + Type = 0 }; - await _session.Character.BuyAsync(shop, 0, 99); - - var packet = (SMemoiPacket?)_session.LastPackets.FirstOrDefault(s => s is SMemoiPacket); - Assert.IsTrue(packet?.Message == Game18NConstString.NotEnoughGold5); + if (amount > 0) + { + shopItem.Amount = amount; + } + if (price.HasValue) + { + shopItem.Price = price.Value; + } + list.TryAdd(slot, shopItem); + return new Shop { ShopItems = list }; } - [TestMethod] - public async Task UserCantShopWithoutReputAsync() + private ItemGenerationService CreateItemBuilder(long price = 500000, long reputPrice = 0) { - _session!.Character.Reput = 500000; var items = new List { - new Item {Type = NoscorePocketType.Etc, VNum = 1, IsSoldable = true, ReputPrice = 500000} + new Item { Type = NoscorePocketType.Etc, VNum = 1, IsSoldable = true, Price = price, ReputPrice = reputPrice } }; - var itemBuilder = new ItemGenerationService(items, - new EventLoaderService, IUseItemEventHandler>(new List>>()), Logger, TestHelpers.Instance.LogLanguageLocalizer); + return new ItemGenerationService(items, + new EventLoaderService, IUseItemEventHandler>( + new List>>()), + Logger, + TestHelpers.Instance.LogLanguageLocalizer); + } - var list = new ConcurrentDictionary(); - list.TryAdd(0, new ShopItem { Slot = 0, ItemInstance = itemBuilder.Create(1, -1), Type = 0 }); - var shop = new Shop - { - ShopItems = list - }; - await _session.Character.BuyAsync(shop, 0, 99); + private void CharacterHasGold_(long gold) + { + CharacterHasGold(gold); + } - var packet = (SMemoiPacket?)_session.LastPackets.FirstOrDefault(s => s is SMemoiPacket); - Assert.IsTrue(packet?.Message == Game18NConstString.ReputationNotHighEnough); + private void CharacterHasReputation_(long reput) + { + Session.Character.Reput = reput; } - [TestMethod] - public async Task UserCantShopWithoutPlaceAsync() + private async Task AttemptingToBuyFromWrongSlotAsync() { - _session!.Character.Gold = 500000; + var itemBuilder = CreateItemBuilder(); + var shop = CreateShop(itemBuilder); + await Session.Character.BuyAsync(shop, 1, 99); + } - var items = new List - { - new Item {Type = NoscorePocketType.Etc, VNum = 1, IsSoldable = true, Price = 1} - }; - var itemBuilder = new ItemGenerationService(items, - new EventLoaderService, IUseItemEventHandler>(new List>>()), Logger, TestHelpers.Instance.LogLanguageLocalizer); - _session.Character.ItemProvider = itemBuilder; + + private async Task AttemptingToBuyMoreThanAvailableAsync() + { + var itemBuilder = CreateItemBuilder(); var list = new ConcurrentDictionary(); - list.TryAdd(0, new ShopItem { Slot = 0, ItemInstance = itemBuilder.Create(1, -1), Type = 0 }); - var shop = new Shop + list.TryAdd(0, new ShopItem { - ShopItems = list - }; - _session!.Character.InventoryService.AddItemToPocket( - InventoryItemInstance.Create(itemBuilder.Create(1, 999), _session.Character.CharacterId), - NoscorePocketType.Etc, 0); - _session.Character.InventoryService.AddItemToPocket( - InventoryItemInstance.Create(itemBuilder.Create(1, 999), _session.Character.CharacterId), - NoscorePocketType.Etc, 1); - _session.Character.InventoryService.AddItemToPocket( - InventoryItemInstance.Create(itemBuilder.Create(1, 999), _session.Character.CharacterId), - NoscorePocketType.Etc, 2); - - await _session.Character.BuyAsync(shop, 0, 999); - var packet = (MsgiPacket?)_session.LastPackets.FirstOrDefault(s => s is MsgiPacket); - Assert.IsTrue(packet?.Message == Game18NConstString.NotEnoughSpace); + Slot = 0, + ItemInstance = itemBuilder.Create(1, -1), + Type = 0, + Amount = 98 + }); + var shop = new Shop { ShopItems = list }; + await Session.Character.BuyAsync(shop, 0, 99); } - [TestMethod] - public async Task UserCanShopAsync() + private async Task AttemptingToBuy_ItemsAsync(int value) { - _session!.Character.Gold = 500000; + var itemBuilder = CreateItemBuilder(); + var shop = CreateShop(itemBuilder); - var items = new List - { - new Item {Type = NoscorePocketType.Etc, VNum = 1, IsSoldable = true, Price = 1} - }; - var itemBuilder = new ItemGenerationService(items, - new EventLoaderService, IUseItemEventHandler>(new List>>()), Logger, TestHelpers.Instance.LogLanguageLocalizer); - _session.Character.ItemProvider = itemBuilder; - var list = new ConcurrentDictionary(); - list.TryAdd(0, new ShopItem { Slot = 0, ItemInstance = itemBuilder.Create(1, -1), Type = 0 }); - var shop = new Shop - { - ShopItems = list - }; - _session!.Character.InventoryService.AddItemToPocket( - InventoryItemInstance.Create(itemBuilder.Create(1, 999), _session.Character.CharacterId), - NoscorePocketType.Etc, 0); - _session.Character.InventoryService.AddItemToPocket( - InventoryItemInstance.Create(itemBuilder.Create(1, 999), _session.Character.CharacterId), - NoscorePocketType.Etc, 1); - _session.Character.InventoryService.AddItemToPocket( - InventoryItemInstance.Create(itemBuilder.Create(1, 1), _session.Character.CharacterId), - NoscorePocketType.Etc, 2); + await Session.Character.BuyAsync(shop, 0, 99); + } - await _session.Character.BuyAsync(shop, 0, 998); - Assert.IsTrue(_session.Character.InventoryService.All(s => s.Value.ItemInstance?.Amount == 999)); - Assert.IsTrue(_session.Character.Gold == 499002); + private void ShouldReceiveNotEnoughGoldMessage() + { + var packet = GetLastPacket(); + Assert.IsNotNull(packet); + Assert.AreEqual(Game18NConstString.NotEnoughGold5, packet.Message); } - [TestMethod] - public async Task UserCanShopReputAsync() + private async Task AttemptingToBuyReputationItemAsync() { - _session!.Character.Reput = 500000; + var itemBuilder = CreateItemBuilder(0, 500000); + var shop = CreateShop(itemBuilder); + await Session.Character.BuyAsync(shop, 0, 99); + } - var items = new List - { - new Item {Type = NoscorePocketType.Etc, VNum = 1, IsSoldable = true, ReputPrice = 1} - }; - var itemBuilder = new ItemGenerationService(items, - new EventLoaderService, IUseItemEventHandler>(new List>>()), Logger, TestHelpers.Instance.LogLanguageLocalizer); - _session.Character.ItemProvider = itemBuilder; - var list = new ConcurrentDictionary(); - list.TryAdd(0, new ShopItem { Slot = 0, ItemInstance = itemBuilder.Create(1), Type = 0 }); - var shop = new Shop - { - ShopItems = list - }; - _session.Character.InventoryService.AddItemToPocket( - InventoryItemInstance.Create(itemBuilder.Create(1, 999), _session.Character.CharacterId), + private void ShouldReceiveReputationError() + { + var packet = GetLastPacket(); + Assert.IsNotNull(packet); + Assert.AreEqual(Game18NConstString.ReputationNotHighEnough, packet.Message); + } + + private void CharacterHasGoldButFullInventory() + { + CharacterHasGold(500000); + ItemBuilder = CreateItemBuilder(1); + Session.Character.ItemProvider = ItemBuilder; + Session.Character.InventoryService.AddItemToPocket( + InventoryItemInstance.Create(ItemBuilder.Create(1, 999), Session.Character.CharacterId), NoscorePocketType.Etc, 0); - _session.Character.InventoryService.AddItemToPocket( - InventoryItemInstance.Create(itemBuilder.Create(1, 999), _session.Character.CharacterId), + Session.Character.InventoryService.AddItemToPocket( + InventoryItemInstance.Create(ItemBuilder.Create(1, 999), Session.Character.CharacterId), NoscorePocketType.Etc, 1); - _session.Character.InventoryService.AddItemToPocket( - InventoryItemInstance.Create(itemBuilder.Create(1, 1), _session.Character.CharacterId), + Session.Character.InventoryService.AddItemToPocket( + InventoryItemInstance.Create(ItemBuilder.Create(1, 999), Session.Character.CharacterId), NoscorePocketType.Etc, 2); + } - await _session.Character.BuyAsync(shop, 0, 998); - Assert.IsTrue(_session.Character.InventoryService.All(s => s.Value.ItemInstance?.Amount == 999)); - Assert.IsTrue(_session.Character.Reput == 499002); + private async Task AttemptingToBuyWithFullInventoryAsync() + { + var shop = CreateShop(ItemBuilder, -1, 1); + await Session.Character.BuyAsync(shop, 0, 999); } - private async Task PrepareSessionShopAsync() + private void ShouldReceiveNotEnoughSpaceMessage() { - var conf = Options.Create(new WorldConfiguration { BackpackSize = 3, MaxItemAmount = 999, MaxGoldAmount = 999_999_999 }); - var sessionRefHolder = new SessionRefHolder(); - var packetHandlerRegistry = new NosCore.GameObject.Services.PacketHandlerService.PacketHandlerRegistry(new List()); - var characterInitializationService = new Mock(); - characterInitializationService.Setup(s => s.InitializeAsync(It.IsAny())).Returns(Task.CompletedTask); - var session2 = new ClientSession( - Logger, - packetHandlerRegistry, - new Mock>().Object, - TestHelpers.Instance.LogLanguageLocalizer, - TestHelpers.Instance.PubSubHub.Object, - new Mock().Object, - new WorldPacketHandlingStrategy(Logger, TestHelpers.Instance.LogLanguageLocalizer, sessionRefHolder), - new List(), - new NosCore.GameObject.Services.BroadcastService.SessionRegistry(), - characterInitializationService.Object, - TestHelpers.Instance.GameLanguageLocalizer); - var mockChannel = new Mock(); - mockChannel.Setup(s => s.Id).Returns(Guid.NewGuid().ToString()); - session2.RegisterChannel(mockChannel.Object); - var account = new AccountDto { Name = "AccountTest", Password = new Sha512Hasher().Hash("test") }; - session2.InitializeAccount(account); - session2.SessionId = 1; - - var mapinstance = _instanceProvider!.GetBaseMapById(0)!; - var chara2 = new Character(new InventoryService(new List(), conf, Logger), new Mock().Object, new Mock().Object, new HpService(), new MpService(), new ExperienceService(), new JobExperienceService(), new HeroExperienceService(), new ReputationService(), new DignityService(), TestHelpers.Instance.WorldConfiguration, new Mock().Object, TestHelpers.Instance.SessionGroupFactory, TestHelpers.Instance.SessionRegistry, TestHelpers.Instance.GameLanguageLocalizer) - { - CharacterId = 1, - Name = "chara2", - Slot = 1, - AccountId = 1, - MapId = 1, - State = CharacterState.Active - }; - chara2.MapInstance = mapinstance; - await session2.SetCharacterAsync(chara2); - session2.Account = account; + ShouldReceiveMessage(Game18NConstString.NotEnoughSpace); + } - _session!.Character.Gold = 500000; - var items = new List - { - new Item {Type = NoscorePocketType.Etc, VNum = 1, IsSoldable = true, Price = 1} - }; - var itemBuilder = new ItemGenerationService(items, - new EventLoaderService, IUseItemEventHandler>(new List>>()), Logger, TestHelpers.Instance.LogLanguageLocalizer); - _session.Character.ItemProvider = itemBuilder; - var list = new ConcurrentDictionary(); - var it = itemBuilder.Create(1, 999); - session2.Character.InventoryService.AddItemToPocket( - InventoryItemInstance.Create(it, session2.Character.CharacterId), NoscorePocketType.Etc, 0); - list.TryAdd(0, new ShopItem { Slot = 0, ItemInstance = it, Type = 0, Price = 1, Amount = 999 }); - list.TryAdd(1, new ShopItem { Slot = 1, ItemInstance = it, Type = 0, Price = 1, Amount = 500 }); - session2.Character.Shop = new Shop - { - OwnerCharacter = session2.Character, - ShopItems = list - }; - _session.Character.InventoryService.AddItemToPocket( - InventoryItemInstance.Create(itemBuilder.Create(1, 999), session2.Character.CharacterId), + private void CharacterHasGoldAndPartialInventory() + { + CharacterHasGold(500000); + ItemBuilder = CreateItemBuilder(1); + Session.Character.ItemProvider = ItemBuilder; + Session.Character.InventoryService.AddItemToPocket( + InventoryItemInstance.Create(ItemBuilder.Create(1, 999), Session.Character.CharacterId), NoscorePocketType.Etc, 0); - _session.Character.InventoryService.AddItemToPocket( - InventoryItemInstance.Create(itemBuilder.Create(1, 999), session2.Character.CharacterId), + Session.Character.InventoryService.AddItemToPocket( + InventoryItemInstance.Create(ItemBuilder.Create(1, 999), Session.Character.CharacterId), NoscorePocketType.Etc, 1); - return session2; + Session.Character.InventoryService.AddItemToPocket( + InventoryItemInstance.Create(ItemBuilder.Create(1, 1), Session.Character.CharacterId), + NoscorePocketType.Etc, 2); } - [TestMethod] - public async Task UserCanShopFromSessionAsync() + private async Task Buying998ItemsAt1GoldEachAsync() { - var session2 = await PrepareSessionShopAsync(); - await _session!.Character.BuyAsync(session2.Character.Shop!, 0, 999); - Assert.IsTrue(session2.Character.Gold == 999); - Assert.IsTrue(session2.Character.InventoryService.CountItem(1) == 0); + var shop = CreateShop(ItemBuilder); + await Session.Character.BuyAsync(shop, 0, 998); } - [TestMethod] - public async Task UserCanShopFromSessionPartialAsync() + private void AllInventorySlotsShouldHave_Items(int value) { - var session2 = await PrepareSessionShopAsync(); - await _session!.Character.BuyAsync(session2.Character.Shop!, 0, 998); - Assert.IsTrue(session2.Character.Gold == 998); - Assert.IsTrue(session2.Character.InventoryService.CountItem(1) == 1); + Assert.IsTrue(Session.Character.InventoryService.All(s => s.Value.ItemInstance?.Amount == 999)); } - [TestMethod] - public async Task UserCanNotShopMoreThanShopAsync() + private void GoldShouldBeDeducted() { - var session2 = await PrepareSessionShopAsync(); - await _session!.Character.BuyAsync(session2.Character.Shop!, 1, 501); - Assert.IsTrue(session2.Character.Gold == 0); - Assert.IsTrue(session2.Character.InventoryService.CountItem(1) == 999); + Assert.AreEqual(499002, Session.Character.Gold); } - [TestMethod] - public async Task UserCanShopFullAsync() + private void CharacterHasReputationAndPartialInventory() { - var session2 = await PrepareSessionShopAsync(); - await _session!.Character.BuyAsync(session2.Character.Shop!, 1, 500); - Assert.IsTrue(session2.Character.Gold == 500); - Assert.IsTrue(session2.Character.InventoryService.CountItem(1) == 499); + Session.Character.Reput = 500000; + ItemBuilder = CreateItemBuilder(0, 1); + Session.Character.ItemProvider = ItemBuilder; + Session.Character.InventoryService.AddItemToPocket( + InventoryItemInstance.Create(ItemBuilder.Create(1, 999), Session.Character.CharacterId), + NoscorePocketType.Etc, 0); + Session.Character.InventoryService.AddItemToPocket( + InventoryItemInstance.Create(ItemBuilder.Create(1, 999), Session.Character.CharacterId), + NoscorePocketType.Etc, 1); + Session.Character.InventoryService.AddItemToPocket( + InventoryItemInstance.Create(ItemBuilder.Create(1, 1), Session.Character.CharacterId), + NoscorePocketType.Etc, 2); } - [TestMethod] - public async Task UserCanNotShopTooRichAsync() + private async Task Buying998ItemsAt1ReputationEachAsync() + { + var list = new ConcurrentDictionary(); + list.TryAdd(0, new ShopItem { Slot = 0, ItemInstance = ItemBuilder.Create(1), Type = 0 }); + var shop = new Shop { ShopItems = list }; + await Session.Character.BuyAsync(shop, 0, 998); + } + + private void ReputationShouldBeDeducted() { - var session2 = await PrepareSessionShopAsync(); - session2.Character.Gold = 999_999_999; - await _session!.Character.BuyAsync(session2.Character.Shop!, 0, 999); - Assert.IsTrue(session2.Character.Gold == 999_999_999); - Assert.IsTrue(session2.Character.InventoryService.CountItem(1) == 999); - var packet = (SMemoPacket?)_session.LastPackets.FirstOrDefault(s => s is SMemoPacket); - Assert.IsTrue(packet?.Message == TestHelpers.Instance.GameLanguageLocalizer[LanguageKey.TOO_RICH_SELLER, _session.Account.Language]); + Assert.AreEqual(499002, Session.Character.Reput); } } -} \ No newline at end of file +} diff --git a/test/NosCore.PacketHandlers.Tests/Battle/UseSkillPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Battle/UseSkillPacketHandlerTests.cs new file mode 100644 index 000000000..167fd60e7 --- /dev/null +++ b/test/NosCore.PacketHandlers.Tests/Battle/UseSkillPacketHandlerTests.cs @@ -0,0 +1,178 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Linq; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.GameObject.Networking; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.GameObject.Services.BattleService; +using NosCore.PacketHandlers.Battle; +using NosCore.Packets.ClientPackets.Battle; +using NosCore.Packets.Enumerations; +using NosCore.Packets.ServerPackets.Battle; +using NosCore.Shared.Enumerations; +using NosCore.Tests.Shared; +using Serilog; +using SpecLight; + +namespace NosCore.PacketHandlers.Tests.Battle +{ + [TestClass] + public class UseSkillPacketHandlerTests + { + private UseSkillPacketHandler Handler = null!; + private ClientSession Session = null!; + private ClientSession TargetSession = null!; + private Mock BattleService = null!; + private readonly ILogger Logger = new Mock().Object; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Broadcaster.Reset(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + TargetSession = await TestHelpers.Instance.GenerateSessionAsync(); + BattleService = new Mock(); + + Handler = new UseSkillPacketHandler( + Logger, + TestHelpers.Instance.LogLanguageLocalizer, + BattleService.Object, + TestHelpers.Instance.SessionRegistry); + } + + [TestMethod] + public async Task UsingSkillWhenVehicledShouldSendCancelPacket() + { + await new Spec("Using skill when vehicled should send cancel packet") + .Given(CharacterIsOnMap) + .And(CharacterIsVehicled) + .WhenAsync(UsingSkill) + .Then(ShouldReceiveCancelPacket) + .ExecuteAsync(); + } + + [TestMethod] + public async Task UsingSkillOnUnknownVisualTypeShouldBeIgnored() + { + await new Spec("Using skill on unknown visual type should be ignored") + .Given(CharacterIsOnMap) + .WhenAsync(UsingSkillOnUnknownVisualType) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); + } + + [TestMethod] + public async Task UsingSkillOnNonExistentPlayerShouldBeIgnored() + { + await new Spec("Using skill on nonexistent player should be ignored") + .Given(CharacterIsOnMap) + .WhenAsync(UsingSkillOnNonExistentPlayer) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); + } + + [TestMethod] + public async Task UsingSkillOnExistingPlayerShouldCallBattleService() + { + await new Spec("Using skill on existing player should call battle service") + .Given(CharacterIsOnMap) + .And(TargetIsOnSameMap) + .WhenAsync(UsingSkillOnExistingPlayer) + .Then(BattleServiceShouldBeCalled) + .ExecuteAsync(); + } + + private void CharacterIsOnMap() + { + Session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; + } + + private void TargetIsOnSameMap() + { + TargetSession.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; + } + + private void CharacterIsVehicled() + { + Session.Character.IsVehicled = true; + } + + private async Task UsingSkill() + { + await Handler.ExecuteAsync(new UseSkillPacket + { + CastId = 1, + TargetVisualType = VisualType.Player, + TargetId = Session.Character.VisualId + }, Session); + } + + private async Task UsingSkillOnUnknownVisualType() + { + await Handler.ExecuteAsync(new UseSkillPacket + { + CastId = 1, + TargetVisualType = (VisualType)99, + TargetId = 1 + }, Session); + } + + private async Task UsingSkillOnNonExistentPlayer() + { + await Handler.ExecuteAsync(new UseSkillPacket + { + CastId = 1, + TargetVisualType = VisualType.Player, + TargetId = 99999 + }, Session); + } + + private async Task UsingSkillOnExistingPlayer() + { + await Handler.ExecuteAsync(new UseSkillPacket + { + CastId = 1, + TargetVisualType = VisualType.Player, + TargetId = TargetSession.Character.VisualId + }, Session); + } + + private void ShouldReceiveCancelPacket() + { + var packet = Session.LastPackets.OfType().FirstOrDefault(); + Assert.IsNotNull(packet); + } + + private void NoPacketShouldBeSent() + { + Assert.AreEqual(0, Session.LastPackets.Count); + } + + private void BattleServiceShouldBeCalled() + { + BattleService.Verify(x => x.Hit(It.IsAny(), + It.IsAny(), + It.IsAny()), Times.Once); + } + } +} diff --git a/test/NosCore.PacketHandlers.Tests/Bazaar/CBListPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Bazaar/CBListPacketHandlerTests.cs index ce4b8e3ce..79a973e21 100644 --- a/test/NosCore.PacketHandlers.Tests/Bazaar/CBListPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Bazaar/CBListPacketHandlerTests.cs @@ -2,18 +2,18 @@ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . @@ -35,34 +35,64 @@ using NosCore.Packets.Enumerations; using NosCore.Packets.ServerPackets.Auction; using NosCore.Tests.Shared; +using SpecLight; namespace NosCore.PacketHandlers.Tests.Bazaar { [TestClass] - public class CbListPacketHandlerTest + public class CBListPacketHandlerTests { - private Mock? _bazaarHttpClient; - private CBListPacketHandler? _cblistPacketHandler; - private ClientSession? _session; + private Mock BazaarHttpClient = null!; + private CBListPacketHandler CblistPacketHandler = null!; + private ClientSession Session = null!; [TestInitialize] public async Task SetupAsync() { await TestHelpers.ResetAsync(); Broadcaster.Reset(); - _session = await TestHelpers.Instance.GenerateSessionAsync(); - _bazaarHttpClient = new Mock(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + BazaarHttpClient = new Mock(); var items = new List { new Item {Type = NoscorePocketType.Main, VNum = 1012, IsSoldable = true} }; - _cblistPacketHandler = new CBListPacketHandler(_bazaarHttpClient.Object, items, TestHelpers.Instance.Clock); + CblistPacketHandler = new CBListPacketHandler(BazaarHttpClient.Object, items, TestHelpers.Instance.Clock); } [TestMethod] - public async Task ListShouldReturnEmptyWhenNoItemsAsync() + public async Task ListingShouldReturnEmptyWhenNoItems() { - _bazaarHttpClient!.Setup(b => + await new Spec("Listing should return empty when no items") + .Given(BazaarHasNoItems) + .WhenAsync(ListingBazaarItems) + .Then(ShouldReceiveEmptyList) + .ExecuteAsync(); + } + + [TestMethod] + public async Task ListingShouldReturnValidItems() + { + await new Spec("Listing should return valid items") + .Given(BazaarHasValidItems) + .WhenAsync(ListingBazaarItems) + .Then(ShouldReceiveOneItem) + .ExecuteAsync(); + } + + [TestMethod] + public async Task ListingShouldFilterInvalidItems() + { + await new Spec("Listing should filter invalid items") + .Given(BazaarHasInvalidItems) + .WhenAsync(ListingBazaarItems) + .Then(ShouldReceiveEmptyList) + .ExecuteAsync(); + } + + private void BazaarHasNoItems() + { + BazaarHttpClient.Setup(b => b.GetBazaar( It.IsAny(), It.IsAny(), @@ -74,15 +104,22 @@ public async Task ListShouldReturnEmptyWhenNoItemsAsync() It.IsAny(), It.IsAny()) ).ReturnsAsync(new List()); - await _cblistPacketHandler!.ExecuteAsync(new CBListPacket { ItemVNumFilter = new List() }, _session!); - var lastpacket = (RcbListPacket?)_session!.LastPackets.FirstOrDefault(s => s is RcbListPacket); - Assert.IsTrue(lastpacket?.Items?.Count == 0); } - [TestMethod] - public async Task ListShouldReturnTheItemsAsync() + private async Task ListingBazaarItems() { - _bazaarHttpClient!.Setup(b => + await CblistPacketHandler.ExecuteAsync(new CBListPacket { ItemVNumFilter = new List() }, Session); + } + + private void ShouldReceiveEmptyList() + { + var packet = (RcbListPacket?)Session.LastPackets.FirstOrDefault(s => s is RcbListPacket); + Assert.IsTrue(packet?.Items?.Count == 0); + } + + private void BazaarHasValidItems() + { + BazaarHttpClient.Setup(b => b.GetBazaar( It.IsAny(), It.IsAny(), @@ -103,15 +140,17 @@ public async Task ListShouldReturnTheItemsAsync() ItemInstance = new ItemInstanceDto {ItemVNum = 1012, Amount = 1} } }); - await _cblistPacketHandler!.ExecuteAsync(new CBListPacket { ItemVNumFilter = new List() }, _session!); - var lastpacket = (RcbListPacket?)_session!.LastPackets.FirstOrDefault(s => s is RcbListPacket); - Assert.IsTrue(lastpacket?.Items?.Count == 1); } - [TestMethod] - public async Task ListShouldReturnTheItemsNotValidAsync() + private void ShouldReceiveOneItem() { - _bazaarHttpClient!.Setup(b => + var packet = (RcbListPacket?)Session.LastPackets.FirstOrDefault(s => s is RcbListPacket); + Assert.IsTrue(packet?.Items?.Count == 1); + } + + private void BazaarHasInvalidItems() + { + BazaarHttpClient.Setup(b => b.GetBazaar( It.IsAny(), It.IsAny(), @@ -131,11 +170,6 @@ public async Task ListShouldReturnTheItemsNotValidAsync() ItemInstance = new ItemInstanceDto {ItemVNum = 1012, Amount = 1} } }); - await _cblistPacketHandler!.ExecuteAsync(new CBListPacket { ItemVNumFilter = new List() }, _session!); - var lastpacket = (RcbListPacket?)_session!.LastPackets.FirstOrDefault(s => s is RcbListPacket); - Assert.IsTrue(lastpacket?.Items?.Count == 0); } - - //todo list filter } -} \ No newline at end of file +} diff --git a/test/NosCore.PacketHandlers.Tests/Bazaar/CBuyPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Bazaar/CBuyPacketHandlerTests.cs index 31f61a9b0..ff471cfaa 100644 --- a/test/NosCore.PacketHandlers.Tests/Bazaar/CBuyPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Bazaar/CBuyPacketHandlerTests.cs @@ -2,18 +2,18 @@ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . @@ -41,218 +41,280 @@ using NosCore.Shared.Enumerations; using NosCore.Tests.Shared; using Serilog; +using SpecLight; namespace NosCore.PacketHandlers.Tests.Bazaar { [TestClass] - public class CBuyPacketHandlerTest + public class CBuyPacketHandlerTests { private static readonly ILogger Logger = new Mock().Object; - private Mock? _bazaarHttpClient; - private CBuyPacketHandler? _cbuyPacketHandler; - private Mock>? _itemInstanceDao; - private Mock? _itemProvider; - private ClientSession? _session; + private Mock BazaarHttpClient = null!; + private CBuyPacketHandler CbuyPacketHandler = null!; + private Mock> ItemInstanceDao = null!; + private Mock ItemProvider = null!; + private ClientSession Session = null!; [TestInitialize] public async Task SetupAsync() { await TestHelpers.ResetAsync(); Broadcaster.Reset(); - _session = await TestHelpers.Instance.GenerateSessionAsync(); - _bazaarHttpClient = new Mock(); - _itemInstanceDao = new Mock>(); - _itemProvider = new Mock(); - _cbuyPacketHandler = new CBuyPacketHandler(_bazaarHttpClient.Object, _itemProvider.Object, Logger, - _itemInstanceDao.Object, TestHelpers.Instance.LogLanguageLocalizer); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + BazaarHttpClient = new Mock(); + ItemInstanceDao = new Mock>(); + ItemProvider = new Mock(); + CbuyPacketHandler = new CBuyPacketHandler(BazaarHttpClient.Object, ItemProvider.Object, Logger, + ItemInstanceDao.Object, TestHelpers.Instance.LogLanguageLocalizer); - _bazaarHttpClient.Setup(b => b.GetBazaar(0, null, null, null, null, null, null, null, null)).ReturnsAsync( + BazaarHttpClient.Setup(b => b.GetBazaar(0, null, null, null, null, null, null, null, null)).ReturnsAsync( new List { new BazaarLink { SellerName = "test", BazaarItem = new BazaarItemDto { Price = 50, Amount = 1 }, ItemInstance = new ItemInstanceDto { ItemVNum = 1012, Amount = 1 } }}); - _bazaarHttpClient.Setup(b => b.GetBazaar(2, null, null, null, null, null, null, null, null)).ReturnsAsync( + BazaarHttpClient.Setup(b => b.GetBazaar(2, null, null, null, null, null, null, null, null)).ReturnsAsync( new List { new BazaarLink { - SellerName = _session!.Character.Name, + SellerName = Session.Character.Name, BazaarItem = new BazaarItemDto { Price = 60, Amount = 1 }, ItemInstance = new ItemInstanceDto { ItemVNum = 1012 } }}); - _bazaarHttpClient.Setup(b => b.GetBazaar(3, null, null, null, null, null, null, null, null)).ReturnsAsync( - new List { new BazaarLink + BazaarHttpClient.Setup(b => b.GetBazaar(3, null, null, null, null, null, null, null, null)).ReturnsAsync( + new List { new BazaarLink { SellerName = "test", BazaarItem = new BazaarItemDto { Price = 50, Amount = 99, IsPackage = true }, ItemInstance = new ItemInstanceDto { ItemVNum = 1012, Amount = 99 } }}); - _bazaarHttpClient.Setup(b => b.GetBazaar(1, null, null, null, null, null, null, null, null)).ReturnsAsync(new List()); - _bazaarHttpClient.Setup(b => b.DeleteBazaarAsync(It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(true); + BazaarHttpClient.Setup(b => b.GetBazaar(1, null, null, null, null, null, null, null, null)).ReturnsAsync(new List()); + BazaarHttpClient.Setup(b => b.DeleteBazaarAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(true); } [TestMethod] - public async Task BuyWhenExchangeOrTradeAsync() + public async Task BuyingWhileInShopShouldBeIgnored() { - _session!.Character.InShop = true; - await _session!.HandlePacketsAsync(new[] - { - new CBuyPacket - { - BazaarId = 1, - Price = 50, - Amount = 1, - VNum = 1012 - } - }); ; - Assert.IsNull(_session.LastPackets.FirstOrDefault()); + await new Spec("Buying while in shop should be ignored") + .Given(CharacterIsInShop) + .WhenAsync(BuyingFromBazaarViaMiddleware) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); } [TestMethod] - public async Task BuyWhenNoItemFoundAsync() + public async Task BuyingNonExistentItemShouldShowOfferUpdated() { - await _cbuyPacketHandler!.ExecuteAsync(new CBuyPacket - { - BazaarId = 1, - Price = 50, - Amount = 1, - VNum = 1012 - }, _session!); - var lastpacket = (ModaliPacket?)_session!.LastPackets.FirstOrDefault(s => s is ModaliPacket); - Assert.IsTrue(lastpacket?.Type == 1 && lastpacket?.Message == Game18NConstString.OfferUpdated); + await new Spec("Buying non existent item should show offer updated") + .WhenAsync(BuyingNonExistentItem) + .Then(ShouldReceiveOfferUpdatedMessage) + .ExecuteAsync(); } [TestMethod] - public async Task BuyWhenSellerAsync() + public async Task BuyingOwnItemShouldShowOfferUpdated() { - await _cbuyPacketHandler!.ExecuteAsync(new CBuyPacket - { - BazaarId = 2, - Price = 50, - Amount = 1, - VNum = 1012 - }, _session!); - var lastpacket = (ModaliPacket?)_session!.LastPackets.FirstOrDefault(s => s is ModaliPacket); - Assert.IsTrue(lastpacket?.Type == 1 && lastpacket?.Message == Game18NConstString.OfferUpdated); + await new Spec("Buying own item should show offer updated") + .WhenAsync(BuyingOwnItem) + .Then(ShouldReceiveOfferUpdatedMessage) + .ExecuteAsync(); } [TestMethod] - public async Task BuyWhenDifferentPriceAsync() + public async Task BuyingAtWrongPriceShouldShowOfferUpdated() { - await _cbuyPacketHandler!.ExecuteAsync(new CBuyPacket - { - BazaarId = 0, - Price = 40, - Amount = 1, - VNum = 1012 - }, _session!); - var lastpacket = (ModaliPacket?)_session!.LastPackets.FirstOrDefault(s => s is ModaliPacket); - Assert.IsTrue(lastpacket?.Type == 1 && lastpacket?.Message == Game18NConstString.OfferUpdated); + await new Spec("Buying at wrong price should show offer updated") + .WhenAsync(BuyingAtWrongPrice) + .Then(ShouldReceiveOfferUpdatedMessage) + .ExecuteAsync(); + } + + [TestMethod] + public async Task BuyingWhenInventoryFullShouldShowNoSpace() + { + await new Spec("Buying when inventory full should show no space") + .Given(InventoryIsFull) + .WhenAsync(BuyingItemFromBazaar) + .Then(ShouldReceiveNotEnoughSpaceMessage) + .ExecuteAsync(); + } + + [TestMethod] + public async Task BuyingMoreThanAvailableShouldShowOfferUpdated() + { + await new Spec("Buying more than available should show offer updated") + .Given(CharacterHasGold_, 5000L) + .WhenAsync(BuyingMoreThanAvailable) + .Then(ShouldReceiveOfferUpdatedMessage) + .ExecuteAsync(); + } + + [TestMethod] + public async Task BuyingPartialPackageShouldBeIgnored() + { + await new Spec("Buying partial package should be ignored") + .Given(CharacterHasGold_, 5000L) + .WhenAsync(BuyingPartialPackage) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); + } + + [TestMethod] + public async Task BuyingFullPackageShouldSucceed() + { + await new Spec("Buying full package should succeed") + .Given(CharacterHasGold_, 5000L) + .And(ItemProviderIsConfigured) + .WhenAsync(BuyingFullPackage) + .Then(ShouldReceiveBoughtItemMessage) + .ExecuteAsync(); + } + + [TestMethod] + public async Task BuyingWithoutEnoughGoldShouldFail() + { + await new Spec("Buying without enough gold should fail") + .WhenAsync(BuyingItemFromBazaar) + .Then(ShouldReceiveInsufficientGoldMessage) + .ExecuteAsync(); } [TestMethod] - public async Task BuyWhenCanNotAddItemAsync() + public async Task BuyingItemShouldSucceed() + { + await new Spec("Buying item should succeed") + .Given(CharacterHasGold_, 5000L) + .And(ItemProviderIsConfigured) + .WhenAsync(BuyingItemFromBazaar) + .Then(ShouldReceiveBoughtItemMessage) + .ExecuteAsync(); + } + + private void CharacterIsInShop() + { + Session.Character.InShop = true; + } + + private async Task BuyingFromBazaarViaMiddleware() + { + await Session.HandlePacketsAsync(new[] + { + new CBuyPacket { BazaarId = 1, Price = 50, Amount = 1, VNum = 1012 } + }); + } + + private void NoPacketShouldBeSent() + { + Assert.IsNull(Session.LastPackets.FirstOrDefault()); + } + + private async Task BuyingNonExistentItem() + { + await CbuyPacketHandler.ExecuteAsync(new CBuyPacket + { + BazaarId = 1, Price = 50, Amount = 1, VNum = 1012 + }, Session); + } + + private void ShouldReceiveOfferUpdatedMessage() + { + var packet = (ModaliPacket?)Session.LastPackets.FirstOrDefault(s => s is ModaliPacket); + Assert.IsTrue(packet?.Type == 1 && packet?.Message == Game18NConstString.OfferUpdated); + } + + private async Task BuyingOwnItem() + { + await CbuyPacketHandler.ExecuteAsync(new CBuyPacket + { + BazaarId = 2, Price = 50, Amount = 1, VNum = 1012 + }, Session); + } + + private async Task BuyingAtWrongPrice() + { + await CbuyPacketHandler.ExecuteAsync(new CBuyPacket + { + BazaarId = 0, Price = 40, Amount = 1, VNum = 1012 + }, Session); + } + + private void InventoryIsFull() { var guid1 = Guid.NewGuid(); var guid2 = Guid.NewGuid(); - _session!.Character.InventoryService.AddItemToPocket(new InventoryItemInstance(new ItemInstance(new Item { VNum = 1012 }) { Amount = 999, Id = guid2 }) + Session.Character.InventoryService.AddItemToPocket(new InventoryItemInstance(new ItemInstance(new Item { VNum = 1012 }) { Amount = 999, Id = guid2 }) { Id = guid2, Slot = 0, Type = NoscorePocketType.Main }); - _session.Character.InventoryService.AddItemToPocket(new InventoryItemInstance(new ItemInstance(new Item { VNum = 1012 }) { Amount = 999, Id = guid1 }) + Session.Character.InventoryService.AddItemToPocket(new InventoryItemInstance(new ItemInstance(new Item { VNum = 1012 }) { Amount = 999, Id = guid1 }) { Id = guid1, Slot = 1, Type = NoscorePocketType.Main }); - await _cbuyPacketHandler!.ExecuteAsync(new CBuyPacket - { - BazaarId = 0, - Price = 50, - Amount = 1, - VNum = 1012 - }, _session); - var lastpacket = (InfoiPacket?)_session.LastPackets.FirstOrDefault(s => s is InfoiPacket); - Assert.IsTrue(lastpacket?.Message == Game18NConstString.NotEnoughSpace); } - [TestMethod] - public async Task BuyMoreThanSellingAsync() + private async Task BuyingItemFromBazaar() { - _session!.Character.Gold = 5000; - await _cbuyPacketHandler!.ExecuteAsync(new CBuyPacket + await CbuyPacketHandler.ExecuteAsync(new CBuyPacket { - BazaarId = 0, - Price = 50, - Amount = 2, - VNum = 1012 - }, _session); - var lastpacket = (ModaliPacket?)_session!.LastPackets.FirstOrDefault(s => s is ModaliPacket); - Assert.IsTrue(lastpacket?.Type == 1 && lastpacket?.Message == Game18NConstString.OfferUpdated); + BazaarId = 0, Price = 50, Amount = 1, VNum = 1012 + }, Session); } - [TestMethod] - public async Task BuyPartialPackageAsync() + private void ShouldReceiveNotEnoughSpaceMessage() { - _session!.Character.Gold = 5000; - await _cbuyPacketHandler!.ExecuteAsync(new CBuyPacket - { - BazaarId = 3, - Price = 50, - Amount = 1, - VNum = 1012 - }, _session); - Assert.IsNull(_session.LastPackets.FirstOrDefault()); + var packet = (InfoiPacket?)Session.LastPackets.FirstOrDefault(s => s is InfoiPacket); + Assert.IsTrue(packet?.Message == Game18NConstString.NotEnoughSpace); } - [TestMethod] - public async Task BuyPackageAsync() + private void CharacterHasGold_(long gold) { - _session!.Character.Gold = 5000; - var item = new Item { Type = NoscorePocketType.Main, VNum = 1012 }; - _itemProvider!.Setup(s => s.Convert(It.IsAny())) - .Returns(new ItemInstance(item) { Amount = 1, Item = item }); - await _cbuyPacketHandler!.ExecuteAsync(new CBuyPacket + Session.Character.Gold = gold; + } + + private async Task BuyingMoreThanAvailable() + { + await CbuyPacketHandler.ExecuteAsync(new CBuyPacket { - BazaarId = 3, - Price = 50, - Amount = 99, - VNum = 1012 - }, _session); - var lastpacket = (SayiPacket?)_session.LastPackets.FirstOrDefault(s => s is SayiPacket); - Assert.IsTrue(lastpacket?.VisualType == VisualType.Player && lastpacket?.VisualId == _session.Character.CharacterId && lastpacket?.Type == SayColorType.Yellow && - lastpacket?.Message == Game18NConstString.BoughtItem && lastpacket?.ArgumentType == 2 && (string?)lastpacket?.Game18NArguments[0] == item.VNum.ToString() && (short?)lastpacket?.Game18NArguments[1] == 99); + BazaarId = 0, Price = 50, Amount = 2, VNum = 1012 + }, Session); } - [TestMethod] - public async Task BuyNotEnoughMoneyAsync() + private async Task BuyingPartialPackage() { - await _cbuyPacketHandler!.ExecuteAsync(new CBuyPacket + await CbuyPacketHandler.ExecuteAsync(new CBuyPacket { - BazaarId = 0, - Price = 50, - Amount = 1, - VNum = 1012 - }, _session!); - var lastpacket = (ModaliPacket?)_session!.LastPackets.FirstOrDefault(s => s is ModaliPacket); - Assert.IsTrue(lastpacket?.Message == Game18NConstString.InsufficientGoldAvailable); + BazaarId = 3, Price = 50, Amount = 1, VNum = 1012 + }, Session); } - [TestMethod] - public async Task BuyAsync() + private void ItemProviderIsConfigured() { - _session!.Character.Gold = 5000; var item = new Item { Type = NoscorePocketType.Main, VNum = 1012 }; - _itemProvider!.Setup(s => s.Convert(It.IsAny())) + ItemProvider.Setup(s => s.Convert(It.IsAny())) .Returns(new ItemInstance(item) { Amount = 1, Item = item }); - await _cbuyPacketHandler!.ExecuteAsync(new CBuyPacket + } + + private async Task BuyingFullPackage() + { + await CbuyPacketHandler.ExecuteAsync(new CBuyPacket { - BazaarId = 0, - Price = 50, - Amount = 1, - VNum = 1012 - }, _session); - var lastpacket = (SayiPacket?)_session.LastPackets.FirstOrDefault(s => s is SayiPacket); - Assert.IsTrue(lastpacket?.VisualType == VisualType.Player && lastpacket?.VisualId == _session.Character.CharacterId && lastpacket?.Type == SayColorType.Yellow && - lastpacket?.Message == Game18NConstString.BoughtItem && lastpacket?.ArgumentType == 2 && (string?)lastpacket?.Game18NArguments[0] == item.VNum.ToString() && (short?)lastpacket?.Game18NArguments[1] == 1); + BazaarId = 3, Price = 50, Amount = 99, VNum = 1012 + }, Session); + } + + private void ShouldReceiveBoughtItemMessage() + { + var packet = (SayiPacket?)Session.LastPackets.FirstOrDefault(s => s is SayiPacket); + Assert.IsTrue(packet?.VisualType == VisualType.Player && + packet?.VisualId == Session.Character.CharacterId && + packet?.Type == SayColorType.Yellow && + packet?.Message == Game18NConstString.BoughtItem); + } + + private void ShouldReceiveInsufficientGoldMessage() + { + var packet = (ModaliPacket?)Session.LastPackets.FirstOrDefault(s => s is ModaliPacket); + Assert.IsTrue(packet?.Message == Game18NConstString.InsufficientGoldAvailable); } } -} \ No newline at end of file +} diff --git a/test/NosCore.PacketHandlers.Tests/Bazaar/CModPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Bazaar/CModPacketHandlerTests.cs index fe2407bf4..d954dbed4 100644 --- a/test/NosCore.PacketHandlers.Tests/Bazaar/CModPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Bazaar/CModPacketHandlerTests.cs @@ -2,18 +2,18 @@ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . @@ -36,27 +36,28 @@ using NosCore.Shared.Enumerations; using NosCore.Tests.Shared; using Serilog; +using SpecLight; namespace NosCore.PacketHandlers.Tests.Bazaar { [TestClass] - public class CModPacketHandlerTest + public class CModPacketHandlerTests { private static readonly ILogger Logger = new Mock().Object; - private Mock? _bazaarHttpClient; - private CModPacketHandler? _cmodPacketHandler; - private ClientSession? _session; + private Mock BazaarHttpClient = null!; + private CModPacketHandler CmodPacketHandler = null!; + private ClientSession Session = null!; [TestInitialize] public async Task SetupAsync() { await TestHelpers.ResetAsync(); Broadcaster.Reset(); - _session = await TestHelpers.Instance.GenerateSessionAsync(); - _bazaarHttpClient = new Mock(); - _cmodPacketHandler = new CModPacketHandler(_bazaarHttpClient.Object, Logger, TestHelpers.Instance.LogLanguageLocalizer); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + BazaarHttpClient = new Mock(); + CmodPacketHandler = new CModPacketHandler(BazaarHttpClient.Object, Logger, TestHelpers.Instance.LogLanguageLocalizer); - _bazaarHttpClient.Setup(b => b.GetBazaar(0, null, null, null, null, null, null, null, null)).ReturnsAsync( + BazaarHttpClient.Setup(b => b.GetBazaar(0, null, null, null, null, null, null, null, null)).ReturnsAsync( new List() {new() { SellerName = "test", @@ -64,126 +65,180 @@ public async Task SetupAsync() ItemInstance = new ItemInstanceDto { ItemVNum = 1012, Amount = 1 } }}); - _bazaarHttpClient.Setup(b => b.GetBazaar(3, null, null, null, null, null, null, null, null)).ReturnsAsync( + BazaarHttpClient.Setup(b => b.GetBazaar(3, null, null, null, null, null, null, null, null)).ReturnsAsync( new List() {new() { - SellerName = _session.Character.Name, + SellerName = Session.Character.Name, BazaarItem = new BazaarItemDto { Price = 50, Amount = 1 }, ItemInstance = new ItemInstanceDto { ItemVNum = 1012, Amount = 0 } }}); - _bazaarHttpClient.Setup(b => b.GetBazaar(2, null, null, null, null, null, null, null, null)).ReturnsAsync( + BazaarHttpClient.Setup(b => b.GetBazaar(2, null, null, null, null, null, null, null, null)).ReturnsAsync( new List() {new() { - SellerName = _session.Character.Name, + SellerName = Session.Character.Name, BazaarItem = new BazaarItemDto { Price = 60, Amount = 1 }, ItemInstance = new ItemInstanceDto { ItemVNum = 1012, Amount = 1 } }}); - _bazaarHttpClient.Setup(b => b.GetBazaar(1, null, null, null, null, null, null, null, null)).ReturnsAsync(new List()); - _bazaarHttpClient.Setup(b => b.ModifyBazaarAsync(It.IsAny(), It.IsAny()!)).ReturnsAsync(new BazaarLink + BazaarHttpClient.Setup(b => b.GetBazaar(1, null, null, null, null, null, null, null, null)).ReturnsAsync(new List()); + BazaarHttpClient.Setup(b => b.ModifyBazaarAsync(It.IsAny(), It.IsAny()!)).ReturnsAsync(new BazaarLink { - SellerName = _session.Character.Name, + SellerName = Session.Character.Name, BazaarItem = new BazaarItemDto { Price = 70, Amount = 1 }, ItemInstance = new ItemInstanceDto { ItemVNum = 1012, Amount = 1 } }); } [TestMethod] - public async Task ModifyWhenInExchangeAsync() + public async Task ModifyingWhileInShopShouldBeIgnored() { - _session!.Character.InShop = true; - await _cmodPacketHandler!.ExecuteAsync(new CModPacket - { - BazaarId = 1, - NewPrice = 50, - Amount = 1, - VNum = 1012 - }, _session); - Assert.IsNull(_session.LastPackets.FirstOrDefault()); + await new Spec("Modifying while in shop should be ignored") + .Given(CharacterIsInShop) + .WhenAsync(ModifyingBazaarItemAsync) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); } [TestMethod] - public async Task ModifyWhenNoItemAsync() + public async Task ModifyingNonExistentItemShouldBeIgnored() { - await _cmodPacketHandler!.ExecuteAsync(new CModPacket - { - BazaarId = 1, - NewPrice = 50, - Amount = 1, - VNum = 1012 - }, _session!); - Assert.IsNull(_session!.LastPackets.FirstOrDefault()); + await new Spec("Modifying non existent item should be ignored") + .WhenAsync(ModifyingNonExistentItemAsync) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); } + [TestMethod] + public async Task ModifyingOtherSellersItemShouldBeIgnored() + { + await new Spec("Modifying other sellers item should be ignored") + .WhenAsync(ModifyingOtherSellersItemAsync) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); + } [TestMethod] - public async Task ModifyWhenOtherSellerAsync() + public async Task ModifyingSoldItemShouldShowError() { - await _cmodPacketHandler!.ExecuteAsync(new CModPacket - { - BazaarId = 0, - NewPrice = 50, - Amount = 1, - VNum = 1012 - }, _session!); - Assert.IsNull(_session!.LastPackets.FirstOrDefault()); + await new Spec("Modifying sold item should show error") + .WhenAsync(ModifyingSoldItemAsync) + .Then(ShouldReceiveCannotChangePriceMessage) + .ExecuteAsync(); } [TestMethod] - public async Task ModifyWhenSoldAsync() + public async Task ModifyingWithWrongAmountShouldShowOfferUpdated() { - await _cmodPacketHandler!.ExecuteAsync(new CModPacket - { - BazaarId = 3, - NewPrice = 60, - Amount = 1, - VNum = 1012 - }, _session!); - var lastpacket = (ModaliPacket?)_session!.LastPackets.FirstOrDefault(s => s is ModaliPacket); - Assert.IsTrue(lastpacket?.Type == 1 && lastpacket?.Message == Game18NConstString.CannotChangePriceSoldItems); + await new Spec("Modifying with wrong amount should show offer updated") + .WhenAsync(ModifyingWithWrongAmountAsync) + .Then(ShouldReceiveOfferUpdatedMessage) + .ExecuteAsync(); } [TestMethod] - public async Task ModifyWhenWrongAmountAsync() + public async Task ModifyingToSamePriceShouldBeIgnored() { - await _cmodPacketHandler!.ExecuteAsync(new CModPacket - { - BazaarId = 2, - NewPrice = 70, - Amount = 2, - VNum = 1012 - }, _session!); - var lastpacket = (ModaliPacket?)_session!.LastPackets.FirstOrDefault(s => s is ModaliPacket); - Assert.IsTrue(lastpacket?.Type == 1 && lastpacket?.Message == Game18NConstString.OfferUpdated); + await new Spec("Modifying to same price should be ignored") + .WhenAsync(ModifyingToSamePriceAsync) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); } [TestMethod] - public async Task ModifyWhenPriceSamePriceAsync() + public async Task ModifyingPriceShouldSucceed() + { + await new Spec("Modifying price should succeed") + .WhenAsync(ModifyingPriceSuccessfullyAsync) + .Then(ShouldReceiveNewPriceMessage) + .ExecuteAsync(); + } + + private void CharacterIsInShop() + { + Session.Character.InShop = true; + } + + private async Task ModifyingBazaarItemAsync() { - await _cmodPacketHandler!.ExecuteAsync(new CModPacket + await CmodPacketHandler.ExecuteAsync(new CModPacket { - BazaarId = 2, - NewPrice = 60, - Amount = 1, - VNum = 1012 - }, _session!); - Assert.IsNull(_session!.LastPackets.FirstOrDefault()); + BazaarId = 1, NewPrice = 50, Amount = 1, VNum = 1012 + }, Session); } - [TestMethod] - public async Task ModifyAsync() + private void NoPacketShouldBeSent() + { + Assert.IsNull(Session.LastPackets.FirstOrDefault()); + } + + private async Task ModifyingNonExistentItemAsync() { - await _cmodPacketHandler!.ExecuteAsync(new CModPacket + await CmodPacketHandler.ExecuteAsync(new CModPacket { - BazaarId = 2, - NewPrice = 70, - Amount = 1, - VNum = 1012 - }, _session!); - var lastpacket = (SayiPacket?)_session!.LastPackets.FirstOrDefault(s => s is SayiPacket); - Assert.IsTrue(lastpacket?.VisualType == VisualType.Player && lastpacket?.VisualId == _session.Character.CharacterId && - lastpacket?.Type == SayColorType.Yellow && lastpacket?.Message == Game18NConstString.NewSellingPrice && - lastpacket?.ArgumentType == 4 && (long?)lastpacket?.Game18NArguments[0] == 70); + BazaarId = 1, NewPrice = 50, Amount = 1, VNum = 1012 + }, Session); + } + + private async Task ModifyingOtherSellersItemAsync() + { + await CmodPacketHandler.ExecuteAsync(new CModPacket + { + BazaarId = 0, NewPrice = 50, Amount = 1, VNum = 1012 + }, Session); + } + + private async Task ModifyingSoldItemAsync() + { + await CmodPacketHandler.ExecuteAsync(new CModPacket + { + BazaarId = 3, NewPrice = 60, Amount = 1, VNum = 1012 + }, Session); + } + + private void ShouldReceiveCannotChangePriceMessage() + { + var packet = (ModaliPacket?)Session.LastPackets.FirstOrDefault(s => s is ModaliPacket); + Assert.IsTrue(packet?.Type == 1 && packet?.Message == Game18NConstString.CannotChangePriceSoldItems); + } + + private async Task ModifyingWithWrongAmountAsync() + { + await CmodPacketHandler.ExecuteAsync(new CModPacket + { + BazaarId = 2, NewPrice = 70, Amount = 2, VNum = 1012 + }, Session); + } + + private void ShouldReceiveOfferUpdatedMessage() + { + var packet = (ModaliPacket?)Session.LastPackets.FirstOrDefault(s => s is ModaliPacket); + Assert.IsTrue(packet?.Type == 1 && packet?.Message == Game18NConstString.OfferUpdated); + } + + private async Task ModifyingToSamePriceAsync() + { + await CmodPacketHandler.ExecuteAsync(new CModPacket + { + BazaarId = 2, NewPrice = 60, Amount = 1, VNum = 1012 + }, Session); + } + + private async Task ModifyingPriceSuccessfullyAsync() + { + await CmodPacketHandler.ExecuteAsync(new CModPacket + { + BazaarId = 2, NewPrice = 70, Amount = 1, VNum = 1012 + }, Session); + } + + private void ShouldReceiveNewPriceMessage() + { + var packet = (SayiPacket?)Session.LastPackets.FirstOrDefault(s => s is SayiPacket); + Assert.IsTrue(packet?.VisualType == VisualType.Player && + packet?.VisualId == Session.Character.CharacterId && + packet?.Type == SayColorType.Yellow && + packet?.Message == Game18NConstString.NewSellingPrice && + packet?.ArgumentType == 4 && (long?)packet?.Game18NArguments[0] == 70); } } -} \ No newline at end of file +} diff --git a/test/NosCore.PacketHandlers.Tests/Bazaar/CRegPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Bazaar/CRegPacketHandlerTests.cs index 555f30eaf..823785cff 100644 --- a/test/NosCore.PacketHandlers.Tests/Bazaar/CRegPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Bazaar/CRegPacketHandlerTests.cs @@ -2,371 +2,340 @@ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . using System; -using System.Collections.Generic; -using System.Linq; using System.Threading.Tasks; using Microsoft.VisualStudio.TestTools.UnitTesting; using Moq; using NosCore.Dao.Interfaces; using NosCore.Data.Dto; -using NosCore.Data.Enumerations; using NosCore.Data.Enumerations.Buff; using NosCore.Data.Enumerations.I18N; -using NosCore.Data.Enumerations.Items; -using NosCore.Data.StaticEntities; using NosCore.Data.WebApi; using NosCore.GameObject.InterChannelCommunication.Hubs.BazaarHub; -using NosCore.GameObject.Networking; -using NosCore.GameObject.Networking.ClientSession; -using NosCore.GameObject.Services.EventLoaderService; -using NosCore.GameObject.Services.InventoryService; -using NosCore.GameObject.Services.ItemGenerationService; -using NosCore.GameObject.Services.ItemGenerationService.Item; using NosCore.PacketHandlers.Bazaar; using NosCore.Packets.ClientPackets.Bazaar; -using NosCore.Packets.ClientPackets.Inventory; using NosCore.Packets.Enumerations; -using NosCore.Packets.ServerPackets.UI; using NosCore.Tests.Shared; -using Serilog; -using NosCore.GameObject.Infastructure; +using NosCore.Tests.Shared.BDD; +using NosCore.Tests.Shared.BDD.Steps; +using SpecLight; namespace NosCore.PacketHandlers.Tests.Bazaar { [TestClass] - public class CRegPacketHandlerTest + public class CRegPacketHandlerTests : SpecBase { - private Mock? _bazaarHttpClient; - private CRegPacketHandler? _cregPacketHandler; - private Mock>? _inventoryItemInstanceDao; - private Mock>? _itemInstanceDao; - private ItemGenerationService? _itemProvider; - private ClientSession? _session; - private readonly ILogger _logger = new Mock().Object; + private Mock BazaarHttpClient = null!; + private CRegPacketHandler CregPacketHandler = null!; + private Mock> InventoryItemInstanceDao = null!; + private Mock> ItemInstanceDao = null!; [TestInitialize] - public async Task SetupAsync() - { - await TestHelpers.ResetAsync(); - Broadcaster.Reset(); - _session = await TestHelpers.Instance.GenerateSessionAsync(); - _session.Character.StaticBonusList = new List(); - _bazaarHttpClient = new Mock(); - _inventoryItemInstanceDao = new Mock>(); - _itemInstanceDao = new Mock>(); - _bazaarHttpClient.Setup(s => s.AddBazaarAsync(It.IsAny())).ReturnsAsync(LanguageKey.OBJECT_IN_BAZAAR); - var items = new List - { - new Item {Type = NoscorePocketType.Main, VNum = 1012, IsSoldable = true}, - new Item {Type = NoscorePocketType.Main, VNum = 1013}, - new Item {Type = NoscorePocketType.Equipment, VNum = 1, ItemType = ItemType.Weapon}, - new Item {Type = NoscorePocketType.Equipment, VNum = 2, ItemType = ItemType.Weapon}, - new Item {Type = NoscorePocketType.Equipment, VNum = 912, ItemType = ItemType.Specialist}, - new Item {Type = NoscorePocketType.Equipment, VNum = 924, ItemType = ItemType.Fashion} - }; - _itemProvider = new ItemGenerationService(items, - new EventLoaderService, IUseItemEventHandler>(new List>>()), _logger, TestHelpers.Instance.LogLanguageLocalizer); - _cregPacketHandler = new CRegPacketHandler(TestHelpers.Instance.WorldConfiguration, - _bazaarHttpClient.Object, _itemInstanceDao.Object, _inventoryItemInstanceDao.Object); - _itemInstanceDao.Setup(s => s.TryInsertOrUpdateAsync(It.IsAny())) + public override async Task SetupAsync() + { + await base.SetupAsync(); + BazaarHttpClient = new Mock(); + InventoryItemInstanceDao = new Mock>(); + ItemInstanceDao = new Mock>(); + BazaarHttpClient.Setup(s => s.AddBazaarAsync(It.IsAny())) + .ReturnsAsync(LanguageKey.OBJECT_IN_BAZAAR); + CregPacketHandler = new CRegPacketHandler( + TestHelpers.Instance.WorldConfiguration, + BazaarHttpClient.Object, + ItemInstanceDao.Object, + InventoryItemInstanceDao.Object); + ItemInstanceDao.Setup(s => s.TryInsertOrUpdateAsync(It.IsAny())) .Returns(Task.FromResult); } [TestMethod] - public async Task RegisterWhenInExchangeOrTradeAsync() + public async Task RegisteringWhileInShopShouldBeIgnored() { - _session!.Character.InShop = true; - await _session!.HandlePacketsAsync(new[]{new CRegPacket - { - Type = 0, - Inventory = 0, - Slot = 0, - Durability = 0, - IsPackage = false, - Amount = 1, - Taxe = 0, - MedalUsed = 0 - }}); - - Assert.IsNull(_session.LastPackets.FirstOrDefault()); + await new Spec("Registering while in shop should be ignored") + .Given(TheCharacterIsInAShop) + .WhenAsync(AttemptingToRegisterAnItem) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); } - [TestMethod] - public async Task RegisterTaxWhenMedalMoreThanGoldAsync() + public async Task RegisteringWithoutEnoughGoldForTaxShouldFail() { - await _cregPacketHandler!.ExecuteAsync(new CRegPacket - { - Type = 0, - Inventory = 0, - Slot = 0, - Durability = 0, - IsPackage = false, - Amount = 1, - Taxe = 0, - MedalUsed = 0 - }, _session!); - - var lastpacket = (MsgiPacket?)_session!.LastPackets.FirstOrDefault(s => s is MsgiPacket); - Assert.IsTrue(lastpacket?.Message == Game18NConstString.NotEnoughGold); + await new Spec("Registering without enough gold for tax should fail") + .WhenAsync(AttemptingToRegisterAnItem) + .Then(ShouldReceiveNotEnoughGoldMessage) + .ExecuteAsync(); } [TestMethod] - public async Task RegisterNegativeAmountAsync() + public async Task RegisteringNegativeAmountShouldBeIgnored() { - _session!.Character.Gold = 500000; - await _cregPacketHandler!.ExecuteAsync(new CRegPacket - { - Type = 0, - Inventory = 0, - Slot = 0, - Durability = 0, - IsPackage = false, - Amount = -1, - Taxe = 0, - MedalUsed = 0 - }, _session); - Assert.IsNull(_session.LastPackets.FirstOrDefault()); + await new Spec("Registering negative amount should be ignored") + .Given(CharacterHasGold_, 500000L) + .WhenAsync(AttemptingToRegisterNegativeAmount) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); } [TestMethod] - public async Task RegisterNotExistingItemAsync() + public async Task RegisteringNonExistentItemShouldBeIgnored() { - _session!.Character.Gold = 500000; - await _cregPacketHandler!.ExecuteAsync(new CRegPacket - { - Type = 0, - Inventory = 1, - Slot = 0, - Durability = 0, - IsPackage = false, - Amount = 1, - Taxe = 0, - MedalUsed = 0 - }, _session); - Assert.IsNull(_session.LastPackets.FirstOrDefault()); + await new Spec("Registering non existent item should be ignored") + .Given(CharacterHasGold_, 500000L) + .WhenAsync(AttemptingToRegisterAnItem) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); } [TestMethod] - public async Task RegisterTooExpensiveWhenNoMedalAsync() + public async Task RegisteringTooExpensiveWithoutMedalShouldFail() { - _session!.Character.Gold = 500000; - _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_itemProvider!.Create(1012), 0))! - .First(); - await _cregPacketHandler!.ExecuteAsync(new CRegPacket - { - Type = 0, - Inventory = 1, - Slot = 0, - Durability = 0, - IsPackage = false, - Amount = 1, - Taxe = 0, - MedalUsed = 0, - Price = 100000001 - }, _session); - var lastpacket = (ModaliPacket?)_session.LastPackets.FirstOrDefault(s => s is ModaliPacket); - Assert.IsTrue(lastpacket?.Type == 1 && lastpacket?.Message == Game18NConstString.NotExceedMaxPrice && lastpacket?.ArgumentType == 4 && (long?)lastpacket?.Game18NArguments[0] == 1000000); + await new Spec("Registering too expensive without medal should fail") + .Given(CharacterHasGold_, 500000L) + .And(CharacterHasItem_, (short)1012) + .WhenAsync(AttemptingToRegisterAtExcessivePrice) + .Then(ShouldReceivePriceLimitMessage) + .ExecuteAsync(); } [TestMethod] - public async Task RegisterHasSmallerTaxWhenMedalAsync() + public async Task MedalHoldersPayReducedTax() { - _session!.Character.Gold = 100000; - _session.Character.StaticBonusList.Add(new StaticBonusDto - { - StaticBonusType = StaticBonusType.BazaarMedalGold - }); - _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_itemProvider!.Create(1012), 0))! - .First(); - await _cregPacketHandler!.ExecuteAsync(new CRegPacket - { - Type = 0, - Inventory = 1, - Slot = 0, - Durability = 1, - IsPackage = false, - Amount = 1, - Taxe = 0, - MedalUsed = 0, - Price = 10000000 - }, _session); - var lastpacket = (MsgiPacket?)_session.LastPackets.FirstOrDefault(s => s is MsgiPacket); - Assert.AreEqual(0, _session.Character.InventoryService.Count); - Assert.IsTrue(lastpacket?.Type == MessageType.Default && lastpacket?.Message == Game18NConstString.ItemAddedToBazar); + await new Spec("Medal holders pay reduced tax") + .Given(CharacterHasGold_, 100000L) + .And(CharacterHasBazaarMedal) + .And(CharacterHasItem_, (short)1012) + .WhenAsync(RegisteringAnExpensiveItem) + .Then(InventoryShouldBeEmpty) + .And(ShouldReceiveSuccessMessage) + .ExecuteAsync(); } [TestMethod] - public async Task RegisterTooExpensiveAsync() + public async Task RegisteringOverMaxPriceShouldFail() { - _session!.Character.Gold = 5000000; - _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_itemProvider!.Create(1012), 0))! - .First(); - await _cregPacketHandler!.ExecuteAsync(new CRegPacket - { - Type = 0, - Inventory = 1, - Slot = 0, - Durability = 0, - IsPackage = false, - Amount = 1, - Taxe = 0, - MedalUsed = 0, - Price = TestHelpers.Instance.WorldConfiguration.Value.MaxGoldAmount + 1 - }, _session); - var lastpacket = (ModaliPacket?)_session.LastPackets.FirstOrDefault(s => s is ModaliPacket); - Assert.IsTrue(lastpacket?.Type == 1 && lastpacket?.Message == Game18NConstString.NotExceedMaxPrice && lastpacket?.ArgumentType == 4 && (long?)lastpacket?.Game18NArguments[0] == 1000000); + await new Spec("Registering over max price should fail") + .Given(CharacterHasGold_, 5000000L) + .And(CharacterHasItem_, (short)1012) + .WhenAsync(AttemptingToRegisterAboveMaxGold) + .Then(ShouldReceivePriceLimitMessage) + .ExecuteAsync(); } [TestMethod] - public async Task RegisterTooLongWhenNoMedalAsync() + public async Task RegisteringTooLongWithoutMedalShouldFail() { - _session!.Character.Gold = 5000000; - _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_itemProvider!.Create(1012), 0))! - .First(); - await _cregPacketHandler!.ExecuteAsync(new CRegPacket - { - Type = 0, - Inventory = 1, - Slot = 0, - Durability = 2, - IsPackage = false, - Amount = 1, - Taxe = 0, - MedalUsed = 0, - Price = 1 - }, _session); - Assert.IsNull(_session.LastPackets.FirstOrDefault()); + await new Spec("Registering too long without medal should fail") + .Given(CharacterHasGold_, 5000000L) + .And(CharacterHasItem_, (short)1012) + .WhenAsync(AttemptingToRegisterForExtendedDuration) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); } - [TestMethod] - public async Task RegisterUnvalidTimeAsync() + public async Task RegisteringInvalidDurationShouldFail() { - _session!.Character.Gold = 5000000; - _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_itemProvider!.Create(1012), 0))! - .First(); - await _cregPacketHandler!.ExecuteAsync(new CRegPacket - { - Type = 0, - Inventory = 1, - Slot = 0, - Durability = 7, - IsPackage = false, - Amount = 1, - Taxe = 0, - MedalUsed = 0, - Price = 1 - }, _session); - Assert.IsNull(_session.LastPackets.FirstOrDefault()); + await new Spec("Registering invalid duration should fail") + .Given(CharacterHasGold_, 5000000L) + .And(CharacterHasItem_, (short)1012) + .WhenAsync(AttemptingToRegisterWithInvalidDuration) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); } [TestMethod] - public async Task RegisterLimitExceededAsync() - { - _session!.Character.Gold = 5000000; - _session.Character.InventoryService - .AddItemToPocket(InventoryItemInstance.Create(_itemProvider!.Create(1012, 999), 0))!.First(); - _bazaarHttpClient!.Reset(); - _bazaarHttpClient!.Setup(s => s.AddBazaarAsync(It.IsAny())).ReturnsAsync(LanguageKey.LIMIT_EXCEEDED); - await _cregPacketHandler!.ExecuteAsync(new CRegPacket - { - Type = 0, - Inventory = 1, - Slot = 0, - Durability = 1, - IsPackage = false, - Amount = 949, - Taxe = 0, - MedalUsed = 0, - Price = 1 - }, _session!); - var lastpacket = (ModaliPacket?)_session.LastPackets.FirstOrDefault(s => s is ModaliPacket); - Assert.AreEqual(999, _session.Character.InventoryService.FirstOrDefault().Value.ItemInstance.Amount); - Assert.IsTrue(lastpacket?.Type == 1 && lastpacket?.Message == Game18NConstString.ListedMaxItemsNumber); + public async Task ExceedingListingLimitShouldFail() + { + BazaarHttpClient.Reset(); + BazaarHttpClient.Setup(s => s.AddBazaarAsync(It.IsAny())) + .ReturnsAsync(LanguageKey.LIMIT_EXCEEDED); + + await new Spec("Exceeding listing limit should fail") + .Given(CharacterHasGold_, 5000000L) + .And(CharacterHasManyItems) + .WhenAsync(AttemptingToRegisterBeyondLimit) + .Then(ItemShouldRemainInInventory) + .And(ShouldReceiveLimitExceededMessage) + .ExecuteAsync(); } [TestMethod] - public async Task RegisterAllSlotAsync() + public async Task RegisteringFullStackShouldSucceed() { - _session!.Character.Gold = 5000000; - _session.Character.InventoryService - .AddItemToPocket(InventoryItemInstance.Create(_itemProvider!.Create(1012, 999), 0))!.First(); - await _cregPacketHandler!.ExecuteAsync(new CRegPacket - { - Type = 0, - Inventory = 1, - Slot = 0, - Durability = 1, - IsPackage = false, - Amount = 999, - Taxe = 0, - MedalUsed = 0, - Price = 1 - }, _session); - var lastpacket = (MsgiPacket?)_session.LastPackets.FirstOrDefault(s => s is MsgiPacket); - Assert.AreEqual(0, _session.Character.InventoryService.Count); - Assert.IsTrue(lastpacket?.Type == MessageType.Default && lastpacket?.Message == Game18NConstString.ItemAddedToBazar); + await new Spec("Registering full stack should succeed") + .Given(CharacterHasGold_, 5000000L) + .And(CharacterHasManyItems) + .WhenAsync(RegisteringAll_Items, 999) + .Then(InventoryShouldBeEmpty) + .And(ShouldReceiveSuccessMessage) + .ExecuteAsync(); } [TestMethod] - public async Task RegisterLessThanInInventoryAsync() + public async Task RegisteringMoreThanInventoryShouldFail() { - _session!.Character.Gold = 5000000; - _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_itemProvider!.Create(1012), 0))! - .First(); - await _cregPacketHandler!.ExecuteAsync(new CRegPacket - { - Type = 0, - Inventory = 1, - Slot = 0, - Durability = 1, - IsPackage = false, - Amount = 2, - Taxe = 0, - MedalUsed = 0, - Price = 1 - }, _session); - Assert.IsNull(_session.LastPackets.FirstOrDefault()); + await new Spec("Registering more than inventory should fail") + .Given(CharacterHasGold_, 5000000L) + .And(CharacterHasItem_, (short)1012) + .WhenAsync(AttemptingToRegister_Items, 2) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); } [TestMethod] - public async Task RegisterPartialSlotAsync() + public async Task RegisteringPartialStackShouldSucceed() { - _session!.Character.Gold = 5000000; - _session.Character.InventoryService - .AddItemToPocket(InventoryItemInstance.Create(_itemProvider!.Create(1012, 999), 0))!.First(); - await _cregPacketHandler!.ExecuteAsync(new CRegPacket + await new Spec("Registering partial stack should succeed") + .Given(CharacterHasGold_, 5000000L) + .And(CharacterHasManyItems) + .WhenAsync(Registering_Items, 949) + .Then(FiftyItemsShouldRemain) + .And(ShouldReceiveSuccessMessage) + .ExecuteAsync(); + } + + private CRegPacket CreateCRegPacket(short amount = 1, long price = 1000, byte durability = 1) + { + return new CRegPacket { Type = 0, Inventory = 1, Slot = 0, - Durability = 1, + Amount = amount, + Price = price, + Durability = durability, IsPackage = false, - Amount = 949, Taxe = 0, - MedalUsed = 0, - Price = 1 - }, _session); - var lastpacket = (MsgiPacket?)_session.LastPackets.FirstOrDefault(s => s is MsgiPacket); - Assert.AreEqual(50, _session.Character.InventoryService.FirstOrDefault().Value.ItemInstance.Amount); - Assert.IsTrue(lastpacket?.Type == MessageType.Default && lastpacket?.Message == Game18NConstString.ItemAddedToBazar); + MedalUsed = 0 + }; + } + + private void TheCharacterIsInAShop() + { + Session.InShop(); + } + + private async Task AttemptingToRegisterAnItem() + { + await Session.HandlePacketsAsync(new[] { CreateCRegPacket() }); + } + + + private void ShouldReceiveNotEnoughGoldMessage() + { + ShouldReceiveMessage(Game18NConstString.NotEnoughGold); + } + + private void CharacterHasGold_(long gold) + { + CharacterHasGold(gold); + } + + private async Task AttemptingToRegisterNegativeAmount() + { + await CregPacketHandler.ExecuteAsync(CreateCRegPacket(amount: -1), Session); + } + + private void CharacterHasItem_(short vnum) + { + CharacterHasItem(vnum); + } + + private async Task AttemptingToRegisterAtExcessivePrice() + { + await CregPacketHandler.ExecuteAsync(CreateCRegPacket(price: 100000001), Session); + } + + private void ShouldReceivePriceLimitMessage() + { + ShouldReceiveModalMessage(Game18NConstString.NotExceedMaxPrice, 1, 4); + } + + private void CharacterHasBazaarMedal() + { + CharacterHasMedalBonus(StaticBonusType.BazaarMedalGold); + } + + private async Task RegisteringAnExpensiveItem() + { + await CregPacketHandler.ExecuteAsync(CreateCRegPacket(price: 10000000), Session); + } + + + private void ShouldReceiveSuccessMessage() + { + ShouldReceiveMessage(Game18NConstString.ItemAddedToBazar, MessageType.Default); + } + + private async Task AttemptingToRegisterAboveMaxGold() + { + await CregPacketHandler.ExecuteAsync(CreateCRegPacket(price: TestHelpers.Instance.WorldConfiguration.Value.MaxGoldAmount + 1), Session); + } + + private async Task AttemptingToRegisterForExtendedDuration() + { + await CregPacketHandler.ExecuteAsync(CreateCRegPacket(price: 1, durability: 2), Session); + } + + private async Task AttemptingToRegisterWithInvalidDuration() + { + await CregPacketHandler.ExecuteAsync(CreateCRegPacket(price: 1, durability: 7), Session); + } + + private void CharacterHasManyItems() + { + CharacterHasItem(1012, 999); + } + + private async Task AttemptingToRegisterBeyondLimit() + { + await CregPacketHandler.ExecuteAsync(CreateCRegPacket(amount: 949, price: 1), Session); + } + + private void ItemShouldRemainInInventory() + { + InventoryShouldContainItem(1012, 999); + } + + private void ShouldReceiveLimitExceededMessage() + { + ShouldReceiveModalMessage(Game18NConstString.ListedMaxItemsNumber); + } + + private async Task RegisteringAll_Items(int value) + { + await CregPacketHandler.ExecuteAsync(CreateCRegPacket(amount: 999, price: 1), Session); + } + + private async Task AttemptingToRegister_Items(int value) + { + await CregPacketHandler.ExecuteAsync(CreateCRegPacket(amount: 2, price: 1), Session); + } + + private async Task Registering_Items(int value) + { + await CregPacketHandler.ExecuteAsync(CreateCRegPacket(amount: 949, price: 1), Session); + } + + private void FiftyItemsShouldRemain() + { + InventoryShouldContainItem(1012, 50); } } -} \ No newline at end of file +} diff --git a/test/NosCore.PacketHandlers.Tests/Bazaar/CSListPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Bazaar/CSListPacketHandlerTests.cs index 33b2fed1b..f2145c9b9 100644 --- a/test/NosCore.PacketHandlers.Tests/Bazaar/CSListPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Bazaar/CSListPacketHandlerTests.cs @@ -1,4 +1,4 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| @@ -22,14 +22,14 @@ namespace NosCore.PacketHandlers.Tests.Bazaar //[TestClass] //public class CSListPacketHandlerTest //{ - // private Mock _bazaarHttpClient; - // private CSListPacketHandler _cSListPacketHandler; - // private ClientSession _session; + // private Mock BazaarHttpClient; + // private CSListPacketHandler CSListPacketHandler; + // private ClientSession Session; // [TestInitialize] // public void Setup() // { - // _cSListPacketHandler = new CSListPacketHandler(_bazaarHttpClient.Object); + // CSListPacketHandler = new CSListPacketHandler(BazaarHttpClient.Object); // } // //TODO list tests diff --git a/test/NosCore.PacketHandlers.Tests/Bazaar/CScalcPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Bazaar/CScalcPacketHandlerTests.cs index 1b19d73d4..a777fc714 100644 --- a/test/NosCore.PacketHandlers.Tests/Bazaar/CScalcPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Bazaar/CScalcPacketHandlerTests.cs @@ -2,18 +2,18 @@ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . @@ -41,153 +41,201 @@ using NosCore.Packets.ServerPackets.UI; using NosCore.Tests.Shared; using Serilog; +using SpecLight; namespace NosCore.PacketHandlers.Tests.Bazaar { [TestClass] - public class CScalcPacketHandlerTest + public class CScalcPacketHandlerTests { private static readonly ILogger Logger = new Mock().Object; - private Mock? _bazaarHttpClient; - private CScalcPacketHandler? _cScalcPacketHandler; - private Mock>? _itemInstanceDao; - private Mock? _itemProvider; - private ClientSession? _session; + private Mock BazaarHttpClient = null!; + private CScalcPacketHandler CScalcPacketHandler = null!; + private Mock> ItemInstanceDao = null!; + private Mock ItemProvider = null!; + private ClientSession Session = null!; [TestInitialize] public async Task SetupAsync() { await TestHelpers.ResetAsync(); Broadcaster.Reset(); - _session = await TestHelpers.Instance.GenerateSessionAsync(); - _bazaarHttpClient = new Mock(); - _itemProvider = new Mock(); - _itemInstanceDao = new Mock>(); - _cScalcPacketHandler = new CScalcPacketHandler(TestHelpers.Instance.WorldConfiguration, - _bazaarHttpClient.Object, _itemProvider.Object, Logger, _itemInstanceDao.Object, TestHelpers.Instance.LogLanguageLocalizer); - - _bazaarHttpClient.Setup(b => b.GetBazaar(0, null,null,null,null,null,null,null,null)).ReturnsAsync( + Session = await TestHelpers.Instance.GenerateSessionAsync(); + BazaarHttpClient = new Mock(); + ItemProvider = new Mock(); + ItemInstanceDao = new Mock>(); + CScalcPacketHandler = new CScalcPacketHandler(TestHelpers.Instance.WorldConfiguration, + BazaarHttpClient.Object, ItemProvider.Object, Logger, ItemInstanceDao.Object, TestHelpers.Instance.LogLanguageLocalizer); + + BazaarHttpClient.Setup(b => b.GetBazaar(0, null, null, null, null, null, null, null, null)).ReturnsAsync( new List() {new BazaarLink { - SellerName = _session.Character.Name, + SellerName = Session.Character.Name, BazaarItem = new BazaarItemDto { Price = 50, Amount = 1 }, ItemInstance = new ItemInstanceDto { ItemVNum = 1012, Amount = 0 } }}); - _bazaarHttpClient.Setup(b => b.GetBazaar(2, null, null, null, null, null, null, null, null)).ReturnsAsync( + BazaarHttpClient.Setup(b => b.GetBazaar(2, null, null, null, null, null, null, null, null)).ReturnsAsync( new List() {new BazaarLink - { - + { SellerName = "test", BazaarItem = new BazaarItemDto { Price = 60, Amount = 1 }, ItemInstance = new ItemInstanceDto { ItemVNum = 1012, Amount = 0 } }}); - _bazaarHttpClient.Setup(b => b.GetBazaar(1, null, null, null, null, null, null, null, null)).ReturnsAsync(new List()); - _bazaarHttpClient.Setup(b => b.DeleteBazaarAsync(It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(true); - _itemProvider.Setup(s => s.Convert(It.IsAny())).Returns(new ItemInstance(new Item() { VNum = 1012 }) { - Amount = 0, Item = new Item() }); + BazaarHttpClient.Setup(b => b.GetBazaar(1, null, null, null, null, null, null, null, null)).ReturnsAsync(new List()); + BazaarHttpClient.Setup(b => b.DeleteBazaarAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(true); + ItemProvider.Setup(s => s.Convert(It.IsAny())).Returns(new ItemInstance(new Item() { VNum = 1012 }) { + Amount = 0, Item = new Item() }); + } + + [TestMethod] + public async Task RetrievingWhileInShopShouldBeIgnored() + { + await new Spec("Retrieving while in shop should be ignored") + .Given(CharacterIsInShop) + .WhenAsync(RetrievingFromBazaarViaMiddleware) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); + } + + [TestMethod] + public async Task RetrievingNonExistentItemShouldReturnZeroPrice() + { + await new Spec("Retrieving non existent item should return zero price") + .WhenAsync(RetrievingNonExistentItem) + .Then(ShouldReceiveZeroPriceResponse) + .ExecuteAsync(); + } + + [TestMethod] + public async Task RetrievingOtherSellersItemShouldReturnZeroPrice() + { + await new Spec("Retrieving other sellers item should return zero price") + .WhenAsync(RetrievingOtherSellersItem) + .Then(ShouldReceiveZeroPriceResponse) + .ExecuteAsync(); } [TestMethod] - public async Task RetrieveWhenInExchangeOrTradeAsync() + public async Task RetrievingWhenInventoryFullShouldStillReturnPrice() + { + await new Spec("Retrieving when inventory full should still return price") + .Given(InventoryIsFull) + .WhenAsync(RetrievingOwnItem) + .Then(ShouldReceivePriceOf_, 50) + .ExecuteAsync(); + } + + [TestMethod] + public async Task RetrievingWhenAtMaxGoldShouldShowError() + { + await new Spec("Retrieving when at max gold should show error") + .Given(CharacterHasMaxGold) + .WhenAsync(RetrievingOwnItem) + .Then(ShouldReceiveMaxGoldMessage) + .ExecuteAsync(); + } + + [TestMethod] + public async Task RetrievingSoldItemShouldSucceed() + { + await new Spec("Retrieving sold item should succeed") + .Given(ItemInstanceDaoIsConfigured) + .WhenAsync(RetrievingOwnItem) + .Then(ShouldReceiveTotalOf_, 50) + .ExecuteAsync(); + } + + private void CharacterIsInShop() + { + Session.Character.InShop = true; + } + + private async Task RetrievingFromBazaarViaMiddleware() { - _session!.Character.InShop = true; - await _session!.HandlePacketsAsync(new[] + await Session.HandlePacketsAsync(new[] { - new CScalcPacket - { - BazaarId = 1, - Price = 50, - Amount = 1, - VNum = 1012 - } + new CScalcPacket { BazaarId = 1, Price = 50, Amount = 1, VNum = 1012 } }); - Assert.IsNull(_session.LastPackets.FirstOrDefault()); } - [TestMethod] - public async Task RetrieveWhenNoItemAsync() + private void NoPacketShouldBeSent() { - await _cScalcPacketHandler!.ExecuteAsync(new CScalcPacket + Assert.IsNull(Session.LastPackets.FirstOrDefault()); + } + + private async Task RetrievingNonExistentItem() + { + await CScalcPacketHandler.ExecuteAsync(new CScalcPacket { - BazaarId = 1, - Price = 50, - Amount = 1, - VNum = 1012 - }, _session!); - var lastpacket = (RCScalcPacket?)_session!.LastPackets.FirstOrDefault(s => s is RCScalcPacket); - Assert.AreEqual(0, lastpacket?.Price); + BazaarId = 1, Price = 50, Amount = 1, VNum = 1012 + }, Session); } - [TestMethod] - public async Task RetrieveWhenNotYourItemAsync() + private void ShouldReceiveZeroPriceResponse() + { + var packet = (RCScalcPacket?)Session.LastPackets.FirstOrDefault(s => s is RCScalcPacket); + Assert.AreEqual(0, packet?.Price); + } + + private async Task RetrievingOtherSellersItem() { - await _cScalcPacketHandler!.ExecuteAsync(new CScalcPacket + await CScalcPacketHandler.ExecuteAsync(new CScalcPacket { - BazaarId = 2, - Price = 50, - Amount = 1, - VNum = 1012 - }, _session!); - var lastpacket = (RCScalcPacket?)_session!.LastPackets.FirstOrDefault(s => s is RCScalcPacket); - Assert.AreEqual(0, lastpacket?.Price); + BazaarId = 2, Price = 50, Amount = 1, VNum = 1012 + }, Session); } - [TestMethod] - public async Task RetrieveWhenNotEnoughPlaceAsync() + private void InventoryIsFull() { var guid1 = Guid.NewGuid(); var guid2 = Guid.NewGuid(); - _session!.Character.InventoryService.AddItemToPocket( + Session.Character.InventoryService.AddItemToPocket( new InventoryItemInstance(new ItemInstance(new Item() { VNum = 1012 }) { Amount = 999, Id = guid2 }) - { - Id = guid2, Slot = 0, Type = NoscorePocketType.Main, - }); - _session.Character.InventoryService.AddItemToPocket(new InventoryItemInstance( + { + Id = guid2, Slot = 0, Type = NoscorePocketType.Main, + }); + Session.Character.InventoryService.AddItemToPocket(new InventoryItemInstance( new ItemInstance(new Item() { VNum = 1012 }) { Amount = 999, Id = guid1 }) { Id = guid1, Slot = 1, Type = NoscorePocketType.Main }); - await _cScalcPacketHandler!.ExecuteAsync(new CScalcPacket - { - BazaarId = 0, - Price = 50, - Amount = 1, - VNum = 1012 - }, _session); - var lastpacket = (RCScalcPacket?)_session.LastPackets.FirstOrDefault(s => s is RCScalcPacket); - Assert.AreEqual(50, lastpacket?.Price); } - [TestMethod] - public async Task RetrieveWhenMaxGoldAsync() + private async Task RetrievingOwnItem() { - _session!.Character.Gold = TestHelpers.Instance.WorldConfiguration.Value.MaxGoldAmount; - await _cScalcPacketHandler!.ExecuteAsync(new CScalcPacket + await CScalcPacketHandler.ExecuteAsync(new CScalcPacket { - BazaarId = 0, - Price = 50, - Amount = 1, - VNum = 1012 - }, _session); - var lastpacket = (MsgiPacket?)_session.LastPackets.FirstOrDefault(s => s is MsgiPacket); - Assert.AreEqual(Game18NConstString.MaxGoldReached, lastpacket?.Message); + BazaarId = 0, Price = 50, Amount = 1, VNum = 1012 + }, Session); } + private void ShouldReceivePriceOf_(int value) + { + var packet = (RCScalcPacket?)Session.LastPackets.FirstOrDefault(s => s is RCScalcPacket); + Assert.AreEqual(value, packet?.Price); + } - [TestMethod] - public async Task RetrieveAsync() + private void CharacterHasMaxGold() + { + Session.Character.Gold = TestHelpers.Instance.WorldConfiguration.Value.MaxGoldAmount; + } + + private void ShouldReceiveMaxGoldMessage() { - _itemInstanceDao!.Setup(s => s.FirstOrDefaultAsync(It.IsAny>>())) + var packet = (MsgiPacket?)Session.LastPackets.FirstOrDefault(s => s is MsgiPacket); + Assert.AreEqual(Game18NConstString.MaxGoldReached, packet?.Message); + } + + private void ItemInstanceDaoIsConfigured() + { + ItemInstanceDao.Setup(s => s.FirstOrDefaultAsync(It.IsAny>>())) .ReturnsAsync(new ItemInstanceDto { ItemVNum = 1012, Amount = 0 }); - await _cScalcPacketHandler!.ExecuteAsync(new CScalcPacket - { - BazaarId = 0, - Price = 50, - Amount = 1, - VNum = 1012 - }, _session!); - var lastpacket = (RCScalcPacket?)_session!.LastPackets.FirstOrDefault(s => s is RCScalcPacket); - Assert.AreEqual(50, lastpacket?.Total); + } + + private void ShouldReceiveTotalOf_(int value) + { + var packet = (RCScalcPacket?)Session.LastPackets.FirstOrDefault(s => s is RCScalcPacket); + Assert.AreEqual(value, packet?.Total); } } -} \ No newline at end of file +} diff --git a/test/NosCore.PacketHandlers.Tests/Bazaar/CSkillPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Bazaar/CSkillPacketHandlerTests.cs index f4145d5c2..d5254465a 100644 --- a/test/NosCore.PacketHandlers.Tests/Bazaar/CSkillPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Bazaar/CSkillPacketHandlerTests.cs @@ -2,18 +2,18 @@ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . @@ -30,54 +30,92 @@ using NosCore.Packets.Enumerations; using NosCore.Packets.ServerPackets.UI; using NosCore.Tests.Shared; - +using SpecLight; namespace NosCore.PacketHandlers.Tests.Bazaar { [TestClass] - public class CSkillPacketHandlerTest + public class CSkillPacketHandlerTests { - private CSkillPacketHandler? _cskillPacketHandler; - private ClientSession? _session; + private CSkillPacketHandler CskillPacketHandler = null!; + private ClientSession Session = null!; [TestInitialize] public async Task SetupAsync() { await TestHelpers.ResetAsync(); Broadcaster.Reset(); - _session = await TestHelpers.Instance.GenerateSessionAsync(); - _session.Character.StaticBonusList = new List(); - _cskillPacketHandler = new CSkillPacketHandler(TestHelpers.Instance.Clock); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + Session.Character.StaticBonusList = new List(); + CskillPacketHandler = new CSkillPacketHandler(TestHelpers.Instance.Clock); } [TestMethod] - public async Task OpenWhenInShopAsync() + public async Task OpeningBazaarWhileInShopShouldBeIgnored() { - _session!.Character.InShop = true; - await _session!.HandlePacketsAsync(new[] - { - new CSkillPacket() - }); - Assert.IsNull(_session.LastPackets.FirstOrDefault()); + await new Spec("Opening bazaar while in shop should be ignored") + .Given(CharacterIsInShop) + .WhenAsync(OpeningBazaarViaMiddleware) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); } - [TestMethod] - public async Task OpenWhenNoMedalAsync() + public async Task OpeningBazaarWithoutMedalShouldShowInfo() { - await _cskillPacketHandler!.ExecuteAsync(new CSkillPacket(), _session!); - var lastpacket = (InfoiPacket?)_session!.LastPackets.FirstOrDefault(s => s is InfoiPacket); - Assert.IsTrue(lastpacket?.Message == Game18NConstString.NosMerchantMedaleAllowPlayerToUseNosbazarOnAllGeneralMaps); + await new Spec("Opening bazaar without medal should show info") + .WhenAsync(OpeningBazaar) + .Then(ShouldReceiveMedalRequiredMessage) + .ExecuteAsync(); } [TestMethod] - public async Task OpenAsync() + public async Task OpeningBazaarWithMedalShouldSucceed() + { + await new Spec("Opening bazaar with medal should succeed") + .Given(CharacterHasBazaarMedal) + .WhenAsync(OpeningBazaar) + .Then(NoErrorShouldOccur) + .ExecuteAsync(); + } + + private void CharacterIsInShop() + { + Session.Character.InShop = true; + } + + private async Task OpeningBazaarViaMiddleware() + { + await Session.HandlePacketsAsync(new[] { new CSkillPacket() }); + } + + private void NoPacketShouldBeSent() { - _session!.Character.StaticBonusList.Add(new StaticBonusDto + Assert.IsNull(Session.LastPackets.FirstOrDefault()); + } + + private async Task OpeningBazaar() + { + await CskillPacketHandler.ExecuteAsync(new CSkillPacket(), Session); + } + + private void ShouldReceiveMedalRequiredMessage() + { + var packet = (InfoiPacket?)Session.LastPackets.FirstOrDefault(s => s is InfoiPacket); + Assert.IsTrue(packet?.Message == Game18NConstString.NosMerchantMedaleAllowPlayerToUseNosbazarOnAllGeneralMaps); + } + + private void CharacterHasBazaarMedal() + { + Session.Character.StaticBonusList.Add(new StaticBonusDto { StaticBonusType = StaticBonusType.BazaarMedalGold }); - await _cskillPacketHandler!.ExecuteAsync(new CSkillPacket(), _session); + } + + private void NoErrorShouldOccur() + { + // Test passes if no exception is thrown } } -} \ No newline at end of file +} diff --git a/test/NosCore.PacketHandlers.Tests/CharacterScreen/CharNewJobPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/CharacterScreen/CharNewJobPacketHandlerTests.cs index be64c3b02..d8ec19d05 100644 --- a/test/NosCore.PacketHandlers.Tests/CharacterScreen/CharNewJobPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/CharacterScreen/CharNewJobPacketHandlerTests.cs @@ -2,18 +2,18 @@ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . @@ -21,72 +21,95 @@ using Mapster; using Microsoft.VisualStudio.TestTools.UnitTesting; using NosCore.Data.Dto; +using NosCore.GameObject.ComponentEntities.Entities; using NosCore.GameObject.Networking.ClientSession; using NosCore.PacketHandlers.CharacterScreen; using NosCore.Packets.ClientPackets.CharacterSelectionScreen; using NosCore.Shared.Enumerations; using NosCore.Tests.Shared; -using NosCore.GameObject.ComponentEntities.Entities; +using SpecLight; namespace NosCore.PacketHandlers.Tests.CharacterScreen { [TestClass] public class CharNewJobPacketHandlerTests { - private Character? _chara; - - private CharNewJobPacketHandler? _charNewJobPacketHandler; - private ClientSession? _session; + private Character Chara = null!; + private CharNewJobPacketHandler CharNewJobPacketHandler = null!; + private ClientSession Session = null!; + private const string TestCharacterName = "TestCharacter"; [TestInitialize] public async Task SetupAsync() { await TestHelpers.ResetAsync(); - _session = await TestHelpers.Instance.GenerateSessionAsync(); - _chara = _session.Character; - await _session.SetCharacterAsync(null); - TypeAdapterConfig.NewConfig().ConstructUsing(src => _chara); - _charNewJobPacketHandler = new CharNewJobPacketHandler(TestHelpers.Instance.CharacterDao, TestHelpers.Instance.WorldConfiguration); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + Chara = Session.Character; + await Session.SetCharacterAsync(null); + TypeAdapterConfig.NewConfig().ConstructUsing(src => Chara); + CharNewJobPacketHandler = new CharNewJobPacketHandler(TestHelpers.Instance.CharacterDao, TestHelpers.Instance.WorldConfiguration); } [TestMethod] - public async Task CreateMartialArtistWhenNoLevel80_Does_Not_Create_CharacterAsync() + public async Task CreatingMartialArtistWithoutLevel80ShouldFail() { - const string name = "TestCharacter"; - await _charNewJobPacketHandler!.ExecuteAsync(new CharNewJobPacket - { - Name = name - }, _session!); - Assert.IsNull(await TestHelpers.Instance.CharacterDao.FirstOrDefaultAsync(s => s.Name == name)); + await new Spec("Creating martial artist without level 80 should fail") + .WhenAsync(CreatingMartialArtistAsync) + .ThenAsync(CharacterShouldNotExistAsync) + .ExecuteAsync(); } [TestMethod] - public async Task CreateMartialArtist_WorksAsync() + public async Task CreatingMartialArtistWithLevel80ShouldSucceed() { - const string name = "TestCharacter"; - _chara!.Level = 80; - CharacterDto character = _chara; - await TestHelpers.Instance.CharacterDao.TryInsertOrUpdateAsync(character); - await _charNewJobPacketHandler!.ExecuteAsync(new CharNewJobPacket - { - Name = name - }, _session!); - Assert.IsNotNull(await TestHelpers.Instance.CharacterDao.FirstOrDefaultAsync(s => s.Name == name)); + await new Spec("Creating martial artist with level 80 should succeed") + .GivenAsync(CharacterIsLevel_Async, 80) + .WhenAsync(CreatingMartialArtistAsync) + .ThenAsync(CharacterShouldExistAsync) + .ExecuteAsync(); } [TestMethod] - public async Task CreateMartialArtistWhenAlreadyOne_Does_Not_Create_CharacterAsync() + public async Task CreatingMartialArtistWhenAlreadyOneShouldFail() + { + await new Spec("Creating martial artist when already one should fail") + .GivenAsync(CharacterIsAlreadyMartialArtistAsync) + .WhenAsync(CreatingMartialArtistAsync) + .ThenAsync(CharacterShouldNotExistAsync) + .ExecuteAsync(); + } + + private async Task CharacterIsLevel_Async(int level) + { + Chara.Level = (byte)level; + CharacterDto character = Chara; + await TestHelpers.Instance.CharacterDao.TryInsertOrUpdateAsync(character); + } + + private async Task CharacterIsAlreadyMartialArtistAsync() { - const string name = "TestCharacter"; - _chara!.Class = CharacterClassType.MartialArtist; - CharacterDto character = _chara; - _chara.Level = 80; + Chara.Class = CharacterClassType.MartialArtist; + Chara.Level = 80; + CharacterDto character = Chara; await TestHelpers.Instance.CharacterDao.TryInsertOrUpdateAsync(character); - await _charNewJobPacketHandler!.ExecuteAsync(new CharNewJobPacket + } + + private async Task CreatingMartialArtistAsync() + { + await CharNewJobPacketHandler.ExecuteAsync(new CharNewJobPacket { - Name = name - }, _session!); - Assert.IsNull(await TestHelpers.Instance.CharacterDao.FirstOrDefaultAsync(s => s.Name == name)); + Name = TestCharacterName + }, Session); + } + + private async Task CharacterShouldNotExistAsync() + { + Assert.IsNull(await TestHelpers.Instance.CharacterDao.FirstOrDefaultAsync(s => s.Name == TestCharacterName)); + } + + private async Task CharacterShouldExistAsync() + { + Assert.IsNotNull(await TestHelpers.Instance.CharacterDao.FirstOrDefaultAsync(s => s.Name == TestCharacterName)); } } -} \ No newline at end of file +} diff --git a/test/NosCore.PacketHandlers.Tests/CharacterScreen/CharNewPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/CharacterScreen/CharNewPacketHandlerTests.cs index 71dc7413a..74d90b547 100644 --- a/test/NosCore.PacketHandlers.Tests/CharacterScreen/CharNewPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/CharacterScreen/CharNewPacketHandlerTests.cs @@ -2,18 +2,18 @@ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . @@ -30,21 +30,22 @@ using NosCore.Dao.Interfaces; using NosCore.Data.Dto; using NosCore.Data.Enumerations.Map; +using NosCore.GameObject.ComponentEntities.Entities; +using NosCore.GameObject.Infastructure; using NosCore.GameObject.Map; using NosCore.GameObject.Networking.ClientSession; -using NosCore.Networking.SessionGroup; using NosCore.GameObject.Services.EventLoaderService; using NosCore.GameObject.Services.ItemGenerationService; using NosCore.GameObject.Services.MapChangeService; using NosCore.GameObject.Services.MapInstanceGenerationService; using NosCore.GameObject.Services.MapItemGenerationService; +using NosCore.Networking.SessionGroup; using NosCore.PacketHandlers.CharacterScreen; using NosCore.Packets.ClientPackets.CharacterSelectionScreen; using NosCore.Packets.ClientPackets.Drops; using NosCore.Tests.Shared; using Serilog; -using NosCore.GameObject.ComponentEntities.Entities; -using NosCore.GameObject.Infastructure; +using SpecLight; namespace NosCore.PacketHandlers.Tests.CharacterScreen { @@ -52,87 +53,149 @@ namespace NosCore.PacketHandlers.Tests.CharacterScreen public class CharNewPacketHandlerTests { private static readonly ILogger Logger = new Mock().Object; - private Character? _chara; - private CharNewPacketHandler? _charNewPacketHandler; - private ClientSession? _session; - private Mock _mapChangeService = null!; - + private Character Chara = null!; + private CharNewPacketHandler CharNewPacketHandler = null!; + private ClientSession Session = null!; + private Mock MapChangeService = null!; + private const string TestCharacterName = "TestCharacter"; [TestInitialize] public async Task SetupAsync() { await TestHelpers.ResetAsync(); - _charNewPacketHandler = + CharNewPacketHandler = new CharNewPacketHandler(TestHelpers.Instance.CharacterDao, TestHelpers.Instance.MinilandDao, new Mock().Object, new Mock>().Object, - new Mock>().Object, new Mock>().Object, new HpService(), new MpService(), TestHelpers.Instance.WorldConfiguration, new Mock>().Object); - _session = await TestHelpers.Instance.GenerateSessionAsync(new List { _charNewPacketHandler }); - _chara = _session.Character; - _mapChangeService = new Mock(); - TypeAdapterConfig.NewConfig().ConstructUsing(src => _chara); - await _session.SetCharacterAsync(null); + new Mock>().Object, new Mock>().Object, new HpService(), new MpService(), TestHelpers.Instance.WorldConfiguration, new Mock>().Object); + Session = await TestHelpers.Instance.GenerateSessionAsync(new List { CharNewPacketHandler }); + Chara = Session.Character; + MapChangeService = new Mock(); + TypeAdapterConfig.NewConfig().ConstructUsing(src => Chara); + await Session.SetCharacterAsync(null); } [TestMethod] - public async Task CreateCharacterWhenInGame_Does_Not_Create_CharacterAsync() + public async Task CreatingCharacterWhenInGameShouldFail() + { + await new Spec("Creating character when in game should fail") + .GivenAsync(CharacterIsInGame) + .WhenAsync(CreatingCharacterViaPacket) + .ThenAsync(CharacterShouldNotExist) + .ExecuteAsync(); + } + + [TestMethod] + public async Task CreatingCharacterShouldSucceed() + { + await new Spec("Creating character should succeed") + .WhenAsync(CreatingCharacter) + .ThenAsync(CharacterShouldExist) + .ExecuteAsync(); + } + + [TestMethod] + public async Task CreatingCharacterWithInvalidNameShouldFail() + { + await new Spec("Creating character with invalid name should fail") + .WhenAsync(CreatingCharacterWithInvalidName) + .ThenAsync(CharacterWithInvalidNameShouldNotExist) + .ExecuteAsync(); + } + + [TestMethod] + public async Task CreatingCharacterWithExistingNameShouldFail() + { + await new Spec("Creating character with existing name should fail") + .WhenAsync(CreatingCharacterWithExistingName) + .Then(OnlyOneCharacterWithNameShouldExist) + .ExecuteAsync(); + } + + [TestMethod] + public async Task CreatingCharacterInNonEmptySlotShouldFail() + { + await new Spec("Creating character in non empty slot should fail") + .WhenAsync(CreatingCharacterInSlot_, 1) + .Then(OnlyOneCharacterInSlot_ShouldExist, 1) + .ExecuteAsync(); + } + + private async Task CharacterIsInGame() { var idServer = new IdService(1); - await _session!.SetCharacterAsync(_chara); - _session.Character.MapInstance = + await Session.SetCharacterAsync(Chara); + Session.Character.MapInstance = new MapInstance(new Map(), new Guid(), true, MapInstanceType.BaseMapInstance, new MapItemGenerationService(new EventLoaderService, IGetMapItemEventHandler>(new List>>()), idServer), - Logger, TestHelpers.Instance.Clock, _mapChangeService.Object, new Mock().Object, TestHelpers.Instance.SessionRegistry); - const string name = "TestCharacter"; - await _session!.HandlePacketsAsync(new[] {new CharNewPacket - { - Name = name - }}); - Assert.IsNull(await TestHelpers.Instance.CharacterDao.FirstOrDefaultAsync(s => s.Name == name)); + Logger, TestHelpers.Instance.Clock, MapChangeService.Object, new Mock().Object, TestHelpers.Instance.SessionRegistry); } - [TestMethod] - public async Task CreateCharacterAsync() + private async Task CreatingCharacterViaPacket() { - const string name = "TestCharacter"; - await _charNewPacketHandler!.ExecuteAsync(new CharNewPacket + await Session.HandlePacketsAsync(new[] { - Name = name - }, _session!); - Assert.IsNotNull(await TestHelpers.Instance.CharacterDao.FirstOrDefaultAsync(s => s.Name == name)); + new CharNewPacket + { + Name = TestCharacterName + } + }); } + private async Task CreatingCharacter() + { + await CharNewPacketHandler.ExecuteAsync(new CharNewPacket + { + Name = TestCharacterName + }, Session); + } - [TestMethod] - public async Task InvalidName_Does_Not_Create_CharacterAsync() + private async Task CreatingCharacterWithInvalidName() { - const string name = "Test Character"; - await _charNewPacketHandler!.ExecuteAsync(new CharNewPacket + await CharNewPacketHandler.ExecuteAsync(new CharNewPacket { - Name = name - }, _session!); - Assert.IsNull(await TestHelpers.Instance.CharacterDao.FirstOrDefaultAsync(s => s.Name == name)); + Name = "Test Character" + }, Session); } - [TestMethod] - public async Task ExistingName_Does_Not_Create_CharacterAsync() + private async Task CreatingCharacterWithExistingName() { - const string name = "TestExistingCharacter"; - await _charNewPacketHandler!.ExecuteAsync(new CharNewPacket + await CharNewPacketHandler.ExecuteAsync(new CharNewPacket { - Name = name - }, _session!); - Assert.IsFalse(TestHelpers.Instance.CharacterDao.Where(s => s.Name == name)!.Skip(1).Any()); + Name = "TestExistingCharacter" + }, Session); } - [TestMethod] - public async Task NotEmptySlot_Does_Not_Create_CharacterAsync() + private async Task CreatingCharacterInSlot_(int value) { - const string name = "TestCharacter"; - await _charNewPacketHandler!.ExecuteAsync(new CharNewPacket + await CharNewPacketHandler.ExecuteAsync(new CharNewPacket { - Name = name, - Slot = 1 - }, _session!); - Assert.IsFalse(TestHelpers.Instance.CharacterDao.Where(s => s.Slot == 1)!.Skip(1).Any()); + Name = TestCharacterName, + Slot = (byte)value + }, Session); + } + + private async Task CharacterShouldNotExist() + { + Assert.IsNull(await TestHelpers.Instance.CharacterDao.FirstOrDefaultAsync(s => s.Name == TestCharacterName)); + } + + private async Task CharacterShouldExist() + { + Assert.IsNotNull(await TestHelpers.Instance.CharacterDao.FirstOrDefaultAsync(s => s.Name == TestCharacterName)); + } + + private async Task CharacterWithInvalidNameShouldNotExist() + { + Assert.IsNull(await TestHelpers.Instance.CharacterDao.FirstOrDefaultAsync(s => s.Name == "Test Character")); + } + + private void OnlyOneCharacterWithNameShouldExist() + { + Assert.IsFalse(TestHelpers.Instance.CharacterDao.Where(s => s.Name == "TestExistingCharacter")!.Skip(1).Any()); + } + + private void OnlyOneCharacterInSlot_ShouldExist(int value) + { + Assert.IsFalse(TestHelpers.Instance.CharacterDao.Where(s => s.Slot == value)!.Skip(1).Any()); } } -} \ No newline at end of file +} diff --git a/test/NosCore.PacketHandlers.Tests/CharacterScreen/CharRenPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/CharacterScreen/CharRenPacketHandlerTests.cs index e95938609..59c84ad49 100644 --- a/test/NosCore.PacketHandlers.Tests/CharacterScreen/CharRenPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/CharacterScreen/CharRenPacketHandlerTests.cs @@ -2,18 +2,18 @@ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . @@ -24,20 +24,21 @@ using Moq; using NosCore.Core.Services.IdService; using NosCore.Data.Enumerations.Map; +using NosCore.GameObject.ComponentEntities.Entities; +using NosCore.GameObject.Infastructure; using NosCore.GameObject.Map; using NosCore.GameObject.Networking.ClientSession; -using NosCore.Networking.SessionGroup; using NosCore.GameObject.Services.EventLoaderService; using NosCore.GameObject.Services.MapChangeService; using NosCore.GameObject.Services.MapInstanceGenerationService; using NosCore.GameObject.Services.MapItemGenerationService; +using NosCore.Networking.SessionGroup; using NosCore.PacketHandlers.CharacterScreen; using NosCore.Packets.ClientPackets.CharacterSelectionScreen; using NosCore.Packets.ClientPackets.Drops; using NosCore.Tests.Shared; using Serilog; -using NosCore.GameObject.ComponentEntities.Entities; -using NosCore.GameObject.Infastructure; +using SpecLight; namespace NosCore.PacketHandlers.Tests.CharacterScreen { @@ -45,85 +46,129 @@ namespace NosCore.PacketHandlers.Tests.CharacterScreen public class CharRenPacketHandlerTests { private static readonly ILogger Logger = new Mock().Object; - private Character? _chara; - private CharRenPacketHandler? _charRenPacketHandler; - private ClientSession? _session; - private Mock _mapChangeService = null!; + private Character Chara = null!; + private CharRenPacketHandler CharRenPacketHandler = null!; + private ClientSession Session = null!; + private Mock MapChangeService = null!; + private const string NewCharacterName = "TestCharacter2"; [TestInitialize] public async Task SetupAsync() { await TestHelpers.ResetAsync(); - _mapChangeService = new Mock(); - _charRenPacketHandler = + MapChangeService = new Mock(); + CharRenPacketHandler = new CharRenPacketHandler(TestHelpers.Instance.CharacterDao, TestHelpers.Instance.WorldConfiguration); - _session = await TestHelpers.Instance.GenerateSessionAsync(new List{ - _charRenPacketHandler + Session = await TestHelpers.Instance.GenerateSessionAsync(new List + { + CharRenPacketHandler }); - _chara = _session.Character; - _chara.ShouldRename = true; - await TestHelpers.Instance.CharacterDao.TryInsertOrUpdateAsync(_session.Character); - await _session.SetCharacterAsync(null); + Chara = Session.Character; + Chara.ShouldRename = true; + await TestHelpers.Instance.CharacterDao.TryInsertOrUpdateAsync(Session.Character); + await Session.SetCharacterAsync(null); + } + [TestMethod] + public async Task RenamingCharacterWhenInGameShouldFail() + { + await new Spec("Renaming character when in game should fail") + .GivenAsync(CharacterIsInGame) + .WhenAsync(RenamingCharacterViaPacket) + .ThenAsync(CharacterShouldNotBeRenamed) + .ExecuteAsync(); } [TestMethod] - public async Task RenameCharacterWhenInGame_Does_Not_Rename_CharacterAsync() + public async Task RenamingCharacterShouldSucceed() + { + await new Spec("Renaming character should succeed") + .WhenAsync(RenamingCharacter) + .ThenAsync(CharacterShouldBeRenamed) + .AndAsync(ShouldRenameFlagShouldBeCleared) + .ExecuteAsync(); + } + + [TestMethod] + public async Task RenamingUnflaggedCharacterShouldFail() + { + await new Spec("Renaming unflagged character should fail") + .GivenAsync(CharacterIsNotFlaggedForRename) + .WhenAsync(RenamingCharacter) + .ThenAsync(CharacterShouldNotBeRenamed) + .ExecuteAsync(); + } + + [TestMethod] + public async Task RenamingNonExistentCharacterShouldFail() + { + await new Spec("Renaming non existent character should fail") + .WhenAsync(RenamingCharacterInWrongSlot) + .ThenAsync(CharacterShouldNotBeRenamed) + .ExecuteAsync(); + } + + private async Task CharacterIsInGame() { var idServer = new IdService(1); - await _session!.SetCharacterAsync(_chara); - _session.Character.MapInstance = + await Session.SetCharacterAsync(Chara); + Session.Character.MapInstance = new MapInstance(new Map(), new Guid(), true, MapInstanceType.BaseMapInstance, new MapItemGenerationService(new EventLoaderService, IGetMapItemEventHandler>(new List>>()), idServer), - Logger, TestHelpers.Instance.Clock, _mapChangeService.Object, new Mock().Object, TestHelpers.Instance.SessionRegistry); - const string name = "TestCharacter2"; - await _session!.HandlePacketsAsync(new[] { new CharRenamePacket - { - Name = name, - Slot = 1 - }}); - Assert.IsNull(await TestHelpers.Instance.CharacterDao.FirstOrDefaultAsync(s => s.Name == name)); + Logger, TestHelpers.Instance.Clock, MapChangeService.Object, new Mock().Object, TestHelpers.Instance.SessionRegistry); } - [TestMethod] - public async Task RenameCharacterAsync() + private async Task CharacterIsNotFlaggedForRename() + { + Chara.ShouldRename = false; + await TestHelpers.Instance.CharacterDao.TryInsertOrUpdateAsync(Chara); + } + + private async Task RenamingCharacterViaPacket() { - const string name = "TestCharacter2"; - await _charRenPacketHandler!.ExecuteAsync(new CharRenamePacket + await Session.HandlePacketsAsync(new[] { - Name = name, - Slot = 1 - }, _session!); - var character = await TestHelpers.Instance.CharacterDao.FirstOrDefaultAsync(s => s.Name == name) - ; - Assert.IsNotNull(character); - Assert.IsFalse(character.ShouldRename); + new CharRenamePacket + { + Name = NewCharacterName, + Slot = 1 + } + }); } - [TestMethod] - public async Task RenameUnflaggedCharacterAsync() + private async Task RenamingCharacter() { - const string name = "TestCharacter2"; - await _charRenPacketHandler!.ExecuteAsync(new CharRenamePacket + await CharRenPacketHandler.ExecuteAsync(new CharRenamePacket { - Name = name, + Name = NewCharacterName, Slot = 1 - }, _session!); - _chara!.ShouldRename = false; - await TestHelpers.Instance.CharacterDao.TryInsertOrUpdateAsync(_chara); - Assert.IsNull(await TestHelpers.Instance.CharacterDao.FirstOrDefaultAsync(s => s.Name == name)); + }, Session); } - [TestMethod] - public async Task RenameNotFoundCharacterAsync() + private async Task RenamingCharacterInWrongSlot() { - const string name = "TestCharacter2"; - await _charRenPacketHandler!.ExecuteAsync(new CharRenamePacket + await CharRenPacketHandler.ExecuteAsync(new CharRenamePacket { - Name = name, + Name = NewCharacterName, Slot = 2 - }, _session!); - Assert.IsNull(await TestHelpers.Instance.CharacterDao.FirstOrDefaultAsync(s => s.Name == name)); + }, Session); + } + + private async Task CharacterShouldNotBeRenamed() + { + Assert.IsNull(await TestHelpers.Instance.CharacterDao.FirstOrDefaultAsync(s => s.Name == NewCharacterName)); + } + + private async Task CharacterShouldBeRenamed() + { + var character = await TestHelpers.Instance.CharacterDao.FirstOrDefaultAsync(s => s.Name == NewCharacterName); + Assert.IsNotNull(character); + } + + private async Task ShouldRenameFlagShouldBeCleared() + { + var character = await TestHelpers.Instance.CharacterDao.FirstOrDefaultAsync(s => s.Name == NewCharacterName); + Assert.IsFalse(character!.ShouldRename); } } -} \ No newline at end of file +} diff --git a/test/NosCore.PacketHandlers.Tests/CharacterScreen/CharacterDeletePacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/CharacterScreen/CharacterDeletePacketHandlerTests.cs index 8136eb19c..650ec33fa 100644 --- a/test/NosCore.PacketHandlers.Tests/CharacterScreen/CharacterDeletePacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/CharacterScreen/CharacterDeletePacketHandlerTests.cs @@ -2,18 +2,18 @@ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . @@ -22,74 +22,111 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using NosCore.Core.Encryption; using NosCore.Data.Enumerations.Character; +using NosCore.GameObject.Infastructure; using NosCore.GameObject.Networking.ClientSession; using NosCore.PacketHandlers.CharacterScreen; using NosCore.Packets.ClientPackets.CharacterSelectionScreen; using NosCore.Tests.Shared; -using NosCore.GameObject.Infastructure; +using SpecLight; namespace NosCore.PacketHandlers.Tests.CharacterScreen { [TestClass] public class CharacterDeletePacketHandlerTests { - private CharacterDeletePacketHandler? _characterDeletePacketHandler; - private ClientSession? _session; + private CharacterDeletePacketHandler CharacterDeletePacketHandler = null!; + private ClientSession Session = null!; [TestInitialize] public async Task SetupAsync() { await TestHelpers.ResetAsync(); - _characterDeletePacketHandler = + CharacterDeletePacketHandler = new CharacterDeletePacketHandler(TestHelpers.Instance.CharacterDao, TestHelpers.Instance.AccountDao, new Sha512Hasher(), TestHelpers.Instance.WorldConfiguration); - _session = await TestHelpers.Instance.GenerateSessionAsync(new List{ - _characterDeletePacketHandler + Session = await TestHelpers.Instance.GenerateSessionAsync(new List + { + CharacterDeletePacketHandler }); + } + + [TestMethod] + public async Task DeletingCharacterWithInvalidPasswordShouldFail() + { + await new Spec("Deleting character with invalid password should fail") + .GivenAsync(CharacterIsNotInGame) + .WhenAsync(DeletingCharacterWithInvalidPassword) + .ThenAsync(CharacterShouldStillExist) + .ExecuteAsync(); + } + [TestMethod] + public async Task DeletingCharacterWhenInGameShouldFail() + { + await new Spec("Deleting character when in game should fail") + .WhenAsync(DeletingCharacterViaPacket) + .ThenAsync(CharacterShouldStillExist) + .ExecuteAsync(); } [TestMethod] - public async Task DeleteCharacter_Invalid_PasswordAsync() + public async Task DeletingCharacterWithValidPasswordShouldSucceed() + { + await new Spec("Deleting character with valid password should succeed") + .GivenAsync(CharacterIsNotInGame) + .WhenAsync(DeletingCharacterWithValidPassword) + .ThenAsync(CharacterShouldBeDeleted) + .ExecuteAsync(); + } + + private async Task CharacterIsNotInGame() + { + await Session.SetCharacterAsync(null); + } + + private async Task DeletingCharacterWithInvalidPassword() { - await _session!.SetCharacterAsync(null); - await _characterDeletePacketHandler!.ExecuteAsync(new CharacterDeletePacket + await CharacterDeletePacketHandler.ExecuteAsync(new CharacterDeletePacket { Slot = 1, Password = "testpassword" - }, _session); - Assert.IsNotNull( - await TestHelpers.Instance.CharacterDao - .FirstOrDefaultAsync(s => - (s.AccountId == _session.Account.AccountId) && (s.State == CharacterState.Active))); + }, Session); } - [TestMethod] - public async Task DeleteCharacterWhenInGame_Does_Not_Delete_CharacterAsync() + private async Task DeletingCharacterViaPacket() + { + await Session.HandlePacketsAsync(new[] + { + new CharacterDeletePacket + { + Slot = 1, + Password = "test" + } + }); + } + + private async Task DeletingCharacterWithValidPassword() { - await _session!.HandlePacketsAsync(new[]{new CharacterDeletePacket + await CharacterDeletePacketHandler.ExecuteAsync(new CharacterDeletePacket { Slot = 1, Password = "test" - }}); + }, Session); + } + + private async Task CharacterShouldStillExist() + { Assert.IsNotNull( await TestHelpers.Instance.CharacterDao .FirstOrDefaultAsync(s => - (s.AccountId == _session!.Account.AccountId) && (s.State == CharacterState.Active))); + (s.AccountId == Session.Account.AccountId) && (s.State == CharacterState.Active))); } - [TestMethod] - public async Task DeleteCharacterAsync() + private async Task CharacterShouldBeDeleted() { - await _session!.SetCharacterAsync(null); - await _characterDeletePacketHandler!.ExecuteAsync(new CharacterDeletePacket - { - Slot = 1, - Password = "test" - }, _session); Assert.IsNull( await TestHelpers.Instance.CharacterDao .FirstOrDefaultAsync(s => - (s.AccountId == _session.Account.AccountId) && (s.State == CharacterState.Active))); + (s.AccountId == Session.Account.AccountId) && (s.State == CharacterState.Active))); } } -} \ No newline at end of file +} diff --git a/test/NosCore.PacketHandlers.Tests/CharacterScreen/DacPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/CharacterScreen/DacPacketHandlerTests.cs index 125d3383d..da497af85 100644 --- a/test/NosCore.PacketHandlers.Tests/CharacterScreen/DacPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/CharacterScreen/DacPacketHandlerTests.cs @@ -2,18 +2,18 @@ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . @@ -33,6 +33,7 @@ using NosCore.Packets.ClientPackets.Infrastructure; using NosCore.Tests.Shared; using Serilog; +using SpecLight; namespace NosCore.PacketHandlers.Tests.CharacterScreen { @@ -40,99 +41,140 @@ namespace NosCore.PacketHandlers.Tests.CharacterScreen public class DacPacketHandlerTests { private static readonly Mock Logger = new(); - private DacPacketHandler _dacPacketHandler = null!; - private ClientSession _session = null!; - private Mock _authHttpClient = null!; - private Mock _pubSubHub = null!; - private Mock _channelHub = null!; - private string _accountName = null!; + private DacPacketHandler DacPacketHandler = null!; + private ClientSession Session = null!; + private Mock AuthHttpClient = null!; + private Mock PubSubHub = null!; + private Mock ChannelHub = null!; + private string AccountName = null!; [TestInitialize] public async Task SetupAsync() { await TestHelpers.ResetAsync(); - _session = await TestHelpers.Instance.GenerateSessionAsync(); - _accountName = _session.Account.Name; - _session.Account = null!; - await TestHelpers.Instance.CharacterDao.TryInsertOrUpdateAsync(_session.Character); - await _session.SetCharacterAsync(null); - _authHttpClient = new Mock(); - _pubSubHub = TestHelpers.Instance.PubSubHub; - _channelHub = TestHelpers.Instance.ChannelHub; - _channelHub.Setup(o => o.GetCommunicationChannels()).ReturnsAsync(new List()); - _pubSubHub.Setup(o => o.GetSubscribersAsync()).ReturnsAsync(new List()); - _dacPacketHandler = - new DacPacketHandler(TestHelpers.Instance.AccountDao, Logger.Object, _authHttpClient.Object, TestHelpers.Instance.PubSubHub.Object, new SessionRefHolder(), TestHelpers.Instance.LogLanguageLocalizer); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + AccountName = Session.Account.Name; + Session.Account = null!; + await TestHelpers.Instance.CharacterDao.TryInsertOrUpdateAsync(Session.Character); + await Session.SetCharacterAsync(null); + AuthHttpClient = new Mock(); + PubSubHub = TestHelpers.Instance.PubSubHub; + ChannelHub = TestHelpers.Instance.ChannelHub; + ChannelHub.Setup(o => o.GetCommunicationChannels()).ReturnsAsync(new List()); + PubSubHub.Setup(o => o.GetSubscribersAsync()).ReturnsAsync(new List()); + DacPacketHandler = + new DacPacketHandler(TestHelpers.Instance.AccountDao, Logger.Object, AuthHttpClient.Object, TestHelpers.Instance.PubSubHub.Object, new SessionRefHolder(), TestHelpers.Instance.LogLanguageLocalizer); } [TestMethod] - public async Task ConnectionWithAlreadyConnectedAccountAsync() + public async Task ConnectionWithAlreadyConnectedAccountShouldFail() { - var packet = new DacPacket(_accountName) - { - Slot = 2, - }; - _channelHub.Setup(o => o.GetCommunicationChannels()).ReturnsAsync(new List() + await new Spec("Connection with already connected account should fail") + .Given(AccountIsAlreadyConnected) + .WhenAsync(ConnectingWithAccount) + .Then(AlreadyConnectedErrorShouldBeLogged) + .And(AccountShouldBeNull) + .ExecuteAsync(); + } + + [TestMethod] + public async Task ConnectionWithInvalidAccountShouldFail() + { + await new Spec("Connection with invalid account should fail") + .WhenAsync(ConnectingWithFakeAccount) + .Then(InvalidAccountErrorShouldBeLogged) + .And(AccountShouldBeNull) + .ExecuteAsync(); + } + + [TestMethod] + public async Task ConnectionWithNotInWaitingAccountShouldFail() + { + await new Spec("Connection with not in waiting account should fail") + .WhenAsync(ConnectingWithAccount) + .Then(InvalidPasswordErrorShouldBeLogged) + .And(AccountShouldBeNull) + .ExecuteAsync(); + } + + [TestMethod] + public async Task ConnectionWithWaitingAccountShouldSucceed() + { + await new Spec("Connection with waiting account should succeed") + .Given(AccountIsInWaitingState) + .WhenAsync(ConnectingWithAccount) + .Then(AccountShouldBeSet) + .ExecuteAsync(); + } + + private void AccountIsAlreadyConnected() + { + ChannelHub.Setup(o => o.GetCommunicationChannels()).ReturnsAsync(new List() { new() { Id = 1, } }); - _pubSubHub.Setup(o => o.GetSubscribersAsync()).ReturnsAsync( + PubSubHub.Setup(o => o.GetSubscribersAsync()).ReturnsAsync( new List { new() { ChannelId = 1, - Name = _accountName + Name = AccountName } }); - await _dacPacketHandler.ExecuteAsync(packet, _session); - Logger.Verify(o => o.Error(It.Is(o => o == TestHelpers.Instance.LogLanguageLocalizer[LogLanguageKey.ALREADY_CONNECTED]), It.Is((v, t) => true)), Times.Once); - Assert.IsNull(_session.Account); } - [TestMethod] - public async Task ConnectionWithInvalidAccountAsync() + private void AccountIsInWaitingState() + { + AuthHttpClient.Setup(authHttpClient => authHttpClient + .GetAwaitingConnectionAsync(It.IsAny(), It.IsAny(), It.IsAny())) + .ReturnsAsync("123"); + } + + private async Task ConnectingWithAccount() + { + var packet = new DacPacket(AccountName) + { + Slot = 0, + }; + await DacPacketHandler.ExecuteAsync(packet, Session); + } + + private async Task ConnectingWithFakeAccount() { var packet = new DacPacket("fakeName") { Slot = 2, }; - await _dacPacketHandler.ExecuteAsync(packet, _session); - Logger.Verify(o => o.Error(It.Is(o => o == TestHelpers.Instance.LogLanguageLocalizer[LogLanguageKey.INVALID_ACCOUNT]), + await DacPacketHandler.ExecuteAsync(packet, Session); + } - It.Is((v, t) => true)), Times.Once); + private void AlreadyConnectedErrorShouldBeLogged() + { + Logger.Verify(o => o.Error(It.Is(s => s == TestHelpers.Instance.LogLanguageLocalizer[LogLanguageKey.ALREADY_CONNECTED]), It.Is((v, t) => true)), Times.Once); + } - Assert.IsNull(_session.Account); + private void InvalidAccountErrorShouldBeLogged() + { + Logger.Verify(o => o.Error(It.Is(s => s == TestHelpers.Instance.LogLanguageLocalizer[LogLanguageKey.INVALID_ACCOUNT]), It.Is((v, t) => true)), Times.Once); } - [TestMethod] - public async Task ConnectionWithNotInwaitingAccountAsync() + private void InvalidPasswordErrorShouldBeLogged() { - await _dacPacketHandler.ExecuteAsync(new DacPacket(_accountName) - { - Slot = 0, - }, _session); - Logger.Verify(o => o.Error(It.Is(o => o == TestHelpers.Instance.LogLanguageLocalizer[LogLanguageKey.INVALID_PASSWORD]), + Logger.Verify(o => o.Error(It.Is(s => s == TestHelpers.Instance.LogLanguageLocalizer[LogLanguageKey.INVALID_PASSWORD]), It.Is((v, t) => true)), Times.Once); + } - It.Is((v, t) => true)), Times.Once); - Assert.IsNull(_session.Account); + private void AccountShouldBeNull() + { + Assert.IsNull(Session.Account); } - [TestMethod] - public async Task ConnectionWithInwaitingAccountAsync() + private void AccountShouldBeSet() { - var packet = new DacPacket(_accountName) - { - Slot = 0, - }; - _authHttpClient.Setup(authHttpClient => authHttpClient - .GetAwaitingConnectionAsync(It.IsAny(), It.IsAny(), It.IsAny())) - .ReturnsAsync("123"); - await _dacPacketHandler.ExecuteAsync(packet, _session); - Assert.IsNotNull(_session.Account); + Assert.IsNotNull(Session.Account); } } -} \ No newline at end of file +} diff --git a/test/NosCore.PacketHandlers.Tests/CharacterScreen/EntryPointPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/CharacterScreen/EntryPointPacketHandlerTests.cs new file mode 100644 index 000000000..645edafe5 --- /dev/null +++ b/test/NosCore.PacketHandlers.Tests/CharacterScreen/EntryPointPacketHandlerTests.cs @@ -0,0 +1,276 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.Dao.Interfaces; +using NosCore.Data.CommandPackets; +using NosCore.Data.Dto; +using NosCore.Data.Enumerations.I18N; +using NosCore.Data.WebApi; +using NosCore.GameObject.InterChannelCommunication.Hubs.AuthHub; +using NosCore.GameObject.InterChannelCommunication.Hubs.PubSub; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.Networking.SessionRef; +using NosCore.PacketHandlers.CharacterScreen; +using NosCore.Packets.ServerPackets.CharacterSelectionScreen; +using NosCore.Packets.ServerPackets.UI; +using NosCore.Tests.Shared; +using Serilog; +using SpecLight; + +namespace NosCore.PacketHandlers.Tests.CharacterScreen +{ + [TestClass] + public class EntryPointPacketHandlerTests + { + private static readonly Mock Logger = new(); + private EntryPointPacketHandler EntryPointPacketHandler = null!; + private ClientSession Session = null!; + private Mock AuthHttpClient = null!; + private Mock PubSubHub = null!; + private string AccountName = null!; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + AccountName = Session.Account.Name; + Session.Account = null!; + await TestHelpers.Instance.CharacterDao.TryInsertOrUpdateAsync(Session.Character); + await Session.SetCharacterAsync(null); + AuthHttpClient = new Mock(); + PubSubHub = TestHelpers.Instance.PubSubHub; + PubSubHub.Setup(o => o.GetSubscribersAsync()).ReturnsAsync(new List()); + EntryPointPacketHandler = new EntryPointPacketHandler( + TestHelpers.Instance.CharacterDao, + TestHelpers.Instance.AccountDao, + TestHelpers.Instance.MateDao, + Logger.Object, + AuthHttpClient.Object, + PubSubHub.Object, + TestHelpers.Instance.WorldConfiguration, + new SessionRefHolder(), + TestHelpers.Instance.LogLanguageLocalizer); + } + + [TestMethod] + public async Task ConnectionWithAlreadyConnectedAccountShouldFail() + { + await new Spec("Connection with already connected account should fail") + .Given(AccountIsAlreadyConnected) + .WhenAsync(ConnectingWithValidPassword) + .Then(AlreadyConnectedErrorShouldBeLogged) + .And(AccountShouldBeNull) + .ExecuteAsync(); + } + + [TestMethod] + public async Task ConnectionWithInvalidAccountShouldFail() + { + await new Spec("Connection with invalid account should fail") + .WhenAsync(ConnectingWithFakeAccount) + .Then(InvalidAccountErrorShouldBeLogged) + .And(AccountShouldBeNull) + .ExecuteAsync(); + } + + [TestMethod] + public async Task ConnectionWithInvalidPasswordShouldFail() + { + await new Spec("Connection with invalid password should fail") + .WhenAsync(ConnectingWithInvalidPassword) + .Then(InvalidPasswordErrorShouldBeLogged) + .And(AccountShouldBeNull) + .ExecuteAsync(); + } + + [TestMethod] + public async Task ConnectionWithValidPasswordShouldSucceed() + { + await new Spec("Connection with valid password should succeed") + .Given(AccountPasswordIsValid) + .WhenAsync(ConnectingWithValidPassword) + .Then(AccountShouldBeSet) + .ExecuteAsync(); + } + + [TestMethod] + public async Task ConnectionWithGfModeShouldSucceed() + { + await new Spec("Connection with gf mode should succeed") + .Given(AccountIsInWaitingState) + .WhenAsync(ConnectingWithGfMode) + .Then(AccountShouldBeSet) + .And(MfaShouldBeValidated) + .ExecuteAsync(); + } + + [TestMethod] + public async Task ConnectionWithMfaEnabledShouldRequireValidation() + { + await new Spec("Connection with MFA enabled should require validation") + .GivenAsync(AccountHasMfaEnabled) + .WhenAsync(ConnectingWithValidPassword) + .ThenAsync(GuriPacketShouldBeSent) + .ExecuteAsync(); + } + + [TestMethod] + public async Task ConnectionWhenAccountAlreadySetShouldSendCharacterList() + { + await new Spec("Connection when account already set should send character list") + .GivenAsync(AccountIsAlreadyInitialized) + .WhenAsync(ConnectingWithValidPassword) + .ThenAsync(CharacterListShouldBeSent) + .ExecuteAsync(); + } + + private void AccountIsAlreadyConnected() + { + PubSubHub.Setup(o => o.GetSubscribersAsync()).ReturnsAsync( + new List + { + new() + { + ChannelId = 1, + Name = AccountName + } + }); + } + + private void AccountPasswordIsValid() + { + // Password "test" is already set in TestHelpers with Sha512 hash + } + + private void AccountIsInWaitingState() + { + AuthHttpClient.Setup(authHttpClient => authHttpClient + .GetAwaitingConnectionAsync(It.IsAny(), It.IsAny(), It.IsAny())) + .ReturnsAsync("123"); + } + + private async Task AccountHasMfaEnabled() + { + var account = await TestHelpers.Instance.AccountDao.FirstOrDefaultAsync(a => a.Name == AccountName); + account!.MfaSecret = "testsecret"; + await TestHelpers.Instance.AccountDao.TryInsertOrUpdateAsync(account); + } + + private async Task AccountIsAlreadyInitialized() + { + var account = await TestHelpers.Instance.AccountDao.FirstOrDefaultAsync(a => a.Name == AccountName); + Session.InitializeAccount(account!); + } + + private async Task ConnectingWithValidPassword() + { + var packet = new EntryPointPacket + { + Name = AccountName, + Password = "test" + }; + await EntryPointPacketHandler.ExecuteAsync(packet, Session); + } + + private async Task ConnectingWithInvalidPassword() + { + var packet = new EntryPointPacket + { + Name = AccountName, + Password = "wrongpassword" + }; + await EntryPointPacketHandler.ExecuteAsync(packet, Session); + } + + private async Task ConnectingWithFakeAccount() + { + var packet = new EntryPointPacket + { + Name = "fakeaccount", + Password = "test" + }; + await EntryPointPacketHandler.ExecuteAsync(packet, Session); + } + + private async Task ConnectingWithGfMode() + { + var packet = new EntryPointPacket + { + Name = AccountName, + Password = "thisisgfmode" + }; + await EntryPointPacketHandler.ExecuteAsync(packet, Session); + } + + private void AlreadyConnectedErrorShouldBeLogged() + { + Logger.Verify(o => o.Error( + It.Is(s => s == TestHelpers.Instance.LogLanguageLocalizer[LogLanguageKey.ALREADY_CONNECTED]), + It.Is((v, t) => true)), Times.Once); + } + + private void InvalidAccountErrorShouldBeLogged() + { + Logger.Verify(o => o.Error( + It.Is(s => s == TestHelpers.Instance.LogLanguageLocalizer[LogLanguageKey.INVALID_ACCOUNT]), + It.Is((v, t) => true)), Times.Once); + } + + private void InvalidPasswordErrorShouldBeLogged() + { + Logger.Verify(o => o.Error( + It.Is(s => s == TestHelpers.Instance.LogLanguageLocalizer[LogLanguageKey.INVALID_PASSWORD]), + It.Is((v, t) => true)), Times.Once); + } + + private void AccountShouldBeNull() + { + Assert.IsNull(Session.Account); + } + + private void AccountShouldBeSet() + { + Assert.IsNotNull(Session.Account); + } + + private void MfaShouldBeValidated() + { + Assert.IsTrue(Session.MfaValidated); + } + + private async Task GuriPacketShouldBeSent() + { + await Task.CompletedTask; + Assert.IsNotNull(Session.Account); + Assert.IsFalse(Session.MfaValidated); + } + + private async Task CharacterListShouldBeSent() + { + await Task.CompletedTask; + Assert.IsNotNull(Session.Account); + } + } +} diff --git a/test/NosCore.PacketHandlers.Tests/CharacterScreen/SelectPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/CharacterScreen/SelectPacketHandlerTests.cs new file mode 100644 index 000000000..1b600bbdd --- /dev/null +++ b/test/NosCore.PacketHandlers.Tests/CharacterScreen/SelectPacketHandlerTests.cs @@ -0,0 +1,116 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.Dao.Interfaces; +using NosCore.Data.Dto; +using NosCore.Data.StaticEntities; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.GameObject.Services.ItemGenerationService; +using NosCore.PacketHandlers.CharacterScreen; +using NosCore.Packets.ClientPackets.CharacterSelectionScreen; +using NosCore.Tests.Shared; +using Serilog; +using SpecLight; + +namespace NosCore.PacketHandlers.Tests.CharacterScreen +{ + [TestClass] + public class SelectPacketHandlerTests + { + private static readonly ILogger Logger = new Mock().Object; + private SelectPacketHandler SelectPacketHandler = null!; + private ClientSession Session = null!; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + await Session.SetCharacterAsync(null); + SelectPacketHandler = new SelectPacketHandler( + TestHelpers.Instance.CharacterDao, + Logger, + new Mock().Object, + TestHelpers.Instance.MapInstanceAccessorService, + new Mock>().Object, + new Mock>().Object, + new Mock>().Object, + new Mock>().Object, + new Mock>().Object, + new Mock>().Object, + new Mock>().Object, + new List(), + new List(), + TestHelpers.Instance.WorldConfiguration, + TestHelpers.Instance.LogLanguageLocalizer, + TestHelpers.Instance.PubSubHub.Object); + } + + [TestMethod] + public async Task SelectingValidSlotShouldSelectCharacter() + { + await new Spec("Selecting valid slot should select character") + .WhenAsync(SelectingCharacterInSlot_, 1) + .Then(CharacterShouldBeSelected) + .ExecuteAsync(); + } + + [TestMethod] + public async Task SelectingEmptySlotShouldFail() + { + await new Spec("Selecting empty slot should fail") + .WhenAsync(SelectingCharacterInSlot_, 0) + .Then(CharacterShouldNotBeSelected) + .ExecuteAsync(); + } + + [TestMethod] + public async Task SelectingInvalidSlotShouldFail() + { + await new Spec("Selecting invalid slot should fail") + .WhenAsync(SelectingCharacterInSlot_, 5) + .Then(CharacterShouldNotBeSelected) + .ExecuteAsync(); + } + + private async Task SelectingCharacterInSlot_(int slot) + { + var packet = new SelectPacket + { + Slot = (byte)slot + }; + await SelectPacketHandler.ExecuteAsync(packet, Session); + } + + private void CharacterShouldBeSelected() + { + Assert.IsTrue(Session.HasSelectedCharacter); + } + + private void CharacterShouldNotBeSelected() + { + Assert.IsFalse(Session.HasSelectedCharacter); + } + } +} diff --git a/test/NosCore.PacketHandlers.Tests/Chat/BtkPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Chat/BtkPacketHandlerTests.cs new file mode 100644 index 000000000..a09bdb4b7 --- /dev/null +++ b/test/NosCore.PacketHandlers.Tests/Chat/BtkPacketHandlerTests.cs @@ -0,0 +1,279 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.Core; +using NosCore.Data.WebApi; +using NosCore.GameObject.InterChannelCommunication.Hubs.FriendHub; +using NosCore.GameObject.InterChannelCommunication.Hubs.PubSub; +using NosCore.GameObject.Networking; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.GameObject.Services.BroadcastService; +using NosCore.PacketHandlers.Chat; +using NosCore.Packets.ClientPackets.Chat; +using NosCore.Packets.Enumerations; +using NosCore.Packets.Interfaces; +using NosCore.Packets.ServerPackets.UI; +using NosCore.Tests.Shared; +using Serilog; +using SpecLight; + +namespace NosCore.PacketHandlers.Tests.Chat +{ + [TestClass] + public class BtkPacketHandlerTests + { + private BtkPacketHandler Handler = null!; + private ClientSession Session = null!; + private ClientSession FriendSession = null!; + private Mock FriendHub = null!; + private Mock PubSubHub = null!; + private Mock Serializer = null!; + private Mock SessionRegistry = null!; + private readonly ILogger Logger = new Mock().Object; + private const long OfflineFriendId = 99998; + private const long DifferentChannelFriendId = 99997; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Broadcaster.Reset(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + FriendSession = await TestHelpers.Instance.GenerateSessionAsync(); + FriendHub = new Mock(); + PubSubHub = new Mock(); + Serializer = new Mock(); + SessionRegistry = new Mock(); + + FriendHub.Setup(x => x.GetFriendsAsync(It.IsAny())) + .Returns(Task.FromResult(new List())); + + PubSubHub.Setup(x => x.GetSubscribersAsync()) + .Returns(Task.FromResult(new List())); + + Serializer.Setup(x => x.Serialize(It.IsAny())) + .Returns("serialized"); + + var channel = new Channel { ChannelId = 1, ClientName = "TestChannel", Host = "localhost" }; + + Handler = new BtkPacketHandler( + Logger, + Serializer.Object, + FriendHub.Object, + PubSubHub.Object, + PubSubHub.Object, + channel, + TestHelpers.Instance.GameLanguageLocalizer, + SessionRegistry.Object); + } + + [TestMethod] + public async Task SendingMessageToNonFriendShouldBeIgnored() + { + await new Spec("Sending message to non friend should be ignored") + .Given(CharacterIsOnMap) + .WhenAsync(SendingMessageToNonFriendAsync) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); + } + + [TestMethod] + public async Task SendingMessageToOfflineFriendShouldShowOfflineMessage() + { + await new Spec("Sending message to offline friend should show offline message") + .Given(CharacterIsOnMap) + .And(OfflineTargetIsFriend) + .WhenAsync(SendingMessageToOfflineFriendAsync) + .Then(ShouldReceiveFriendOfflineMessage) + .ExecuteAsync(); + } + + [TestMethod] + public async Task SendingMessageToFriendOnSameChannelShouldSendDirectly() + { + await new Spec("Sending message to friend on same channel should send directly") + .Given(CharacterIsOnMap) + .And(TargetIsFriend) + .And(FriendIsOnSameChannel) + .WhenAsync(SendingMessageToFriendAsync) + .Then(FriendShouldReceiveMessage) + .ExecuteAsync(); + } + + [TestMethod] + public async Task SendingMessageToFriendOnDifferentChannelShouldUsePubSub() + { + await new Spec("Sending message to friend on different channel should use pubsub") + .Given(CharacterIsOnMap) + .And(DifferentChannelTargetIsFriend) + .And(FriendIsOnDifferentChannel) + .WhenAsync(SendingMessageToFriendOnDifferentChannelAsync) + .Then(MessageShouldBeSentViaPubSub) + .ExecuteAsync(); + } + + [TestMethod] + public async Task LongMessageShouldBeTruncated() + { + await new Spec("Long message should be truncated") + .Given(CharacterIsOnMap) + .And(TargetIsFriend) + .And(FriendIsOnSameChannel) + .WhenAsync(SendingLongMessageToFriendAsync) + .Then(FriendShouldReceiveMessage) + .ExecuteAsync(); + } + + private void CharacterIsOnMap() + { + Session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; + } + + private void TargetIsFriend() + { + FriendHub.Setup(x => x.GetFriendsAsync(It.IsAny())) + .Returns(Task.FromResult(new List + { + new CharacterRelationStatus + { + CharacterId = FriendSession.Character.CharacterId + } + })); + } + + private void OfflineTargetIsFriend() + { + FriendHub.Setup(x => x.GetFriendsAsync(It.IsAny())) + .Returns(Task.FromResult(new List + { + new CharacterRelationStatus + { + CharacterId = OfflineFriendId + } + })); + } + + private void DifferentChannelTargetIsFriend() + { + FriendHub.Setup(x => x.GetFriendsAsync(It.IsAny())) + .Returns(Task.FromResult(new List + { + new CharacterRelationStatus + { + CharacterId = DifferentChannelFriendId + } + })); + } + + private void FriendIsOnSameChannel() + { + SessionRegistry.Setup(x => x.GetCharacter(It.IsAny>())) + .Returns(FriendSession.Character); + } + + private void FriendIsOnDifferentChannel() + { + PubSubHub.Setup(x => x.GetSubscribersAsync()) + .Returns(Task.FromResult(new List + { + new Subscriber + { + ConnectedCharacter = new Data.WebApi.Character + { + Id = DifferentChannelFriendId, + Name = "DifferentChannelFriend" + } + } + })); + } + + private async Task SendingMessageToNonFriendAsync() + { + await Handler.ExecuteAsync(new BtkPacket + { + CharacterId = 99999, + Message = "Hello friend!" + }, Session); + } + + private async Task SendingMessageToOfflineFriendAsync() + { + await Handler.ExecuteAsync(new BtkPacket + { + CharacterId = OfflineFriendId, + Message = "Hello friend!" + }, Session); + } + + private async Task SendingMessageToFriendAsync() + { + await Handler.ExecuteAsync(new BtkPacket + { + CharacterId = FriendSession.Character.CharacterId, + Message = "Hello friend!" + }, Session); + } + + private async Task SendingMessageToFriendOnDifferentChannelAsync() + { + await Handler.ExecuteAsync(new BtkPacket + { + CharacterId = DifferentChannelFriendId, + Message = "Hello friend!" + }, Session); + } + + private async Task SendingLongMessageToFriendAsync() + { + var longMessage = new string('a', 100); + await Handler.ExecuteAsync(new BtkPacket + { + CharacterId = FriendSession.Character.CharacterId, + Message = longMessage + }, Session); + } + + private void NoPacketShouldBeSent() + { + Assert.AreEqual(0, Session.LastPackets.Count); + } + + private void ShouldReceiveFriendOfflineMessage() + { + var packet = Session.LastPackets.OfType().FirstOrDefault(); + Assert.IsNotNull(packet); + Assert.AreEqual(Game18NConstString.FriendOffline, packet.Message); + } + + private void FriendShouldReceiveMessage() + { + Assert.IsTrue(FriendSession.LastPackets.Count > 0); + } + + private void MessageShouldBeSentViaPubSub() + { + PubSubHub.Verify(x => x.SendMessageAsync(It.IsAny()), Times.Once); + } + } +} diff --git a/test/NosCore.PacketHandlers.Tests/Chat/ClientSayPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Chat/ClientSayPacketHandlerTests.cs new file mode 100644 index 000000000..2ce0b30cc --- /dev/null +++ b/test/NosCore.PacketHandlers.Tests/Chat/ClientSayPacketHandlerTests.cs @@ -0,0 +1,108 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using NosCore.GameObject.Networking; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.PacketHandlers.Chat; +using NosCore.Packets.ClientPackets.Chat; +using NosCore.Tests.Shared; +using SpecLight; + +namespace NosCore.PacketHandlers.Tests.Chat +{ + [TestClass] + public class ClientSayPacketHandlerTests + { + private ClientSayPacketHandler Handler = null!; + private ClientSession Session = null!; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Broadcaster.Reset(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + Handler = new ClientSayPacketHandler(); + } + + [TestMethod] + public async Task SayMessageShouldExecuteWithoutError() + { + await new Spec("Say message should execute without error") + .Given(CharacterIsOnMap) + .WhenAsync(SendingSayMessage) + .Then(HandlerShouldCompleteSuccessfully) + .ExecuteAsync(); + } + + [TestMethod] + public async Task SayMessageShouldNotBeSentBackToSender() + { + await new Spec("Say message should not be sent back to sender") + .Given(CharacterIsOnMap) + .WhenAsync(SendingSayMessage) + .Then(SenderShouldNotReceiveOwnMessage) + .ExecuteAsync(); + } + + [TestMethod] + public async Task EmptyMessageShouldBeHandled() + { + await new Spec("Empty message should be handled") + .Given(CharacterIsOnMap) + .WhenAsync(SendingEmptyMessage) + .Then(HandlerShouldCompleteSuccessfully) + .ExecuteAsync(); + } + + private void CharacterIsOnMap() + { + Session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; + } + + private async Task SendingSayMessage() + { + await Handler.ExecuteAsync(new ClientSayPacket + { + Message = "Hello everyone!" + }, Session); + } + + private async Task SendingEmptyMessage() + { + await Handler.ExecuteAsync(new ClientSayPacket + { + Message = "" + }, Session); + } + + private void HandlerShouldCompleteSuccessfully() + { + // If we reached here, the handler completed without throwing + Assert.AreEqual(0, Session.LastPackets.Count); + } + + private void SenderShouldNotReceiveOwnMessage() + { + Assert.AreEqual(0, Session.LastPackets.Count); + } + } +} diff --git a/test/NosCore.PacketHandlers.Tests/Chat/WhisperPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Chat/WhisperPacketHandlerTests.cs new file mode 100644 index 000000000..3f54702b4 --- /dev/null +++ b/test/NosCore.PacketHandlers.Tests/Chat/WhisperPacketHandlerTests.cs @@ -0,0 +1,207 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.Core; +using NosCore.Data.WebApi; +using NosCore.GameObject.InterChannelCommunication.Hubs.BlacklistHub; +using NosCore.GameObject.InterChannelCommunication.Hubs.PubSub; +using NosCore.GameObject.Networking; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.PacketHandlers.Chat; +using NosCore.Packets.ClientPackets.Chat; +using NosCore.Packets.Enumerations; +using NosCore.Packets.Interfaces; +using NosCore.Packets.ServerPackets.Chats; +using NosCore.Packets.ServerPackets.UI; +using NosCore.Tests.Shared; +using Serilog; +using SpecLight; + +namespace NosCore.PacketHandlers.Tests.Chat +{ + [TestClass] + public class WhisperPacketHandlerTests + { + private WhisperPacketHandler Handler = null!; + private ClientSession Session = null!; + private ClientSession TargetSession = null!; + private Mock BlacklistHub = null!; + private Mock PubSubHub = null!; + private Mock Serializer = null!; + private readonly ILogger Logger = new Mock().Object; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Broadcaster.Reset(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + TargetSession = await TestHelpers.Instance.GenerateSessionAsync(); + BlacklistHub = new Mock(); + PubSubHub = new Mock(); + Serializer = new Mock(); + + BlacklistHub.Setup(x => x.GetBlacklistedAsync(It.IsAny())) + .Returns(Task.FromResult(new List())); + + PubSubHub.Setup(x => x.GetSubscribersAsync()) + .Returns(Task.FromResult(new List())); + + Serializer.Setup(x => x.Serialize(It.IsAny())) + .Returns("serialized"); + + var channel = new Channel { ChannelId = 1, ClientName = "TestChannel", Host = "localhost" }; + + Handler = new WhisperPacketHandler( + Logger, + Serializer.Object, + BlacklistHub.Object, + PubSubHub.Object, + channel, + TestHelpers.Instance.GameLanguageLocalizer, + TestHelpers.Instance.SessionRegistry); + } + + [TestMethod] + public async Task WhisperingToNonExistentPlayerShouldShowNotPlayingMessage() + { + await new Spec("Whispering to nonexistent player should show not playing message") + .Given(CharacterIsOnMap) + .WhenAsync(WhisperingToNonExistentPlayer) + .Then(ShouldReceiveNotPlayingMessage) + .ExecuteAsync(); + } + + [TestMethod] + public async Task WhisperingToBlacklistedPlayerShouldShowBlacklistMessage() + { + await new Spec("Whispering to blacklisted player should show blacklist message") + .Given(CharacterIsOnMap) + .And(TargetIsOnline) + .And(TargetIsBlacklisted) + .WhenAsync(WhisperingToTarget) + .Then(ShouldReceiveBlacklistMessage) + .ExecuteAsync(); + } + + [TestMethod] + public async Task WhisperingToOnlinePlayerShouldSendMessage() + { + await new Spec("Whispering to online player should send message") + .Given(CharacterIsOnMap) + .And(TargetIsOnline) + .WhenAsync(WhisperingToTarget) + .Then(MessageShouldBeSentViaPubSub) + .ExecuteAsync(); + } + + [TestMethod] + public async Task WhisperMessageShouldBeTruncatedIfTooLong() + { + await new Spec("Whisper message should be truncated if too long") + .Given(CharacterIsOnMap) + .And(TargetIsOnline) + .WhenAsync(WhisperingLongMessageToTarget) + .Then(MessageShouldBeSentViaPubSub) + .ExecuteAsync(); + } + + private void CharacterIsOnMap() + { + Session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; + } + + private void TargetIsOnline() + { + PubSubHub.Setup(x => x.GetSubscribersAsync()) + .Returns(Task.FromResult(new List + { + new Subscriber + { + ConnectedCharacter = new Data.WebApi.Character + { + Id = TargetSession.Character.CharacterId, + Name = TargetSession.Character.Name + } + } + })); + } + + private void TargetIsBlacklisted() + { + BlacklistHub.Setup(x => x.GetBlacklistedAsync(It.IsAny())) + .Returns(Task.FromResult(new List + { + new CharacterRelationStatus + { + CharacterId = TargetSession.Character.CharacterId + } + })); + } + + private async Task WhisperingToNonExistentPlayer() + { + await Handler.ExecuteAsync(new WhisperPacket + { + Message = "NonExistentPlayer Hello there!" + }, Session); + } + + private async Task WhisperingToTarget() + { + await Handler.ExecuteAsync(new WhisperPacket + { + Message = $"{TargetSession.Character.Name} Hello there!" + }, Session); + } + + private async Task WhisperingLongMessageToTarget() + { + var longMessage = new string('a', 100); + await Handler.ExecuteAsync(new WhisperPacket + { + Message = $"{TargetSession.Character.Name} {longMessage}" + }, Session); + } + + private void ShouldReceiveNotPlayingMessage() + { + var packet = Session.LastPackets.OfType().FirstOrDefault(); + Assert.IsNotNull(packet); + Assert.AreEqual(Game18NConstString.IsNotPlaying, packet.Message); + } + + private void ShouldReceiveBlacklistMessage() + { + var packet = Session.LastPackets.OfType().FirstOrDefault(); + Assert.IsNotNull(packet); + Assert.AreEqual(Game18NConstString.AlreadyBlacklisted, packet.Message); + } + + private void MessageShouldBeSentViaPubSub() + { + PubSubHub.Verify(x => x.SendMessageAsync(It.IsAny()), Times.Once); + } + } +} diff --git a/test/NosCore.PacketHandlers.Tests/Command/ChangeClassPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Command/ChangeClassPacketHandlerTests.cs new file mode 100644 index 000000000..5f39539fd --- /dev/null +++ b/test/NosCore.PacketHandlers.Tests/Command/ChangeClassPacketHandlerTests.cs @@ -0,0 +1,176 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.Data.CommandPackets; +using NosCore.Data.WebApi; +using NosCore.GameObject.InterChannelCommunication.Hubs.PubSub; +using NosCore.GameObject.InterChannelCommunication.Messages; +using NosCore.GameObject.Networking; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.PacketHandlers.Command; +using NosCore.Packets.Enumerations; +using NosCore.Packets.ServerPackets.UI; +using NosCore.Shared.Enumerations; +using NosCore.Tests.Shared; +using SpecLight; + +namespace NosCore.PacketHandlers.Tests.Command +{ + [TestClass] + public class ChangeClassPacketHandlerTests + { + private ChangeClassPacketHandler Handler = null!; + private ClientSession Session = null!; + private Mock PubSubHub = null!; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Broadcaster.Reset(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + PubSubHub = new Mock(); + + PubSubHub.Setup(x => x.GetSubscribersAsync()) + .Returns(Task.FromResult(new List())); + + Handler = new ChangeClassPacketHandler(PubSubHub.Object); + } + + [TestMethod] + public async Task ChangingOwnClassShouldCallChangeClass() + { + await new Spec("Changing own class should call ChangeClass") + .Given(CharacterIsOnMap) + .WhenAsync(ChangingOwnClass) + .Then(CharacterClassShouldBeChanged) + .ExecuteAsync(); + } + + [TestMethod] + public async Task ChangingClassWithEmptyNameShouldChangeOwnClass() + { + await new Spec("Changing class with empty name should change own class") + .Given(CharacterIsOnMap) + .WhenAsync(ChangingClassWithEmptyName) + .Then(CharacterClassShouldBeChanged) + .ExecuteAsync(); + } + + [TestMethod] + public async Task ChangingClassForUnknownPlayerShouldShowError() + { + await new Spec("Changing class for unknown player should show error") + .Given(CharacterIsOnMap) + .WhenAsync(ChangingClassForUnknownPlayer) + .Then(ShouldReceiveUnknownCharacterMessage) + .ExecuteAsync(); + } + + [TestMethod] + public async Task ChangingClassForOnlinePlayerShouldSendStatData() + { + await new Spec("Changing class for online player should send stat data") + .Given(CharacterIsOnMap) + .And(TargetPlayerIsOnline) + .WhenAsync(ChangingClassForTargetPlayer) + .Then(StatDataShouldBeSent) + .ExecuteAsync(); + } + + private void CharacterIsOnMap() + { + Session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; + } + + private void TargetPlayerIsOnline() + { + PubSubHub.Setup(x => x.GetSubscribersAsync()) + .Returns(Task.FromResult(new List + { + new Subscriber + { + ConnectedCharacter = new Character + { + Id = 12345, + Name = "TargetPlayer" + } + } + })); + } + + private async Task ChangingOwnClass() + { + await Handler.ExecuteAsync(new ChangeClassPacket + { + ClassType = CharacterClassType.Archer, + Name = Session.Character.Name + }, Session); + } + + private async Task ChangingClassWithEmptyName() + { + await Handler.ExecuteAsync(new ChangeClassPacket + { + ClassType = CharacterClassType.Swordsman, + Name = "" + }, Session); + } + + private async Task ChangingClassForUnknownPlayer() + { + await Handler.ExecuteAsync(new ChangeClassPacket + { + ClassType = CharacterClassType.Mage, + Name = "UnknownPlayer123" + }, Session); + } + + private async Task ChangingClassForTargetPlayer() + { + await Handler.ExecuteAsync(new ChangeClassPacket + { + ClassType = CharacterClassType.Archer, + Name = "TargetPlayer" + }, Session); + } + + private void CharacterClassShouldBeChanged() + { + PubSubHub.Verify(x => x.SendMessageAsync(It.IsAny()), Times.Never); + } + + private void ShouldReceiveUnknownCharacterMessage() + { + var packet = Session.LastPackets.OfType().FirstOrDefault(); + Assert.IsNotNull(packet); + Assert.AreEqual(Game18NConstString.UnknownCharacter, packet.Message); + } + + private void StatDataShouldBeSent() + { + PubSubHub.Verify(x => x.SendMessageAsync(It.IsAny()), Times.Once); + } + } +} diff --git a/test/NosCore.PacketHandlers.Tests/Command/CreateItemPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Command/CreateItemPacketHandlerTests.cs new file mode 100644 index 000000000..afff50da9 --- /dev/null +++ b/test/NosCore.PacketHandlers.Tests/Command/CreateItemPacketHandlerTests.cs @@ -0,0 +1,159 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.Data.CommandPackets; +using NosCore.Data.Enumerations; +using NosCore.Data.Enumerations.Items; +using NosCore.Data.StaticEntities; +using NosCore.GameObject.Networking; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.GameObject.Services.ItemGenerationService; +using NosCore.GameObject.Services.ItemGenerationService.Item; +using NosCore.PacketHandlers.Command; +using NosCore.Packets.Enumerations; +using NosCore.Packets.ServerPackets.Chats; +using NosCore.Packets.ServerPackets.UI; +using NosCore.Shared.I18N; +using NosCore.Tests.Shared; +using Serilog; +using SpecLight; + +namespace NosCore.PacketHandlers.Tests.Command +{ + [TestClass] + public class CreateItemPacketHandlerTests + { + private CreateItemPackettHandler Handler = null!; + private ClientSession Session = null!; + private List Items = null!; + private Mock ItemProvider = null!; + private readonly ILogger Logger = new Mock().Object; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Broadcaster.Reset(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + ItemProvider = new Mock(); + Items = new List + { + new Item { VNum = 1012, Type = NoscorePocketType.Main }, + new Item { VNum = 1, Type = NoscorePocketType.Equipment, EquipmentSlot = EquipmentType.MainWeapon, ItemType = ItemType.Weapon }, + new Item { VNum = 912, Type = NoscorePocketType.Equipment, EquipmentSlot = EquipmentType.Sp, ItemType = ItemType.Specialist } + }; + + ItemProvider.Setup(x => x.Create(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) + .Returns((short vnum, short amount, sbyte rare, byte upgrade, byte design) => + new ItemInstance(new Item { VNum = vnum, Type = NoscorePocketType.Main }) { Amount = amount, Rare = rare, Upgrade = upgrade }); + + Handler = new CreateItemPackettHandler( + Logger, + Items, + TestHelpers.Instance.WorldConfiguration, + ItemProvider.Object, + TestHelpers.Instance.LogLanguageLocalizer); + } + + [TestMethod] + public async Task CreatingNonExistentItemShouldShowError() + { + await new Spec("Creating non-existent item should show error") + .Given(CharacterIsOnMap) + .WhenAsync(CreatingNonExistentItem) + .Then(ShouldReceiveItemDoesNotExistMessage) + .ExecuteAsync(); + } + + [TestMethod] + public async Task CreatingGoldItemShouldBeIgnored() + { + await new Spec("Creating gold item (VNum 1046) should be ignored") + .Given(CharacterIsOnMap) + .WhenAsync(CreatingGoldItem) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); + } + + [TestMethod] + public async Task CreatingValidItemShouldAddToInventory() + { + await new Spec("Creating valid item should add to inventory") + .Given(CharacterIsOnMap) + .WhenAsync(CreatingValidItem) + .Then(ShouldReceiveItemReceivedMessage) + .ExecuteAsync(); + } + + private void CharacterIsOnMap() + { + Session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; + } + + private async Task CreatingNonExistentItem() + { + await Handler.ExecuteAsync(new CreateItemPacket + { + VNum = 9999 + }, Session); + } + + private async Task CreatingGoldItem() + { + Session.LastPackets.Clear(); + await Handler.ExecuteAsync(new CreateItemPacket + { + VNum = 1046 + }, Session); + } + + private async Task CreatingValidItem() + { + await Handler.ExecuteAsync(new CreateItemPacket + { + VNum = 1012, + DesignOrAmount = 5 + }, Session); + } + + private void ShouldReceiveItemDoesNotExistMessage() + { + var packet = Session.LastPackets.OfType().FirstOrDefault(); + Assert.IsNotNull(packet); + Assert.AreEqual(Game18NConstString.ItemDoesNotExist, packet.Message); + } + + private void NoPacketShouldBeSent() + { + Assert.AreEqual(0, Session.LastPackets.Count); + } + + private void ShouldReceiveItemReceivedMessage() + { + var packet = Session.LastPackets.OfType().FirstOrDefault(); + Assert.IsNotNull(packet); + Assert.AreEqual(Game18NConstString.ReceivedThisItem, packet.Message); + } + } +} diff --git a/test/NosCore.PacketHandlers.Tests/Command/EffectCommandPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Command/EffectCommandPacketHandlerTests.cs new file mode 100644 index 000000000..d9b984f10 --- /dev/null +++ b/test/NosCore.PacketHandlers.Tests/Command/EffectCommandPacketHandlerTests.cs @@ -0,0 +1,83 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Linq; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using NosCore.Data.CommandPackets; +using NosCore.GameObject.Networking; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.PacketHandlers.Command; +using NosCore.Tests.Shared; +using SpecLight; + +namespace NosCore.PacketHandlers.Tests.Command +{ + [TestClass] + public class EffectCommandPacketHandlerTests + { + private EffectCommandPackettHandler Handler = null!; + private ClientSession Session = null!; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Broadcaster.Reset(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + Handler = new EffectCommandPackettHandler(); + } + + [TestMethod] + public async Task EffectShouldSendPacket() + { + await new Spec("Effect should send packet") + .Given(CharacterIsOnMap) + .WhenAsync(ExecutingEffectCommand_, 1) + .Then(ShouldSendPacketToMap) + .ExecuteAsync(); + } + + [TestMethod] + public async Task EffectWithDifferentIdShouldSendPacket() + { + await new Spec("Effect with different id should send packet") + .Given(CharacterIsOnMap) + .WhenAsync(ExecutingEffectCommand_, 100) + .Then(ShouldSendPacketToMap) + .ExecuteAsync(); + } + + private void CharacterIsOnMap() + { + Session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; + Session.Character.MapInstance.LastPackets.Clear(); + } + + private async Task ExecutingEffectCommand_(int effectId) + { + await Handler.ExecuteAsync(new EffectCommandPacket { EffectId = effectId }, Session); + } + + private void ShouldSendPacketToMap() + { + Assert.IsTrue(Session.Character.MapInstance.LastPackets.Any()); + } + } +} diff --git a/test/NosCore.PacketHandlers.Tests/Command/GiftPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Command/GiftPacketHandlerTests.cs new file mode 100644 index 000000000..a6187c197 --- /dev/null +++ b/test/NosCore.PacketHandlers.Tests/Command/GiftPacketHandlerTests.cs @@ -0,0 +1,153 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.Data.CommandPackets; +using NosCore.Data.WebApi; +using NosCore.GameObject.InterChannelCommunication.Hubs.MailHub; +using NosCore.GameObject.InterChannelCommunication.Hubs.PubSub; +using NosCore.GameObject.Networking; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.GameObject.Services.MailService; +using NosCore.PacketHandlers.Command; +using NosCore.Packets.Enumerations; +using NosCore.Packets.ServerPackets.Chats; +using NosCore.Packets.ServerPackets.UI; +using NosCore.Tests.Shared; +using SpecLight; + +namespace NosCore.PacketHandlers.Tests.Command +{ + [TestClass] + public class GiftPacketHandlerTests + { + private GiftPacketHandler Handler = null!; + private ClientSession Session = null!; + private Mock PubSubHub = null!; + private Mock MailHub = null!; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Broadcaster.Reset(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + PubSubHub = new Mock(); + MailHub = new Mock(); + + PubSubHub.Setup(x => x.GetSubscribersAsync()) + .Returns(Task.FromResult(new List())); + + Handler = new GiftPacketHandler( + PubSubHub.Object, + MailHub.Object, + TestHelpers.Instance.Clock); + } + + [TestMethod] + public async Task SendingGiftToUnknownPlayerShouldShowError() + { + await new Spec("Sending gift to unknown player should show error") + .Given(CharacterIsOnMap) + .WhenAsync(SendingGiftToUnknownPlayer) + .Then(ShouldReceiveUnknownCharacterMessage) + .ExecuteAsync(); + } + + [TestMethod] + public async Task SendingGiftToOnlinePlayerShouldSendMail() + { + await new Spec("Sending gift to online player should send mail") + .Given(CharacterIsOnMap) + .And(TargetPlayerIsOnline) + .WhenAsync(SendingGiftToTargetPlayer) + .Then(MailShouldBeSent) + .And(ShouldReceiveGiftDeliveredMessage) + .ExecuteAsync(); + } + + private void CharacterIsOnMap() + { + Session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; + } + + private void TargetPlayerIsOnline() + { + PubSubHub.Setup(x => x.GetSubscribersAsync()) + .Returns(Task.FromResult(new List + { + new Subscriber + { + ConnectedCharacter = new Character + { + Id = 12345, + Name = "TargetPlayer" + } + } + })); + } + + private async Task SendingGiftToUnknownPlayer() + { + await Handler.ExecuteAsync(new GiftPacket + { + CharacterName = "UnknownPlayer123", + VNum = 1012, + Amount = 1, + Rare = 0, + Upgrade = 0 + }, Session); + } + + private async Task SendingGiftToTargetPlayer() + { + await Handler.ExecuteAsync(new GiftPacket + { + CharacterName = "TargetPlayer", + VNum = 1012, + Amount = 10, + Rare = 0, + Upgrade = 0 + }, Session); + } + + private void ShouldReceiveUnknownCharacterMessage() + { + var packet = Session.LastPackets.OfType().FirstOrDefault(); + Assert.IsNotNull(packet); + Assert.AreEqual(Game18NConstString.UnknownCharacter, packet.Message); + } + + private void MailShouldBeSent() + { + MailHub.Verify(x => x.SendMailAsync(It.IsAny()), Times.Once); + } + + private void ShouldReceiveGiftDeliveredMessage() + { + var packet = Session.LastPackets.OfType().FirstOrDefault(); + Assert.IsNotNull(packet); + Assert.AreEqual(Game18NConstString.GiftDelivered, packet.Message); + } + } +} diff --git a/test/NosCore.PacketHandlers.Tests/Command/HelpPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Command/HelpPacketHandlerTests.cs new file mode 100644 index 000000000..b52efd7ce --- /dev/null +++ b/test/NosCore.PacketHandlers.Tests/Command/HelpPacketHandlerTests.cs @@ -0,0 +1,115 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Linq; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using NosCore.Data.CommandPackets; +using NosCore.GameObject.Networking; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.PacketHandlers.Command; +using NosCore.Packets.Enumerations; +using NosCore.Packets.ServerPackets.Chats; +using NosCore.Shared.Enumerations; +using NosCore.Tests.Shared; +using SpecLight; + +namespace NosCore.PacketHandlers.Tests.Command +{ + [TestClass] + public class HelpPacketHandlerTests + { + private HelpPacketHandler Handler = null!; + private ClientSession Session = null!; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Broadcaster.Reset(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + Handler = new HelpPacketHandler(); + } + + [TestMethod] + public async Task ExecutingHelpShouldSendHeaderMessage() + { + await new Spec("Executing help should send header message") + .Given(CharacterIsOnMap) + .And(CharacterHasGameMasterAuthority) + .WhenAsync(ExecutingHelpCommand) + .Then(ShouldReceiveHelpHeader) + .ExecuteAsync(); + } + + [TestMethod] + public async Task ExecutingHelpShouldSendCommandsList() + { + await new Spec("Executing help should send commands list") + .Given(CharacterIsOnMap) + .And(CharacterHasGameMasterAuthority) + .WhenAsync(ExecutingHelpCommand) + .Then(ShouldReceiveMultipleSayPackets) + .ExecuteAsync(); + } + + [TestMethod] + public async Task ExecutingHelpAsModeratorShouldShowOnlyModeratorCommands() + { + await new Spec("Executing help as moderator should show only moderator level commands") + .Given(CharacterIsOnMap) + .And(CharacterHasModeratorAuthority) + .WhenAsync(ExecutingHelpCommand) + .Then(ShouldReceiveHelpHeader) + .ExecuteAsync(); + } + + private void CharacterIsOnMap() + { + Session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; + } + + private void CharacterHasGameMasterAuthority() + { + Session.Account.Authority = AuthorityType.GameMaster; + } + + private void CharacterHasModeratorAuthority() + { + Session.Account.Authority = AuthorityType.Moderator; + } + + private async Task ExecutingHelpCommand() + { + await Handler.ExecuteAsync(new HelpPacket(), Session); + } + + private void ShouldReceiveHelpHeader() + { + var sayPackets = Session.LastPackets.OfType().ToList(); + Assert.IsTrue(sayPackets.Any(p => p.Message != null && p.Message.Contains("Help command"))); + } + + private void ShouldReceiveMultipleSayPackets() + { + var sayPackets = Session.LastPackets.OfType().ToList(); + Assert.IsTrue(sayPackets.Count > 1); + } + } +} diff --git a/test/NosCore.PacketHandlers.Tests/Command/KickPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Command/KickPacketHandlerTests.cs new file mode 100644 index 000000000..2033f9277 --- /dev/null +++ b/test/NosCore.PacketHandlers.Tests/Command/KickPacketHandlerTests.cs @@ -0,0 +1,129 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.Data.CommandPackets; +using NosCore.Data.WebApi; +using NosCore.GameObject.InterChannelCommunication.Hubs.PubSub; +using NosCore.GameObject.Networking; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.PacketHandlers.Command; +using NosCore.Packets.Enumerations; +using NosCore.Packets.ServerPackets.UI; +using NosCore.Tests.Shared; +using SpecLight; + +namespace NosCore.PacketHandlers.Tests.Command +{ + [TestClass] + public class KickPacketHandlerTests + { + private KickPacketHandler Handler = null!; + private ClientSession Session = null!; + private Mock PubSubHub = null!; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Broadcaster.Reset(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + PubSubHub = new Mock(); + + PubSubHub.Setup(x => x.GetSubscribersAsync()) + .Returns(Task.FromResult(new List())); + + Handler = new KickPacketHandler(PubSubHub.Object); + } + + [TestMethod] + public async Task KickingUnknownPlayerShouldShowErrorMessage() + { + await new Spec("Kicking unknown player should show error message") + .Given(CharacterIsOnMap) + .WhenAsync(KickingUnknownPlayer) + .Then(ShouldReceiveUnknownCharacterMessage) + .ExecuteAsync(); + } + + [TestMethod] + public async Task KickingOnlinePlayerShouldUnsubscribeThem() + { + await new Spec("Kicking online player should unsubscribe them") + .Given(CharacterIsOnMap) + .And(TargetPlayerIsOnline) + .WhenAsync(KickingTargetPlayer) + .Then(TargetShouldBeUnsubscribed) + .ExecuteAsync(); + } + + private void CharacterIsOnMap() + { + Session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; + } + + private void TargetPlayerIsOnline() + { + PubSubHub.Setup(x => x.GetSubscribersAsync()) + .Returns(Task.FromResult(new List + { + new Subscriber + { + ConnectedCharacter = new Character + { + Id = 12345, + Name = "TargetPlayer" + } + } + })); + } + + private async Task KickingUnknownPlayer() + { + await Handler.ExecuteAsync(new KickPacket + { + Name = "UnknownPlayer123" + }, Session); + } + + private async Task KickingTargetPlayer() + { + await Handler.ExecuteAsync(new KickPacket + { + Name = "TargetPlayer" + }, Session); + } + + private void ShouldReceiveUnknownCharacterMessage() + { + var packet = Session.LastPackets.OfType().FirstOrDefault(); + Assert.IsNotNull(packet); + Assert.AreEqual(Game18NConstString.UnknownCharacter, packet.Message); + } + + private void TargetShouldBeUnsubscribed() + { + PubSubHub.Verify(x => x.UnsubscribeAsync(12345), Times.Once); + } + } +} diff --git a/test/NosCore.PacketHandlers.Tests/Command/PositionPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Command/PositionPacketHandlerTests.cs new file mode 100644 index 000000000..8741e59c4 --- /dev/null +++ b/test/NosCore.PacketHandlers.Tests/Command/PositionPacketHandlerTests.cs @@ -0,0 +1,96 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Linq; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using NosCore.Data.CommandPackets; +using NosCore.GameObject.Networking; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.PacketHandlers.Command; +using NosCore.Packets.ServerPackets.Chats; +using NosCore.Tests.Shared; +using SpecLight; + +namespace NosCore.PacketHandlers.Tests.Command +{ + [TestClass] + public class PositionPacketHandlerTests + { + private PositionPacketHandler Handler = null!; + private ClientSession Session = null!; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Broadcaster.Reset(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + Handler = new PositionPacketHandler(); + } + + [TestMethod] + public async Task PositionShouldSendSayPacket() + { + await new Spec("Position should send say packet") + .Given(CharacterIsOnMap) + .WhenAsync(ExecutingPositionCommand) + .Then(ShouldReceiveSayPacket) + .ExecuteAsync(); + } + + [TestMethod] + public async Task PositionShouldContainMapId() + { + await new Spec("Position should contain map id") + .Given(CharacterIsOnMap) + .WhenAsync(ExecutingPositionCommand) + .Then(SayPacketShouldContainMapInfo) + .ExecuteAsync(); + } + + private void CharacterIsOnMap() + { + Session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; + Session.Character.PositionX = 0; + Session.Character.PositionY = 0; + Session.LastPackets.Clear(); + } + + private async Task ExecutingPositionCommand() + { + await Handler.ExecuteAsync(new PositionPacket(), Session); + } + + private void ShouldReceiveSayPacket() + { + var sayPacket = Session.LastPackets.OfType().FirstOrDefault(); + Assert.IsNotNull(sayPacket); + } + + private void SayPacketShouldContainMapInfo() + { + var sayPacket = Session.LastPackets.OfType().FirstOrDefault(); + Assert.IsNotNull(sayPacket); + Assert.IsTrue(sayPacket.Message?.Contains("Map:") ?? false); + Assert.IsTrue(sayPacket.Message?.Contains("X:0") ?? false); + Assert.IsTrue(sayPacket.Message?.Contains("Y:0") ?? false); + } + } +} diff --git a/test/NosCore.PacketHandlers.Tests/Command/SetGoldCommandPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Command/SetGoldCommandPacketHandlerTests.cs new file mode 100644 index 000000000..9ce1692ab --- /dev/null +++ b/test/NosCore.PacketHandlers.Tests/Command/SetGoldCommandPacketHandlerTests.cs @@ -0,0 +1,132 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.Data.CommandPackets; +using NosCore.Data.WebApi; +using NosCore.GameObject.InterChannelCommunication.Hubs.PubSub; +using NosCore.GameObject.InterChannelCommunication.Messages; +using NosCore.GameObject.Networking; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.PacketHandlers.Command; +using NosCore.Packets.Enumerations; +using NosCore.Packets.ServerPackets.UI; +using NosCore.Tests.Shared; +using SpecLight; + +namespace NosCore.PacketHandlers.Tests.Command +{ + [TestClass] + public class SetGoldCommandPacketHandlerTests + { + private SetGoldCommandPacketHandler Handler = null!; + private ClientSession Session = null!; + private Mock PubSubHub = null!; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Broadcaster.Reset(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + PubSubHub = new Mock(); + + PubSubHub.Setup(x => x.GetSubscribersAsync()) + .Returns(Task.FromResult(new List())); + + Handler = new SetGoldCommandPacketHandler(PubSubHub.Object); + } + + [TestMethod] + public async Task SettingGoldForUnknownPlayerShouldShowError() + { + await new Spec("Setting gold for unknown player should show error") + .Given(CharacterIsOnMap) + .WhenAsync(SettingGoldForUnknownPlayer) + .Then(ShouldReceiveUnknownCharacterMessage) + .ExecuteAsync(); + } + + [TestMethod] + public async Task SettingGoldForOnlinePlayerShouldSendStatData() + { + await new Spec("Setting gold for online player should send stat data") + .Given(CharacterIsOnMap) + .And(TargetPlayerIsOnline) + .WhenAsync(SettingGoldForTargetPlayer) + .Then(StatDataShouldBeSent) + .ExecuteAsync(); + } + + private void CharacterIsOnMap() + { + Session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; + } + + private void TargetPlayerIsOnline() + { + PubSubHub.Setup(x => x.GetSubscribersAsync()) + .Returns(Task.FromResult(new List + { + new Subscriber + { + ConnectedCharacter = new Character + { + Id = 12345, + Name = "TargetPlayer" + } + } + })); + } + + private async Task SettingGoldForUnknownPlayer() + { + await Handler.ExecuteAsync(new SetGoldCommandPacket + { + Name = "UnknownPlayer123", + Gold = 1000000 + }, Session); + } + + private async Task SettingGoldForTargetPlayer() + { + await Handler.ExecuteAsync(new SetGoldCommandPacket + { + Name = "TargetPlayer", + Gold = 1000000 + }, Session); + } + + private void ShouldReceiveUnknownCharacterMessage() + { + var packet = Session.LastPackets.OfType().FirstOrDefault(); + Assert.IsNotNull(packet); + Assert.AreEqual(Game18NConstString.UnknownCharacter, packet.Message); + } + + private void StatDataShouldBeSent() + { + PubSubHub.Verify(x => x.SendMessageAsync(It.IsAny()), Times.Once); + } + } +} diff --git a/test/NosCore.PacketHandlers.Tests/Command/SetHeroLevelCommandPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Command/SetHeroLevelCommandPacketHandlerTests.cs new file mode 100644 index 000000000..286a94693 --- /dev/null +++ b/test/NosCore.PacketHandlers.Tests/Command/SetHeroLevelCommandPacketHandlerTests.cs @@ -0,0 +1,182 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.Core; +using NosCore.Data.CommandPackets; +using NosCore.Data.WebApi; +using NosCore.GameObject.InterChannelCommunication.Hubs.ChannelHub; +using NosCore.GameObject.InterChannelCommunication.Hubs.PubSub; +using NosCore.GameObject.InterChannelCommunication.Messages; +using NosCore.GameObject.Networking; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.PacketHandlers.Command; +using NosCore.Packets.Enumerations; +using NosCore.Packets.ServerPackets.UI; +using NosCore.Tests.Shared; +using SpecLight; + +namespace NosCore.PacketHandlers.Tests.Command +{ + [TestClass] + public class SetHeroLevelCommandPacketHandlerTests + { + private SetHeroLevelCommandPacketHandler Handler = null!; + private ClientSession Session = null!; + private Mock PubSubHub = null!; + private Mock ChannelHub = null!; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Broadcaster.Reset(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + PubSubHub = new Mock(); + ChannelHub = new Mock(); + + PubSubHub.Setup(x => x.GetSubscribersAsync()) + .Returns(Task.FromResult(new List())); + + ChannelHub.Setup(x => x.GetCommunicationChannels()) + .Returns(Task.FromResult(new List())); + + Handler = new SetHeroLevelCommandPacketHandler(PubSubHub.Object, ChannelHub.Object); + } + + [TestMethod] + public async Task SettingOwnHeroLevelShouldChangeHeroLevel() + { + await new Spec("Setting own hero level should change hero level") + .Given(CharacterIsOnMap) + .WhenAsync(SettingOwnHeroLevel) + .Then(HeroLevelShouldBeChanged) + .ExecuteAsync(); + } + + [TestMethod] + public async Task SettingHeroLevelWithEmptyNameShouldChangeOwnHeroLevel() + { + await new Spec("Setting hero level with empty name should change own hero level") + .Given(CharacterIsOnMap) + .WhenAsync(SettingHeroLevelWithEmptyName) + .Then(HeroLevelShouldBeChanged) + .ExecuteAsync(); + } + + [TestMethod] + public async Task SettingHeroLevelForUnknownPlayerShouldShowError() + { + await new Spec("Setting hero level for unknown player should show error") + .Given(CharacterIsOnMap) + .WhenAsync(SettingHeroLevelForUnknownPlayer) + .Then(ShouldReceiveUnknownCharacterMessage) + .ExecuteAsync(); + } + + [TestMethod] + public async Task SettingHeroLevelForOnlinePlayerShouldSendStatData() + { + await new Spec("Setting hero level for online player should send stat data") + .Given(CharacterIsOnMap) + .And(TargetPlayerIsOnline) + .WhenAsync(SettingHeroLevelForTargetPlayer) + .Then(StatDataShouldBeSent) + .ExecuteAsync(); + } + + private void CharacterIsOnMap() + { + Session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; + } + + private void TargetPlayerIsOnline() + { + PubSubHub.Setup(x => x.GetSubscribersAsync()) + .Returns(Task.FromResult(new List + { + new Subscriber + { + ConnectedCharacter = new Character + { + Id = 12345, + Name = "TargetPlayer" + } + } + })); + } + + private async Task SettingOwnHeroLevel() + { + await Handler.ExecuteAsync(new SetHeroLevelCommandPacket + { + Level = 50, + Name = Session.Character.Name + }, Session); + } + + private async Task SettingHeroLevelWithEmptyName() + { + await Handler.ExecuteAsync(new SetHeroLevelCommandPacket + { + Level = 50, + Name = "" + }, Session); + } + + private async Task SettingHeroLevelForUnknownPlayer() + { + await Handler.ExecuteAsync(new SetHeroLevelCommandPacket + { + Level = 50, + Name = "UnknownPlayer123" + }, Session); + } + + private async Task SettingHeroLevelForTargetPlayer() + { + await Handler.ExecuteAsync(new SetHeroLevelCommandPacket + { + Level = 50, + Name = "TargetPlayer" + }, Session); + } + + private void HeroLevelShouldBeChanged() + { + PubSubHub.Verify(x => x.SendMessageAsync(It.IsAny()), Times.Never); + } + + private void ShouldReceiveUnknownCharacterMessage() + { + var packet = Session.LastPackets.OfType().FirstOrDefault(); + Assert.IsNotNull(packet); + Assert.AreEqual(Game18NConstString.UnknownCharacter, packet.Message); + } + + private void StatDataShouldBeSent() + { + PubSubHub.Verify(x => x.SendMessageAsync(It.IsAny()), Times.Once); + } + } +} diff --git a/test/NosCore.PacketHandlers.Tests/Command/SetJobLevelCommandPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Command/SetJobLevelCommandPacketHandlerTests.cs new file mode 100644 index 000000000..0c49a9c55 --- /dev/null +++ b/test/NosCore.PacketHandlers.Tests/Command/SetJobLevelCommandPacketHandlerTests.cs @@ -0,0 +1,175 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.Data.CommandPackets; +using NosCore.Data.WebApi; +using NosCore.GameObject.InterChannelCommunication.Hubs.PubSub; +using NosCore.GameObject.InterChannelCommunication.Messages; +using NosCore.GameObject.Networking; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.PacketHandlers.Command; +using NosCore.Packets.Enumerations; +using NosCore.Packets.ServerPackets.UI; +using NosCore.Tests.Shared; +using SpecLight; + +namespace NosCore.PacketHandlers.Tests.Command +{ + [TestClass] + public class SetJobLevelCommandPacketHandlerTests + { + private SetJobLevelCommandPacketHandler Handler = null!; + private ClientSession Session = null!; + private Mock PubSubHub = null!; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Broadcaster.Reset(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + PubSubHub = new Mock(); + + PubSubHub.Setup(x => x.GetSubscribersAsync()) + .Returns(Task.FromResult(new List())); + + Handler = new SetJobLevelCommandPacketHandler(PubSubHub.Object); + } + + [TestMethod] + public async Task SettingOwnJobLevelShouldChangeJobLevel() + { + await new Spec("Setting own job level should change job level") + .Given(CharacterIsOnMap) + .WhenAsync(SettingOwnJobLevel) + .Then(JobLevelShouldBeChanged) + .ExecuteAsync(); + } + + [TestMethod] + public async Task SettingJobLevelWithEmptyNameShouldChangeOwnJobLevel() + { + await new Spec("Setting job level with empty name should change own job level") + .Given(CharacterIsOnMap) + .WhenAsync(SettingJobLevelWithEmptyName) + .Then(JobLevelShouldBeChanged) + .ExecuteAsync(); + } + + [TestMethod] + public async Task SettingJobLevelForUnknownPlayerShouldShowError() + { + await new Spec("Setting job level for unknown player should show error") + .Given(CharacterIsOnMap) + .WhenAsync(SettingJobLevelForUnknownPlayer) + .Then(ShouldReceiveUnknownCharacterMessage) + .ExecuteAsync(); + } + + [TestMethod] + public async Task SettingJobLevelForOnlinePlayerShouldSendStatData() + { + await new Spec("Setting job level for online player should send stat data") + .Given(CharacterIsOnMap) + .And(TargetPlayerIsOnline) + .WhenAsync(SettingJobLevelForTargetPlayer) + .Then(StatDataShouldBeSent) + .ExecuteAsync(); + } + + private void CharacterIsOnMap() + { + Session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; + } + + private void TargetPlayerIsOnline() + { + PubSubHub.Setup(x => x.GetSubscribersAsync()) + .Returns(Task.FromResult(new List + { + new Subscriber + { + ConnectedCharacter = new Character + { + Id = 12345, + Name = "TargetPlayer" + } + } + })); + } + + private async Task SettingOwnJobLevel() + { + await Handler.ExecuteAsync(new SetJobLevelCommandPacket + { + Level = 50, + Name = Session.Character.Name + }, Session); + } + + private async Task SettingJobLevelWithEmptyName() + { + await Handler.ExecuteAsync(new SetJobLevelCommandPacket + { + Level = 50, + Name = "" + }, Session); + } + + private async Task SettingJobLevelForUnknownPlayer() + { + await Handler.ExecuteAsync(new SetJobLevelCommandPacket + { + Level = 50, + Name = "UnknownPlayer123" + }, Session); + } + + private async Task SettingJobLevelForTargetPlayer() + { + await Handler.ExecuteAsync(new SetJobLevelCommandPacket + { + Level = 50, + Name = "TargetPlayer" + }, Session); + } + + private void JobLevelShouldBeChanged() + { + PubSubHub.Verify(x => x.SendMessageAsync(It.IsAny()), Times.Never); + } + + private void ShouldReceiveUnknownCharacterMessage() + { + var packet = Session.LastPackets.OfType().FirstOrDefault(); + Assert.IsNotNull(packet); + Assert.AreEqual(Game18NConstString.UnknownCharacter, packet.Message); + } + + private void StatDataShouldBeSent() + { + PubSubHub.Verify(x => x.SendMessageAsync(It.IsAny()), Times.Once); + } + } +} diff --git a/test/NosCore.PacketHandlers.Tests/Command/SetLevelCommandPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Command/SetLevelCommandPacketHandlerTests.cs new file mode 100644 index 000000000..ac037ea94 --- /dev/null +++ b/test/NosCore.PacketHandlers.Tests/Command/SetLevelCommandPacketHandlerTests.cs @@ -0,0 +1,182 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.Core; +using NosCore.Data.CommandPackets; +using NosCore.Data.WebApi; +using NosCore.GameObject.InterChannelCommunication.Hubs.ChannelHub; +using NosCore.GameObject.InterChannelCommunication.Hubs.PubSub; +using NosCore.GameObject.InterChannelCommunication.Messages; +using NosCore.GameObject.Networking; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.PacketHandlers.Command; +using NosCore.Packets.Enumerations; +using NosCore.Packets.ServerPackets.UI; +using NosCore.Tests.Shared; +using SpecLight; + +namespace NosCore.PacketHandlers.Tests.Command +{ + [TestClass] + public class SetLevelCommandPacketHandlerTests + { + private SetLevelCommandPacketHandler Handler = null!; + private ClientSession Session = null!; + private Mock PubSubHub = null!; + private Mock ChannelHub = null!; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Broadcaster.Reset(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + PubSubHub = new Mock(); + ChannelHub = new Mock(); + + PubSubHub.Setup(x => x.GetSubscribersAsync()) + .Returns(Task.FromResult(new List())); + + ChannelHub.Setup(x => x.GetCommunicationChannels()) + .Returns(Task.FromResult(new List())); + + Handler = new SetLevelCommandPacketHandler(PubSubHub.Object, ChannelHub.Object); + } + + [TestMethod] + public async Task SettingOwnLevelShouldChangeLevel() + { + await new Spec("Setting own level should change level") + .Given(CharacterIsOnMap) + .WhenAsync(SettingOwnLevel) + .Then(LevelShouldBeChanged) + .ExecuteAsync(); + } + + [TestMethod] + public async Task SettingLevelWithEmptyNameShouldChangeOwnLevel() + { + await new Spec("Setting level with empty name should change own level") + .Given(CharacterIsOnMap) + .WhenAsync(SettingLevelWithEmptyName) + .Then(LevelShouldBeChanged) + .ExecuteAsync(); + } + + [TestMethod] + public async Task SettingLevelForUnknownPlayerShouldShowError() + { + await new Spec("Setting level for unknown player should show error") + .Given(CharacterIsOnMap) + .WhenAsync(SettingLevelForUnknownPlayer) + .Then(ShouldReceiveUnknownCharacterMessage) + .ExecuteAsync(); + } + + [TestMethod] + public async Task SettingLevelForOnlinePlayerShouldSendStatData() + { + await new Spec("Setting level for online player should send stat data") + .Given(CharacterIsOnMap) + .And(TargetPlayerIsOnline) + .WhenAsync(SettingLevelForTargetPlayer) + .Then(StatDataShouldBeSent) + .ExecuteAsync(); + } + + private void CharacterIsOnMap() + { + Session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; + } + + private void TargetPlayerIsOnline() + { + PubSubHub.Setup(x => x.GetSubscribersAsync()) + .Returns(Task.FromResult(new List + { + new Subscriber + { + ConnectedCharacter = new Character + { + Id = 12345, + Name = "TargetPlayer" + } + } + })); + } + + private async Task SettingOwnLevel() + { + await Handler.ExecuteAsync(new SetLevelCommandPacket + { + Level = 99, + Name = Session.Character.Name + }, Session); + } + + private async Task SettingLevelWithEmptyName() + { + await Handler.ExecuteAsync(new SetLevelCommandPacket + { + Level = 99, + Name = "" + }, Session); + } + + private async Task SettingLevelForUnknownPlayer() + { + await Handler.ExecuteAsync(new SetLevelCommandPacket + { + Level = 99, + Name = "UnknownPlayer123" + }, Session); + } + + private async Task SettingLevelForTargetPlayer() + { + await Handler.ExecuteAsync(new SetLevelCommandPacket + { + Level = 99, + Name = "TargetPlayer" + }, Session); + } + + private void LevelShouldBeChanged() + { + PubSubHub.Verify(x => x.SendMessageAsync(It.IsAny()), Times.Never); + } + + private void ShouldReceiveUnknownCharacterMessage() + { + var packet = Session.LastPackets.OfType().FirstOrDefault(); + Assert.IsNotNull(packet); + Assert.AreEqual(Game18NConstString.UnknownCharacter, packet.Message); + } + + private void StatDataShouldBeSent() + { + PubSubHub.Verify(x => x.SendMessageAsync(It.IsAny()), Times.Once); + } + } +} diff --git a/test/NosCore.PacketHandlers.Tests/Command/SetReputationPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Command/SetReputationPacketHandlerTests.cs new file mode 100644 index 000000000..668e72d6f --- /dev/null +++ b/test/NosCore.PacketHandlers.Tests/Command/SetReputationPacketHandlerTests.cs @@ -0,0 +1,175 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.Data.CommandPackets; +using NosCore.Data.WebApi; +using NosCore.GameObject.InterChannelCommunication.Hubs.PubSub; +using NosCore.GameObject.InterChannelCommunication.Messages; +using NosCore.GameObject.Networking; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.PacketHandlers.Command; +using NosCore.Packets.Enumerations; +using NosCore.Packets.ServerPackets.UI; +using NosCore.Tests.Shared; +using SpecLight; + +namespace NosCore.PacketHandlers.Tests.Command +{ + [TestClass] + public class SetReputationPacketHandlerTests + { + private SetReputationPacketHandler Handler = null!; + private ClientSession Session = null!; + private Mock PubSubHub = null!; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Broadcaster.Reset(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + PubSubHub = new Mock(); + + PubSubHub.Setup(x => x.GetSubscribersAsync()) + .Returns(Task.FromResult(new List())); + + Handler = new SetReputationPacketHandler(PubSubHub.Object); + } + + [TestMethod] + public async Task SettingOwnReputationShouldChangeReputation() + { + await new Spec("Setting own reputation should change reputation") + .Given(CharacterIsOnMap) + .WhenAsync(SettingOwnReputation) + .Then(ReputationShouldBeChanged) + .ExecuteAsync(); + } + + [TestMethod] + public async Task SettingReputationWithEmptyNameShouldChangeOwnReputation() + { + await new Spec("Setting reputation with empty name should change own reputation") + .Given(CharacterIsOnMap) + .WhenAsync(SettingReputationWithEmptyName) + .Then(ReputationShouldBeChanged) + .ExecuteAsync(); + } + + [TestMethod] + public async Task SettingReputationForUnknownPlayerShouldShowError() + { + await new Spec("Setting reputation for unknown player should show error") + .Given(CharacterIsOnMap) + .WhenAsync(SettingReputationForUnknownPlayer) + .Then(ShouldReceiveUnknownCharacterMessage) + .ExecuteAsync(); + } + + [TestMethod] + public async Task SettingReputationForOnlinePlayerShouldSendStatData() + { + await new Spec("Setting reputation for online player should send stat data") + .Given(CharacterIsOnMap) + .And(TargetPlayerIsOnline) + .WhenAsync(SettingReputationForTargetPlayer) + .Then(StatDataShouldBeSent) + .ExecuteAsync(); + } + + private void CharacterIsOnMap() + { + Session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; + } + + private void TargetPlayerIsOnline() + { + PubSubHub.Setup(x => x.GetSubscribersAsync()) + .Returns(Task.FromResult(new List + { + new Subscriber + { + ConnectedCharacter = new Character + { + Id = 12345, + Name = "TargetPlayer" + } + } + })); + } + + private async Task SettingOwnReputation() + { + await Handler.ExecuteAsync(new SetReputationPacket + { + Reputation = 100000, + Name = Session.Character.Name + }, Session); + } + + private async Task SettingReputationWithEmptyName() + { + await Handler.ExecuteAsync(new SetReputationPacket + { + Reputation = 100000, + Name = "" + }, Session); + } + + private async Task SettingReputationForUnknownPlayer() + { + await Handler.ExecuteAsync(new SetReputationPacket + { + Reputation = 100000, + Name = "UnknownPlayer123" + }, Session); + } + + private async Task SettingReputationForTargetPlayer() + { + await Handler.ExecuteAsync(new SetReputationPacket + { + Reputation = 100000, + Name = "TargetPlayer" + }, Session); + } + + private void ReputationShouldBeChanged() + { + PubSubHub.Verify(x => x.SendMessageAsync(It.IsAny()), Times.Never); + } + + private void ShouldReceiveUnknownCharacterMessage() + { + var packet = Session.LastPackets.OfType().FirstOrDefault(); + Assert.IsNotNull(packet); + Assert.AreEqual(Game18NConstString.UnknownCharacter, packet.Message); + } + + private void StatDataShouldBeSent() + { + PubSubHub.Verify(x => x.SendMessageAsync(It.IsAny()), Times.Once); + } + } +} diff --git a/test/NosCore.PacketHandlers.Tests/Command/ShoutPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Command/ShoutPacketHandlerTests.cs new file mode 100644 index 000000000..278eebec6 --- /dev/null +++ b/test/NosCore.PacketHandlers.Tests/Command/ShoutPacketHandlerTests.cs @@ -0,0 +1,105 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.Data.CommandPackets; +using NosCore.GameObject.InterChannelCommunication.Hubs.PubSub; +using NosCore.GameObject.InterChannelCommunication.Messages; +using NosCore.GameObject.Networking; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.PacketHandlers.Command; +using NosCore.Packets.Interfaces; +using NosCore.Tests.Shared; +using SpecLight; + +namespace NosCore.PacketHandlers.Tests.Command +{ + [TestClass] + public class ShoutPacketHandlerTests + { + private ShoutPacketHandler Handler = null!; + private ClientSession Session = null!; + private Mock PubSubHub = null!; + private Mock Serializer = null!; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Broadcaster.Reset(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + PubSubHub = new Mock(); + Serializer = new Mock(); + + Serializer.Setup(x => x.Serialize(It.IsAny())) + .Returns("serialized_packet"); + + Handler = new ShoutPacketHandler( + Serializer.Object, + PubSubHub.Object, + TestHelpers.Instance.GameLanguageLocalizer); + } + + [TestMethod] + public async Task ShoutingShouldBroadcastToAllPlayers() + { + await new Spec("Shouting should broadcast to all players") + .Given(CharacterIsOnMap) + .WhenAsync(ShoutingMessage) + .Then(MessagesShouldBeBroadcast) + .ExecuteAsync(); + } + + [TestMethod] + public async Task ShoutingShouldSerializeBothPacketTypes() + { + await new Spec("Shouting should serialize both say and msg packets") + .Given(CharacterIsOnMap) + .WhenAsync(ShoutingMessage) + .Then(SerializerShouldBeCalledTwice) + .ExecuteAsync(); + } + + private void CharacterIsOnMap() + { + Session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; + } + + private async Task ShoutingMessage() + { + await Handler.ExecuteAsync(new ShoutPacket + { + Message = "Test announcement message" + }, Session); + } + + private void MessagesShouldBeBroadcast() + { + PubSubHub.Verify(x => x.SendMessagesAsync(It.IsAny>()), Times.Once); + } + + private void SerializerShouldBeCalledTwice() + { + Serializer.Verify(x => x.Serialize(It.IsAny()), Times.Exactly(2)); + } + } +} diff --git a/test/NosCore.PacketHandlers.Tests/Command/SizePacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Command/SizePacketHandlerTests.cs new file mode 100644 index 000000000..23816e504 --- /dev/null +++ b/test/NosCore.PacketHandlers.Tests/Command/SizePacketHandlerTests.cs @@ -0,0 +1,132 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.Data.CommandPackets; +using NosCore.Data.Enumerations.I18N; +using NosCore.GameObject.Networking; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.PacketHandlers.Command; +using NosCore.Shared.Enumerations; +using NosCore.Shared.I18N; +using NosCore.Tests.Shared; +using Serilog; +using SpecLight; + +namespace NosCore.PacketHandlers.Tests.Command +{ + [TestClass] + public class SizePacketHandlerTests + { + private SizePacketHandler Handler = null!; + private ClientSession Session = null!; + private Mock Logger = null!; + private Mock> LogLanguage = null!; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Broadcaster.Reset(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + Logger = new Mock(); + LogLanguage = new Mock>(); + Handler = new SizePacketHandler(Logger.Object, LogLanguage.Object); + } + + [TestMethod] + public async Task SizeOnPlayerShouldChangePlayerSize() + { + await new Spec("Size on player should change player size") + .Given(CharacterIsOnMap) + .WhenAsync(ExecutingSizeCommandOnPlayer_, 20) + .Then(PlayerSizeShouldBe_, 20) + .ExecuteAsync(); + } + + [TestMethod] + public async Task SizeOnUnknownVisualTypeShouldLogError() + { + await new Spec("Size on unknown visual type should log error") + .Given(CharacterIsOnMap) + .WhenAsync(ExecutingSizeCommandWithUnknownVisualType) + .Then(ShouldLogError) + .ExecuteAsync(); + } + + [TestMethod] + public async Task SizeOnNonExistentEntityShouldLogError() + { + await new Spec("Size on non existent entity should log error") + .Given(CharacterIsOnMap) + .WhenAsync(ExecutingSizeCommandOnNonExistentNpc) + .Then(ShouldLogError) + .ExecuteAsync(); + } + + private void CharacterIsOnMap() + { + Session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; + Session.Character.Size = 10; + Session.LastPackets.Clear(); + } + + private async Task ExecutingSizeCommandOnPlayer_(int newSize) + { + await Handler.ExecuteAsync(new SizePacket + { + VisualType = VisualType.Player, + VisualId = Session.Character.CharacterId, + Size = (byte)newSize + }, Session); + } + + private async Task ExecutingSizeCommandWithUnknownVisualType() + { + await Handler.ExecuteAsync(new SizePacket + { + VisualType = unchecked((VisualType)99), + VisualId = 1, + Size = 20 + }, Session); + } + + private async Task ExecutingSizeCommandOnNonExistentNpc() + { + await Handler.ExecuteAsync(new SizePacket + { + VisualType = VisualType.Npc, + VisualId = 999999, + Size = 20 + }, Session); + } + + private void PlayerSizeShouldBe_(int expectedSize) + { + Assert.AreEqual((byte)expectedSize, Session.Character.Size); + } + + private void ShouldLogError() + { + Logger.Verify(x => x.Error(It.IsAny(), It.IsAny()), Times.AtLeastOnce); + } + } +} diff --git a/test/NosCore.PacketHandlers.Tests/Command/SpeedPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Command/SpeedPacketHandlerTests.cs new file mode 100644 index 000000000..3cf100ea5 --- /dev/null +++ b/test/NosCore.PacketHandlers.Tests/Command/SpeedPacketHandlerTests.cs @@ -0,0 +1,114 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Linq; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using NosCore.Data.CommandPackets; +using NosCore.GameObject.Networking; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.PacketHandlers.Command; +using NosCore.Packets.ServerPackets.Chats; +using NosCore.Tests.Shared; +using SpecLight; + +namespace NosCore.PacketHandlers.Tests.Command +{ + [TestClass] + public class SpeedPacketHandlerTests + { + private SpeedPacketHandler Handler = null!; + private ClientSession Session = null!; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Broadcaster.Reset(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + Handler = new SpeedPacketHandler(); + } + + [TestMethod] + public async Task SpeedWithValidValueShouldSetVehicleSpeed() + { + await new Spec("Speed with valid value should set vehicle speed") + .WhenAsync(SettingSpeed_, 30) + .Then(VehicleSpeedShouldBe_, 30) + .ExecuteAsync(); + } + + [TestMethod] + public async Task SpeedWithZeroShouldShowHelp() + { + await new Spec("Speed with zero should show help") + .WhenAsync(SettingSpeed_, 0) + .Then(ShouldShowHelpMessage) + .ExecuteAsync(); + } + + [TestMethod] + public async Task SpeedWithNegativeShouldShowHelp() + { + await new Spec("Speed with value 60 or more should show help") + .WhenAsync(SettingSpeed_, 60) + .Then(ShouldShowHelpMessage) + .ExecuteAsync(); + } + + [TestMethod] + public async Task SpeedWith59ShouldSetSpeed() + { + await new Spec("Speed with 59 should set speed") + .WhenAsync(SettingSpeed_, 59) + .Then(VehicleSpeedShouldBe_, 59) + .ExecuteAsync(); + } + + [TestMethod] + public async Task SpeedShouldSendPacketResponse() + { + await new Spec("Speed should send packet response") + .WhenAsync(SettingSpeed_, 30) + .Then(ShouldSendPacketResponse) + .ExecuteAsync(); + } + + private async Task SettingSpeed_(int speed) + { + Session.LastPackets.Clear(); + await Handler.ExecuteAsync(new SpeedPacket { Speed = (byte)speed }, Session); + } + + private void VehicleSpeedShouldBe_(int expectedSpeed) + { + Assert.AreEqual((byte)expectedSpeed, Session.Character.VehicleSpeed); + } + + private void ShouldShowHelpMessage() + { + Assert.IsTrue(Session.LastPackets.Any(p => p is SayPacket)); + } + + private void ShouldSendPacketResponse() + { + Assert.IsTrue(Session.LastPackets.Count > 0); + } + } +} diff --git a/test/NosCore.PacketHandlers.Tests/Command/TeleportPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Command/TeleportPacketHandlerTests.cs new file mode 100644 index 000000000..5aa412149 --- /dev/null +++ b/test/NosCore.PacketHandlers.Tests/Command/TeleportPacketHandlerTests.cs @@ -0,0 +1,158 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.Data.CommandPackets; +using NosCore.GameObject.Networking; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.GameObject.Services.MapChangeService; +using NosCore.PacketHandlers.Command; +using NosCore.Tests.Shared; +using Serilog; +using SpecLight; + +namespace NosCore.PacketHandlers.Tests.Command +{ + [TestClass] + public class TeleportPacketHandlerTests + { + private TeleportPacketHandler Handler = null!; + private ClientSession Session = null!; + private ClientSession TargetSession = null!; + private Mock MapChangeService = null!; + private readonly ILogger Logger = new Mock().Object; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Broadcaster.Reset(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + TargetSession = await TestHelpers.Instance.GenerateSessionAsync(); + MapChangeService = new Mock(); + + Handler = new TeleportPacketHandler( + Logger, + MapChangeService.Object, + TestHelpers.Instance.GameLanguageLocalizer, + TestHelpers.Instance.SessionRegistry); + } + + [TestMethod] + public async Task TeleportingToPlayerShouldChangeMapInstance() + { + await new Spec("Teleporting to player should change map instance") + .Given(CharacterIsOnMap) + .And(TargetIsOnline) + .WhenAsync(TeleportingToPlayer) + .Then(MapChangeServiceShouldBeCalled) + .ExecuteAsync(); + } + + [TestMethod] + public async Task TeleportingToMapByIdShouldChangeMap() + { + await new Spec("Teleporting to map by id should change map") + .Given(CharacterIsOnMap) + .WhenAsync(TeleportingToMapById) + .Then(MapChangeByIdShouldBeCalled) + .ExecuteAsync(); + } + + [TestMethod] + public async Task TeleportingToUnknownPlayerShouldLogError() + { + await new Spec("Teleporting to unknown player should log error") + .Given(CharacterIsOnMap) + .WhenAsync(TeleportingToUnknownPlayer) + .Then(NoMapChangeShouldOccur) + .ExecuteAsync(); + } + + private void CharacterIsOnMap() + { + Session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; + } + + private void TargetIsOnline() + { + TargetSession.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; + } + + private async Task TeleportingToPlayer() + { + await Handler.ExecuteAsync(new TeleportPacket + { + TeleportArgument = TargetSession.Character.Name + }, Session); + } + + private async Task TeleportingToMapById() + { + await Handler.ExecuteAsync(new TeleportPacket + { + TeleportArgument = "1", + MapX = 50, + MapY = 50 + }, Session); + } + + private async Task TeleportingToUnknownPlayer() + { + await Handler.ExecuteAsync(new TeleportPacket + { + TeleportArgument = "UnknownPlayerName123" + }, Session); + } + + private void MapChangeServiceShouldBeCalled() + { + MapChangeService.Verify(x => x.ChangeMapInstanceAsync( + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny()), Times.Once); + } + + private void MapChangeByIdShouldBeCalled() + { + MapChangeService.Verify(x => x.ChangeMapAsync( + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny()), Times.Once); + } + + private void NoMapChangeShouldOccur() + { + MapChangeService.Verify(x => x.ChangeMapInstanceAsync( + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny()), Times.Never); + MapChangeService.Verify(x => x.ChangeMapAsync( + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny()), Times.Never); + } + } +} diff --git a/test/NosCore.PacketHandlers.Tests/Exchange/ExcListPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Exchange/ExcListPacketHandlerTests.cs new file mode 100644 index 000000000..accd1a846 --- /dev/null +++ b/test/NosCore.PacketHandlers.Tests/Exchange/ExcListPacketHandlerTests.cs @@ -0,0 +1,218 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.Data.Enumerations; +using NosCore.Data.StaticEntities; +using NosCore.GameObject.Infastructure; +using NosCore.GameObject.Networking; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.GameObject.Services.EventLoaderService; +using NosCore.GameObject.Services.ExchangeService; +using NosCore.GameObject.Services.InventoryService; +using NosCore.GameObject.Services.ItemGenerationService; +using NosCore.GameObject.Services.ItemGenerationService.Item; +using NosCore.PacketHandlers.Exchange; +using NosCore.Packets.ClientPackets.Exchanges; +using NosCore.Packets.ClientPackets.Inventory; +using NosCore.Packets.Enumerations; +using NosCore.Packets.ServerPackets.Exchanges; +using NosCore.Tests.Shared; +using Serilog; +using SpecLight; + +namespace NosCore.PacketHandlers.Tests.Exchange +{ + [TestClass] + public class ExcListPacketHandlerTests + { + private ExcListPacketHandler Handler = null!; + private ClientSession Session = null!; + private ClientSession TargetSession = null!; + private Mock ExchangeService = null!; + private ItemGenerationService ItemProvider = null!; + private readonly ILogger Logger = new Mock().Object; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Broadcaster.Reset(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + TargetSession = await TestHelpers.Instance.GenerateSessionAsync(); + ExchangeService = new Mock(); + + var items = new List + { + new Item { Type = NoscorePocketType.Main, VNum = 1012, IsTradable = true }, + new Item { Type = NoscorePocketType.Main, VNum = 1013, IsTradable = false } + }; + ItemProvider = new ItemGenerationService(items, + new EventLoaderService, IUseItemEventHandler>( + new List>>()), + Logger, TestHelpers.Instance.LogLanguageLocalizer); + + Handler = new ExcListPacketHandler( + ExchangeService.Object, + Logger, + TestHelpers.Instance.LogLanguageLocalizer, + TestHelpers.Instance.SessionRegistry); + } + + [TestMethod] + public async Task SettingGoldMoreThanAvailableShouldBeIgnored() + { + await new Spec("Setting gold more than available should be ignored") + .Given(CharacterHasNoGold) + .WhenAsync(SettingGoldInExchange) + .Then(ExchangeGoldShouldNotBeSet) + .ExecuteAsync(); + } + + [TestMethod] + public async Task AddingNonTradableItemShouldCloseExchange() + { + await new Spec("Adding non tradable item should close exchange") + .Given(CharacterHasNonTradableItem) + .And(ExchangeIsOpenWithTarget) + .WhenAsync(AddingNonTradableItemToExchange) + .Then(ExchangeShouldBeClosed) + .ExecuteAsync(); + } + + [TestMethod] + public async Task AddingTradableItemShouldSucceed() + { + await new Spec("Adding tradable item should succeed") + .Given(CharacterHasTradableItem) + .And(ExchangeIsOpenWithTarget) + .WhenAsync(AddingTradableItemToExchange) + .Then(ItemShouldBeAddedToExchange) + .ExecuteAsync(); + } + + [TestMethod] + public async Task SettingValidGoldShouldUpdateExchange() + { + await new Spec("Setting valid gold should update exchange") + .Given(CharacterHasGold) + .And(ExchangeIsOpenWithTarget) + .WhenAsync(SettingGoldInExchange) + .Then(ExchangeGoldShouldBeSet) + .ExecuteAsync(); + } + + private void CharacterHasNoGold() + { + Session.Character.Gold = 0; + Session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; + } + + private void CharacterHasGold() + { + Session.Character.Gold = 10000; + Session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; + } + + private void CharacterHasNonTradableItem() + { + Session.Character.InventoryService.AddItemToPocket( + InventoryItemInstance.Create(ItemProvider.Create(1013, 1), 0), + NoscorePocketType.Main, 0); + Session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; + } + + private void CharacterHasTradableItem() + { + Session.Character.InventoryService.AddItemToPocket( + InventoryItemInstance.Create(ItemProvider.Create(1012, 10), 0), + NoscorePocketType.Main, 0); + Session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; + } + + private void ExchangeIsOpenWithTarget() + { + TargetSession.Character.MapInstance = Session.Character.MapInstance; + ExchangeService.Setup(x => x.GetTargetId(Session.Character.VisualId)) + .Returns(TargetSession.Character.VisualId); + ExchangeService.Setup(x => x.CloseExchange(It.IsAny(), It.IsAny())) + .Returns(new ExcClosePacket { Type = ExchangeResultType.Failure }); + } + + private async Task SettingGoldInExchange() + { + await Handler.ExecuteAsync(new ExcListPacket + { + Gold = 5000, + BankGold = 0, + SubPackets = new List() + }, Session); + } + + private async Task AddingNonTradableItemToExchange() + { + await Handler.ExecuteAsync(new ExcListPacket + { + Gold = 0, + BankGold = 0, + SubPackets = new List + { + new() { Slot = 0, PocketType = PocketType.Main, Amount = 1 } + } + }, Session); + } + + private async Task AddingTradableItemToExchange() + { + await Handler.ExecuteAsync(new ExcListPacket + { + Gold = 0, + BankGold = 0, + SubPackets = new List + { + new() { Slot = 0, PocketType = PocketType.Main, Amount = 5 } + } + }, Session); + } + + private void ExchangeGoldShouldNotBeSet() + { + ExchangeService.Verify(x => x.SetGold(It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); + } + + private void ExchangeGoldShouldBeSet() + { + ExchangeService.Verify(x => x.SetGold(Session.Character.CharacterId, 5000, 0), Times.Once); + } + + private void ExchangeShouldBeClosed() + { + ExchangeService.Verify(x => x.CloseExchange(Session.Character.VisualId, ExchangeResultType.Failure), Times.Once); + } + + private void ItemShouldBeAddedToExchange() + { + ExchangeService.Verify(x => x.AddItems(Session.Character.CharacterId, It.IsAny(), 5), Times.Once); + } + } +} diff --git a/test/NosCore.PacketHandlers.Tests/Exchange/ExchangeRequestPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Exchange/ExchangeRequestPacketHandlerTests.cs new file mode 100644 index 000000000..83227d501 --- /dev/null +++ b/test/NosCore.PacketHandlers.Tests/Exchange/ExchangeRequestPacketHandlerTests.cs @@ -0,0 +1,215 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.Data.WebApi; +using NosCore.GameObject.InterChannelCommunication.Hubs.BlacklistHub; +using NosCore.GameObject.Networking; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.GameObject.Services.ExchangeService; +using NosCore.PacketHandlers.Exchange; +using NosCore.Packets.ClientPackets.Exchanges; +using NosCore.Packets.Enumerations; +using NosCore.Packets.ServerPackets.Chats; +using NosCore.Packets.ServerPackets.Exchanges; +using NosCore.Packets.ServerPackets.UI; +using NosCore.Tests.Shared; +using Serilog; +using SpecLight; + +namespace NosCore.PacketHandlers.Tests.Exchange +{ + [TestClass] + public class ExchangeRequestPacketHandlerTests + { + private ExchangeRequestPackettHandler Handler = null!; + private ClientSession Session = null!; + private ClientSession TargetSession = null!; + private Mock ExchangeService = null!; + private Mock BlacklistHub = null!; + private readonly ILogger Logger = new Mock().Object; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Broadcaster.Reset(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + TargetSession = await TestHelpers.Instance.GenerateSessionAsync(); + ExchangeService = new Mock(); + BlacklistHub = new Mock(); + BlacklistHub.Setup(x => x.GetBlacklistedAsync(It.IsAny())) + .Returns(Task.FromResult(new List())); + + Handler = new ExchangeRequestPackettHandler( + ExchangeService.Object, + Logger, + BlacklistHub.Object, + TestHelpers.Instance.LogLanguageLocalizer, + TestHelpers.Instance.SessionRegistry); + } + + [TestMethod] + public async Task RequestingExchangeWhileInShopShouldBeIgnored() + { + await new Spec("Requesting exchange while in shop should be ignored") + .Given(CharacterIsInShop) + .WhenAsync(RequestingExchange) + .Then(NoExchangeShouldBeOpened) + .ExecuteAsync(); + } + + [TestMethod] + public async Task RequestingExchangeWhenTargetAlreadyInExchangeShouldFail() + { + await new Spec("Requesting exchange when target already in exchange should fail") + .Given(TargetIsAlreadyInExchange) + .WhenAsync(RequestingExchange) + .Then(ShouldReceiveTradingWithSomeoneMessage) + .ExecuteAsync(); + } + + [TestMethod] + public async Task RequestingExchangeWhenTargetBlocksExchangeShouldFail() + { + await new Spec("Requesting exchange when target blocks exchange should fail") + .Given(TargetBlocksExchange) + .WhenAsync(RequestingExchange) + .Then(ShouldReceiveBlockingTradesMessage) + .ExecuteAsync(); + } + + [TestMethod] + public async Task RequestingExchangeWithBlacklistedPlayerShouldFail() + { + await new Spec("Requesting exchange with blacklisted player should fail") + .Given(TargetIsBlacklisted) + .WhenAsync(RequestingExchange) + .Then(ShouldReceiveBlacklistedMessage) + .ExecuteAsync(); + } + + [TestMethod] + public async Task CancellingExchangeShouldCloseExchange() + { + await new Spec("Cancelling exchange should close exchange") + .Given(ExchangeIsOpen) + .WhenAsync(CancellingExchange) + .Then(ExchangeShouldBeClosed) + .ExecuteAsync(); + } + + private void CharacterIsInShop() + { + Session.Character.InShop = true; + Session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; + TargetSession.Character.MapInstance = Session.Character.MapInstance; + } + + private void TargetIsAlreadyInExchange() + { + Session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; + TargetSession.Character.MapInstance = Session.Character.MapInstance; + ExchangeService.Setup(x => x.CheckExchange(It.IsAny())).Returns(true); + } + + private void TargetBlocksExchange() + { + Session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; + TargetSession.Character.MapInstance = Session.Character.MapInstance; + TargetSession.Character.ExchangeBlocked = true; + ExchangeService.Setup(x => x.CheckExchange(It.IsAny())).Returns(false); + } + + private void TargetIsBlacklisted() + { + Session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; + TargetSession.Character.MapInstance = Session.Character.MapInstance; + ExchangeService.Setup(x => x.CheckExchange(It.IsAny())).Returns(false); + BlacklistHub.Setup(x => x.GetBlacklistedAsync(Session.Character.VisualId)) + .Returns(Task.FromResult(new List + { + new() { CharacterId = TargetSession.Character.VisualId } + })); + } + + private void ExchangeIsOpen() + { + Session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; + TargetSession.Character.MapInstance = Session.Character.MapInstance; + ExchangeService.Setup(x => x.GetTargetId(It.IsAny())) + .Returns((long?)TargetSession.Character.CharacterId); + ExchangeService.Setup(x => x.CloseExchange(It.IsAny(), It.IsAny())) + .Returns(new ExcClosePacket { Type = ExchangeResultType.Failure }); + } + + private async Task RequestingExchange() + { + await Handler.ExecuteAsync(new ExchangeRequestPacket + { + RequestType = RequestExchangeType.Requested, + VisualId = TargetSession.Character.VisualId + }, Session); + } + + private async Task CancellingExchange() + { + await Handler.ExecuteAsync(new ExchangeRequestPacket + { + RequestType = RequestExchangeType.Cancelled, + VisualId = 0 + }, Session); + } + + private void NoExchangeShouldBeOpened() + { + ExchangeService.Verify(x => x.OpenExchange(It.IsAny(), It.IsAny()), Times.Never); + } + + private void ShouldReceiveTradingWithSomeoneMessage() + { + var packet = Session.LastPackets.FirstOrDefault(s => s is Infoi2Packet) as Infoi2Packet; + Assert.IsNotNull(packet); + Assert.AreEqual(Game18NConstString.TradingWithSomeoneElse, packet.Message); + } + + private void ShouldReceiveBlockingTradesMessage() + { + var packet = Session.LastPackets.FirstOrDefault(s => s is Infoi2Packet) as Infoi2Packet; + Assert.IsNotNull(packet); + Assert.AreEqual(Game18NConstString.BlockingTrades, packet.Message); + } + + private void ShouldReceiveBlacklistedMessage() + { + var packet = Session.LastPackets.FirstOrDefault(s => s is SayiPacket) as SayiPacket; + Assert.IsNotNull(packet); + Assert.AreEqual(Game18NConstString.AlreadyBlacklisted, packet.Message); + } + + private void ExchangeShouldBeClosed() + { + ExchangeService.Verify(x => x.CloseExchange(It.IsAny(), ExchangeResultType.Failure), Times.Once); + } + } +} diff --git a/test/NosCore.PacketHandlers.Tests/Friend/BlDelPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Friend/BlDelPacketHandlerTests.cs index d4fed111e..faa08fc21 100644 --- a/test/NosCore.PacketHandlers.Tests/Friend/BlDelPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Friend/BlDelPacketHandlerTests.cs @@ -2,18 +2,18 @@ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . @@ -40,137 +40,158 @@ using NosCore.Packets.ServerPackets.UI; using NosCore.Tests.Shared; using Serilog; +using SpecLight; namespace NosCore.PacketHandlers.Tests.Friend { [TestClass] - public class BDelPacketHandlerTests + public class BlDelPacketHandlerTests { private static readonly ILogger Logger = new Mock().Object; - private BlacklistService? _blackListController; - private Mock? _blackListHttpClient; - private BlDelPacketHandler? _blDelPacketHandler; - private Mock>? _characterDao; - private IDao? _characterRelationDao; - private Mock? _connectedAccountHttpClient; - private Mock? _channelHub; - private ClientSession? _session; + private BlacklistService BlackListController = null!; + private Mock BlackListHttpClient = null!; + private BlDelPacketHandler BlDelPacketHandler = null!; + private Mock> CharacterDao = null!; + private IDao CharacterRelationDao = null!; + private Mock ConnectedAccountHttpClient = null!; + private Mock ChannelHub = null!; + private ClientSession Session = null!; [TestInitialize] public async Task SetupAsync() { - _characterRelationDao = TestHelpers.Instance.CharacterRelationDao; + CharacterRelationDao = TestHelpers.Instance.CharacterRelationDao; Broadcaster.Reset(); await TestHelpers.ResetAsync(); - _session = await TestHelpers.Instance.GenerateSessionAsync(); - _connectedAccountHttpClient = TestHelpers.Instance.PubSubHub; - _channelHub = new Mock(); - _connectedAccountHttpClient.Setup(s => s.GetSubscribersAsync()) + Session = await TestHelpers.Instance.GenerateSessionAsync(); + ConnectedAccountHttpClient = TestHelpers.Instance.PubSubHub; + ChannelHub = new Mock(); + ConnectedAccountHttpClient.Setup(s => s.GetSubscribersAsync()) .ReturnsAsync(new List(){ new Subscriber { - ChannelId = 1, ConnectedCharacter = new Character { Id = _session.Character.CharacterId } + ChannelId = 1, ConnectedCharacter = new Character { Id = Session.Character.CharacterId } } - }); - _blackListHttpClient = TestHelpers.Instance.BlacklistHttpClient; - _blDelPacketHandler = new BlDelPacketHandler(_blackListHttpClient.Object, TestHelpers.Instance.GameLanguageLocalizer); - _characterDao = new Mock>(); - _blackListController = new BlacklistService(_connectedAccountHttpClient.Object, _channelHub.Object, _characterRelationDao, - _characterDao.Object); - _blackListHttpClient.Setup(s => s.GetBlacklistedAsync(It.IsAny())) - .Returns((long id) => _blackListController.GetBlacklistedListAsync(id)); - _blackListHttpClient.Setup(s => s.DeleteAsync(It.IsAny())) - .Callback((Guid id) => Task.FromResult(_blackListController.UnblacklistAsync(id))); + BlackListHttpClient = TestHelpers.Instance.BlacklistHttpClient; + BlDelPacketHandler = new BlDelPacketHandler(BlackListHttpClient.Object, TestHelpers.Instance.GameLanguageLocalizer); + CharacterDao = new Mock>(); + BlackListController = new BlacklistService(ConnectedAccountHttpClient.Object, ChannelHub.Object, CharacterRelationDao, + CharacterDao.Object); + BlackListHttpClient.Setup(s => s.GetBlacklistedAsync(It.IsAny())) + .Returns((long id) => BlackListController.GetBlacklistedListAsync(id)); + BlackListHttpClient.Setup(s => s.DeleteAsync(It.IsAny())) + .Callback((Guid id) => Task.FromResult(BlackListController.UnblacklistAsync(id))); } [TestMethod] - public async Task Test_Delete_Friend_When_DisconnectedAsync() + public async Task DeletingBlacklistedPlayerWhenDisconnectedShouldSucceed() + { + await new Spec("Deleting blacklisted player when disconnected should succeed") + .Given(TargetPlayerIsDisconnected) + .AndAsync(CharacterHasBlockedDisconnectedTarget) + .WhenAsync(DeletingFromBlacklist) + .Then(BlacklistShouldBeEmpty) + .ExecuteAsync(); + } + + [TestMethod] + public async Task DeletingBlacklistedPlayerShouldSucceed() + { + await new Spec("Deleting blacklisted player should succeed") + .GivenAsync(TargetPlayerIsOnline) + .AndAsync(CharacterHasBlockedTarget) + .WhenAsync(DeletingTargetFromBlacklist) + .Then(BlacklistShouldBeEmpty) + .ExecuteAsync(); + } + + [TestMethod] + public async Task DeletingNonBlacklistedPlayerShouldShowError() + { + await new Spec("Deleting non blacklisted player should show error") + .GivenAsync(TargetPlayerIsOnline) + .WhenAsync(DeletingTargetFromBlacklist) + .Then(ShouldReceiveNotInBlacklistMessage) + .ExecuteAsync(); + } + + private ClientSession? TargetSession; + private long TargetCharacterId = 2; + + private void TargetPlayerIsDisconnected() { - var targetGuid = Guid.NewGuid(); var list = new List { - _session!.Character, - new() {CharacterId = 2, Name = "test"} + Session.Character, + new() { CharacterId = 2, Name = "test" } }; - _characterDao!.Setup(s => s.FirstOrDefaultAsync(It.IsAny>>())) + CharacterDao.Setup(s => s.FirstOrDefaultAsync(It.IsAny>>())) .Returns((Expression> exp) => Task.FromResult(list.FirstOrDefault(exp.Compile()))!); - await _characterRelationDao!.TryInsertOrUpdateAsync(new[] - { - new CharacterRelationDto - { - RelatedCharacterId = 2, - CharacterRelationId = targetGuid, - CharacterId = _session.Character.CharacterId, - RelationType = CharacterRelationType.Blocked - } - }); - var blDelPacket = new BlDelPacket - { - CharacterId = 2 - }; - - await _blDelPacketHandler!.ExecuteAsync(blDelPacket, _session); - - Assert.IsTrue(!_characterRelationDao.LoadAll().Any()); } - [TestMethod] - public async Task Test_Delete_FriendAsync() + private async Task TargetPlayerIsOnline() { - var targetSession = await TestHelpers.Instance.GenerateSessionAsync(); - Guid.NewGuid(); - var targetGuid = Guid.NewGuid(); + TargetSession = await TestHelpers.Instance.GenerateSessionAsync(); + TargetCharacterId = TargetSession.Character.CharacterId; var list = new List { - _session!.Character, - targetSession.Character + Session.Character, + TargetSession.Character }; - _characterDao!.Setup(s => s.FirstOrDefaultAsync(It.IsAny>>())) + CharacterDao.Setup(s => s.FirstOrDefaultAsync(It.IsAny>>())) .Returns((Expression> exp) => Task.FromResult(list.FirstOrDefault(exp.Compile()))!); - await _characterRelationDao!.TryInsertOrUpdateAsync(new[] + } + + private async Task CharacterHasBlockedDisconnectedTarget() + { + var targetGuid = Guid.NewGuid(); + await CharacterRelationDao.TryInsertOrUpdateAsync(new[] { new CharacterRelationDto { - RelatedCharacterId = targetSession.Character.CharacterId, + RelatedCharacterId = 2, CharacterRelationId = targetGuid, - CharacterId = _session.Character.CharacterId, + CharacterId = Session.Character.CharacterId, RelationType = CharacterRelationType.Blocked } }); - var blDelPacket = new BlDelPacket - { - CharacterId = targetSession.Character.CharacterId - }; - - await _blDelPacketHandler!.ExecuteAsync(blDelPacket, _session); - - Assert.IsTrue(!_characterRelationDao.LoadAll().Any()); } - [TestMethod] - public async Task Test_Delete_Friend_No_FriendAsync() + private async Task CharacterHasBlockedTarget() { - var targetSession = await TestHelpers.Instance.GenerateSessionAsync(); - var guid = Guid.NewGuid(); var targetGuid = Guid.NewGuid(); - var list = new List + await CharacterRelationDao.TryInsertOrUpdateAsync(new[] { - _session!.Character, - targetSession.Character - }; - _characterDao!.Setup(s => s.FirstOrDefaultAsync(It.IsAny>>())) - .Returns((Expression> exp) => Task.FromResult(list.FirstOrDefault(exp.Compile()))!); + new CharacterRelationDto + { + RelatedCharacterId = TargetSession!.Character.CharacterId, + CharacterRelationId = targetGuid, + CharacterId = Session.Character.CharacterId, + RelationType = CharacterRelationType.Blocked + } + }); + } - var blDelPacket = new BlDelPacket - { - CharacterId = targetSession.Character.CharacterId - }; + private async Task DeletingFromBlacklist() + { + await BlDelPacketHandler.ExecuteAsync(new BlDelPacket { CharacterId = 2 }, Session); + } + + private async Task DeletingTargetFromBlacklist() + { + await BlDelPacketHandler.ExecuteAsync(new BlDelPacket { CharacterId = TargetCharacterId }, Session); + } + + private void BlacklistShouldBeEmpty() + { + Assert.IsFalse(CharacterRelationDao.LoadAll().Any()); + } - await _blDelPacketHandler!.ExecuteAsync(blDelPacket, _session); - var lastpacket = (InfoPacket?)_session.LastPackets.FirstOrDefault(s => s is InfoPacket); - Assert.AreEqual(TestHelpers.Instance.GameLanguageLocalizer[LanguageKey.NOT_IN_BLACKLIST, - _session.Account.Language], lastpacket!.Message); + private void ShouldReceiveNotInBlacklistMessage() + { + var lastpacket = (InfoPacket?)Session.LastPackets.FirstOrDefault(s => s is InfoPacket); + Assert.AreEqual(TestHelpers.Instance.GameLanguageLocalizer[LanguageKey.NOT_IN_BLACKLIST, Session.Account.Language], lastpacket!.Message); } } -} \ No newline at end of file +} diff --git a/test/NosCore.PacketHandlers.Tests/Friend/BlInsPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Friend/BlInsPacketHandlerTests.cs index 4c2201e6b..f60ccf2fc 100644 --- a/test/NosCore.PacketHandlers.Tests/Friend/BlInsPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Friend/BlInsPacketHandlerTests.cs @@ -2,18 +2,18 @@ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . @@ -32,6 +32,7 @@ using NosCore.Shared.Enumerations; using NosCore.Tests.Shared; using Serilog; +using SpecLight; using Character = NosCore.Data.WebApi.Character; namespace NosCore.PacketHandlers.Tests.Friend @@ -40,16 +41,15 @@ namespace NosCore.PacketHandlers.Tests.Friend public class BlInsPacketHandlerTests { private static readonly ILogger Logger = new Mock().Object; - - private BlInsPackettHandler? _blInsPacketHandler; - private ClientSession? _session; + private BlInsPackettHandler BlInsPacketHandler = null!; + private ClientSession Session = null!; [TestInitialize] public async Task SetupAsync() { Broadcaster.Reset(); await TestHelpers.ResetAsync(); - _session = await TestHelpers.Instance.GenerateSessionAsync(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); TestHelpers.Instance.ChannelHub.Setup(s => s.GetCommunicationChannels()) .ReturnsAsync(new List(){ @@ -58,64 +58,83 @@ public async Task SetupAsync() Type = ServerType.WorldServer, Id = 1 } - }); - _blInsPacketHandler = new BlInsPackettHandler(TestHelpers.Instance.BlacklistHttpClient.Object, Logger, TestHelpers.Instance.LogLanguageLocalizer); + BlInsPacketHandler = new BlInsPackettHandler(TestHelpers.Instance.BlacklistHttpClient.Object, Logger, TestHelpers.Instance.LogLanguageLocalizer); TestHelpers.Instance.PubSubHub.Setup(s => s.GetSubscribersAsync()) .ReturnsAsync(new List(){ new Subscriber { - ChannelId = 1, ConnectedCharacter = new Character { Id = _session.Character.CharacterId } + ChannelId = 1, ConnectedCharacter = new Character { Id = Session.Character.CharacterId } } - }); } [TestMethod] - public async Task Test_Blacklist_When_DisconnectedAsync() + public async Task BlacklistingDisconnectedPlayerShouldNotCreateRelation() { - var blinsPacket = new BlInsPacket - { - CharacterId = 2 - }; - - await _blInsPacketHandler!.ExecuteAsync(blinsPacket, _session!); - Assert.IsNull(await - TestHelpers.Instance.CharacterRelationDao.FirstOrDefaultAsync(s => - (_session!.Character.CharacterId == s.CharacterId) && - (s.RelationType == CharacterRelationType.Blocked))); + await new Spec("Blacklisting disconnected player should not create relation") + .WhenAsync(BlacklistingDisconnectedCharacter) + .ThenAsync(NoBlockedRelationShouldExist) + .ExecuteAsync(); } [TestMethod] - public async Task Test_Blacklist_CharacterAsync() + public async Task BlacklistingConnectedPlayerShouldCreateRelation() + { + await new Spec("Blacklisting connected player should create relation") + .GivenAsync(TargetIsOnline) + .WhenAsync(BlacklistingTargetCharacter) + .ThenAsync(BlockedRelationShouldExist) + .ExecuteAsync(); + } + + private ClientSession? TargetSession; + + private async Task TargetIsOnline() { - var targetSession = await TestHelpers.Instance.GenerateSessionAsync(); + TargetSession = await TestHelpers.Instance.GenerateSessionAsync(); TestHelpers.Instance.PubSubHub.Setup(s => s.GetSubscribersAsync()) .ReturnsAsync(new List(){ new Subscriber { - ChannelId = 1, ConnectedCharacter = new Character { Id = targetSession.Character.CharacterId } + ChannelId = 1, ConnectedCharacter = new Character { Id = TargetSession.Character.CharacterId } }, new Subscriber { - ChannelId = 1, ConnectedCharacter = new Character { Id = _session!.Character.CharacterId } + ChannelId = 1, ConnectedCharacter = new Character { Id = Session.Character.CharacterId } } - }); var blacklist = new BlacklistService(TestHelpers.Instance.PubSubHub.Object, TestHelpers.Instance.ChannelHub.Object, TestHelpers.Instance.CharacterRelationDao, TestHelpers.Instance.CharacterDao); TestHelpers.Instance.BlacklistHttpClient.Setup(s => s.AddBlacklistAsync(It.IsAny())) - .Returns(blacklist.BlacklistPlayerAsync(_session!.Character.CharacterId, targetSession.Character.VisualId)); - var blinsPacket = new BlInsPacket - { - CharacterId = targetSession.Character.CharacterId - }; + .Returns(blacklist.BlacklistPlayerAsync(Session.Character.CharacterId, TargetSession.Character.VisualId)); + } - await _blInsPacketHandler!.ExecuteAsync(blinsPacket, _session); - Assert.IsNotNull( - TestHelpers.Instance.CharacterRelationDao.FirstOrDefaultAsync(s => (_session.Character.CharacterId == s.CharacterId) - && (targetSession.Character.CharacterId == s.RelatedCharacterId) && - (s.RelationType == CharacterRelationType.Blocked))); + private async Task BlacklistingDisconnectedCharacter() + { + await BlInsPacketHandler.ExecuteAsync(new BlInsPacket { CharacterId = 2 }, Session); + } + + private async Task BlacklistingTargetCharacter() + { + await BlInsPacketHandler.ExecuteAsync(new BlInsPacket { CharacterId = TargetSession!.Character.CharacterId }, Session); + } + + private async Task NoBlockedRelationShouldExist() + { + var result = await TestHelpers.Instance.CharacterRelationDao.FirstOrDefaultAsync(s => + Session.Character.CharacterId == s.CharacterId && + s.RelationType == CharacterRelationType.Blocked); + Assert.IsNull(result); + } + + private async Task BlockedRelationShouldExist() + { + var result = await TestHelpers.Instance.CharacterRelationDao.FirstOrDefaultAsync(s => + Session.Character.CharacterId == s.CharacterId && + TargetSession!.Character.CharacterId == s.RelatedCharacterId && + s.RelationType == CharacterRelationType.Blocked); + Assert.IsNotNull(result); } } -} \ No newline at end of file +} diff --git a/test/NosCore.PacketHandlers.Tests/Friend/BlPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Friend/BlPacketHandlerTests.cs index f183dfcd6..193120307 100644 --- a/test/NosCore.PacketHandlers.Tests/Friend/BlPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Friend/BlPacketHandlerTests.cs @@ -2,18 +2,18 @@ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . @@ -35,6 +35,7 @@ using NosCore.Shared.Enumerations; using NosCore.Tests.Shared; using Serilog; +using SpecLight; using Character = NosCore.Data.WebApi.Character; namespace NosCore.PacketHandlers.Tests.Friend @@ -43,17 +44,17 @@ namespace NosCore.PacketHandlers.Tests.Friend public class BlPacketHandlerTests { private static readonly ILogger Logger = new Mock().Object; - private BlPacketHandler? _blPacketHandler; - private IDao? _characterRelationDao; - private ClientSession? _session; + private BlPacketHandler BlPacketHandler = null!; + private IDao CharacterRelationDao = null!; + private ClientSession Session = null!; [TestInitialize] public async Task SetupAsync() { - _characterRelationDao = TestHelpers.Instance.CharacterRelationDao; + CharacterRelationDao = TestHelpers.Instance.CharacterRelationDao; Broadcaster.Reset(); await TestHelpers.ResetAsync(); - _session = await TestHelpers.Instance.GenerateSessionAsync(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); TestHelpers.Instance.ChannelHub.Setup(s => s.GetCommunicationChannels()) .ReturnsAsync(new List(){ @@ -62,49 +63,61 @@ public async Task SetupAsync() Type = ServerType.WorldServer, Id = 1 } - }); TestHelpers.Instance.PubSubHub.Setup(s => s.GetSubscribersAsync()) .ReturnsAsync(new List(){ - new Subscriber { - ChannelId = 1, ConnectedCharacter = new Character { Id = _session!.Character.CharacterId } + ChannelId = 1, ConnectedCharacter = new Character { Id = Session.Character.CharacterId } } - }); - _blPacketHandler = new BlPacketHandler(new NosCore.GameObject.Services.BroadcastService.SessionRegistry()); + BlPacketHandler = new BlPacketHandler(new NosCore.GameObject.Services.BroadcastService.SessionRegistry(Logger)); } [TestMethod] - public async Task Test_Distant_BlacklistAsync() + public async Task BlacklistingDistantPlayerByNameShouldSucceed() { - var targetSession = await TestHelpers.Instance.GenerateSessionAsync(); - var blPacket = new BlPacket - { - CharacterName = targetSession.Character.Name - }; + await new Spec("Blacklisting distant player by name should succeed") + .GivenAsync(TargetPlayerIsOnline) + .WhenAsync(BlacklistingTargetByName) + .ThenAsync(BlockedRelationShouldExist) + .ExecuteAsync(); + } + + private ClientSession? TargetSession; + + private async Task TargetPlayerIsOnline() + { + TargetSession = await TestHelpers.Instance.GenerateSessionAsync(); TestHelpers.Instance.PubSubHub.Setup(s => s.GetSubscribersAsync()) .ReturnsAsync(new List(){ new Subscriber { - ChannelId = 1, ConnectedCharacter = new Character { Id = targetSession.Character.CharacterId } + ChannelId = 1, ConnectedCharacter = new Character { Id = TargetSession.Character.CharacterId } }, new Subscriber { - ChannelId = 1, ConnectedCharacter = new Character { Id = _session!.Character.CharacterId } + ChannelId = 1, ConnectedCharacter = new Character { Id = Session.Character.CharacterId } } - }); var blacklist = new BlacklistService(TestHelpers.Instance.PubSubHub.Object, TestHelpers.Instance.ChannelHub.Object, - _characterRelationDao!, TestHelpers.Instance.CharacterDao); + CharacterRelationDao, TestHelpers.Instance.CharacterDao); TestHelpers.Instance.BlacklistHttpClient.Setup(s => s.AddBlacklistAsync(It.IsAny())) - .Returns(blacklist.BlacklistPlayerAsync( _session!.Character.CharacterId, targetSession.Character.VisualId)); - await _blPacketHandler!.ExecuteAsync(blPacket, _session); - Assert.IsTrue(await _characterRelationDao!.FirstOrDefaultAsync(s => - (s.CharacterId == _session.Character.CharacterId) && - (s.RelatedCharacterId == targetSession.Character.CharacterId) - && (s.RelationType == CharacterRelationType.Blocked)) != null); + .Returns(blacklist.BlacklistPlayerAsync(Session.Character.CharacterId, TargetSession.Character.VisualId)); + } + + private async Task BlacklistingTargetByName() + { + await BlPacketHandler.ExecuteAsync(new BlPacket { CharacterName = TargetSession!.Character.Name }, Session); + } + + private async Task BlockedRelationShouldExist() + { + var result = await CharacterRelationDao.FirstOrDefaultAsync(s => + s.CharacterId == Session.Character.CharacterId && + s.RelatedCharacterId == TargetSession!.Character.CharacterId && + s.RelationType == CharacterRelationType.Blocked); + Assert.IsNotNull(result); } } -} \ No newline at end of file +} diff --git a/test/NosCore.PacketHandlers.Tests/Friend/FinsPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Friend/FinsPacketHandlerTests.cs index f293100b2..7381b30cf 100644 --- a/test/NosCore.PacketHandlers.Tests/Friend/FinsPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Friend/FinsPacketHandlerTests.cs @@ -2,18 +2,18 @@ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . @@ -28,6 +28,7 @@ using NosCore.Dao.Interfaces; using NosCore.Data.Dto; using NosCore.Data.WebApi; +using NosCore.GameObject.ComponentEntities.Entities; using NosCore.GameObject.InterChannelCommunication.Hubs.ChannelHub; using NosCore.GameObject.InterChannelCommunication.Hubs.FriendHub; using NosCore.GameObject.InterChannelCommunication.Hubs.PubSub; @@ -39,8 +40,9 @@ using NosCore.Packets.Enumerations; using NosCore.Shared.Enumerations; using NosCore.Tests.Shared; +using NosCore.Tests.Shared.AutoFixture; using Serilog; -using NosCore.GameObject.ComponentEntities.Entities; +using SpecLight; using Character = NosCore.Data.WebApi.Character; namespace NosCore.PacketHandlers.Tests.Friend @@ -49,105 +51,153 @@ namespace NosCore.PacketHandlers.Tests.Friend public class FinsPacketHandlerTests { private static readonly ILogger Logger = new Mock().Object; - private readonly Mock _channelHttpClient = TestHelpers.Instance.ChannelHttpClient; - private IDao? _characterRelationDao; - private readonly Mock _connectedAccountHttpClient = TestHelpers.Instance.PubSubHub; - private Mock? _channelHub; - private FinsPacketHandler? _finsPacketHandler; - private readonly Mock _friendHttpClient = TestHelpers.Instance.FriendHttpClient; - private FriendRequestRegistry? _friendRequestHolder; - - private ClientSession? _session; - private ClientSession? _targetSession; + private NosCoreFixture Fixture = null!; + private readonly Mock ChannelHttpClient = TestHelpers.Instance.ChannelHttpClient; + private IDao CharacterRelationDao = null!; + private readonly Mock ConnectedAccountHttpClient = TestHelpers.Instance.PubSubHub; + private Mock ChannelHub = null!; + private FinsPacketHandler FinsPacketHandler = null!; + private readonly Mock FriendHttpClient = TestHelpers.Instance.FriendHttpClient; + private FriendRequestRegistry FriendRequestHolder = null!; + private ClientSession Session = null!; + private ClientSession TargetSession = null!; [TestInitialize] public async Task SetupAsync() { TypeAdapterConfig.NewConfig() - .ConstructUsing(src => new MapNpc(null, Logger, TestHelpers.Instance.DistanceCalculator, TestHelpers.Instance.Clock)); + .ConstructUsing(src => new MapNpc(null, new Mock().Object, + TestHelpers.Instance.DistanceCalculator, TestHelpers.Instance.Clock)); Broadcaster.Reset(); await TestHelpers.ResetAsync(); - _session = await TestHelpers.Instance.GenerateSessionAsync(); - _targetSession = await TestHelpers.Instance.GenerateSessionAsync(); - _characterRelationDao = TestHelpers.Instance.CharacterRelationDao; - _channelHub = new Mock(); - _channelHub.Setup(s => s.GetCommunicationChannels()) - .ReturnsAsync(new List(){ - new ChannelInfo - { - Type = ServerType.WorldServer, - Id = 1 - } - + Fixture = new NosCoreFixture(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + TargetSession = await TestHelpers.Instance.GenerateSessionAsync(); + CharacterRelationDao = TestHelpers.Instance.CharacterRelationDao; + ChannelHub = new Mock(); + ChannelHub.Setup(s => s.GetCommunicationChannels()) + .ReturnsAsync(new List + { + new ChannelInfo { Type = ServerType.WorldServer, Id = 1 } }); - _friendRequestHolder = new FriendRequestRegistry(); - _connectedAccountHttpClient.Setup(s => s.GetSubscribersAsync()) - .ReturnsAsync(new List(){ + FriendRequestHolder = new FriendRequestRegistry(); + ConnectedAccountHttpClient.Setup(s => s.GetSubscribersAsync()) + .ReturnsAsync(new List + { new Subscriber { - ChannelId = 1, ConnectedCharacter = new Character { Id = _targetSession.Character.CharacterId } + ChannelId = 1, + ConnectedCharacter = new Character { Id = TargetSession.Character.CharacterId } }, new Subscriber { - ChannelId = 1, ConnectedCharacter = new Character { Id = _session.Character.CharacterId } + ChannelId = 1, + ConnectedCharacter = new Character { Id = Session.Character.CharacterId } } + }); + FinsPacketHandler = new FinsPacketHandler( + FriendHttpClient.Object, + ChannelHttpClient.Object, + ConnectedAccountHttpClient.Object, + new NosCore.GameObject.Services.BroadcastService.SessionRegistry(Logger)); + } + + private FriendService CreateFriendService() + { + return new FriendService( + new Mock().Object, + CharacterRelationDao, + TestHelpers.Instance.CharacterDao, + FriendRequestHolder, + ConnectedAccountHttpClient.Object, + ChannelHub.Object, + TestHelpers.Instance.LogLanguageLocalizer); + } + + [TestMethod] + public async Task AcceptingFriendRequestShouldCreateMutualRelation() + { + await new Spec("Accepting friend request should create mutual relation") + .Given(AFriendRequestExists) + .WhenAsync(AcceptingTheFriendRequest) + .Then(TwoFriendRelationsShouldBeCreated) + .ExecuteAsync(); + } - }); - _finsPacketHandler = new FinsPacketHandler(_friendHttpClient.Object, _channelHttpClient.Object, - _connectedAccountHttpClient.Object, new NosCore.GameObject.Services.BroadcastService.SessionRegistry()); + [TestMethod] + public async Task AddingFriendWhenTargetDisconnectedShouldFail() + { + await new Spec("Adding friend when target disconnected should fail") + .WhenAsync(AttemptingToAddFriend) + .Then(NoRelationShouldBeCreated) + .ExecuteAsync(); } [TestMethod] - public async Task Test_Add_FriendAsync() + public async Task AcceptingUnrequestedFriendShouldFail() + { + await new Spec("Accepting unrequested friend should fail") + .WhenAsync(AttemptingToAcceptNonExistentRequest) + .Then(NoRelationShouldBeCreated) + .ExecuteAsync(); + } + + private void AFriendRequestExists() + { + FriendRequestHolder.RegisterRequest(Guid.NewGuid(), + TargetSession.Character.CharacterId, Session.Character.CharacterId); + } + + private async Task AcceptingTheFriendRequest() { - _friendRequestHolder!.RegisterRequest(Guid.NewGuid(), - _targetSession!.Character.CharacterId, _session!.Character.CharacterId); var finsPacket = new FinsPacket { - CharacterId = _targetSession.Character.CharacterId, + CharacterId = TargetSession.Character.CharacterId, Type = FinsPacketType.Accepted }; + var friend = CreateFriendService(); + FriendHttpClient.Setup(s => s.AddFriendAsync(It.IsAny())) + .Returns(friend.AddFriendAsync(Session.Character.CharacterId, + finsPacket.CharacterId, finsPacket.Type)); + await FinsPacketHandler.ExecuteAsync(finsPacket, Session); + } - var friend = new FriendService(Logger, _characterRelationDao!, TestHelpers.Instance.CharacterDao, - _friendRequestHolder, _connectedAccountHttpClient.Object, _channelHub!.Object, TestHelpers.Instance.LogLanguageLocalizer); - _friendHttpClient.Setup(s => s.AddFriendAsync(It.IsAny())) - .Returns(friend.AddFriendAsync(_session.Character.CharacterId, finsPacket.CharacterId, finsPacket.Type)); - await _finsPacketHandler!.ExecuteAsync(finsPacket, _session); - Assert.IsTrue(_characterRelationDao!.LoadAll().Count() == 2); + private void TwoFriendRelationsShouldBeCreated() + { + Assert.AreEqual(2, CharacterRelationDao.LoadAll().Count()); } - [TestMethod] - public async Task Test_Add_Friend_When_DisconnectedAsync() + private async Task AttemptingToAddFriend() { var finsPacket = new FinsPacket { - CharacterId = _targetSession!.Character.CharacterId, + CharacterId = TargetSession.Character.CharacterId, Type = FinsPacketType.Accepted }; - var friend = new FriendService(Logger, _characterRelationDao!, TestHelpers.Instance.CharacterDao, - _friendRequestHolder!, _connectedAccountHttpClient.Object, _channelHub!.Object, TestHelpers.Instance.LogLanguageLocalizer); - _friendHttpClient.Setup(s => s.AddFriendAsync(It.IsAny())) - .Returns(friend.AddFriendAsync(_session!.Character.CharacterId, finsPacket.CharacterId, finsPacket.Type)); - await _finsPacketHandler!.ExecuteAsync(finsPacket, _session); + var friend = CreateFriendService(); + FriendHttpClient.Setup(s => s.AddFriendAsync(It.IsAny())) + .Returns(friend.AddFriendAsync(Session.Character.CharacterId, + finsPacket.CharacterId, finsPacket.Type)); + await FinsPacketHandler.ExecuteAsync(finsPacket, Session); + } - Assert.IsFalse(_characterRelationDao!.LoadAll().Any()); + private void NoRelationShouldBeCreated() + { + Assert.IsFalse(CharacterRelationDao.LoadAll().Any()); } - [TestMethod] - public async Task Test_Add_Not_Requested_FriendAsync() + private async Task AttemptingToAcceptNonExistentRequest() { var finsPacket = new FinsPacket { - CharacterId = _targetSession!.Character.CharacterId, + CharacterId = TargetSession.Character.CharacterId, Type = FinsPacketType.Accepted }; - var friend = new FriendService(Logger, _characterRelationDao!, TestHelpers.Instance.CharacterDao, - _friendRequestHolder!, _connectedAccountHttpClient.Object, _channelHub!.Object, TestHelpers.Instance.LogLanguageLocalizer); - _friendHttpClient.Setup(s => s.AddFriendAsync(It.IsAny())) - .Returns(friend.AddFriendAsync(_session!.Character.CharacterId, finsPacket.CharacterId, finsPacket.Type)); - - await _finsPacketHandler!.ExecuteAsync(finsPacket, _session); - Assert.IsFalse(_characterRelationDao!.LoadAll().Any()); + var friend = CreateFriendService(); + FriendHttpClient.Setup(s => s.AddFriendAsync(It.IsAny())) + .Returns(friend.AddFriendAsync(Session.Character.CharacterId, + finsPacket.CharacterId, finsPacket.Type)); + await FinsPacketHandler.ExecuteAsync(finsPacket, Session); } } -} \ No newline at end of file +} diff --git a/test/NosCore.PacketHandlers.Tests/Friend/FlPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Friend/FlPacketHandlerTests.cs index ba40623ef..8865630d3 100644 --- a/test/NosCore.PacketHandlers.Tests/Friend/FlPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Friend/FlPacketHandlerTests.cs @@ -2,18 +2,18 @@ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . @@ -35,6 +35,7 @@ using NosCore.Shared.Enumerations; using NosCore.Tests.Shared; using Serilog; +using SpecLight; using Character = NosCore.Data.WebApi.Character; namespace NosCore.PacketHandlers.Tests.Friend @@ -43,14 +44,14 @@ namespace NosCore.PacketHandlers.Tests.Friend public class FlPacketHandlerTests { private static readonly ILogger Logger = new Mock().Object; - private IDao? _characterRelationDao; - private FlCommandPacketHandler? _flPacketHandler; - private ClientSession? _session; + private IDao CharacterRelationDao = null!; + private FlCommandPacketHandler FlPacketHandler = null!; + private ClientSession Session = null!; [TestInitialize] public async Task SetupAsync() { - _characterRelationDao = TestHelpers.Instance.CharacterRelationDao; + CharacterRelationDao = TestHelpers.Instance.CharacterRelationDao; await TestHelpers.ResetAsync(); Broadcaster.Reset(); TestHelpers.Instance.ChannelHub.Setup(s => s.GetCommunicationChannels()) @@ -60,48 +61,60 @@ public async Task SetupAsync() Type = ServerType.WorldServer, Id = 1 } - }); - _session = await TestHelpers.Instance.GenerateSessionAsync(); - _flPacketHandler = new FlCommandPacketHandler(new NosCore.GameObject.Services.BroadcastService.SessionRegistry()); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + FlPacketHandler = new FlCommandPacketHandler(new NosCore.GameObject.Services.BroadcastService.SessionRegistry(Logger)); } [TestMethod] - public async Task Test_Add_Distant_FriendAsync() + public async Task AddingDistantFriendShouldCreateRelation() + { + await new Spec("Adding distant friend should create relation") + .GivenAsync(TargetPlayerIsOnlineAndFriendRequestExists) + .WhenAsync(AddingFriendByName) + .ThenAsync(FriendRelationShouldExist) + .ExecuteAsync(); + } + + private ClientSession? TargetSession; + + private async Task TargetPlayerIsOnlineAndFriendRequestExists() { - var targetSession = await TestHelpers.Instance.GenerateSessionAsync(); + TargetSession = await TestHelpers.Instance.GenerateSessionAsync(); var friendRequestHolder = new FriendRequestRegistry(); friendRequestHolder.RegisterRequest(Guid.NewGuid(), - targetSession.Character.CharacterId, _session!.Character.CharacterId); - var flPacket = new FlCommandPacket - { - CharacterName = targetSession.Character.Name - }; + TargetSession.Character.CharacterId, Session.Character.CharacterId); TestHelpers.Instance.PubSubHub.Setup(s => s.GetSubscribersAsync()) .ReturnsAsync(new List(){ new Subscriber { - ChannelId = 1, ConnectedCharacter = new Character { Id = targetSession.Character.CharacterId } + ChannelId = 1, ConnectedCharacter = new Character { Id = TargetSession.Character.CharacterId } }, new Subscriber { - ChannelId = 1, ConnectedCharacter = new Character { Id = _session!.Character.CharacterId } + ChannelId = 1, ConnectedCharacter = new Character { Id = Session.Character.CharacterId } } - }); - var friend = new FriendService(Logger, _characterRelationDao!, TestHelpers.Instance.CharacterDao, + var friend = new FriendService(Logger, CharacterRelationDao, TestHelpers.Instance.CharacterDao, friendRequestHolder, TestHelpers.Instance.PubSubHub.Object, TestHelpers.Instance.ChannelHub.Object, TestHelpers.Instance.LogLanguageLocalizer); TestHelpers.Instance.FriendHttpClient.Setup(s => s.AddFriendAsync(It.IsAny())) - .Returns(friend.AddFriendAsync(_session.Character.CharacterId, - targetSession.Character.VisualId, - FinsPacketType.Accepted - )); + .Returns(friend.AddFriendAsync(Session.Character.CharacterId, + TargetSession.Character.VisualId, + FinsPacketType.Accepted)); + } - await _flPacketHandler!.ExecuteAsync(flPacket, _session); - Assert.IsTrue(await _characterRelationDao!.FirstOrDefaultAsync(s => - (s.CharacterId == _session.Character.CharacterId) && - (s.RelatedCharacterId == targetSession.Character.CharacterId) - && (s.RelationType == CharacterRelationType.Friend)) != null); + private async Task AddingFriendByName() + { + await FlPacketHandler.ExecuteAsync(new FlCommandPacket { CharacterName = TargetSession!.Character.Name }, Session); + } + + private async Task FriendRelationShouldExist() + { + var result = await CharacterRelationDao.FirstOrDefaultAsync(s => + s.CharacterId == Session.Character.CharacterId && + s.RelatedCharacterId == TargetSession!.Character.CharacterId && + s.RelationType == CharacterRelationType.Friend); + Assert.IsNotNull(result); } } -} \ No newline at end of file +} diff --git a/test/NosCore.PacketHandlers.Tests/Friend/fDelPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Friend/fDelPacketHandlerTests.cs index b32093ea0..8948d3753 100644 --- a/test/NosCore.PacketHandlers.Tests/Friend/fDelPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Friend/fDelPacketHandlerTests.cs @@ -2,18 +2,18 @@ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . @@ -40,6 +40,7 @@ using NosCore.Packets.ServerPackets.UI; using NosCore.Tests.Shared; using Serilog; +using SpecLight; using Character = NosCore.Data.WebApi.Character; namespace NosCore.PacketHandlers.Tests.Friend @@ -48,148 +49,172 @@ namespace NosCore.PacketHandlers.Tests.Friend public class FDelPacketHandlerTests { private static readonly ILogger Logger = new Mock().Object; - private Mock? _channelHttpClient; - private Mock>? _characterDao; - private IDao? _characterRelationDao; - private Mock? _connectedAccountHttpClient; - private Mock? _channelHub; - private FdelPacketHandler? _fDelPacketHandler; - private FriendService? _friendController; - private Mock? _friendHttpClient; - private ClientSession? _session; + private Mock ChannelHttpClient = null!; + private Mock> CharacterDao = null!; + private IDao CharacterRelationDao = null!; + private Mock ConnectedAccountHttpClient = null!; + private Mock ChannelHub = null!; + private FdelPacketHandler FDelPacketHandler = null!; + private FriendService FriendController = null!; + private Mock FriendHttpClient = null!; + private ClientSession Session = null!; [TestInitialize] public async Task SetupAsync() { - _characterRelationDao = TestHelpers.Instance.CharacterRelationDao; + CharacterRelationDao = TestHelpers.Instance.CharacterRelationDao; Broadcaster.Reset(); await TestHelpers.ResetAsync(); - _session = await TestHelpers.Instance.GenerateSessionAsync(); - _channelHttpClient = TestHelpers.Instance.ChannelHttpClient; - _connectedAccountHttpClient = TestHelpers.Instance.PubSubHub; - _channelHub = new Mock(); - _connectedAccountHttpClient.Setup(s => s.GetSubscribersAsync()) + Session = await TestHelpers.Instance.GenerateSessionAsync(); + ChannelHttpClient = TestHelpers.Instance.ChannelHttpClient; + ConnectedAccountHttpClient = TestHelpers.Instance.PubSubHub; + ChannelHub = new Mock(); + ConnectedAccountHttpClient.Setup(s => s.GetSubscribersAsync()) .ReturnsAsync(new List(){ new Subscriber { - ChannelId = 1, ConnectedCharacter = new Character { Id = _session.Character.CharacterId } + ChannelId = 1, ConnectedCharacter = new Character { Id = Session.Character.CharacterId } } - }); - _friendHttpClient = TestHelpers.Instance.FriendHttpClient; - _fDelPacketHandler = new FdelPacketHandler(_friendHttpClient.Object, _channelHttpClient.Object, - TestHelpers.Instance.PubSubHub.Object, TestHelpers.Instance.GameLanguageLocalizer, new NosCore.GameObject.Services.BroadcastService.SessionRegistry()); - _characterDao = new Mock>(); - _friendController = new FriendService(Logger, _characterRelationDao, _characterDao.Object, - new FriendRequestRegistry(), _connectedAccountHttpClient.Object, _channelHub.Object, TestHelpers.Instance.LogLanguageLocalizer); - _friendHttpClient.Setup(s => s.GetFriendsAsync(It.IsAny())) - .Returns((long id) => _friendController.GetFriendsAsync(id)); - _friendHttpClient.Setup(s => s.DeleteAsync(It.IsAny())) - .Callback((Guid id) => Task.FromResult(_friendController.DeleteAsync(id))); + FriendHttpClient = TestHelpers.Instance.FriendHttpClient; + FDelPacketHandler = new FdelPacketHandler(FriendHttpClient.Object, ChannelHttpClient.Object, + TestHelpers.Instance.PubSubHub.Object, TestHelpers.Instance.GameLanguageLocalizer, new NosCore.GameObject.Services.BroadcastService.SessionRegistry(Logger)); + CharacterDao = new Mock>(); + FriendController = new FriendService(Logger, CharacterRelationDao, CharacterDao.Object, + new FriendRequestRegistry(), ConnectedAccountHttpClient.Object, ChannelHub.Object, TestHelpers.Instance.LogLanguageLocalizer); + FriendHttpClient.Setup(s => s.GetFriendsAsync(It.IsAny())) + .Returns((long id) => FriendController.GetFriendsAsync(id)); + FriendHttpClient.Setup(s => s.DeleteAsync(It.IsAny())) + .Callback((Guid id) => Task.FromResult(FriendController.DeleteAsync(id))); + } + + [TestMethod] + public async Task DeletingFriendWhenDisconnectedShouldSucceed() + { + await new Spec("Deleting friend when disconnected should succeed") + .GivenAsync(TargetIsDisconnectedWithFriendRelation) + .WhenAsync(DeletingFriend) + .Then(NoRelationsShouldExist) + .ExecuteAsync(); + } + + [TestMethod] + public async Task DeletingFriendShouldSucceed() + { + await new Spec("Deleting friend should succeed") + .GivenAsync(TargetIsOnlineWithFriendRelation) + .WhenAsync(DeletingTargetFriend) + .Then(NoRelationsShouldExist) + .ExecuteAsync(); } [TestMethod] - public async Task Test_Delete_Friend_When_DisconnectedAsync() + public async Task DeletingNonFriendShouldShowError() + { + await new Spec("Deleting non friend should show error") + .GivenAsync(TargetIsOnline) + .WhenAsync(DeletingTargetFriend) + .Then(ShouldReceiveNotInFriendlistMessage) + .ExecuteAsync(); + } + + private ClientSession? TargetSession; + private long TargetCharacterId = 2; + + private async Task TargetIsDisconnectedWithFriendRelation() { var guid = Guid.NewGuid(); var targetGuid = Guid.NewGuid(); var list = new List { - _session!.Character, - new() {CharacterId = 2, Name = "test"} + Session.Character, + new() { CharacterId = 2, Name = "test" } }; - _characterDao!.Setup(s => s.FirstOrDefaultAsync(It.IsAny>>())) + CharacterDao.Setup(s => s.FirstOrDefaultAsync(It.IsAny>>())) .Returns((Expression> exp) => Task.FromResult(list.FirstOrDefault(exp.Compile()))!); - await _characterRelationDao!.TryInsertOrUpdateAsync(new[] - { - new CharacterRelationDto - { - CharacterId = 2, - CharacterRelationId = guid, - RelatedCharacterId = _session.Character.CharacterId, - RelationType = CharacterRelationType.Friend - }, - new CharacterRelationDto - { - RelatedCharacterId = 2, - CharacterRelationId = targetGuid, - CharacterId = _session.Character.CharacterId, - RelationType = CharacterRelationType.Friend - } - }); - var fdelPacket = new FdelPacket + await CharacterRelationDao.TryInsertOrUpdateAsync(new[] { - CharacterId = 2 - }; - - await _fDelPacketHandler!.ExecuteAsync(fdelPacket, _session); - - Assert.IsTrue(!(_characterRelationDao!.LoadAll()).Any()); + new CharacterRelationDto + { + CharacterId = 2, + CharacterRelationId = guid, + RelatedCharacterId = Session.Character.CharacterId, + RelationType = CharacterRelationType.Friend + }, + new CharacterRelationDto + { + RelatedCharacterId = 2, + CharacterRelationId = targetGuid, + CharacterId = Session.Character.CharacterId, + RelationType = CharacterRelationType.Friend + } + }); } - [TestMethod] - public async Task Test_Delete_FriendAsync() + private async Task TargetIsOnlineWithFriendRelation() { - var targetSession = await TestHelpers.Instance.GenerateSessionAsync(); + TargetSession = await TestHelpers.Instance.GenerateSessionAsync(); + TargetCharacterId = TargetSession.Character.CharacterId; var guid = Guid.NewGuid(); var targetGuid = Guid.NewGuid(); var list = new List { - _session!.Character, - targetSession.Character + Session.Character, + TargetSession.Character }; - _characterDao!.Setup(s => s.FirstOrDefaultAsync(It.IsAny>>()))! + CharacterDao.Setup(s => s.FirstOrDefaultAsync(It.IsAny>>()))! .ReturnsAsync((Expression> exp) => list.FirstOrDefault(exp.Compile())); - await _characterRelationDao!.TryInsertOrUpdateAsync(new[] + await CharacterRelationDao.TryInsertOrUpdateAsync(new[] { new CharacterRelationDto { - CharacterId = targetSession.Character.CharacterId, + CharacterId = TargetSession.Character.CharacterId, CharacterRelationId = guid, - RelatedCharacterId = _session.Character.CharacterId, + RelatedCharacterId = Session.Character.CharacterId, RelationType = CharacterRelationType.Friend }, new CharacterRelationDto { - RelatedCharacterId = targetSession.Character.CharacterId, + RelatedCharacterId = TargetSession.Character.CharacterId, CharacterRelationId = targetGuid, - CharacterId = _session.Character.CharacterId, + CharacterId = Session.Character.CharacterId, RelationType = CharacterRelationType.Friend } }); - var fdelPacket = new FdelPacket - { - CharacterId = targetSession.Character.CharacterId - }; - - await _fDelPacketHandler!.ExecuteAsync(fdelPacket, _session); - - Assert.IsTrue(!_characterRelationDao.LoadAll().Any()); } - [TestMethod] - public async Task Test_Delete_Friend_No_FriendAsync() + private async Task TargetIsOnline() { - var targetSession = await TestHelpers.Instance.GenerateSessionAsync(); - var guid = Guid.NewGuid(); - var targetGuid = Guid.NewGuid(); + TargetSession = await TestHelpers.Instance.GenerateSessionAsync(); + TargetCharacterId = TargetSession.Character.CharacterId; var list = new List { - _session!.Character, - targetSession.Character + Session.Character, + TargetSession.Character }; - _characterDao!.Setup(s => s.FirstOrDefaultAsync(It.IsAny>>())) + CharacterDao.Setup(s => s.FirstOrDefaultAsync(It.IsAny>>())) .Returns((Expression> exp) => Task.FromResult(list.FirstOrDefault(exp.Compile()))!); + } - var fdelPacket = new FdelPacket - { - CharacterId = targetSession.Character.CharacterId - }; + private async Task DeletingFriend() + { + await FDelPacketHandler.ExecuteAsync(new FdelPacket { CharacterId = 2 }, Session); + } + + private async Task DeletingTargetFriend() + { + await FDelPacketHandler.ExecuteAsync(new FdelPacket { CharacterId = TargetCharacterId }, Session); + } + + private void NoRelationsShouldExist() + { + Assert.IsFalse(CharacterRelationDao.LoadAll().Any()); + } - await _fDelPacketHandler!.ExecuteAsync(fdelPacket, _session); - var lastpacket = (InfoPacket?)_session.LastPackets.FirstOrDefault(s => s is InfoPacket); - Assert.AreEqual(TestHelpers.Instance.GameLanguageLocalizer[LanguageKey.NOT_IN_FRIENDLIST, - _session.Account.Language], lastpacket?.Message); + private void ShouldReceiveNotInFriendlistMessage() + { + var lastpacket = (InfoPacket?)Session.LastPackets.FirstOrDefault(s => s is InfoPacket); + Assert.AreEqual(TestHelpers.Instance.GameLanguageLocalizer[LanguageKey.NOT_IN_FRIENDLIST, Session.Account.Language], lastpacket?.Message); } } -} \ No newline at end of file +} diff --git a/test/NosCore.PacketHandlers.Tests/Game/GameStartPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Game/GameStartPacketHandlerTests.cs new file mode 100644 index 000000000..9745e14b6 --- /dev/null +++ b/test/NosCore.PacketHandlers.Tests/Game/GameStartPacketHandlerTests.cs @@ -0,0 +1,211 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.Data.WebApi; +using NosCore.GameObject.ComponentEntities.Interfaces; +using NosCore.GameObject.InterChannelCommunication.Hubs.BlacklistHub; +using NosCore.GameObject.InterChannelCommunication.Hubs.ChannelHub; +using NosCore.GameObject.InterChannelCommunication.Hubs.FriendHub; +using NosCore.GameObject.InterChannelCommunication.Hubs.MailHub; +using NosCore.GameObject.InterChannelCommunication.Hubs.PubSub; +using NosCore.GameObject.InterChannelCommunication.Messages; +using NosCore.GameObject.Networking; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.GameObject.Services.MapChangeService; +using NosCore.GameObject.Services.QuestService; +using NosCore.GameObject.Services.SkillService; +using NosCore.PacketHandlers.Game; +using NosCore.Packets.ClientPackets.CharacterSelectionScreen; +using NosCore.Packets.Interfaces; +using NosCore.Tests.Shared; +using SpecLight; + +namespace NosCore.PacketHandlers.Tests.Game +{ + [TestClass] + public class GameStartPacketHandlerTests + { + private GameStartPacketHandler Handler = null!; + private ClientSession Session = null!; + private Mock MapChangeService = null!; + private Mock SkillService = null!; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Broadcaster.Reset(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + + var friendHub = new Mock(); + var channelHub = new Mock(); + var pubSubHub = new Mock(); + var blacklistHub = new Mock(); + var mailHub = new Mock(); + var questService = new Mock(); + MapChangeService = new Mock(); + SkillService = new Mock(); + var serializer = new Mock(); + + friendHub.Setup(s => s.GetFriendsAsync(It.IsAny())) + .ReturnsAsync(new List()); + blacklistHub.Setup(s => s.GetBlacklistedAsync(It.IsAny())) + .ReturnsAsync(new List()); + mailHub.Setup(s => s.GetMails(It.IsAny(), It.IsAny(), It.IsAny())) + .ReturnsAsync(new List()); + + Handler = new GameStartPacketHandler( + TestHelpers.Instance.WorldConfiguration, + friendHub.Object, + channelHub.Object, + pubSubHub.Object, + blacklistHub.Object, + serializer.Object, + mailHub.Object, + questService.Object, + MapChangeService.Object, + SkillService.Object); + } + + [TestMethod] + public async Task GameStartWhenAlreadyStartedShouldDoNothing() + { + await new Spec("Game start when already started should do nothing") + .Given(GameAlreadyStarted) + .WhenAsync(ExecutingGameStart) + .Then(MapChangeShouldNotBeCalled) + .ExecuteAsync(); + } + + [TestMethod] + public async Task GameStartWithoutSelectedCharacterShouldDoNothing() + { + await new Spec("Game start without selected character should do nothing") + .Given(NoCharacterSelected) + .WhenAsync(ExecutingGameStart) + .Then(GameStartedShouldBeFalse) + .ExecuteAsync(); + } + + [TestMethod] + public async Task GameStartWithValidCharacterShouldSetGameStartedFlag() + { + await new Spec("Game start with valid character should set game started flag") + .Given(CharacterIsReadyToStart) + .WhenAsync(ExecutingGameStart) + .Then(GameStartedShouldBeTrue) + .ExecuteAsync(); + } + + [TestMethod] + public async Task GameStartWithPositiveHpShouldCallMapChange() + { + await new Spec("Game start with positive HP should call map change") + .Given(CharacterIsReadyToStart) + .And(CharacterHasPositiveHp) + .WhenAsync(ExecutingGameStart) + .Then(MapChangeShouldBeCalled) + .ExecuteAsync(); + } + + [TestMethod] + public async Task GameStartShouldLoadSkills() + { + await new Spec("Game start should load skills") + .Given(CharacterIsReadyToStart) + .WhenAsync(ExecutingGameStart) + .Then(SkillServiceShouldBeCalled) + .ExecuteAsync(); + } + + [TestMethod] + public async Task GameStartWithZeroHpShouldNotCallMapChange() + { + await new Spec("Game start with zero HP should not call map change") + .Given(CharacterIsReadyToStart) + .And(CharacterHasZeroHp) + .WhenAsync(ExecutingGameStart) + .Then(MapChangeShouldNotBeCalled) + .ExecuteAsync(); + } + + private void GameAlreadyStarted() + { + Session.GameStarted = true; + } + + private void NoCharacterSelected() + { + Session.GameStarted = false; + Session.HasSelectedCharacter = false; + } + + private void CharacterIsReadyToStart() + { + Session.GameStarted = false; + Session.Character.Quests = new ConcurrentDictionary(); + } + + private void CharacterHasPositiveHp() + { + Session.Character.Hp = 100; + } + + private void CharacterHasZeroHp() + { + Session.Character.Hp = 0; + } + + private async Task ExecutingGameStart() + { + await Handler.ExecuteAsync(new GameStartPacket(), Session); + } + + private void GameStartedShouldBeFalse() + { + Assert.IsFalse(Session.GameStarted); + } + + private void GameStartedShouldBeTrue() + { + Assert.IsTrue(Session.GameStarted); + } + + private void MapChangeShouldNotBeCalled() + { + MapChangeService.Verify(x => x.ChangeMapAsync(It.IsAny()), Times.Never); + } + + private void MapChangeShouldBeCalled() + { + MapChangeService.Verify(x => x.ChangeMapAsync(It.IsAny()), Times.Once); + } + + private void SkillServiceShouldBeCalled() + { + SkillService.Verify(x => x.LoadSkill(It.IsAny()), Times.Once); + } + } +} diff --git a/test/NosCore.PacketHandlers.Tests/Game/GuriPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Game/GuriPacketHandlerTests.cs new file mode 100644 index 000000000..756c5af88 --- /dev/null +++ b/test/NosCore.PacketHandlers.Tests/Game/GuriPacketHandlerTests.cs @@ -0,0 +1,114 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.GameObject.Networking; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.GameObject.Services.GuriRunnerService; +using NosCore.PacketHandlers.Game; +using NosCore.Packets.ClientPackets.UI; +using NosCore.Packets.Enumerations; +using NosCore.Tests.Shared; +using SpecLight; + +namespace NosCore.PacketHandlers.Tests.Game +{ + [TestClass] + public class GuriPacketHandlerTests + { + private GuriPacketHandler Handler = null!; + private ClientSession Session = null!; + private Mock GuriRunnerService = null!; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Broadcaster.Reset(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + + GuriRunnerService = new Mock(); + Handler = new GuriPacketHandler(GuriRunnerService.Object); + } + + [TestMethod] + public void HandlerCanBeConstructed() + { + new Spec("Handler can be constructed") + .Then(HandlerShouldNotBeNull) + .Execute(); + } + + [TestMethod] + public async Task GuriPacketShouldCallGuriRunnerService() + { + await new Spec("Guri packet should call guri runner service") + .Given(CharacterIsOnMap) + .WhenAsync(ExecutingGuriPacket) + .Then(GuriRunnerServiceShouldBeCalled) + .ExecuteAsync(); + } + + [TestMethod] + public async Task GuriPacketWithTypeShouldPassCorrectData() + { + await new Spec("Guri packet with type should pass correct data") + .Given(CharacterIsOnMap) + .WhenAsync(ExecutingGuriPacketWithType) + .Then(GuriRunnerServiceShouldBeCalledWithCorrectType) + .ExecuteAsync(); + } + + private void CharacterIsOnMap() + { + Session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(0)!; + } + + private async Task ExecutingGuriPacket() + { + await Handler.ExecuteAsync(new GuriPacket(), Session); + } + + private async Task ExecutingGuriPacketWithType() + { + await Handler.ExecuteAsync(new GuriPacket { Type = GuriPacketType.Title }, Session); + } + + private void HandlerShouldNotBeNull() + { + Assert.IsNotNull(Handler); + } + + private void GuriRunnerServiceShouldBeCalled() + { + GuriRunnerService.Verify(x => x.GuriLaunch( + It.IsAny(), + It.IsAny()), Times.Once); + } + + private void GuriRunnerServiceShouldBeCalledWithCorrectType() + { + GuriRunnerService.Verify(x => x.GuriLaunch( + It.IsAny(), + It.Is(p => p.Type == GuriPacketType.Title)), Times.Once); + } + } +} diff --git a/test/NosCore.PacketHandlers.Tests/Game/NcifPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Game/NcifPacketHandlerTests.cs new file mode 100644 index 000000000..7d6f8424e --- /dev/null +++ b/test/NosCore.PacketHandlers.Tests/Game/NcifPacketHandlerTests.cs @@ -0,0 +1,143 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Linq; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.GameObject.Networking; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.GameObject.Services.BroadcastService; +using NosCore.PacketHandlers.Game; +using NosCore.Packets.ClientPackets.Battle; +using NosCore.Packets.ServerPackets.Entities; +using NosCore.Shared.Enumerations; +using NosCore.Tests.Shared; +using Serilog; +using SpecLight; + +namespace NosCore.PacketHandlers.Tests.Game +{ + [TestClass] + public class NcifPacketHandlerTests + { + private NcifPacketHandler Handler = null!; + private ClientSession Session = null!; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Broadcaster.Reset(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + + var logger = new Mock().Object; + Handler = new NcifPacketHandler( + logger, + TestHelpers.Instance.LogLanguageLocalizer, + TestHelpers.Instance.SessionRegistry); + } + + [TestMethod] + public async Task NcifForPlayerShouldReturnStatInfo() + { + await new Spec("Ncif for player should return stat info") + .Given(CharacterIsOnMap) + .WhenAsync(RequestingPlayerStatInfo) + .Then(StInfoPacketShouldBeSent) + .ExecuteAsync(); + } + + [TestMethod] + public async Task NcifForUnknownTypeShouldNotSendPacket() + { + await new Spec("Ncif for unknown type should not send packet") + .Given(CharacterIsOnMap) + .WhenAsync(RequestingUnknownTypeStatInfo) + .Then(NoStInfoPacketShouldBeSent) + .ExecuteAsync(); + } + + [TestMethod] + public async Task NcifForNonExistentEntityShouldNotSendPacket() + { + await new Spec("Ncif for non existent entity should not send packet") + .Given(CharacterIsOnMap) + .WhenAsync(RequestingNonExistentEntityStatInfo) + .Then(NoStInfoPacketShouldBeSent) + .ExecuteAsync(); + } + + private void CharacterIsOnMap() + { + Session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(0)!; + TestHelpers.Instance.SessionRegistry.Register(new SessionInfo + { + ChannelId = Session.Channel!.Id, + SessionId = Session.SessionId, + Sender = Session, + AccountName = Session.Account.Name, + Disconnect = () => Task.CompletedTask, + CharacterId = Session.Character.CharacterId, + MapInstanceId = Session.Character.MapInstance.MapInstanceId, + Character = Session.Character + }); + } + + private async Task RequestingPlayerStatInfo() + { + Session.LastPackets.Clear(); + await Handler.ExecuteAsync(new NcifPacket + { + Type = VisualType.Player, + TargetId = Session.Character.VisualId + }, Session); + } + + private async Task RequestingUnknownTypeStatInfo() + { + Session.LastPackets.Clear(); + await Handler.ExecuteAsync(new NcifPacket + { + Type = (VisualType)99, + TargetId = 1 + }, Session); + } + + private async Task RequestingNonExistentEntityStatInfo() + { + Session.LastPackets.Clear(); + await Handler.ExecuteAsync(new NcifPacket + { + Type = VisualType.Player, + TargetId = 99999 + }, Session); + } + + private void StInfoPacketShouldBeSent() + { + Assert.IsTrue(Session.LastPackets.Any(p => p is StPacket)); + } + + private void NoStInfoPacketShouldBeSent() + { + Assert.IsFalse(Session.LastPackets.Any(p => p is StPacket)); + } + } +} diff --git a/test/NosCore.PacketHandlers.Tests/Game/PulsePacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Game/PulsePacketHandlerTests.cs index f0ca878d3..7bf6517a9 100644 --- a/test/NosCore.PacketHandlers.Tests/Game/PulsePacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Game/PulsePacketHandlerTests.cs @@ -2,18 +2,18 @@ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . @@ -24,28 +24,36 @@ using NosCore.PacketHandlers.Game; using NosCore.Packets.ClientPackets.Movement; using NosCore.Tests.Shared; +using SpecLight; namespace NosCore.PacketHandlers.Tests.Game { [TestClass] public class PulsePacketHandlerTests { - private PulsePacketHandler? _pulsePacketHandler; - - - private ClientSession? _session; + private PulsePacketHandler PulsePacketHandler = null!; + private ClientSession Session = null!; + private PulsePacket LastPulsePacket = null!; [TestInitialize] public async Task SetupAsync() { - _pulsePacketHandler = new PulsePacketHandler(); + PulsePacketHandler = new PulsePacketHandler(); Broadcaster.Reset(); await TestHelpers.ResetAsync(); - _session = await TestHelpers.Instance.GenerateSessionAsync(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); } [TestMethod] - public async Task Test_Pulse_PacketAsync() + public async Task PulsePacketShouldUpdateLastPulse() + { + await new Spec("Pulse packet should update last pulse") + .WhenAsync(SendingMultiplePulsePackets) + .Then(LastPulseShouldBeUpdated) + .ExecuteAsync(); + } + + private async Task SendingMultiplePulsePackets() { var pulsePacket = new PulsePacket { @@ -58,10 +66,15 @@ public async Task Test_Pulse_PacketAsync() { Tick = i }; - await _pulsePacketHandler!.ExecuteAsync(pulsePacket, _session!); + await PulsePacketHandler.ExecuteAsync(pulsePacket, Session); } - Assert.IsTrue(_session?.LastPulse == pulsePacket.Tick); + LastPulsePacket = pulsePacket; + } + + private void LastPulseShouldBeUpdated() + { + Assert.IsTrue(Session.LastPulse == LastPulsePacket.Tick); } } -} \ No newline at end of file +} diff --git a/test/NosCore.PacketHandlers.Tests/Game/QsetPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Game/QsetPacketHandlerTests.cs index a8a85a6d2..fb9fe7bc2 100644 --- a/test/NosCore.PacketHandlers.Tests/Game/QsetPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Game/QsetPacketHandlerTests.cs @@ -2,18 +2,18 @@ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . @@ -26,151 +26,176 @@ using NosCore.Packets.Enumerations; using NosCore.Packets.ServerPackets.Quicklist; using NosCore.Tests.Shared; +using SpecLight; namespace NosCore.PacketHandlers.Tests.Game { [TestClass] public class QsetPacketHandlerTests { - private QSetPacketHandler? _qsetPacketHandler; - private ClientSession? _session; + private QSetPacketHandler QsetPacketHandler = null!; + private ClientSession Session = null!; [TestInitialize] public async Task SetupAsync() { await TestHelpers.ResetAsync(); - _session = await TestHelpers.Instance.GenerateSessionAsync(); - _qsetPacketHandler = new QSetPacketHandler(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + QsetPacketHandler = new QSetPacketHandler(); } [TestMethod] - public async Task Test_Add_QuicklistAsync() + public async Task AddingToQuicklistShouldSucceed() { - await _qsetPacketHandler!.ExecuteAsync(new QsetPacket + await new Spec("Adding to quicklist should succeed") + .WhenAsync(AddingToQuicklist) + .Then(QuicklistEntryShouldBeCreated) + .And(AddPacketShouldBeSent) + .ExecuteAsync(); + } + + [TestMethod] + public async Task DeletingFromQuicklistShouldSucceed() + { + await new Spec("Deleting from quicklist should succeed") + .WhenAsync(DeletingFromQuicklist) + .Then(QuicklistShouldBeEmpty) + .And(ResetPacketShouldBeSent) + .ExecuteAsync(); + } + + [TestMethod] + public async Task MovingQuicklistEntryShouldSucceed() + { + await new Spec("Moving quicklist entry should succeed") + .GivenAsync(TwoQuicklistEntriesExist) + .WhenAsync(MovingQuicklistEntry) + .Then(BothQuicklistEntriesShouldExist) + .ExecuteAsync(); + } + + [TestMethod] + public async Task MovingToEmptySlotShouldSucceed() + { + await new Spec("Moving to empty slot should succeed") + .GivenAsync(OneQuicklistEntryExists) + .WhenAsync(MovingQuicklistEntry) + .Then(OneQuicklistEntryShouldExist) + .ExecuteAsync(); + } + + private async Task AddingToQuicklist() + { + await QsetPacketHandler.ExecuteAsync(new QsetPacket { Type = QSetType.Set, OriginQuickList = 1, OriginQuickListSlot = 2, FirstData = 3, SecondData = 4 - }, _session!); - var lastpacket = (QsetClientPacket?)_session!.LastPackets.FirstOrDefault(s => s is QsetClientPacket); - Assert.AreEqual(QSetType.Set, lastpacket?.Data?.Type); - Assert.AreEqual(1, lastpacket?.OriginQuickList ?? 0); - Assert.AreEqual(2, lastpacket?.OriginQuickListSlot ?? 0); - Assert.AreEqual(0, lastpacket?.Data?.Data ?? 0); - Assert.AreEqual(3, lastpacket?.Data?.OriginQuickList ?? 0); - Assert.AreEqual(4, lastpacket?.Data?.OriginQuickListSlot ?? 0); - Assert.AreEqual(1, _session.Character.QuicklistEntries.Count); + }, Session); } - [TestMethod] - public async Task Test_Delete_FromQuicklistAsync() + private async Task DeletingFromQuicklist() { - await _qsetPacketHandler!.ExecuteAsync(new QsetPacket + await QsetPacketHandler.ExecuteAsync(new QsetPacket { Type = QSetType.Remove, OriginQuickList = 1, OriginQuickListSlot = 2, FirstData = 3, SecondData = 4 - }, _session!); - var lastpacket = (QsetClientPacket?)_session!.LastPackets.FirstOrDefault(s => s is QsetClientPacket); - Assert.AreEqual(QSetType.Reset, lastpacket?.Data?.Type ?? 0); - Assert.AreEqual(1, lastpacket?.OriginQuickList ?? 0); - Assert.AreEqual(2, lastpacket?.OriginQuickListSlot ?? 0); - Assert.AreEqual(0, lastpacket?.Data?.Data ?? 0); - Assert.AreEqual(7, lastpacket?.Data?.OriginQuickList ?? 0); - Assert.AreEqual(-1, lastpacket?.Data?.OriginQuickListSlot ?? 0); - Assert.AreEqual(0, _session.Character.QuicklistEntries.Count); + }, Session); } - [TestMethod] - public async Task Test_Move_QuicklistAsync() + private async Task TwoQuicklistEntriesExist() { - await _qsetPacketHandler!.ExecuteAsync(new QsetPacket + await QsetPacketHandler.ExecuteAsync(new QsetPacket { Type = QSetType.Set, OriginQuickList = 1, OriginQuickListSlot = 2, FirstData = 3, SecondData = 4 - }, _session!); + }, Session); - await _qsetPacketHandler.ExecuteAsync(new QsetPacket + await QsetPacketHandler.ExecuteAsync(new QsetPacket { Type = QSetType.Set, OriginQuickList = 1, OriginQuickListSlot = 3, FirstData = 4, SecondData = 5 - }, _session!); - - _session!.LastPackets.Clear(); - await _qsetPacketHandler.ExecuteAsync(new QsetPacket - { - Type = QSetType.Move, - OriginQuickList = 1, - OriginQuickListSlot = 3, - FirstData = 1, - SecondData = 2 - }, _session); - var firstpacket = (QsetClientPacket?)_session.LastPackets.FirstOrDefault(s => s is QsetClientPacket); - var lastpacket = (QsetClientPacket?)_session.LastPackets.Skip(1).FirstOrDefault(s => s is QsetClientPacket); - Assert.AreEqual(QSetType.Set, lastpacket?.Data?.Type); - Assert.AreEqual(1, lastpacket?.OriginQuickList ?? 0); - Assert.AreEqual(2, lastpacket?.OriginQuickListSlot ?? 0); - Assert.AreEqual(0, (int?)lastpacket?.Data?.Data ?? 0); - Assert.AreEqual(4, lastpacket?.Data?.OriginQuickList ?? 0); - Assert.AreEqual(5, lastpacket?.Data?.OriginQuickListSlot ?? 0); - - Assert.AreEqual(1, firstpacket?.OriginQuickList ?? 0); - Assert.AreEqual(3, firstpacket?.OriginQuickListSlot ?? 0); - Assert.AreEqual(0, (int?)firstpacket?.Data?.Data ?? 0); - Assert.AreEqual(3, firstpacket?.Data?.OriginQuickList ?? 0); - Assert.AreEqual(4, firstpacket?.Data?.OriginQuickListSlot ?? 0); + }, Session); - Assert.AreEqual(2, _session.Character.QuicklistEntries.Count); + Session.LastPackets.Clear(); } - [TestMethod] - public async Task Test_Move_ToEmptyAsync() + private async Task OneQuicklistEntryExists() { - await _qsetPacketHandler!.ExecuteAsync(new QsetPacket + await QsetPacketHandler.ExecuteAsync(new QsetPacket { Type = QSetType.Set, OriginQuickList = 1, OriginQuickListSlot = 2, FirstData = 3, SecondData = 4 - }, _session!); - _session!.LastPackets.Clear(); - await _qsetPacketHandler.ExecuteAsync(new QsetPacket + }, Session); + Session.LastPackets.Clear(); + } + + private async Task MovingQuicklistEntry() + { + await QsetPacketHandler.ExecuteAsync(new QsetPacket { Type = QSetType.Move, OriginQuickList = 1, OriginQuickListSlot = 3, FirstData = 1, SecondData = 2 - }, _session); + }, Session); + } - Assert.AreEqual(1, _session.Character.QuicklistEntries.Count); + private void QuicklistEntryShouldBeCreated() + { + Assert.AreEqual(1, Session.Character.QuicklistEntries.Count); + } - var firstPacket = (QsetClientPacket?)_session.LastPackets.FirstOrDefault(s => s is QsetClientPacket); - var lastpacket = (QsetClientPacket?)_session.LastPackets.Skip(1).FirstOrDefault(s => s is QsetClientPacket); + private void AddPacketShouldBeSent() + { + var lastpacket = (QsetClientPacket?)Session.LastPackets.FirstOrDefault(s => s is QsetClientPacket); + Assert.AreEqual(QSetType.Set, lastpacket?.Data?.Type); + Assert.AreEqual(1, lastpacket?.OriginQuickList ?? 0); + Assert.AreEqual(2, lastpacket?.OriginQuickListSlot ?? 0); + Assert.AreEqual(0, lastpacket?.Data?.Data ?? 0); + Assert.AreEqual(3, lastpacket?.Data?.OriginQuickList ?? 0); + Assert.AreEqual(4, lastpacket?.Data?.OriginQuickListSlot ?? 0); + } - Assert.AreEqual(QSetType.Set, firstPacket?.Data?.Type ?? 0); - Assert.AreEqual(1, firstPacket?.OriginQuickList ?? 0); - Assert.AreEqual(3, firstPacket?.OriginQuickListSlot ?? 0); - Assert.AreEqual(0, (int?)lastpacket?.Data?.Data ?? 0); - Assert.AreEqual(3, firstPacket?.Data?.OriginQuickList ?? 0); - Assert.AreEqual(4, firstPacket?.Data?.OriginQuickListSlot ?? 0); + private void QuicklistShouldBeEmpty() + { + Assert.AreEqual(0, Session.Character.QuicklistEntries.Count); + } + private void ResetPacketShouldBeSent() + { + var lastpacket = (QsetClientPacket?)Session.LastPackets.FirstOrDefault(s => s is QsetClientPacket); + Assert.AreEqual(QSetType.Reset, lastpacket?.Data?.Type ?? 0); Assert.AreEqual(1, lastpacket?.OriginQuickList ?? 0); Assert.AreEqual(2, lastpacket?.OriginQuickListSlot ?? 0); - Assert.AreEqual(0, (int?)lastpacket?.Data?.Data ?? 0); + Assert.AreEqual(0, lastpacket?.Data?.Data ?? 0); Assert.AreEqual(7, lastpacket?.Data?.OriginQuickList ?? 0); Assert.AreEqual(-1, lastpacket?.Data?.OriginQuickListSlot ?? 0); } + + private void BothQuicklistEntriesShouldExist() + { + Assert.AreEqual(2, Session.Character.QuicklistEntries.Count); + } + + private void OneQuicklistEntryShouldExist() + { + Assert.AreEqual(1, Session.Character.QuicklistEntries.Count); + } } -} \ No newline at end of file +} diff --git a/test/NosCore.PacketHandlers.Tests/Game/TitEqPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Game/TitEqPacketHandlerTests.cs new file mode 100644 index 000000000..beb4914c5 --- /dev/null +++ b/test/NosCore.PacketHandlers.Tests/Game/TitEqPacketHandlerTests.cs @@ -0,0 +1,202 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using NosCore.Data.Dto; +using NosCore.GameObject.Networking; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.PacketHandlers.Game; +using NosCore.Packets.ClientPackets.Player; +using NosCore.Packets.ServerPackets.UI; +using NosCore.Tests.Shared; +using SpecLight; + +namespace NosCore.PacketHandlers.Tests.Game +{ + [TestClass] + public class TitEqPacketHandlerTests + { + private TitEqPacketHandler Handler = null!; + private ClientSession Session = null!; + private const short TitleId = 1; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Broadcaster.Reset(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + Handler = new TitEqPacketHandler(); + } + + [TestMethod] + public async Task TitEqWithInvalidTitleShouldDoNothing() + { + await new Spec("TitEq with invalid title should do nothing") + .Given(CharacterIsOnMap) + .WhenAsync(ActivatingNonExistentTitle) + .Then(NoInfoPacketShouldBeSent) + .ExecuteAsync(); + } + + [TestMethod] + public async Task TitEqMode1ShouldToggleVisibility() + { + await new Spec("TitEq mode 1 should toggle visibility") + .Given(CharacterIsOnMap) + .And(CharacterHasTitle) + .WhenAsync(TogglingTitleVisibility) + .Then(TitleVisibilityShouldBeToggled) + .And(TitleChangedInfoShouldBeSent) + .ExecuteAsync(); + } + + [TestMethod] + public async Task TitEqMode0ShouldToggleActive() + { + await new Spec("TitEq mode 0 should toggle active") + .Given(CharacterIsOnMap) + .And(CharacterHasTitle) + .WhenAsync(TogglingTitleActive) + .Then(TitleActiveShouldBeToggled) + .And(TitleEffectChangedInfoShouldBeSent) + .ExecuteAsync(); + } + + [TestMethod] + public async Task TitEqVisibilityShouldResetOtherTitles() + { + await new Spec("TitEq visibility should reset other titles") + .Given(CharacterIsOnMap) + .And(CharacterHasMultipleTitles) + .WhenAsync(TogglingTitleVisibility) + .Then(OnlySelectedTitleShouldBeVisible) + .ExecuteAsync(); + } + + [TestMethod] + public async Task TitEqActiveShouldResetOtherTitles() + { + await new Spec("TitEq active should reset other titles") + .Given(CharacterIsOnMap) + .And(CharacterHasMultipleTitles) + .WhenAsync(TogglingTitleActive) + .Then(OnlySelectedTitleShouldBeActive) + .ExecuteAsync(); + } + + private void CharacterIsOnMap() + { + Session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(0)!; + } + + private void CharacterHasTitle() + { + Session.Character.Titles = new List + { + new TitleDto { TitleType = TitleId, Visible = false, Active = false } + }; + } + + private void CharacterHasMultipleTitles() + { + Session.Character.Titles = new List + { + new TitleDto { TitleType = TitleId, Visible = false, Active = false }, + new TitleDto { TitleType = 2, Visible = true, Active = true } + }; + } + + private async Task ActivatingNonExistentTitle() + { + Session.LastPackets.Clear(); + await Handler.ExecuteAsync(new TitEqPacket + { + TitleId = 9999, + Mode = 0 + }, Session); + } + + private async Task TogglingTitleVisibility() + { + Session.LastPackets.Clear(); + await Handler.ExecuteAsync(new TitEqPacket + { + TitleId = TitleId, + Mode = 1 + }, Session); + } + + private async Task TogglingTitleActive() + { + Session.LastPackets.Clear(); + await Handler.ExecuteAsync(new TitEqPacket + { + TitleId = TitleId, + Mode = 0 + }, Session); + } + + private void NoInfoPacketShouldBeSent() + { + Assert.IsFalse(Session.LastPackets.Any(p => p is InfoiPacket)); + } + + private void TitleVisibilityShouldBeToggled() + { + var title = Session.Character.Titles.First(t => t.TitleType == TitleId); + Assert.IsTrue(title.Visible); + } + + private void TitleActiveShouldBeToggled() + { + var title = Session.Character.Titles.First(t => t.TitleType == TitleId); + Assert.IsTrue(title.Active); + } + + private void TitleChangedInfoShouldBeSent() + { + Assert.IsTrue(Session.LastPackets.Any(p => p is InfoiPacket)); + } + + private void TitleEffectChangedInfoShouldBeSent() + { + Assert.IsTrue(Session.LastPackets.Any(p => p is InfoiPacket)); + } + + private void OnlySelectedTitleShouldBeVisible() + { + var selectedTitle = Session.Character.Titles.First(t => t.TitleType == TitleId); + var otherTitles = Session.Character.Titles.Where(t => t.TitleType != TitleId); + Assert.IsTrue(selectedTitle.Visible); + Assert.IsTrue(otherTitles.All(t => !t.Visible)); + } + + private void OnlySelectedTitleShouldBeActive() + { + var selectedTitle = Session.Character.Titles.First(t => t.TitleType == TitleId); + var otherTitles = Session.Character.Titles.Where(t => t.TitleType != TitleId); + Assert.IsTrue(selectedTitle.Active); + Assert.IsTrue(otherTitles.All(t => !t.Active)); + } + } +} diff --git a/test/NosCore.PacketHandlers.Tests/Group/GroupTalkPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Group/GroupTalkPacketHandlerTests.cs new file mode 100644 index 000000000..a510ee505 --- /dev/null +++ b/test/NosCore.PacketHandlers.Tests/Group/GroupTalkPacketHandlerTests.cs @@ -0,0 +1,209 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.Core.Services.IdService; +using NosCore.Data.Enumerations.Group; +using NosCore.GameObject.InterChannelCommunication.Hubs.BlacklistHub; +using NosCore.GameObject.Networking; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.Networking; +using NosCore.Networking.SessionGroup; +using NosCore.PacketHandlers.Group; +using NosCore.Packets.ClientPackets.Chat; +using NosCore.Packets.Enumerations; +using NosCore.Packets.ServerPackets.Groups; +using NosCore.Packets.ServerPackets.Chats; +using NosCore.Tests.Shared; +using Serilog; +using SpecLight; + +namespace NosCore.PacketHandlers.Tests.Group +{ + [TestClass] + public class GroupTalkPacketHandlerTests + { + private static readonly ILogger Logger = new Mock().Object; + private readonly Dictionary _sessions = new(); + private GroupTalkPacketHandler _groupTalkPacketHandler = null!; + private PjoinPacketHandler _pJoinPacketHandler = null!; + + [TestInitialize] + public async Task SetupAsync() + { + Broadcaster.Reset(); + await TestHelpers.ResetAsync(); + var idServer = new IdService(1); + + for (var i = 0; i < 3; i++) + { + var session = await TestHelpers.Instance.GenerateSessionAsync(); + var mockChannel = new Mock(); + mockChannel.Setup(s => s.Id).Returns(Guid.NewGuid().ToString()); + session.RegisterChannel(mockChannel.Object); + _sessions.Add(i, session); + var sessionGroupFactoryMock = new Mock(); + sessionGroupFactoryMock.Setup(x => x.Create()).Returns(new Mock().Object); + session.Character.Group = new NosCore.GameObject.Services.GroupService.Group(GroupType.Group, sessionGroupFactoryMock.Object); + session.Character.Group.JoinGroup(session.Character); + } + + _groupTalkPacketHandler = new GroupTalkPacketHandler(); + + var mock = new Mock(); + _pJoinPacketHandler = new PjoinPacketHandler( + Logger, + mock.Object, + TestHelpers.Instance.Clock, + idServer, + TestHelpers.Instance.LogLanguageLocalizer, + TestHelpers.Instance.GameLanguageLocalizer, + TestHelpers.Instance.SessionRegistry); + } + + [TestMethod] + public async Task GroupTalkWhenAloneShouldNotSendMessage() + { + await new Spec("Group talk when alone should not send message") + .WhenAsync(Session0SendsGroupMessage) + .Then(NoSpkPacketShouldBeSent) + .ExecuteAsync(); + } + + [TestMethod] + public async Task GroupTalkWhenInGroupShouldSendMessage() + { + await new Spec("Group talk when in group should send message") + .GivenAsync(TwoSessionsAreGroupedAsync) + .WhenAsync(Session0SendsGroupMessage) + .Then(SpkPacketShouldBeSentToGroup) + .ExecuteAsync(); + } + + [TestMethod] + public async Task GroupTalkShouldHaveCorrectSpeakType() + { + await new Spec("Group talk should have correct speak type") + .GivenAsync(TwoSessionsAreGroupedAsync) + .WhenAsync(Session0SendsGroupMessage) + .Then(SpkPacketShouldHaveGroupSpeakType) + .ExecuteAsync(); + } + + [TestMethod] + public async Task GroupTalkShouldContainCorrectMessage() + { + await new Spec("Group talk should contain correct message") + .GivenAsync(TwoSessionsAreGroupedAsync) + .WhenAsync(Session0SendsSpecificMessage) + .Then(SpkPacketShouldContainCorrectMessage) + .ExecuteAsync(); + } + + [TestMethod] + public async Task GroupTalkInFullGroupShouldWork() + { + await new Spec("Group talk in full group should work") + .GivenAsync(ThreeSessionsAreGroupedAsync) + .WhenAsync(Session0SendsGroupMessage) + .Then(SpkPacketShouldBeSentToGroup) + .ExecuteAsync(); + } + + private async Task TwoSessionsAreGroupedAsync() + { + _sessions[1].Character.GroupRequestCharacterIds + .TryAdd(_sessions[0].Character.CharacterId, _sessions[0].Character.CharacterId); + + var pjoinPacket = new PjoinPacket + { + RequestType = GroupRequestType.Accepted, + CharacterId = _sessions[1].Character.CharacterId + }; + + await _pJoinPacketHandler.ExecuteAsync(pjoinPacket, _sessions[0]); + } + + private async Task ThreeSessionsAreGroupedAsync() + { + for (var i = 1; i < 3; i++) + { + _sessions[i].Character.GroupRequestCharacterIds + .TryAdd(_sessions[0].Character.CharacterId, _sessions[0].Character.CharacterId); + + var pjoinPacket = new PjoinPacket + { + RequestType = GroupRequestType.Accepted, + CharacterId = _sessions[i].Character.CharacterId + }; + + await _pJoinPacketHandler.ExecuteAsync(pjoinPacket, _sessions[0]); + } + } + + private async Task Session0SendsGroupMessage() + { + var packet = new GroupTalkPacket + { + Message = "Hello Group!" + }; + await _groupTalkPacketHandler.ExecuteAsync(packet, _sessions[0]); + } + + private async Task Session0SendsSpecificMessage() + { + var packet = new GroupTalkPacket + { + Message = "Test Message 123" + }; + await _groupTalkPacketHandler.ExecuteAsync(packet, _sessions[0]); + } + + private void NoSpkPacketShouldBeSent() + { + var packet = _sessions[0].Character.Group!.LastPackets.FirstOrDefault(s => s is SpeakPacket); + Assert.IsNull(packet); + } + + private void SpkPacketShouldBeSentToGroup() + { + var packet = _sessions[0].Character.Group!.LastPackets.FirstOrDefault(s => s is SpeakPacket); + Assert.IsNotNull(packet); + } + + private void SpkPacketShouldHaveGroupSpeakType() + { + var packet = (SpeakPacket?)_sessions[0].Character.Group!.LastPackets.FirstOrDefault(s => s is SpeakPacket); + Assert.IsNotNull(packet); + Assert.AreEqual(SpeakType.Group, packet.SpeakType); + } + + private void SpkPacketShouldContainCorrectMessage() + { + var packet = (SpeakPacket?)_sessions[0].Character.Group!.LastPackets.FirstOrDefault(s => s is SpeakPacket); + Assert.IsNotNull(packet); + Assert.AreEqual("Test Message 123", packet.Message); + } + } +} diff --git a/test/NosCore.PacketHandlers.Tests/Group/PJoinPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Group/PJoinPacketHandlerTests.cs index 694a380d1..b36fe12af 100644 --- a/test/NosCore.PacketHandlers.Tests/Group/PJoinPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Group/PJoinPacketHandlerTests.cs @@ -2,18 +2,18 @@ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . @@ -34,7 +34,7 @@ using NosCore.Packets.ServerPackets.Groups; using NosCore.Tests.Shared; using Serilog; -using Group = NosCore.GameObject.Services.GroupService.Group; +using SpecLight; namespace NosCore.PacketHandlers.Tests.Group { @@ -42,13 +42,14 @@ namespace NosCore.PacketHandlers.Tests.Group public class PJoinPacketHandlerTests { private static readonly ILogger Logger = new Mock().Object; - private readonly Dictionary _sessions = new(); - private PjoinPacketHandler? _pJoinPacketHandler; + private readonly Dictionary Sessions = new(); + private PjoinPacketHandler PJoinPacketHandler = null!; [TestInitialize] public async Task SetupAsync() { Broadcaster.Reset(); + await TestHelpers.ResetAsync(); var idServer = new IdService(1); for (byte i = 0; i < (byte)(GroupType.Group + 1); i++) { @@ -56,7 +57,7 @@ public async Task SetupAsync() var mockChannel = new Mock(); mockChannel.Setup(s => s.Id).Returns(Guid.NewGuid().ToString()); session.RegisterChannel(mockChannel.Object); - _sessions.Add(i, session); + Sessions.Add(i, session); var sessionGroupFactoryMock = new Mock(); sessionGroupFactoryMock.Setup(x => x.Create()).Returns(new Mock().Object); session.Character.Group = new NosCore.GameObject.Services.GroupService.Group(GroupType.Group, sessionGroupFactoryMock.Object); @@ -64,134 +65,169 @@ public async Task SetupAsync() } var mock = new Mock(); - _pJoinPacketHandler = new PjoinPacketHandler(Logger, mock.Object, TestHelpers.Instance.Clock, idServer, TestHelpers.Instance.LogLanguageLocalizer, TestHelpers.Instance.GameLanguageLocalizer, TestHelpers.Instance.SessionRegistry); + PJoinPacketHandler = new PjoinPacketHandler(Logger, mock.Object, TestHelpers.Instance.Clock, idServer, TestHelpers.Instance.LogLanguageLocalizer, TestHelpers.Instance.GameLanguageLocalizer, TestHelpers.Instance.SessionRegistry); } [TestMethod] - public async Task Test_Accept_Group_Join_RequestedAsync() + public async Task AcceptGroupJoinRequestShouldSucceed() { - _sessions[1].Character.GroupRequestCharacterIds - .TryAdd(_sessions[0].Character.CharacterId, _sessions[0].Character.CharacterId); + await new Spec("Accept group join request should succeed") + .Given(Session1HasGroupRequestFromSession0) + .WhenAsync(Session0AcceptsSession1RequestAsync) + .Then(BothSessionsShouldBeInSameGroup) + .ExecuteAsync(); + } - var pjoinPacket = new PjoinPacket - { - RequestType = GroupRequestType.Accepted, - CharacterId = _sessions[1].Character.CharacterId - }; + [TestMethod] + public async Task JoinFullGroupShouldFail() + { + await new Spec("Join full group should fail") + .GivenAsync(GroupIsFullAsync) + .WhenAsync(Session_RequestsToJoinAsync, 3) + .Then(Session_ShouldNotJoinGroup, 3) + .ExecuteAsync(); + } - await _pJoinPacketHandler!.ExecuteAsync(pjoinPacket, _sessions[0]); - Assert.IsTrue((_sessions[0].Character.Group!.Count > 1) - && (_sessions[1].Character.Group!.Count > 1) - && (_sessions[0].Character.Group!.GroupId - == _sessions[1].Character.Group!.GroupId)); + [TestMethod] + public async Task AcceptNotRequestedGroupShouldFail() + { + await new Spec("Accept not requested group should fail") + .WhenAsync(Session0AcceptsSession1RequestAsync) + .Then(BothSessionsShouldBeAlone) + .ExecuteAsync(); + } + + [TestMethod] + public async Task DeclineNotRequestedGroupShouldFail() + { + await new Spec("Decline not requested group should fail") + .WhenAsync(Session0DeclinesSession1RequestAsync) + .Then(BothSessionsShouldBeAlone) + .ExecuteAsync(); } [TestMethod] - public async Task Test_Join_Full_GroupAsync() + public async Task LastRequestNotNullAfterOne() { - PjoinPacket pjoinPacket; + await new Spec("Last request not null after one") + .WhenAsync(Session_InvitesMultipleSessionsAsync, 0) + .Then(LastGroupRequestShouldNotBeNull) + .ExecuteAsync(); + } + [TestMethod] + public async Task TwoRequestsLess5SecDelayShouldOnlyAddOne() + { + await new Spec("Two requests less 5 sec delay should only add one") + .WhenAsync(Session_InvitesWithShortDelayAsync, 0) + .Then(OnlyOneRequestShouldExist) + .ExecuteAsync(); + } + + [TestMethod] + public async Task TwoRequestsMore5SecDelayShouldAddBoth() + { + await new Spec("Two requests more 5 sec delay should add both") + .WhenAsync(Session_InvitesWithLongDelayAsync, 0) + .Then(TwoRequestsShouldExist) + .ExecuteAsync(); + } + + private void Session1HasGroupRequestFromSession0() + { + Sessions[1].Character.GroupRequestCharacterIds + .TryAdd(Sessions[0].Character.CharacterId, Sessions[0].Character.CharacterId); + } + + private async Task GroupIsFullAsync() + { for (var i = 1; i < 3; i++) { - _sessions[i].Character.GroupRequestCharacterIds - .TryAdd(_sessions[0].Character.CharacterId, _sessions[0].Character.CharacterId); + Sessions[i].Character.GroupRequestCharacterIds + .TryAdd(Sessions[0].Character.CharacterId, Sessions[0].Character.CharacterId); - pjoinPacket = new PjoinPacket + var pjoinPacket = new PjoinPacket { RequestType = GroupRequestType.Accepted, - CharacterId = _sessions[i].Character.CharacterId + CharacterId = Sessions[i].Character.CharacterId }; - await _pJoinPacketHandler!.ExecuteAsync(pjoinPacket, _sessions[0]); + await PJoinPacketHandler.ExecuteAsync(pjoinPacket, Sessions[0]); } + } - Assert.IsTrue(_sessions[0].Character.Group!.IsGroupFull - && _sessions[1].Character.Group!.IsGroupFull - && _sessions[2].Character.Group!.IsGroupFull); - - _sessions[3].Character.GroupRequestCharacterIds - .TryAdd(_sessions[0].Character.CharacterId, _sessions[0].Character.CharacterId); - - pjoinPacket = new PjoinPacket + private async Task Session0AcceptsSession1RequestAsync() + { + var pjoinPacket = new PjoinPacket { RequestType = GroupRequestType.Accepted, - CharacterId = _sessions[3].Character.CharacterId + CharacterId = Sessions[1].Character.CharacterId }; - await _pJoinPacketHandler!.ExecuteAsync(pjoinPacket, _sessions[0]); - Assert.IsTrue(_sessions[3].Character.Group!.Count == 1); + await PJoinPacketHandler.ExecuteAsync(pjoinPacket, Sessions[0]); } - [TestMethod] - public async Task Test_Accept_Not_Requested_GroupAsync() + private async Task Session0DeclinesSession1RequestAsync() { var pjoinPacket = new PjoinPacket { - RequestType = GroupRequestType.Accepted, - CharacterId = _sessions[1].Character.CharacterId + RequestType = GroupRequestType.Declined, + CharacterId = Sessions[1].Character.CharacterId }; - await _pJoinPacketHandler!.ExecuteAsync(pjoinPacket, _sessions[0]); - Assert.IsTrue((_sessions[0].Character.Group!.Count == 1) - && (_sessions[1].Character.Group!.Count == 1)); + await PJoinPacketHandler.ExecuteAsync(pjoinPacket, Sessions[0]); } - [TestMethod] - public async Task Test_Decline_Not_Requested_GroupAsync() + private async Task Session_RequestsToJoinAsync(int value) { + Sessions[3].Character.GroupRequestCharacterIds + .TryAdd(Sessions[0].Character.CharacterId, Sessions[0].Character.CharacterId); + var pjoinPacket = new PjoinPacket { - RequestType = GroupRequestType.Declined, - CharacterId = _sessions[1].Character.CharacterId + RequestType = GroupRequestType.Accepted, + CharacterId = Sessions[3].Character.CharacterId }; - await _pJoinPacketHandler!.ExecuteAsync(pjoinPacket, _sessions[0]); - Assert.IsTrue((_sessions[0].Character.Group!.Count == 1) - && (_sessions[1].Character.Group!.Count == 1)); + await PJoinPacketHandler.ExecuteAsync(pjoinPacket, Sessions[0]); } - [TestMethod] - public async Task Test_Last_Request_Not_Null_After_OneAsync() + private async Task Session_InvitesMultipleSessionsAsync(int value) { for (var i = 1; i < 3; i++) { var pjoinPacket = new PjoinPacket { RequestType = GroupRequestType.Invited, - CharacterId = _sessions[i].Character.CharacterId + CharacterId = Sessions[i].Character.CharacterId }; - await _pJoinPacketHandler!.ExecuteAsync(pjoinPacket, _sessions[0]); + await PJoinPacketHandler.ExecuteAsync(pjoinPacket, Sessions[0]); } - Assert.IsNotNull(_sessions[0].Character.LastGroupRequest); } - [TestMethod] - public async Task Test_Two_Request_Less_5_Sec_DelayAsync() + private async Task Session_InvitesWithShortDelayAsync(int value) { for (var i = 1; i < 3; i++) { var pjoinPacket = new PjoinPacket { RequestType = GroupRequestType.Invited, - CharacterId = _sessions[i].Character.CharacterId + CharacterId = Sessions[i].Character.CharacterId }; TestHelpers.Instance.Clock.AdvanceSeconds(1); - await _pJoinPacketHandler!.ExecuteAsync(pjoinPacket, _sessions[0]); + await PJoinPacketHandler.ExecuteAsync(pjoinPacket, Sessions[0]); } - - Assert.IsTrue(_sessions[0].Character.GroupRequestCharacterIds.Count == 1); } - [TestMethod] - public async Task Test_Two_Request_More_5_Sec_DelayAsync() + private async Task Session_InvitesWithLongDelayAsync(int value) { for (var i = 1; i < 3; i++) { var pjoinPacket = new PjoinPacket { RequestType = GroupRequestType.Invited, - CharacterId = _sessions[i].Character.CharacterId + CharacterId = Sessions[i].Character.CharacterId }; if (i == 2) @@ -199,10 +235,42 @@ public async Task Test_Two_Request_More_5_Sec_DelayAsync() TestHelpers.Instance.Clock.AdvanceMinutes(6); } - await _pJoinPacketHandler!.ExecuteAsync(pjoinPacket, _sessions[0]); + await PJoinPacketHandler.ExecuteAsync(pjoinPacket, Sessions[0]); } + } + + private void BothSessionsShouldBeInSameGroup() + { + Assert.IsTrue((Sessions[0].Character.Group!.Count > 1) + && (Sessions[1].Character.Group!.Count > 1) + && (Sessions[0].Character.Group!.GroupId + == Sessions[1].Character.Group!.GroupId)); + } + + private void Session_ShouldNotJoinGroup(int value) + { + Assert.IsTrue(Sessions[3].Character.Group!.Count == 1); + } + + private void BothSessionsShouldBeAlone() + { + Assert.IsTrue((Sessions[0].Character.Group!.Count == 1) + && (Sessions[1].Character.Group!.Count == 1)); + } - Assert.IsTrue(_sessions[0].Character.GroupRequestCharacterIds.Count == 2); + private void LastGroupRequestShouldNotBeNull() + { + Assert.IsNotNull(Sessions[0].Character.LastGroupRequest); + } + + private void OnlyOneRequestShouldExist() + { + Assert.IsTrue(Sessions[0].Character.GroupRequestCharacterIds.Count == 1); + } + + private void TwoRequestsShouldExist() + { + Assert.IsTrue(Sessions[0].Character.GroupRequestCharacterIds.Count == 2); } } -} \ No newline at end of file +} diff --git a/test/NosCore.PacketHandlers.Tests/Group/PleavePacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Group/PleavePacketHandlerTests.cs index c1240dcbb..44b43013c 100644 --- a/test/NosCore.PacketHandlers.Tests/Group/PleavePacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Group/PleavePacketHandlerTests.cs @@ -2,18 +2,18 @@ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . @@ -35,7 +35,7 @@ using NosCore.Packets.ServerPackets.Groups; using NosCore.Tests.Shared; using Serilog; -using Group = NosCore.GameObject.Services.GroupService.Group; +using SpecLight; namespace NosCore.PacketHandlers.Tests.Group { @@ -43,14 +43,15 @@ namespace NosCore.PacketHandlers.Tests.Group public class PleavePacketHandlerTests { private static readonly ILogger Logger = new Mock().Object; - private readonly Dictionary _sessions = new(); - private PjoinPacketHandler? _pJoinPacketHandler; - private PleavePacketHandler? _pLeavePacketHandler; + private readonly Dictionary Sessions = new(); + private PjoinPacketHandler PJoinPacketHandler = null!; + private PleavePacketHandler PLeavePacketHandler = null!; [TestInitialize] public async Task SetupAsync() { Broadcaster.Reset(); + await TestHelpers.ResetAsync(); var idServer = new IdService(1); for (byte i = 0; i < (byte)(GroupType.Group + 1); i++) { @@ -58,149 +59,147 @@ public async Task SetupAsync() var mockChannel = new Mock(); mockChannel.Setup(s => s.Id).Returns(Guid.NewGuid().ToString()); session.RegisterChannel(mockChannel.Object); - _sessions.Add(i, session); + Sessions.Add(i, session); var sessionGroupFactoryMock = new Mock(); sessionGroupFactoryMock.Setup(x => x.Create()).Returns(new Mock().Object); session.Character.Group = new NosCore.GameObject.Services.GroupService.Group(GroupType.Group, sessionGroupFactoryMock.Object); session.Character.Group.JoinGroup(session.Character); } - _pLeavePacketHandler = new PleavePacketHandler(idServer, TestHelpers.Instance.SessionRegistry); + PLeavePacketHandler = new PleavePacketHandler(idServer, TestHelpers.Instance.SessionRegistry); var mock = new Mock(); - _pJoinPacketHandler = new PjoinPacketHandler(Logger, mock.Object, TestHelpers.Instance.Clock, idServer, TestHelpers.Instance.LogLanguageLocalizer, TestHelpers.Instance.GameLanguageLocalizer, TestHelpers.Instance.SessionRegistry); + PJoinPacketHandler = new PjoinPacketHandler(Logger, mock.Object, TestHelpers.Instance.Clock, idServer, TestHelpers.Instance.LogLanguageLocalizer, TestHelpers.Instance.GameLanguageLocalizer, TestHelpers.Instance.SessionRegistry); } [TestMethod] - public async Task Test_Leave_Group_When_Not_GroupedAsync() + public async Task LeaveGroupWhenNotGroupedShouldKeepSolo() { - await _pLeavePacketHandler!.ExecuteAsync(new PleavePacket(), _sessions[0]); - - Assert.IsTrue((_sessions[0].Character.Group != null) && (_sessions[0].Character.Group!.Count == 1)); + await new Spec("Leave group when not grouped should keep solo") + .WhenAsync(Session_LeavesGroupAsync, 0) + .Then(Session_ShouldBeAlone, 0) + .ExecuteAsync(); } [TestMethod] - public async Task Test_Leave_Group_When_GroupedAsync() + public async Task LeaveGroupWhenGroupedShouldLeave() { - for (var i = 1; i < 3; i++) - { - _sessions[i].Character.GroupRequestCharacterIds - .TryAdd(_sessions[0].Character.CharacterId, _sessions[0].Character.CharacterId); - - var pjoinPacket = new PjoinPacket - { - RequestType = GroupRequestType.Accepted, - CharacterId = _sessions[i].Character.CharacterId - }; - - await _pJoinPacketHandler!.ExecuteAsync(pjoinPacket, _sessions[0]); - } - - Assert.IsTrue(_sessions[0].Character.Group!.IsGroupFull - && _sessions[1].Character.Group!.IsGroupFull - && _sessions[2].Character.Group!.IsGroupFull); - - await _pLeavePacketHandler!.ExecuteAsync(new PleavePacket(), _sessions[1]); - - Assert.IsTrue(_sessions[1].Character.Group!.Count == 1); + await new Spec("Leave group when grouped should leave") + .GivenAsync(SessionsAreInFullGroupAsync) + .WhenAsync(Session_LeavesGroupAsync, 1) + .Then(Session_ShouldBeAlone, 1) + .ExecuteAsync(); } [TestMethod] - public async Task Test_Leader_ChangeAsync() + public async Task LeaderLeavingShouldTransferLeadership() { - for (var i = 1; i < 3; i++) - { - _sessions[i].Character.GroupRequestCharacterIds - .TryAdd(_sessions[0].Character.CharacterId, _sessions[0].Character.CharacterId); - - var pjoinPacket = new PjoinPacket - { - RequestType = GroupRequestType.Accepted, - CharacterId = _sessions[i].Character.CharacterId - }; - - await _pJoinPacketHandler!.ExecuteAsync(pjoinPacket, _sessions[0]); - } - - Assert.IsTrue(_sessions[0].Character.Group!.IsGroupFull - && _sessions[1].Character.Group!.IsGroupFull - && _sessions[2].Character.Group!.IsGroupFull && _sessions[0].Character.Group! - .IsGroupLeader(_sessions[0].Character.CharacterId)); + await new Spec("Leader leaving should transfer leadership") + .GivenAsync(SessionsAreInFullGroupAsync) + .WhenAsync(Session_LeavesGroupAsync, 0) + .Then(Session_ShouldBeLeader, 1) + .ExecuteAsync(); + } - await _pLeavePacketHandler!.ExecuteAsync(new PleavePacket(), _sessions[0]); + [TestMethod] + public async Task NonLeaderLeavingThreePersonGroupShouldKeepLeader() + { + await new Spec("Non leader leaving three person group should keep leader") + .GivenAsync(SessionsAreInFullGroupAsync) + .WhenAsync(Session_LeavesGroupAsync, 1) + .Then(Session_ShouldBeLeader, 0) + .ExecuteAsync(); + } - Assert.IsTrue(_sessions[1].Character.Group! - .IsGroupLeader(_sessions[1].Character.CharacterId)); + [TestMethod] + public async Task DeclineGroupJoinShouldKeepBothAlone() + { + await new Spec("Decline group join should keep both alone") + .Given(Session1HasGroupRequestFromSession0) + .WhenAsync(Session_DeclinesAndLeavesAsync, 0) + .Then(BothSessionsShouldBeAlone) + .ExecuteAsync(); } [TestMethod] - public async Task Test_Leaving_Three_Person_GroupAsync() + public async Task LeavingTwoPersonGroupShouldDissolve() + { + await new Spec("Leaving two person group should dissolve") + .GivenAsync(TwoSessionsAreGroupedAsync) + .WhenAsync(Session_LeavesGroupAsync, 0) + .Then(BothSessionsShouldBeAlone) + .ExecuteAsync(); + } + + private async Task SessionsAreInFullGroupAsync() { for (var i = 1; i < 3; i++) { - _sessions[i].Character.GroupRequestCharacterIds - .TryAdd(_sessions[0].Character.CharacterId, _sessions[0].Character.CharacterId); + Sessions[i].Character.GroupRequestCharacterIds + .TryAdd(Sessions[0].Character.CharacterId, Sessions[0].Character.CharacterId); var pjoinPacket = new PjoinPacket { RequestType = GroupRequestType.Accepted, - CharacterId = _sessions[i].Character.CharacterId + CharacterId = Sessions[i].Character.CharacterId }; - await _pJoinPacketHandler!.ExecuteAsync(pjoinPacket, _sessions[0]); + await PJoinPacketHandler.ExecuteAsync(pjoinPacket, Sessions[0]); } + } - Assert.IsTrue(_sessions[0].Character.Group!.IsGroupFull - && _sessions[1].Character.Group!.IsGroupFull - && _sessions[2].Character.Group!.IsGroupFull && _sessions[0].Character.Group! - .IsGroupLeader(_sessions[0].Character.CharacterId)); - - await _pLeavePacketHandler!.ExecuteAsync(new PleavePacket(), _sessions[1]); - - Assert.IsTrue(_sessions[0].Character.Group! - .IsGroupLeader(_sessions[0].Character.CharacterId)); + private void Session1HasGroupRequestFromSession0() + { + Sessions[1].Character.GroupRequestCharacterIds + .TryAdd(Sessions[0].Character.CharacterId, Sessions[0].Character.CharacterId); } - [TestMethod] - public async Task Test_Decline_Group_Join_RequestedAsync() + private async Task TwoSessionsAreGroupedAsync() { - _sessions[1].Character.GroupRequestCharacterIds - .TryAdd(_sessions[0].Character.CharacterId, _sessions[0].Character.CharacterId); + Sessions[1].Character.GroupRequestCharacterIds + .TryAdd(Sessions[0].Character.CharacterId, Sessions[0].Character.CharacterId); var pjoinPacket = new PjoinPacket { - RequestType = GroupRequestType.Declined, - CharacterId = _sessions[1].Character.CharacterId + RequestType = GroupRequestType.Accepted, + CharacterId = Sessions[1].Character.CharacterId }; - await _pJoinPacketHandler!.ExecuteAsync(pjoinPacket, _sessions[0]); - await _pLeavePacketHandler!.ExecuteAsync(new PleavePacket(), _sessions[0]); - Assert.IsTrue((_sessions[0].Character.Group!.Count == 1) - && (_sessions[1].Character.Group!.Count == 1)); + await PJoinPacketHandler.ExecuteAsync(pjoinPacket, Sessions[0]); } - [TestMethod] - public async Task Test_Leaving_Two_Person_GroupAsync() + private async Task Session_LeavesGroupAsync(int value) { - _sessions[1].Character.GroupRequestCharacterIds - .TryAdd(_sessions[0].Character.CharacterId, _sessions[0].Character.CharacterId); + await PLeavePacketHandler.ExecuteAsync(new PleavePacket(), Sessions[value]); + } + private async Task Session_DeclinesAndLeavesAsync(int value) + { var pjoinPacket = new PjoinPacket { - RequestType = GroupRequestType.Accepted, - CharacterId = _sessions[1].Character.CharacterId + RequestType = GroupRequestType.Declined, + CharacterId = Sessions[1].Character.CharacterId }; - await _pJoinPacketHandler!.ExecuteAsync(pjoinPacket, _sessions[0]); - Assert.IsTrue((_sessions[0].Character.Group!.Count > 1) - && (_sessions[1].Character.Group!.Count > 1) - && (_sessions[0].Character.Group!.GroupId - == _sessions[1].Character.Group!.GroupId)); + await PJoinPacketHandler.ExecuteAsync(pjoinPacket, Sessions[0]); + await PLeavePacketHandler.ExecuteAsync(new PleavePacket(), Sessions[0]); + } + + private void Session_ShouldBeAlone(int value) + { + Assert.IsTrue((Sessions[value].Character.Group != null) && (Sessions[value].Character.Group!.Count == 1)); + } - await _pLeavePacketHandler!.ExecuteAsync(new PleavePacket(), _sessions[0]); + private void Session_ShouldBeLeader(int value) + { + Assert.IsTrue(Sessions[value].Character.Group! + .IsGroupLeader(Sessions[value].Character.CharacterId)); + } - Assert.IsTrue((_sessions[0].Character.Group!.Count == 1) - && (_sessions[1].Character.Group!.Count == 1)); + private void BothSessionsShouldBeAlone() + { + Assert.IsTrue((Sessions[0].Character.Group!.Count == 1) + && (Sessions[1].Character.Group!.Count == 1)); } } -} \ No newline at end of file +} diff --git a/test/NosCore.PacketHandlers.Tests/Inventory/BiPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Inventory/BiPacketHandlerTests.cs index 49e414577..e4f61a3a5 100644 --- a/test/NosCore.PacketHandlers.Tests/Inventory/BiPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Inventory/BiPacketHandlerTests.cs @@ -2,73 +2,103 @@ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . using System.Linq; using System.Threading.Tasks; using Microsoft.VisualStudio.TestTools.UnitTesting; -using Moq; -using NosCore.GameObject.Networking.ClientSession; -using NosCore.GameObject.Services.InventoryService; -using NosCore.GameObject.Services.ItemGenerationService; using NosCore.PacketHandlers.Inventory; using NosCore.Packets.ClientPackets.Inventory; using NosCore.Packets.Enumerations; using NosCore.Packets.ServerPackets.Inventory; using NosCore.Tests.Shared; -using Serilog; +using NosCore.Tests.Shared.BDD; +using SpecLight; namespace NosCore.PacketHandlers.Tests.Inventory { [TestClass] - public class BiPacketHandlerTests + public class BiPacketHandlerTests : SpecBase { - private static readonly ILogger Logger = new Mock().Object; - private BiPacketHandler? _biPacketHandler; - private IItemGenerationService? _item; - private ClientSession? _session; - + private BiPacketHandler BiPacketHandler = null!; + [TestInitialize] - public async Task SetupAsync() + public override async Task SetupAsync() { - await TestHelpers.ResetAsync(); - _session = await TestHelpers.Instance.GenerateSessionAsync(); - _item = TestHelpers.Instance.GenerateItemProvider(); - _biPacketHandler = new BiPacketHandler(Logger, TestHelpers.Instance.LogLanguageLocalizer); + await base.SetupAsync(); + BiPacketHandler = new BiPacketHandler(Logger, TestHelpers.Instance.LogLanguageLocalizer); } [TestMethod] - public async Task Test_Delete_FromSlotAsync() + public async Task DeletingItemFromMainSlotShouldClearSlot() { - _session!.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item!.Create(1012, 999), 0)); - await _biPacketHandler!.ExecuteAsync(new BiPacket - { Option = RequestDeletionType.Confirmed, Slot = 0, PocketType = PocketType.Main }, _session); - var packet = (IvnPacket?)_session.LastPackets.FirstOrDefault(s => s is IvnPacket); - Assert.IsTrue(packet?.IvnSubPackets?.All(iv => (iv?.Slot == 0) && (iv.VNum == -1)) ?? false); + await new Spec("Deleting item from main slot should clear slot") + .Given(AnItemWith999QuantityInSlot0) + .WhenAsync(ConfirmingDeletionFromMainSlot_, 0) + .Then(SlotShouldBeCleared) + .ExecuteAsync(); } [TestMethod] - public async Task Test_Delete_FromEquimentAsync() + public async Task DeletingItemFromEquipmentSlotShouldClearInventory() { - _session!.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item!.Create(1, 1), 0)); - await _biPacketHandler!.ExecuteAsync(new BiPacket - { Option = RequestDeletionType.Confirmed, Slot = 0, PocketType = PocketType.Equipment }, _session); - Assert.IsTrue(_session.Character.InventoryService.Count == 0); - var packet = (IvnPacket?)_session.LastPackets.FirstOrDefault(s => s is IvnPacket); - Assert.IsTrue(packet?.IvnSubPackets?.All(iv => (iv?.Slot == 0) && (iv.VNum == -1)) ?? false); + await new Spec("Deleting item from equipment slot should clear inventory") + .Given(AnEquipmentItemInSlot_, 0) + .WhenAsync(ConfirmingDeletionFromEquipmentSlot) + .Then(InventoryShouldBeEmpty) + .And(SlotShouldBeCleared) + .ExecuteAsync(); } + + private void AnItemWith999QuantityInSlot0() + { + CharacterHasItem(1012, 999); + } + + private async Task ConfirmingDeletionFromMainSlot_(int value) + { + await BiPacketHandler.ExecuteAsync(new BiPacket + { + Option = RequestDeletionType.Confirmed, + Slot = (byte)value, + PocketType = PocketType.Main + }, Session); + } + + private void SlotShouldBeCleared() + { + var packet = GetLastPacket(); + Assert.IsNotNull(packet); + Assert.IsTrue(packet.IvnSubPackets?.All(iv => iv?.Slot == 0 && iv.VNum == -1) ?? false); + } + + private void AnEquipmentItemInSlot_(int value) + { + CharacterHasItem(1); + } + + private async Task ConfirmingDeletionFromEquipmentSlot() + { + await BiPacketHandler.ExecuteAsync(new BiPacket + { + Option = RequestDeletionType.Confirmed, + Slot = 0, + PocketType = PocketType.Equipment + }, Session); + } + } -} \ No newline at end of file +} diff --git a/test/NosCore.PacketHandlers.Tests/Inventory/GetPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Inventory/GetPacketHandlerTests.cs index 8fc4a0b78..f220d0cfe 100644 --- a/test/NosCore.PacketHandlers.Tests/Inventory/GetPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Inventory/GetPacketHandlerTests.cs @@ -2,18 +2,18 @@ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . @@ -33,6 +33,7 @@ using NosCore.Shared.Enumerations; using NosCore.Tests.Shared; using Serilog; +using SpecLight; namespace NosCore.PacketHandlers.Tests.Inventory { @@ -40,159 +41,207 @@ namespace NosCore.PacketHandlers.Tests.Inventory public class GetPacketHandlerTests { private static readonly ILogger Logger = new Mock().Object; - private GetPacketHandler? _getPacketHandler; - private IItemGenerationService? _item; - private ClientSession? _session; - + private GetPacketHandler GetPacketHandler = null!; + private IItemGenerationService Item = null!; + private ClientSession Session = null!; + [TestInitialize] public async Task SetupAsync() { await TestHelpers.ResetAsync(); - _item = TestHelpers.Instance.GenerateItemProvider(); - _session = await TestHelpers.Instance.GenerateSessionAsync(); - _getPacketHandler = new GetPacketHandler(Logger, TestHelpers.Instance.DistanceCalculator, TestHelpers.Instance.Clock, TestHelpers.Instance.LogLanguageLocalizer); + Item = TestHelpers.Instance.GenerateItemProvider(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + GetPacketHandler = new GetPacketHandler(Logger, TestHelpers.Instance.DistanceCalculator, TestHelpers.Instance.Clock, TestHelpers.Instance.LogLanguageLocalizer); } + [TestMethod] + public async Task PickingUpItemShouldAddToInventory() + { + await new Spec("Picking up item should add to inventory") + .Given(CharacterIsAtOrigin) + .And(MapHasDroppableItem) + .WhenAsync(PickingUpItem) + .Then(InventoryShouldHaveItems) + .ExecuteAsync(); + } [TestMethod] - public async Task Test_GetAsync() + public async Task PickingUpItemShouldStackWithExisting() { - _session!.Character.PositionX = 0; - _session.Character.PositionY = 0; - _session.Character.MapInstance.MapItems.TryAdd(100001, - TestHelpers.Instance.MapItemProvider!.Create(_session.Character.MapInstance, _item!.Create(1012, 1), 1, - 1)); + await new Spec("Picking up item should stack with existing") + .Given(CharacterIsAtOrigin) + .And(MapHasDroppableItem) + .And(CharacterHasSameItemInInventory) + .WhenAsync(PickingUpItem) + .Then(ItemAmountShouldBeTwo) + .ExecuteAsync(); + } - await _getPacketHandler!.ExecuteAsync(new GetPacket - { - PickerId = _session.Character.CharacterId, - VisualId = 100001, - PickerType = VisualType.Player - }, _session); - Assert.IsTrue(_session.Character.InventoryService.Count > 0); + [TestMethod] + public async Task PickingUpItemWithFullInventoryShouldFail() + { + await new Spec("Picking up item with full inventory should fail") + .Given(CharacterIsAtOrigin) + .And(MapHasEquipmentItem) + .And(CharacterHasFullEquipmentInventory) + .WhenAsync(PickingUpItem) + .Then(ShouldReceiveNotEnoughSpaceMessage) + .And(InventoryShouldHaveTwoItems) + .ExecuteAsync(); } [TestMethod] - public async Task Test_GetInStackAsync() + public async Task PickingUpItemShouldKeepRarity() { - _session!.Character.PositionX = 0; - _session.Character.PositionY = 0; + await new Spec("Picking up item should keep rarity") + .Given(CharacterIsAtOrigin) + .And(MapHasRareItem) + .WhenAsync(PickingUpItem) + .Then(ItemRarityShouldBeSix) + .ExecuteAsync(); + } - _session.Character.MapInstance.MapItems.TryAdd(100001, - TestHelpers.Instance.MapItemProvider!.Create(_session.Character.MapInstance, _item!.Create(1012, 1), 1, - 1)); - _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item.Create(1012, 1), 0)); - await _getPacketHandler!.ExecuteAsync(new GetPacket - { - PickerId = _session.Character.CharacterId, - VisualId = 100001, - PickerType = VisualType.Player - }, _session); - Assert.IsTrue(_session.Character.InventoryService.First().Value.ItemInstance.Amount == 2); + [TestMethod] + public async Task PickingUpSomeoneElsesItemShouldFail() + { + await new Spec("Picking up someone elses item should fail") + .Given(CharacterIsAtOrigin) + .And(MapHasItemOwnedByAnotherPlayer) + .WhenAsync(PickingUpItem) + .Then(ShouldReceiveUnableToPickUpMessage) + .And(InventoryShouldBeEmpty) + .ExecuteAsync(); } [TestMethod] - public async Task Test_GetFullInventoryAsync() - { - _session!.Character.PositionX = 0; - _session.Character.PositionY = 0; - _session.Character.MapInstance.MapItems.TryAdd(100001, - TestHelpers.Instance.MapItemProvider!.Create(_session.Character.MapInstance, _item!.Create(1, 1), 1, 1)); - _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item.Create(1, 1), 0)); - _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item.Create(1, 1), 0)); - await _getPacketHandler!.ExecuteAsync(new GetPacket - { - PickerId = _session.Character.CharacterId, - VisualId = 100001, - PickerType = VisualType.Player - }, _session); - var packet = (MsgiPacket?)_session.LastPackets.FirstOrDefault(s => s is MsgiPacket); - Assert.IsTrue(packet?.Message == Game18NConstString.NotEnoughSpace && packet.Type == 0); - Assert.IsTrue(_session.Character.InventoryService.Count == 2); + public async Task PickingUpSomeoneElsesItemAfterDelayShouldSucceed() + { + await new Spec("Picking up someone elses item after delay should succeed") + .Given(CharacterIsAtOrigin) + .And(MapHasOldItemOwnedByAnotherPlayer) + .WhenAsync(PickingUpItem) + .Then(InventoryShouldHaveItems) + .ExecuteAsync(); } [TestMethod] - public async Task Test_Get_KeepRarityAsync() + public async Task PickingUpItemFromFarAwayShouldFail() { - _session!.Character.PositionX = 0; - _session.Character.PositionY = 0; - _session.Character.MapInstance.MapItems.TryAdd(100001, - TestHelpers.Instance.MapItemProvider!.Create(_session.Character.MapInstance, _item!.Create(1, 1, 6), 1, - 1)); + await new Spec("Picking up item from far away should fail") + .Given(CharacterIsFarFromItem) + .And(MapHasDroppableItem) + .WhenAsync(PickingUpItem) + .Then(InventoryShouldBeEmpty) + .ExecuteAsync(); + } - await _getPacketHandler!.ExecuteAsync(new GetPacket - { - PickerId = _session.Character.CharacterId, - VisualId = 100001, - PickerType = VisualType.Player - }, _session); - Assert.IsTrue(_session.Character.InventoryService.First().Value.ItemInstance.Rare == 6); + private void CharacterIsAtOrigin() + { + Session.Character.PositionX = 0; + Session.Character.PositionY = 0; } - [TestMethod] - public async Task Test_Get_NotYourObjectAsync() + private void CharacterIsFarFromItem() { - _session!.Character.PositionX = 0; - _session.Character.PositionY = 0; - var mapItem = - TestHelpers.Instance.MapItemProvider!.Create(_session.Character.MapInstance, _item!.Create(1012, 1), 1, - 1); + Session.Character.PositionX = 7; + Session.Character.PositionY = 7; + } + + private void MapHasDroppableItem() + { + Session.Character.MapInstance.MapItems.TryAdd(100001, + TestHelpers.Instance.MapItemProvider!.Create(Session.Character.MapInstance, Item.Create(1012, 1), 1, 1)); + } + + private void MapHasEquipmentItem() + { + Session.Character.MapInstance.MapItems.TryAdd(100001, + TestHelpers.Instance.MapItemProvider!.Create(Session.Character.MapInstance, Item.Create(1, 1), 1, 1)); + } + + private void CharacterHasSameItemInInventory() + { + Session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(Item.Create(1012, 1), 0)); + } + + private void CharacterHasFullEquipmentInventory() + { + Session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(Item.Create(1, 1), 0)); + Session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(Item.Create(1, 1), 0)); + } + + private void MapHasRareItem() + { + Session.Character.MapInstance.MapItems.TryAdd(100001, + TestHelpers.Instance.MapItemProvider!.Create(Session.Character.MapInstance, Item.Create(1, 1, 6), 1, 1)); + } + + private void MapHasItemOwnedByAnotherPlayer() + { + var mapItem = TestHelpers.Instance.MapItemProvider!.Create(Session.Character.MapInstance, Item.Create(1012, 1), 1, 1); mapItem.VisualId = 1012; mapItem.OwnerId = 2; mapItem.DroppedAt = TestHelpers.Instance.Clock.GetCurrentInstant(); - _session.Character.MapInstance.MapItems.TryAdd(100001, mapItem); - - await _getPacketHandler!.ExecuteAsync(new GetPacket - { - PickerId = _session.Character.CharacterId, - VisualId = 100001, - PickerType = VisualType.Player - }, _session); - var packet = (SayiPacket?)_session.LastPackets.FirstOrDefault(s => s is SayiPacket); - Assert.IsTrue(packet?.VisualType == VisualType.Player && packet?.VisualId == _session.Character.CharacterId && - packet?.Type == SayColorType.Yellow && packet?.Message == Game18NConstString.UnableToPickUp); - Assert.IsTrue(_session.Character.InventoryService.Count == 0); + Session.Character.MapInstance.MapItems.TryAdd(100001, mapItem); } - [TestMethod] - public async Task Test_Get_NotYourObjectAfterDelayAsync() + private void MapHasOldItemOwnedByAnotherPlayer() { - _session!.Character.PositionX = 0; - _session.Character.PositionY = 0; - - var mapItem = - TestHelpers.Instance.MapItemProvider!.Create(_session.Character.MapInstance, _item!.Create(1012, 1), 1, - 1); + var mapItem = TestHelpers.Instance.MapItemProvider!.Create(Session.Character.MapInstance, Item.Create(1012, 1), 1, 1); mapItem.VisualId = 1012; mapItem.OwnerId = 2; mapItem.DroppedAt = TestHelpers.Instance.Clock.GetCurrentInstant().Plus(Duration.FromSeconds(-30)); - _session.Character.MapInstance.MapItems.TryAdd(100001, mapItem); + Session.Character.MapInstance.MapItems.TryAdd(100001, mapItem); + } - await _getPacketHandler!.ExecuteAsync(new GetPacket + private async Task PickingUpItem() + { + await GetPacketHandler.ExecuteAsync(new GetPacket { - PickerId = _session.Character.CharacterId, + PickerId = Session.Character.CharacterId, VisualId = 100001, PickerType = VisualType.Player - }, _session); - Assert.IsTrue(_session.Character.InventoryService.Count > 0); + }, Session); } - [TestMethod] - public async Task Test_GetAwayAsync() + private void InventoryShouldHaveItems() { - _session!.Character.PositionX = 7; - _session.Character.PositionY = 7; + Assert.IsTrue(Session.Character.InventoryService.Count > 0); + } - _session.Character.MapInstance.MapItems.TryAdd(100001, - TestHelpers.Instance.MapItemProvider!.Create(_session.Character.MapInstance, _item!.Create(1012, 1), 1, - 1)); - await _getPacketHandler!.ExecuteAsync(new GetPacket - { - PickerId = _session.Character.CharacterId, - VisualId = 100001, - PickerType = VisualType.Player - }, _session); - Assert.IsTrue(_session.Character.InventoryService.Count == 0); + private void InventoryShouldBeEmpty() + { + Assert.AreEqual(0, Session.Character.InventoryService.Count); + } + + private void InventoryShouldHaveTwoItems() + { + Assert.AreEqual(2, Session.Character.InventoryService.Count); + } + + private void ItemAmountShouldBeTwo() + { + Assert.AreEqual(2, Session.Character.InventoryService.First().Value.ItemInstance.Amount); + } + + private void ItemRarityShouldBeSix() + { + Assert.AreEqual(6, Session.Character.InventoryService.First().Value.ItemInstance.Rare); + } + + private void ShouldReceiveNotEnoughSpaceMessage() + { + var packet = (MsgiPacket?)Session.LastPackets.FirstOrDefault(s => s is MsgiPacket); + Assert.IsTrue(packet?.Message == Game18NConstString.NotEnoughSpace && packet.Type == 0); + } + + private void ShouldReceiveUnableToPickUpMessage() + { + var packet = (SayiPacket?)Session.LastPackets.FirstOrDefault(s => s is SayiPacket); + Assert.IsTrue(packet?.VisualType == VisualType.Player && + packet?.VisualId == Session.Character.CharacterId && + packet?.Type == SayColorType.Yellow && + packet?.Message == Game18NConstString.UnableToPickUp); } } -} \ No newline at end of file +} diff --git a/test/NosCore.PacketHandlers.Tests/Inventory/MvePacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Inventory/MvePacketHandlerTests.cs new file mode 100644 index 000000000..4c6d85fa3 --- /dev/null +++ b/test/NosCore.PacketHandlers.Tests/Inventory/MvePacketHandlerTests.cs @@ -0,0 +1,144 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Linq; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using NosCore.Data.Enumerations; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.GameObject.Services.InventoryService; +using NosCore.GameObject.Services.ItemGenerationService; +using NosCore.PacketHandlers.Inventory; +using NosCore.Packets.ClientPackets.Inventory; +using NosCore.Packets.Enumerations; +using NosCore.Packets.ServerPackets.Inventory; +using NosCore.Tests.Shared; +using NosCore.Tests.Shared.BDD; +using SpecLight; + +namespace NosCore.PacketHandlers.Tests.Inventory +{ + [TestClass] + public class MvePacketHandlerTests : SpecBase + { + private MvePacketHandler MvePacketHandler = null!; + + [TestInitialize] + public override async Task SetupAsync() + { + await base.SetupAsync(); + MvePacketHandler = new MvePacketHandler(); + } + + [TestMethod] + public async Task MovingEquipmentItemBetweenSlotsShouldUpdateBothSlots() + { + await new Spec("Moving equipment item between slots should update both slots") + .Given(CharacterHasEquipmentItemInSlot0) + .WhenAsync(MovingItemFromSlot0ToSlot1) + .Then(ItemShouldBeInSlot1) + .And(Slot0ShouldBeEmpty) + .ExecuteAsync(); + } + + [TestMethod] + public async Task MovingItemFromEquipmentToCostumeShouldWork() + { + await new Spec("Moving item from equipment to costume should work") + .Given(CharacterHasFashionItemInEquipment) + .WhenAsync(MovingItemFromEquipmentToCostume) + .Then(ItemShouldBeInCostumePocket) + .ExecuteAsync(); + } + + [TestMethod] + public async Task MovingItemShouldSendPocketChangePackets() + { + await new Spec("Moving item should send pocket change packets") + .Given(CharacterHasEquipmentItemInSlot0) + .WhenAsync(MovingItemFromSlot0ToSlot1) + .Then(ShouldReceivePocketChangePackets) + .ExecuteAsync(); + } + + private void CharacterHasEquipmentItemInSlot0() + { + var item = ItemProvider.Create(1, 1); + Session.Character.InventoryService.AddItemToPocket( + InventoryItemInstance.Create(item, Session.Character.CharacterId), + NoscorePocketType.Equipment, 0); + } + + private void CharacterHasFashionItemInEquipment() + { + var item = ItemProvider.Create(924, 1); + Session.Character.InventoryService.AddItemToPocket( + InventoryItemInstance.Create(item, Session.Character.CharacterId), + NoscorePocketType.Equipment, 0); + } + + private async Task MovingItemFromSlot0ToSlot1() + { + await MvePacketHandler.ExecuteAsync(new MvePacket + { + Slot = 0, + InventoryType = PocketType.Equipment, + DestinationSlot = 1, + DestinationInventoryType = PocketType.Equipment + }, Session); + } + + private async Task MovingItemFromEquipmentToCostume() + { + await MvePacketHandler.ExecuteAsync(new MvePacket + { + Slot = 0, + InventoryType = PocketType.Equipment, + DestinationSlot = 0, + DestinationInventoryType = PocketType.Costume + }, Session); + } + + private void ItemShouldBeInSlot1() + { + var item = Session.Character.InventoryService.LoadBySlotAndType(1, NoscorePocketType.Equipment); + Assert.IsNotNull(item); + Assert.AreEqual(1, item.ItemInstance.ItemVNum); + } + + private void Slot0ShouldBeEmpty() + { + var item = Session.Character.InventoryService.LoadBySlotAndType(0, NoscorePocketType.Equipment); + Assert.IsNull(item); + } + + private void ItemShouldBeInCostumePocket() + { + var item = Session.Character.InventoryService.LoadBySlotAndType(0, NoscorePocketType.Costume); + Assert.IsNotNull(item); + Assert.AreEqual(924, item.ItemInstance.ItemVNum); + } + + private void ShouldReceivePocketChangePackets() + { + var packets = Session.LastPackets.OfType().ToList(); + Assert.IsTrue(packets.Count >= 2); + } + } +} diff --git a/test/NosCore.PacketHandlers.Tests/Inventory/MviPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Inventory/MviPacketHandlerTests.cs new file mode 100644 index 000000000..ebce6a3ce --- /dev/null +++ b/test/NosCore.PacketHandlers.Tests/Inventory/MviPacketHandlerTests.cs @@ -0,0 +1,229 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Linq; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using NosCore.Data.Enumerations; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.GameObject.Services.InventoryService; +using NosCore.GameObject.Services.ItemGenerationService; +using NosCore.PacketHandlers.Inventory; +using NosCore.Packets.ClientPackets.Inventory; +using NosCore.Packets.Enumerations; +using NosCore.Packets.ServerPackets.Inventory; +using NosCore.Tests.Shared; +using NosCore.Tests.Shared.BDD; +using SpecLight; + +namespace NosCore.PacketHandlers.Tests.Inventory +{ + [TestClass] + public class MviPacketHandlerTests : SpecBase + { + private MviPacketHandler MviPacketHandler = null!; + + [TestInitialize] + public override async Task SetupAsync() + { + await base.SetupAsync(); + MviPacketHandler = new MviPacketHandler(); + } + + [TestMethod] + public async Task MovingFullStackShouldMoveItemToNewSlot() + { + await new Spec("Moving full stack should move item to new slot") + .Given(CharacterHasStackOf999ItemsInSlot0) + .WhenAsync(MovingFullStackFromSlot0ToSlot1) + .Then(ItemShouldBeInSlot1WithAmount999) + .And(Slot0ShouldBeEmpty) + .ExecuteAsync(); + } + + [TestMethod] + public async Task MovingPartialStackShouldSplitItems() + { + await new Spec("Moving partial stack should split items") + .Given(CharacterHasStackOf999ItemsInSlot0) + .WhenAsync(Moving500ItemsFromSlot0ToSlot1) + .Then(Slot1ShouldHave500Items) + .And(Slot0ShouldHave499Items) + .ExecuteAsync(); + } + + [TestMethod] + public async Task SwappingItemsBetweenSlotsShouldWork() + { + await new Spec("Swapping items between slots should work") + .Given(CharacterHasDifferentItemsInSlot0And1) + .WhenAsync(MovingItemFromSlot0ToSlot1) + .Then(ItemsShouldBeSwapped) + .ExecuteAsync(); + } + + [TestMethod] + public async Task MovingItemShouldSendTwoPocketChangePackets() + { + await new Spec("Moving item should send two pocket change packets") + .Given(CharacterHasStackOf999ItemsInSlot0) + .WhenAsync(MovingFullStackFromSlot0ToSlot1) + .Then(ShouldReceiveTwoPocketChangePackets) + .ExecuteAsync(); + } + + [TestMethod] + public async Task StackingItemsOntoExistingStackShouldMerge() + { + await new Spec("Stacking items onto existing stack should merge") + .Given(CharacterHas100ItemsInSlot0And200InSlot1) + .WhenAsync(Moving100ItemsFromSlot0ToSlot1) + .Then(Slot1ShouldHave300Items) + .And(Slot0ShouldBeEmpty) + .ExecuteAsync(); + } + + private void CharacterHasStackOf999ItemsInSlot0() + { + var item = ItemProvider.Create(1012, 999); + Session.Character.InventoryService.AddItemToPocket( + InventoryItemInstance.Create(item, Session.Character.CharacterId), + NoscorePocketType.Main, 0); + } + + private void CharacterHasDifferentItemsInSlot0And1() + { + var item1 = ItemProvider.Create(1012, 100); + var item2 = ItemProvider.Create(1013, 50); + Session.Character.InventoryService.AddItemToPocket( + InventoryItemInstance.Create(item1, Session.Character.CharacterId), + NoscorePocketType.Main, 0); + Session.Character.InventoryService.AddItemToPocket( + InventoryItemInstance.Create(item2, Session.Character.CharacterId), + NoscorePocketType.Main, 1); + } + + private void CharacterHas100ItemsInSlot0And200InSlot1() + { + var item1 = ItemProvider.Create(1012, 100); + var item2 = ItemProvider.Create(1012, 200); + Session.Character.InventoryService.AddItemToPocket( + InventoryItemInstance.Create(item1, Session.Character.CharacterId), + NoscorePocketType.Main, 0); + Session.Character.InventoryService.AddItemToPocket( + InventoryItemInstance.Create(item2, Session.Character.CharacterId), + NoscorePocketType.Main, 1); + } + + private async Task MovingFullStackFromSlot0ToSlot1() + { + await MviPacketHandler.ExecuteAsync(new MviPacket + { + Slot = 0, + InventoryType = PocketType.Main, + Amount = 999, + DestinationSlot = 1 + }, Session); + } + + private async Task Moving500ItemsFromSlot0ToSlot1() + { + await MviPacketHandler.ExecuteAsync(new MviPacket + { + Slot = 0, + InventoryType = PocketType.Main, + Amount = 500, + DestinationSlot = 1 + }, Session); + } + + private async Task MovingItemFromSlot0ToSlot1() + { + await MviPacketHandler.ExecuteAsync(new MviPacket + { + Slot = 0, + InventoryType = PocketType.Main, + Amount = 100, + DestinationSlot = 1 + }, Session); + } + + private async Task Moving100ItemsFromSlot0ToSlot1() + { + await MviPacketHandler.ExecuteAsync(new MviPacket + { + Slot = 0, + InventoryType = PocketType.Main, + Amount = 100, + DestinationSlot = 1 + }, Session); + } + + private void ItemShouldBeInSlot1WithAmount999() + { + var item = Session.Character.InventoryService.LoadBySlotAndType(1, NoscorePocketType.Main); + Assert.IsNotNull(item); + Assert.AreEqual(1012, item.ItemInstance.ItemVNum); + Assert.AreEqual(999, item.ItemInstance.Amount); + } + + private void Slot0ShouldBeEmpty() + { + var item = Session.Character.InventoryService.LoadBySlotAndType(0, NoscorePocketType.Main); + Assert.IsNull(item); + } + + private void Slot1ShouldHave500Items() + { + var item = Session.Character.InventoryService.LoadBySlotAndType(1, NoscorePocketType.Main); + Assert.IsNotNull(item); + Assert.AreEqual(500, item.ItemInstance.Amount); + } + + private void Slot0ShouldHave499Items() + { + var item = Session.Character.InventoryService.LoadBySlotAndType(0, NoscorePocketType.Main); + Assert.IsNotNull(item); + Assert.AreEqual(499, item.ItemInstance.Amount); + } + + private void Slot1ShouldHave300Items() + { + var item = Session.Character.InventoryService.LoadBySlotAndType(1, NoscorePocketType.Main); + Assert.IsNotNull(item); + Assert.AreEqual(300, item.ItemInstance.Amount); + } + + private void ItemsShouldBeSwapped() + { + var slot0Item = Session.Character.InventoryService.LoadBySlotAndType(0, NoscorePocketType.Main); + var slot1Item = Session.Character.InventoryService.LoadBySlotAndType(1, NoscorePocketType.Main); + Assert.IsNotNull(slot0Item); + Assert.IsNotNull(slot1Item); + Assert.AreEqual(1013, slot0Item.ItemInstance.ItemVNum); + Assert.AreEqual(1012, slot1Item.ItemInstance.ItemVNum); + } + + private void ShouldReceiveTwoPocketChangePackets() + { + var packets = Session.LastPackets.OfType().ToList(); + Assert.AreEqual(2, packets.Count); + } + } +} diff --git a/test/NosCore.PacketHandlers.Tests/Inventory/PutPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Inventory/PutPacketHandlerTests.cs index 39bb7f97b..6f052e424 100644 --- a/test/NosCore.PacketHandlers.Tests/Inventory/PutPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Inventory/PutPacketHandlerTests.cs @@ -2,18 +2,18 @@ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . @@ -29,103 +29,156 @@ using NosCore.Packets.ServerPackets.Chats; using NosCore.Shared.Enumerations; using NosCore.Tests.Shared; +using SpecLight; namespace NosCore.PacketHandlers.Tests.Inventory { [TestClass] public class PutPacketHandlerTests { - private IItemGenerationService? _item; - private PutPacketHandler? _putPacketHandler; - private ClientSession? _session; + private IItemGenerationService Item = null!; + private PutPacketHandler PutPacketHandler = null!; + private ClientSession Session = null!; [TestInitialize] public async Task SetupAsync() { await TestHelpers.ResetAsync(); - _item = TestHelpers.Instance.GenerateItemProvider(); - _session = await TestHelpers.Instance.GenerateSessionAsync(); - _putPacketHandler = new PutPacketHandler(TestHelpers.Instance.WorldConfiguration, TestHelpers.Instance.GameLanguageLocalizer); + Item = TestHelpers.Instance.GenerateItemProvider(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + PutPacketHandler = new PutPacketHandler(TestHelpers.Instance.WorldConfiguration, TestHelpers.Instance.GameLanguageLocalizer); } [TestMethod] - public async Task Test_PutPartialSlotAsync() + public async Task DroppingPartialStackShouldKeepRemaining() { - _session!.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item!.Create(1012, 999), 0)); - await _putPacketHandler!.ExecuteAsync(new PutPacket - { - PocketType = PocketType.Main, - Slot = 0, - Amount = 500 - }, _session); - Assert.IsTrue((_session.Character.InventoryService.Count == 1) && - (_session.Character.InventoryService.FirstOrDefault().Value.ItemInstance?.Amount == 499)); + await new Spec("Dropping partial stack should keep remaining") + .Given(CharacterHasStackOf_Items, 999) + .WhenAsync(Dropping_Items, 500) + .Then(InventoryShouldHaveOneItem) + .And(ItemAmountShouldBe_, 499) + .ExecuteAsync(); } [TestMethod] - public async Task Test_PutNotDroppableAsync() + public async Task DroppingNonDroppableItemShouldFail() { - _session!.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item!.Create(1013, 1), 0)); - await _putPacketHandler!.ExecuteAsync(new PutPacket - { - PocketType = PocketType.Main, - Slot = 0, - Amount = 1 - }, _session); - var packet = (SayiPacket?)_session.LastPackets.FirstOrDefault(s => s is SayiPacket); - Assert.IsTrue(packet?.VisualType == VisualType.Player && packet?.VisualId == _session.Character.CharacterId && - packet?.Type == SayColorType.Yellow && packet?.Message == Game18NConstString.CantDropItem); - Assert.IsTrue(_session.Character.InventoryService.Count > 0); + await new Spec("Dropping non droppable item should fail") + .Given(CharacterHasNonDroppableItem) + .WhenAsync(DroppingOneItem) + .Then(ShouldReceiveCantDropMessage) + .And(InventoryShouldNotBeEmpty) + .ExecuteAsync(); } + [TestMethod] + public async Task DroppingItemShouldRemoveFromInventory() + { + await new Spec("Dropping item should remove from inventory") + .Given(CharacterHasDroppableItem) + .WhenAsync(DroppingOneItem) + .Then(InventoryShouldBeEmpty) + .ExecuteAsync(); + } [TestMethod] - public async Task Test_PutAsync() + public async Task DroppingAtBadPositionShouldFail() { - _session!.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item!.Create(1012, 1), 0)); - await _putPacketHandler!.ExecuteAsync(new PutPacket - { - PocketType = PocketType.Main, - Slot = 0, - Amount = 1 - }, _session); - Assert.IsTrue(_session.Character.InventoryService.Count == 0); + await new Spec("Dropping at bad position should fail") + .Given(CharacterIsAtBadPosition) + .And(CharacterHasDroppableItem) + .WhenAsync(DroppingOneItem) + .Then(ShouldReceiveCantDropMessage) + .And(InventoryShouldNotBeEmpty) + .ExecuteAsync(); } [TestMethod] - public async Task Test_PutBadPlaceAsync() + public async Task DroppingOutOfBoundsShouldFail() { - _session!.Character.PositionX = 2; - _session.Character.PositionY = 2; - _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item!.Create(1012, 1), 0)); - await _putPacketHandler!.ExecuteAsync(new PutPacket + await new Spec("Dropping out of bounds should fail") + .Given(CharacterIsOutOfBounds) + .And(CharacterHasDroppableItem) + .WhenAsync(DroppingOneItem) + .Then(ShouldReceiveCantDropMessage) + .And(InventoryShouldNotBeEmpty) + .ExecuteAsync(); + } + + private void CharacterHasStackOf_Items(int value) + { + Session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(Item.Create(1012, 999), 0)); + } + + private void CharacterHasDroppableItem() + { + Session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(Item.Create(1012, 1), 0)); + } + + private void CharacterHasNonDroppableItem() + { + Session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(Item.Create(1013, 1), 0)); + } + + private void CharacterIsAtBadPosition() + { + Session.Character.PositionX = 2; + Session.Character.PositionY = 2; + } + + private void CharacterIsOutOfBounds() + { + Session.Character.PositionX = -1; + Session.Character.PositionY = -1; + } + + private async Task Dropping_Items(int value) + { + await PutPacketHandler.ExecuteAsync(new PutPacket { PocketType = PocketType.Main, Slot = 0, - Amount = 1 - }, _session); - var packet = (SayiPacket?)_session.LastPackets.FirstOrDefault(s => s is SayiPacket); - Assert.IsTrue(packet?.VisualType == VisualType.Player && packet?.VisualId == _session.Character.CharacterId && - packet?.Type == SayColorType.Yellow && packet?.Message == Game18NConstString.CantDropItem); - Assert.IsTrue(_session.Character.InventoryService.Count > 0); + Amount = 500 + }, Session); } - [TestMethod] - public async Task Test_PutOutOfBoundsAsync() + private async Task DroppingOneItem() { - _session!.Character.PositionX = -1; - _session.Character.PositionY = -1; - _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item!.Create(1012, 1), 0)); - await _putPacketHandler!.ExecuteAsync(new PutPacket + await PutPacketHandler.ExecuteAsync(new PutPacket { PocketType = PocketType.Main, Slot = 0, Amount = 1 - }, _session); - var packet = (SayiPacket?)_session.LastPackets.FirstOrDefault(s => s is SayiPacket); - Assert.IsTrue(packet?.VisualType == VisualType.Player && packet?.VisualId == _session.Character.CharacterId && - packet?.Type == SayColorType.Yellow && packet?.Message == Game18NConstString.CantDropItem); - Assert.IsTrue(_session.Character.InventoryService.Count > 0); + }, Session); + } + + private void InventoryShouldHaveOneItem() + { + Assert.AreEqual(1, Session.Character.InventoryService.Count); + } + + private void ItemAmountShouldBe_(int value) + { + Assert.AreEqual((short)value, Session.Character.InventoryService.FirstOrDefault().Value.ItemInstance?.Amount); + } + + private void InventoryShouldBeEmpty() + { + Assert.AreEqual(0, Session.Character.InventoryService.Count); + } + + private void InventoryShouldNotBeEmpty() + { + Assert.IsTrue(Session.Character.InventoryService.Count > 0); + } + + private void ShouldReceiveCantDropMessage() + { + var packet = (SayiPacket?)Session.LastPackets.FirstOrDefault(s => s is SayiPacket); + Assert.IsTrue(packet?.VisualType == VisualType.Player && + packet?.VisualId == Session.Character.CharacterId && + packet?.Type == SayColorType.Yellow && + packet?.Message == Game18NConstString.CantDropItem); } } -} \ No newline at end of file +} diff --git a/test/NosCore.PacketHandlers.Tests/Inventory/RemovePacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Inventory/RemovePacketHandlerTests.cs new file mode 100644 index 000000000..e91a98e00 --- /dev/null +++ b/test/NosCore.PacketHandlers.Tests/Inventory/RemovePacketHandlerTests.cs @@ -0,0 +1,189 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Linq; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using NosCore.Data.Enumerations; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.GameObject.Services.InventoryService; +using NosCore.GameObject.Services.ItemGenerationService; +using NosCore.PacketHandlers.Inventory; +using NosCore.Packets.ClientPackets.Inventory; +using NosCore.Packets.Enumerations; +using NosCore.Packets.ServerPackets.Inventory; +using NosCore.Packets.ServerPackets.UI; +using NosCore.Tests.Shared; +using NosCore.Tests.Shared.BDD; +using SpecLight; + +namespace NosCore.PacketHandlers.Tests.Inventory +{ + [TestClass] + public class RemovePacketHandlerTests : SpecBase + { + private RemovePacketHandler RemovePacketHandler = null!; + + [TestInitialize] + public override async Task SetupAsync() + { + await base.SetupAsync(); + RemovePacketHandler = new RemovePacketHandler(); + } + + [TestMethod] + public async Task RemovingEquippedWeaponShouldMoveToEquipmentPocket() + { + await new Spec("Removing equipped weapon should move to equipment pocket") + .Given(CharacterHasWeaponEquipped) + .WhenAsync(RemovingMainWeapon) + .Then(WeaponShouldBeInEquipmentPocket) + .And(WeaponSlotShouldBeEmpty) + .ExecuteAsync(); + } + + [TestMethod] + public async Task RemovingNonExistentItemShouldDoNothing() + { + await new Spec("Removing non existent item should do nothing") + .WhenAsync(RemovingMainWeapon) + .Then(InventoryShouldBeEmpty) + .ExecuteAsync(); + } + + [TestMethod] + public async Task RemovingEquippedArmorShouldWork() + { + await new Spec("Removing equipped armor should work") + .Given(CharacterHasArmorEquipped) + .WhenAsync(RemovingArmor) + .Then(ArmorShouldBeInEquipmentPocket) + .ExecuteAsync(); + } + + [TestMethod] + public async Task RemovingItemWithFullInventoryShouldShowNotEnoughSpaceMessage() + { + await new Spec("Removing item with full inventory should show not enough space message") + .Given(CharacterHasWeaponEquipped) + .And(EquipmentInventoryIsFull) + .WhenAsync(RemovingMainWeapon) + .Then(ShouldReceiveNotEnoughSpaceMessage) + .And(WeaponShouldStillBeEquipped) + .ExecuteAsync(); + } + + [TestMethod] + public async Task RemovingEquippedItemShouldSendPocketChangePacket() + { + await new Spec("Removing equipped item should send pocket change packet") + .Given(CharacterHasWeaponEquipped) + .WhenAsync(RemovingMainWeapon) + .Then(ShouldReceivePocketChangePacket) + .ExecuteAsync(); + } + + private void CharacterHasWeaponEquipped() + { + var item = ItemProvider.Create(1, 1); + Session.Character.InventoryService.AddItemToPocket( + InventoryItemInstance.Create(item, Session.Character.CharacterId), + NoscorePocketType.Wear, (short)EquipmentType.MainWeapon); + } + + private void CharacterHasArmorEquipped() + { + var item = ItemProvider.Create(1, 1); + Session.Character.InventoryService.AddItemToPocket( + InventoryItemInstance.Create(item, Session.Character.CharacterId), + NoscorePocketType.Wear, (short)EquipmentType.Armor); + } + + private void EquipmentInventoryIsFull() + { + for (short i = 0; i < TestHelpers.Instance.WorldConfiguration.Value.BackpackSize; i++) + { + var item = ItemProvider.Create(1, 1); + Session.Character.InventoryService.AddItemToPocket( + InventoryItemInstance.Create(item, Session.Character.CharacterId), + NoscorePocketType.Equipment, i); + } + } + + private async Task RemovingMainWeapon() + { + await RemovePacketHandler.ExecuteAsync(new RemovePacket + { + InventorySlot = EquipmentType.MainWeapon + }, Session); + } + + private async Task RemovingArmor() + { + await RemovePacketHandler.ExecuteAsync(new RemovePacket + { + InventorySlot = EquipmentType.Armor + }, Session); + } + + private void WeaponShouldBeInEquipmentPocket() + { + var item = Session.Character.InventoryService.FirstOrDefault(i => + i.Value.Type == NoscorePocketType.Equipment); + Assert.IsNotNull(item.Value); + Assert.AreEqual(1, item.Value.ItemInstance.ItemVNum); + } + + private void ArmorShouldBeInEquipmentPocket() + { + var item = Session.Character.InventoryService.FirstOrDefault(i => + i.Value.Type == NoscorePocketType.Equipment); + Assert.IsNotNull(item.Value); + Assert.AreEqual(1, item.Value.ItemInstance.ItemVNum); + } + + private void WeaponSlotShouldBeEmpty() + { + var item = Session.Character.InventoryService.LoadBySlotAndType( + (short)EquipmentType.MainWeapon, NoscorePocketType.Wear); + Assert.IsNull(item); + } + + private void WeaponShouldStillBeEquipped() + { + var item = Session.Character.InventoryService.LoadBySlotAndType( + (short)EquipmentType.MainWeapon, NoscorePocketType.Wear); + Assert.IsNotNull(item); + Assert.AreEqual(1, item.ItemInstance.ItemVNum); + } + + private void ShouldReceiveNotEnoughSpaceMessage() + { + var packet = GetLastPacket(); + Assert.IsNotNull(packet); + Assert.AreEqual(Game18NConstString.NotEnoughSpace, packet.Message); + } + + private void ShouldReceivePocketChangePacket() + { + var packet = GetLastPacket(); + Assert.IsNotNull(packet); + } + } +} diff --git a/test/NosCore.PacketHandlers.Tests/Inventory/SpTransformPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Inventory/SpTransformPacketHandlerTests.cs index 7aebc75e2..e580bd9bc 100644 --- a/test/NosCore.PacketHandlers.Tests/Inventory/SpTransformPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Inventory/SpTransformPacketHandlerTests.cs @@ -2,18 +2,18 @@ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . @@ -38,8 +38,8 @@ using NosCore.Shared.Enumerations; using NosCore.Tests.Shared; using Serilog; +using SpecLight; -//TODO stop using obsolete #pragma warning disable 618 namespace NosCore.PacketHandlers.Tests.Inventory @@ -47,160 +47,264 @@ namespace NosCore.PacketHandlers.Tests.Inventory [TestClass] public class SpTransformPacketHandlerTests { - private IItemGenerationService? _item; - private ClientSession? _session; - private SpTransformPacketHandler? _spTransformPacketHandler; - + private IItemGenerationService Item = null!; + private ClientSession Session = null!; + private SpTransformPacketHandler SpTransformPacketHandler = null!; + [TestInitialize] public async Task SetupAsync() { await TestHelpers.ResetAsync(); - _item = TestHelpers.Instance.GenerateItemProvider(); - _session = await TestHelpers.Instance.GenerateSessionAsync(); - _spTransformPacketHandler = new SpTransformPacketHandler(TestHelpers.Instance.Clock, - new TransformationService(TestHelpers.Instance.Clock, new Mock().Object, new Mock().Object, new Mock().Object, - new Mock().Object, TestHelpers.Instance.LogLanguageLocalizer), TestHelpers.Instance.GameLanguageLocalizer); + Item = TestHelpers.Instance.GenerateItemProvider(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + SpTransformPacketHandler = new SpTransformPacketHandler(TestHelpers.Instance.Clock, + new TransformationService(TestHelpers.Instance.Clock, new Mock().Object, + new Mock().Object, new Mock().Object, + new Mock().Object, TestHelpers.Instance.LogLanguageLocalizer), + TestHelpers.Instance.GameLanguageLocalizer); } + [TestMethod] + public async Task TransformingWithoutSpShouldShowError() + { + await new Spec("Transforming without sp should show error") + .WhenAsync(AttemptingToTransform) + .Then(ShouldReceiveNoSpEquippedMessage) + .ExecuteAsync(); + } [TestMethod] - public async Task Test_Transform_NoSpAsync() + public async Task TransformingWhileInVehicleShouldFail() { - await _spTransformPacketHandler!.ExecuteAsync(new SpTransformPacket { Type = SlPacketType.WearSp }, _session!); - var packet = (MsgiPacket?)_session!.LastPackets.FirstOrDefault(s => s is MsgiPacket); - Assert.IsTrue(packet?.Type == MessageType.Default && packet?.Message == Game18NConstString.NoSpecialistCardEquipped); + await new Spec("Transforming while in vehicle should fail") + .Given(CharacterIsInVehicle) + .And(CharacterHasSpEquipped) + .WhenAsync(AttemptingToTransform) + .Then(ShouldReceiveCantUseInVehicleMessage) + .ExecuteAsync(); } [TestMethod] - public async Task Test_Transform_VehicleAsync() + public async Task TransformingWhileSittingShouldBeIgnored() { - _session!.Character.IsVehicled = true; - _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item!.Create(912, 1), - _session.Character.CharacterId)); - var item = _session.Character.InventoryService.First(); - item.Value.Type = NoscorePocketType.Wear; - item.Value.Slot = (byte)EquipmentType.Sp; - await _spTransformPacketHandler!.ExecuteAsync(new SpTransformPacket { Type = SlPacketType.WearSp }, _session); - var packet = (MsgiPacket?)_session.LastPackets.FirstOrDefault(s => s is MsgiPacket); - Assert.IsTrue(packet?.Message == Game18NConstString.CantUseInVehicle); + await new Spec("Transforming while sitting should be ignored") + .Given(CharacterIsSitting) + .WhenAsync(AttemptingToTransform) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); } + [TestMethod] + public async Task RemovingSpWhileTransformedShouldUntransform() + { + await new Spec("Removing sp while transformed should untransform") + .Given(CharacterHasSpEquipped) + .And(CharacterIsTransformed) + .WhenAsync(AttemptingToTransformWithWearAndTransform) + .Then(CharacterShouldNotBeTransformed) + .ExecuteAsync(); + } [TestMethod] - public async Task Test_Transform_SittedAsync() + public async Task TransformingWithSpPointsAndReputationShouldSucceed() { - _session!.Character.IsSitting = true; - await _spTransformPacketHandler!.ExecuteAsync(new SpTransformPacket { Type = SlPacketType.WearSp }, _session); - Assert.IsNull(_session.LastPackets.FirstOrDefault()); + await new Spec("Transforming with sp points and reputation should succeed") + .Given(CharacterHasSpPoints) + .And(CharacterHasHighReputation) + .And(CharacterHasSpEquipped) + .WhenAsync(AttemptingToTransformWithWearAndTransform) + .Then(CharacterShouldBeTransformed) + .ExecuteAsync(); } [TestMethod] - public async Task Test_RemoveSpAsync() + public async Task TransformingWithBadFairyElementShouldFail() { - _session!.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item!.Create(912, 1), - _session.Character.CharacterId)); - var item = _session.Character.InventoryService.First(); - _session.Character.UseSp = true; - item.Value.Type = NoscorePocketType.Wear; - item.Value.Slot = (byte)EquipmentType.Sp; - await _spTransformPacketHandler!.ExecuteAsync(new SpTransformPacket { Type = SlPacketType.WearSpAndTransform }, _session); - Assert.IsFalse(_session.Character.UseSp); + await new Spec("Transforming with bad fairy element should fail") + .Given(CharacterHasSpPoints) + .And(CharacterHasHighReputation) + .And(CharacterHasSpAndMismatchedFairyEquipped) + .WhenAsync(AttemptingToTransformWithWearAndTransform) + .Then(ShouldReceiveDifferentElementMessage) + .ExecuteAsync(); + } + + [TestMethod] + public async Task TransformingWithLowReputationShouldFail() + { + await new Spec("Transforming with low reputation should fail") + .Given(CharacterHasSpPoints) + .And(CharacterHasSpEquipped) + .WhenAsync(AttemptingToTransformWithWearAndTransform) + .Then(ShouldReceiveLowReputationMessage) + .ExecuteAsync(); } [TestMethod] - public async Task Test_TransformAsync() + public async Task TransformingDuringCooldownShouldShowCooldownMessage() { - _session!.Character.SpPoint = 1; - _session.Character.Reput = 5000000; - _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item!.Create(912, 1), - _session.Character.CharacterId)); - var item = _session.Character.InventoryService.First(); + await new Spec("Transforming during cooldown should show cooldown message") + .Given(CharacterHasSpPoints) + .And(CharacterHasSpEquipped) + .And(CharacterHasSpCooldown) + .WhenAsync(AttemptingToTransformWithWearAndTransform) + .Then(ShouldReceiveCooldownMessage) + .ExecuteAsync(); + } + + [TestMethod] + public async Task TransformingWithoutSpPointsShouldShowNoPointsMessage() + { + await new Spec("Transforming without sp points should show no points message") + .Given(CharacterHasSpEquipped) + .And(CharacterHasLastSpSet) + .WhenAsync(AttemptingToTransformWithWearAndTransform) + .Then(ShouldReceiveNoSpPointsMessage) + .ExecuteAsync(); + } + + [TestMethod] + public async Task TransformingShouldShowDelayPacket() + { + await new Spec("Transforming should show delay packet") + .Given(CharacterHasSpPoints) + .And(CharacterHasSpEquipped) + .And(CharacterHasLastSpSet) + .WhenAsync(AttemptingToTransform) + .Then(ShouldReceiveDelayPacket) + .ExecuteAsync(); + } + + private void CharacterIsInVehicle() + { + Session.Character.IsVehicled = true; + } + + private void CharacterHasSpEquipped() + { + Session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(Item.Create(912, 1), Session.Character.CharacterId)); + var item = Session.Character.InventoryService.First(); item.Value.Type = NoscorePocketType.Wear; item.Value.Slot = (byte)EquipmentType.Sp; - await _spTransformPacketHandler!.ExecuteAsync(new SpTransformPacket { Type = SlPacketType.WearSpAndTransform }, _session); - Assert.IsTrue(_session.Character.UseSp); } - [TestMethod] - public async Task Test_Transform_BadFairyAsync() + private void CharacterIsSitting() + { + Session.Character.IsSitting = true; + } + + private void CharacterIsTransformed() + { + Session.Character.UseSp = true; + } + + private void CharacterHasSpPoints() { - _session!.Character.SpPoint = 1; - _session.Character.Reput = 5000000; - var item = _session.Character.InventoryService - .AddItemToPocket(InventoryItemInstance.Create(_item!.Create(912, 1), _session.Character.CharacterId))! + Session.Character.SpPoint = 1; + } + + private void CharacterHasHighReputation() + { + Session.Character.Reput = 5000000; + } + + private void CharacterHasSpAndMismatchedFairyEquipped() + { + var spItem = Session.Character.InventoryService + .AddItemToPocket(InventoryItemInstance.Create(Item.Create(912, 1), Session.Character.CharacterId))! .First(); - var fairy = _session.Character.InventoryService - .AddItemToPocket(InventoryItemInstance.Create(_item!.Create(2, 1), _session.Character.CharacterId))! + var fairy = Session.Character.InventoryService + .AddItemToPocket(InventoryItemInstance.Create(Item.Create(2, 1), Session.Character.CharacterId))! .First(); - item.Type = NoscorePocketType.Wear; - item.Slot = (byte)EquipmentType.Sp; + spItem.Type = NoscorePocketType.Wear; + spItem.Slot = (byte)EquipmentType.Sp; fairy.Type = NoscorePocketType.Wear; fairy.Slot = (byte)EquipmentType.Fairy; - await _spTransformPacketHandler!.ExecuteAsync(new SpTransformPacket { Type = SlPacketType.WearSpAndTransform }, _session); - var packet = (MsgiPacket?)_session.LastPackets.FirstOrDefault(s => s is MsgiPacket); - Assert.IsTrue(packet?.Message == Game18NConstString.SpecialistAndFairyDifferentElement); } - [TestMethod] - public async Task Test_Transform_BadReputAsync() + private void CharacterHasSpCooldown() { - _session!.Character.SpPoint = 1; - _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item!.Create(912, 1), - _session.Character.CharacterId)); - var item = _session.Character.InventoryService.First(); - item.Value.Type = NoscorePocketType.Wear; - item.Value.Slot = (byte)EquipmentType.Sp; - await _spTransformPacketHandler!.ExecuteAsync(new SpTransformPacket { Type = SlPacketType.WearSpAndTransform }, _session); - var packet = (SayiPacket?)_session.LastPackets.FirstOrDefault(s => s is SayiPacket); - Assert.IsTrue(packet?.VisualType == VisualType.Player && packet?.VisualId == _session.Character.CharacterId && packet?.Type == SayColorType.Yellow && packet?.Message == Game18NConstString.CanNotBeWornReputationLow); + Session.Character.LastSp = TestHelpers.Instance.Clock.GetCurrentInstant(); + Session.Character.SpCooldown = 30; } + private void CharacterHasLastSpSet() + { + Session.Character.LastSp = TestHelpers.Instance.Clock.GetCurrentInstant(); + } - [TestMethod] - public async Task Test_TransformBefore_CooldownAsync() - { - _session!.Character.SpPoint = 1; - _session.Character.LastSp = TestHelpers.Instance.Clock.GetCurrentInstant(); - _session.Character.SpCooldown = 30; - _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item!.Create(912, 1), - _session.Character.CharacterId)); - var item = _session.Character.InventoryService.First(); - item.Value.Type = NoscorePocketType.Wear; - item.Value.Slot = (byte)EquipmentType.Sp; - await _spTransformPacketHandler!.ExecuteAsync(new SpTransformPacket { Type = SlPacketType.WearSpAndTransform }, _session); - var packet = (MsgiPacket?)_session.LastPackets.FirstOrDefault(s => s is MsgiPacket); - Assert.IsTrue(packet?.Type == MessageType.Default && packet?.Message == Game18NConstString.CantTrasformWithSideEffect && packet?.ArgumentType == 4 && (short?)packet?.Game18NArguments[0] == 30); + private async Task AttemptingToTransform() + { + await SpTransformPacketHandler.ExecuteAsync(new SpTransformPacket { Type = SlPacketType.WearSp }, Session); } - [TestMethod] - public async Task Test_Transform_OutOfSpPointAsync() + private async Task AttemptingToTransformWithWearAndTransform() { - _session!.Character.LastSp = TestHelpers.Instance.Clock.GetCurrentInstant(); - _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item!.Create(912, 1), - _session.Character.CharacterId)); - var item = _session.Character.InventoryService.First(); - item.Value.Type = NoscorePocketType.Wear; - item.Value.Slot = (byte)EquipmentType.Sp; - await _spTransformPacketHandler!.ExecuteAsync(new SpTransformPacket { Type = SlPacketType.WearSpAndTransform }, _session); - var packet = (MsgPacket?)_session.LastPackets.FirstOrDefault(s => s is MsgPacket); - Assert.IsTrue(packet?.Message == - TestHelpers.Instance.GameLanguageLocalizer[LanguageKey.SP_NOPOINTS, _session.Account.Language]); + await SpTransformPacketHandler.ExecuteAsync(new SpTransformPacket { Type = SlPacketType.WearSpAndTransform }, Session); } - [TestMethod] - public async Task Test_Transform_DelayAsync() + private void ShouldReceiveNoSpEquippedMessage() { - _session!.Character.SpPoint = 1; - _session.Character.LastSp = TestHelpers.Instance.Clock.GetCurrentInstant(); - _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item!.Create(912, 1), - _session.Character.CharacterId)); - var item = _session.Character.InventoryService.First(); - item.Value.Type = NoscorePocketType.Wear; - item.Value.Slot = (byte)EquipmentType.Sp; - await _spTransformPacketHandler!.ExecuteAsync(new SpTransformPacket { Type = SlPacketType.WearSp }, _session); - var packet = (DelayPacket?)_session.LastPackets.FirstOrDefault(s => s is DelayPacket); + var packet = (MsgiPacket?)Session.LastPackets.FirstOrDefault(s => s is MsgiPacket); + Assert.IsTrue(packet?.Type == MessageType.Default && packet?.Message == Game18NConstString.NoSpecialistCardEquipped); + } + + private void ShouldReceiveCantUseInVehicleMessage() + { + var packet = (MsgiPacket?)Session.LastPackets.FirstOrDefault(s => s is MsgiPacket); + Assert.IsTrue(packet?.Message == Game18NConstString.CantUseInVehicle); + } + + private void NoPacketShouldBeSent() + { + Assert.IsNull(Session.LastPackets.FirstOrDefault()); + } + + private void CharacterShouldNotBeTransformed() + { + Assert.IsFalse(Session.Character.UseSp); + } + + private void CharacterShouldBeTransformed() + { + Assert.IsTrue(Session.Character.UseSp); + } + + private void ShouldReceiveDifferentElementMessage() + { + var packet = (MsgiPacket?)Session.LastPackets.FirstOrDefault(s => s is MsgiPacket); + Assert.IsTrue(packet?.Message == Game18NConstString.SpecialistAndFairyDifferentElement); + } + + private void ShouldReceiveLowReputationMessage() + { + var packet = (SayiPacket?)Session.LastPackets.FirstOrDefault(s => s is SayiPacket); + Assert.IsTrue(packet?.VisualType == VisualType.Player && + packet?.VisualId == Session.Character.CharacterId && + packet?.Type == SayColorType.Yellow && + packet?.Message == Game18NConstString.CanNotBeWornReputationLow); + } + + private void ShouldReceiveCooldownMessage() + { + var packet = (MsgiPacket?)Session.LastPackets.FirstOrDefault(s => s is MsgiPacket); + Assert.IsTrue(packet?.Type == MessageType.Default && + packet?.Message == Game18NConstString.CantTrasformWithSideEffect && + packet?.ArgumentType == 4 && + (short?)packet?.Game18NArguments[0] == 30); + } + + private void ShouldReceiveNoSpPointsMessage() + { + var packet = (MsgPacket?)Session.LastPackets.FirstOrDefault(s => s is MsgPacket); + Assert.IsTrue(packet?.Message == TestHelpers.Instance.GameLanguageLocalizer[LanguageKey.SP_NOPOINTS, Session.Account.Language]); + } + + private void ShouldReceiveDelayPacket() + { + var packet = (DelayPacket?)Session.LastPackets.FirstOrDefault(s => s is DelayPacket); Assert.IsTrue(packet?.Delay == 5000); } } -} \ No newline at end of file +} diff --git a/test/NosCore.PacketHandlers.Tests/Inventory/UseItemPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Inventory/UseItemPacketHandlerTests.cs index dd506e346..9cb415259 100644 --- a/test/NosCore.PacketHandlers.Tests/Inventory/UseItemPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Inventory/UseItemPacketHandlerTests.cs @@ -2,18 +2,18 @@ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . @@ -30,81 +30,105 @@ using NosCore.Packets.ServerPackets.UI; using NosCore.Shared.Enumerations; using NosCore.Tests.Shared; +using SpecLight; namespace NosCore.PacketHandlers.Tests.Inventory { [TestClass] public class UseItemPacketHandlerTests { - private IItemGenerationService? _item; - private ClientSession? _session; - private UseItemPacketHandler? _useItemPacketHandler; + private IItemGenerationService Item = null!; + private ClientSession Session = null!; + private UseItemPacketHandler UseItemPacketHandler = null!; [TestInitialize] public async Task SetupAsync() { await TestHelpers.ResetAsync(); - _item = TestHelpers.Instance.GenerateItemProvider(); - _session = await TestHelpers.Instance.GenerateSessionAsync(); - _useItemPacketHandler = new UseItemPacketHandler(); + Item = TestHelpers.Instance.GenerateItemProvider(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + UseItemPacketHandler = new UseItemPacketHandler(); } [TestMethod] - public async Task Test_BindingAsync() + public async Task UsingItemShouldBindToCharacter() { - _session!.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item!.Create(1, 1), 0)); - await _useItemPacketHandler!.ExecuteAsync(new UseItemPacket { Slot = 0, Type = PocketType.Equipment, Mode = 1 }, - _session); - - Assert.IsTrue(_session.Character.InventoryService.Any(s => - (s.Value.ItemInstance.ItemVNum == 1) && (s.Value.Type == NoscorePocketType.Wear) && - (s.Value.ItemInstance.BoundCharacterId == _session.Character.VisualId))); + await new Spec("Using item should bind to character") + .Given(CharacterHasEquipmentItem) + .WhenAsync(UsingItemWithBinding) + .Then(ItemShouldBeWornAndBound) + .ExecuteAsync(); } [TestMethod] - public async Task Test_Increment_SpAdditionPointsAsync() + public async Task UsingSpScrollShouldIncrementAdditionPoints() { - _session!.Character.SpAdditionPoint = 0; - _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item!.Create(1078, 1), 0)); - var item = _session.Character.InventoryService.First(); - await _useItemPacketHandler!.ExecuteAsync(new UseItemPacket - { - VisualType = VisualType.Player, - VisualId = 1, - Type = (PocketType)item.Value.Type, - Slot = item.Value.Slot, - Mode = 0, - Parameter = 0 - }, _session); - Assert.IsTrue((_session.Character.SpAdditionPoint != 0) && !_session.LastPackets.Any(s => s is MsgiPacket)); + await new Spec("Using sp scroll should increment addition points") + .Given(CharacterHasZeroSpAdditionPoints) + .And(CharacterHasSpScroll) + .WhenAsync(UsingSpScroll) + .Then(SpAdditionPointsShouldIncrease) + .And(NoErrorMessageShouldBeSent) + .ExecuteAsync(); } [TestMethod] - public async Task Test_Overflow_SpAdditionPointsAsync() + public async Task UsingSpScrollAtMaxShouldShowError() { - _session!.Character.SpAdditionPoint = TestHelpers.Instance.WorldConfiguration.Value.MaxAdditionalSpPoints; - _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item!.Create(1078, 1), 0)); - var item = _session.Character.InventoryService.First(); - await _useItemPacketHandler!.ExecuteAsync(new UseItemPacket - { - VisualType = VisualType.Player, - VisualId = 1, - Type = (PocketType)item.Value.Type, - Slot = item.Value.Slot, - Mode = 0, - Parameter = 0 - }, _session); - var packet = (MsgiPacket?)_session.LastPackets.FirstOrDefault(s => s is MsgiPacket); - Assert.IsTrue(packet?.Type == MessageType.Default && packet?.Message == Game18NConstString.CannotBeUsedExceedsCapacity); + await new Spec("Using sp scroll at max should show error") + .Given(CharacterHasMaxSpAdditionPoints) + .And(CharacterHasSpScroll) + .WhenAsync(UsingSpScroll) + .Then(ShouldReceiveCapacityExceededMessage) + .ExecuteAsync(); } [TestMethod] - public async Task Test_CloseToLimit_SpAdditionPointsAsync() + public async Task UsingSpScrollCloseToLimitShouldCapAtMax() { - _session!.Character.SpAdditionPoint = TestHelpers.Instance.WorldConfiguration.Value.MaxAdditionalSpPoints - 1; - _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item!.Create(1078, 1), 0)); - var item = _session.Character.InventoryService.First(); - await _useItemPacketHandler!.ExecuteAsync(new UseItemPacket + await new Spec("Using sp scroll close to limit should cap at max") + .Given(CharacterHasAlmostMaxSpAdditionPoints) + .And(CharacterHasSpScroll) + .WhenAsync(UsingSpScroll) + .Then(SpAdditionPointsShouldBeAtMax) + .And(NoErrorMessageShouldBeSent) + .ExecuteAsync(); + } + + private void CharacterHasEquipmentItem() + { + Session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(Item.Create(1, 1), 0)); + } + + private void CharacterHasZeroSpAdditionPoints() + { + Session.Character.SpAdditionPoint = 0; + } + + private void CharacterHasSpScroll() + { + Session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(Item.Create(1078, 1), 0)); + } + + private void CharacterHasMaxSpAdditionPoints() + { + Session.Character.SpAdditionPoint = TestHelpers.Instance.WorldConfiguration.Value.MaxAdditionalSpPoints; + } + + private void CharacterHasAlmostMaxSpAdditionPoints() + { + Session.Character.SpAdditionPoint = TestHelpers.Instance.WorldConfiguration.Value.MaxAdditionalSpPoints - 1; + } + + private async Task UsingItemWithBinding() + { + await UseItemPacketHandler.ExecuteAsync(new UseItemPacket { Slot = 0, Type = PocketType.Equipment, Mode = 1 }, Session); + } + + private async Task UsingSpScroll() + { + var item = Session.Character.InventoryService.First(); + await UseItemPacketHandler.ExecuteAsync(new UseItemPacket { VisualType = VisualType.Player, VisualId = 1, @@ -112,9 +136,36 @@ public async Task Test_CloseToLimit_SpAdditionPointsAsync() Slot = item.Value.Slot, Mode = 0, Parameter = 0 - }, _session); - Assert.IsTrue((_session.Character.SpAdditionPoint == TestHelpers.Instance.WorldConfiguration.Value.MaxAdditionalSpPoints) && - !_session.LastPackets.Any(s => s is MsgiPacket)); + }, Session); + } + + private void ItemShouldBeWornAndBound() + { + Assert.IsTrue(Session.Character.InventoryService.Any(s => + s.Value.ItemInstance.ItemVNum == 1 && + s.Value.Type == NoscorePocketType.Wear && + s.Value.ItemInstance.BoundCharacterId == Session.Character.VisualId)); + } + + private void SpAdditionPointsShouldIncrease() + { + Assert.IsTrue(Session.Character.SpAdditionPoint != 0); + } + + private void SpAdditionPointsShouldBeAtMax() + { + Assert.AreEqual(TestHelpers.Instance.WorldConfiguration.Value.MaxAdditionalSpPoints, Session.Character.SpAdditionPoint); + } + + private void NoErrorMessageShouldBeSent() + { + Assert.IsFalse(Session.LastPackets.Any(s => s is MsgiPacket)); + } + + private void ShouldReceiveCapacityExceededMessage() + { + var packet = (MsgiPacket?)Session.LastPackets.FirstOrDefault(s => s is MsgiPacket); + Assert.IsTrue(packet?.Type == MessageType.Default && packet?.Message == Game18NConstString.CannotBeUsedExceedsCapacity); } } -} \ No newline at end of file +} diff --git a/test/NosCore.PacketHandlers.Tests/Inventory/WearPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Inventory/WearPacketHandlerTests.cs index 7b52898bd..cf532e8d2 100644 --- a/test/NosCore.PacketHandlers.Tests/Inventory/WearPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Inventory/WearPacketHandlerTests.cs @@ -2,18 +2,18 @@ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . @@ -41,6 +41,7 @@ using NosCore.Shared.Enumerations; using NosCore.Tests.Shared; using Serilog; +using SpecLight; namespace NosCore.PacketHandlers.Tests.Inventory { @@ -48,18 +49,17 @@ namespace NosCore.PacketHandlers.Tests.Inventory public class WearPacketHandlerTests { private static readonly ILogger Logger = new Mock().Object; - private IItemGenerationService? _item; - - private ClientSession? _session; - private WearPacketHandler? _wearPacketHandler; + private IItemGenerationService Item = null!; + private ClientSession Session = null!; + private WearPacketHandler WearPacketHandler = null!; [TestInitialize] public async Task SetupAsync() { await TestHelpers.ResetAsync(); - _item = TestHelpers.Instance.GenerateItemProvider(); - _session = await TestHelpers.Instance.GenerateSessionAsync(); - _wearPacketHandler = new WearPacketHandler(); + Item = TestHelpers.Instance.GenerateItemProvider(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + WearPacketHandler = new WearPacketHandler(); } [DataTestMethod] @@ -80,26 +80,21 @@ public async Task SetupAsync() [DataRow((int)EquipmentType.CostumeHat)] [DataRow((int)EquipmentType.WeaponSkin)] [DataRow((int)EquipmentType.WingSkin)] - public async Task Test_Wear_Put_Item_CorrectSlotAsync(int typeInt) + public async Task WearingItemShouldPutInCorrectSlot(int typeInt) { var type = (EquipmentType)typeInt; var items = new List { - new Item - { - Type = NoscorePocketType.Equipment, VNum = 1, EquipmentSlot = type, - Class = 31 //sum of all 2^class - } + new Item { Type = NoscorePocketType.Equipment, VNum = 1, EquipmentSlot = type, Class = 31 } }; - _item = new ItemGenerationService(items, new EventLoaderService, IUseItemEventHandler>( + Item = new ItemGenerationService(items, new EventLoaderService, IUseItemEventHandler>( new List>> {new WearEventHandler(Logger, TestHelpers.Instance.Clock, TestHelpers.Instance.LogLanguageLocalizer)}), Logger, TestHelpers.Instance.LogLanguageLocalizer); - _session!.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item.Create(1, 1), - _session.Character.CharacterId)); - await _wearPacketHandler!.ExecuteAsync(new WearPacket { InventorySlot = 0, Type = PocketType.Equipment }, _session); - Assert.IsTrue(_session.Character.InventoryService.All(s => - (s.Value.Slot == (short)type) && (s.Value.Type == NoscorePocketType.Wear))); + Session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(Item.Create(1, 1), Session.Character.CharacterId)); + await WearPacketHandler.ExecuteAsync(new WearPacket { InventorySlot = 0, Type = PocketType.Equipment }, Session); + Assert.IsTrue(Session.Character.InventoryService.All(s => + s.Value.Slot == (short)type && s.Value.Type == NoscorePocketType.Wear)); } [DataTestMethod] @@ -108,434 +103,465 @@ public async Task Test_Wear_Put_Item_CorrectSlotAsync(int typeInt) [DataRow((int)CharacterClassType.Mage)] [DataRow((int)CharacterClassType.MartialArtist)] [DataRow((int)CharacterClassType.Swordsman)] - public async Task Test_Wear_Put_Item_BadClassAsync(int characterClassInt) + public async Task WearingClassRestrictedItemShouldFailForWrongClass(int characterClassInt) { var classToTest = (CharacterClassType)characterClassInt; - _session!.Character.Class = classToTest; + Session.Character.Class = classToTest; var items = new List { new Item { Type = NoscorePocketType.Equipment, VNum = 1, EquipmentSlot = EquipmentType.MainWeapon, - Class = (byte) (31 - Math.Pow(2, (byte) classToTest)) + Class = (byte)(31 - Math.Pow(2, (byte)classToTest)) } }; - _item = new ItemGenerationService(items, new EventLoaderService, IUseItemEventHandler>( + Item = new ItemGenerationService(items, new EventLoaderService, IUseItemEventHandler>( new List>> {new WearEventHandler(Logger, TestHelpers.Instance.Clock, TestHelpers.Instance.LogLanguageLocalizer)}), Logger, TestHelpers.Instance.LogLanguageLocalizer); - _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item.Create(1, 1), - _session.Character.CharacterId)); - await _wearPacketHandler!.ExecuteAsync(new WearPacket { InventorySlot = 0, Type = PocketType.Equipment }, _session); - Assert.IsTrue(_session.Character.InventoryService.All(s => s.Value.Type == NoscorePocketType.Equipment)); - var packet = (SayiPacket?)_session.LastPackets.FirstOrDefault(s => s is SayiPacket); - Assert.IsTrue(packet?.VisualType == VisualType.Player && packet?.VisualId == _session.Character.CharacterId && packet?.Type == SayColorType.Yellow && packet?.Message == Game18NConstString.CanNotWearThat); - - foreach (var validClass in Enum.GetValues(typeof(CharacterClassType)).OfType() - .Where(s => s != classToTest).ToList()) - { - _session.Character.Class = validClass; - var item = _session.Character.InventoryService.First(); - await _wearPacketHandler.ExecuteAsync(new WearPacket { InventorySlot = 0, Type = PocketType.Equipment }, _session); - Assert.IsTrue(item.Value.Type == NoscorePocketType.Wear); - item.Value.Type = NoscorePocketType.Equipment; - item.Value.Slot = 0; - } + Session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(Item.Create(1, 1), Session.Character.CharacterId)); + await WearPacketHandler.ExecuteAsync(new WearPacket { InventorySlot = 0, Type = PocketType.Equipment }, Session); + Assert.IsTrue(Session.Character.InventoryService.All(s => s.Value.Type == NoscorePocketType.Equipment)); + var packet = (SayiPacket?)Session.LastPackets.FirstOrDefault(s => s is SayiPacket); + Assert.IsTrue(packet?.VisualType == VisualType.Player && packet?.VisualId == Session.Character.CharacterId && packet?.Type == SayColorType.Yellow && packet?.Message == Game18NConstString.CanNotWearThat); } - [DataTestMethod] [DataRow((int)GenderType.Female)] [DataRow((int)GenderType.Male)] - public async Task Test_Wear_Put_Item_BadGenderAsync(int genderToTestInt) + public async Task WearingGenderRestrictedItemShouldFailForWrongGender(int genderInt) { - var genderToTest = (GenderType)genderToTestInt; - _session!.Character.Gender = genderToTest; + var genderToTest = (GenderType)genderInt; + Session.Character.Gender = genderToTest; var items = new List { new Item { Type = NoscorePocketType.Equipment, VNum = 1, EquipmentSlot = EquipmentType.MainWeapon, - Sex = (byte) (3 - Math.Pow(2, (byte) genderToTest)) + Sex = (byte)(3 - Math.Pow(2, (byte)genderToTest)) } }; - _item = new ItemGenerationService(items, - new EventLoaderService, IUseItemEventHandler>(new List>> + Item = new ItemGenerationService(items, new EventLoaderService, IUseItemEventHandler>( + new List>> {new WearEventHandler(Logger, TestHelpers.Instance.Clock, TestHelpers.Instance.LogLanguageLocalizer)}), Logger, TestHelpers.Instance.LogLanguageLocalizer); - _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item.Create(1, 1), - _session.Character.CharacterId)); - await _wearPacketHandler!.ExecuteAsync(new WearPacket { InventorySlot = 0, Type = PocketType.Equipment }, _session); - Assert.IsTrue(_session.Character.InventoryService.All(s => s.Value.Type == NoscorePocketType.Equipment)); - var packet = (SayiPacket?)_session.LastPackets.FirstOrDefault(s => s is SayiPacket); - Assert.IsTrue(packet?.VisualType == VisualType.Player && packet?.VisualId == _session.Character.CharacterId && packet?.Type == SayColorType.Yellow && packet?.Message == Game18NConstString.CanNotWearThat); + Session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(Item.Create(1, 1), Session.Character.CharacterId)); + await WearPacketHandler.ExecuteAsync(new WearPacket { InventorySlot = 0, Type = PocketType.Equipment }, Session); + Assert.IsTrue(Session.Character.InventoryService.All(s => s.Value.Type == NoscorePocketType.Equipment)); + var packet = (SayiPacket?)Session.LastPackets.FirstOrDefault(s => s is SayiPacket); + Assert.IsTrue(packet?.VisualType == VisualType.Player && packet?.VisualId == Session.Character.CharacterId && packet?.Type == SayColorType.Yellow && packet?.Message == Game18NConstString.CanNotWearThat); + } - foreach (var validClass in Enum.GetValues(typeof(GenderType)).OfType() - .Where(s => s != genderToTest).ToList()) - { - _session.Character.Gender = validClass; - var item = _session.Character.InventoryService.First(); - await _wearPacketHandler.ExecuteAsync(new WearPacket { InventorySlot = 0, Type = PocketType.Equipment }, _session); - Assert.IsTrue(item.Value.Type == NoscorePocketType.Wear); - item.Value.Type = NoscorePocketType.Equipment; - item.Value.Slot = 0; - } + [TestMethod] + public async Task WearingItemWithLowJobLevelShouldFail() + { + await new Spec("Wearing item with low job level should fail") + .Given(CharacterHasLowJobLevel) + .And(CharacterHasItemRequiringJobLevel_, 3) + .WhenAsync(WearingItemAsync) + .Then(ItemShouldRemainInEquipment) + .And(ShouldReceiveDifferentClassMessage) + .ExecuteAsync(); } [TestMethod] - public async Task Test_Wear_BadJobLevelAsync() + public async Task WearingItemWithSufficientJobLevelShouldSucceed() { - _session!.Character.JobLevel = 1; - var items = new List - { - new Item - { - Type = NoscorePocketType.Equipment, VNum = 1, - EquipmentSlot = EquipmentType.MainWeapon, - LevelJobMinimum = 3 - } - }; - _item = new ItemGenerationService(items, - new EventLoaderService, IUseItemEventHandler>(new List>> - {new WearEventHandler(Logger, TestHelpers.Instance.Clock, TestHelpers.Instance.LogLanguageLocalizer)}), Logger, TestHelpers.Instance.LogLanguageLocalizer); - _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item.Create(1, 1), - _session.Character.CharacterId)); - await _wearPacketHandler!.ExecuteAsync(new WearPacket { InventorySlot = 0, Type = PocketType.Equipment }, _session); - Assert.IsTrue(_session.Character.InventoryService.All(s => s.Value.Type == NoscorePocketType.Equipment)); - var packet = (MsgiPacket?)_session.LastPackets.FirstOrDefault(s => s is MsgiPacket); - Assert.IsTrue(packet?.Message == Game18NConstString.CanNotBeWornDifferentClass); + await new Spec("Wearing item with sufficient job level should succeed") + .Given(CharacterHasSufficientJobLevel) + .And(CharacterHasItemRequiringJobLevel_, 3) + .WhenAsync(WearingItemAsync) + .Then(ItemShouldBeWorn) + .ExecuteAsync(); } [TestMethod] - public async Task Test_Wear_GoodJobLevelAsync() + public async Task WearingItemWithLowLevelShouldFail() { - _session!.Character.JobLevel = 3; - var items = new List - { - new Item - { - Type = NoscorePocketType.Equipment, VNum = 1, - EquipmentSlot = EquipmentType.MainWeapon, - LevelJobMinimum = 3 - } - }; - _item = new ItemGenerationService(items, new EventLoaderService, IUseItemEventHandler>( - new List>> - {new WearEventHandler(Logger, TestHelpers.Instance.Clock, TestHelpers.Instance.LogLanguageLocalizer)}), Logger, TestHelpers.Instance.LogLanguageLocalizer); - _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item.Create(1, 1), - _session.Character.CharacterId)); - await _wearPacketHandler!.ExecuteAsync(new WearPacket { InventorySlot = 0, Type = PocketType.Equipment }, _session); - Assert.IsTrue(_session.Character.InventoryService.All(s => s.Value.Type == NoscorePocketType.Wear)); + await new Spec("Wearing item with low level should fail") + .Given(CharacterHasLowLevel) + .And(CharacterHasItemRequiringLevel_, 3) + .WhenAsync(WearingItemAsync) + .Then(ItemShouldRemainInEquipment) + .And(ShouldReceiveCantWearMessage) + .ExecuteAsync(); } [TestMethod] - public async Task Test_Wear_BadLevelAsync() + public async Task WearingItemWithSufficientLevelShouldSucceed() { - _session!.Character.Level = 1; - var items = new List - { - new Item - { - Type = NoscorePocketType.Equipment, VNum = 1, - EquipmentSlot = EquipmentType.MainWeapon, - LevelMinimum = 3 - } - }; - _item = new ItemGenerationService(items, new EventLoaderService, IUseItemEventHandler>( - new List>> - {new WearEventHandler(Logger, TestHelpers.Instance.Clock, TestHelpers.Instance.LogLanguageLocalizer)}), Logger, TestHelpers.Instance.LogLanguageLocalizer); - _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item.Create(1, 1), - _session.Character.CharacterId)); - await _wearPacketHandler!.ExecuteAsync(new WearPacket { InventorySlot = 0, Type = PocketType.Equipment }, _session); - Assert.IsTrue(_session.Character.InventoryService.All(s => s.Value.Type == NoscorePocketType.Equipment)); - var packet = (SayiPacket?)_session.LastPackets.FirstOrDefault(s => s is SayiPacket); - Assert.IsTrue(packet?.VisualType == VisualType.Player && packet?.VisualId == _session.Character.CharacterId && packet?.Type == SayColorType.Yellow && packet?.Message == Game18NConstString.CanNotWearThat); + await new Spec("Wearing item with sufficient level should succeed") + .Given(CharacterHasSufficientLevel) + .And(CharacterHasItemRequiringLevel_, 3) + .WhenAsync(WearingItemAsync) + .Then(ItemShouldBeWorn) + .ExecuteAsync(); } [TestMethod] - public async Task Test_Wear_GoodLevelAsync() + public async Task WearingHeroicItemWithLowHeroLevelShouldFail() { - _session!.Character.Level = 3; - var items = new List - { - new Item - { - Type = NoscorePocketType.Equipment, VNum = 1, - EquipmentSlot = EquipmentType.MainWeapon, - LevelMinimum = 3 - } - }; - _item = new ItemGenerationService(items, - new EventLoaderService, IUseItemEventHandler>(new List>> - {new WearEventHandler(Logger, TestHelpers.Instance.Clock, TestHelpers.Instance.LogLanguageLocalizer)}), Logger, TestHelpers.Instance.LogLanguageLocalizer); - _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item.Create(1, 1), - _session.Character.CharacterId)); - await _wearPacketHandler!.ExecuteAsync(new WearPacket { InventorySlot = 0, Type = PocketType.Equipment }, _session); - Assert.IsTrue(_session.Character.InventoryService.All(s => s.Value.Type == NoscorePocketType.Wear)); + await new Spec("Wearing heroic item with low hero level should fail") + .Given(CharacterHasLowHeroLevel) + .And(CharacterHasHeroicItemRequiringLevel_, 3) + .WhenAsync(WearingItemAsync) + .Then(ItemShouldRemainInEquipment) + .And(ShouldReceiveCantWearMessage) + .ExecuteAsync(); + } + + [TestMethod] + public async Task WearingHeroicItemWithSufficientHeroLevelShouldSucceed() + { + await new Spec("Wearing heroic item with sufficient hero level should succeed") + .Given(CharacterHasSufficientHeroLevel) + .And(CharacterHasHeroicItemRequiringLevel_, 3) + .WhenAsync(WearingItemAsync) + .Then(ItemShouldBeWorn) + .ExecuteAsync(); + } + + [TestMethod] + public async Task WearingDestroyedSpShouldFail() + { + await new Spec("Wearing destroyed sp should fail") + .Given(CharacterHasDestroyedSp) + .WhenAsync(WearingItemAsync) + .Then(ItemShouldRemainInEquipment) + .And(ShouldReceiveSoulDestroyedMessage) + .ExecuteAsync(); } [TestMethod] - public async Task Test_Wear_BadHeroLevelAsync() + public async Task WearingSpWhileTransformedShouldFail() + { + await new Spec("Wearing sp while transformed should fail") + .Given(CharacterHasTwoSpItems) + .AndAsync(CharacterWearsFirstSpAndTransformsAsync) + .WhenAsync(WearingSecondItemAsync) + .Then(SecondSpShouldRemainInEquipment) + .And(ShouldReceiveSpTransformedMessage) + .ExecuteAsync(); + } + + [TestMethod] + public async Task WearingSpDuringCooldownShouldFail() + { + await new Spec("Wearing sp during cooldown should fail") + .Given(CharacterHasTwoSpItems) + .AndAsync(CharacterWearsFirstSpWithCooldownAsync) + .WhenAsync(WearingSecondItemAsync) + .Then(SecondSpShouldRemainInEquipment) + .And(ShouldReceiveCooldownMessage) + .ExecuteAsync(); + } + + [TestMethod] + public async Task WearingFairyWithWrongElementWhileSpInUseShouldFail() + { + await new Spec("Wearing fairy with wrong element while sp in use should fail") + .Given(CharacterHasSpWithFireElementAndLightFairy) + .AndAsync(CharacterTransformsWithSpAsync) + .WhenAsync(WearingItemAsync) + .Then(FairyShouldRemainInEquipment) + .And(ShouldReceiveDifferentElementMessage) + .ExecuteAsync(); + } + + [TestMethod] + public async Task WearingFairyWithMatchingPrimaryElementShouldSucceed() + { + await new Spec("Wearing fairy with matching primary element should succeed") + .Given(CharacterHasSpWithFireElementAndFireFairy) + .AndAsync(CharacterTransformsWithSpAsync) + .WhenAsync(WearingItemAsync) + .Then(FairyShouldBeWorn) + .ExecuteAsync(); + } + + [TestMethod] + public async Task WearingFairyWithMatchingSecondaryElementShouldSucceed() + { + await new Spec("Wearing fairy with matching secondary element should succeed") + .Given(CharacterHasSpWithFireAndWaterElementsAndWaterFairy) + .AndAsync(CharacterTransformsWithSpAsync) + .WhenAsync(WearingItemAsync) + .Then(FairyShouldBeWorn) + .ExecuteAsync(); + } + + [TestMethod] + public async Task WearingItemRequiringBindingShouldAskForConfirmation() + { + await new Spec("Wearing item requiring binding should ask for confirmation") + .Given(CharacterHasItemRequiringBinding) + .WhenAsync(WearingItemAsync) + .Then(ShouldReceiveBindingQuestion) + .And(ItemShouldRemainInEquipment) + .ExecuteAsync(); + } + + private void CharacterHasLowJobLevel() + { + Session.Character.JobLevel = 1; + } + + private void CharacterHasSufficientJobLevel() + { + Session.Character.JobLevel = 3; + } + + private void CharacterHasItemRequiringJobLevel_(int value) { - _session!.Character.HeroLevel = 1; var items = new List { - new Item - { - Type = NoscorePocketType.Equipment, VNum = 1, - EquipmentSlot = EquipmentType.MainWeapon, - IsHeroic = true, - LevelMinimum = 3 - } + new Item { Type = NoscorePocketType.Equipment, VNum = 1, EquipmentSlot = EquipmentType.MainWeapon, LevelJobMinimum = (byte)value } }; - _item = new ItemGenerationService(items, new EventLoaderService, IUseItemEventHandler>( + Item = new ItemGenerationService(items, new EventLoaderService, IUseItemEventHandler>( new List>> {new WearEventHandler(Logger, TestHelpers.Instance.Clock, TestHelpers.Instance.LogLanguageLocalizer)}), Logger, TestHelpers.Instance.LogLanguageLocalizer); - _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item.Create(1, 1), - _session.Character.CharacterId)); - await _wearPacketHandler!.ExecuteAsync(new WearPacket { InventorySlot = 0, Type = PocketType.Equipment }, _session); - Assert.IsTrue(_session.Character.InventoryService.All(s => s.Value.Type == NoscorePocketType.Equipment)); - var packet = (SayiPacket?)_session.LastPackets.FirstOrDefault(s => s is SayiPacket); - Assert.IsTrue(packet?.VisualType == VisualType.Player && packet?.VisualId == _session.Character.CharacterId && packet?.Type == SayColorType.Yellow && packet?.Message == Game18NConstString.CanNotWearThat); + Session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(Item.Create(1, 1), Session.Character.CharacterId)); } - [TestMethod] - public async Task Test_Wear_GoodHeroLevelAsync() + private void CharacterHasLowLevel() + { + Session.Character.Level = 1; + } + + private void CharacterHasSufficientLevel() + { + Session.Character.Level = 3; + } + + private void CharacterHasItemRequiringLevel_(int value) { - _session!.Character.HeroLevel = 3; var items = new List { - new Item - { - Type = NoscorePocketType.Equipment, VNum = 1, - EquipmentSlot = EquipmentType.MainWeapon, - IsHeroic = true, - LevelMinimum = 3 - } + new Item { Type = NoscorePocketType.Equipment, VNum = 1, EquipmentSlot = EquipmentType.MainWeapon, LevelMinimum = (byte)value } }; - _item = new ItemGenerationService(items, - new EventLoaderService, IUseItemEventHandler>(new List>> + Item = new ItemGenerationService(items, new EventLoaderService, IUseItemEventHandler>( + new List>> {new WearEventHandler(Logger, TestHelpers.Instance.Clock, TestHelpers.Instance.LogLanguageLocalizer)}), Logger, TestHelpers.Instance.LogLanguageLocalizer); - _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item.Create(1, 1), - _session.Character.CharacterId)); - await _wearPacketHandler!.ExecuteAsync(new WearPacket { InventorySlot = 0, Type = PocketType.Equipment }, _session); - Assert.IsTrue(_session.Character.InventoryService.All(s => s.Value.Type == NoscorePocketType.Wear)); + Session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(Item.Create(1, 1), Session.Character.CharacterId)); } - [TestMethod] - public async Task Test_Wear_DestroyedSpAsync() + private void CharacterHasLowHeroLevel() + { + Session.Character.HeroLevel = 1; + } + + private void CharacterHasSufficientHeroLevel() + { + Session.Character.HeroLevel = 3; + } + + private void CharacterHasHeroicItemRequiringLevel_(int value) { - _session!.Character.HeroLevel = 1; var items = new List { - new Item - { - Type = NoscorePocketType.Equipment, VNum = 1, - EquipmentSlot = EquipmentType.Sp - } + new Item { Type = NoscorePocketType.Equipment, VNum = 1, EquipmentSlot = EquipmentType.MainWeapon, IsHeroic = true, LevelMinimum = (byte)value } }; - _item = new ItemGenerationService(items, - new EventLoaderService, IUseItemEventHandler>(new List>> + Item = new ItemGenerationService(items, new EventLoaderService, IUseItemEventHandler>( + new List>> {new WearEventHandler(Logger, TestHelpers.Instance.Clock, TestHelpers.Instance.LogLanguageLocalizer)}), Logger, TestHelpers.Instance.LogLanguageLocalizer); - _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item.Create(1, 1, -2), - _session.Character.CharacterId)); - await _wearPacketHandler!.ExecuteAsync(new WearPacket { InventorySlot = 0, Type = PocketType.Equipment }, _session); - - Assert.IsTrue(_session.Character.InventoryService.Any(s => s.Value.Type == NoscorePocketType.Equipment)); - var packet = (MsgiPacket?)_session.LastPackets.FirstOrDefault(s => s is MsgiPacket); - Assert.IsTrue(packet?.Type == MessageType.Default && packet?.Message == Game18NConstString.CantUseBecauseSoulDestroyed); + Session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(Item.Create(1, 1), Session.Character.CharacterId)); } - [TestMethod] - public async Task Test_Wear_SpInUseAsync() + private void CharacterHasDestroyedSp() { - _session!.Character.HeroLevel = 1; + Session.Character.HeroLevel = 1; var items = new List { - new Item - { - Type = NoscorePocketType.Equipment, VNum = 1, - EquipmentSlot = EquipmentType.Sp - }, - new Item - { - Type = NoscorePocketType.Equipment, VNum = 2, - EquipmentSlot = EquipmentType.Sp - } + new Item { Type = NoscorePocketType.Equipment, VNum = 1, EquipmentSlot = EquipmentType.Sp } }; - _item = new ItemGenerationService(items, - new EventLoaderService, IUseItemEventHandler>(new List>> + Item = new ItemGenerationService(items, new EventLoaderService, IUseItemEventHandler>( + new List>> {new WearEventHandler(Logger, TestHelpers.Instance.Clock, TestHelpers.Instance.LogLanguageLocalizer)}), Logger, TestHelpers.Instance.LogLanguageLocalizer); - _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item.Create(1, 1), - _session.Character.CharacterId)); - _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item.Create(2, 1), - _session.Character.CharacterId)); - await _wearPacketHandler!.ExecuteAsync(new WearPacket { InventorySlot = 0, Type = PocketType.Equipment }, _session); - _session.Character.UseSp = true; - await _wearPacketHandler.ExecuteAsync(new WearPacket { InventorySlot = 1, Type = PocketType.Equipment }, _session); - Assert.IsTrue(_session.Character.InventoryService.Any(s => - (s.Value.ItemInstance.ItemVNum == 2) && (s.Value.Type == NoscorePocketType.Equipment))); - var packet = (SayiPacket?)_session.LastPackets.FirstOrDefault(s => s is SayiPacket); - Assert.IsTrue(packet?.VisualType == VisualType.Player && packet?.VisualId == _session.Character.CharacterId && packet?.Type == SayColorType.Yellow && packet?.Message == Game18NConstString.SpecialistCardsCannotBeTradedWhileTransformed); + Session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(Item.Create(1, 1, -2), Session.Character.CharacterId)); } - [TestMethod] - public async Task Test_Wear_SpInLoadingAsync() + private void CharacterHasTwoSpItems() { - _session!.Character.HeroLevel = 1; + Session.Character.HeroLevel = 1; var items = new List { - new Item - { - Type = NoscorePocketType.Equipment, VNum = 1, - EquipmentSlot = EquipmentType.Sp - }, - new Item - { - Type = NoscorePocketType.Equipment, VNum = 2, - EquipmentSlot = EquipmentType.Sp - } + new Item { Type = NoscorePocketType.Equipment, VNum = 1, EquipmentSlot = EquipmentType.Sp }, + new Item { Type = NoscorePocketType.Equipment, VNum = 2, EquipmentSlot = EquipmentType.Sp } }; - _item = new ItemGenerationService(items, - new EventLoaderService, IUseItemEventHandler>(new List>> + Item = new ItemGenerationService(items, new EventLoaderService, IUseItemEventHandler>( + new List>> {new WearEventHandler(Logger, TestHelpers.Instance.Clock, TestHelpers.Instance.LogLanguageLocalizer)}), Logger, TestHelpers.Instance.LogLanguageLocalizer); - _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item.Create(1, 1), - _session.Character.CharacterId)); - _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item.Create(2, 1), - _session.Character.CharacterId)); - await _wearPacketHandler!.ExecuteAsync(new WearPacket { InventorySlot = 0, Type = PocketType.Equipment }, _session); - _session.Character.SpCooldown = 30; - _session.Character.LastSp = TestHelpers.Instance.Clock.GetCurrentInstant(); - await _wearPacketHandler.ExecuteAsync(new WearPacket { InventorySlot = 1, Type = PocketType.Equipment }, _session); - Assert.IsTrue(_session.Character.InventoryService.Any(s => - (s.Value.ItemInstance.ItemVNum == 2) && (s.Value.Type == NoscorePocketType.Equipment))); - var packet = (MsgiPacket?)_session.LastPackets.FirstOrDefault(s => s is MsgiPacket); - Assert.IsTrue(packet?.Type == MessageType.Default && packet?.Message == Game18NConstString.CantTrasformWithSideEffect && packet?.ArgumentType == 4 && (int?)packet?.Game18NArguments[0] == 30); + Session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(Item.Create(1, 1), Session.Character.CharacterId)); + Session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(Item.Create(2, 1), Session.Character.CharacterId)); } + private async Task CharacterWearsFirstSpAndTransformsAsync() + { + await WearPacketHandler.ExecuteAsync(new WearPacket { InventorySlot = 0, Type = PocketType.Equipment }, Session); + Session.Character.UseSp = true; + } - [TestMethod] - public async Task Test_Wear_WearFairy_SpUseBadElementAsync() + private async Task CharacterWearsFirstSpWithCooldownAsync() + { + await WearPacketHandler.ExecuteAsync(new WearPacket { InventorySlot = 0, Type = PocketType.Equipment }, Session); + Session.Character.SpCooldown = 30; + Session.Character.LastSp = TestHelpers.Instance.Clock.GetCurrentInstant(); + } + + private void CharacterHasSpWithFireElementAndLightFairy() { var items = new List { - new Item - { - Type = NoscorePocketType.Equipment, VNum = 1, EquipmentSlot = EquipmentType.Fairy, - Element = ElementType.Light - }, - new Item - { - Type = NoscorePocketType.Equipment, VNum = 2, EquipmentSlot = EquipmentType.Sp, - Element = ElementType.Fire, - SecondaryElement = ElementType.Water - } + new Item { Type = NoscorePocketType.Equipment, VNum = 1, EquipmentSlot = EquipmentType.Fairy, Element = ElementType.Light }, + new Item { Type = NoscorePocketType.Equipment, VNum = 2, EquipmentSlot = EquipmentType.Sp, Element = ElementType.Fire, SecondaryElement = ElementType.Water } }; - _item = new ItemGenerationService(items, - new EventLoaderService, IUseItemEventHandler>(new List>> + Item = new ItemGenerationService(items, new EventLoaderService, IUseItemEventHandler>( + new List>> {new WearEventHandler(Logger, TestHelpers.Instance.Clock, TestHelpers.Instance.LogLanguageLocalizer)}), Logger, TestHelpers.Instance.LogLanguageLocalizer); - _session!.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item.Create(1, 1), - _session.Character.CharacterId)); - _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item.Create(2, 1), - _session.Character.CharacterId)); - await _wearPacketHandler!.ExecuteAsync(new WearPacket { InventorySlot = 1, Type = PocketType.Equipment }, _session); - _session.Character.UseSp = true; - await _wearPacketHandler.ExecuteAsync(new WearPacket { InventorySlot = 0, Type = PocketType.Equipment }, _session); - Assert.IsTrue(_session.Character.InventoryService.Any(s => - (s.Value.ItemInstance.ItemVNum == 1) && (s.Value.Type == NoscorePocketType.Equipment))); - var packet = (MsgiPacket?)_session.LastPackets.FirstOrDefault(s => s is MsgiPacket); - Assert.IsTrue(packet?.Message == Game18NConstString.SpecialistAndFairyDifferentElement); + Session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(Item.Create(1, 1), Session.Character.CharacterId)); + Session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(Item.Create(2, 1), Session.Character.CharacterId)); } - [TestMethod] - public async Task Test_Wear_WearFairy_SpUseGoodElementAsync() + private void CharacterHasSpWithFireElementAndFireFairy() { var items = new List { - new Item - { - Type = NoscorePocketType.Equipment, VNum = 1, EquipmentSlot = EquipmentType.Fairy, - Element = ElementType.Fire - }, - new Item - { - Type = NoscorePocketType.Equipment, VNum = 2, EquipmentSlot = EquipmentType.Sp, - Element = ElementType.Fire, - SecondaryElement = ElementType.Water - } + new Item { Type = NoscorePocketType.Equipment, VNum = 1, EquipmentSlot = EquipmentType.Fairy, Element = ElementType.Fire }, + new Item { Type = NoscorePocketType.Equipment, VNum = 2, EquipmentSlot = EquipmentType.Sp, Element = ElementType.Fire, SecondaryElement = ElementType.Water } }; - _item = new ItemGenerationService(items, - new EventLoaderService, IUseItemEventHandler>(new List>> + Item = new ItemGenerationService(items, new EventLoaderService, IUseItemEventHandler>( + new List>> {new WearEventHandler(Logger, TestHelpers.Instance.Clock, TestHelpers.Instance.LogLanguageLocalizer)}), Logger, TestHelpers.Instance.LogLanguageLocalizer); - _session!.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item.Create(1, 1), - _session.Character.CharacterId)); - _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item.Create(2, 1), - _session.Character.CharacterId)); - await _wearPacketHandler!.ExecuteAsync(new WearPacket { InventorySlot = 1, Type = PocketType.Equipment }, _session); - _session.Character.UseSp = true; - await _wearPacketHandler.ExecuteAsync(new WearPacket { InventorySlot = 0, Type = PocketType.Equipment }, _session); - Assert.IsTrue( - _session.Character.InventoryService.Any(s => - (s.Value.ItemInstance.ItemVNum == 1) && (s.Value.Type == NoscorePocketType.Wear))); + Session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(Item.Create(1, 1), Session.Character.CharacterId)); + Session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(Item.Create(2, 1), Session.Character.CharacterId)); } - [TestMethod] - public async Task Test_Wear_WearFairy_SpUseGoodSecondElementAsync() + private void CharacterHasSpWithFireAndWaterElementsAndWaterFairy() { var items = new List { - new Item - { - Type = NoscorePocketType.Equipment, VNum = 1, EquipmentSlot = EquipmentType.Fairy, - Element = ElementType.Water - }, - new Item - { - Type = NoscorePocketType.Equipment, VNum = 2, EquipmentSlot = EquipmentType.Sp, - Element = ElementType.Fire, - SecondaryElement = ElementType.Water - } + new Item { Type = NoscorePocketType.Equipment, VNum = 1, EquipmentSlot = EquipmentType.Fairy, Element = ElementType.Water }, + new Item { Type = NoscorePocketType.Equipment, VNum = 2, EquipmentSlot = EquipmentType.Sp, Element = ElementType.Fire, SecondaryElement = ElementType.Water } }; - _item = new ItemGenerationService(items, new EventLoaderService, IUseItemEventHandler>( + Item = new ItemGenerationService(items, new EventLoaderService, IUseItemEventHandler>( new List>> {new WearEventHandler(Logger, TestHelpers.Instance.Clock, TestHelpers.Instance.LogLanguageLocalizer)}), Logger, TestHelpers.Instance.LogLanguageLocalizer); - _session!.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item.Create(1, 1), - _session.Character.CharacterId)); - _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item.Create(2, 1), - _session.Character.CharacterId)); - await _wearPacketHandler!.ExecuteAsync(new WearPacket { InventorySlot = 1, Type = PocketType.Equipment }, _session); - _session.Character.UseSp = true; - await _wearPacketHandler!.ExecuteAsync(new WearPacket { InventorySlot = 0, Type = PocketType.Equipment }, _session); - Assert.IsTrue( - _session.Character.InventoryService.Any(s => - (s.Value.ItemInstance?.ItemVNum == 1) && (s.Value.Type == NoscorePocketType.Wear))); + Session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(Item.Create(1, 1), Session.Character.CharacterId)); + Session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(Item.Create(2, 1), Session.Character.CharacterId)); } - [TestMethod] - public async Task Test_Binding_RequiredAsync() + private async Task CharacterTransformsWithSpAsync() + { + await WearPacketHandler.ExecuteAsync(new WearPacket { InventorySlot = 1, Type = PocketType.Equipment }, Session); + Session.Character.UseSp = true; + } + + private void CharacterHasItemRequiringBinding() { var items = new List { - new Item {Type = NoscorePocketType.Equipment, VNum = 1, RequireBinding = true} + new Item { Type = NoscorePocketType.Equipment, VNum = 1, RequireBinding = true } }; - _item = new ItemGenerationService(items, - new EventLoaderService, IUseItemEventHandler>(new List>> + Item = new ItemGenerationService(items, new EventLoaderService, IUseItemEventHandler>( + new List>> {new WearEventHandler(Logger, TestHelpers.Instance.Clock, TestHelpers.Instance.LogLanguageLocalizer)}), Logger, TestHelpers.Instance.LogLanguageLocalizer); - _session!.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(_item.Create(1, 1), - _session.Character.CharacterId)); - await _wearPacketHandler!.ExecuteAsync(new WearPacket { InventorySlot = 0, Type = PocketType.Equipment }, _session); + Session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(Item.Create(1, 1), Session.Character.CharacterId)); + } - var packet = (QnaPacket?)_session.LastPackets.FirstOrDefault(s => s is QnaPacket); - Assert.IsTrue(packet?.YesPacket is UseItemPacket yespacket - && (yespacket.Slot == 0) - && (yespacket.Type == PocketType.Equipment) - && (packet.Question == _session.GetMessageFromKey(LanguageKey.ASK_BIND))); - Assert.IsTrue(_session.Character.InventoryService.Any(s => - (s.Value.ItemInstance.ItemVNum == 1) && (s.Value.Type == NoscorePocketType.Equipment))); + private async Task WearingItemAsync() + { + await WearPacketHandler.ExecuteAsync(new WearPacket { InventorySlot = 0, Type = PocketType.Equipment }, Session); + } + + private async Task WearingSecondItemAsync() + { + await WearPacketHandler.ExecuteAsync(new WearPacket { InventorySlot = 1, Type = PocketType.Equipment }, Session); + } + + private void ItemShouldRemainInEquipment() + { + Assert.IsTrue(Session.Character.InventoryService.All(s => s.Value.Type == NoscorePocketType.Equipment)); + } + + private void ItemShouldBeWorn() + { + Assert.IsTrue(Session.Character.InventoryService.All(s => s.Value.Type == NoscorePocketType.Wear)); + } + + private void SecondSpShouldRemainInEquipment() + { + Assert.IsTrue(Session.Character.InventoryService.Any(s => + s.Value.ItemInstance.ItemVNum == 2 && s.Value.Type == NoscorePocketType.Equipment)); + } + + private void FairyShouldRemainInEquipment() + { + Assert.IsTrue(Session.Character.InventoryService.Any(s => + s.Value.ItemInstance.ItemVNum == 1 && s.Value.Type == NoscorePocketType.Equipment)); + } + + private void FairyShouldBeWorn() + { + Assert.IsTrue(Session.Character.InventoryService.Any(s => + s.Value.ItemInstance.ItemVNum == 1 && s.Value.Type == NoscorePocketType.Wear)); + } + + private void ShouldReceiveCantWearMessage() + { + var packet = (SayiPacket?)Session.LastPackets.FirstOrDefault(s => s is SayiPacket); + Assert.IsTrue(packet?.VisualType == VisualType.Player && + packet?.VisualId == Session.Character.CharacterId && + packet?.Type == SayColorType.Yellow && + packet?.Message == Game18NConstString.CanNotWearThat); + } + + private void ShouldReceiveDifferentClassMessage() + { + var packet = (MsgiPacket?)Session.LastPackets.FirstOrDefault(s => s is MsgiPacket); + Assert.IsTrue(packet?.Message == Game18NConstString.CanNotBeWornDifferentClass); + } + + private void ShouldReceiveSoulDestroyedMessage() + { + var packet = (MsgiPacket?)Session.LastPackets.FirstOrDefault(s => s is MsgiPacket); + Assert.IsTrue(packet?.Type == MessageType.Default && packet?.Message == Game18NConstString.CantUseBecauseSoulDestroyed); + } + + private void ShouldReceiveSpTransformedMessage() + { + var packet = (SayiPacket?)Session.LastPackets.FirstOrDefault(s => s is SayiPacket); + Assert.IsTrue(packet?.VisualType == VisualType.Player && + packet?.VisualId == Session.Character.CharacterId && + packet?.Type == SayColorType.Yellow && + packet?.Message == Game18NConstString.SpecialistCardsCannotBeTradedWhileTransformed); + } + + private void ShouldReceiveCooldownMessage() + { + var packet = (MsgiPacket?)Session.LastPackets.FirstOrDefault(s => s is MsgiPacket); + Assert.IsTrue(packet?.Type == MessageType.Default && + packet?.Message == Game18NConstString.CantTrasformWithSideEffect && + packet?.ArgumentType == 4 && + (int?)packet?.Game18NArguments[0] == 30); + } + + private void ShouldReceiveDifferentElementMessage() + { + var packet = (MsgiPacket?)Session.LastPackets.FirstOrDefault(s => s is MsgiPacket); + Assert.IsTrue(packet?.Message == Game18NConstString.SpecialistAndFairyDifferentElement); + } + + private void ShouldReceiveBindingQuestion() + { + var packet = (QnaPacket?)Session.LastPackets.FirstOrDefault(s => s is QnaPacket); + Assert.IsTrue(packet?.YesPacket is UseItemPacket yespacket && + yespacket.Slot == 0 && + yespacket.Type == PocketType.Equipment && + packet.Question == Session.GetMessageFromKey(LanguageKey.ASK_BIND)); } } -} \ No newline at end of file +} diff --git a/test/NosCore.PacketHandlers.Tests/Login/NoS0575PacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Login/NoS0575PacketHandlerTests.cs index 84bde42b9..c3861d4a9 100644 --- a/test/NosCore.PacketHandlers.Tests/Login/NoS0575PacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Login/NoS0575PacketHandlerTests.cs @@ -2,18 +2,18 @@ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . @@ -41,200 +41,265 @@ using NosCore.Shared.Enumerations; using NosCore.Tests.Shared; using Serilog; +using SpecLight; namespace NosCore.PacketHandlers.Tests.Login { [TestClass] - public class NoS0575PacketHandlerTests + public class NoS0575PacketHandlerSpecs { private static readonly ILogger Logger = new Mock().Object; - private string _password = null!; - private Mock? _authHttpClient; - private Mock? _pubSubHub; - private IOptions? _loginConfiguration; - private NoS0575PacketHandler? _noS0575PacketHandler; - private ClientSession? _session; - private Mock? _channelHub; - private SessionRefHolder? _sessionRefHolder; + private string Password = null!; + private Mock AuthHttpClient = null!; + private Mock PubSubHub = null!; + private IOptions LoginConfiguration = null!; + private NoS0575PacketHandler NoS0575PacketHandler = null!; + private ClientSession Session = null!; + private Mock ChannelHub = null!; + private SessionRefHolder SessionRefHolder = null!; [TestInitialize] public async Task SetupAsync() { - _password = new Sha512Hasher().Hash("test"); + Password = new Sha512Hasher().Hash("test"); await TestHelpers.ResetAsync(); - _session = await TestHelpers.Instance.GenerateSessionAsync(); - _authHttpClient = new Mock(); - _pubSubHub = TestHelpers.Instance.PubSubHub; - _loginConfiguration = Options.Create(new LoginConfiguration()); - _sessionRefHolder = new SessionRefHolder(); - _channelHub = new Mock(); - _sessionRefHolder![_session!.Channel!.Id] = new RegionTypeMapping(_session.SessionId, RegionType.EN); - _noS0575PacketHandler = new NoS0575PacketHandler(new LoginService(_loginConfiguration, + Session = await TestHelpers.Instance.GenerateSessionAsync(); + AuthHttpClient = new Mock(); + PubSubHub = TestHelpers.Instance.PubSubHub; + LoginConfiguration = Options.Create(new LoginConfiguration()); + SessionRefHolder = new SessionRefHolder(); + ChannelHub = new Mock(); + SessionRefHolder[Session.Channel!.Id] = new RegionTypeMapping(Session.SessionId, RegionType.EN); + NoS0575PacketHandler = new NoS0575PacketHandler(new LoginService(LoginConfiguration, TestHelpers.Instance.AccountDao, - _authHttpClient.Object, _pubSubHub.Object, _channelHub!.Object, TestHelpers.Instance.CharacterDao, _sessionRefHolder!), - _loginConfiguration, Logger, TestHelpers.Instance.LogLanguageLocalizer); + AuthHttpClient.Object, PubSubHub.Object, ChannelHub.Object, TestHelpers.Instance.CharacterDao, SessionRefHolder), + LoginConfiguration, Logger, TestHelpers.Instance.LogLanguageLocalizer); } [TestMethod] - public async Task LoginOldClientAsync() + public async Task LoginWithOldClientShouldFail() { - _loginConfiguration!.Value.ClientVersion = new ClientVersionSubPacket { Major = 1 }; - await _noS0575PacketHandler!.ExecuteAsync(new NoS0575Packet - { - Password = _password, - Username = _session!.Account.Name.ToUpperInvariant() - }, _session); - - Assert.IsTrue(((FailcPacket?)_session.LastPackets.FirstOrDefault(s => s is FailcPacket))?.Type == - LoginFailType.OldClient); + await new Spec("Login with old client should fail") + .Given(ClientVersionIsSet) + .WhenAsync(LoggingInWithUppercaseNameAsync) + .Then(ShouldReceiveOldClientError) + .ExecuteAsync(); } [TestMethod] - public async Task LoginOldAuthWithNewAuthEnforcedAsync() + public async Task LoginWithOldAuthWhenNewEnforcedShouldFail() { - _loginConfiguration!.Value.EnforceNewAuth = true; - await _noS0575PacketHandler!.ExecuteAsync(new NoS0575Packet - { - Password = _password, - Username = _session!.Account.Name.ToUpperInvariant() - }, _session); + await new Spec("Login with old auth when new enforced should fail") + .Given(NewAuthIsEnforced) + .WhenAsync(LoggingInWithUppercaseNameAsync) + .Then(NoPacketsShouldBeSent) + .ExecuteAsync(); + } - Assert.IsTrue(_session.LastPackets.Count == 0); + [TestMethod] + public async Task LoginWithNoAccountShouldFail() + { + await new Spec("Login with no account should fail") + .WhenAsync(LoggingInWithFakeAccountAsync) + .Then(ShouldReceiveAccountWrongError) + .ExecuteAsync(); } [TestMethod] - public async Task LoginNoAccountAsync() + public async Task LoginWithWrongCapsShouldFail() { - await _noS0575PacketHandler!.ExecuteAsync(new NoS0575Packet - { - Password = _password, - Username = "noaccount" - }, _session!); + await new Spec("Login with wrong caps should fail") + .WhenAsync(LoggingInWithUppercaseNameAsync) + .Then(ShouldReceiveWrongCapsError) + .ExecuteAsync(); + } - Assert.IsTrue(((FailcPacket?)_session!.LastPackets.FirstOrDefault(s => s is FailcPacket))?.Type == - LoginFailType.AccountOrPasswordWrong); + [TestMethod] + public async Task LoginWithWrongPasswordShouldFail() + { + await new Spec("Login with wrong password should fail") + .WhenAsync(LoggingInWithWrongPasswordAsync) + .Then(ShouldReceiveAccountWrongError) + .ExecuteAsync(); } [TestMethod] - public async Task LoginWrongCapsAsync() + public async Task LoginWithCorrectCredentialsShouldSucceed() { - await _noS0575PacketHandler!.ExecuteAsync(new NoS0575Packet - { - Password = _password, - Username = _session!.Account.Name.ToUpperInvariant() - }, _session); + await new Spec("Login with correct credentials should succeed") + .Given(ServerIsAvailable) + .WhenAsync(LoggingInCorrectlyAsync) + .Then(ShouldReceiveNsTestPacket) + .ExecuteAsync(); + } - Assert.IsTrue(((FailcPacket?)_session.LastPackets.FirstOrDefault(s => s is FailcPacket))?.Type == - LoginFailType.WrongCaps); + [TestMethod] + public async Task LoginWhenAlreadyConnectedShouldFail() + { + await new Spec("Login when already connected should fail") + .Given(AccountIsAlreadyConnected) + .WhenAsync(LoggingInCorrectlyAsync) + .Then(ShouldReceiveAlreadyConnectedError) + .ExecuteAsync(); } [TestMethod] - public async Task LoginWrongPAsswordAsync() + public async Task LoginWithNoServerShouldFail() { - var encryption = new Sha512Hasher(); - await _noS0575PacketHandler!.ExecuteAsync(new NoS0575Packet - { - Password = encryption.Hash("test1"), - Username = _session!.Account.Name - }, _session); + await new Spec("Login with no server should fail") + .Given(NoServerIsAvailable) + .WhenAsync(LoggingInCorrectlyAsync) + .Then(ShouldReceiveCantConnectError) + .ExecuteAsync(); + } - Assert.IsTrue(((FailcPacket?)_session.LastPackets.FirstOrDefault(s => s is FailcPacket))?.Type == - LoginFailType.AccountOrPasswordWrong); + [TestMethod] + public async Task LoginDuringMaintenanceShouldFail() + { + await new Spec("Login during maintenance should fail") + .Given(ServerIsInMaintenance) + .WhenAsync(LoggingInCorrectlyAsync) + .Then(ShouldReceiveMaintenanceError) + .ExecuteAsync(); } [TestMethod] - public async Task LoginAsync() + public async Task LoginDuringMaintenanceAsGmShouldSucceed() { - _channelHub!.Setup(s => s.GetCommunicationChannels()).ReturnsAsync(new List { new() }); - _pubSubHub!.Setup(s => s.GetSubscribersAsync()) - .ReturnsAsync(new List()); - await _noS0575PacketHandler!.ExecuteAsync(new NoS0575Packet - { - Password = _password, - Username = _session!.Account.Name - }, _session); + await new Spec("Login during maintenance as gm should succeed") + .Given(ServerIsInMaintenance) + .AndAsync(AccountIsGameMasterAsync) + .WhenAsync(LoggingInCorrectlyAsync) + .Then(ShouldReceiveNsTestPacket) + .ExecuteAsync(); + } - Assert.IsNotNull((NsTestPacket?)_session.LastPackets.FirstOrDefault(s => s is NsTestPacket)); + private void ClientVersionIsSet() + { + LoginConfiguration.Value.ClientVersion = new ClientVersionSubPacket { Major = 1 }; } - [TestMethod] - public async Task LoginAlreadyConnectedAsync() + private void NewAuthIsEnforced() { - _channelHub!.Setup(s => s.GetCommunicationChannels()).ReturnsAsync(new List { new() }); - _pubSubHub!.Setup(s => s.GetSubscribersAsync()).ReturnsAsync( - new List - {new() {Name = _session!.Account.Name}}); - await _noS0575PacketHandler!.ExecuteAsync(new NoS0575Packet - { - Password = _password, - Username = _session.Account.Name - }, _session); - Assert.IsTrue(((FailcPacket?)_session.LastPackets.FirstOrDefault(s => s is FailcPacket))?.Type == - LoginFailType.AlreadyConnected); + LoginConfiguration.Value.EnforceNewAuth = true; } - [TestMethod] - public async Task LoginNoServerAsync() + private void ServerIsAvailable() { - _channelHub!.Setup(s => s.GetCommunicationChannels()).ReturnsAsync(new List()); - _pubSubHub!.Setup(s => s.GetSubscribersAsync()) + ChannelHub.Setup(s => s.GetCommunicationChannels()).ReturnsAsync(new List { new() }); + PubSubHub.Setup(s => s.GetSubscribersAsync()) .ReturnsAsync(new List()); - - await _noS0575PacketHandler!.ExecuteAsync(new NoS0575Packet - { - Password = _password, - Username = _session!.Account.Name - }, _session); - Assert.IsTrue(((FailcPacket?)_session.LastPackets.FirstOrDefault(s => s is FailcPacket))?.Type == - LoginFailType.CantConnect); } - //[TestMethod] - //public void LoginBanned() - //{ - // _handler.VerifyLogin(new NoS0575Packet - // { - // Password ="test".Sha512(), - // Name = Name, - // }); - // Assert.IsTrue(_session.LastPacket is FailcPacket); - // Assert.IsTrue(((FailcPacket) _session.LastPacket).Type == LoginFailType.Banned); - //} + private void AccountIsAlreadyConnected() + { + ChannelHub.Setup(s => s.GetCommunicationChannels()).ReturnsAsync(new List { new() }); + PubSubHub.Setup(s => s.GetSubscribersAsync()).ReturnsAsync( + new List + { new() { Name = Session.Account.Name } }); + } + private void NoServerIsAvailable() + { + ChannelHub.Setup(s => s.GetCommunicationChannels()).ReturnsAsync(new List()); + PubSubHub.Setup(s => s.GetSubscribersAsync()) + .ReturnsAsync(new List()); + } - [TestMethod] - public async Task LoginMaintenanceAsync() + private void ServerIsInMaintenance() { - _channelHub!.Setup(s => s.GetCommunicationChannels()).ReturnsAsync(new List() { new() { IsMaintenance = true } }); - _pubSubHub!.Setup(s => s.GetSubscribersAsync()) + ChannelHub.Setup(s => s.GetCommunicationChannels()).ReturnsAsync(new List { new() { IsMaintenance = true } }); + PubSubHub.Setup(s => s.GetSubscribersAsync()) .ReturnsAsync(new List()); + } - await _noS0575PacketHandler!.ExecuteAsync(new NoS0575Packet + private async Task AccountIsGameMasterAsync() + { + Session.Account.Authority = AuthorityType.GameMaster; + await TestHelpers.Instance.AccountDao.TryInsertOrUpdateAsync(Session.Account); + } + + private async Task LoggingInWithUppercaseNameAsync() + { + await NoS0575PacketHandler.ExecuteAsync(new NoS0575Packet { - Password = _password, - Username = _session!.Account.Name - }, _session); + Password = Password, + Username = Session.Account.Name.ToUpperInvariant() + }, Session); + } - Assert.IsTrue(((FailcPacket?)_session.LastPackets.FirstOrDefault(s => s is FailcPacket))?.Type == - LoginFailType.Maintenance); + private async Task LoggingInWithFakeAccountAsync() + { + await NoS0575PacketHandler.ExecuteAsync(new NoS0575Packet + { + Password = Password, + Username = "noaccount" + }, Session); } - [TestMethod] - public async Task LoginMaintenanceGameMasterAsync() + private async Task LoggingInWithWrongPasswordAsync() { - _channelHub!.Setup(s => s.GetCommunicationChannels()).ReturnsAsync(new List() { new() { IsMaintenance = true } }); - _pubSubHub!.Setup(s => s.GetSubscribersAsync()) - .ReturnsAsync(new List()); + var encryption = new Sha512Hasher(); + await NoS0575PacketHandler.ExecuteAsync(new NoS0575Packet + { + Password = encryption.Hash("test1"), + Username = Session.Account.Name + }, Session); + } - _session!.Account.Authority = AuthorityType.GameMaster; - await TestHelpers.Instance.AccountDao.TryInsertOrUpdateAsync(_session!.Account); - await _noS0575PacketHandler!.ExecuteAsync(new NoS0575Packet + private async Task LoggingInCorrectlyAsync() + { + await NoS0575PacketHandler.ExecuteAsync(new NoS0575Packet { - Password = _password, - Username = _session!.Account.Name - }, _session); + Password = Password, + Username = Session.Account.Name + }, Session); + } - Assert.IsNotNull((NsTestPacket?)_session.LastPackets.FirstOrDefault(s => s is NsTestPacket)); + private void ShouldReceiveOldClientError() + { + Assert.IsTrue(((FailcPacket?)Session.LastPackets.FirstOrDefault(s => s is FailcPacket))?.Type == + LoginFailType.OldClient); + } + + private void NoPacketsShouldBeSent() + { + Assert.IsTrue(Session.LastPackets.Count == 0); + } + + private void ShouldReceiveAccountWrongError() + { + Assert.IsTrue(((FailcPacket?)Session.LastPackets.FirstOrDefault(s => s is FailcPacket))?.Type == + LoginFailType.AccountOrPasswordWrong); + } + + private void ShouldReceiveWrongCapsError() + { + Assert.IsTrue(((FailcPacket?)Session.LastPackets.FirstOrDefault(s => s is FailcPacket))?.Type == + LoginFailType.WrongCaps); + } + + private void ShouldReceiveNsTestPacket() + { + Assert.IsNotNull((NsTestPacket?)Session.LastPackets.FirstOrDefault(s => s is NsTestPacket)); + } + + private void ShouldReceiveAlreadyConnectedError() + { + Assert.IsTrue(((FailcPacket?)Session.LastPackets.FirstOrDefault(s => s is FailcPacket))?.Type == + LoginFailType.AlreadyConnected); + } + + private void ShouldReceiveCantConnectError() + { + Assert.IsTrue(((FailcPacket?)Session.LastPackets.FirstOrDefault(s => s is FailcPacket))?.Type == + LoginFailType.CantConnect); + } + + private void ShouldReceiveMaintenanceError() + { + Assert.IsTrue(((FailcPacket?)Session.LastPackets.FirstOrDefault(s => s is FailcPacket))?.Type == + LoginFailType.Maintenance); } } -} \ No newline at end of file +} diff --git a/test/NosCore.PacketHandlers.Tests/Login/NoS0577PacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Login/NoS0577PacketHandlerTests.cs index f9192a752..cfbca1a16 100644 --- a/test/NosCore.PacketHandlers.Tests/Login/NoS0577PacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Login/NoS0577PacketHandlerTests.cs @@ -2,18 +2,18 @@ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . @@ -44,25 +44,26 @@ using NosCore.Shared.Configuration; using NosCore.Shared.Enumerations; using NosCore.Tests.Shared; +using SpecLight; namespace NosCore.PacketHandlers.Tests.Login { [TestClass] - public class NoS0577PacketHandlerTests + public class NoS0577PacketHandlerSpecs { - private readonly string _tokenGuid = Guid.NewGuid().ToString(); - private IHasher _encryption = null!; - private readonly Mock _authHttpClient = new(); - private readonly Mock _pubSubHub = TestHelpers.Instance.PubSubHub; - private readonly IOptions _loginConfiguration = Options.Create(new LoginConfiguration + private readonly string TokenGuid = Guid.NewGuid().ToString(); + private IHasher Encryption = null!; + private readonly Mock AuthHttpClient = new(); + private readonly Mock PubSubHub = TestHelpers.Instance.PubSubHub; + private readonly IOptions LoginConfiguration = Options.Create(new LoginConfiguration { MasterCommunication = new WebApiConfiguration() }); - private NoS0577PacketHandler? _noS0577PacketHandler; - private ClientSession? _session; - private Mock? _channelHub; - private SessionRefHolder? _sessionRefHolder; + private NoS0577PacketHandler NoS0577PacketHandler = null!; + private ClientSession Session = null!; + private Mock ChannelHub = null!; + private SessionRefHolder SessionRefHolder = null!; private static string GuidToToken(string token) { @@ -73,166 +74,221 @@ private static string GuidToToken(string token) public async Task SetupAsync() { await TestHelpers.ResetAsync(); - _channelHub = new Mock(); - _sessionRefHolder = new SessionRefHolder(); - _session = await TestHelpers.Instance.GenerateSessionAsync(); - _sessionRefHolder[_session.Channel!.Id] = new RegionTypeMapping(_session.SessionId, RegionType.EN); - _authHttpClient.Setup(s => s.GetAwaitingConnectionAsync(It.IsAny(), It.IsAny(), + ChannelHub = new Mock(); + SessionRefHolder = new SessionRefHolder(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + SessionRefHolder[Session.Channel!.Id] = new RegionTypeMapping(Session.SessionId, RegionType.EN); + AuthHttpClient.Setup(s => s.GetAwaitingConnectionAsync(It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync((string a, string b, int c) => - (string?)((new OkObjectResult(_session.Account.Name)).Value)); - _noS0577PacketHandler = new NoS0577PacketHandler(new LoginService(_loginConfiguration, + (string?)((new OkObjectResult(Session.Account.Name)).Value)); + NoS0577PacketHandler = new NoS0577PacketHandler(new LoginService(LoginConfiguration, TestHelpers.Instance.AccountDao, - _authHttpClient.Object, _pubSubHub.Object, _channelHub.Object, TestHelpers.Instance.CharacterDao, _sessionRefHolder)); + AuthHttpClient.Object, PubSubHub.Object, ChannelHub.Object, TestHelpers.Instance.CharacterDao, SessionRefHolder)); } [TestMethod] - public async Task LoginBCryptAsync() + public async Task LoginWithBcryptShouldSucceed() { - _encryption = new BcryptHasher(); - _channelHub!.Setup(s => s.GetCommunicationChannels()).ReturnsAsync(new List { new() }); - _pubSubHub.Setup(s => s.GetSubscribersAsync()) - .ReturnsAsync(new List()); - _session!.Account.NewAuthSalt = BCrypt.Net.BCrypt.GenerateSalt(); - _session.Account.NewAuthPassword = _encryption.Hash(_tokenGuid, _session.Account.NewAuthSalt); + await new Spec("Login with bcrypt should succeed") + .Given(ServerIsAvailable) + .And(AccountUsesBcrypt) + .WhenAsync(LoggingInWithToken) + .Then(ShouldReceiveNsTestPacket) + .ExecuteAsync(); + } - await _noS0577PacketHandler!.ExecuteAsync(new NoS0577Packet - { - AuthToken = GuidToToken(_tokenGuid), - }, _session); + [TestMethod] + public async Task LoginWithPbkdf2ShouldSucceed() + { + await new Spec("Login with pbkdf2 should succeed") + .Given(ServerIsAvailable) + .And(AccountUsesPbkdf_, 2) + .WhenAsync(LoggingInWithToken) + .Then(ShouldReceiveNsTestPacket) + .ExecuteAsync(); + } + [TestMethod] + public async Task LoginWithOldClientShouldFail() + { + await new Spec("Login with old client should fail") + .Given(ClientVersionIsSet) + .WhenAsync(LoggingInWithToken) + .Then(ShouldReceiveOldClientError) + .ExecuteAsync(); + } - Assert.IsNotNull((NsTestPacket?)_session.LastPackets.FirstOrDefault(s => s is NsTestPacket)); + [TestMethod] + public async Task LoginWithWrongTokenShouldFail() + { + await new Spec("Login with wrong token should fail") + .Given(TokenIsInvalid) + .WhenAsync(LoggingInWithWrongToken) + .Then(ShouldReceiveAccountWrongError) + .ExecuteAsync(); } [TestMethod] - public async Task LoginPbkdf2Async() - { - _encryption = new Pbkdf2Hasher(); - _channelHub!.Setup(s => s.GetCommunicationChannels()).ReturnsAsync(new List { new() }); - _pubSubHub.Setup(s => s.GetSubscribersAsync()) - .ReturnsAsync(new List()); - _session!.Account.NewAuthPassword = _encryption.Hash(_tokenGuid, "MY_SUPER_SECRET_HASH"); - _session.Account.NewAuthSalt = "MY_SUPER_SECRET_HASH"; - await _noS0577PacketHandler!.ExecuteAsync(new NoS0577Packet - { - AuthToken = GuidToToken(_tokenGuid), - }, _session); + public async Task LoginWithCorrectCredentialsShouldSucceed() + { + await new Spec("Login with correct credentials should succeed") + .Given(ServerIsAvailable) + .WhenAsync(LoggingInWithToken) + .Then(ShouldReceiveNsTestPacket) + .ExecuteAsync(); + } - Assert.IsNotNull((NsTestPacket?)_session.LastPackets.FirstOrDefault(s => s is NsTestPacket)); + [TestMethod] + public async Task LoginWhenAlreadyConnectedShouldFail() + { + await new Spec("Login when already connected should fail") + .Given(AccountIsAlreadyConnected) + .WhenAsync(LoggingInWithToken) + .Then(ShouldReceiveAlreadyConnectedError) + .ExecuteAsync(); } [TestMethod] - public async Task LoginOldClientAsync() + public async Task LoginWithNoServerShouldFail() { - _loginConfiguration.Value.ClientVersion = new ClientVersionSubPacket { Major = 1 }; - await _noS0577PacketHandler!.ExecuteAsync(new NoS0577Packet - { - AuthToken = GuidToToken(_tokenGuid), - }, _session!); + await new Spec("Login with no server should fail") + .Given(NoServerIsAvailable) + .WhenAsync(LoggingInWithToken) + .Then(ShouldReceiveCantConnectError) + .ExecuteAsync(); + } - Assert.IsTrue(((FailcPacket?)_session!.LastPackets.FirstOrDefault(s => s is FailcPacket))?.Type == - LoginFailType.OldClient); + [TestMethod] + public async Task LoginDuringMaintenanceShouldFail() + { + await new Spec("Login during maintenance should fail") + .Given(ServerIsInMaintenance) + .WhenAsync(LoggingInWithToken) + .Then(ShouldReceiveMaintenanceError) + .ExecuteAsync(); } [TestMethod] - public async Task LoginWrongTokenAsync() + public async Task LoginDuringMaintenanceAsGmShouldSucceed() + { + await new Spec("Login during maintenance as gm should succeed") + .Given(ServerIsInMaintenance) + .AndAsync(AccountIsGameMaster) + .WhenAsync(LoggingInWithToken) + .Then(ShouldReceiveNsTestPacket) + .ExecuteAsync(); + } + + private void ServerIsAvailable() + { + ChannelHub.Setup(s => s.GetCommunicationChannels()).ReturnsAsync(new List { new() }); + PubSubHub.Setup(s => s.GetSubscribersAsync()) + .ReturnsAsync(new List()); + } + + private void AccountUsesBcrypt() { - _authHttpClient.Setup(s => s.GetAwaitingConnectionAsync(It.IsAny(), It.IsAny(), + Encryption = new BcryptHasher(); + Session.Account.NewAuthSalt = BCrypt.Net.BCrypt.GenerateSalt(); + Session.Account.NewAuthPassword = Encryption.Hash(TokenGuid, Session.Account.NewAuthSalt); + } + + private void AccountUsesPbkdf_(int value) + { + Encryption = new Pbkdf2Hasher(); + Session.Account.NewAuthPassword = Encryption.Hash(TokenGuid, "MYSUPERSECRETHASH"); + Session.Account.NewAuthSalt = "MYSUPERSECRETHASH"; + } + + private void ClientVersionIsSet() + { + LoginConfiguration.Value.ClientVersion = new ClientVersionSubPacket { Major = 1 }; + } + + private void TokenIsInvalid() + { + AuthHttpClient.Setup(s => s.GetAwaitingConnectionAsync(It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync((string a, string b, int c) => (string?)((new OkObjectResult(null)).Value)); - await _noS0577PacketHandler!.ExecuteAsync(new NoS0577Packet - { - AuthToken = GuidToToken(Guid.NewGuid().ToString()), - }, _session!); + } - Assert.IsTrue(((FailcPacket?)_session!.LastPackets.FirstOrDefault(s => s is FailcPacket))?.Type == - LoginFailType.AccountOrPasswordWrong); + private void AccountIsAlreadyConnected() + { + ChannelHub.Setup(s => s.GetCommunicationChannels()).ReturnsAsync(new List { new() }); + PubSubHub.Setup(s => s.GetSubscribersAsync()) + .ReturnsAsync(new List + { new() { Name = Session.Account.Name } }); } - [TestMethod] - public async Task LoginAsync() + private void NoServerIsAvailable() { - _channelHub!.Setup(s => s.GetCommunicationChannels()).ReturnsAsync(new List { new() }); - _pubSubHub.Setup(s => s.GetSubscribersAsync()) - .ReturnsAsync(new List()); - await _noS0577PacketHandler!.ExecuteAsync(new NoS0577Packet - { - AuthToken = GuidToToken(_tokenGuid), - }, _session!); + ChannelHub.Setup(s => s.GetCommunicationChannels()).ReturnsAsync(new List()); + PubSubHub.Setup(s => s.GetSubscribersAsync()) + .ReturnsAsync(new List()); + } - Assert.IsNotNull((NsTestPacket?)_session!.LastPackets.FirstOrDefault(s => s is NsTestPacket)); + private void ServerIsInMaintenance() + { + ChannelHub.Setup(s => s.GetCommunicationChannels()).ReturnsAsync(new List { new() { IsMaintenance = true } }); + PubSubHub.Setup(s => s.GetSubscribersAsync()) + .ReturnsAsync(new List()); } - [TestMethod] - public async Task LoginAlreadyConnectedAsync() + private async Task AccountIsGameMaster() { - _channelHub!.Setup(s => s.GetCommunicationChannels()).ReturnsAsync(new List { new() }); - _pubSubHub.Setup(s => s.GetSubscribersAsync()) - .ReturnsAsync(new List - {new() {Name = _session!.Account.Name}}); - await _noS0577PacketHandler!.ExecuteAsync(new NoS0577Packet + Session.Account.Authority = AuthorityType.GameMaster; + await TestHelpers.Instance.AccountDao.TryInsertOrUpdateAsync(Session.Account); + } + + private async Task LoggingInWithToken() + { + await NoS0577PacketHandler.ExecuteAsync(new NoS0577Packet { - AuthToken = GuidToToken(_tokenGuid), - }, _session); - Assert.IsTrue(((FailcPacket?)_session.LastPackets.FirstOrDefault(s => s is FailcPacket))?.Type == - LoginFailType.AlreadyConnected); + AuthToken = GuidToToken(TokenGuid), + }, Session); } - [TestMethod] - public async Task LoginNoServerAsync() + private async Task LoggingInWithWrongToken() { - _channelHub!.Setup(s => s.GetCommunicationChannels()).ReturnsAsync(new List()); - _pubSubHub.Setup(s => s.GetSubscribersAsync()) - .ReturnsAsync(new List()); - await _noS0577PacketHandler!.ExecuteAsync(new NoS0577Packet + await NoS0577PacketHandler.ExecuteAsync(new NoS0577Packet { - AuthToken = GuidToToken(_tokenGuid), - }, _session!); - Assert.IsTrue(((FailcPacket?)_session!.LastPackets.FirstOrDefault(s => s is FailcPacket))?.Type == - LoginFailType.CantConnect); + AuthToken = GuidToToken(Guid.NewGuid().ToString()), + }, Session); } - //[TestMethod] - //public async Task LoginBanned() - //{ - // _handler.VerifyLogin(new NoS0575Packet - // { - // Password ="test".Sha512(), - // Name = Name, - // }); - // Assert.IsTrue(_session.LastPacket is FailcPacket); - // Assert.IsTrue(((FailcPacket) _session.LastPacket).Type == LoginFailType.Banned); - //} + private void ShouldReceiveNsTestPacket() + { + Assert.IsNotNull((NsTestPacket?)Session.LastPackets.FirstOrDefault(s => s is NsTestPacket)); + } - [TestMethod] - public async Task LoginMaintenanceAsync() + private void ShouldReceiveOldClientError() { - _channelHub!.Setup(s => s.GetCommunicationChannels()).ReturnsAsync(new List { new() { IsMaintenance = true } }); - _pubSubHub.Setup(s => s.GetSubscribersAsync()) - .ReturnsAsync(new List()); - await _noS0577PacketHandler!.ExecuteAsync(new NoS0577Packet - { - AuthToken = GuidToToken(_tokenGuid), - }, _session!); + Assert.IsTrue(((FailcPacket?)Session.LastPackets.FirstOrDefault(s => s is FailcPacket))?.Type == + LoginFailType.OldClient); + } - Assert.IsTrue(((FailcPacket?)_session!.LastPackets.FirstOrDefault(s => s is FailcPacket))?.Type == - LoginFailType.Maintenance); + private void ShouldReceiveAccountWrongError() + { + Assert.IsTrue(((FailcPacket?)Session.LastPackets.FirstOrDefault(s => s is FailcPacket))?.Type == + LoginFailType.AccountOrPasswordWrong); } - [TestMethod] - public async Task LoginMaintenanceGameMasterAsync() + private void ShouldReceiveAlreadyConnectedError() { - _channelHub!.Setup(s => s.GetCommunicationChannels()).ReturnsAsync(new List { new() { IsMaintenance = true } }); - _pubSubHub.Setup(s => s.GetSubscribersAsync()) - .ReturnsAsync(new List()); - _session!.Account.Authority = AuthorityType.GameMaster; - await TestHelpers.Instance.AccountDao.TryInsertOrUpdateAsync(_session!.Account); - await _noS0577PacketHandler!.ExecuteAsync(new NoS0577Packet - { - AuthToken = GuidToToken(_tokenGuid), - }, _session); + Assert.IsTrue(((FailcPacket?)Session.LastPackets.FirstOrDefault(s => s is FailcPacket))?.Type == + LoginFailType.AlreadyConnected); + } - Assert.IsNotNull((NsTestPacket?)_session.LastPackets.FirstOrDefault(s => s is NsTestPacket)); + private void ShouldReceiveCantConnectError() + { + Assert.IsTrue(((FailcPacket?)Session.LastPackets.FirstOrDefault(s => s is FailcPacket))?.Type == + LoginFailType.CantConnect); + } + + private void ShouldReceiveMaintenanceError() + { + Assert.IsTrue(((FailcPacket?)Session.LastPackets.FirstOrDefault(s => s is FailcPacket))?.Type == + LoginFailType.Maintenance); } } -} \ No newline at end of file +} diff --git a/test/NosCore.PacketHandlers.Tests/Miniland/AddobjPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Miniland/AddobjPacketHandlerTests.cs new file mode 100644 index 000000000..9ffebadd1 --- /dev/null +++ b/test/NosCore.PacketHandlers.Tests/Miniland/AddobjPacketHandlerTests.cs @@ -0,0 +1,221 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Mapster; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.Data.Dto; +using NosCore.Data.Enumerations; +using NosCore.Data.Enumerations.Items; +using NosCore.Data.StaticEntities; +using NosCore.GameObject.ComponentEntities.Entities; +using NosCore.GameObject.Infastructure; +using NosCore.GameObject.Map; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.GameObject.Services.EventLoaderService; +using NosCore.GameObject.Services.InventoryService; +using NosCore.GameObject.Services.ItemGenerationService; +using NosCore.GameObject.Services.ItemGenerationService.Item; +using NosCore.GameObject.Services.MinilandService; +using NosCore.PacketHandlers.Miniland; +using NosCore.Packets.ClientPackets.Inventory; +using NosCore.Packets.ClientPackets.Miniland; +using NosCore.Packets.Enumerations; +using NosCore.Packets.ServerPackets.UI; +using NosCore.Tests.Shared; +using Serilog; +using SpecLight; + +namespace NosCore.PacketHandlers.Tests.Miniland +{ + [TestClass] + public class AddobjPacketHandlerTests + { + private static readonly ILogger Logger = new Mock().Object; + private AddobjPacketHandler _addobjPacketHandler = null!; + private ClientSession _session = null!; + private IMinilandService _minilandProvider = null!; + private InventoryItemInstance _minilandObject = null!; + private ItemGenerationService _itemProvider = null!; + + private List MinilandItems => new() + { + new Item { Type = NoscorePocketType.Miniland, VNum = 3000, ItemType = ItemType.Minigame, MinilandObjectPoint = 100 } + }; + + [TestInitialize] + public async Task SetupAsync() + { + TypeAdapterConfig.NewConfig() + .ConstructUsing(src => new MapNpc(null, Logger, TestHelpers.Instance.DistanceCalculator, TestHelpers.Instance.Clock)); + await TestHelpers.ResetAsync(); + _session = await TestHelpers.Instance.GenerateSessionAsync(); + await TestHelpers.Instance.MinilandDao.TryInsertOrUpdateAsync(new MinilandDto() + { + OwnerId = _session.Character.CharacterId, + }); + _minilandProvider = new MinilandService(TestHelpers.Instance.MapInstanceAccessorService, + TestHelpers.Instance.FriendHttpClient.Object, + new List {new Map + { + MapId = 20001, + NameI18NKey = "miniland", + Data = new byte[] {} + }}, + TestHelpers.Instance.MinilandDao, + TestHelpers.Instance.MinilandObjectDao, new MinilandRegistry()); + await _minilandProvider.InitializeAsync(_session.Character, TestHelpers.Instance.MapInstanceGeneratorService); + var miniland = _minilandProvider.GetMiniland(_session.Character.CharacterId); + var mapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetMapInstance(miniland.MapInstanceId)!; + _session.Character.MapInstance = mapInstance; + _addobjPacketHandler = new AddobjPacketHandler(_minilandProvider); + _itemProvider = new ItemGenerationService( + MinilandItems, + new EventLoaderService, IUseItemEventHandler>( + new List>>()), + Logger, + TestHelpers.Instance.LogLanguageLocalizer); + } + + [TestMethod] + public async Task AddObjectWithoutItemShouldFail() + { + await new Spec("Add object without item should fail") + .Given(MinilandIsLocked) + .WhenAsync(AddingNonExistentObject) + .Then(NoObjectShouldBeAdded) + .ExecuteAsync(); + } + + [TestMethod] + public async Task AddObjectWhenMinilandNotLockedShouldFail() + { + await new Spec("Add object when miniland not locked should fail") + .Given(MinilandObjectExists) + .And(MinilandIsOpen) + .WhenAsync(AddingMinilandObject) + .Then(ShouldReceiveInstallationOnlyLockModeMessage) + .And(NoObjectShouldBeAdded) + .ExecuteAsync(); + } + + [TestMethod] + public async Task AddObjectWhenLockedShouldSucceed() + { + await new Spec("Add object when locked should succeed") + .Given(MinilandObjectExists) + .And(MinilandIsLocked) + .WhenAsync(AddingMinilandObject) + .Then(ObjectShouldBeAdded) + .ExecuteAsync(); + } + + [TestMethod] + public async Task AddDuplicateObjectShouldFail() + { + await new Spec("Add duplicate object should fail") + .Given(MinilandObjectExists) + .And(MinilandIsLocked) + .And(ObjectAlreadyPlaced) + .WhenAsync(AddingMinilandObject) + .Then(ShouldReceiveAlreadyHaveObjectMessage) + .ExecuteAsync(); + } + + private void MinilandIsLocked() + { + var miniland = _minilandProvider.GetMiniland(_session.Character.CharacterId); + miniland.State = MinilandState.Lock; + } + + private void MinilandIsOpen() + { + var miniland = _minilandProvider.GetMiniland(_session.Character.CharacterId); + miniland.State = MinilandState.Open; + } + + private void MinilandObjectExists() + { + var item = _itemProvider.Create(3000, 1); + _minilandObject = InventoryItemInstance.Create(item, _session.Character.CharacterId); + _minilandObject.Type = NoscorePocketType.Miniland; + _minilandObject.Slot = 0; + _session.Character.InventoryService[_minilandObject.Id] = _minilandObject; + } + + private void ObjectAlreadyPlaced() + { + var mapObject = new MapDesignObject + { + MinilandObjectId = Guid.NewGuid(), + MapX = 5, + MapY = 5 + }; + _minilandProvider.AddMinilandObject(mapObject, _session.Character.CharacterId, _minilandObject); + } + + private async Task AddingNonExistentObject() + { + var addobjPacket = new AddobjPacket + { + Slot = 99, + PositionX = 5, + PositionY = 5 + }; + await _addobjPacketHandler.ExecuteAsync(addobjPacket, _session); + } + + private async Task AddingMinilandObject() + { + var addobjPacket = new AddobjPacket + { + Slot = 0, + PositionX = 5, + PositionY = 5 + }; + await _addobjPacketHandler.ExecuteAsync(addobjPacket, _session); + } + + private void NoObjectShouldBeAdded() + { + Assert.AreEqual(0, _session.Character.MapInstance.MapDesignObjects.Count); + } + + private void ObjectShouldBeAdded() + { + Assert.AreEqual(1, _session.Character.MapInstance.MapDesignObjects.Count); + } + + private void ShouldReceiveInstallationOnlyLockModeMessage() + { + var lastPacket = (MsgiPacket?)_session.LastPackets.FirstOrDefault(s => s is MsgiPacket); + Assert.AreEqual(Game18NConstString.InstallationOnlyLockMode, lastPacket?.Message); + } + + private void ShouldReceiveAlreadyHaveObjectMessage() + { + var lastPacket = (MsgiPacket?)_session.LastPackets.FirstOrDefault(s => s is MsgiPacket); + Assert.AreEqual(Game18NConstString.YouAlreadyHaveThisMinilandObject, lastPacket?.Message); + } + } +} diff --git a/test/NosCore.PacketHandlers.Tests/Miniland/MJoinPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Miniland/MJoinPacketHandlerTests.cs index 558b850ae..848a4dbb8 100644 --- a/test/NosCore.PacketHandlers.Tests/Miniland/MJoinPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Miniland/MJoinPacketHandlerTests.cs @@ -2,18 +2,18 @@ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . @@ -25,6 +25,7 @@ using Moq; using NosCore.Data.Dto; using NosCore.Data.WebApi; +using NosCore.GameObject.ComponentEntities.Entities; using NosCore.GameObject.InterChannelCommunication.Hubs.FriendHub; using NosCore.GameObject.InterChannelCommunication.Hubs.PubSub; using NosCore.GameObject.Networking; @@ -38,7 +39,7 @@ using NosCore.Shared.Enumerations; using NosCore.Tests.Shared; using Serilog; -using NosCore.GameObject.ComponentEntities.Entities; +using SpecLight; using Character = NosCore.Data.WebApi.Character; namespace NosCore.PacketHandlers.Tests.Miniland @@ -47,14 +48,13 @@ namespace NosCore.PacketHandlers.Tests.Miniland public class MJoinPacketHandlerTests { private static readonly ILogger Logger = new Mock().Object; - private readonly Mock _connectedAccountHttpClient = TestHelpers.Instance.PubSubHub; - private readonly Mock _friendHttpClient = TestHelpers.Instance.FriendHttpClient; - private Mock? _minilandProvider; - private MJoinPacketHandler? _mjoinPacketHandler; - - private ClientSession? _session; - private ClientSession? _targetSession; - private Mock? _mapChangeService; + private readonly Mock ConnectedAccountHttpClient = TestHelpers.Instance.PubSubHub; + private readonly Mock FriendHttpClient = TestHelpers.Instance.FriendHttpClient; + private Mock MinilandProvider = null!; + private MJoinPacketHandler MjoinPacketHandler = null!; + private ClientSession Session = null!; + private ClientSession TargetSession = null!; + private Mock MapChangeService = null!; [TestInitialize] public async Task SetupAsync() @@ -63,191 +63,191 @@ public async Task SetupAsync() .ConstructUsing(src => new MapNpc(null, Logger, TestHelpers.Instance.DistanceCalculator, TestHelpers.Instance.Clock)); Broadcaster.Reset(); await TestHelpers.ResetAsync(); - _session = await TestHelpers.Instance.GenerateSessionAsync(); - _targetSession = await TestHelpers.Instance.GenerateSessionAsync(); - _minilandProvider = new Mock(); - _mapChangeService = new Mock(); - _mjoinPacketHandler = new MJoinPacketHandler(_friendHttpClient.Object, _minilandProvider.Object, _mapChangeService.Object, TestHelpers.Instance.SessionRegistry); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + TargetSession = await TestHelpers.Instance.GenerateSessionAsync(); + MinilandProvider = new Mock(); + MapChangeService = new Mock(); + MjoinPacketHandler = new MJoinPacketHandler(FriendHttpClient.Object, MinilandProvider.Object, MapChangeService.Object, TestHelpers.Instance.SessionRegistry); } [TestMethod] - public async Task JoinNonConnectedAsync() + public async Task JoinNonConnectedPlayerShouldFail() { - var mjoinPacket = new MJoinPacket - { - VisualId = 50, - Type = VisualType.Player - }; - await _mjoinPacketHandler!.ExecuteAsync(mjoinPacket, _session!); - - _mapChangeService!.Verify(x => x.ChangeMapInstanceAsync(_session!, TestHelpers.Instance.MinilandId, 5, 8), Times.Never); + await new Spec("Join non connected player should fail") + .WhenAsync(JoiningNonConnectedPlayer) + .Then(MapShouldNotChange) + .ExecuteAsync(); } [TestMethod] - public async Task JoinNonFriendAsync() + public async Task JoinNonFriendShouldFail() { - var mjoinPacket = new MJoinPacket - { - VisualId = _targetSession!.Character.CharacterId, - Type = VisualType.Player - }; - await _mjoinPacketHandler!.ExecuteAsync(mjoinPacket, _session!); + await new Spec("Join non friend should fail") + .WhenAsync(JoiningNonFriend) + .Then(MapShouldNotChange) + .ExecuteAsync(); + } + [TestMethod] + public async Task JoinClosedMinilandShouldFail() + { + await new Spec("Join closed miniland should fail") + .Given(TargetIsFriend) + .And(MinilandIsLocked) + .WhenAsync(JoiningTargetMiniland) + .Then(ShouldReceiveMinilandLockedMessage) + .And(MapShouldNotChange) + .ExecuteAsync(); + } - _mapChangeService!.Verify(x => x.ChangeMapInstanceAsync(_targetSession, TestHelpers.Instance.MinilandId, 5, 8), Times.Never); + [TestMethod] + public async Task JoinOpenMinilandShouldSucceed() + { + await new Spec("Join open miniland should succeed") + .Given(TargetIsFriend) + .And(MinilandIsOpen) + .WhenAsync(JoiningTargetMiniland) + .Then(MapShouldChangeToMiniland) + .ExecuteAsync(); } + [TestMethod] + public async Task JoinPrivateMinilandAsFriendShouldSucceed() + { + await new Spec("Join private miniland as friend should succeed") + .Given(TargetIsFriend) + .And(MinilandIsPrivate) + .WhenAsync(JoiningTargetMiniland) + .Then(MapShouldChangeToMiniland) + .ExecuteAsync(); + } [TestMethod] - public async Task JoinClosedAsync() + public async Task JoinPrivateMinilandWhenBlockedShouldFail() { - var mjoinPacket = new MJoinPacket - { - VisualId = _targetSession!.Character.CharacterId, - Type = VisualType.Player - }; - _connectedAccountHttpClient.Setup(s => s.GetSubscribersAsync()) - .ReturnsAsync(new List(){ + await new Spec("Join private miniland when blocked should fail") + .Given(TargetHasBlockedSession) + .And(MinilandIsPrivate) + .WhenAsync(JoiningTargetMiniland) + .Then(ShouldReceiveMinilandLockedMessage) + .And(MapShouldNotChange) + .ExecuteAsync(); + } + + private void TargetIsFriend() + { + ConnectedAccountHttpClient.Setup(s => s.GetSubscribersAsync()) + .ReturnsAsync(new List() + { new Subscriber { - ChannelId = 1, ConnectedCharacter = new Character { Id = _targetSession.Character.CharacterId } + ChannelId = 1, ConnectedCharacter = new Character { Id = TargetSession.Character.CharacterId } }, new Subscriber { - ChannelId = 1, ConnectedCharacter = new Character { Id = _session!.Character.CharacterId } + ChannelId = 1, ConnectedCharacter = new Character { Id = Session.Character.CharacterId } } - }); - _friendHttpClient.Setup(s => s.GetFriendsAsync(It.IsAny())).ReturnsAsync(new List + FriendHttpClient.Setup(s => s.GetFriendsAsync(It.IsAny())).ReturnsAsync(new List { new() { - CharacterId = _targetSession.Character.CharacterId, + CharacterId = TargetSession.Character.CharacterId, IsConnected = true, - CharacterName = _targetSession.Character.Name, + CharacterName = TargetSession.Character.Name, RelationType = CharacterRelationType.Friend } }); - _minilandProvider!.Setup(s => s.GetMiniland(It.IsAny())).Returns(new GameObject.Services.MinilandService.Miniland - { MapInstanceId = TestHelpers.Instance.MinilandId, State = MinilandState.Lock }); - await _mjoinPacketHandler!.ExecuteAsync(mjoinPacket, _session); - - var lastpacket = (InfoiPacket?)_session.LastPackets.FirstOrDefault(s => s is InfoiPacket); - Assert.AreEqual(lastpacket?.Message, Game18NConstString.MinilandLocked); - _mapChangeService!.Verify(x => x.ChangeMapInstanceAsync(_session, TestHelpers.Instance.MinilandId, 5, 8), Times.Never); } - [TestMethod] - public async Task JoinAsync() + private void TargetHasBlockedSession() { - var mjoinPacket = new MJoinPacket - { - VisualId = _targetSession!.Character.CharacterId, - Type = VisualType.Player - }; - _minilandProvider!.Setup(s => s.GetMiniland(It.IsAny())).Returns(new GameObject.Services.MinilandService.Miniland - { MapInstanceId = TestHelpers.Instance.MinilandId, State = MinilandState.Open }); - _friendHttpClient.Setup(s => s.GetFriendsAsync(It.IsAny())).ReturnsAsync(new List - { - new() + ConnectedAccountHttpClient.Setup(s => s.GetSubscribersAsync()) + .ReturnsAsync(new List() { - CharacterId = _targetSession.Character.CharacterId, - IsConnected = true, - CharacterName = _targetSession.Character.Name, - RelationType = CharacterRelationType.Friend - } - }); - await _mjoinPacketHandler!.ExecuteAsync(mjoinPacket, _session!); - _connectedAccountHttpClient.Setup(s => s.GetSubscribersAsync()) - .ReturnsAsync(new List(){ new Subscriber { - ChannelId = 1, ConnectedCharacter = new Character { Id = _targetSession.Character.CharacterId } + ChannelId = 1, ConnectedCharacter = new Character { Id = TargetSession.Character.CharacterId } }, new Subscriber { - ChannelId = 1, ConnectedCharacter = new Character { Id = _session!.Character.CharacterId } + ChannelId = 1, ConnectedCharacter = new Character { Id = Session.Character.CharacterId } } - }); + FriendHttpClient.Setup(s => s.GetFriendsAsync(It.IsAny())).ReturnsAsync(new List + { + new() + { + CharacterId = TargetSession.Character.CharacterId, + IsConnected = true, + CharacterName = TargetSession.Character.Name, + RelationType = CharacterRelationType.Blocked + } + }); + } - _mapChangeService!.Verify(x => x.ChangeMapInstanceAsync(_session, TestHelpers.Instance.MinilandId, 5, 8), Times.Once); + private void MinilandIsLocked() + { + MinilandProvider.Setup(s => s.GetMiniland(It.IsAny())).Returns(new GameObject.Services.MinilandService.Miniland + { MapInstanceId = TestHelpers.Instance.MinilandId, State = MinilandState.Lock }); } - [TestMethod] - public async Task JoinPrivateAsync() + private void MinilandIsOpen() + { + MinilandProvider.Setup(s => s.GetMiniland(It.IsAny())).Returns(new GameObject.Services.MinilandService.Miniland + { MapInstanceId = TestHelpers.Instance.MinilandId, State = MinilandState.Open }); + } + + private void MinilandIsPrivate() + { + MinilandProvider.Setup(s => s.GetMiniland(It.IsAny())).Returns(new GameObject.Services.MinilandService.Miniland + { MapInstanceId = TestHelpers.Instance.MinilandId, State = MinilandState.Private }); + } + + private async Task JoiningNonConnectedPlayer() { var mjoinPacket = new MJoinPacket { - VisualId = _targetSession!.Character.CharacterId, + VisualId = 50, Type = VisualType.Player }; - _connectedAccountHttpClient.Setup(s => s.GetSubscribersAsync()) - .ReturnsAsync(new List(){ - new Subscriber - { - ChannelId = 1, ConnectedCharacter = new Character { Id = _targetSession.Character.CharacterId } - }, - new Subscriber - { - ChannelId = 1, ConnectedCharacter = new Character { Id = _session!.Character.CharacterId } - } + await MjoinPacketHandler.ExecuteAsync(mjoinPacket, Session); + } - }); - _friendHttpClient.Setup(s => s.GetFriendsAsync(It.IsAny())).ReturnsAsync(new List + private async Task JoiningNonFriend() + { + var mjoinPacket = new MJoinPacket { - new() - { - CharacterId = _targetSession.Character.CharacterId, - IsConnected = true, - CharacterName = _targetSession.Character.Name, - RelationType = CharacterRelationType.Friend - } - }); - _minilandProvider!.Setup(s => s.GetMiniland(It.IsAny())).Returns(new GameObject.Services.MinilandService.Miniland - { MapInstanceId = TestHelpers.Instance.MinilandId, State = MinilandState.Private }); - await _mjoinPacketHandler!.ExecuteAsync(mjoinPacket, _session); - - _mapChangeService!.Verify(x=>x.ChangeMapInstanceAsync(_session, TestHelpers.Instance.MinilandId, 5, 8), Times.Once); + VisualId = TargetSession.Character.CharacterId, + Type = VisualType.Player + }; + await MjoinPacketHandler.ExecuteAsync(mjoinPacket, Session); } - [TestMethod] - public async Task JoinPrivateBlockedAsync() + private async Task JoiningTargetMiniland() { var mjoinPacket = new MJoinPacket { - VisualId = _targetSession!.Character.CharacterId, + VisualId = TargetSession.Character.CharacterId, Type = VisualType.Player }; - _connectedAccountHttpClient.Setup(s => s.GetSubscribersAsync()) - .ReturnsAsync(new List(){ - new Subscriber - { - ChannelId = 1, ConnectedCharacter = new Character { Id = _targetSession.Character.CharacterId } - }, - new Subscriber - { - ChannelId = 1, ConnectedCharacter = new Character { Id = _session!.Character.CharacterId } - } + await MjoinPacketHandler.ExecuteAsync(mjoinPacket, Session); + } - }); - _friendHttpClient.Setup(s => s.GetFriendsAsync(It.IsAny())).ReturnsAsync(new List - { - new() - { - CharacterId = _targetSession.Character.CharacterId, - IsConnected = true, - CharacterName = _targetSession.Character.Name, - RelationType = CharacterRelationType.Blocked - } - }); - _minilandProvider!.Setup(s => s.GetMiniland(It.IsAny())).Returns(new GameObject.Services.MinilandService.Miniland - { MapInstanceId = TestHelpers.Instance.MinilandId, State = MinilandState.Private }); - await _mjoinPacketHandler!.ExecuteAsync(mjoinPacket, _session); + private void MapShouldNotChange() + { + MapChangeService.Verify(x => x.ChangeMapInstanceAsync(Session, TestHelpers.Instance.MinilandId, 5, 8), Times.Never); + } + + private void MapShouldChangeToMiniland() + { + MapChangeService.Verify(x => x.ChangeMapInstanceAsync(Session, TestHelpers.Instance.MinilandId, 5, 8), Times.Once); + } - var lastpacket = (InfoiPacket?)_session.LastPackets.FirstOrDefault(s => s is InfoiPacket); + private void ShouldReceiveMinilandLockedMessage() + { + var lastpacket = (InfoiPacket?)Session.LastPackets.FirstOrDefault(s => s is InfoiPacket); Assert.AreEqual(lastpacket?.Message, Game18NConstString.MinilandLocked); - _mapChangeService!.Verify(x => x.ChangeMapInstanceAsync(_session, TestHelpers.Instance.MinilandId, 5, 8), Times.Never); } } -} \ No newline at end of file +} diff --git a/test/NosCore.PacketHandlers.Tests/Miniland/MinilandObjects/MgPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Miniland/MinilandObjects/MgPacketHandlerTests.cs new file mode 100644 index 000000000..3952dae43 --- /dev/null +++ b/test/NosCore.PacketHandlers.Tests/Miniland/MinilandObjects/MgPacketHandlerTests.cs @@ -0,0 +1,311 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Mapster; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.Data.Dto; +using NosCore.Data.Enumerations; +using NosCore.Data.Enumerations.Items; +using NosCore.Data.StaticEntities; +using NosCore.GameObject.ComponentEntities.Entities; +using NosCore.GameObject.Infastructure; +using NosCore.GameObject.Map; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.GameObject.Services.EventLoaderService; +using NosCore.GameObject.Services.InventoryService; +using NosCore.GameObject.Services.ItemGenerationService; +using NosCore.GameObject.Services.ItemGenerationService.Item; +using NosCore.GameObject.Services.MinilandService; +using NosCore.PacketHandlers.Miniland.MinilandObjects; +using NosCore.Packets.ClientPackets.Inventory; +using NosCore.Packets.ClientPackets.Miniland; +using NosCore.Packets.Enumerations; +using NosCore.Packets.ServerPackets.Chats; +using NosCore.Packets.ServerPackets.Miniland; +using NosCore.Packets.ServerPackets.UI; +using NosCore.Tests.Shared; +using Serilog; +using SpecLight; + +namespace NosCore.PacketHandlers.Tests.Miniland.MinilandObjects +{ + [TestClass] + public class MgPacketHandlerTests + { + private static readonly ILogger Logger = new Mock().Object; + private MgPacketHandler _mgPacketHandler = null!; + private ClientSession _session = null!; + private IMinilandService _minilandProvider = null!; + private InventoryItemInstance _minilandObject = null!; + private ItemGenerationService _itemProvider = null!; + + private List MinilandItems => new() + { + new Item { Type = NoscorePocketType.Miniland, VNum = 3000, ItemType = ItemType.Minigame, MinilandObjectPoint = 100, IsWarehouse = false, EquipmentSlot = EquipmentType.Amulet }, + new Item { Type = NoscorePocketType.Miniland, VNum = 3001, ItemType = ItemType.Minigame, MinilandObjectPoint = 100, IsWarehouse = true } + }; + + [TestInitialize] + public async Task SetupAsync() + { + TypeAdapterConfig.NewConfig() + .ConstructUsing(src => new MapNpc(null, Logger, TestHelpers.Instance.DistanceCalculator, TestHelpers.Instance.Clock)); + await TestHelpers.ResetAsync(); + _session = await TestHelpers.Instance.GenerateSessionAsync(); + await TestHelpers.Instance.MinilandDao.TryInsertOrUpdateAsync(new MinilandDto() + { + OwnerId = _session.Character.CharacterId, + }); + _minilandProvider = new MinilandService(TestHelpers.Instance.MapInstanceAccessorService, + TestHelpers.Instance.FriendHttpClient.Object, + new List {new Map + { + MapId = 20001, + NameI18NKey = "miniland", + Data = new byte[] {} + }}, + TestHelpers.Instance.MinilandDao, + TestHelpers.Instance.MinilandObjectDao, new MinilandRegistry()); + await _minilandProvider.InitializeAsync(_session.Character, TestHelpers.Instance.MapInstanceGeneratorService); + var miniland = _minilandProvider.GetMiniland(_session.Character.CharacterId); + var mapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetMapInstance(miniland.MapInstanceId)!; + _session.Character.MapInstance = mapInstance; + _itemProvider = new ItemGenerationService( + MinilandItems, + new EventLoaderService, IUseItemEventHandler>( + new List>>()), + Logger, + TestHelpers.Instance.LogLanguageLocalizer); + _mgPacketHandler = new MgPacketHandler(_minilandProvider, _itemProvider); + } + + [TestMethod] + public async Task PlayMinigameWithoutObjectShouldFail() + { + await new Spec("Play minigame without object should fail") + .WhenAsync(PlayingMinigameWithoutObject) + .Then(NothingShouldHappen) + .ExecuteAsync(); + } + + [TestMethod] + public async Task PlayMinigameWithWarehouseShouldFail() + { + await new Spec("Play minigame with warehouse should fail") + .Given(WarehouseObjectExistsAndPlaced) + .WhenAsync(PlayingMinigameOnWarehouse) + .Then(NothingShouldHappen) + .ExecuteAsync(); + } + + [TestMethod] + public async Task PlayMinigameWithZeroDurabilityShouldFail() + { + await new Spec("Play minigame with zero durability should fail") + .Given(MinigameObjectExistsAndPlacedWithZeroDurability) + .WhenAsync(PlayingMinigame) + .Then(ShouldReceiveRestoreDurabilityMessage) + .ExecuteAsync(); + } + + [TestMethod] + public async Task PlayMinigameWithZeroMinilandPointsShouldAskConfirmation() + { + await new Spec("Play minigame with zero miniland points should ask confirmation") + .Given(MinigameObjectExistsAndPlaced) + .And(MinilandHasZeroPoints) + .WhenAsync(PlayingMinigame) + .Then(ShouldReceiveConfirmationQuestion) + .ExecuteAsync(); + } + + [TestMethod] + public async Task ShowManagementShouldSucceed() + { + await new Spec("Show management should succeed") + .Given(MinigameObjectExistsAndPlaced) + .WhenAsync(ShowingManagement) + .Then(ShouldReceiveManagementPacket) + .ExecuteAsync(); + } + + [TestMethod] + public async Task ShowGiftsShouldSucceed() + { + await new Spec("Show gifts should succeed") + .Given(MinigameObjectExistsAndPlaced) + .WhenAsync(ShowingGifts) + .Then(ShouldReceiveGiftsPacket) + .ExecuteAsync(); + } + + private void MinigameObjectExistsAndPlaced() + { + var item = _itemProvider.Create(3000, 1); + item.DurabilityPoint = 1000; + _minilandObject = InventoryItemInstance.Create(item, _session.Character.CharacterId); + _minilandObject.Type = NoscorePocketType.Miniland; + _minilandObject.Slot = 0; + _session.Character.InventoryService[_minilandObject.Id] = _minilandObject; + + var mapObject = new MapDesignObject + { + MinilandObjectId = Guid.NewGuid(), + MapX = 5, + MapY = 5, + Slot = 0 + }; + _minilandProvider.AddMinilandObject(mapObject, _session.Character.CharacterId, _minilandObject); + } + + private void MinigameObjectExistsAndPlacedWithZeroDurability() + { + var item = _itemProvider.Create(3000, 1); + item.DurabilityPoint = 0; + _minilandObject = InventoryItemInstance.Create(item, _session.Character.CharacterId); + _minilandObject.Type = NoscorePocketType.Miniland; + _minilandObject.Slot = 0; + _session.Character.InventoryService[_minilandObject.Id] = _minilandObject; + + var mapObject = new MapDesignObject + { + MinilandObjectId = Guid.NewGuid(), + MapX = 5, + MapY = 5, + Slot = 0 + }; + _minilandProvider.AddMinilandObject(mapObject, _session.Character.CharacterId, _minilandObject); + } + + private void WarehouseObjectExistsAndPlaced() + { + var item = _itemProvider.Create(3001, 1); + _minilandObject = InventoryItemInstance.Create(item, _session.Character.CharacterId); + _minilandObject.Type = NoscorePocketType.Miniland; + _minilandObject.Slot = 0; + _session.Character.InventoryService[_minilandObject.Id] = _minilandObject; + + var mapObject = new MapDesignObject + { + MinilandObjectId = Guid.NewGuid(), + MapX = 5, + MapY = 5, + Slot = 0 + }; + _minilandProvider.AddMinilandObject(mapObject, _session.Character.CharacterId, _minilandObject); + } + + private void MinilandHasZeroPoints() + { + var miniland = _minilandProvider.GetMiniland(_session.Character.CharacterId); + miniland.MinilandPoint = 0; + } + + private async Task PlayingMinigameWithoutObject() + { + var minigamePacket = new MinigamePacket + { + Type = 1, + Id = 99, + MinigameVNum = 3000 + }; + await _mgPacketHandler.ExecuteAsync(minigamePacket, _session); + } + + private async Task PlayingMinigameOnWarehouse() + { + var minigamePacket = new MinigamePacket + { + Type = 1, + Id = 0, + MinigameVNum = 3001 + }; + await _mgPacketHandler.ExecuteAsync(minigamePacket, _session); + } + + private async Task PlayingMinigame() + { + var minigamePacket = new MinigamePacket + { + Type = 1, + Id = 0, + MinigameVNum = 3000 + }; + await _mgPacketHandler.ExecuteAsync(minigamePacket, _session); + } + + private async Task ShowingManagement() + { + var minigamePacket = new MinigamePacket + { + Type = 5, + Id = 0, + MinigameVNum = 3000 + }; + await _mgPacketHandler.ExecuteAsync(minigamePacket, _session); + } + + private async Task ShowingGifts() + { + var minigamePacket = new MinigamePacket + { + Type = 7, + Id = 0, + MinigameVNum = 3000 + }; + await _mgPacketHandler.ExecuteAsync(minigamePacket, _session); + } + + private void NothingShouldHappen() + { + Assert.AreEqual(0, _session.LastPackets.Count); + } + + private void ShouldReceiveRestoreDurabilityMessage() + { + var lastPacket = (SayiPacket?)_session.LastPackets.FirstOrDefault(s => s is SayiPacket); + Assert.IsNotNull(lastPacket); + Assert.AreEqual(Game18NConstString.NeedToRestoreDurability, lastPacket.Message); + } + + private void ShouldReceiveConfirmationQuestion() + { + var lastPacket = (QnaiPacket?)_session.LastPackets.FirstOrDefault(s => s is QnaiPacket); + Assert.IsNotNull(lastPacket); + Assert.AreEqual(Game18NConstString.NotEnoughProductionPointsAskStart, lastPacket.Question); + } + + private void ShouldReceiveManagementPacket() + { + var lastPacket = (MloMgPacket?)_session.LastPackets.FirstOrDefault(s => s is MloMgPacket); + Assert.IsNotNull(lastPacket); + } + + private void ShouldReceiveGiftsPacket() + { + var lastPacket = (MloPmgPacket?)_session.LastPackets.FirstOrDefault(s => s is MloPmgPacket); + Assert.IsNotNull(lastPacket); + } + } +} diff --git a/test/NosCore.PacketHandlers.Tests/Miniland/MinilandObjects/UseobjPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Miniland/MinilandObjects/UseobjPacketHandlerTests.cs new file mode 100644 index 000000000..5c3b4bc81 --- /dev/null +++ b/test/NosCore.PacketHandlers.Tests/Miniland/MinilandObjects/UseobjPacketHandlerTests.cs @@ -0,0 +1,227 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Mapster; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.Dao.Interfaces; +using NosCore.Data.Dto; +using NosCore.Data.Enumerations; +using NosCore.Data.Enumerations.Items; +using NosCore.Data.Enumerations.Miniland; +using NosCore.Data.StaticEntities; +using NosCore.Data.WebApi; +using NosCore.GameObject.ComponentEntities.Entities; +using NosCore.GameObject.Infastructure; +using NosCore.GameObject.InterChannelCommunication.Hubs.WarehouseHub; +using NosCore.GameObject.Map; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.GameObject.Services.EventLoaderService; +using NosCore.GameObject.Services.InventoryService; +using NosCore.GameObject.Services.ItemGenerationService; +using NosCore.GameObject.Services.ItemGenerationService.Item; +using NosCore.GameObject.Services.MinilandService; +using NosCore.PacketHandlers.Miniland.MinilandObjects; +using NosCore.Packets.ClientPackets.Inventory; +using NosCore.Packets.Enumerations; +using NosCore.Packets.ServerPackets.Miniland; +using NosCore.Packets.ServerPackets.Warehouse; +using NosCore.Tests.Shared; +using Serilog; +using SpecLight; +using UseObjPacket = NosCore.Packets.ServerPackets.Miniland.UseObjPacket; + +namespace NosCore.PacketHandlers.Tests.Miniland.MinilandObjects +{ + [TestClass] + public class UseobjPacketHandlerTests + { + private static readonly ILogger Logger = new Mock().Object; + private UseobjPacketHandler _useobjPacketHandler = null!; + private ClientSession _session = null!; + private IMinilandService _minilandProvider = null!; + private InventoryItemInstance _minilandObject = null!; + private Mock _warehouseHubMock = null!; + private Mock> _itemInstanceDaoMock = null!; + private ItemGenerationService _itemProvider = null!; + + private List MinilandItems => new() + { + new Item { Type = NoscorePocketType.Miniland, VNum = 3000, ItemType = ItemType.Minigame, MinilandObjectPoint = 100, IsWarehouse = false, EquipmentSlot = EquipmentType.Amulet }, + new Item { Type = NoscorePocketType.Miniland, VNum = 3001, ItemType = ItemType.Minigame, MinilandObjectPoint = 50, IsWarehouse = true } + }; + + [TestInitialize] + public async Task SetupAsync() + { + TypeAdapterConfig.NewConfig() + .ConstructUsing(src => new MapNpc(null, Logger, TestHelpers.Instance.DistanceCalculator, TestHelpers.Instance.Clock)); + await TestHelpers.ResetAsync(); + _session = await TestHelpers.Instance.GenerateSessionAsync(); + await TestHelpers.Instance.MinilandDao.TryInsertOrUpdateAsync(new MinilandDto() + { + OwnerId = _session.Character.CharacterId, + }); + _minilandProvider = new MinilandService(TestHelpers.Instance.MapInstanceAccessorService, + TestHelpers.Instance.FriendHttpClient.Object, + new List {new Map + { + MapId = 20001, + NameI18NKey = "miniland", + Data = new byte[] {} + }}, + TestHelpers.Instance.MinilandDao, + TestHelpers.Instance.MinilandObjectDao, new MinilandRegistry()); + await _minilandProvider.InitializeAsync(_session.Character, TestHelpers.Instance.MapInstanceGeneratorService); + var miniland = _minilandProvider.GetMiniland(_session.Character.CharacterId); + var mapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetMapInstance(miniland.MapInstanceId)!; + _session.Character.MapInstance = mapInstance; + _warehouseHubMock = new Mock(); + _itemInstanceDaoMock = new Mock>(); + _itemProvider = new ItemGenerationService( + MinilandItems, + new EventLoaderService, IUseItemEventHandler>( + new List>>()), + Logger, + TestHelpers.Instance.LogLanguageLocalizer); + _useobjPacketHandler = new UseobjPacketHandler(_minilandProvider, _warehouseHubMock.Object, _itemInstanceDaoMock.Object, _itemProvider); + } + + [TestMethod] + public async Task UseObjectWithoutObjectShouldFail() + { + await new Spec("Use object without object should fail") + .WhenAsync(UsingNonExistentObject) + .Then(NothingShouldHappen) + .ExecuteAsync(); + } + + [TestMethod] + public async Task UseMinigameObjectShouldShowInfo() + { + await new Spec("Use minigame object should show info") + .Given(MinigameObjectExistsAndPlaced) + .WhenAsync(UsingMinigameObject) + .Then(ShouldReceiveMinigameInfoPacket) + .ExecuteAsync(); + } + + [TestMethod] + public async Task UseWarehouseObjectShouldShowWarehouse() + { + await new Spec("Use warehouse object should show warehouse") + .Given(WarehouseObjectExistsAndPlaced) + .And(WarehouseHubReturnsEmptyList) + .WhenAsync(UsingWarehouseObject) + .Then(ShouldReceiveWarehousePacket) + .ExecuteAsync(); + } + + private void MinigameObjectExistsAndPlaced() + { + var item = _itemProvider.Create(3000, 1); + item.DurabilityPoint = 1000; + _minilandObject = InventoryItemInstance.Create(item, _session.Character.CharacterId); + _minilandObject.Type = NoscorePocketType.Miniland; + _minilandObject.Slot = 0; + _session.Character.InventoryService[_minilandObject.Id] = _minilandObject; + + var mapObject = new MapDesignObject + { + MinilandObjectId = Guid.NewGuid(), + MapX = 5, + MapY = 5, + Slot = 0 + }; + _minilandProvider.AddMinilandObject(mapObject, _session.Character.CharacterId, _minilandObject); + } + + private void WarehouseObjectExistsAndPlaced() + { + var item = _itemProvider.Create(3001, 1); + _minilandObject = InventoryItemInstance.Create(item, _session.Character.CharacterId); + _minilandObject.Type = NoscorePocketType.Miniland; + _minilandObject.Slot = 0; + _session.Character.InventoryService[_minilandObject.Id] = _minilandObject; + + var mapObject = new MapDesignObject + { + MinilandObjectId = Guid.NewGuid(), + MapX = 5, + MapY = 5, + Slot = 0 + }; + _minilandProvider.AddMinilandObject(mapObject, _session.Character.CharacterId, _minilandObject); + } + + private void WarehouseHubReturnsEmptyList() + { + _warehouseHubMock.Setup(x => x.GetWarehouseItems(null, _session.Character.CharacterId, WarehouseType.Warehouse, null)) + .ReturnsAsync(new List()); + } + + private async Task UsingNonExistentObject() + { + var useobjPacket = new UseObjPacket + { + ObjectId = 99 + }; + await _useobjPacketHandler.ExecuteAsync(useobjPacket, _session); + } + + private async Task UsingMinigameObject() + { + var useobjPacket = new UseObjPacket + { + ObjectId = 0 + }; + await _useobjPacketHandler.ExecuteAsync(useobjPacket, _session); + } + + private async Task UsingWarehouseObject() + { + var useobjPacket = new UseObjPacket + { + ObjectId = 0 + }; + await _useobjPacketHandler.ExecuteAsync(useobjPacket, _session); + } + + private void NothingShouldHappen() + { + Assert.AreEqual(0, _session.LastPackets.Count); + } + + private void ShouldReceiveMinigameInfoPacket() + { + var lastPacket = (MloInfoPacket?)_session.LastPackets.FirstOrDefault(s => s is MloInfoPacket); + Assert.IsNotNull(lastPacket); + } + + private void ShouldReceiveWarehousePacket() + { + var lastPacket = (StashAllPacket?)_session.LastPackets.FirstOrDefault(s => s is StashAllPacket); + Assert.IsNotNull(lastPacket); + } + } +} diff --git a/test/NosCore.PacketHandlers.Tests/Miniland/MlEditPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Miniland/MlEditPacketHandlerTests.cs index 2c9733bfd..3af819871 100644 --- a/test/NosCore.PacketHandlers.Tests/Miniland/MlEditPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Miniland/MlEditPacketHandlerTests.cs @@ -2,18 +2,18 @@ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . @@ -27,6 +27,7 @@ using NosCore.Data.Dto; using NosCore.Data.StaticEntities; using NosCore.Data.WebApi; +using NosCore.GameObject.ComponentEntities.Entities; using NosCore.GameObject.Map; using NosCore.GameObject.Networking.ClientSession; using NosCore.GameObject.Services.MinilandService; @@ -37,7 +38,7 @@ using NosCore.Packets.ServerPackets.UI; using NosCore.Tests.Shared; using Serilog; -using NosCore.GameObject.ComponentEntities.Entities; +using SpecLight; namespace NosCore.PacketHandlers.Tests.Miniland { @@ -45,11 +46,10 @@ namespace NosCore.PacketHandlers.Tests.Miniland public class MlEditPacketHandlerTests { private static readonly ILogger Logger = new Mock().Object; - private MlEditPacketHandler? _mlEditPacketHandler; - - private ClientSession? _session; - private IMinilandService _minilandProvider = null!; - private ClientSession _session2 = null!; + private MlEditPacketHandler MlEditPacketHandler = null!; + private ClientSession Session = null!; + private IMinilandService MinilandProvider = null!; + private ClientSession Session2 = null!; [TestInitialize] public async Task SetupAsync() @@ -57,8 +57,8 @@ public async Task SetupAsync() TypeAdapterConfig.NewConfig() .ConstructUsing(src => new MapNpc(null, Logger, TestHelpers.Instance.DistanceCalculator, TestHelpers.Instance.Clock)); await TestHelpers.ResetAsync(); - _session = await TestHelpers.Instance.GenerateSessionAsync(); - _session2 = await TestHelpers.Instance.GenerateSessionAsync(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + Session2 = await TestHelpers.Instance.GenerateSessionAsync(); var session3 = await TestHelpers.Instance.GenerateSessionAsync(); TestHelpers.Instance.FriendHttpClient .Setup(s => s.GetFriendsAsync(It.IsAny())) @@ -66,8 +66,8 @@ public async Task SetupAsync() { new() { - CharacterId = _session2.Character.CharacterId, - CharacterName = _session2.Character.Name, + CharacterId = Session2.Character.CharacterId, + CharacterName = Session2.Character.Name, IsConnected = true, RelationType = CharacterRelationType.Friend, CharacterRelationId = Guid.NewGuid() @@ -75,9 +75,9 @@ public async Task SetupAsync() }); await TestHelpers.Instance.MinilandDao.TryInsertOrUpdateAsync(new MinilandDto() { - OwnerId = _session.Character.CharacterId, + OwnerId = Session.Character.CharacterId, }); - _minilandProvider = new MinilandService(TestHelpers.Instance.MapInstanceAccessorService, + MinilandProvider = new MinilandService(TestHelpers.Instance.MapInstanceAccessorService, TestHelpers.Instance.FriendHttpClient.Object, new List {new Map { @@ -87,136 +87,194 @@ await TestHelpers.Instance.MinilandDao.TryInsertOrUpdateAsync(new MinilandDto() }}, TestHelpers.Instance.MinilandDao, TestHelpers.Instance.MinilandObjectDao, new MinilandRegistry()); - await _minilandProvider.InitializeAsync(_session.Character, TestHelpers.Instance.MapInstanceGeneratorService); - var miniland = _minilandProvider.GetMiniland(_session.Character.CharacterId); + await MinilandProvider.InitializeAsync(Session.Character, TestHelpers.Instance.MapInstanceGeneratorService); + var miniland = MinilandProvider.GetMiniland(Session.Character.CharacterId); var mapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetMapInstance(miniland.MapInstanceId)!; - _session.Character.MapInstance = mapInstance; - _session2.Character.MapInstance = mapInstance; - session3.Character.MapInstance = mapInstance; - _mlEditPacketHandler = new MlEditPacketHandler(_minilandProvider); + Session.Character.MapInstance = mapInstance; + Session2.Character.MapInstance = mapInstance; + session3.Character.MapInstance = mapInstance; + MlEditPacketHandler = new MlEditPacketHandler(MinilandProvider); + } + + [TestMethod] + public async Task CanChangeMinilandMessage() + { + await new Spec("Can change miniland message") + .WhenAsync(ChangingMinilandMessageAsync) + .Then(MinilandMessageShouldBeChanged) + .And(InfoPacketShouldBeSent) + .ExecuteAsync(); + } + + [TestMethod] + public async Task CanChangeMinilandMessageWithSpace() + { + await new Spec("Can change miniland message with space") + .WhenAsync(ChangingMinilandMessageWithSpaceAsync) + .Then(MinilandMessageWithSpaceShouldBeChanged) + .And(InfoPacketShouldBeSent) + .ExecuteAsync(); } [TestMethod] - public async Task CanChangeMinilandMessageAsync() + public async Task CanLockMiniland() { + await new Spec("Can lock miniland") + .WhenAsync(LockingMinilandAsync) + .Then(MinilandShouldBeLocked) + .ExecuteAsync(); + } + [TestMethod] + public async Task CanOpenMiniland() + { + await new Spec("Can open miniland") + .WhenAsync(OpeningMinilandAsync) + .Then(MinilandShouldBeOpen) + .ExecuteAsync(); + } + + [TestMethod] + public async Task CanSetMinilandPrivate() + { + await new Spec("Can set miniland private") + .WhenAsync(SettingMinilandPrivateAsync) + .Then(MinilandShouldBePrivate) + .ExecuteAsync(); + } + + [TestMethod] + public async Task PrivateKicksEveryoneButFriend() + { + await new Spec("Private kicks everyone but friend") + .WhenAsync(SettingMinilandPrivateAsync) + .Then(OnlyOwnerAndFriendShouldRemain) + .ExecuteAsync(); + } + + [TestMethod] + public async Task LockKicksEveryone() + { + await new Spec("Lock kicks everyone") + .WhenAsync(LockingMinilandAsync) + .Then(OnlyOwnerShouldRemain) + .ExecuteAsync(); + } + + private async Task ChangingMinilandMessageAsync() + { var mleditPacket = new MLEditPacket() { MinilandInfo = "test", Type = 1 }; - await _mlEditPacketHandler!.ExecuteAsync(mleditPacket, _session!); - var lastpacket = (InfoiPacket?)_session!.LastPackets.FirstOrDefault(s => s is InfoiPacket); - Assert.AreEqual(Game18NConstString.MinilandChanged, lastpacket!.Message); - var miniland = _minilandProvider.GetMiniland(_session.Character.CharacterId); - Assert.AreEqual("test", miniland.MinilandMessage); - var lastpacket2 = (MlintroPacket?)_session!.LastPackets.FirstOrDefault(s => s is MlintroPacket); - Assert.AreEqual("test", lastpacket2?.Intro); + await MlEditPacketHandler.ExecuteAsync(mleditPacket, Session); } - [TestMethod] - public async Task CanChangeMinilandMessageWithSpaceAsync() + private async Task ChangingMinilandMessageWithSpaceAsync() { var mleditPacket = new MLEditPacket() { MinilandInfo = "Test Test", Type = 1 }; - await _mlEditPacketHandler!.ExecuteAsync(mleditPacket, _session!); - var lastpacket = (InfoiPacket?)_session!.LastPackets.FirstOrDefault(s => s is InfoiPacket); - Assert.AreEqual(Game18NConstString.MinilandChanged, lastpacket!.Message); - var miniland = _minilandProvider.GetMiniland(_session.Character.CharacterId); - Assert.AreEqual("Test Test", miniland.MinilandMessage); - var lastpacket2 = (MlintroPacket?)_session!.LastPackets.FirstOrDefault(s => s is MlintroPacket); - Assert.AreEqual("Test^Test", lastpacket2?.Intro); + await MlEditPacketHandler.ExecuteAsync(mleditPacket, Session); } - [TestMethod] - public async Task CanLockMinilandAsync() + private async Task LockingMinilandAsync() { var mleditPacket = new MLEditPacket() { Parameter = MinilandState.Lock, Type = 2 }; - await _mlEditPacketHandler!.ExecuteAsync(mleditPacket, _session!); - var lastpacket = (MsgiPacket?)_session!.LastPackets.FirstOrDefault(s => s is MsgiPacket); - Assert.AreEqual(lastpacket?.Message, Game18NConstString.MinilandLocked); - var miniland = _minilandProvider.GetMiniland(_session.Character.CharacterId); - Assert.AreEqual(MinilandState.Lock, miniland.State); + await MlEditPacketHandler.ExecuteAsync(mleditPacket, Session); } - - [TestMethod] - public async Task CanOpenMinilandAsync() + private async Task OpeningMinilandAsync() { var mleditPacket = new MLEditPacket() { Parameter = MinilandState.Open, Type = 2 }; - await _mlEditPacketHandler!.ExecuteAsync(mleditPacket, _session!); - var lastpacket = (MsgiPacket?)_session!.LastPackets.FirstOrDefault(s => s is MsgiPacket); - Assert.AreEqual(lastpacket?.Message, Game18NConstString.MinilandPublic); - var miniland = _minilandProvider.GetMiniland(_session.Character.CharacterId); - Assert.AreEqual(MinilandState.Open, miniland.State); + await MlEditPacketHandler.ExecuteAsync(mleditPacket, Session); } - - [TestMethod] - public async Task CanPrivateMinilandAsync() + private async Task SettingMinilandPrivateAsync() { var mleditPacket = new MLEditPacket() { Parameter = MinilandState.Private, Type = 2 }; - await _mlEditPacketHandler!.ExecuteAsync(mleditPacket, _session!); - var lastpacket = (MsgiPacket?)_session!.LastPackets.FirstOrDefault(s => s is MsgiPacket); - Assert.AreEqual(lastpacket?.Message, Game18NConstString.MinilandPrivate); - var miniland = _minilandProvider.GetMiniland(_session.Character.CharacterId); - Assert.AreEqual(MinilandState.Private, miniland.State); + await MlEditPacketHandler.ExecuteAsync(mleditPacket, Session); } - [TestMethod] - public async Task PrivateKickEveryoneButFriendAsync() + private void MinilandMessageShouldBeChanged() { - var mleditPacket = new MLEditPacket() - { - Parameter = MinilandState.Private, - Type = 2 - }; - await _mlEditPacketHandler!.ExecuteAsync(mleditPacket, _session!); + var miniland = MinilandProvider.GetMiniland(Session.Character.CharacterId); + Assert.AreEqual("test", miniland.MinilandMessage); + var lastpacket2 = (MlintroPacket?)Session.LastPackets.FirstOrDefault(s => s is MlintroPacket); + Assert.AreEqual("test", lastpacket2?.Intro); + } + + private void MinilandMessageWithSpaceShouldBeChanged() + { + var miniland = MinilandProvider.GetMiniland(Session.Character.CharacterId); + Assert.AreEqual("Test Test", miniland.MinilandMessage); + var lastpacket2 = (MlintroPacket?)Session.LastPackets.FirstOrDefault(s => s is MlintroPacket); + Assert.AreEqual("Test^Test", lastpacket2?.Intro); + } + + private void InfoPacketShouldBeSent() + { + var lastpacket = (InfoiPacket?)Session.LastPackets.FirstOrDefault(s => s is InfoiPacket); + Assert.AreEqual(Game18NConstString.MinilandChanged, lastpacket!.Message); + } + + private void MinilandShouldBeLocked() + { + var lastpacket = (MsgiPacket?)Session.LastPackets.FirstOrDefault(s => s is MsgiPacket); + Assert.AreEqual(lastpacket?.Message, Game18NConstString.MinilandLocked); + var miniland = MinilandProvider.GetMiniland(Session.Character.CharacterId); + Assert.AreEqual(MinilandState.Lock, miniland.State); + } - var miniland = _minilandProvider.GetMiniland(_session!.Character.CharacterId); + private void MinilandShouldBeOpen() + { + var lastpacket = (MsgiPacket?)Session.LastPackets.FirstOrDefault(s => s is MsgiPacket); + Assert.AreEqual(lastpacket?.Message, Game18NConstString.MinilandPublic); + var miniland = MinilandProvider.GetMiniland(Session.Character.CharacterId); + Assert.AreEqual(MinilandState.Open, miniland.State); + } + + private void MinilandShouldBePrivate() + { + var lastpacket = (MsgiPacket?)Session.LastPackets.FirstOrDefault(s => s is MsgiPacket); + Assert.AreEqual(lastpacket?.Message, Game18NConstString.MinilandPrivate); + var miniland = MinilandProvider.GetMiniland(Session.Character.CharacterId); Assert.AreEqual(MinilandState.Private, miniland.State); + } + private void OnlyOwnerAndFriendShouldRemain() + { + var miniland = MinilandProvider.GetMiniland(Session.Character.CharacterId); Assert.IsFalse(TestHelpers.Instance.SessionRegistry.GetCharacters() .Where(s => s.MapInstanceId == miniland.MapInstanceId) - .Any(s => s.VisualId != _session.Character.CharacterId && s.VisualId != _session2.Character.VisualId)); + .Any(s => s.VisualId != Session.Character.CharacterId && s.VisualId != Session2.Character.VisualId)); Assert.AreEqual(2, TestHelpers.Instance.SessionRegistry .GetCharacters().Count(s => s.MapInstanceId == miniland.MapInstanceId)); } - [TestMethod] - public async Task LockKickEveryoneAsync() + private void OnlyOwnerShouldRemain() { - var mleditPacket = new MLEditPacket() - { - Parameter = MinilandState.Lock, - Type = 2 - }; - await _mlEditPacketHandler!.ExecuteAsync(mleditPacket, _session!); - - var miniland = _minilandProvider.GetMiniland(_session!.Character.CharacterId); - Assert.AreEqual(MinilandState.Lock, miniland.State); - + var miniland = MinilandProvider.GetMiniland(Session.Character.CharacterId); Assert.IsFalse(TestHelpers.Instance.SessionRegistry.GetCharacters() .Where(s => s.MapInstanceId == miniland.MapInstanceId) - .Any(s => s.VisualId != _session.Character.CharacterId)); - + .Any(s => s.VisualId != Session.Character.CharacterId)); Assert.AreEqual(1, TestHelpers.Instance.SessionRegistry .GetCharacters().Count(s => s.MapInstanceId == miniland.MapInstanceId)); } } -} \ No newline at end of file +} diff --git a/test/NosCore.PacketHandlers.Tests/Miniland/RmvobjPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Miniland/RmvobjPacketHandlerTests.cs new file mode 100644 index 000000000..cde040787 --- /dev/null +++ b/test/NosCore.PacketHandlers.Tests/Miniland/RmvobjPacketHandlerTests.cs @@ -0,0 +1,222 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Mapster; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.Data.Dto; +using NosCore.Data.Enumerations; +using NosCore.Data.Enumerations.Items; +using NosCore.Data.StaticEntities; +using NosCore.GameObject.ComponentEntities.Entities; +using NosCore.GameObject.Infastructure; +using NosCore.GameObject.Map; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.GameObject.Services.EventLoaderService; +using NosCore.GameObject.Services.InventoryService; +using NosCore.GameObject.Services.ItemGenerationService; +using NosCore.GameObject.Services.ItemGenerationService.Item; +using NosCore.GameObject.Services.MinilandService; +using NosCore.PacketHandlers.Miniland; +using NosCore.Packets.ClientPackets.Inventory; +using NosCore.Packets.ClientPackets.Miniland; +using NosCore.Packets.Enumerations; +using NosCore.Packets.ServerPackets.UI; +using NosCore.Tests.Shared; +using Serilog; +using SpecLight; + +namespace NosCore.PacketHandlers.Tests.Miniland +{ + [TestClass] + public class RmvobjPacketHandlerTests + { + private static readonly ILogger Logger = new Mock().Object; + private RmvobjPacketHandler _rmvobjPacketHandler = null!; + private ClientSession _session = null!; + private IMinilandService _minilandProvider = null!; + private InventoryItemInstance _minilandObject = null!; + private ItemGenerationService _itemProvider = null!; + + private List MinilandItems => new() + { + new Item { Type = NoscorePocketType.Miniland, VNum = 3000, ItemType = ItemType.Minigame, MinilandObjectPoint = 100 } + }; + + [TestInitialize] + public async Task SetupAsync() + { + TypeAdapterConfig.NewConfig() + .ConstructUsing(src => new MapNpc(null, Logger, TestHelpers.Instance.DistanceCalculator, TestHelpers.Instance.Clock)); + await TestHelpers.ResetAsync(); + _session = await TestHelpers.Instance.GenerateSessionAsync(); + await TestHelpers.Instance.MinilandDao.TryInsertOrUpdateAsync(new MinilandDto() + { + OwnerId = _session.Character.CharacterId, + }); + _minilandProvider = new MinilandService(TestHelpers.Instance.MapInstanceAccessorService, + TestHelpers.Instance.FriendHttpClient.Object, + new List {new Map + { + MapId = 20001, + NameI18NKey = "miniland", + Data = new byte[] {} + }}, + TestHelpers.Instance.MinilandDao, + TestHelpers.Instance.MinilandObjectDao, new MinilandRegistry()); + await _minilandProvider.InitializeAsync(_session.Character, TestHelpers.Instance.MapInstanceGeneratorService); + var miniland = _minilandProvider.GetMiniland(_session.Character.CharacterId); + var mapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetMapInstance(miniland.MapInstanceId)!; + _session.Character.MapInstance = mapInstance; + _rmvobjPacketHandler = new RmvobjPacketHandler(_minilandProvider); + _itemProvider = new ItemGenerationService( + MinilandItems, + new EventLoaderService, IUseItemEventHandler>( + new List>>()), + Logger, + TestHelpers.Instance.LogLanguageLocalizer); + } + + [TestMethod] + public async Task RemoveObjectWithoutItemShouldFail() + { + await new Spec("Remove object without item should fail") + .Given(MinilandIsLocked) + .WhenAsync(RemovingNonExistentObject) + .Then(NothingShouldChange) + .ExecuteAsync(); + } + + [TestMethod] + public async Task RemoveObjectWhenMinilandNotLockedShouldFail() + { + await new Spec("Remove object when miniland not locked should fail") + .Given(MinilandObjectExistsAndPlaced) + .And(MinilandIsOpen) + .WhenAsync(RemovingMinilandObject) + .Then(ShouldReceiveRemoveOnlyLockModeMessage) + .And(ObjectShouldStillExist) + .ExecuteAsync(); + } + + [TestMethod] + public async Task RemoveObjectWhenLockedShouldSucceed() + { + await new Spec("Remove object when locked should succeed") + .Given(MinilandObjectExistsAndPlaced) + .And(MinilandIsLocked) + .WhenAsync(RemovingMinilandObject) + .Then(ObjectShouldBeRemoved) + .ExecuteAsync(); + } + + [TestMethod] + public async Task RemoveNonPlacedObjectShouldFail() + { + await new Spec("Remove non placed object should fail") + .Given(MinilandObjectExistsButNotPlaced) + .And(MinilandIsLocked) + .WhenAsync(RemovingMinilandObject) + .Then(NothingShouldChange) + .ExecuteAsync(); + } + + private void MinilandIsLocked() + { + var miniland = _minilandProvider.GetMiniland(_session.Character.CharacterId); + miniland.State = MinilandState.Lock; + } + + private void MinilandIsOpen() + { + var miniland = _minilandProvider.GetMiniland(_session.Character.CharacterId); + miniland.State = MinilandState.Open; + } + + private void MinilandObjectExistsAndPlaced() + { + var item = _itemProvider.Create(3000, 1); + _minilandObject = InventoryItemInstance.Create(item, _session.Character.CharacterId); + _minilandObject.Type = NoscorePocketType.Miniland; + _minilandObject.Slot = 0; + _session.Character.InventoryService[_minilandObject.Id] = _minilandObject; + + var mapObject = new MapDesignObject + { + MinilandObjectId = Guid.NewGuid(), + MapX = 5, + MapY = 5 + }; + _minilandProvider.AddMinilandObject(mapObject, _session.Character.CharacterId, _minilandObject); + } + + private void MinilandObjectExistsButNotPlaced() + { + var item = _itemProvider.Create(3000, 1); + _minilandObject = InventoryItemInstance.Create(item, _session.Character.CharacterId); + _minilandObject.Type = NoscorePocketType.Miniland; + _minilandObject.Slot = 0; + _session.Character.InventoryService[_minilandObject.Id] = _minilandObject; + } + + private async Task RemovingNonExistentObject() + { + var rmvobjPacket = new RmvobjPacket + { + Slot = 99 + }; + await _rmvobjPacketHandler.ExecuteAsync(rmvobjPacket, _session); + } + + private async Task RemovingMinilandObject() + { + var rmvobjPacket = new RmvobjPacket + { + Slot = 0 + }; + await _rmvobjPacketHandler.ExecuteAsync(rmvobjPacket, _session); + } + + private void NothingShouldChange() + { + var msgiPacket = _session.LastPackets.FirstOrDefault(s => s is MsgiPacket); + Assert.IsNull(msgiPacket); + } + + private void ObjectShouldStillExist() + { + Assert.AreEqual(1, _session.Character.MapInstance.MapDesignObjects.Count); + } + + private void ObjectShouldBeRemoved() + { + Assert.AreEqual(0, _session.Character.MapInstance.MapDesignObjects.Count); + } + + private void ShouldReceiveRemoveOnlyLockModeMessage() + { + var lastPacket = (MsgiPacket?)_session.LastPackets.FirstOrDefault(s => s is MsgiPacket); + Assert.AreEqual(Game18NConstString.RemoveOnlyLockMode, lastPacket?.Message); + } + } +} diff --git a/test/NosCore.PacketHandlers.Tests/Movement/ClientDirPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Movement/ClientDirPacketHandlerTests.cs new file mode 100644 index 000000000..43829c69c --- /dev/null +++ b/test/NosCore.PacketHandlers.Tests/Movement/ClientDirPacketHandlerTests.cs @@ -0,0 +1,107 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.GameObject.Networking; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.PacketHandlers.Movement; +using NosCore.Packets.ClientPackets.Movement; +using NosCore.Shared.Enumerations; +using NosCore.Tests.Shared; +using Serilog; +using SpecLight; + +namespace NosCore.PacketHandlers.Tests.Movement +{ + [TestClass] + public class ClientDirPacketHandlerTests + { + private ClientDirPacketHandler Handler = null!; + private ClientSession Session = null!; + private readonly ILogger Logger = new Mock().Object; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Broadcaster.Reset(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + Handler = new ClientDirPacketHandler( + Logger, + TestHelpers.Instance.LogLanguageLocalizer); + } + + [TestMethod] + public async Task ChangingDirectionForPlayerShouldExecute() + { + await new Spec("Changing direction for player should execute") + .Given(CharacterIsOnMap) + .WhenAsync(ChangingDirectionForPlayer) + .Then(HandlerShouldComplete) + .ExecuteAsync(); + } + + [TestMethod] + public async Task ChangingDirectionForUnknownVisualTypeShouldBeIgnored() + { + await new Spec("Changing direction for unknown visual type should be ignored") + .Given(CharacterIsOnMap) + .WhenAsync(ChangingDirectionForUnknownVisualType) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); + } + + private void CharacterIsOnMap() + { + Session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; + } + + private async Task ChangingDirectionForPlayer() + { + await Handler.ExecuteAsync(new ClientDirPacket + { + VisualType = VisualType.Player, + VisualId = Session.Character.VisualId, + Direction = 2 + }, Session); + } + + private async Task ChangingDirectionForUnknownVisualType() + { + await Handler.ExecuteAsync(new ClientDirPacket + { + VisualType = (VisualType)99, + VisualId = Session.Character.VisualId, + Direction = 2 + }, Session); + } + + private void HandlerShouldComplete() + { + Assert.AreEqual(0, Session.LastPackets.Count); + } + + private void NoPacketShouldBeSent() + { + Assert.AreEqual(0, Session.LastPackets.Count); + } + } +} diff --git a/test/NosCore.PacketHandlers.Tests/Movement/PreqPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Movement/PreqPacketHandlerTests.cs index 66fc1e403..fb4767dcf 100644 --- a/test/NosCore.PacketHandlers.Tests/Movement/PreqPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Movement/PreqPacketHandlerTests.cs @@ -2,135 +2,128 @@ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; using Microsoft.VisualStudio.TestTools.UnitTesting; using Moq; -using NodaTime; -using NosCore.Data.Enumerations.Map; +using NosCore.GameObject.Networking; using NosCore.GameObject.Networking.ClientSession; using NosCore.GameObject.Services.MapChangeService; using NosCore.GameObject.Services.MinilandService; using NosCore.PacketHandlers.Movement; using NosCore.Packets.ClientPackets.Movement; +using NosCore.Packets.Enumerations; +using NosCore.Packets.ServerPackets.Chats; +using NosCore.PathFinder.Interfaces; using NosCore.Tests.Shared; -using NosCore.GameObject.ComponentEntities.Entities; +using SpecLight; namespace NosCore.PacketHandlers.Tests.Movement { [TestClass] public class PreqPacketHandlerTests { - private Mock? _minilandProvider; - private PreqPacketHandler? _preqPacketHandler; - private ClientSession? _session; - private Mock? _mapChangeService; + private PreqPacketHandler Handler = null!; + private ClientSession Session = null!; + private Mock DistanceCalculator = null!; + private Mock MinilandService = null!; + private Mock MapChangeService = null!; [TestInitialize] public async Task SetupAsync() { await TestHelpers.ResetAsync(); - _session = await TestHelpers.Instance.GenerateSessionAsync(); - _minilandProvider = new Mock(); - _mapChangeService = new Mock(); - _minilandProvider.Setup(s => s.GetMinilandPortals(It.IsAny())).Returns(new List()); - _preqPacketHandler = - new PreqPacketHandler(TestHelpers.Instance.MapInstanceAccessorService, _minilandProvider.Object, TestHelpers.Instance.DistanceCalculator, TestHelpers.Instance.Clock, _mapChangeService.Object); - _session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(0)!; + Broadcaster.Reset(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + DistanceCalculator = new Mock(); + MinilandService = new Mock(); + MapChangeService = new Mock(); - _session.Character.MapInstance.Portals = new List - { - new() - { - DestinationMapId = 1, - DestinationMapInstanceId = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!.MapInstanceId, - DestinationX = 5, DestinationY = 5, SourceMapId = 0, - SourceMapInstanceId = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(0)!.MapInstanceId, - SourceX = 0, SourceY = 0 - } - }; + DistanceCalculator.Setup(x => x.GetDistance(It.IsAny<(short, short)>(), It.IsAny<(short, short)>())) + .Returns(10); + + MinilandService.Setup(x => x.GetMinilandPortals(It.IsAny())) + .Returns(new List()); + + Handler = new PreqPacketHandler( + TestHelpers.Instance.MapInstanceAccessorService, + MinilandService.Object, + DistanceCalculator.Object, + TestHelpers.Instance.Clock, + MapChangeService.Object); } [TestMethod] - public async Task UserCanUsePortalAsync() + public async Task UsingPortalTooQuicklyShouldShowCooldownMessage() { - _session!.Character.PositionX = 0; - _session.Character.PositionY = 0; - await _preqPacketHandler!.ExecuteAsync(new PreqPacket(), _session); - - _mapChangeService!.Verify(x => x.ChangeMapInstanceAsync(_session, TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!.MapInstanceId, 5, 5), Times.Once); + await new Spec("Using portal too quickly should show cooldown message") + .Given(CharacterIsOnMap) + .And(CharacterRecentlyUsedPortal) + .WhenAsync(UsingPortal) + .Then(ShouldReceiveCooldownMessage) + .ExecuteAsync(); } [TestMethod] - public async Task UserLastPortalSetOnUsageAsync() + public async Task UsingPortalWhenNoPortalNearbyShouldBeIgnored() { - _session!.Character.PositionX = 0; - _session.Character.PositionY = 0; - - var time = TestHelpers.Instance.Clock.GetCurrentInstant(); - await _preqPacketHandler!.ExecuteAsync(new PreqPacket(), _session); - Assert.IsTrue(_session.Character.LastPortal == time); + await new Spec("Using portal when no portal nearby should be ignored") + .Given(CharacterIsOnMap) + .And(NoPortalNearby) + .WhenAsync(UsingPortal) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); } - [TestMethod] - public async Task UserCanTUsePortalIfRecentlyMovedAsync() + private void CharacterIsOnMap() { - _session!.Character.PositionX = 0; - _session.Character.PositionY = 0; - var time = TestHelpers.Instance.Clock.GetCurrentInstant(); - _session.Character.LastPortal = time.Plus(Duration.FromMinutes(1)); - _session.Character.LastMove = time; - await _preqPacketHandler!.ExecuteAsync(new PreqPacket(), _session); - _mapChangeService!.Verify(x => x.ChangeMapInstanceAsync(_session, TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!.MapInstanceId, 5, 5), Times.Never); + Session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; + Session.Character.PositionX = 10; + Session.Character.PositionY = 10; } - [TestMethod] - public async Task UserCanTUsePortalIfRecentlyUsedAsync() + private void CharacterRecentlyUsedPortal() { - _session!.Character.PositionX = 0; - _session.Character.PositionY = 0; - var time = TestHelpers.Instance.Clock.GetCurrentInstant(); - _session.Character.LastPortal = time; - await _preqPacketHandler!.ExecuteAsync(new PreqPacket(), _session); - _mapChangeService!.Verify(x => x.ChangeMapInstanceAsync(_session, TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!.MapInstanceId, 5, 5), Times.Never); + Session.Character.LastPortal = TestHelpers.Instance.Clock.GetCurrentInstant(); } + private void NoPortalNearby() + { + DistanceCalculator.Setup(x => x.GetDistance(It.IsAny<(short, short)>(), It.IsAny<(short, short)>())) + .Returns(100); + } - [TestMethod] - public async Task UserCanTUsePortalIfTooFarAsync() + private async Task UsingPortal() { - _session!.Character.PositionX = 8; - _session.Character.PositionY = 8; - await _preqPacketHandler!.ExecuteAsync(new PreqPacket(), _session); - _mapChangeService!.Verify(x => x.ChangeMapInstanceAsync(_session, TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!.MapInstanceId, 5, 5), Times.Never); + await Handler.ExecuteAsync(new PreqPacket(), Session); } - [TestMethod] - public async Task UserFromInstanceGoesBackToOriginePlaceAsync() + private void ShouldReceiveCooldownMessage() { - _session!.Character.MapX = 5; - _session.Character.MapY = 5; - _session.Character.PositionX = 0; - _session.Character.PositionY = 0; - _session.Character.MapInstance.MapInstanceType = MapInstanceType.NormalInstance; - await _preqPacketHandler!.ExecuteAsync(new PreqPacket(), _session); + var packet = Session.LastPackets.OfType().FirstOrDefault(); + Assert.IsNotNull(packet); + Assert.AreEqual(Game18NConstString.WillMoveShortly, packet.Message); + } - _mapChangeService!.Verify(x => x.ChangeMapAsync(_session, 1, 5, 5), Times.Once); + private void NoPacketShouldBeSent() + { + Assert.AreEqual(0, Session.LastPackets.Count); } } -} \ No newline at end of file +} diff --git a/test/NosCore.PacketHandlers.Tests/Movement/SitPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Movement/SitPacketHandlerTests.cs new file mode 100644 index 000000000..862aeefe1 --- /dev/null +++ b/test/NosCore.PacketHandlers.Tests/Movement/SitPacketHandlerTests.cs @@ -0,0 +1,119 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.GameObject.Networking; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.PacketHandlers.Movement; +using NosCore.Packets.ClientPackets.Movement; +using NosCore.Shared.Enumerations; +using NosCore.Tests.Shared; +using Serilog; +using SpecLight; + +namespace NosCore.PacketHandlers.Tests.Movement +{ + [TestClass] + public class SitPacketHandlerTests + { + private SitPacketHandler Handler = null!; + private ClientSession Session = null!; + private readonly ILogger Logger = new Mock().Object; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Broadcaster.Reset(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + Handler = new SitPacketHandler( + Logger, + TestHelpers.Instance.LogLanguageLocalizer, + TestHelpers.Instance.SessionRegistry); + } + + [TestMethod] + public async Task SitWithOwnCharacterShouldExecute() + { + await new Spec("Sit with own character should execute") + .Given(CharacterIsOnMap) + .WhenAsync(SittingWithOwnCharacter) + .Then(HandlerShouldComplete) + .ExecuteAsync(); + } + + [TestMethod] + public async Task SitWithUnknownVisualTypeShouldBeIgnored() + { + await new Spec("Sit with unknown visual type should be ignored") + .Given(CharacterIsOnMap) + .WhenAsync(SittingWithUnknownVisualType) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); + } + + private void CharacterIsOnMap() + { + Session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; + } + + private async Task SittingWithOwnCharacter() + { + await Handler.ExecuteAsync(new SitPacket + { + Users = new List + { + new SitSubPacket + { + VisualType = VisualType.Player, + VisualId = Session.Character.VisualId + } + } + }, Session); + } + + private async Task SittingWithUnknownVisualType() + { + await Handler.ExecuteAsync(new SitPacket + { + Users = new List + { + new SitSubPacket + { + VisualType = (VisualType)99, + VisualId = Session.Character.VisualId + } + } + }, Session); + } + + private void HandlerShouldComplete() + { + Assert.AreEqual(0, Session.LastPackets.Count); + } + + private void NoPacketShouldBeSent() + { + Assert.AreEqual(0, Session.LastPackets.Count); + } + } +} diff --git a/test/NosCore.PacketHandlers.Tests/Movement/WalkPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Movement/WalkPacketHandlerTests.cs new file mode 100644 index 000000000..12a89cc9b --- /dev/null +++ b/test/NosCore.PacketHandlers.Tests/Movement/WalkPacketHandlerTests.cs @@ -0,0 +1,143 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NodaTime; +using NosCore.GameObject.Networking; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.PacketHandlers.Movement; +using NosCore.Packets.ClientPackets.Movement; +using NosCore.PathFinder.Interfaces; +using NosCore.Tests.Shared; +using Serilog; +using SpecLight; + +namespace NosCore.PacketHandlers.Tests.Movement +{ + [TestClass] + public class WalkPacketHandlerTests + { + private WalkPacketHandler Handler = null!; + private ClientSession Session = null!; + private Mock DistanceCalculator = null!; + private readonly ILogger Logger = new Mock().Object; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Broadcaster.Reset(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + DistanceCalculator = new Mock(); + DistanceCalculator.Setup(x => x.GetDistance(It.IsAny<(short, short)>(), It.IsAny<(short, short)>())) + .Returns(1); + + Handler = new WalkPacketHandler( + DistanceCalculator.Object, + Logger, + TestHelpers.Instance.Clock, + TestHelpers.Instance.LogLanguageLocalizer); + } + + [TestMethod] + public async Task WalkWithHighSpeedShouldBeIgnored() + { + await new Spec("Walk with high speed should be ignored") + .Given(CharacterIsOnMap) + .WhenAsync(WalkingWithHighSpeed) + .Then(PositionShouldNotBeUpdated) + .ExecuteAsync(); + } + + [TestMethod] + public async Task WalkShouldExecuteWithoutError() + { + await new Spec("Walk should execute without error") + .Given(CharacterIsOnMap) + .WhenAsync(WalkingToValidPosition) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); + } + + private short InitialX; + private short InitialY; + + private void CharacterIsOnMap() + { + Session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; + Session.Character.PositionX = 10; + Session.Character.PositionY = 10; + InitialX = Session.Character.PositionX; + InitialY = Session.Character.PositionY; + } + + private async Task WalkingToValidPosition() + { + var checksum = ((11 + 12) % 3) % 2; + await Handler.ExecuteAsync(new WalkPacket + { + XCoordinate = 11, + YCoordinate = 12, + Speed = 20, + CheckSum = (byte)checksum + }, Session); + } + + private async Task WalkingWithHighSpeed() + { + await Handler.ExecuteAsync(new WalkPacket + { + XCoordinate = 11, + YCoordinate = 12, + Speed = 100, + CheckSum = 0 + }, Session); + } + + private async Task WalkingWithInvalidChecksum() + { + await Handler.ExecuteAsync(new WalkPacket + { + XCoordinate = 11, + YCoordinate = 12, + Speed = 20, + CheckSum = 99 + }, Session); + } + + private void PositionShouldBeUpdated() + { + Assert.AreEqual(11, Session.Character.PositionX); + Assert.AreEqual(12, Session.Character.PositionY); + } + + private void PositionShouldNotBeUpdated() + { + Assert.AreEqual(InitialX, Session.Character.PositionX); + Assert.AreEqual(InitialY, Session.Character.PositionY); + } + + private void NoPacketShouldBeSent() + { + Assert.AreEqual(0, Session.LastPackets.Count); + } + } +} diff --git a/test/NosCore.PacketHandlers.Tests/Parcel/PclPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Parcel/PclPacketHandlerTests.cs index 6cef4a97e..e5095d120 100644 --- a/test/NosCore.PacketHandlers.Tests/Parcel/PclPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Parcel/PclPacketHandlerTests.cs @@ -2,18 +2,18 @@ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . @@ -34,71 +34,81 @@ using NosCore.Packets.ClientPackets.Parcel; using NosCore.Packets.ServerPackets.Parcel; using NosCore.Tests.Shared; +using SpecLight; namespace NosCore.PacketHandlers.Tests.Parcel { [TestClass] public class PclPacketHandlerTests { - private Mock? _mailHttpClient; - private PclPacketHandler? _pclPacketHandler; - private IItemGenerationService? _item; - private ClientSession? _session; - private Mock>? _itemInstanceDao; + private Mock MailHttpClient = null!; + private PclPacketHandler PclPacketHandler = null!; + private IItemGenerationService Item = null!; + private ClientSession Session = null!; + private Mock> ItemInstanceDao = null!; + private MailData? Mail; [TestInitialize] public async Task SetupAsync() { await TestHelpers.ResetAsync(); - _session = await TestHelpers.Instance.GenerateSessionAsync(); - _item = TestHelpers.Instance.GenerateItemProvider(); - _mailHttpClient = new Mock(); - _itemInstanceDao = new Mock>(); - _pclPacketHandler = new PclPacketHandler(_mailHttpClient.Object, _item, _itemInstanceDao.Object); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + Item = TestHelpers.Instance.GenerateItemProvider(); + MailHttpClient = new Mock(); + ItemInstanceDao = new Mock>(); + PclPacketHandler = new PclPacketHandler(MailHttpClient.Object, Item, ItemInstanceDao.Object); } [TestMethod] - public async Task Test_GiftNotFoundAsync() + public async Task GiftNotFoundShouldReturnNoPacket() { - _mailHttpClient!.Setup(s => s.GetMails(1, _session!.Character.CharacterId, false)).ReturnsAsync(new List()); - await _pclPacketHandler!.ExecuteAsync(new PclPacket - { - Type = 5, - GiftId = 1 - }, _session!); - var packet = (ParcelPacket?)_session!.LastPackets.FirstOrDefault(s => s is ParcelPacket); - Assert.IsNull(packet); + await new Spec("Gift not found should return no packet") + .Given(NoGiftExists) + .WhenAsync(DeletingGift) + .Then(NoParcelPacketShouldBeSent) + .ExecuteAsync(); } [TestMethod] - public async Task Test_DeleteGiftAsync() + public async Task DeletingGiftShouldReturnDeletePacket() { - var item = _item!.Create(1); - var mail = new MailData - { - ItemInstance = (ItemInstanceDto)item, - MailDto = new MailDto - { - ItemInstanceId = item.Id - } - }; - _itemInstanceDao!.Setup(o => o.FirstOrDefaultAsync(It.IsAny>>())) - .ReturnsAsync(item); - _mailHttpClient!.Setup(s => s.GetMails(1, _session!.Character.CharacterId, false)).ReturnsAsync(new List() { mail }); - await _pclPacketHandler!.ExecuteAsync(new PclPacket - { - Type = 5, - GiftId = 1 - }, _session!); - var packet = (ParcelPacket?)_session!.LastPackets.FirstOrDefault(s => s is ParcelPacket); - Assert.IsTrue(packet?.Type == 7); + await new Spec("Deleting gift should return delete packet") + .Given(GiftExists) + .WhenAsync(DeletingGift) + .Then(DeleteParcelPacketShouldBeSent) + .ExecuteAsync(); + } + + [TestMethod] + public async Task ReceivingGiftShouldReturnReceivePacket() + { + await new Spec("Receiving gift should return receive packet") + .Given(GiftExists) + .WhenAsync(ReceivingGift) + .Then(ReceiveParcelPacketShouldBeSent) + .ExecuteAsync(); } [TestMethod] - public async Task Test_ReceiveGiftAsync() + public async Task ReceivingGiftWithNoSpaceShouldReturnNoSpacePacket() + { + await new Spec("Receiving gift with no space should return no space packet") + .Given(GiftExists) + .And(InventoryIsFull) + .WhenAsync(ReceivingGift) + .Then(NoSpaceParcelPacketShouldBeSent) + .ExecuteAsync(); + } + + private void NoGiftExists() { - var item = _item!.Create(1); - var mail = new MailData + MailHttpClient.Setup(s => s.GetMails(1, Session.Character.CharacterId, false)).ReturnsAsync(new List()); + } + + private void GiftExists() + { + var item = Item.Create(1); + Mail = new MailData { ItemInstance = (ItemInstanceDto)item, MailDto = new MailDto @@ -106,42 +116,56 @@ public async Task Test_ReceiveGiftAsync() ItemInstanceId = item.Id } }; - _itemInstanceDao!.Setup(o => o.FirstOrDefaultAsync(It.IsAny>>())) + ItemInstanceDao.Setup(o => o.FirstOrDefaultAsync(It.IsAny>>())) .ReturnsAsync(item); - _mailHttpClient!.Setup(s => s.GetMails(1, _session!.Character.CharacterId, false)).ReturnsAsync(new List { mail }); - await _pclPacketHandler!.ExecuteAsync(new PclPacket - { - Type = 4, - GiftId = 1 - }, _session!); - var packet = (ParcelPacket?)_session!.LastPackets.FirstOrDefault(s => s is ParcelPacket); - Assert.IsTrue(packet?.Type == 2); + MailHttpClient.Setup(s => s.GetMails(1, Session.Character.CharacterId, false)).ReturnsAsync(new List { Mail }); } - [TestMethod] - public async Task Test_ReceiveGiftNoPlaceAsync() + private void InventoryIsFull() { TestHelpers.Instance.WorldConfiguration.Value.BackpackSize = 0; - var item = _item!.Create(1); - var mail = new MailData + } + + private async Task DeletingGift() + { + await PclPacketHandler.ExecuteAsync(new PclPacket { - ItemInstance = (ItemInstanceDto)item, - MailDto = new MailDto - { - ItemInstanceId = item.Id - } - }; - _itemInstanceDao!.Setup(o => o.FirstOrDefaultAsync(It.IsAny>>())) - .ReturnsAsync(item); - _mailHttpClient!.Setup(s => s.GetMails(1, _session!.Character.CharacterId, false)).ReturnsAsync(new List { mail }); + Type = 5, + GiftId = 1 + }, Session); + } - await _pclPacketHandler!.ExecuteAsync(new PclPacket + private async Task ReceivingGift() + { + await PclPacketHandler.ExecuteAsync(new PclPacket { Type = 4, GiftId = 1 - }, _session!); - var packet = (ParcelPacket?)_session!.LastPackets.FirstOrDefault(s => s is ParcelPacket); + }, Session); + } + + private void NoParcelPacketShouldBeSent() + { + var packet = (ParcelPacket?)Session.LastPackets.FirstOrDefault(s => s is ParcelPacket); + Assert.IsNull(packet); + } + + private void DeleteParcelPacketShouldBeSent() + { + var packet = (ParcelPacket?)Session.LastPackets.FirstOrDefault(s => s is ParcelPacket); + Assert.IsTrue(packet?.Type == 7); + } + + private void ReceiveParcelPacketShouldBeSent() + { + var packet = (ParcelPacket?)Session.LastPackets.FirstOrDefault(s => s is ParcelPacket); + Assert.IsTrue(packet?.Type == 2); + } + + private void NoSpaceParcelPacketShouldBeSent() + { + var packet = (ParcelPacket?)Session.LastPackets.FirstOrDefault(s => s is ParcelPacket); Assert.IsTrue(packet?.Type == 5); } } -} \ No newline at end of file +} diff --git a/test/NosCore.PacketHandlers.Tests/Parcel/PstClientPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Parcel/PstClientPacketHandlerTests.cs index 7096a6877..131646742 100644 --- a/test/NosCore.PacketHandlers.Tests/Parcel/PstClientPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Parcel/PstClientPacketHandlerTests.cs @@ -1,19 +1,19 @@ -// __ _ __ __ ___ __ ___ ___ +// __ _ __ __ ___ __ ___ ___ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . @@ -28,135 +28,5 @@ public class PstClientPacketHandlerTests public void Setup() { } - - //[TestMethod] - //public async Task Test_SendMessage() - //{ - // // TODO add test on gift - // //Assert.Fail(); - // //if (string.IsNullOrEmpty(pstClientPacket.Text) || string.IsNullOrEmpty(pstClientPacket.Title)) - // //{ - // // return; - // //} - - // //var dest = _characterDao.FirstOrDefaultAsync(s => s.Name == pstClientPacket.ReceiverName); - // //if (dest != null) - // //{ - // // _mailHttpClient.SendMessage(clientSession.Character, dest.CharacterId, pstClientPacket.Title, - // // pstClientPacket.Text); - // // clientSession.SendPacket(clientSession.Character.GenerateSay( - // // Language.Instance.GetMessageFromKey( - // // LanguageKey.MAILED, - // // clientSession.Account.Language), SayColorType.Yellow)); - // //} - // //else - // //{ - // // clientSession.SendPacket( - // // clientSession.Character.GenerateSay( - // // Language.Instance.GetMessageFromKey(LanguageKey.USER_NOT_FOUND, - // // clientSession.Account.Language), - // // SayColorType.Yellow)); - // //} - //} - - //[TestMethod] - //public async Task Test_SendMessageWhenNoDestination() - //{ - // // TODO add test on gift - // //Assert.Fail(); - // //if (string.IsNullOrEmpty(pstClientPacket.Text) || string.IsNullOrEmpty(pstClientPacket.Title)) - // //{ - // // return; - // //} - - // //var dest = _characterDao.FirstOrDefaultAsync(s => s.Name == pstClientPacket.ReceiverName); - // //if (dest != null) - // //{ - // // _mailHttpClient.SendMessage(clientSession.Character, dest.CharacterId, pstClientPacket.Title, - // // pstClientPacket.Text); - // // clientSession.SendPacket(clientSession.Character.GenerateSay( - // // Language.Instance.GetMessageFromKey( - // // LanguageKey.MAILED, - // // clientSession.Account.Language), SayColorType.Yellow)); - // //} - // //else - // //{ - // // clientSession.SendPacket( - // // clientSession.Character.GenerateSay( - // // Language.Instance.GetMessageFromKey(LanguageKey.USER_NOT_FOUND, - // // clientSession.Account.Language), - // // SayColorType.Yellow)); - // //} - //} - - //[TestMethod] - //public async Task Test_SendMessageWithNoTitle() - //{ - // // TODO add test on gift - // //Assert.Fail(); - // //if (string.IsNullOrEmpty(pstClientPacket.Text) || string.IsNullOrEmpty(pstClientPacket.Title)) - // //{ - // // return; - // //} - //} - - //[TestMethod] - //public async Task Test_SendMessageWithNoText() - //{ - // // TODO add test on gift - // //Assert.Fail(); - // //if (string.IsNullOrEmpty(pstClientPacket.Text) || string.IsNullOrEmpty(pstClientPacket.Title)) - // //{ - // // return; - // //} - //} - - //[TestMethod] - //public async Task Test_ViewMessage() - //{ - // // TODO add test on gift - // //Assert.Fail(); - // //if (mail == null) - // //{ - // // return; - // //} - - // //var patch = new JsonPatchDocument(); - // //patch.Replace(link => link.IsOpened, true); - // //_mailHttpClient.ViewGift(mail.MailDto.MailId, patch); - // //clientSession.SendPacket(mail.GeneratePostMessage(pstClientPacket.Type)); - //} - - //[TestMethod] - //public async Task Test_ViewMessageNotFound() - //{ - // // TODO add test on gift - // //Assert.Fail(); - //} - - //[TestMethod] - //public async Task Test_DeleteMailNotFound() - //{ - // // TODO add test on gift - // //Assert.Fail(); - //} - - //[TestMethod] - //public async Task Test_DeleteMail() - //{ - // // TODO add test on gift - // //Assert.Fail(); - // //if (mail == null) - // //{ - // // return; - // //} - - // //_mailHttpClient.DeleteGift(pstClientPacket.Id, clientSession.Character.VisualId, isCopy); - // //clientSession.SendPacket( - // // clientSession.Character.GenerateSay( - // // Language.Instance.GetMessageFromKey(LanguageKey.MAIL_DELETED, - // // clientSession.Account.Language), - // // SayColorType.Red)); - //} } -} \ No newline at end of file +} diff --git a/test/NosCore.PacketHandlers.Tests/Quest/QtPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Quest/QtPacketHandlerTests.cs new file mode 100644 index 000000000..b36420ff9 --- /dev/null +++ b/test/NosCore.PacketHandlers.Tests/Quest/QtPacketHandlerTests.cs @@ -0,0 +1,195 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.Data.Dto; +using NosCore.Data.StaticEntities; +using NosCore.GameObject.Networking; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.GameObject.Services.QuestService; +using NosCore.PacketHandlers.Quest; +using NosCore.Packets.ClientPackets.Quest; +using NosCore.Packets.Enumerations; +using NosCore.Tests.Shared; +using SpecLight; + +namespace NosCore.PacketHandlers.Tests.Quest +{ + [TestClass] + public class QtPacketHandlerTests + { + private QtPacketHandler Handler = null!; + private ClientSession Session = null!; + private Mock QuestService = null!; + private Guid QuestGuid; + private short QuestId = 1001; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Broadcaster.Reset(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + QuestService = new Mock(); + QuestGuid = Guid.NewGuid(); + + Handler = new QtPacketHandler(QuestService.Object); + } + + [TestMethod] + public async Task UnknownQuestShouldBeIgnored() + { + await new Spec("Unknown quest should be ignored") + .Given(CharacterIsOnMap) + .WhenAsync(HandlingUnknownQuest) + .Then(QuestServiceShouldNotBeCalled) + .ExecuteAsync(); + } + + [TestMethod] + public async Task ValidatingQuestShouldCallQuestService() + { + await new Spec("Validating quest should call quest service") + .Given(CharacterIsOnMap) + .And(CharacterHasQuest) + .And(CharacterHasScript) + .WhenAsync(ValidatingQuest) + .Then(QuestServiceShouldBeCalledWithValidate) + .ExecuteAsync(); + } + + [TestMethod] + public async Task AchievingQuestShouldCallQuestService() + { + await new Spec("Achieving quest should call quest service") + .Given(CharacterIsOnMap) + .And(CharacterHasQuest) + .And(CharacterHasScript) + .WhenAsync(AchievingQuest) + .Then(QuestServiceShouldBeCalledWithAchieve) + .ExecuteAsync(); + } + + [TestMethod] + public async Task GivingUpQuestShouldRemoveQuestFromCharacter() + { + await new Spec("Giving up quest should remove quest from character") + .Given(CharacterIsOnMap) + .And(CharacterHasQuest) + .WhenAsync(GivingUpQuest) + .Then(QuestShouldBeRemoved) + .ExecuteAsync(); + } + + private void CharacterIsOnMap() + { + Session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; + Session.Character.Quests = new System.Collections.Concurrent.ConcurrentDictionary(); + } + + private void CharacterHasQuest() + { + var characterQuest = new CharacterQuest + { + QuestId = QuestId, + Quest = new NosCore.GameObject.Services.QuestService.Quest + { + QuestId = QuestId, + QuestObjectives = new System.Collections.Generic.List() + } + }; + Session.Character.Quests.TryAdd(QuestGuid, characterQuest); + } + + private void CharacterHasScript() + { + Session.Character.Script = new ScriptDto + { + Argument1 = 1, + ScriptId = 100, + ScriptStepId = 1 + }; + } + + private async Task HandlingUnknownQuest() + { + await Handler.ExecuteAsync(new QtPacket + { + Type = QuestActionType.Validate, + Data = 9999 + }, Session); + } + + private async Task ValidatingQuest() + { + await Handler.ExecuteAsync(new QtPacket + { + Type = QuestActionType.Validate, + Data = QuestId + }, Session); + } + + private async Task AchievingQuest() + { + await Handler.ExecuteAsync(new QtPacket + { + Type = QuestActionType.Achieve, + Data = QuestId + }, Session); + } + + private async Task GivingUpQuest() + { + await Handler.ExecuteAsync(new QtPacket + { + Type = QuestActionType.GiveUp, + Data = QuestId + }, Session); + } + + private void QuestServiceShouldNotBeCalled() + { + QuestService.Verify(x => x.RunScriptAsync( + It.IsAny(), + It.IsAny()), Times.Never); + } + + private void QuestServiceShouldBeCalledWithValidate() + { + QuestService.Verify(x => x.RunScriptAsync( + It.IsAny(), + It.Is(p => p != null && p.Type == QuestActionType.Validate)), Times.Once); + } + + private void QuestServiceShouldBeCalledWithAchieve() + { + QuestService.Verify(x => x.RunScriptAsync( + It.IsAny(), + It.Is(p => p != null && p.Type == QuestActionType.Achieve)), Times.Once); + } + + private void QuestShouldBeRemoved() + { + Assert.AreEqual(0, Session.Character.Quests.Count); + } + } +} diff --git a/test/NosCore.PacketHandlers.Tests/Quest/ScriptPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Quest/ScriptPacketHandlerTests.cs new file mode 100644 index 000000000..35ecb4f10 --- /dev/null +++ b/test/NosCore.PacketHandlers.Tests/Quest/ScriptPacketHandlerTests.cs @@ -0,0 +1,106 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.GameObject.Networking; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.GameObject.Services.QuestService; +using NosCore.PacketHandlers.Quest; +using NosCore.Packets.ClientPackets.Quest; +using NosCore.Packets.Enumerations; +using NosCore.Tests.Shared; +using SpecLight; + +namespace NosCore.PacketHandlers.Tests.Quest +{ + [TestClass] + public class ScriptPacketHandlerTests + { + private ScriptPacketHandler Handler = null!; + private ClientSession Session = null!; + private Mock QuestService = null!; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Broadcaster.Reset(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + QuestService = new Mock(); + + Handler = new ScriptPacketHandler(QuestService.Object); + } + + [TestMethod] + public async Task RunningScriptShouldCallQuestService() + { + await new Spec("Running script should call quest service") + .Given(CharacterIsOnMap) + .WhenAsync(RunningScript) + .Then(QuestServiceShouldBeCalled) + .ExecuteAsync(); + } + + [TestMethod] + public async Task RunningScriptWithValidateActionShouldCallQuestService() + { + await new Spec("Running script with validate action should call quest service") + .Given(CharacterIsOnMap) + .WhenAsync(RunningScriptWithValidateAction) + .Then(QuestServiceShouldBeCalled) + .ExecuteAsync(); + } + + private void CharacterIsOnMap() + { + Session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; + } + + private async Task RunningScript() + { + await Handler.ExecuteAsync(new ScriptClientPacket + { + Type = QuestActionType.Achieve, + FirstArgument = 1, + SecondArgument = 100, + ThirdArgument = 1 + }, Session); + } + + private async Task RunningScriptWithValidateAction() + { + await Handler.ExecuteAsync(new ScriptClientPacket + { + Type = QuestActionType.Validate, + FirstArgument = 1, + SecondArgument = 100, + ThirdArgument = 1 + }, Session); + } + + private void QuestServiceShouldBeCalled() + { + QuestService.Verify(x => x.RunScriptAsync( + Session.Character, + It.IsAny()), Times.Once); + } + } +} diff --git a/test/NosCore.PacketHandlers.Tests/Shops/BuyPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Shops/BuyPacketHandlerTests.cs new file mode 100644 index 000000000..e4a44c215 --- /dev/null +++ b/test/NosCore.PacketHandlers.Tests/Shops/BuyPacketHandlerTests.cs @@ -0,0 +1,126 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.GameObject.Networking; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.PacketHandlers.Shops; +using NosCore.Packets.ClientPackets.Shops; +using NosCore.Shared.Enumerations; +using NosCore.Tests.Shared; +using Serilog; +using SpecLight; + +namespace NosCore.PacketHandlers.Tests.Shops +{ + [TestClass] + public class BuyPacketHandlerTests + { + private BuyPacketHandler Handler = null!; + private ClientSession Session = null!; + private readonly ILogger Logger = new Mock().Object; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Broadcaster.Reset(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + Handler = new BuyPacketHandler( + Logger, + TestHelpers.Instance.LogLanguageLocalizer, + TestHelpers.Instance.SessionRegistry); + } + + [TestMethod] + public async Task BuyingFromUnknownVisualTypeShouldBeIgnored() + { + await new Spec("Buying from unknown visual type should be ignored") + .Given(CharacterIsOnMap) + .WhenAsync(BuyingFromUnknownVisualType) + .Then(NoErrorPacketShouldBeSent) + .ExecuteAsync(); + } + + [TestMethod] + public async Task BuyingFromNonExistentNpcShouldBeIgnored() + { + await new Spec("Buying from non existent npc should be ignored") + .Given(CharacterIsOnMap) + .WhenAsync(BuyingFromNonExistentNpc) + .Then(NoErrorPacketShouldBeSent) + .ExecuteAsync(); + } + + [TestMethod] + public async Task BuyingFromNonExistentPlayerShouldBeIgnored() + { + await new Spec("Buying from non existent player should be ignored") + .Given(CharacterIsOnMap) + .WhenAsync(BuyingFromNonExistentPlayer) + .Then(NoErrorPacketShouldBeSent) + .ExecuteAsync(); + } + + private void CharacterIsOnMap() + { + Session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; + } + + private async Task BuyingFromUnknownVisualType() + { + await Handler.ExecuteAsync(new BuyPacket + { + VisualType = (VisualType)99, + VisualId = 1, + Slot = 0, + Amount = 1 + }, Session); + } + + private async Task BuyingFromNonExistentNpc() + { + await Handler.ExecuteAsync(new BuyPacket + { + VisualType = VisualType.Npc, + VisualId = 99999, + Slot = 0, + Amount = 1 + }, Session); + } + + private async Task BuyingFromNonExistentPlayer() + { + await Handler.ExecuteAsync(new BuyPacket + { + VisualType = VisualType.Player, + VisualId = 99999, + Slot = 0, + Amount = 1 + }, Session); + } + + private void NoErrorPacketShouldBeSent() + { + Assert.AreEqual(0, Session.LastPackets.Count); + } + } +} diff --git a/test/NosCore.PacketHandlers.Tests/Shops/MShopPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Shops/MShopPacketHandlerTests.cs index 75ff37a39..12a7964d3 100644 --- a/test/NosCore.PacketHandlers.Tests/Shops/MShopPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Shops/MShopPacketHandlerTests.cs @@ -2,18 +2,18 @@ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . @@ -26,13 +26,15 @@ using NosCore.Data.Enumerations; using NosCore.Data.Enumerations.Group; using NosCore.Data.StaticEntities; +using NosCore.GameObject.ComponentEntities.Entities; +using NosCore.GameObject.Infastructure; using NosCore.GameObject.Networking; using NosCore.GameObject.Networking.ClientSession; -using NosCore.Networking.SessionGroup; using NosCore.GameObject.Services.EventLoaderService; using NosCore.GameObject.Services.InventoryService; using NosCore.GameObject.Services.ItemGenerationService; using NosCore.GameObject.Services.ItemGenerationService.Item; +using NosCore.Networking.SessionGroup; using NosCore.PacketHandlers.Shops; using NosCore.Packets.ClientPackets.Inventory; using NosCore.Packets.ClientPackets.Shops; @@ -42,11 +44,8 @@ using NosCore.Shared.Enumerations; using NosCore.Tests.Shared; using Serilog; -using NosCore.GameObject.ComponentEntities.Entities; -using Group = NosCore.GameObject.Services.GroupService.Group; -using NosCore.GameObject.Infastructure; +using SpecLight; -//TODO stop using obsolete #pragma warning disable 618 namespace NosCore.PacketHandlers.Tests.Shops @@ -55,21 +54,20 @@ namespace NosCore.PacketHandlers.Tests.Shops public class MShopPacketHandlerTests { private static readonly ILogger Logger = new Mock().Object; - private readonly MShopPacket _shopPacket = new() + private readonly MShopPacket ShopPacket = new() { Type = CreateShopPacketType.Open, ItemList = new List { - new() {Type = PocketType.Etc, Slot = 0, Amount = 1, Price = 10000}, - new() {Type = PocketType.Etc, Slot = 1, Amount = 2, Price = 20000}, - new() {Type = PocketType.Etc, Slot = 2, Amount = 3, Price = 30000} + new() { Type = PocketType.Etc, Slot = 0, Amount = 1, Price = 10000 }, + new() { Type = PocketType.Etc, Slot = 1, Amount = 2, Price = 20000 }, + new() { Type = PocketType.Etc, Slot = 2, Amount = 3, Price = 30000 } }, Name = "TEST SHOP" }; - private MShopPacketHandler? _mShopPacketHandler; - - private ClientSession? _session; + private MShopPacketHandler MShopPacketHandler = null!; + private ClientSession Session = null!; [TestInitialize] public async Task SetupAsync() @@ -77,171 +75,271 @@ public async Task SetupAsync() await TestHelpers.ResetAsync(); Broadcaster.Reset(); - _session = await TestHelpers.Instance.GenerateSessionAsync(); - _session.Character.MapInstance.Portals = new List + Session = await TestHelpers.Instance.GenerateSessionAsync(); + Session.Character.MapInstance.Portals = new List { new() { - DestinationMapId = _session.Character.MapInstance.Map.MapId, + DestinationMapId = Session.Character.MapInstance.Map.MapId, Type = PortalType.Open, - SourceMapInstanceId = _session.Character.MapInstance.MapInstanceId, - DestinationMapInstanceId = _session.Character.MapInstance.MapInstanceId, + SourceMapInstanceId = Session.Character.MapInstance.MapInstanceId, + DestinationMapInstanceId = Session.Character.MapInstance.MapInstanceId, DestinationX = 5, DestinationY = 5, PortalId = 1, - SourceMapId = _session.Character.MapInstance.Map.MapId, + SourceMapId = Session.Character.MapInstance.Map.MapId, SourceX = 0, SourceY = 0 } }; - _mShopPacketHandler = new MShopPacketHandler(TestHelpers.Instance.DistanceCalculator); + MShopPacketHandler = new MShopPacketHandler(TestHelpers.Instance.DistanceCalculator); } [TestMethod] - public async Task UserCanNotCreateShopCloseToPortalAsync() + public async Task UserCannotCreateShopCloseToPortal() { - await _mShopPacketHandler!.ExecuteAsync(_shopPacket, _session!); - var packet = (InfoiPacket?)_session?.LastPackets.FirstOrDefault(s => s is InfoiPacket); - Assert.IsTrue(packet?.Message == Game18NConstString.OpenShopAwayPortal); - Assert.IsNull(_session?.Character.Shop); + await new Spec("User cannot create shop close to portal") + .WhenAsync(CreatingShopAtPortal) + .Then(ShouldReceiveOpenAwayFromPortalError) + .And(ShopShouldNotBeCreated) + .ExecuteAsync(); } [TestMethod] - public async Task UserCanNotCreateShopInTeamAsync() + public async Task UserCannotCreateShopInTeam() { - _session!.Character.PositionX = 7; - _session.Character.PositionY = 7; - _session.Character.Group = new NosCore.GameObject.Services.GroupService.Group(GroupType.Team, new Mock().Object); - await _mShopPacketHandler!.ExecuteAsync(_shopPacket, _session); - var packet = (SayiPacket?)_session.LastPackets.FirstOrDefault(s => s is SayiPacket); - Assert.IsTrue(packet?.VisualType == VisualType.Player && packet?.VisualId == _session.Character.CharacterId && packet?.Type == SayColorType.Red && packet?.Message == Game18NConstString.TeammateCanNotOpenShop); - Assert.IsNull(_session.Character.Shop); + await new Spec("User cannot create shop in team") + .Given(CharacterIsInTeam) + .WhenAsync(CreatingShop) + .Then(ShouldReceiveTeammateCannotShopError) + .And(ShopShouldNotBeCreated) + .ExecuteAsync(); } [TestMethod] - public async Task UserCanCreateShopInGroupAsync() + public async Task UserCanCreateShopInGroup() { - _session!.Character.PositionX = 7; - _session.Character.PositionY = 7; - _session.Character.Group = new NosCore.GameObject.Services.GroupService.Group(GroupType.Group, new Mock().Object); - await _mShopPacketHandler!.ExecuteAsync(_shopPacket, _session); - var packet = (SayiPacket?)_session.LastPackets.FirstOrDefault(s => s is SayiPacket); - Assert.IsNull(packet); + await new Spec("User can create shop in group") + .Given(CharacterIsInGroup) + .WhenAsync(CreatingShop) + .Then(NoErrorShouldBeSent) + .ExecuteAsync(); } [TestMethod] - public async Task UserCanNotCreateShopInNotShopAllowedMapsAsync() + public async Task UserCannotCreateShopInNonShopAllowedMap() { - _session!.Character.PositionX = 7; - _session.Character.PositionY = 7; - await _mShopPacketHandler!.ExecuteAsync(_shopPacket, _session); - var packet = (InfoiPacket?)_session.LastPackets.FirstOrDefault(s => s is InfoiPacket); - - Assert.IsTrue(packet?.Message == Game18NConstString.UseCommercialMapToShop); - Assert.IsNull(_session.Character.Shop); + await new Spec("User cannot create shop in non shop allowed map") + .Given(CharacterIsAwayFromPortal) + .WhenAsync(CreatingShop) + .Then(ShouldReceiveUseCommercialMapError) + .And(ShopShouldNotBeCreated) + .ExecuteAsync(); } + [TestMethod] + public async Task UserCannotCreateShopWithMissingItem() + { + await new Spec("User cannot create shop with missing item") + .Given(CharacterHasOnlyOneItem) + .WhenAsync(CreatingShop) + .Then(ShopShouldNotBeCreated) + .ExecuteAsync(); + } [TestMethod] - public async Task UserCanNotCreateShopWithMissingItemAsync() + public async Task UserCannotCreateShopWithMissingAmount() { - var items = new List - { - new Item {Type = NoscorePocketType.Etc, VNum = 1} - }; - var itemBuilder = new ItemGenerationService(items, - new EventLoaderService, IUseItemEventHandler>(new List>>()), Logger, TestHelpers.Instance.LogLanguageLocalizer); + await new Spec("User cannot create shop with missing amount") + .Given(CharacterHasItemsWithAmount_, 1) + .WhenAsync(CreatingShop) + .Then(ShouldReceiveItemsCannotBeTradedError) + .And(ShopShouldNotBeCreated) + .ExecuteAsync(); + } - _session!.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(itemBuilder.Create(1, 1), 0)); - _session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; - await _mShopPacketHandler!.ExecuteAsync(_shopPacket, _session); - Assert.IsNull(_session.Character.Shop); + [TestMethod] + public async Task UserCanCreateShop() + { + await new Spec("User can create shop") + .Given(CharacterHasTradableItems) + .WhenAsync(CreatingShop) + .Then(ShopShouldBeCreated) + .ExecuteAsync(); } + [TestMethod] + public async Task UserCannotCreateShopInExchange() + { + await new Spec("User cannot create shop in exchange") + .Given(CharacterIsInExchange) + .And(CharacterHasTradableItems) + .WhenAsync(CreatingShopViaPacket) + .Then(ShopShouldNotBeCreated) + .ExecuteAsync(); + } [TestMethod] - public async Task UserCanNotCreateShopWithMissingAmountItemAsync() + public async Task UserCannotCreateEmptyShop() + { + await new Spec("User cannot create empty shop") + .Given(CharacterIsOnShopAllowedMap) + .WhenAsync(CreatingEmptyShop) + .Then(ShouldReceiveNoItemToSellError) + .And(ShopShouldNotBeCreated) + .ExecuteAsync(); + } + + private void CharacterIsInTeam() + { + Session.Character.PositionX = 7; + Session.Character.PositionY = 7; + Session.Character.Group = new NosCore.GameObject.Services.GroupService.Group(GroupType.Team, new Mock().Object); + } + + private void CharacterIsInGroup() + { + Session.Character.PositionX = 7; + Session.Character.PositionY = 7; + Session.Character.Group = new NosCore.GameObject.Services.GroupService.Group(GroupType.Group, new Mock().Object); + } + + private void CharacterIsAwayFromPortal() + { + Session.Character.PositionX = 7; + Session.Character.PositionY = 7; + } + + private void CharacterHasOnlyOneItem() { var items = new List { - new Item {Type = NoscorePocketType.Etc, VNum = 1} + new Item { Type = NoscorePocketType.Etc, VNum = 1 } }; var itemBuilder = new ItemGenerationService(items, new EventLoaderService, IUseItemEventHandler>(new List>>()), Logger, TestHelpers.Instance.LogLanguageLocalizer); - _session!.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(itemBuilder.Create(1, 1), 0), - NoscorePocketType.Etc, 0); - _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(itemBuilder.Create(1, 1), 0), - NoscorePocketType.Etc, 1); - _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(itemBuilder.Create(1, 1), 0), - NoscorePocketType.Etc, 2); - - _session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; - await _mShopPacketHandler!.ExecuteAsync(_shopPacket, _session); - Assert.IsNull(_session.Character.Shop); - var packet = (SayiPacket?)_session.LastPackets.FirstOrDefault(s => s is SayiPacket); - Assert.IsTrue(packet?.VisualType == VisualType.Player && packet?.VisualId == _session.Character.CharacterId && packet?.Type == SayColorType.Red && packet?.Message == Game18NConstString.SomeItemsCannotBeTraded); + Session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(itemBuilder.Create(1, 1), 0)); + Session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; } - [TestMethod] - public async Task UserCanCreateShopAsync() + private void CharacterHasItemsWithAmount_(int value) { var items = new List { - new Item {Type = NoscorePocketType.Etc, VNum = 1, IsTradable = true} + new Item { Type = NoscorePocketType.Etc, VNum = 1 } }; var itemBuilder = new ItemGenerationService(items, new EventLoaderService, IUseItemEventHandler>(new List>>()), Logger, TestHelpers.Instance.LogLanguageLocalizer); - _session!.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(itemBuilder.Create(1, 1), 0), + Session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(itemBuilder.Create(1, (short)value), 0), NoscorePocketType.Etc, 0); - _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(itemBuilder.Create(1, 2), 0), + Session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(itemBuilder.Create(1, (short)value), 0), NoscorePocketType.Etc, 1); - _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(itemBuilder.Create(1, 3), 0), + Session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(itemBuilder.Create(1, (short)value), 0), NoscorePocketType.Etc, 2); - _session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; - await _mShopPacketHandler!.ExecuteAsync(_shopPacket, _session); - Assert.IsNotNull(_session.Character.Shop); + Session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; } - [TestMethod] - public async Task UserCanNotCreateShopInExchangeAsync() + private void CharacterHasTradableItems() { - _session!.Character.InShop = true; var items = new List { - new Item {Type = NoscorePocketType.Etc, VNum = 1, IsTradable = true} + new Item { Type = NoscorePocketType.Etc, VNum = 1, IsTradable = true } }; var itemBuilder = new ItemGenerationService(items, new EventLoaderService, IUseItemEventHandler>(new List>>()), Logger, TestHelpers.Instance.LogLanguageLocalizer); - _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(itemBuilder.Create(1, 1), 0), + Session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(itemBuilder.Create(1, 1), 0), NoscorePocketType.Etc, 0); - _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(itemBuilder.Create(1, 2), 0), + Session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(itemBuilder.Create(1, 2), 0), NoscorePocketType.Etc, 1); - _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(itemBuilder.Create(1, 3), 0), + Session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(itemBuilder.Create(1, 3), 0), NoscorePocketType.Etc, 2); - _session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; - await _session!.HandlePacketsAsync(new[] { _shopPacket }); - Assert.IsNull(_session.Character.Shop); + Session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; } - [TestMethod] - public async Task UserCanNotCreateEmptyShopAsync() + private void CharacterIsInExchange() + { + Session.Character.InShop = true; + } + + private void CharacterIsOnShopAllowedMap() { - _session!.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; + Session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; + } + + private async Task CreatingShopAtPortal() + { + await MShopPacketHandler.ExecuteAsync(ShopPacket, Session); + } + + private async Task CreatingShop() + { + await MShopPacketHandler.ExecuteAsync(ShopPacket, Session); + } - await _mShopPacketHandler!.ExecuteAsync(new MShopPacket + private async Task CreatingShopViaPacket() + { + await Session.HandlePacketsAsync(new[] { ShopPacket }); + } + + private async Task CreatingEmptyShop() + { + await MShopPacketHandler.ExecuteAsync(new MShopPacket { Type = CreateShopPacketType.Open, ItemList = new List(), Name = "TEST SHOP" - }, _session); - Assert.IsNull(_session.Character.Shop); - var packet = (SayiPacket?)_session.LastPackets.FirstOrDefault(s => s is SayiPacket); - Assert.IsTrue(packet?.VisualType == VisualType.Player && packet?.VisualId == _session.Character.CharacterId && packet?.Type == SayColorType.Yellow && packet?.Message == Game18NConstString.NoItemToSell); + }, Session); + } + + private void ShouldReceiveOpenAwayFromPortalError() + { + var packet = (InfoiPacket?)Session.LastPackets.FirstOrDefault(s => s is InfoiPacket); + Assert.IsTrue(packet?.Message == Game18NConstString.OpenShopAwayPortal); + } + + private void ShouldReceiveTeammateCannotShopError() + { + var packet = (SayiPacket?)Session.LastPackets.FirstOrDefault(s => s is SayiPacket); + Assert.IsTrue(packet?.VisualType == VisualType.Player && packet?.VisualId == Session.Character.CharacterId && packet?.Type == SayColorType.Red && packet?.Message == Game18NConstString.TeammateCanNotOpenShop); + } + + private void ShouldReceiveUseCommercialMapError() + { + var packet = (InfoiPacket?)Session.LastPackets.FirstOrDefault(s => s is InfoiPacket); + Assert.IsTrue(packet?.Message == Game18NConstString.UseCommercialMapToShop); + } + + private void ShouldReceiveItemsCannotBeTradedError() + { + var packet = (SayiPacket?)Session.LastPackets.FirstOrDefault(s => s is SayiPacket); + Assert.IsTrue(packet?.VisualType == VisualType.Player && packet?.VisualId == Session.Character.CharacterId && packet?.Type == SayColorType.Red && packet?.Message == Game18NConstString.SomeItemsCannotBeTraded); + } + + private void ShouldReceiveNoItemToSellError() + { + var packet = (SayiPacket?)Session.LastPackets.FirstOrDefault(s => s is SayiPacket); + Assert.IsTrue(packet?.VisualType == VisualType.Player && packet?.VisualId == Session.Character.CharacterId && packet?.Type == SayColorType.Yellow && packet?.Message == Game18NConstString.NoItemToSell); + } + + private void NoErrorShouldBeSent() + { + var packet = (SayiPacket?)Session.LastPackets.FirstOrDefault(s => s is SayiPacket); + Assert.IsNull(packet); + } + + private void ShopShouldNotBeCreated() + { + Assert.IsNull(Session.Character.Shop); + } + + private void ShopShouldBeCreated() + { + Assert.IsNotNull(Session.Character.Shop); } } -} \ No newline at end of file +} diff --git a/test/NosCore.PacketHandlers.Tests/Shops/NrunPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Shops/NrunPacketHandlerTests.cs new file mode 100644 index 000000000..d0ad20b55 --- /dev/null +++ b/test/NosCore.PacketHandlers.Tests/Shops/NrunPacketHandlerTests.cs @@ -0,0 +1,211 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.GameObject.ComponentEntities.Interfaces; +using NosCore.GameObject.Networking; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.GameObject.Services.BroadcastService; +using NosCore.GameObject.Services.NRunService; +using NosCore.PacketHandlers.Shops; +using NosCore.Packets.ClientPackets.Npcs; +using NosCore.Shared.Enumerations; +using NosCore.Tests.Shared; +using Serilog; +using SpecLight; + +namespace NosCore.PacketHandlers.Tests.Shops +{ + [TestClass] + public class NrunPacketHandlerTests + { + private static readonly ILogger Logger = new Mock().Object; + private NrunPacketHandler _nrunPacketHandler = null!; + private ClientSession _session = null!; + private Mock _nrunServiceMock = null!; + + [TestInitialize] + public async Task SetupAsync() + { + Broadcaster.Reset(); + await TestHelpers.ResetAsync(); + _session = await TestHelpers.Instance.GenerateSessionAsync(); + _nrunServiceMock = new Mock(); + _nrunPacketHandler = new NrunPacketHandler( + Logger, + _nrunServiceMock.Object, + TestHelpers.Instance.LogLanguageLocalizer, + TestHelpers.Instance.SessionRegistry); + } + + [TestMethod] + public async Task NrunWithNullVisualTypeShouldCallNrunService() + { + await new Spec("Nrun with null visual type should call NRunService") + .WhenAsync(ExecutingNrunPacketWithNullType) + .Then(NrunServiceShouldBeCalled) + .ExecuteAsync(); + } + + [TestMethod] + public async Task NrunWithUnknownVisualTypeShouldNotCallNrunService() + { + await new Spec("Nrun with unknown visual type should not call NRunService") + .WhenAsync(ExecutingNrunPacketWithUnknownType) + .Then(NrunServiceShouldNotBeCalled) + .ExecuteAsync(); + } + + [TestMethod] + public async Task NrunWithNonExistentNpcShouldNotCallNrunService() + { + await new Spec("Nrun with non-existent NPC should not call NRunService") + .WhenAsync(ExecutingNrunPacketWithNonExistentNpc) + .Then(NrunServiceShouldNotBeCalled) + .ExecuteAsync(); + } + + [TestMethod] + public async Task NrunWithExistingNpcShouldCallNrunService() + { + await new Spec("Nrun with existing NPC should call NRunService") + .Given(NpcExistsOnMap) + .WhenAsync(ExecutingNrunPacketWithNpcType) + .Then(NrunServiceShouldBeCalled) + .ExecuteAsync(); + } + + [TestMethod] + public async Task NrunWithExistingPlayerShouldCallNrunService() + { + await new Spec("Nrun with existing player should call NRunService") + .Given(PlayerIsRegistered) + .WhenAsync(ExecutingNrunPacketWithPlayerType) + .Then(NrunServiceShouldBeCalled) + .ExecuteAsync(); + } + + private void NpcExistsOnMap() + { + var npc = new NosCore.GameObject.ComponentEntities.Entities.MapNpc( + TestHelpers.Instance.GenerateItemProvider(), + Logger, + TestHelpers.Instance.DistanceCalculator, + TestHelpers.Instance.Clock); + npc.MapNpcId = 100; + npc.MapId = _session.Character.MapInstance.Map.MapId; + npc.MapX = 1; + npc.MapY = 1; + npc.Initialize(new NosCore.Data.StaticEntities.NpcMonsterDto { NpcMonsterVNum = 1 }, null, null, new List()); + _session.Character.MapInstance.LoadNpcs(new List { npc }); + } + + private void PlayerIsRegistered() + { + TestHelpers.Instance.SessionRegistry.Register(new SessionInfo + { + ChannelId = _session.Channel!.Id, + SessionId = _session.SessionId, + Sender = _session, + AccountName = _session.Account.Name, + Disconnect = () => Task.CompletedTask, + CharacterId = _session.Character.CharacterId, + MapInstanceId = _session.Character.MapInstance.MapInstanceId, + Character = _session.Character + }); + } + + private async Task ExecutingNrunPacketWithNpcType() + { + var packet = new NrunPacket + { + VisualType = VisualType.Npc, + VisualId = 100, + Type = 0 + }; + await _nrunPacketHandler.ExecuteAsync(packet, _session); + } + + private async Task ExecutingNrunPacketWithPlayerType() + { + var packet = new NrunPacket + { + VisualType = VisualType.Player, + VisualId = _session.Character.VisualId, + Type = 0 + }; + await _nrunPacketHandler.ExecuteAsync(packet, _session); + } + + private async Task ExecutingNrunPacketWithNullType() + { + var packet = new NrunPacket + { + VisualType = null, + VisualId = 0, + Type = 0 + }; + await _nrunPacketHandler.ExecuteAsync(packet, _session); + } + + private async Task ExecutingNrunPacketWithUnknownType() + { + var packet = new NrunPacket + { + VisualType = VisualType.Monster, + VisualId = 1, + Type = 0 + }; + await _nrunPacketHandler.ExecuteAsync(packet, _session); + } + + private async Task ExecutingNrunPacketWithNonExistentNpc() + { + var packet = new NrunPacket + { + VisualType = VisualType.Npc, + VisualId = 99999, + Type = 0 + }; + await _nrunPacketHandler.ExecuteAsync(packet, _session); + } + + private void NrunServiceShouldBeCalled() + { + _nrunServiceMock.Verify( + x => x.NRunLaunchAsync( + It.IsAny(), + It.IsAny>()), + Times.Once); + } + + private void NrunServiceShouldNotBeCalled() + { + _nrunServiceMock.Verify( + x => x.NRunLaunchAsync( + It.IsAny(), + It.IsAny>()), + Times.Never); + } + } +} diff --git a/test/NosCore.PacketHandlers.Tests/Shops/RequestNpcPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Shops/RequestNpcPacketHandlerTests.cs new file mode 100644 index 000000000..c238921cb --- /dev/null +++ b/test/NosCore.PacketHandlers.Tests/Shops/RequestNpcPacketHandlerTests.cs @@ -0,0 +1,133 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.GameObject.Networking; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.PacketHandlers.Shops; +using NosCore.Packets.ClientPackets.Npcs; +using NosCore.Shared.Enumerations; +using NosCore.Tests.Shared; +using Serilog; +using SpecLight; + +namespace NosCore.PacketHandlers.Tests.Shops +{ + [TestClass] + public class RequestNpcPacketHandlerTests + { + private static readonly ILogger Logger = new Mock().Object; + private RequestNpcPacketHandler _requestNpcPacketHandler = null!; + private ClientSession _session = null!; + + [TestInitialize] + public async Task SetupAsync() + { + Broadcaster.Reset(); + await TestHelpers.ResetAsync(); + _session = await TestHelpers.Instance.GenerateSessionAsync(); + _requestNpcPacketHandler = new RequestNpcPacketHandler( + Logger, + TestHelpers.Instance.LogLanguageLocalizer, + TestHelpers.Instance.SessionRegistry); + } + + [TestMethod] + public async Task RequestNpcWithNonExistentNpcShouldNotThrow() + { + await new Spec("Request NPC with non-existent NPC should not throw") + .WhenAsync(ExecutingRequestNpcPacketWithNonExistentNpc) + .Then(SessionShouldRemainValid) + .ExecuteAsync(); + } + + [TestMethod] + public async Task RequestNpcWithUnknownVisualTypeShouldNotThrow() + { + await new Spec("Request NPC with unknown visual type should not throw") + .WhenAsync(ExecutingRequestNpcPacketWithUnknownType) + .Then(SessionShouldRemainValid) + .ExecuteAsync(); + } + + [TestMethod] + public async Task RequestNpcWithExistingNpcShouldNotThrow() + { + await new Spec("Request NPC with existing NPC should not throw") + .Given(NpcWithDialogExistsOnMap) + .WhenAsync(ExecutingRequestNpcPacketWithNpcType) + .Then(SessionShouldRemainValid) + .ExecuteAsync(); + } + + private void NpcWithDialogExistsOnMap() + { + var npc = new NosCore.GameObject.ComponentEntities.Entities.MapNpc( + TestHelpers.Instance.GenerateItemProvider(), + Logger, + TestHelpers.Instance.DistanceCalculator, + TestHelpers.Instance.Clock); + npc.MapNpcId = 100; + npc.Dialog = 100; + npc.MapId = _session.Character.MapInstance.Map.MapId; + npc.MapX = 1; + npc.MapY = 1; + npc.Initialize(new NosCore.Data.StaticEntities.NpcMonsterDto { NpcMonsterVNum = 1 }, null, null, new List()); + _session.Character.MapInstance.Npcs.Add(npc); + } + + private async Task ExecutingRequestNpcPacketWithNpcType() + { + var packet = new RequestNpcPacket + { + Type = VisualType.Npc, + TargetId = 100 + }; + await _requestNpcPacketHandler.ExecuteAsync(packet, _session); + } + + private async Task ExecutingRequestNpcPacketWithNonExistentNpc() + { + var packet = new RequestNpcPacket + { + Type = VisualType.Npc, + TargetId = 99999 + }; + await _requestNpcPacketHandler.ExecuteAsync(packet, _session); + } + + private async Task ExecutingRequestNpcPacketWithUnknownType() + { + var packet = new RequestNpcPacket + { + Type = VisualType.Monster, + TargetId = 1 + }; + await _requestNpcPacketHandler.ExecuteAsync(packet, _session); + } + + private void SessionShouldRemainValid() + { + Assert.IsNotNull(_session.Character); + } + } +} diff --git a/test/NosCore.PacketHandlers.Tests/Shops/SellPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Shops/SellPacketHandlerTests.cs index d19804aa5..fb897e98b 100644 --- a/test/NosCore.PacketHandlers.Tests/Shops/SellPacketHandlerTests.cs +++ b/test/NosCore.PacketHandlers.Tests/Shops/SellPacketHandlerTests.cs @@ -2,18 +2,18 @@ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . @@ -39,6 +39,7 @@ using NosCore.Packets.ServerPackets.Shop; using NosCore.Tests.Shared; using Serilog; +using SpecLight; using NosCore.GameObject.Infastructure; namespace NosCore.PacketHandlers.Tests.Shops @@ -46,95 +47,148 @@ namespace NosCore.PacketHandlers.Tests.Shops [TestClass] public class SellPacketHandlerTests { - private MapInstanceAccessorService? _instanceProvider; - private SellPacketHandler? _sellPacketHandler; - private ClientSession? _session; - private readonly ILogger _logger = new Mock().Object; + private MapInstanceAccessorService InstanceProvider = null!; + private SellPacketHandler SellPacketHandler = null!; + private ClientSession Session = null!; + private readonly ILogger Logger = new Mock().Object; [TestInitialize] public async Task SetupAsync() { await TestHelpers.ResetAsync(); Broadcaster.Reset(); - _instanceProvider = TestHelpers.Instance.MapInstanceAccessorService; - _session = await TestHelpers.Instance.GenerateSessionAsync(); - _sellPacketHandler = new SellPacketHandler(TestHelpers.Instance.WorldConfiguration); + InstanceProvider = TestHelpers.Instance.MapInstanceAccessorService; + Session = await TestHelpers.Instance.GenerateSessionAsync(); + SellPacketHandler = new SellPacketHandler(TestHelpers.Instance.WorldConfiguration); } + [TestMethod] + public async Task UserCannotSellInExchange() + { + await new Spec("User cannot sell in exchange") + .Given(CharacterIsInShop) + .And(CharacterHasTradableItems) + .WhenAsync(SellingItem) + .Then(GoldShouldNotIncrease) + .And(ItemShouldStillExist) + .ExecuteAsync(); + } [TestMethod] - public async Task UserCanNotSellInExchangeAsync() + public async Task UserCannotSellNonSoldableItem() + { + await new Spec("User cannot sell non soldable item") + .Given(CharacterHasNonSoldableItems) + .WhenAsync(SellingItem) + .Then(ShouldReceiveCannotSellError) + .And(GoldShouldNotIncrease) + .And(ItemShouldStillExist) + .ExecuteAsync(); + } + + [TestMethod] + public async Task UserCanSellItem() + { + await new Spec("User can sell item") + .Given(CharacterHasSoldableItems) + .WhenAsync(SellingItem) + .Then(GoldShouldIncrease) + .And(ItemShouldBeRemoved) + .ExecuteAsync(); + } + + private void CharacterIsInShop() + { + Session.Character.InShop = true; + } + + private void CharacterHasTradableItems() { - _session!.Character.InShop = true; var items = new List { - new Item {Type = NoscorePocketType.Etc, VNum = 1, IsTradable = true} + new Item { Type = NoscorePocketType.Etc, VNum = 1, IsTradable = true } }; var itemBuilder = new ItemGenerationService(items, - new EventLoaderService, IUseItemEventHandler>(new List>>()), _logger, TestHelpers.Instance.LogLanguageLocalizer); + new EventLoaderService, IUseItemEventHandler>(new List>>()), Logger, TestHelpers.Instance.LogLanguageLocalizer); - _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(itemBuilder.Create(1, 1), 0), + Session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(itemBuilder.Create(1, 1), 0), NoscorePocketType.Etc, 0); - _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(itemBuilder.Create(1, 2), 0), + Session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(itemBuilder.Create(1, 2), 0), NoscorePocketType.Etc, 1); - _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(itemBuilder.Create(1, 3), 0), + Session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(itemBuilder.Create(1, 3), 0), NoscorePocketType.Etc, 2); - _session.Character.MapInstance = _instanceProvider!.GetBaseMapById(1)!; - await _sellPacketHandler!.ExecuteAsync(new SellPacket { Slot = 0, Amount = 1, Data = (short)NoscorePocketType.Etc }, - _session); - Assert.IsTrue(_session.Character.Gold == 0); - Assert.IsNotNull(_session.Character.InventoryService.LoadBySlotAndType(0, NoscorePocketType.Etc)); + Session.Character.MapInstance = InstanceProvider.GetBaseMapById(1)!; } - [TestMethod] - public async Task UserCanNotSellNotSoldableAsync() + private void CharacterHasNonSoldableItems() { var items = new List { - new Item {Type = NoscorePocketType.Etc, VNum = 1, IsSoldable = false} + new Item { Type = NoscorePocketType.Etc, VNum = 1, IsSoldable = false } }; var itemBuilder = new ItemGenerationService(items, - new EventLoaderService, IUseItemEventHandler>(new List>>()), _logger, TestHelpers.Instance.LogLanguageLocalizer); + new EventLoaderService, IUseItemEventHandler>(new List>>()), Logger, TestHelpers.Instance.LogLanguageLocalizer); - _session!.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(itemBuilder.Create(1, 1), 0), + Session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(itemBuilder.Create(1, 1), 0), NoscorePocketType.Etc, 0); - _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(itemBuilder.Create(1, 2), 0), + Session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(itemBuilder.Create(1, 2), 0), NoscorePocketType.Etc, 1); - _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(itemBuilder.Create(1, 3), 0), + Session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(itemBuilder.Create(1, 3), 0), NoscorePocketType.Etc, 2); - _session.Character.MapInstance = _instanceProvider!.GetBaseMapById(1)!; - await _sellPacketHandler!.ExecuteAsync(new SellPacket { Slot = 0, Amount = 1, Data = (short)NoscorePocketType.Etc }, - _session); - var packet = (SMemoiPacket?)_session.LastPackets.FirstOrDefault(s => s is SMemoiPacket); - Assert.IsTrue(packet?.Type == SMemoType.FailNpc && packet?.Message == Game18NConstString.ItemCanNotBeSold); - Assert.IsTrue(_session.Character.Gold == 0); - Assert.IsNotNull(_session.Character.InventoryService.LoadBySlotAndType(0, NoscorePocketType.Etc)); + Session.Character.MapInstance = InstanceProvider.GetBaseMapById(1)!; } - [TestMethod] - public async Task UserCanSellAsync() + private void CharacterHasSoldableItems() { var items = new List { - new Item {Type = NoscorePocketType.Etc, VNum = 1, IsSoldable = true, Price = 500000} + new Item { Type = NoscorePocketType.Etc, VNum = 1, IsSoldable = true, Price = 500000 } }; var itemBuilder = new ItemGenerationService(items, - new EventLoaderService, IUseItemEventHandler>(new List>>()), _logger, TestHelpers.Instance.LogLanguageLocalizer); + new EventLoaderService, IUseItemEventHandler>(new List>>()), Logger, TestHelpers.Instance.LogLanguageLocalizer); - _session!.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(itemBuilder.Create(1, 1), 0), + Session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(itemBuilder.Create(1, 1), 0), NoscorePocketType.Etc, 0); - _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(itemBuilder.Create(1, 2), 0), + Session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(itemBuilder.Create(1, 2), 0), NoscorePocketType.Etc, 1); - _session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(itemBuilder.Create(1, 3), 0), + Session.Character.InventoryService.AddItemToPocket(InventoryItemInstance.Create(itemBuilder.Create(1, 3), 0), NoscorePocketType.Etc, 2); - _session.Character.MapInstance = _instanceProvider!.GetBaseMapById(1)!; - await _sellPacketHandler!.ExecuteAsync(new SellPacket { Slot = 0, Amount = 1, Data = (short)NoscorePocketType.Etc }, - _session); - Assert.IsTrue(_session.Character.Gold > 0); - Assert.IsNull(_session.Character.InventoryService.LoadBySlotAndType(0, NoscorePocketType.Etc)); + Session.Character.MapInstance = InstanceProvider.GetBaseMapById(1)!; + } + + private async Task SellingItem() + { + await SellPacketHandler.ExecuteAsync(new SellPacket { Slot = 0, Amount = 1, Data = (short)NoscorePocketType.Etc }, + Session); + } + + private void GoldShouldNotIncrease() + { + Assert.IsTrue(Session.Character.Gold == 0); + } + + private void GoldShouldIncrease() + { + Assert.IsTrue(Session.Character.Gold > 0); + } + + private void ItemShouldStillExist() + { + Assert.IsNotNull(Session.Character.InventoryService.LoadBySlotAndType(0, NoscorePocketType.Etc)); + } + + private void ItemShouldBeRemoved() + { + Assert.IsNull(Session.Character.InventoryService.LoadBySlotAndType(0, NoscorePocketType.Etc)); + } + + private void ShouldReceiveCannotSellError() + { + var packet = (SMemoiPacket?)Session.LastPackets.FirstOrDefault(s => s is SMemoiPacket); + Assert.IsTrue(packet?.Type == SMemoType.FailNpc && packet?.Message == Game18NConstString.ItemCanNotBeSold); } } -} \ No newline at end of file +} diff --git a/test/NosCore.PacketHandlers.Tests/Shops/ShoppingPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Shops/ShoppingPacketHandlerTests.cs new file mode 100644 index 000000000..0ab7892b3 --- /dev/null +++ b/test/NosCore.PacketHandlers.Tests/Shops/ShoppingPacketHandlerTests.cs @@ -0,0 +1,129 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.Algorithm.DignityService; +using NosCore.GameObject.Networking; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.PacketHandlers.Shops; +using NosCore.Packets.ClientPackets.Shops; +using NosCore.Shared.Enumerations; +using NosCore.Tests.Shared; +using Serilog; +using SpecLight; + +namespace NosCore.PacketHandlers.Tests.Shops +{ + [TestClass] + public class ShoppingPacketHandlerTests + { + private ShoppingPacketHandler Handler = null!; + private ClientSession Session = null!; + private Mock DignityService = null!; + private readonly ILogger Logger = new Mock().Object; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Broadcaster.Reset(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + DignityService = new Mock(); + DignityService.Setup(x => x.GetLevelFromDignity(It.IsAny())).Returns(DignityType.Default); + + Handler = new ShoppingPacketHandler( + Logger, + DignityService.Object, + TestHelpers.Instance.LogLanguageLocalizer, + TestHelpers.Instance.SessionRegistry); + } + + [TestMethod] + public async Task ShoppingFromUnknownVisualTypeShouldBeIgnored() + { + await new Spec("Shopping from unknown visual type should be ignored") + .Given(CharacterIsOnMap) + .WhenAsync(ShoppingFromUnknownVisualType) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); + } + + [TestMethod] + public async Task ShoppingFromNonExistentNpcShouldBeIgnored() + { + await new Spec("Shopping from non existent npc should be ignored") + .Given(CharacterIsOnMap) + .WhenAsync(ShoppingFromNonExistentNpc) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); + } + + [TestMethod] + public async Task ShoppingFromNonExistentPlayerShouldBeIgnored() + { + await new Spec("Shopping from non existent player should be ignored") + .Given(CharacterIsOnMap) + .WhenAsync(ShoppingFromNonExistentPlayer) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); + } + + private void CharacterIsOnMap() + { + Session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; + } + + private async Task ShoppingFromUnknownVisualType() + { + await Handler.ExecuteAsync(new ShoppingPacket + { + VisualType = (VisualType)99, + VisualId = 1, + ShopType = 0 + }, Session); + } + + private async Task ShoppingFromNonExistentNpc() + { + await Handler.ExecuteAsync(new ShoppingPacket + { + VisualType = VisualType.Npc, + VisualId = 99999, + ShopType = 0 + }, Session); + } + + private async Task ShoppingFromNonExistentPlayer() + { + await Handler.ExecuteAsync(new ShoppingPacket + { + VisualType = VisualType.Player, + VisualId = 99999, + ShopType = 0 + }, Session); + } + + private void NoPacketShouldBeSent() + { + Assert.AreEqual(0, Session.LastPackets.Count); + } + } +} diff --git a/test/NosCore.PacketHandlers.Tests/Warehouse/DepositPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Warehouse/DepositPacketHandlerTests.cs new file mode 100644 index 000000000..737fd3ed3 --- /dev/null +++ b/test/NosCore.PacketHandlers.Tests/Warehouse/DepositPacketHandlerTests.cs @@ -0,0 +1,146 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.Data.Enumerations.Miniland; +using NosCore.Data.WebApi; +using NosCore.GameObject.InterChannelCommunication.Hubs.WarehouseHub; +using NosCore.GameObject.Networking; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.GameObject.Services.InventoryService; +using NosCore.GameObject.Services.ItemGenerationService; +using NosCore.PacketHandlers.Warehouse; +using NosCore.Packets.ClientPackets.Warehouse; +using NosCore.Tests.Shared; +using SpecLight; + +namespace NosCore.PacketHandlers.Tests.Warehouse +{ + [TestClass] + public class DepositPacketHandlerTests + { + private ClientSession Session = null!; + private Mock WarehouseHub = null!; + private DepositPacketHandler Handler = null!; + private IItemGenerationService ItemProvider = null!; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Broadcaster.Reset(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + WarehouseHub = new Mock(); + Handler = new DepositPacketHandler(WarehouseHub.Object); + ItemProvider = TestHelpers.Instance.GenerateItemProvider(); + } + + [TestMethod] + public async Task DepositPacketShouldCallWarehouseHub() + { + await new Spec("Deposit packet should call warehouse hub") + .Given(CharacterIsOnMap) + .WhenAsync(DepositingItemToWarehouse) + .Then(WarehouseHubShouldBeCalled) + .ExecuteAsync(); + } + + [TestMethod] + public async Task DepositPacketShouldSendCorrectOwnerId() + { + await new Spec("Deposit packet should send correct owner id") + .Given(CharacterIsOnMap) + .WhenAsync(DepositingItemToWarehouse) + .Then(WarehouseHubShouldReceiveCorrectOwnerId) + .ExecuteAsync(); + } + + [TestMethod] + public async Task DepositPacketShouldUseWarehouseType() + { + await new Spec("Deposit packet should use warehouse type") + .Given(CharacterIsOnMap) + .WhenAsync(DepositingItemToWarehouse) + .Then(WarehouseHubShouldReceiveWarehouseType) + .ExecuteAsync(); + } + + [TestMethod] + public async Task DepositingWithItemInInventoryShouldSucceed() + { + await new Spec("Depositing with item in inventory should succeed") + .Given(CharacterIsOnMap) + .And(CharacterHasItemInInventory) + .WhenAsync(DepositingItemToWarehouse) + .Then(WarehouseHubShouldBeCalled) + .ExecuteAsync(); + } + + [TestMethod] + public async Task DepositingFromEmptyInventoryShouldStillCallHub() + { + await new Spec("Depositing from empty inventory should still call hub") + .Given(CharacterIsOnMap) + .And(CharacterHasEmptyInventory) + .WhenAsync(DepositingItemToWarehouse) + .Then(WarehouseHubShouldBeCalled) + .ExecuteAsync(); + } + + private void CharacterIsOnMap() + { + Session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; + } + + private void CharacterHasItemInInventory() + { + Session.Character.InventoryService.AddItemToPocket( + InventoryItemInstance.Create(ItemProvider.Create(1012, 10), 0)); + } + + private void CharacterHasEmptyInventory() + { + Session.Character.InventoryService.Clear(); + } + + private async Task DepositingItemToWarehouse() + { + await Handler.ExecuteAsync(new DepositPacket(), Session); + } + + private void WarehouseHubShouldBeCalled() + { + WarehouseHub.Verify(x => x.AddWarehouseItemAsync(It.IsAny()), Times.Once); + } + + private void WarehouseHubShouldReceiveCorrectOwnerId() + { + WarehouseHub.Verify(x => x.AddWarehouseItemAsync( + It.Is(r => r.OwnerId == Session.Character.CharacterId)), Times.Once); + } + + private void WarehouseHubShouldReceiveWarehouseType() + { + WarehouseHub.Verify(x => x.AddWarehouseItemAsync( + It.Is(r => r.WarehouseType == WarehouseType.Warehouse)), Times.Once); + } + } +} diff --git a/test/NosCore.PacketHandlers.Tests/Warehouse/FDepositPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Warehouse/FDepositPacketHandlerTests.cs new file mode 100644 index 000000000..8e083a784 --- /dev/null +++ b/test/NosCore.PacketHandlers.Tests/Warehouse/FDepositPacketHandlerTests.cs @@ -0,0 +1,124 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using NosCore.GameObject.Networking; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.GameObject.Services.InventoryService; +using NosCore.GameObject.Services.ItemGenerationService; +using NosCore.PacketHandlers.Warehouse; +using NosCore.Packets.ClientPackets.Warehouse; +using NosCore.Tests.Shared; +using SpecLight; + +namespace NosCore.PacketHandlers.Tests.Warehouse +{ + [TestClass] + public class FDepositPacketHandlerTests + { + private ClientSession Session = null!; + private FDepositPacketHandler Handler = null!; + private IItemGenerationService ItemProvider = null!; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Broadcaster.Reset(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + Handler = new FDepositPacketHandler(); + ItemProvider = TestHelpers.Instance.GenerateItemProvider(); + } + + [TestMethod] + public async Task FamilyDepositPacketShouldExecuteWithoutError() + { + await new Spec("Family deposit packet should execute without error") + .Given(CharacterIsOnMap) + .WhenAsync(DepositingItemToFamilyWarehouse) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); + } + + [TestMethod] + public async Task FamilyDepositWithItemShouldNotThrow() + { + await new Spec("Family deposit with item should not throw") + .Given(CharacterIsOnMap) + .And(CharacterHasItemInInventory) + .WhenAsync(DepositingItemToFamilyWarehouse) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); + } + + [TestMethod] + public async Task FamilyDepositFromEmptyInventoryShouldNotThrow() + { + await new Spec("Family deposit from empty inventory should not throw") + .Given(CharacterIsOnMap) + .And(CharacterHasEmptyInventory) + .WhenAsync(DepositingItemToFamilyWarehouse) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); + } + + [TestMethod] + public async Task FamilyDepositToSpecificSlotShouldNotThrow() + { + await new Spec("Family deposit to specific slot should not throw") + .Given(CharacterIsOnMap) + .And(CharacterHasItemInInventory) + .WhenAsync(DepositingItemToSlot5) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); + } + + private void CharacterIsOnMap() + { + Session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; + } + + private void CharacterHasItemInInventory() + { + Session.Character.InventoryService.AddItemToPocket( + InventoryItemInstance.Create(ItemProvider.Create(1012, 10), 0)); + } + + private void CharacterHasEmptyInventory() + { + Session.Character.InventoryService.Clear(); + } + + private async Task DepositingItemToFamilyWarehouse() + { + await Handler.ExecuteAsync(new FDepositPacket(), Session); + } + + private async Task DepositingItemToSlot5() + { + await Handler.ExecuteAsync(new FDepositPacket { Slot = 5 }, Session); + } + + private void NoPacketShouldBeSent() + { + Assert.AreEqual(0, Session.LastPackets.Count); + } + } +} diff --git a/test/NosCore.PacketHandlers.Tests/Warehouse/FReposPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Warehouse/FReposPacketHandlerTests.cs new file mode 100644 index 000000000..bc54838d0 --- /dev/null +++ b/test/NosCore.PacketHandlers.Tests/Warehouse/FReposPacketHandlerTests.cs @@ -0,0 +1,131 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using NosCore.GameObject.Networking; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.PacketHandlers.Warehouse; +using NosCore.Packets.ClientPackets.Warehouse; +using NosCore.Tests.Shared; +using SpecLight; + +namespace NosCore.PacketHandlers.Tests.Warehouse +{ + [TestClass] + public class FReposPacketHandlerTests + { + private ClientSession Session = null!; + private FReposPacketHandler Handler = null!; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Broadcaster.Reset(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + Handler = new FReposPacketHandler(); + } + + [TestMethod] + public async Task FamilyReposPacketShouldExecuteWithoutError() + { + await new Spec("Family repos packet should execute without error") + .Given(CharacterIsOnMap) + .WhenAsync(RearrangingFamilyWarehouseItems) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); + } + + [TestMethod] + public async Task FamilyReposFromSlot0ToSlot1ShouldNotThrow() + { + await new Spec("Family repos from slot 0 to slot 1 should not throw") + .Given(CharacterIsOnMap) + .WhenAsync(MovingItemFromSlot0ToSlot1) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); + } + + [TestMethod] + public async Task FamilyReposFromInvalidSlotShouldNotThrow() + { + await new Spec("Family repos from invalid slot should not throw") + .Given(CharacterIsOnMap) + .WhenAsync(MovingItemFromInvalidSlot) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); + } + + [TestMethod] + public async Task FamilyReposToInvalidSlotShouldNotThrow() + { + await new Spec("Family repos to invalid slot should not throw") + .Given(CharacterIsOnMap) + .WhenAsync(MovingItemToInvalidSlot) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); + } + + [TestMethod] + public async Task FamilyReposSameSlotShouldNotThrow() + { + await new Spec("Family repos same slot should not throw") + .Given(CharacterIsOnMap) + .WhenAsync(MovingItemToSameSlot) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); + } + + private void CharacterIsOnMap() + { + Session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; + } + + private async Task RearrangingFamilyWarehouseItems() + { + await Handler.ExecuteAsync(new FReposPacket(), Session); + } + + private async Task MovingItemFromSlot0ToSlot1() + { + await Handler.ExecuteAsync(new FReposPacket { OldSlot = 0, NewSlot = 1 }, Session); + } + + private async Task MovingItemFromInvalidSlot() + { + await Handler.ExecuteAsync(new FReposPacket { OldSlot = 255, NewSlot = 0 }, Session); + } + + private async Task MovingItemToInvalidSlot() + { + await Handler.ExecuteAsync(new FReposPacket { OldSlot = 0, NewSlot = 255 }, Session); + } + + private async Task MovingItemToSameSlot() + { + await Handler.ExecuteAsync(new FReposPacket { OldSlot = 5, NewSlot = 5 }, Session); + } + + private void NoPacketShouldBeSent() + { + Assert.AreEqual(0, Session.LastPackets.Count); + } + } +} diff --git a/test/NosCore.PacketHandlers.Tests/Warehouse/FStashEndPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Warehouse/FStashEndPacketHandlerTests.cs new file mode 100644 index 000000000..cdb4ccb7e --- /dev/null +++ b/test/NosCore.PacketHandlers.Tests/Warehouse/FStashEndPacketHandlerTests.cs @@ -0,0 +1,103 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using NosCore.GameObject.Networking; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.PacketHandlers.Warehouse; +using NosCore.Packets.ClientPackets.Warehouse; +using NosCore.Tests.Shared; +using SpecLight; + +namespace NosCore.PacketHandlers.Tests.Warehouse +{ + [TestClass] + public class FStashEndPacketHandlerTests + { + private ClientSession Session = null!; + private FStashEndPackettHandler Handler = null!; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Broadcaster.Reset(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + Handler = new FStashEndPackettHandler(); + } + + [TestMethod] + public async Task FamilyStashEndPacketShouldExecuteWithoutError() + { + await new Spec("Family stash end packet should execute without error") + .Given(CharacterIsOnMap) + .WhenAsync(ClosingFamilyWarehouse) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); + } + + [TestMethod] + public async Task FamilyStashEndPacketShouldNotThrowWhenWarehouseNotOpen() + { + await new Spec("Family stash end packet should not throw when warehouse not open") + .Given(CharacterIsOnMap) + .WhenAsync(ClosingFamilyWarehouseWithoutOpening) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); + } + + [TestMethod] + public async Task FamilyStashEndPacketShouldNotThrowMultipleTimes() + { + await new Spec("Family stash end packet should not throw multiple times") + .Given(CharacterIsOnMap) + .WhenAsync(ClosingFamilyWarehouseMultipleTimes) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); + } + + private void CharacterIsOnMap() + { + Session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; + } + + private async Task ClosingFamilyWarehouse() + { + await Handler.ExecuteAsync(new FStashEndPacket(), Session); + } + + private async Task ClosingFamilyWarehouseWithoutOpening() + { + await Handler.ExecuteAsync(new FStashEndPacket(), Session); + } + + private async Task ClosingFamilyWarehouseMultipleTimes() + { + await Handler.ExecuteAsync(new FStashEndPacket(), Session); + await Handler.ExecuteAsync(new FStashEndPacket(), Session); + await Handler.ExecuteAsync(new FStashEndPacket(), Session); + } + + private void NoPacketShouldBeSent() + { + Assert.AreEqual(0, Session.LastPackets.Count); + } + } +} diff --git a/test/NosCore.PacketHandlers.Tests/Warehouse/FWithdrawPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Warehouse/FWithdrawPacketHandlerTests.cs new file mode 100644 index 000000000..3c9d7b239 --- /dev/null +++ b/test/NosCore.PacketHandlers.Tests/Warehouse/FWithdrawPacketHandlerTests.cs @@ -0,0 +1,140 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using NosCore.GameObject.Networking; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.GameObject.Services.InventoryService; +using NosCore.GameObject.Services.ItemGenerationService; +using NosCore.PacketHandlers.Warehouse; +using NosCore.Packets.ClientPackets.Warehouse; +using NosCore.Tests.Shared; +using SpecLight; + +namespace NosCore.PacketHandlers.Tests.Warehouse +{ + [TestClass] + public class FWithdrawPacketHandlerTests + { + private ClientSession Session = null!; + private FWithdrawPacketHandler Handler = null!; + private IItemGenerationService ItemProvider = null!; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Broadcaster.Reset(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + Handler = new FWithdrawPacketHandler(); + ItemProvider = TestHelpers.Instance.GenerateItemProvider(); + } + + [TestMethod] + public async Task FamilyWithdrawPacketShouldExecuteWithoutError() + { + await new Spec("Family withdraw packet should execute without error") + .Given(CharacterIsOnMap) + .WhenAsync(WithdrawingItemFromFamilyWarehouse) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); + } + + [TestMethod] + public async Task FamilyWithdrawFromEmptyWarehouseShouldNotThrow() + { + await new Spec("Family withdraw from empty warehouse should not throw") + .Given(CharacterIsOnMap) + .WhenAsync(WithdrawingFromSlot0) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); + } + + [TestMethod] + public async Task FamilyWithdrawFromInvalidSlotShouldNotThrow() + { + await new Spec("Family withdraw from invalid slot should not throw") + .Given(CharacterIsOnMap) + .WhenAsync(WithdrawingFromInvalidSlot) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); + } + + [TestMethod] + public async Task FamilyWithdrawWithFullInventoryShouldNotThrow() + { + await new Spec("Family withdraw with full inventory should not throw") + .Given(CharacterIsOnMap) + .And(CharacterHasFullInventory) + .WhenAsync(WithdrawingItemFromFamilyWarehouse) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); + } + + [TestMethod] + public async Task FamilyWithdrawWithEmptyInventoryShouldNotThrow() + { + await new Spec("Family withdraw with empty inventory should not throw") + .Given(CharacterIsOnMap) + .And(CharacterHasEmptyInventory) + .WhenAsync(WithdrawingItemFromFamilyWarehouse) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); + } + + private void CharacterIsOnMap() + { + Session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; + } + + private void CharacterHasFullInventory() + { + Session.Character.InventoryService.AddItemToPocket( + InventoryItemInstance.Create(ItemProvider.Create(1012, 999), 0)); + Session.Character.InventoryService.AddItemToPocket( + InventoryItemInstance.Create(ItemProvider.Create(1012, 999), 0)); + } + + private void CharacterHasEmptyInventory() + { + Session.Character.InventoryService.Clear(); + } + + private async Task WithdrawingItemFromFamilyWarehouse() + { + await Handler.ExecuteAsync(new FWithdrawPacket(), Session); + } + + private async Task WithdrawingFromSlot0() + { + await Handler.ExecuteAsync(new FWithdrawPacket { Slot = 0 }, Session); + } + + private async Task WithdrawingFromInvalidSlot() + { + await Handler.ExecuteAsync(new FWithdrawPacket { Slot = 999 }, Session); + } + + private void NoPacketShouldBeSent() + { + Assert.AreEqual(0, Session.LastPackets.Count); + } + } +} diff --git a/test/NosCore.PacketHandlers.Tests/Warehouse/ReposPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Warehouse/ReposPacketHandlerTests.cs new file mode 100644 index 000000000..ead0b187e --- /dev/null +++ b/test/NosCore.PacketHandlers.Tests/Warehouse/ReposPacketHandlerTests.cs @@ -0,0 +1,131 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using NosCore.GameObject.Networking; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.PacketHandlers.Warehouse; +using NosCore.Packets.ClientPackets.Warehouse; +using NosCore.Tests.Shared; +using SpecLight; + +namespace NosCore.PacketHandlers.Tests.Warehouse +{ + [TestClass] + public class ReposPacketHandlerTests + { + private ClientSession Session = null!; + private ReposPacketHandler Handler = null!; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Broadcaster.Reset(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + Handler = new ReposPacketHandler(); + } + + [TestMethod] + public async Task ReposPacketShouldExecuteWithoutError() + { + await new Spec("Repos packet should execute without error") + .Given(CharacterIsOnMap) + .WhenAsync(RearrangingWarehouseItems) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); + } + + [TestMethod] + public async Task ReposFromSlot0ToSlot1ShouldNotThrow() + { + await new Spec("Repos from slot 0 to slot 1 should not throw") + .Given(CharacterIsOnMap) + .WhenAsync(MovingItemFromSlot0ToSlot1) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); + } + + [TestMethod] + public async Task ReposFromInvalidSlotShouldNotThrow() + { + await new Spec("Repos from invalid slot should not throw") + .Given(CharacterIsOnMap) + .WhenAsync(MovingItemFromInvalidSlot) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); + } + + [TestMethod] + public async Task ReposToInvalidSlotShouldNotThrow() + { + await new Spec("Repos to invalid slot should not throw") + .Given(CharacterIsOnMap) + .WhenAsync(MovingItemToInvalidSlot) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); + } + + [TestMethod] + public async Task ReposSameSlotShouldNotThrow() + { + await new Spec("Repos same slot should not throw") + .Given(CharacterIsOnMap) + .WhenAsync(MovingItemToSameSlot) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); + } + + private void CharacterIsOnMap() + { + Session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; + } + + private async Task RearrangingWarehouseItems() + { + await Handler.ExecuteAsync(new ReposPacket(), Session); + } + + private async Task MovingItemFromSlot0ToSlot1() + { + await Handler.ExecuteAsync(new ReposPacket { OldSlot = 0, NewSlot = 1 }, Session); + } + + private async Task MovingItemFromInvalidSlot() + { + await Handler.ExecuteAsync(new ReposPacket { OldSlot = 255, NewSlot = 0 }, Session); + } + + private async Task MovingItemToInvalidSlot() + { + await Handler.ExecuteAsync(new ReposPacket { OldSlot = 0, NewSlot = 255 }, Session); + } + + private async Task MovingItemToSameSlot() + { + await Handler.ExecuteAsync(new ReposPacket { OldSlot = 5, NewSlot = 5 }, Session); + } + + private void NoPacketShouldBeSent() + { + Assert.AreEqual(0, Session.LastPackets.Count); + } + } +} diff --git a/test/NosCore.PacketHandlers.Tests/Warehouse/StashEndPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Warehouse/StashEndPacketHandlerTests.cs new file mode 100644 index 000000000..d007e95c6 --- /dev/null +++ b/test/NosCore.PacketHandlers.Tests/Warehouse/StashEndPacketHandlerTests.cs @@ -0,0 +1,103 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using NosCore.GameObject.Networking; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.PacketHandlers.Warehouse; +using NosCore.Packets.ClientPackets.Warehouse; +using NosCore.Tests.Shared; +using SpecLight; + +namespace NosCore.PacketHandlers.Tests.Warehouse +{ + [TestClass] + public class StashEndPacketHandlerTests + { + private ClientSession Session = null!; + private StashEndPacketHandler Handler = null!; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Broadcaster.Reset(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + Handler = new StashEndPacketHandler(); + } + + [TestMethod] + public async Task StashEndPacketShouldExecuteWithoutError() + { + await new Spec("Stash end packet should execute without error") + .Given(CharacterIsOnMap) + .WhenAsync(ClosingWarehouse) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); + } + + [TestMethod] + public async Task StashEndPacketShouldNotThrowWhenWarehouseNotOpen() + { + await new Spec("Stash end packet should not throw when warehouse not open") + .Given(CharacterIsOnMap) + .WhenAsync(ClosingWarehouseWithoutOpening) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); + } + + [TestMethod] + public async Task StashEndPacketShouldNotThrowMultipleTimes() + { + await new Spec("Stash end packet should not throw multiple times") + .Given(CharacterIsOnMap) + .WhenAsync(ClosingWarehouseMultipleTimes) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); + } + + private void CharacterIsOnMap() + { + Session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; + } + + private async Task ClosingWarehouse() + { + await Handler.ExecuteAsync(new StashEndPacket(), Session); + } + + private async Task ClosingWarehouseWithoutOpening() + { + await Handler.ExecuteAsync(new StashEndPacket(), Session); + } + + private async Task ClosingWarehouseMultipleTimes() + { + await Handler.ExecuteAsync(new StashEndPacket(), Session); + await Handler.ExecuteAsync(new StashEndPacket(), Session); + await Handler.ExecuteAsync(new StashEndPacket(), Session); + } + + private void NoPacketShouldBeSent() + { + Assert.AreEqual(0, Session.LastPackets.Count); + } + } +} diff --git a/test/NosCore.PacketHandlers.Tests/Warehouse/WarehousePacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Warehouse/WarehousePacketHandlerTests.cs new file mode 100644 index 000000000..d1199cd01 --- /dev/null +++ b/test/NosCore.PacketHandlers.Tests/Warehouse/WarehousePacketHandlerTests.cs @@ -0,0 +1,191 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.GameObject.InterChannelCommunication.Hubs.WarehouseHub; +using NosCore.GameObject.Networking; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.PacketHandlers.Warehouse; +using NosCore.Packets.ClientPackets.Warehouse; +using NosCore.Tests.Shared; +using SpecLight; + +namespace NosCore.PacketHandlers.Tests.Warehouse +{ + [TestClass] + public class WarehousePacketHandlerTests + { + private ClientSession Session = null!; + private Mock WarehouseHub = null!; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Broadcaster.Reset(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + WarehouseHub = new Mock(); + } + + [TestMethod] + public async Task DepositPacketShouldCallWarehouseHub() + { + await new Spec("Deposit packet should call warehouse hub") + .Given(CharacterIsOnMap) + .WhenAsync(DepositingItemToWarehouse) + .Then(WarehouseHubShouldBeCalled) + .ExecuteAsync(); + } + + [TestMethod] + public async Task WithdrawPacketShouldExecuteWithoutError() + { + await new Spec("Withdraw packet should execute without error") + .Given(CharacterIsOnMap) + .WhenAsync(WithdrawingItemFromWarehouse) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); + } + + [TestMethod] + public async Task StashEndPacketShouldExecuteWithoutError() + { + await new Spec("Stash end packet should execute without error") + .Given(CharacterIsOnMap) + .WhenAsync(ClosingWarehouse) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); + } + + [TestMethod] + public async Task ReposPacketShouldExecuteWithoutError() + { + await new Spec("Repos packet should execute without error") + .Given(CharacterIsOnMap) + .WhenAsync(RearrangingWarehouseItems) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); + } + + [TestMethod] + public async Task FamilyDepositPacketShouldExecuteWithoutError() + { + await new Spec("Family deposit packet should execute without error") + .Given(CharacterIsOnMap) + .WhenAsync(DepositingItemToFamilyWarehouse) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); + } + + [TestMethod] + public async Task FamilyWithdrawPacketShouldExecuteWithoutError() + { + await new Spec("Family withdraw packet should execute without error") + .Given(CharacterIsOnMap) + .WhenAsync(WithdrawingItemFromFamilyWarehouse) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); + } + + [TestMethod] + public async Task FamilyStashEndPacketShouldExecuteWithoutError() + { + await new Spec("Family stash end packet should execute without error") + .Given(CharacterIsOnMap) + .WhenAsync(ClosingFamilyWarehouse) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); + } + + [TestMethod] + public async Task FamilyReposPacketShouldExecuteWithoutError() + { + await new Spec("Family repos packet should execute without error") + .Given(CharacterIsOnMap) + .WhenAsync(RearrangingFamilyWarehouseItems) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); + } + + private void CharacterIsOnMap() + { + Session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; + } + + private async Task DepositingItemToWarehouse() + { + var handler = new DepositPacketHandler(WarehouseHub.Object); + await handler.ExecuteAsync(new DepositPacket(), Session); + } + + private async Task WithdrawingItemFromWarehouse() + { + var handler = new WithdrawPacketHandler(); + await handler.ExecuteAsync(new WithdrawPacket(), Session); + } + + private async Task ClosingWarehouse() + { + var handler = new StashEndPacketHandler(); + await handler.ExecuteAsync(new StashEndPacket(), Session); + } + + private async Task RearrangingWarehouseItems() + { + var handler = new ReposPacketHandler(); + await handler.ExecuteAsync(new ReposPacket(), Session); + } + + private async Task DepositingItemToFamilyWarehouse() + { + var handler = new FDepositPacketHandler(); + await handler.ExecuteAsync(new FDepositPacket(), Session); + } + + private async Task WithdrawingItemFromFamilyWarehouse() + { + var handler = new FWithdrawPacketHandler(); + await handler.ExecuteAsync(new FWithdrawPacket(), Session); + } + + private async Task ClosingFamilyWarehouse() + { + var handler = new FStashEndPackettHandler(); + await handler.ExecuteAsync(new FStashEndPacket(), Session); + } + + private async Task RearrangingFamilyWarehouseItems() + { + var handler = new FReposPacketHandler(); + await handler.ExecuteAsync(new FReposPacket(), Session); + } + + private void WarehouseHubShouldBeCalled() + { + WarehouseHub.Verify(x => x.AddWarehouseItemAsync(It.IsAny()), Times.Once); + } + + private void NoPacketShouldBeSent() + { + Assert.AreEqual(0, Session.LastPackets.Count); + } + } +} diff --git a/test/NosCore.PacketHandlers.Tests/Warehouse/WithdrawPacketHandlerTests.cs b/test/NosCore.PacketHandlers.Tests/Warehouse/WithdrawPacketHandlerTests.cs new file mode 100644 index 000000000..5f069c782 --- /dev/null +++ b/test/NosCore.PacketHandlers.Tests/Warehouse/WithdrawPacketHandlerTests.cs @@ -0,0 +1,140 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using NosCore.GameObject.Networking; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.GameObject.Services.InventoryService; +using NosCore.GameObject.Services.ItemGenerationService; +using NosCore.PacketHandlers.Warehouse; +using NosCore.Packets.ClientPackets.Warehouse; +using NosCore.Tests.Shared; +using SpecLight; + +namespace NosCore.PacketHandlers.Tests.Warehouse +{ + [TestClass] + public class WithdrawPacketHandlerTests + { + private ClientSession Session = null!; + private WithdrawPacketHandler Handler = null!; + private IItemGenerationService ItemProvider = null!; + + [TestInitialize] + public async Task SetupAsync() + { + await TestHelpers.ResetAsync(); + Broadcaster.Reset(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + Handler = new WithdrawPacketHandler(); + ItemProvider = TestHelpers.Instance.GenerateItemProvider(); + } + + [TestMethod] + public async Task WithdrawPacketShouldExecuteWithoutError() + { + await new Spec("Withdraw packet should execute without error") + .Given(CharacterIsOnMap) + .WhenAsync(WithdrawingItemFromWarehouse) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); + } + + [TestMethod] + public async Task WithdrawFromEmptyWarehouseShouldNotThrow() + { + await new Spec("Withdraw from empty warehouse should not throw") + .Given(CharacterIsOnMap) + .WhenAsync(WithdrawingFromSlot0) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); + } + + [TestMethod] + public async Task WithdrawFromInvalidSlotShouldNotThrow() + { + await new Spec("Withdraw from invalid slot should not throw") + .Given(CharacterIsOnMap) + .WhenAsync(WithdrawingFromInvalidSlot) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); + } + + [TestMethod] + public async Task WithdrawWithFullInventoryShouldNotThrow() + { + await new Spec("Withdraw with full inventory should not throw") + .Given(CharacterIsOnMap) + .And(CharacterHasFullInventory) + .WhenAsync(WithdrawingItemFromWarehouse) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); + } + + [TestMethod] + public async Task WithdrawWithEmptyInventoryShouldNotThrow() + { + await new Spec("Withdraw with empty inventory should not throw") + .Given(CharacterIsOnMap) + .And(CharacterHasEmptyInventory) + .WhenAsync(WithdrawingItemFromWarehouse) + .Then(NoPacketShouldBeSent) + .ExecuteAsync(); + } + + private void CharacterIsOnMap() + { + Session.Character.MapInstance = TestHelpers.Instance.MapInstanceAccessorService.GetBaseMapById(1)!; + } + + private void CharacterHasFullInventory() + { + Session.Character.InventoryService.AddItemToPocket( + InventoryItemInstance.Create(ItemProvider.Create(1012, 999), 0)); + Session.Character.InventoryService.AddItemToPocket( + InventoryItemInstance.Create(ItemProvider.Create(1012, 999), 0)); + } + + private void CharacterHasEmptyInventory() + { + Session.Character.InventoryService.Clear(); + } + + private async Task WithdrawingItemFromWarehouse() + { + await Handler.ExecuteAsync(new WithdrawPacket(), Session); + } + + private async Task WithdrawingFromSlot0() + { + await Handler.ExecuteAsync(new WithdrawPacket { Slot = 0 }, Session); + } + + private async Task WithdrawingFromInvalidSlot() + { + await Handler.ExecuteAsync(new WithdrawPacket { Slot = 999 }, Session); + } + + private void NoPacketShouldBeSent() + { + Assert.AreEqual(0, Session.LastPackets.Count); + } + } +} diff --git a/test/NosCore.Tests.Shared/AutoFixture/NosCoreFixture.cs b/test/NosCore.Tests.Shared/AutoFixture/NosCoreFixture.cs new file mode 100644 index 000000000..eb1fe24f1 --- /dev/null +++ b/test/NosCore.Tests.Shared/AutoFixture/NosCoreFixture.cs @@ -0,0 +1,74 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using AutoFixture; +using AutoFixture.AutoMoq; +using NosCore.Data.Dto; +using NosCore.Data.Enumerations; +using NosCore.Data.StaticEntities; +using NosCore.Data.WebApi; +using NosCore.Packets.ClientPackets.Bazaar; + +namespace NosCore.Tests.Shared.AutoFixture +{ + public class NosCoreFixture : Fixture + { + public NosCoreFixture() + { + Customize(new AutoMoqCustomization { ConfigureMembers = true }); + + this.Inject(TestHelpers.Instance.Clock); + this.Inject(TestHelpers.Instance.CharacterDao); + this.Inject(TestHelpers.Instance.AccountDao); + this.Inject(TestHelpers.Instance.MateDao); + this.Inject(TestHelpers.Instance.MinilandDao); + this.Inject(TestHelpers.Instance.LogLanguageLocalizer); + this.Inject(TestHelpers.Instance.GameLanguageLocalizer); + this.Inject(TestHelpers.Instance.WorldConfiguration); + + Customize(c => c + .With(x => x.VNum, () => (short)(this.Create() % 1000 + 1000)) + .With(x => x.Type, NoscorePocketType.Main) + .With(x => x.IsSoldable, () => true) + .With(x => x.IsDroppable, () => true)); + + Customize(c => c + .With(x => x.Amount, 1) + .With(x => x.Price, 1000) + .With(x => x.Duration, 3600) + .With(x => x.HasMedal, () => false) + .With(x => x.IsPackage, () => false)); + + Customize(c => c + .With(x => x.Type, 0) + .With(x => x.Inventory, 1) + .With(x => x.Slot, (short)0) + .With(x => x.Amount, 1) + .With(x => x.Price, 1000) + .With(x => x.Durability, 1) + .With(x => x.IsPackage, () => false) + .With(x => x.Taxe, 0) + .With(x => x.MedalUsed, 0)); + + Customize(c => c + .With(x => x.Amount, 1) + .With(x => x.ItemVNum, (short)1012)); + } + } +} diff --git a/test/NosCore.Tests.Shared/BDD/SpecBase.cs b/test/NosCore.Tests.Shared/BDD/SpecBase.cs new file mode 100644 index 000000000..7b5ca7db4 --- /dev/null +++ b/test/NosCore.Tests.Shared/BDD/SpecBase.cs @@ -0,0 +1,152 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using NosCore.Data.Dto; +using NosCore.Data.Enumerations; +using NosCore.Data.Enumerations.Buff; +using NosCore.Data.Enumerations.Items; +using NosCore.Data.StaticEntities; +using NosCore.GameObject.Infastructure; +using NosCore.GameObject.Networking; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.GameObject.Services.EventLoaderService; +using NosCore.GameObject.Services.InventoryService; +using NosCore.GameObject.Services.ItemGenerationService; +using NosCore.GameObject.Services.ItemGenerationService.Item; +using NosCore.Packets.ClientPackets.Inventory; +using NosCore.Packets.Enumerations; +using NosCore.Packets.Interfaces; +using NosCore.Packets.ServerPackets.UI; +using NosCore.Tests.Shared.AutoFixture; +using Serilog; + +namespace NosCore.Tests.Shared.BDD +{ + public abstract class SpecBase + { + protected NosCoreFixture Fixture { get; private set; } = null!; + protected ClientSession Session { get; set; } = null!; + protected ItemGenerationService ItemProvider { get; set; } = null!; + protected ILogger Logger { get; } = new Mock().Object; + + protected List DefaultItems { get; } = new() + { + new Item { Type = NoscorePocketType.Main, VNum = 1012, IsSoldable = true, IsDroppable = true }, + new Item { Type = NoscorePocketType.Main, VNum = 1013 }, + new Item { Type = NoscorePocketType.Equipment, VNum = 1, ItemType = ItemType.Weapon }, + new Item { Type = NoscorePocketType.Equipment, VNum = 2, ItemType = ItemType.Weapon }, + new Item { Type = NoscorePocketType.Equipment, VNum = 912, ItemType = ItemType.Specialist }, + new Item { Type = NoscorePocketType.Equipment, VNum = 924, ItemType = ItemType.Fashion } + }; + + [TestInitialize] + public virtual async Task SetupAsync() + { + Broadcaster.Reset(); + await TestHelpers.ResetAsync(); + Fixture = new NosCoreFixture(); + Session = await TestHelpers.Instance.GenerateSessionAsync(); + Session.Character.StaticBonusList = new List(); + ItemProvider = new ItemGenerationService( + DefaultItems, + new EventLoaderService, IUseItemEventHandler>( + new List>>()), + Logger, + TestHelpers.Instance.LogLanguageLocalizer); + } + + protected void CharacterHasGold(long gold) => Session.Character.Gold = gold; + + protected void CharacterHasItem(short vnum) => CharacterHasItem(vnum, 1); + + protected void CharacterHasItem(short vnum, short amount) + { + var item = ItemProvider.Create(vnum, amount); + var pocketType = item.Item.Type; + Session.Character.InventoryService.AddItemToPocket( + InventoryItemInstance.Create(item, 0), pocketType, 0); + } + + protected void CharacterHasMedalBonus(StaticBonusType bonusType) + { + Session.Character.StaticBonusList.Add(new StaticBonusDto { StaticBonusType = bonusType }); + } + + protected void CharacterIsInShop() => Session.Character.InShop = true; + + protected void InventoryShouldBeEmpty() => + Assert.AreEqual(0, Session.Character.InventoryService.Count); + + protected void InventoryShouldHaveCount(int count) => + Assert.AreEqual(count, Session.Character.InventoryService.Count); + + protected void InventoryShouldContainItem(short vnum, short amount) + { + var item = Session.Character.InventoryService.FirstOrDefault(); + Assert.IsNotNull(item.Value); + Assert.AreEqual(vnum, item.Value.ItemInstance.ItemVNum); + Assert.AreEqual(amount, item.Value.ItemInstance.Amount); + } + + protected void GoldShouldBe(long expected) => + Assert.AreEqual(expected, Session.Character.Gold); + + protected void NoPacketShouldBeSent() => + Assert.IsNull(Session.LastPackets.FirstOrDefault()); + + protected T? GetLastPacket() where T : class, IPacket => + (T?)Session.LastPackets.FirstOrDefault(s => s is T); + + protected void ShouldReceiveMessage(Game18NConstString message) + { + var packet = GetLastPacket(); + Assert.IsNotNull(packet); + Assert.AreEqual(message, packet.Message); + } + + protected void ShouldReceiveMessage(Game18NConstString message, MessageType messageType) + { + var packet = GetLastPacket(); + Assert.IsNotNull(packet); + Assert.AreEqual(message, packet.Message); + Assert.AreEqual(messageType, packet.Type); + } + + protected void ShouldReceiveModalMessage(Game18NConstString message) + { + var packet = GetLastPacket(); + Assert.IsNotNull(packet); + Assert.AreEqual(message, packet.Message); + } + + protected void ShouldReceiveModalMessage(Game18NConstString message, byte type, byte argumentType) + { + var packet = GetLastPacket(); + Assert.IsNotNull(packet); + Assert.AreEqual(message, packet.Message); + Assert.AreEqual(type, packet.Type); + Assert.AreEqual(argumentType, packet.ArgumentType); + } + } +} diff --git a/test/NosCore.Tests.Shared/BDD/Steps/InventorySteps.cs b/test/NosCore.Tests.Shared/BDD/Steps/InventorySteps.cs new file mode 100644 index 000000000..a9e93721c --- /dev/null +++ b/test/NosCore.Tests.Shared/BDD/Steps/InventorySteps.cs @@ -0,0 +1,70 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Linq; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.Data.Enumerations; + +namespace NosCore.Tests.Shared.BDD.Steps +{ + public static class InventorySteps + { + public static void AssertInventoryEmpty(this ClientSession session) + { + Assert.AreEqual(0, session.Character.InventoryService.Count); + } + + public static void AssertInventoryCount(this ClientSession session, int expected) + { + Assert.AreEqual(expected, session.Character.InventoryService.Count); + } + + public static void AssertInventoryContains(this ClientSession session, int vnum, int amount) + { + var item = session.Character.InventoryService.FirstOrDefault( + i => i.Value.ItemInstance.ItemVNum == vnum); + Assert.IsNotNull(item.Value, $"Expected item {vnum} not found in inventory"); + Assert.AreEqual(amount, item.Value.ItemInstance.Amount); + } + + public static void AssertInventoryItemAmount(this ClientSession session, int slot, int expectedAmount) + { + var item = session.Character.InventoryService.FirstOrDefault(); + Assert.IsNotNull(item.Value, "No item found in inventory"); + Assert.AreEqual(expectedAmount, item.Value.ItemInstance.Amount); + } + + public static void AssertGold(this ClientSession session, long expected) + { + Assert.AreEqual(expected, session.Character.Gold); + } + + public static void AssertGoldGreaterThan(this ClientSession session, long minimum) + { + Assert.IsTrue(session.Character.Gold > minimum, + $"Expected gold > {minimum}, but was {session.Character.Gold}"); + } + + public static void AssertInventorySlotEmpty(this ClientSession session, short slot, NoscorePocketType type) + { + Assert.IsNull(session.Character.InventoryService.LoadBySlotAndType(slot, type)); + } + } +} diff --git a/test/NosCore.Tests.Shared/BDD/Steps/PacketSteps.cs b/test/NosCore.Tests.Shared/BDD/Steps/PacketSteps.cs new file mode 100644 index 000000000..2a524b390 --- /dev/null +++ b/test/NosCore.Tests.Shared/BDD/Steps/PacketSteps.cs @@ -0,0 +1,88 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.Packets.Enumerations; +using NosCore.Packets.Interfaces; +using NosCore.Packets.ServerPackets.UI; + +namespace NosCore.Tests.Shared.BDD.Steps +{ + public static class PacketSteps + { + public static async Task HandlePacketAsync(this ClientSession session, TPacket packet) + where TPacket : class, IPacket + { + await session.HandlePacketsAsync(new IPacket[] { packet }); + } + + public static TPacket? GetLastPacket(this ClientSession session) where TPacket : class, IPacket + { + return (TPacket?)session.LastPackets.FirstOrDefault(s => s is TPacket); + } + + public static void AssertNoPacketSent(this ClientSession session) + { + Assert.IsNull(session.LastPackets.FirstOrDefault()); + } + + public static void AssertReceivedMessage(this ClientSession session, Game18NConstString message) + { + var packet = session.GetLastPacket(); + Assert.IsNotNull(packet, "Expected MsgiPacket but none was sent"); + Assert.AreEqual(message, packet.Message); + } + + public static void AssertReceivedMessage(this ClientSession session, Game18NConstString message, MessageType type) + { + var packet = session.GetLastPacket(); + Assert.IsNotNull(packet, "Expected MsgiPacket but none was sent"); + Assert.AreEqual(message, packet.Message); + Assert.AreEqual(type, packet.Type); + } + + public static void AssertReceivedModalMessage(this ClientSession session, Game18NConstString message) + { + var packet = session.GetLastPacket(); + Assert.IsNotNull(packet, "Expected ModaliPacket but none was sent"); + Assert.AreEqual(message, packet.Message); + } + + public static void AssertReceivedModalMessage(this ClientSession session, Game18NConstString message, int type, int argumentType) + { + var packet = session.GetLastPacket(); + Assert.IsNotNull(packet, "Expected ModaliPacket but none was sent"); + Assert.AreEqual(message, packet.Message); + Assert.AreEqual(type, packet.Type); + Assert.AreEqual(argumentType, packet.ArgumentType); + } + + public static void AssertReceivedPacket(this ClientSession session, Action? assertion = null) + where TPacket : class, IPacket + { + var packet = session.GetLastPacket(); + Assert.IsNotNull(packet, $"Expected {typeof(TPacket).Name} but none was sent"); + assertion?.Invoke(packet); + } + } +} diff --git a/test/NosCore.Tests.Shared/BDD/Steps/SessionSteps.cs b/test/NosCore.Tests.Shared/BDD/Steps/SessionSteps.cs new file mode 100644 index 000000000..38726efbc --- /dev/null +++ b/test/NosCore.Tests.Shared/BDD/Steps/SessionSteps.cs @@ -0,0 +1,63 @@ +// __ _ __ __ ___ __ ___ ___ +// | \| |/__\ /' _/ / _//__\| _ \ __| +// | | ' | \/ |`._`.| \_| \/ | v / _| +// |_|\__|\__/ |___/ \__/\__/|_|_\___| +// +// Copyright (C) 2019 - NosCore +// +// NosCore is a free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +using System.Collections.Generic; +using NosCore.Data.Dto; +using NosCore.Data.Enumerations.Buff; +using NosCore.GameObject.Networking.ClientSession; +using NosCore.GameObject.Services.InventoryService; +using NosCore.GameObject.Services.ItemGenerationService; + +namespace NosCore.Tests.Shared.BDD.Steps +{ + public static class SessionSteps + { + public static void WithGold(this ClientSession session, long gold) + { + session.Character.Gold = gold; + } + + public static void WithItem(this ClientSession session, IItemGenerationService itemProvider, short vnum, short amount = 1) + { + session.Character.InventoryService.AddItemToPocket( + InventoryItemInstance.Create(itemProvider.Create(vnum, amount), 0)); + } + + public static void WithMedalBonus(this ClientSession session, StaticBonusType bonusType) + { + session.Character.StaticBonusList ??= new List(); + session.Character.StaticBonusList.Add(new StaticBonusDto { StaticBonusType = bonusType }); + } + + public static void InShop(this ClientSession session) + { + session.Character.InShop = true; + } + + public static void WithLevel(this ClientSession session, byte level) + { + session.Character.Level = level; + } + + public static void WithJobLevel(this ClientSession session, byte jobLevel) + { + session.Character.JobLevel = jobLevel; + } + } +} diff --git a/test/NosCore.Tests.Shared/TestHelpers.cs b/test/NosCore.Tests.Shared/TestHelpers.cs index 41b6ffa6d..e6799af1f 100644 --- a/test/NosCore.Tests.Shared/TestHelpers.cs +++ b/test/NosCore.Tests.Shared/TestHelpers.cs @@ -105,22 +105,22 @@ namespace NosCore.Tests.Shared { public class TestHelpers { - private static Lazy _lazy = new(() => new TestHelpers()); + private static Lazy Lazy = new(() => new TestHelpers()); - private IDao _inventoryItemInstanceDao = null!; - private IDao _itemInstanceDao = null!; - private readonly ILogger _logger = new Mock().Object; - private IDao _mapMonsterDao = null!; - private IDao _mapNpcDao = null!; - private IDao _portalDao = null!; - private IDao _shopItemDao = null!; - private IDao _staticBonusDao = null!; - private int _lastId = 100; + private IDao InventoryItemInstanceDao = null!; + private IDao ItemInstanceDao = null!; + private readonly ILogger Logger = new Mock().Object; + private IDao MapMonsterDao = null!; + private IDao MapNpcDao = null!; + private IDao PortalDao = null!; + private IDao ShopItemDao = null!; + private IDao StaticBonusDao = null!; + private int LastId = 100; public Mock BlacklistHttpClient = new(); public Mock ChannelHttpClient = new(); public Mock PubSubHub = new(); public Mock FriendHttpClient = new(); - public NosCore.GameObject.Services.BroadcastService.SessionRegistry SessionRegistry = new(); + public NosCore.GameObject.Services.BroadcastService.SessionRegistry SessionRegistry = new(new Mock().Object); public FakeClock Clock = new(Instant.FromUtc(2021,01,01,01,01,01)); public ISessionGroupFactory SessionGroupFactory { get; private set; } = null!; private TestHelpers() @@ -145,7 +145,7 @@ private TestHelpers() GameLanguageLocalizer = mock2.Object; } - public static TestHelpers Instance => _lazy.Value; + public static TestHelpers Instance => Lazy.Value; public IDao AccountDao { get; private set; } = null!; public IDao MateDao { get; private set; } = null!; @@ -250,20 +250,20 @@ private async Task GenerateMapInstanceProviderAsync() } }; var npc = new MapNpcDto(); - await _mapNpcDao.TryInsertOrUpdateAsync(npc); + await MapNpcDao.TryInsertOrUpdateAsync(npc); var mapInstanceRegistry = new MapInstanceRegistry(); MapInstanceAccessorService = new MapInstanceAccessorService(mapInstanceRegistry); var mapChangeService = new MapChangeService(new Mock().Object, new Mock().Object, new Mock().Object, - MapInstanceAccessorService, Instance.Clock, Instance.LogLanguageLocalizer, new Mock().Object, _logger, Instance.LogLanguageLocalizer, Instance.GameLanguageLocalizer, SessionRegistry); + MapInstanceAccessorService, Instance.Clock, Instance.LogLanguageLocalizer, new Mock().Object, Logger, Instance.LogLanguageLocalizer, Instance.GameLanguageLocalizer, SessionRegistry); var sessionGroupFactory = new Mock().Object; var instanceGeneratorService = new MapInstanceGeneratorService(new List { map, mapShop, miniland }, new List(), new List(), new List(), MapItemProvider, - _mapNpcDao, - _mapMonsterDao, _portalDao, _shopItemDao, _logger, new EventLoaderService(new List>()), + MapNpcDao, + MapMonsterDao, PortalDao, ShopItemDao, Logger, new EventLoaderService(new List>()), mapInstanceRegistry, MapInstanceAccessorService, Instance.Clock, Instance.LogLanguageLocalizer, mapChangeService, sessionGroupFactory, SessionRegistry); await instanceGeneratorService.InitializeAsync(); await instanceGeneratorService.AddMapInstanceAsync(new MapInstance(miniland, MinilandId, false, - MapInstanceType.NormalInstance, MapItemProvider, _logger, Clock, mapChangeService, sessionGroupFactory, SessionRegistry)); + MapInstanceType.NormalInstance, MapItemProvider, Logger, Clock, mapChangeService, sessionGroupFactory, SessionRegistry)); MapInstanceGeneratorService = instanceGeneratorService; } @@ -275,9 +275,9 @@ public IItemGenerationService GenerateItemProvider() Tuple>> { new SpRechargerEventHandler(WorldConfiguration), - new VehicleEventHandler(_logger, Instance.LogLanguageLocalizer, new TransformationService(Instance.Clock, new Mock().Object, new Mock().Object, new Mock().Object, new Mock().Object, Instance.LogLanguageLocalizer)), - new WearEventHandler(_logger, Instance.Clock, Instance.LogLanguageLocalizer) - }), _logger, Instance.LogLanguageLocalizer); + new VehicleEventHandler(Logger, Instance.LogLanguageLocalizer, new TransformationService(Instance.Clock, new Mock().Object, new Mock().Object, new Mock().Object, new Mock().Object, Instance.LogLanguageLocalizer)), + new WearEventHandler(Logger, Instance.Clock, Instance.LogLanguageLocalizer) + }), Logger, Instance.LogLanguageLocalizer); } public void InitDatabase() @@ -285,76 +285,76 @@ public void InitDatabase() var optionsBuilder = new DbContextOptionsBuilder().UseInMemoryDatabase( Guid.NewGuid().ToString()); DbContext ContextBuilder() => new NosCoreContext(optionsBuilder.Options); - CharacterRelationDao = new Dao(_logger, ContextBuilder); - AccountDao = new Dao(_logger, ContextBuilder); - MateDao = new Dao(_logger, ContextBuilder); - _portalDao = new Dao(_logger, ContextBuilder); - _mapMonsterDao = new Dao(_logger, ContextBuilder); - _mapNpcDao = new Dao(_logger, ContextBuilder); - MinilandDao = new Dao(_logger, ContextBuilder); - MinilandObjectDao = new Dao(_logger, ContextBuilder); - _shopItemDao = new Dao(_logger, ContextBuilder); - CharacterDao = new Dao(_logger, ContextBuilder); - _itemInstanceDao = new Dao(_logger, ContextBuilder); - _inventoryItemInstanceDao = new Dao(_logger, ContextBuilder); - _staticBonusDao = new Dao(_logger, ContextBuilder); + CharacterRelationDao = new Dao(Logger, ContextBuilder); + AccountDao = new Dao(Logger, ContextBuilder); + MateDao = new Dao(Logger, ContextBuilder); + PortalDao = new Dao(Logger, ContextBuilder); + MapMonsterDao = new Dao(Logger, ContextBuilder); + MapNpcDao = new Dao(Logger, ContextBuilder); + MinilandDao = new Dao(Logger, ContextBuilder); + MinilandObjectDao = new Dao(Logger, ContextBuilder); + ShopItemDao = new Dao(Logger, ContextBuilder); + CharacterDao = new Dao(Logger, ContextBuilder); + ItemInstanceDao = new Dao(Logger, ContextBuilder); + InventoryItemInstanceDao = new Dao(Logger, ContextBuilder); + StaticBonusDao = new Dao(Logger, ContextBuilder); TypeAdapterConfig.GlobalSettings.AllowImplicitSourceInheritance = false; TypeAdapterConfig.GlobalSettings.ForDestinationType().Ignore(s => s.ValidationResult); TypeAdapterConfig.NewConfig() - .ConstructUsing(src => new GameObject.ComponentEntities.Entities.MapNpc(GenerateItemProvider(), _logger, Instance.DistanceCalculator, Instance.Clock)); + .ConstructUsing(src => new GameObject.ComponentEntities.Entities.MapNpc(GenerateItemProvider(), Logger, Instance.DistanceCalculator, Instance.Clock)); TypeAdapterConfig.NewConfig() - .ConstructUsing(src => new GameObject.ComponentEntities.Entities.MapMonster(_logger, Instance.DistanceCalculator, Instance.Clock, new Mock().Object)); + .ConstructUsing(src => new GameObject.ComponentEntities.Entities.MapMonster(Logger, Instance.DistanceCalculator, Instance.Clock, new Mock().Object)); } public async Task GenerateSessionAsync(List? packetHandlers = null) { - _lastId++; + LastId++; var acc = new AccountDto - { AccountId = _lastId, Name = "AccountTest" + _lastId, Password = new Sha512Hasher().Hash("test") }; + { AccountId = LastId, Name = "AccountTest" + LastId, Password = new Sha512Hasher().Hash("test") }; acc = await AccountDao.TryInsertOrUpdateAsync(acc); var sessionRefHolder = new SessionRefHolder(); var handlers = packetHandlers ?? new List { new CharNewPacketHandler(CharacterDao, MinilandDao, new Mock().Object, new Mock>().Object, new Mock>().Object, new Mock>().Object, new HpService(), new MpService(), WorldConfiguration, new Mock>().Object), - new BlInsPackettHandler(BlacklistHttpClient.Object, _logger, Instance.LogLanguageLocalizer), + new BlInsPackettHandler(BlacklistHttpClient.Object, Logger, Instance.LogLanguageLocalizer), new UseItemPacketHandler(), new FinsPacketHandler(FriendHttpClient.Object, ChannelHttpClient.Object, TestHelpers.Instance.PubSubHub.Object, Instance.SessionRegistry), - new SelectPacketHandler(CharacterDao, _logger, new Mock().Object, MapInstanceAccessorService, - _itemInstanceDao, _inventoryItemInstanceDao, _staticBonusDao, new Mock>().Object, new Mock>().Object, new Mock>().Object, + new SelectPacketHandler(CharacterDao, Logger, new Mock().Object, MapInstanceAccessorService, + ItemInstanceDao, InventoryItemInstanceDao, StaticBonusDao, new Mock>().Object, new Mock>().Object, new Mock>().Object, new Mock>().Object, new List(), new List(),WorldConfiguration, Instance.LogLanguageLocalizer, Instance.PubSubHub.Object), new CSkillPacketHandler(Instance.Clock), - new CBuyPacketHandler(new Mock().Object, new Mock().Object, _logger, _itemInstanceDao, Instance.LogLanguageLocalizer), - new CRegPacketHandler(WorldConfiguration, new Mock().Object, _itemInstanceDao, _inventoryItemInstanceDao), - new CScalcPacketHandler(WorldConfiguration, new Mock().Object, new Mock().Object, _logger, _itemInstanceDao, Instance.LogLanguageLocalizer) + new CBuyPacketHandler(new Mock().Object, new Mock().Object, Logger, ItemInstanceDao, Instance.LogLanguageLocalizer), + new CRegPacketHandler(WorldConfiguration, new Mock().Object, ItemInstanceDao, InventoryItemInstanceDao), + new CScalcPacketHandler(WorldConfiguration, new Mock().Object, new Mock().Object, Logger, ItemInstanceDao, Instance.LogLanguageLocalizer) }; var packetHandlerRegistry = new NosCore.GameObject.Services.PacketHandlerService.PacketHandlerRegistry(handlers); var characterInitializationService = new Mock(); characterInitializationService.Setup(s => s.InitializeAsync(It.IsAny())).Returns(Task.CompletedTask); var session = new ClientSession( - _logger, + Logger, packetHandlerRegistry, new Mock>().Object, Instance.LogLanguageLocalizer, TestHelpers.Instance.PubSubHub.Object, new Mock().Object, - new WorldPacketHandlingStrategy(_logger, Instance.LogLanguageLocalizer, sessionRefHolder), + new WorldPacketHandlingStrategy(Logger, Instance.LogLanguageLocalizer, sessionRefHolder), new List(), Instance.SessionRegistry, characterInitializationService.Object, Instance.GameLanguageLocalizer) { - SessionId = _lastId + SessionId = LastId }; - var chara = new GameObject.ComponentEntities.Entities.Character(new InventoryService(ItemList, WorldConfiguration, _logger), - new ExchangeService(new Mock().Object, WorldConfiguration, _logger, new ExchangeRequestRegistry(), Instance.LogLanguageLocalizer, Instance.GameLanguageLocalizer), new Mock().Object, new HpService(), new MpService(), new ExperienceService(), new JobExperienceService(), + var chara = new GameObject.ComponentEntities.Entities.Character(new InventoryService(ItemList, WorldConfiguration, Logger), + new ExchangeService(new Mock().Object, WorldConfiguration, Logger, new ExchangeRequestRegistry(), Instance.LogLanguageLocalizer, Instance.GameLanguageLocalizer), new Mock().Object, new HpService(), new MpService(), new ExperienceService(), new JobExperienceService(), new HeroExperienceService(), new ReputationService(), new DignityService(), Instance.WorldConfiguration, new Mock().Object, Instance.SessionGroupFactory, Instance.SessionRegistry, Instance.GameLanguageLocalizer) { - CharacterId = _lastId, - Name = "TestExistingCharacter" + _lastId, + CharacterId = LastId, + Name = "TestExistingCharacter" + LastId, Slot = 1, AccountId = acc.AccountId, MapId = 1, @@ -378,7 +378,7 @@ public async Task GenerateSessionAsync(List? pack public static async Task ResetAsync() { - _lazy = new Lazy(() => new TestHelpers()); + Lazy = new Lazy(() => new TestHelpers()); Instance.InitDatabase(); await Instance.GenerateMapInstanceProviderAsync(); } diff --git a/test/NosCore.WebApi.Tests/ApiTests/AuthControllerTests.cs b/test/NosCore.WebApi.Tests/ApiTests/AuthControllerTests.cs index a04de058e..d02f301dc 100644 --- a/test/NosCore.WebApi.Tests/ApiTests/AuthControllerTests.cs +++ b/test/NosCore.WebApi.Tests/ApiTests/AuthControllerTests.cs @@ -2,18 +2,18 @@ // | \| |/__\ /' _/ / _//__\| _ \ __| // | | ' | \/ |`._`.| \_| \/ | v / _| // |_|\__|\__/ |___/ \__/\__/|_|_\___| -// +// // Copyright (C) 2019 - NosCore -// +// // NosCore is a free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . @@ -37,6 +37,7 @@ using NosCore.Shared.Configuration; using NosCore.Tests.Shared; using NosCore.WebApi.Controllers; +using SpecLight; using TwoFactorAuthNet; namespace NosCore.WebApi.Tests.ApiTests @@ -44,133 +45,217 @@ namespace NosCore.WebApi.Tests.ApiTests [TestClass] public class AuthControllerTests { - private readonly string _tokenGuid = Guid.NewGuid().ToString(); - private AuthController _controller = null!; - private ClientSession _session = null!; - private Mock> _logger = null!; - private IAuthCodeService _authCodeService = null!; + private readonly string TokenGuid = Guid.NewGuid().ToString(); + private AuthController Controller = null!; + private ClientSession Session = null!; + private Mock> Logger = null!; + private IAuthCodeService AuthCodeService = null!; + private IActionResult? Result; [TestInitialize] public async Task Setup() { - _authCodeService = new AuthCodeService(); + AuthCodeService = new AuthCodeService(); await TestHelpers.ResetAsync(); - _session = await TestHelpers.Instance.GenerateSessionAsync(); - _logger = new Mock>(); - _controller = new AuthController(Options.Create(new WebApiConfiguration() + Session = await TestHelpers.Instance.GenerateSessionAsync(); + Logger = new Mock>(); + Controller = new AuthController(Options.Create(new WebApiConfiguration() { Password = "123" - }), TestHelpers.Instance.AccountDao, _logger.Object, new Sha512Hasher(), TestHelpers.Instance.LogLanguageLocalizer, - new AuthHub(_authCodeService), _authCodeService); + }), TestHelpers.Instance.AccountDao, Logger.Object, new Sha512Hasher(), TestHelpers.Instance.LogLanguageLocalizer, + new AuthHub(AuthCodeService), AuthCodeService); } [TestMethod] - public async Task ConnectUser() + public async Task ConnectUserShouldLogSuccess() { - await _controller.ConnectUserAsync(new ApiSession + await new Spec("Connect user should log success") + .WhenAsync(UserConnectsWithValidCredentials) + .Then(SuccessShouldBeLogged) + .ExecuteAsync(); + } + + private async Task UserConnectsWithValidCredentials() + { + await Controller.ConnectUserAsync(new ApiSession { - Identity = _session.Account.Name, + Identity = Session.Account.Name, GfLang = "EN", Password = "test", Locale = "en-GB" }); - _logger.Verify( + } + + private void SuccessShouldBeLogged() + { + Logger.Verify( x => x.Log( LogLevel.Information, It.IsAny(), - It.Is((o, t) => string.Equals(string.Format(TestHelpers.Instance.LogLanguageLocalizer[LogLanguageKey.AUTH_API_SUCCESS], _session.Account.Name, It.IsAny(), "en-GB"), o.ToString(), StringComparison.InvariantCultureIgnoreCase)), + It.Is((o, t) => string.Equals(string.Format(TestHelpers.Instance.LogLanguageLocalizer[LogLanguageKey.AUTH_API_SUCCESS], Session.Account.Name, It.IsAny(), "en-GB"), o.ToString(), StringComparison.InvariantCultureIgnoreCase)), It.IsAny(), It.IsAny>()), Times.Once); } [TestMethod] - public async Task ConnectUserInvalidPassword() + public async Task ConnectUserWithInvalidPasswordShouldFail() { - var result = await _controller.ConnectUserAsync(new ApiSession + await new Spec("Connect user with invalid password should fail") + .WhenAsync(UserConnectsWithInvalidPassword) + .Then(ShouldReturnAuthIncorrectError) + .ExecuteAsync(); + } + + private async Task UserConnectsWithInvalidPassword() + { + Result = await Controller.ConnectUserAsync(new ApiSession { - Identity = _session.Account.Name, + Identity = Session.Account.Name, GfLang = "EN", Password = "test2" }); - Assert.AreEqual(JsonSerializer.Serialize(new BadRequestObjectResult(TestHelpers.Instance.LogLanguageLocalizer[LogLanguageKey.AUTH_INCORRECT])), JsonSerializer.Serialize((BadRequestObjectResult)result)); + } + + private void ShouldReturnAuthIncorrectError() + { + Assert.AreEqual(JsonSerializer.Serialize(new BadRequestObjectResult(TestHelpers.Instance.LogLanguageLocalizer[LogLanguageKey.AUTH_INCORRECT])), JsonSerializer.Serialize((BadRequestObjectResult)Result!)); } [TestMethod] - public async Task ConnectUserAsyncWhenInvalidAccount() + public async Task ConnectUserWithInvalidAccountShouldFail() { - var result = await _controller.ConnectUserAsync(new ApiSession + await new Spec("Connect user with invalid account should fail") + .WhenAsync(UserConnectsWithInvalidAccount) + .Then(ShouldReturnAuthError) + .ExecuteAsync(); + } + + private async Task UserConnectsWithInvalidAccount() + { + Result = await Controller.ConnectUserAsync(new ApiSession { - Identity = _session.Account.Name + "abc" + Identity = Session.Account.Name + "abc" }); - Assert.AreEqual(JsonSerializer.Serialize(new BadRequestObjectResult(TestHelpers.Instance.LogLanguageLocalizer[LogLanguageKey.AUTH_ERROR])), JsonSerializer.Serialize((BadRequestObjectResult)result)); + } + + private void ShouldReturnAuthError() + { + Assert.AreEqual(JsonSerializer.Serialize(new BadRequestObjectResult(TestHelpers.Instance.LogLanguageLocalizer[LogLanguageKey.AUTH_ERROR])), JsonSerializer.Serialize((BadRequestObjectResult)Result!)); } [TestMethod] - public async Task ConnectUserAsyncWhenInvalidMfa() + public async Task ConnectUserWithInvalidMfaShouldFail() { - var tfa = new TwoFactorAuth(); - _session.Account.MfaSecret = tfa.CreateSecret(); - await TestHelpers.Instance.AccountDao.TryInsertOrUpdateAsync(_session.Account); + await new Spec("Connect user with invalid MFA should fail") + .GivenAsync(UserHasMfaEnabled) + .WhenAsync(UserConnectsWithInvalidMfaCode) + .Then(ShouldReturnMfaIncorrectError) + .ExecuteAsync(); + } + + private TwoFactorAuth? Tfa; + + private async Task UserHasMfaEnabled() + { + Tfa = new TwoFactorAuth(); + Session.Account.MfaSecret = Tfa.CreateSecret(); + await TestHelpers.Instance.AccountDao.TryInsertOrUpdateAsync(Session.Account); + } - var result = await _controller.ConnectUserAsync(new ApiSession + private async Task UserConnectsWithInvalidMfaCode() + { + Result = await Controller.ConnectUserAsync(new ApiSession { - Identity = _session.Account.Name, - Mfa = tfa.GetCode(string.Concat(_session.Account.MfaSecret.Reverse())), + Identity = Session.Account.Name, + Mfa = Tfa!.GetCode(string.Concat(Session.Account.MfaSecret!.Reverse())), }); + } - Assert.AreEqual(JsonSerializer.Serialize(new BadRequestObjectResult(TestHelpers.Instance.LogLanguageLocalizer[LogLanguageKey.MFA_INCORRECT])), JsonSerializer.Serialize((BadRequestObjectResult)result)); + private void ShouldReturnMfaIncorrectError() + { + Assert.AreEqual(JsonSerializer.Serialize(new BadRequestObjectResult(TestHelpers.Instance.LogLanguageLocalizer[LogLanguageKey.MFA_INCORRECT])), JsonSerializer.Serialize((BadRequestObjectResult)Result!)); } [TestMethod] - public async Task ConnectUserAsyncWhenNoMfa() + public async Task ConnectUserWithoutMfaShouldSucceed() + { + await new Spec("Connect user without MFA should succeed") + .WhenAsync(UserConnectsWithoutMfa) + .Then(ShouldNotReturnMfaIncorrectError) + .ExecuteAsync(); + } + + private async Task UserConnectsWithoutMfa() { - var result = await _controller.ConnectUserAsync(new ApiSession + Result = await Controller.ConnectUserAsync(new ApiSession { - Identity = _session.Account.Name + Identity = Session.Account.Name }); + } - Assert.AreNotEqual(JsonSerializer.Serialize(new BadRequestObjectResult(TestHelpers.Instance.LogLanguageLocalizer[LogLanguageKey.MFA_INCORRECT])), JsonSerializer.Serialize((BadRequestObjectResult)result)); + private void ShouldNotReturnMfaIncorrectError() + { + Assert.AreNotEqual(JsonSerializer.Serialize(new BadRequestObjectResult(TestHelpers.Instance.LogLanguageLocalizer[LogLanguageKey.MFA_INCORRECT])), JsonSerializer.Serialize((BadRequestObjectResult)Result!)); } [TestMethod] - public async Task ConnectUserAsyncWhenValidMfa() + public async Task ConnectUserWithValidMfaShouldSucceed() { - var tfa = new TwoFactorAuth(); - _session.Account.MfaSecret = tfa.CreateSecret(); - await TestHelpers.Instance.AccountDao.TryInsertOrUpdateAsync(_session.Account); + await new Spec("Connect user with valid MFA should succeed") + .GivenAsync(UserHasMfaEnabled) + .WhenAsync(UserConnectsWithValidMfaCode) + .Then(ShouldNotReturnMfaIncorrectError) + .ExecuteAsync(); + } - var result = await _controller.ConnectUserAsync(new ApiSession + private async Task UserConnectsWithValidMfaCode() + { + Result = await Controller.ConnectUserAsync(new ApiSession { - Identity = _session.Account.Name, - Mfa = tfa.GetCode(_session.Account.MfaSecret), + Identity = Session.Account.Name, + Mfa = Tfa!.GetCode(Session.Account.MfaSecret!), }); - - Assert.AreNotEqual(JsonSerializer.Serialize(new BadRequestObjectResult(TestHelpers.Instance.LogLanguageLocalizer[LogLanguageKey.MFA_INCORRECT])), JsonSerializer.Serialize((BadRequestObjectResult)result)); } [TestMethod] - public void GetAuthCodeGenerateAuthCodeWhenValidIdentity() + public void GetAuthCodeShouldGenerateCodeWhenValidIdentity() + { + new Spec("Get auth code should generate code when valid identity") + .Given(ControllerHasValidIdentity) + .When(GettingAuthCode) + .Then(ShouldReturnValidGuid) + .Execute(); + } + + private void ControllerHasValidIdentity() { var claims = new List() { new(ClaimTypes.Sid, "123"), - new(ClaimTypes.NameIdentifier, _session.Account.Name), + new(ClaimTypes.NameIdentifier, Session.Account.Name), }; var identity = new ClaimsIdentity(claims, "TestAuthType"); - _controller.ControllerContext = new ControllerContext + Controller.ControllerContext = new ControllerContext { HttpContext = new DefaultHttpContext { User = new ClaimsPrincipal(identity) } }; + } - var result = _controller.GetAuthCode(new ApiPlatformGameAccount + private void GettingAuthCode() + { + Result = Controller.GetAuthCode(new ApiPlatformGameAccount { PlatformGameAccountId = "123" }); - var okResult = (OkObjectResult)result; + } + + private void ShouldReturnValidGuid() + { + var okResult = (OkObjectResult)Result!; Assert.IsNotNull(okResult.Value); var codeProperty = okResult.Value.GetType().GetProperty("code"); Assert.IsNotNull(codeProperty); @@ -179,98 +264,196 @@ public void GetAuthCodeGenerateAuthCodeWhenValidIdentity() } [TestMethod] - public void GetAuthCodeDoesNotGenerateAuthCodeWhenInvalidIdentity() + public void GetAuthCodeShouldFailWhenInvalidIdentity() + { + new Spec("Get auth code should fail when invalid identity") + .Given(ControllerHasInvalidIdentity) + .When(GettingAuthCode) + .Then(ShouldReturnAuthIncorrectError) + .Execute(); + } + + private void ControllerHasInvalidIdentity() { var claims = new List() { new(ClaimTypes.Sid, "124"), - new(ClaimTypes.NameIdentifier, _session.Account.Name), + new(ClaimTypes.NameIdentifier, Session.Account.Name), }; var identity = new ClaimsIdentity(claims, "TestAuthType"); - - _controller.ControllerContext = new ControllerContext + Controller.ControllerContext = new ControllerContext { HttpContext = new DefaultHttpContext { User = new ClaimsPrincipal(identity) } }; + } - var result = _controller.GetAuthCode(new ApiPlatformGameAccount - { - PlatformGameAccountId = "123" - }); - Assert.AreEqual(JsonSerializer.Serialize(new BadRequestObjectResult(TestHelpers.Instance.LogLanguageLocalizer[LogLanguageKey.AUTH_INCORRECT])), JsonSerializer.Serialize(((BadRequestObjectResult)result))); + [TestMethod] + public async Task GetExpectingConnectionShouldReturnNullWhenTokenNull() + { + await new Spec("Get expecting connection should return null when token null") + .WhenAsync(GettingExpectingConnectionWithNullToken) + .Then(ShouldReturnNull) + .ExecuteAsync(); + } + + private async Task GettingExpectingConnectionWithNullToken() + { + Result = await Controller.GetExpectingConnection(Session.Account.Name, null, 1); + } + + private void ShouldReturnNull() + { + Assert.AreEqual(null, ((OkObjectResult)Result!).Value); } [TestMethod] - public async Task GetExpectingConnectionReturnNullWhenTokenNull() + public async Task GetExpectingConnectionShouldReturnNullWhenNoAuthCode() + { + await new Spec("Get expecting connection should return null when no auth code") + .WhenAsync(GettingExpectingConnectionWithInvalidAuthCode) + .Then(ShouldReturnNull) + .ExecuteAsync(); + } + + private async Task GettingExpectingConnectionWithInvalidAuthCode() { - var result = await _controller.GetExpectingConnection(_session.Account.Name, null, 1); - Assert.AreEqual(null, ((OkObjectResult)result).Value); + Result = await Controller.GetExpectingConnection(Session.Account.Name, "A1A2A3", 1); } [TestMethod] - public async Task GetExpectingConnectionReturnNullWhenNotAuthCode() + public async Task GetExpectingConnectionShouldReturnAccountNameWhenAuthCode() + { + await new Spec("Get expecting connection should return account name when auth code") + .Given(AuthCodeIsStored) + .WhenAsync(GettingExpectingConnectionWithValidAuthCode) + .Then(ShouldReturnAccountName) + .ExecuteAsync(); + } + + private void AuthCodeIsStored() + { + AuthCodeService.StoreAuthCode(TokenGuid, Session.Account.Name); + } + + private async Task GettingExpectingConnectionWithValidAuthCode() + { + Result = await Controller.GetExpectingConnection(Session.Account.Name, string.Join("", TokenGuid.ToCharArray().Select(s => Convert.ToByte(s).ToString("x"))), 1); + } + + private void ShouldReturnAccountName() { - var result = await _controller.GetExpectingConnection(_session.Account.Name, "A1A2A3", 1); - Assert.AreEqual(null, ((OkObjectResult)result).Value); + Assert.AreEqual(Session.Account.Name, ((OkObjectResult)Result!).Value); } [TestMethod] - public async Task GetExpectingConnectionReturnAccountNameWhenAuthCode() + public async Task GetExpectingConnectionShouldReturnNullWhenNoneSessionTicket() + { + await new Spec("Get expecting connection should return null when none session ticket") + .WhenAsync(GettingExpectingConnectionWithNoneSessionTicket) + .Then(ShouldReturnNull) + .ExecuteAsync(); + } + + private async Task GettingExpectingConnectionWithNoneSessionTicket() { - _authCodeService.StoreAuthCode(_tokenGuid, _session.Account.Name); - var result = await _controller.GetExpectingConnection(_session.Account.Name, string.Join("", _tokenGuid.ToCharArray().Select(s => Convert.ToByte(s).ToString("x"))), 1); - Assert.AreEqual(_session.Account.Name, ((OkObjectResult)result).Value); + Result = await Controller.GetExpectingConnection(Session.Account.Name, "NONE_SESSION_TICKET", 1); } [TestMethod] - public async Task GetExpectingConnectionReturnNullWhenTokenNoneSessionTicket() + public async Task GetExpectingConnectionShouldReturnTrueWhenGfModeAndExpecting() + { + await new Spec("Get expecting connection should return true when gf mode and expecting") + .Given(UserIsMarkedReadyForAuth) + .WhenAsync(GettingExpectingConnectionInGfMode) + .Then(ShouldReturnTrue) + .ExecuteAsync(); + } + + private void UserIsMarkedReadyForAuth() + { + AuthCodeService.MarkReadyForAuth(Session.Account.Name, 1); + } + + private async Task GettingExpectingConnectionInGfMode() + { + Result = await Controller.GetExpectingConnection(Session.Account.Name, "thisisgfmode", 1); + } + + private void ShouldReturnTrue() { - var result = await _controller.GetExpectingConnection(_session.Account.Name, "NONE_SESSION_TICKET", 1); - Assert.AreEqual(null, ((OkObjectResult)result).Value); + Assert.AreEqual("true", ((OkObjectResult)Result!).Value); } [TestMethod] - public async Task GetExpectingConnectionReturnTrueWhenGfModeAndExpecting() + public async Task GetExpectingConnectionShouldReturnFalseWhenGfModeButWrongSessionId() + { + await new Spec("Get expecting connection should return false when gf mode but wrong session id") + .Given(UserIsMarkedReadyForAuth) + .WhenAsync(GettingExpectingConnectionInGfModeWithWrongSession) + .Then(ShouldReturnFalse) + .ExecuteAsync(); + } + + private async Task GettingExpectingConnectionInGfModeWithWrongSession() + { + Result = await Controller.GetExpectingConnection(Session.Account.Name, "thisisgfmode", 2); + } + + private void ShouldReturnFalse() { - _authCodeService.MarkReadyForAuth(_session.Account.Name, 1); - var result = await _controller.GetExpectingConnection(_session.Account.Name, "thisisgfmode", 1); - Assert.AreEqual("true", ((OkObjectResult)result).Value); + Assert.AreEqual("false", ((OkObjectResult)Result!).Value); } [TestMethod] - public async Task GetExpectingConnectionReturnTrueWhenGfModeAndExpectingButWrongSessionId() + public async Task GetExpectingConnectionShouldReturnFalseWhenGfModeAndNotExpecting() { - _authCodeService.MarkReadyForAuth(_session.Account.Name, 1); - var result = await _controller.GetExpectingConnection(_session.Account.Name, "thisisgfmode", 2); - Assert.AreEqual("false", ((OkObjectResult)result).Value); + await new Spec("Get expecting connection should return false when gf mode and not expecting") + .WhenAsync(GettingExpectingConnectionInGfMode) + .Then(ShouldReturnFalse) + .ExecuteAsync(); } [TestMethod] - public async Task GetExpectingConnectionReturnFalseWhenGfModeAndNotExpecting() + public async Task HasMfaEnabledShouldReturnTrueWhenMfaSecretExists() + { + await new Spec("Has MFA enabled should return true when MFA secret exists") + .GivenAsync(UserHasMfaSecret) + .WhenAsync(CheckingIfMfaEnabled) + .Then(ShouldReturnTrueValue) + .ExecuteAsync(); + } + + private async Task UserHasMfaSecret() { - var result = await _controller.GetExpectingConnection(_session.Account.Name, "thisisgfmode", 1); - Assert.AreEqual("false", ((OkObjectResult)result).Value); + Session.Account.MfaSecret = "12345"; + await TestHelpers.Instance.AccountDao.TryInsertOrUpdateAsync(Session.Account); } + private async Task CheckingIfMfaEnabled() + { + Result = await Controller.HasMfaEnabled(Session.Account.Name); + } - [TestMethod] - public async Task HasMfaEnabledReturnTrueWhenTokenNotNull() + private void ShouldReturnTrueValue() { - _session.Account.MfaSecret = "12345"; - await TestHelpers.Instance.AccountDao.TryInsertOrUpdateAsync(_session.Account); - var result = await _controller.HasMfaEnabled(_session.Account.Name); - Assert.AreEqual(true, ((OkObjectResult)result).Value); + Assert.AreEqual(true, ((OkObjectResult)Result!).Value); } [TestMethod] - public async Task HasMfaEnabledReturnFalseWhenTokenNull() + public async Task HasMfaEnabledShouldReturnFalseWhenNoMfaSecret() { - var result = await _controller.HasMfaEnabled(_session.Account.Name); - Assert.AreEqual(false, ((OkObjectResult)result).Value); + await new Spec("Has MFA enabled should return false when no MFA secret") + .WhenAsync(CheckingIfMfaEnabled) + .Then(ShouldReturnFalseValue) + .ExecuteAsync(); } + private void ShouldReturnFalseValue() + { + Assert.AreEqual(false, ((OkObjectResult)Result!).Value); + } } }