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:
Acruid
2020-02-09 02:28:47 -08:00
parent b554d8cc8c
commit d16f433f45
8 changed files with 96 additions and 13 deletions

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;
}

View 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.",
};
}
}
}