using UnityEngine;
using Unity.Netcode.TestHelpers.Runtime;
namespace Unity.Netcode.RuntimeTests
{
///
/// This provides coverage for all of the predefined NetworkVariable types
/// The initial goal is for generalized full coverage of NetworkVariables:
/// Covers all of the various constructor calls (i.e. various parameters or no parameters)
/// Covers the local NetworkVariable's OnValueChanged functionality (i.e. when a specific type changes do we get a notification?)
/// This was built as a NetworkBehaviour for further client-server unit testing patterns when this capability is available.
///
internal class NetworkVariableTestComponent : NetworkBehaviour
{
private NetworkVariable m_NetworkVariableBool = new NetworkVariable();
private NetworkVariable m_NetworkVariableByte = new NetworkVariable();
private NetworkVariable m_NetworkVariableColor = new NetworkVariable();
private NetworkVariable m_NetworkVariableColor32 = new NetworkVariable();
private NetworkVariable m_NetworkVariableDouble = new NetworkVariable();
private NetworkVariable m_NetworkVariableFloat = new NetworkVariable();
private NetworkVariable m_NetworkVariableInt = new NetworkVariable();
private NetworkVariable m_NetworkVariableLong = new NetworkVariable();
private NetworkVariable m_NetworkVariableSByte = new NetworkVariable();
private NetworkVariable m_NetworkVariableQuaternion = new NetworkVariable();
private NetworkVariable m_NetworkVariableShort = new NetworkVariable();
private NetworkVariable m_NetworkVariableVector4 = new NetworkVariable();
private NetworkVariable m_NetworkVariableVector3 = new NetworkVariable();
private NetworkVariable m_NetworkVariableVector2 = new NetworkVariable();
private NetworkVariable m_NetworkVariableRay = new NetworkVariable();
private NetworkVariable m_NetworkVariableULong = new NetworkVariable();
private NetworkVariable m_NetworkVariableUInt = new NetworkVariable();
private NetworkVariable m_NetworkVariableUShort = new NetworkVariable();
public NetworkVariableHelper Bool_Var;
public NetworkVariableHelper Byte_Var;
public NetworkVariableHelper Color_Var;
public NetworkVariableHelper Color32_Var;
public NetworkVariableHelper Double_Var;
public NetworkVariableHelper Float_Var;
public NetworkVariableHelper Int_Var;
public NetworkVariableHelper Long_Var;
public NetworkVariableHelper Sbyte_Var;
public NetworkVariableHelper Quaternion_Var;
public NetworkVariableHelper Short_Var;
public NetworkVariableHelper Vector4_Var;
public NetworkVariableHelper Vector3_Var;
public NetworkVariableHelper Vector2_Var;
public NetworkVariableHelper Ray_Var;
public NetworkVariableHelper Ulong_Var;
public NetworkVariableHelper Uint_Var;
public NetworkVariableHelper Ushort_Var;
public bool EnableTesting;
private bool m_FinishedTests;
private bool m_ChangesAppliedToNetworkVariables;
private float m_WaitForChangesTimeout;
// Start is called before the first frame update
private void InitializeTest()
{
// Generic Constructor Test Coverage
m_NetworkVariableBool = new NetworkVariable();
m_NetworkVariableByte = new NetworkVariable();
m_NetworkVariableColor = new NetworkVariable();
m_NetworkVariableColor32 = new NetworkVariable();
m_NetworkVariableDouble = new NetworkVariable();
m_NetworkVariableFloat = new NetworkVariable();
m_NetworkVariableInt = new NetworkVariable();
m_NetworkVariableLong = new NetworkVariable();
m_NetworkVariableSByte = new NetworkVariable();
m_NetworkVariableQuaternion = new NetworkVariable();
m_NetworkVariableShort = new NetworkVariable();
m_NetworkVariableVector4 = new NetworkVariable();
m_NetworkVariableVector3 = new NetworkVariable();
m_NetworkVariableVector2 = new NetworkVariable();
m_NetworkVariableRay = new NetworkVariable();
m_NetworkVariableULong = new NetworkVariable();
m_NetworkVariableUInt = new NetworkVariable();
m_NetworkVariableUShort = new NetworkVariable();
// NetworkVariable Value Type Constructor Test Coverage
m_NetworkVariableBool = new NetworkVariable(true);
m_NetworkVariableByte = new NetworkVariable((byte)0);
m_NetworkVariableColor = new NetworkVariable(new Color(1, 1, 1, 1));
m_NetworkVariableColor32 = new NetworkVariable(new Color32(1, 1, 1, 1));
m_NetworkVariableDouble = new NetworkVariable(1.0);
m_NetworkVariableFloat = new NetworkVariable(1.0f);
m_NetworkVariableInt = new NetworkVariable(1);
m_NetworkVariableLong = new NetworkVariable(1);
m_NetworkVariableSByte = new NetworkVariable((sbyte)0);
m_NetworkVariableQuaternion = new NetworkVariable(Quaternion.identity);
m_NetworkVariableShort = new NetworkVariable(256);
m_NetworkVariableVector4 = new NetworkVariable(new Vector4(1, 1, 1, 1));
m_NetworkVariableVector3 = new NetworkVariable(new Vector3(1, 1, 1));
m_NetworkVariableVector2 = new NetworkVariable(new Vector2(1, 1));
m_NetworkVariableRay = new NetworkVariable(new Ray());
m_NetworkVariableULong = new NetworkVariable(1);
m_NetworkVariableUInt = new NetworkVariable(1);
m_NetworkVariableUShort = new NetworkVariable(1);
// Use this nifty class: NetworkVariableHelper
// Tracks if NetworkVariable changed invokes the OnValueChanged callback for the given instance type
Bool_Var = new NetworkVariableHelper(m_NetworkVariableBool);
Byte_Var = new NetworkVariableHelper(m_NetworkVariableByte);
Color_Var = new NetworkVariableHelper(m_NetworkVariableColor);
Color32_Var = new NetworkVariableHelper(m_NetworkVariableColor32);
Double_Var = new NetworkVariableHelper(m_NetworkVariableDouble);
Float_Var = new NetworkVariableHelper(m_NetworkVariableFloat);
Int_Var = new NetworkVariableHelper(m_NetworkVariableInt);
Long_Var = new NetworkVariableHelper(m_NetworkVariableLong);
Sbyte_Var = new NetworkVariableHelper(m_NetworkVariableSByte);
Quaternion_Var = new NetworkVariableHelper(m_NetworkVariableQuaternion);
Short_Var = new NetworkVariableHelper(m_NetworkVariableShort);
Vector4_Var = new NetworkVariableHelper(m_NetworkVariableVector4);
Vector3_Var = new NetworkVariableHelper(m_NetworkVariableVector3);
Vector2_Var = new NetworkVariableHelper(m_NetworkVariableVector2);
Ray_Var = new NetworkVariableHelper(m_NetworkVariableRay);
Ulong_Var = new NetworkVariableHelper(m_NetworkVariableULong);
Uint_Var = new NetworkVariableHelper(m_NetworkVariableUInt);
Ushort_Var = new NetworkVariableHelper(m_NetworkVariableUShort);
}
///
/// Test result for all values changed the expected number of times (once per unique NetworkVariable type)
///
public bool DidAllValuesChange()
{
if (NetworkVariableBaseHelper.VarChangedCount == NetworkVariableBaseHelper.InstanceCount)
{
return true;
}
else
{
return false;
}
}
///
/// Returns back whether the test has completed the total number of iterations
///
public bool IsTestComplete()
{
return m_FinishedTests;
}
public void Awake()
{
InitializeTest();
}
// Update is called once per frame
private void Update()
{
if (EnableTesting)
{
//Added timeout functionality for near future changes to NetworkVariables
if (!m_FinishedTests && m_ChangesAppliedToNetworkVariables)
{
//We finish testing if all NetworkVariables changed their value or we timed out waiting for
//all NetworkVariables to change their value
m_FinishedTests = DidAllValuesChange() || (m_WaitForChangesTimeout < Time.realtimeSinceStartup);
}
else
{
if (NetworkManager != null && NetworkManager.IsListening)
{
//Now change all of the values to make sure we are at least testing the local callback
m_NetworkVariableBool.Value = false;
m_NetworkVariableByte.Value = 255;
m_NetworkVariableColor.Value = new Color(100, 100, 100);
m_NetworkVariableColor32.Value = new Color32(100, 100, 100, 100);
m_NetworkVariableDouble.Value = 1000;
m_NetworkVariableFloat.Value = 1000.0f;
m_NetworkVariableInt.Value = 1000;
m_NetworkVariableLong.Value = 100000;
m_NetworkVariableSByte.Value = -127;
m_NetworkVariableQuaternion.Value = new Quaternion(100, 100, 100, 100);
m_NetworkVariableShort.Value = short.MaxValue;
m_NetworkVariableVector4.Value = new Vector4(1000, 1000, 1000, 1000);
m_NetworkVariableVector3.Value = new Vector3(1000, 1000, 1000);
m_NetworkVariableVector2.Value = new Vector2(1000, 1000);
m_NetworkVariableRay.Value = new Ray(Vector3.one, Vector3.right);
m_NetworkVariableULong.Value = ulong.MaxValue;
m_NetworkVariableUInt.Value = uint.MaxValue;
m_NetworkVariableUShort.Value = ushort.MaxValue;
//Set the timeout (i.e. how long we will wait for all NetworkVariables to have registered their changes)
m_WaitForChangesTimeout = Time.realtimeSinceStartup + 0.50f;
m_ChangesAppliedToNetworkVariables = true;
}
}
}
}
}
}