Adds test to make sure that calling IComponent.HandleComponentState() with null states does not throw an exception.
Fixes state handling code on components to not throw exceptions when called with null components.
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
using System;
|
||||
using System;
|
||||
using Content.Shared.GameObjects.Components;
|
||||
using Robust.Client.Graphics.Drawing;
|
||||
using Robust.Client.UserInterface;
|
||||
@@ -22,7 +22,8 @@ namespace Content.Client.GameObjects.Components
|
||||
|
||||
public override void HandleComponentState(ComponentState curState, ComponentState nextState)
|
||||
{
|
||||
var cast = (HandheldLightComponentState) curState;
|
||||
if (!(curState is HandheldLightComponentState cast))
|
||||
return;
|
||||
|
||||
Charge = cast.Charge;
|
||||
}
|
||||
|
||||
@@ -31,7 +31,8 @@ namespace Content.Client.GameObjects.Components.Mobs
|
||||
{
|
||||
base.HandleComponentState(curState, nextState);
|
||||
|
||||
var state = (CombatModeComponentState) curState;
|
||||
if (!(curState is CombatModeComponentState state))
|
||||
return;
|
||||
|
||||
IsInCombatMode = state.IsInCombatMode;
|
||||
ActiveZone = state.TargetingZone;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using Content.Client.UserInterface;
|
||||
using Content.Client.UserInterface;
|
||||
using Content.Client.Utility;
|
||||
using Content.Shared.GameObjects.Components;
|
||||
using Robust.Client.UserInterface;
|
||||
@@ -22,7 +22,8 @@ namespace Content.Client.GameObjects.Components
|
||||
|
||||
public override void HandleComponentState(ComponentState curState, ComponentState nextState)
|
||||
{
|
||||
var cast = (StackComponentState) curState;
|
||||
if (!(curState is StackComponentState cast))
|
||||
return;
|
||||
|
||||
Count = cast.Count;
|
||||
MaxCount = cast.MaxCount;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using System;
|
||||
using System;
|
||||
using Content.Client.Animations;
|
||||
using Content.Client.UserInterface;
|
||||
using Content.Client.Utility;
|
||||
@@ -99,7 +99,8 @@ namespace Content.Client.GameObjects.Components.Weapons.Ranged
|
||||
|
||||
public override void HandleComponentState(ComponentState curState, ComponentState nextState)
|
||||
{
|
||||
var cast = (BallisticMagazineWeaponComponentState) curState;
|
||||
if (!(curState is BallisticMagazineWeaponComponentState cast))
|
||||
return;
|
||||
|
||||
Chambered = cast.Chambered;
|
||||
MagazineCount = cast.MagazineCount;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using System;
|
||||
using System;
|
||||
using Content.Client.UserInterface;
|
||||
using Content.Client.Utility;
|
||||
using Content.Shared.GameObjects;
|
||||
@@ -26,7 +26,8 @@ namespace Content.Client.GameObjects.Components
|
||||
|
||||
public override void HandleComponentState(ComponentState curState, ComponentState nextState)
|
||||
{
|
||||
var cast = (WelderComponentState) curState;
|
||||
if (!(curState is WelderComponentState cast))
|
||||
return;
|
||||
|
||||
FuelCapacity = cast.FuelCapacity;
|
||||
Fuel = cast.Fuel;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using System;
|
||||
using System;
|
||||
using Robust.Shared.GameObjects;
|
||||
using Robust.Shared.Serialization;
|
||||
using Robust.Shared.ViewVariables;
|
||||
@@ -62,7 +62,8 @@ namespace Content.Shared.GameObjects.Components.Items
|
||||
|
||||
public override void HandleComponentState(ComponentState curState, ComponentState nextState)
|
||||
{
|
||||
var cast = (ItemCooldownComponentState) curState;
|
||||
if (!(curState is ItemCooldownComponentState cast))
|
||||
return;
|
||||
|
||||
CooldownStart = cast.CooldownStart;
|
||||
CooldownEnd = cast.CooldownEnd;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using System;
|
||||
using System;
|
||||
using Content.Shared.Preferences;
|
||||
using Robust.Shared.GameObjects;
|
||||
using Robust.Shared.Serialization;
|
||||
@@ -43,7 +43,9 @@ namespace Content.Shared.GameObjects.Components.Mobs
|
||||
|
||||
public override void HandleComponentState(ComponentState curState, ComponentState nextState)
|
||||
{
|
||||
var cast = (HumanoidAppearanceComponentState) curState;
|
||||
if (!(curState is HumanoidAppearanceComponentState cast))
|
||||
return;
|
||||
|
||||
Appearance = cast.Appearance;
|
||||
Sex = cast.Sex;
|
||||
}
|
||||
|
||||
75
Content.Tests/Shared/Gamestates/ComponentStateNullTest.cs
Normal file
75
Content.Tests/Shared/Gamestates/ComponentStateNullTest.cs
Normal file
@@ -0,0 +1,75 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Reflection;
|
||||
using NUnit.Framework;
|
||||
using Robust.Shared.ContentPack;
|
||||
using Robust.Shared.GameObjects;
|
||||
using Robust.Shared.Interfaces.GameObjects;
|
||||
using Robust.Shared.Interfaces.Reflection;
|
||||
using Robust.Shared.Reflection;
|
||||
|
||||
namespace Content.Tests.Shared.GameStates
|
||||
{
|
||||
[TestFixture]
|
||||
public class ComponentStateNullTest
|
||||
{
|
||||
[Test]
|
||||
public void HandleComponentState_NullStates_NotThrow()
|
||||
{
|
||||
var reflection = ReflectionManagerFactory();
|
||||
var comps = reflection.GetAllChildren<Component>();
|
||||
|
||||
foreach (var compType in comps)
|
||||
{
|
||||
// Any component should be able to be instantiated without DI injection.
|
||||
var compInstance = (IComponent) Activator.CreateInstance(compType);
|
||||
|
||||
// Any component should treat this as a null function.
|
||||
compInstance.HandleComponentState(null, null);
|
||||
}
|
||||
}
|
||||
|
||||
private static IReflectionManager ReflectionManagerFactory()
|
||||
{
|
||||
AppDomain.CurrentDomain.Load("Robust.Client");
|
||||
AppDomain.CurrentDomain.Load("Content.Client");
|
||||
AppDomain.CurrentDomain.Load("Robust.Server");
|
||||
AppDomain.CurrentDomain.Load("Content.Server");
|
||||
AppDomain.CurrentDomain.Load("Robust.Shared");
|
||||
AppDomain.CurrentDomain.Load("Content.Shared");
|
||||
|
||||
var assemblies = new List<Assembly>(7);
|
||||
assemblies.Add(AppDomain.CurrentDomain.GetAssemblyByName("Robust.Client"));
|
||||
assemblies.Add(AppDomain.CurrentDomain.GetAssemblyByName("Content.Client"));
|
||||
assemblies.Add(AppDomain.CurrentDomain.GetAssemblyByName("Robust.Server"));
|
||||
assemblies.Add(AppDomain.CurrentDomain.GetAssemblyByName("Content.Server"));
|
||||
assemblies.Add(AppDomain.CurrentDomain.GetAssemblyByName("Robust.Shared"));
|
||||
assemblies.Add(AppDomain.CurrentDomain.GetAssemblyByName("Content.Shared"));
|
||||
assemblies.Add(Assembly.GetExecutingAssembly());
|
||||
|
||||
var reflection = new FullReflectionManager();
|
||||
|
||||
reflection.LoadAssemblies(assemblies);
|
||||
|
||||
return reflection;
|
||||
}
|
||||
|
||||
private class FullReflectionManager : ReflectionManager
|
||||
{
|
||||
protected override IEnumerable<string> TypePrefixes => Prefixes;
|
||||
|
||||
private static readonly string[] Prefixes = {
|
||||
"",
|
||||
|
||||
"Robust.Client.",
|
||||
"Content.Client.",
|
||||
|
||||
"Robust.Shared.",
|
||||
"Content.Shared.",
|
||||
|
||||
"Robust.Server.",
|
||||
"Content.Server.",
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user