diff --git a/com.unity.ml-agents/Runtime/Policies/HeuristicPolicy.cs b/com.unity.ml-agents/Runtime/Policies/HeuristicPolicy.cs index aed52c8e59..ae7273001c 100644 --- a/com.unity.ml-agents/Runtime/Policies/HeuristicPolicy.cs +++ b/com.unity.ml-agents/Runtime/Policies/HeuristicPolicy.cs @@ -60,7 +60,7 @@ public void Dispose() /// Trivial implementation of the IList interface that does nothing. /// This is only used for "writing" observations that we will discard. /// - class NullList : IList + internal class NullList : IList { public IEnumerator GetEnumerator() { diff --git a/com.unity.ml-agents/Tests/Editor/Communicator/GrpcExtensionsTests.cs b/com.unity.ml-agents/Tests/Editor/Communicator/GrpcExtensionsTests.cs index 6fa249ad77..d3767d2783 100644 --- a/com.unity.ml-agents/Tests/Editor/Communicator/GrpcExtensionsTests.cs +++ b/com.unity.ml-agents/Tests/Editor/Communicator/GrpcExtensionsTests.cs @@ -1,4 +1,7 @@ using System; +using System.Text.RegularExpressions; +using Google.Protobuf; +using Google.Protobuf.Collections; using NUnit.Framework; using Unity.MLAgents.Actuators; using Unity.MLAgents.Demonstrations; @@ -7,18 +10,32 @@ using Unity.MLAgents.Analytics; using Unity.MLAgents.CommunicatorObjects; +using UnityEngine; +using UnityEngine.TestTools; namespace Unity.MLAgents.Tests { [TestFixture] public class GrpcExtensionsTests { + [SetUp] + public void SetUp() + { + Academy.Instance.TrainerCapabilities = new UnityRLCapabilities(); + } + [Test] public void TestDefaultBrainParametersToProto() { // Should be able to convert a default instance to proto. var brain = new BrainParameters(); brain.ToProto("foo", false); + Academy.Instance.TrainerCapabilities = new UnityRLCapabilities + { + BaseRLCapabilities = true, + HybridActions = false + }; + brain.ToProto("foo", false); } [Test] @@ -27,14 +44,72 @@ public void TestDefaultActionSpecToProto() // Should be able to convert a default instance to proto. var actionSpec = new ActionSpec(); actionSpec.ToBrainParametersProto("foo", false); + Academy.Instance.TrainerCapabilities = new UnityRLCapabilities + { + BaseRLCapabilities = true, + HybridActions = false + }; + actionSpec.ToBrainParametersProto("foo", false); + Academy.Instance.TrainerCapabilities = new UnityRLCapabilities(); // Continuous actionSpec = ActionSpec.MakeContinuous(3); actionSpec.ToBrainParametersProto("foo", false); + Academy.Instance.TrainerCapabilities = new UnityRLCapabilities + { + BaseRLCapabilities = true, + HybridActions = false + }; + actionSpec.ToBrainParametersProto("foo", false); + + Academy.Instance.TrainerCapabilities = new UnityRLCapabilities(); // Discrete actionSpec = ActionSpec.MakeDiscrete(1, 2, 3); actionSpec.ToBrainParametersProto("foo", false); + Academy.Instance.TrainerCapabilities = new UnityRLCapabilities + { + BaseRLCapabilities = true, + HybridActions = false + }; + actionSpec.ToBrainParametersProto("foo", false); + } + + [Test] + public void ToBrainParameters() + { + // Should be able to convert a default instance to proto. + var actionSpec = new ActionSpec(); + actionSpec.ToBrainParametersProto("foo", false).ToBrainParameters(); + Academy.Instance.TrainerCapabilities = new UnityRLCapabilities + { + BaseRLCapabilities = true, + HybridActions = false + }; + actionSpec.ToBrainParametersProto("foo", false).ToBrainParameters(); + + Academy.Instance.TrainerCapabilities = new UnityRLCapabilities(); + // Continuous + actionSpec = ActionSpec.MakeContinuous(3); + actionSpec.ToBrainParametersProto("foo", false).ToBrainParameters(); + Academy.Instance.TrainerCapabilities = new UnityRLCapabilities + { + BaseRLCapabilities = true, + HybridActions = false + }; + actionSpec.ToBrainParametersProto("foo", false).ToBrainParameters(); + + Academy.Instance.TrainerCapabilities = new UnityRLCapabilities(); + + // Discrete + actionSpec = ActionSpec.MakeDiscrete(1, 2, 3); + actionSpec.ToBrainParametersProto("foo", false).ToBrainParameters(); + Academy.Instance.TrainerCapabilities = new UnityRLCapabilities + { + BaseRLCapabilities = true, + HybridActions = false + }; + actionSpec.ToBrainParametersProto("foo", false).ToBrainParameters(); } [Test] @@ -42,7 +117,31 @@ public void TestDefaultAgentInfoToProto() { // Should be able to convert a default instance to proto. var agentInfo = new AgentInfo(); - agentInfo.ToInfoActionPairProto(); + var pairProto = agentInfo.ToInfoActionPairProto(); + pairProto.AgentInfo.Observations.Add(new ObservationProto + { + CompressedData = ByteString.Empty, + CompressionType = CompressionTypeProto.None, + FloatData = new ObservationProto.Types.FloatData(), + ObservationType = ObservationTypeProto.Default, + Name = "Sensor" + }); + pairProto.AgentInfo.Observations[0].Shape.Add(0); + pairProto.GetObservationSummaries(); + agentInfo.ToAgentInfoProto(); + agentInfo.groupId = 1; + Academy.Instance.TrainerCapabilities = new UnityRLCapabilities + { + BaseRLCapabilities = true, + MultiAgentGroups = false + }; + agentInfo.ToAgentInfoProto(); + LogAssert.Expect(LogType.Warning, new Regex(".+")); + Academy.Instance.TrainerCapabilities = new UnityRLCapabilities + { + BaseRLCapabilities = true, + MultiAgentGroups = true + }; agentInfo.ToAgentInfoProto(); } @@ -151,8 +250,6 @@ public void TestGetObservationProtoCapabilities() Assert.AreEqual(obsProto.CompressedData.Length, 0); } } - - } [Test] diff --git a/com.unity.ml-agents/Tests/Editor/MLAgentsEditModeTest.cs b/com.unity.ml-agents/Tests/Editor/MLAgentsEditModeTest.cs index 7910640acb..fa160c312d 100644 --- a/com.unity.ml-agents/Tests/Editor/MLAgentsEditModeTest.cs +++ b/com.unity.ml-agents/Tests/Editor/MLAgentsEditModeTest.cs @@ -1,4 +1,6 @@ using System; +using System.Collections; +using System.Collections.Generic; using UnityEngine; using NUnit.Framework; using System.Reflection; @@ -11,6 +13,7 @@ namespace Unity.MLAgents.Tests { + [TestFixture] public class EditModeTestGeneration { @@ -536,6 +539,44 @@ public void TestHeuristicPolicyStepsSensors() agent1.GetStoredActionBuffers().ContinuousActions[0] ); } + + [Test] + public void TestNullList() + { + var nullList = new HeuristicPolicy.NullList(); + Assert.Throws(() => + { + _ = ((IEnumerable)nullList).GetEnumerator(); + }); + + Assert.Throws(() => + { + _ = ((IEnumerable)nullList).GetEnumerator(); + }); + + Assert.Throws(() => + { + nullList.CopyTo(new[] { 0f }, 0); + }); + + nullList.Add(0); + Assert.IsTrue(nullList.Count == 0); + + nullList.Clear(); + Assert.IsTrue(nullList.Count == 0); + + nullList.Add(0); + Assert.IsFalse(nullList.Contains(0)); + Assert.IsFalse(nullList.Remove(0)); + Assert.IsFalse(nullList.IsReadOnly); + Assert.IsTrue(nullList.IndexOf(0) == -1); + nullList.Insert(0, 0); + Assert.IsFalse(nullList.Count > 0); + nullList.RemoveAt(0); + Assert.IsTrue(nullList.Count == 0); + Assert.IsTrue(Mathf.Approximately(0f, nullList[0])); + Assert.IsTrue(Mathf.Approximately(0f, nullList[1])); + } } [TestFixture]