using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using NUnit.Framework;
using Robust.Client;
using Robust.Client.Console;
using Robust.Client.Debugging;
using Robust.Client.GameObjects;
using Robust.Client.GameStates;
using Robust.Client.Graphics;
using Robust.Client.Graphics.ClientEye;
using Robust.Client.Graphics.Clyde;
using Robust.Client.Graphics.Overlays;
using Robust.Client.Input;
using Robust.Client.Interfaces;
using Robust.Client.Interfaces.Debugging;
using Robust.Client.Interfaces.GameObjects;
using Robust.Client.Interfaces.GameStates;
using Robust.Client.Interfaces.Graphics;
using Robust.Client.Interfaces.Graphics.ClientEye;
using Robust.Client.Interfaces.Graphics.Overlays;
using Robust.Client.Interfaces.Input;
using Robust.Client.Interfaces.ResourceManagement;
using Robust.Client.Interfaces.State;
using Robust.Client.Interfaces.UserInterface;
using Robust.Client.Interfaces.Utility;
using Robust.Client.Reflection;
using Robust.Client.ResourceManagement;
using Robust.Client.State;
using Robust.Client.UserInterface;
using Robust.Client.Utility;
using Robust.Client.ViewVariables;
using Robust.Server;
using Robust.Server.Console;
using Robust.Server.GameObjects;
using Robust.Server.GameStates;
using Robust.Server.Interfaces;
using Robust.Server.Interfaces.Console;
using Robust.Server.Interfaces.GameObjects;
using Robust.Server.Interfaces.GameState;
using Robust.Server.Interfaces.Maps;
using Robust.Server.Interfaces.Placement;
using Robust.Server.Interfaces.ServerStatus;
using Robust.Server.Interfaces.Timing;
using Robust.Server.Maps;
using Robust.Server.Placement;
using Robust.Server.Player;
using Robust.Server.Prototypes;
using Robust.Server.Reflection;
using Robust.Server.ServerStatus;
using Robust.Server.Timing;
using Robust.Server.ViewVariables;
using Robust.Shared.Asynchronous;
using Robust.Shared.Configuration;
using Robust.Shared.ContentPack;
using Robust.Shared.Exceptions;
using Robust.Shared.GameObjects;
using Robust.Shared.Interfaces.Configuration;
using Robust.Shared.Interfaces.GameObjects;
using Robust.Shared.Interfaces.Log;
using Robust.Shared.Interfaces.Map;
using Robust.Shared.Interfaces.Network;
using Robust.Shared.Interfaces.Physics;
using Robust.Shared.Interfaces.Reflection;
using Robust.Shared.Interfaces.Resources;
using Robust.Shared.Interfaces.Serialization;
using Robust.Shared.Interfaces.Timers;
using Robust.Shared.Interfaces.Timing;
using Robust.Shared.IoC;
using Robust.Shared.Log;
using Robust.Shared.Map;
using Robust.Shared.Network;
using Robust.Shared.Physics;
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization;
using Robust.Shared.Timers;
using Robust.Shared.Timing;
using Robust.UnitTesting.Client;
using IPlayerManager = Robust.Client.Player.IPlayerManager;
namespace Robust.UnitTesting
{
public enum UnitTestProject
{
Server,
Client
}
public abstract class RobustUnitTest
{
#region Options
// TODO: make this figured out at runtime so we don't have to pass a compiler flag.
#if HEADLESS
public const bool Headless = true;
#else
public const bool Headless = false;
#endif
// These properties are meant to be overriden to disable certain parts
// Like loading resource packs, which isn't always needed.
///
/// Whether the client resource pack should be loaded or not.
///
public virtual bool NeedsResourcePack => false;
///
/// Whether the client config should be loaded or not.
///
public virtual bool NeedsClientConfig => false;
public virtual UnitTestProject Project => UnitTestProject.Server;
#endregion Options
#region Accessors
public IConfigurationManager GetConfigurationManager { get; private set; }
#endregion Accessors
[OneTimeSetUp]
public void BaseSetup()
{
TestFixtureAttribute a = Attribute.GetCustomAttribute(GetType(), typeof(TestFixtureAttribute)) as TestFixtureAttribute;
if (NeedsResourcePack && Headless)
{
// Disable the test automatically.
a.Explicit = true;
return;
}
// Clear state across tests.
IoCManager.InitThread();
IoCManager.Clear();
RegisterIoC();
var Assemblies = new List(4);
switch (Project)
{
case UnitTestProject.Client:
Assemblies.Add(AppDomain.CurrentDomain.GetAssemblyByName("Robust.Client"));
break;
case UnitTestProject.Server:
Assemblies.Add(AppDomain.CurrentDomain.GetAssemblyByName("Robust.Server"));
break;
default:
throw new NotSupportedException($"Unknown testing project: {Project}");
}
Assemblies.Add(AppDomain.CurrentDomain.GetAssemblyByName("Robust.Shared"));
Assemblies.Add(Assembly.GetExecutingAssembly());
IoCManager.Resolve().LoadAssemblies(Assemblies);
if (NeedsClientConfig)
{
//ConfigurationManager setup
GetConfigurationManager = IoCManager.Resolve();
GetConfigurationManager.LoadFromFile(PathHelpers.ExecutableRelativeFile("./client_config.toml"));
}
// Required components for the engine to work
var compFactory = IoCManager.Resolve();
if (!compFactory.AllRegisteredTypes.Contains(typeof(MetaDataComponent)))
{
compFactory.Register();
compFactory.RegisterReference();
}
/*
if (NeedsResourcePack)
{
GetResourceCache = IoCManager.Resolve();
InitializeResources();
}
*/
}
#region Setup
///
/// Registers all the types into the with
///
private void RegisterIoC()
{
// Shared stuff.
IoCManager.Register();
IoCManager.Register();
IoCManager.Register();
IoCManager.Register();
IoCManager.Register();
IoCManager.Register();
IoCManager.Register();
IoCManager.Register();
IoCManager.Register();
IoCManager.Register();
IoCManager.Register();
switch (Project)
{
case UnitTestProject.Client:
IoCManager.Register();
IoCManager.Register();
IoCManager.Register();
IoCManager.Register();
IoCManager.Register();
// Client stuff.
IoCManager.Register();
IoCManager.Register();
IoCManager.Register();
IoCManager.Register();
IoCManager.Register();
IoCManager.Register();
IoCManager.Register();
IoCManager.Register();
IoCManager.Register();
IoCManager.Register();
IoCManager.Register();
IoCManager.Register();
IoCManager.Register();
IoCManager.Register();
IoCManager.Register();
IoCManager.Register();
IoCManager.Register();
//IoCManager.Register();
IoCManager.Register();
IoCManager.Register();
//IoCManager.Register();
IoCManager.Register();
IoCManager.Register();
IoCManager.Register();
IoCManager.Register();
IoCManager.Register();
IoCManager.Register();
IoCManager.Register();
break;
case UnitTestProject.Server:
IoCManager.Register();
IoCManager.Register();
IoCManager.Register();
IoCManager.Register();
IoCManager.Register();
IoCManager.Register();
IoCManager.Register();
IoCManager.Register();
IoCManager.Register();
IoCManager.Register();
IoCManager.Register();
IoCManager.Register();
IoCManager.Register();
IoCManager.Register();
IoCManager.Register();
IoCManager.Register();
IoCManager.Register();
IoCManager.Register();
IoCManager.Register();
IoCManager.Register();
IoCManager.Register();
IoCManager.Register();
IoCManager.Register();
IoCManager.Register();
break;
default:
throw new NotSupportedException($"Unknown testing project: {Project}");
}
OverrideIoC();
IoCManager.BuildGraph();
}
///
/// Called after all IoC registration has been done, but before the graph has been built.
/// This allows one to add new IoC types or overwrite existing ones if needed.
///
protected virtual void OverrideIoC() { }
#endregion Setup
}
}