| | using System; |
| | using System.Collections; |
| | using System.Collections.Generic; |
| | using UnityEngine; |
| | using NUnit.Framework; |
| | using System.Reflection; |
| | using Unity.MLAgents.Actuators; |
| | using Unity.MLAgents.Sensors; |
| | using Unity.MLAgents.Sensors.Reflection; |
| | using Unity.MLAgents.Policies; |
| | using Unity.MLAgents.SideChannels; |
| | using Unity.MLAgents.Utils.Tests; |
| |
|
| | namespace Unity.MLAgents.Tests |
| | { |
| | [TestFixture] |
| | public class EditModeTestGeneration |
| | { |
| | [SetUp] |
| | public void SetUp() |
| | { |
| | if (Academy.IsInitialized) |
| | { |
| | Academy.Instance.Dispose(); |
| | } |
| | } |
| |
|
| | [Test] |
| | public void TestAcademy() |
| | { |
| | var aca = Academy.Instance; |
| | Assert.AreNotEqual(null, aca); |
| | Assert.AreEqual(0, aca.EpisodeCount); |
| | Assert.AreEqual(0, aca.StepCount); |
| | Assert.AreEqual(0, aca.TotalStepCount); |
| | } |
| |
|
| | [Test] |
| | public void TestAgent() |
| | { |
| | var agentGo = new GameObject("TestAgent"); |
| | agentGo.AddComponent<TestAgent>(); |
| | var agent = agentGo.GetComponent<TestAgent>(); |
| | Assert.AreNotEqual(null, agent); |
| | Assert.AreEqual(0, agent.initializeAgentCalls); |
| | } |
| | } |
| |
|
| | [TestFixture] |
| | public class EditModeTestInitialization |
| | { |
| | [SetUp] |
| | public void SetUp() |
| | { |
| | if (Academy.IsInitialized) |
| | { |
| | Academy.Instance.Dispose(); |
| | } |
| | } |
| |
|
| | [Test] |
| | public void TestAcademy() |
| | { |
| | Assert.AreEqual(false, Academy.IsInitialized); |
| | var aca = Academy.Instance; |
| | Assert.AreEqual(true, Academy.IsInitialized); |
| |
|
| | |
| | aca.LazyInitialize(); |
| | aca.LazyInitialize(); |
| |
|
| | Assert.AreEqual(0, aca.EpisodeCount); |
| | Assert.AreEqual(0, aca.StepCount); |
| | Assert.AreEqual(0, aca.TotalStepCount); |
| | Assert.AreNotEqual(null, SideChannelManager.GetSideChannel<EnvironmentParametersChannel>()); |
| | Assert.AreNotEqual(null, SideChannelManager.GetSideChannel<EngineConfigurationChannel>()); |
| | Assert.AreNotEqual(null, SideChannelManager.GetSideChannel<StatsSideChannel>()); |
| |
|
| | |
| | aca.Dispose(); |
| | Assert.AreEqual(false, Academy.IsInitialized); |
| | aca.Dispose(); |
| | } |
| |
|
| | [Test] |
| | public void TestAcademyDispose() |
| | { |
| | var envParams1 = SideChannelManager.GetSideChannel<EnvironmentParametersChannel>(); |
| | var engineParams1 = SideChannelManager.GetSideChannel<EngineConfigurationChannel>(); |
| | var statsParams1 = SideChannelManager.GetSideChannel<StatsSideChannel>(); |
| | Academy.Instance.Dispose(); |
| |
|
| | Academy.Instance.LazyInitialize(); |
| | var envParams2 = SideChannelManager.GetSideChannel<EnvironmentParametersChannel>(); |
| | var engineParams2 = SideChannelManager.GetSideChannel<EngineConfigurationChannel>(); |
| | var statsParams2 = SideChannelManager.GetSideChannel<StatsSideChannel>(); |
| | Academy.Instance.Dispose(); |
| |
|
| | Assert.AreNotEqual(envParams1, envParams2); |
| | Assert.AreNotEqual(engineParams1, engineParams2); |
| | Assert.AreNotEqual(statsParams1, statsParams2); |
| | } |
| |
|
| | [Test] |
| | public void TestAgent() |
| | { |
| | var agentGo1 = new GameObject("TestAgent"); |
| | agentGo1.AddComponent<TestAgent>(); |
| | var agent1 = agentGo1.GetComponent<TestAgent>(); |
| | var bp1 = agentGo1.GetComponent<BehaviorParameters>(); |
| | bp1.ObservableAttributeHandling = ObservableAttributeOptions.ExcludeInherited; |
| |
|
| | var agentGo2 = new GameObject("TestAgent"); |
| | agentGo2.AddComponent<TestAgent>(); |
| | var agent2 = agentGo2.GetComponent<TestAgent>(); |
| |
|
| | Assert.AreEqual(0, agent1.agentOnEpisodeBeginCalls); |
| | Assert.AreEqual(0, agent2.agentOnEpisodeBeginCalls); |
| | Assert.AreEqual(0, agent1.initializeAgentCalls); |
| | Assert.AreEqual(0, agent2.initializeAgentCalls); |
| | Assert.AreEqual(0, agent1.agentActionCalls); |
| | Assert.AreEqual(0, agent2.agentActionCalls); |
| |
|
| |
|
| | agent2.LazyInitialize(); |
| | agent1.LazyInitialize(); |
| |
|
| | |
| | |
| | Assert.AreEqual(0, agent1.agentOnEpisodeBeginCalls); |
| | Assert.AreEqual(0, agent2.agentOnEpisodeBeginCalls); |
| | Assert.AreEqual(1, agent1.initializeAgentCalls); |
| | Assert.AreEqual(1, agent2.initializeAgentCalls); |
| | Assert.AreEqual(0, agent1.agentActionCalls); |
| | Assert.AreEqual(0, agent2.agentActionCalls); |
| |
|
| | |
| | Assert.AreEqual(agent1.sensors[0].GetName(), "observableFloat"); |
| | Assert.AreEqual(agent1.sensors[1].GetName(), "testsensor1"); |
| | Assert.AreEqual(agent1.sensors[2].GetName(), "testsensor2"); |
| |
|
| | |
| | Assert.AreEqual(agent2.sensors[0].GetName(), "testsensor1"); |
| | Assert.AreEqual(agent2.sensors[1].GetName(), "testsensor2"); |
| | } |
| | } |
| |
|
| | [TestFixture] |
| | public class EditModeTestStep |
| | { |
| | [SetUp] |
| | public void SetUp() |
| | { |
| | if (Academy.IsInitialized) |
| | { |
| | Academy.Instance.Dispose(); |
| | } |
| | } |
| |
|
| | [Test] |
| | public void TestAcademy() |
| | { |
| | var aca = Academy.Instance; |
| |
|
| | var numberReset = 0; |
| | for (var i = 0; i < 10; i++) |
| | { |
| | Assert.AreEqual(numberReset, aca.EpisodeCount); |
| | Assert.AreEqual(i, aca.StepCount); |
| |
|
| | |
| | if (i == 0) |
| | { |
| | numberReset += 1; |
| | } |
| | Academy.Instance.EnvironmentStep(); |
| | } |
| | } |
| |
|
| | [Test] |
| | public void TestAcademyAutostep() |
| | { |
| | var aca = Academy.Instance; |
| | Assert.IsTrue(aca.AutomaticSteppingEnabled); |
| | aca.AutomaticSteppingEnabled = false; |
| | Assert.IsFalse(aca.AutomaticSteppingEnabled); |
| | aca.AutomaticSteppingEnabled = true; |
| | Assert.IsTrue(aca.AutomaticSteppingEnabled); |
| | } |
| |
|
| | [Test] |
| | public void TestAgent() |
| | { |
| | var agentGo1 = new GameObject("TestAgent"); |
| | var bp1 = agentGo1.AddComponent<BehaviorParameters>(); |
| | bp1.BrainParameters.ActionSpec = ActionSpec.MakeContinuous(1); |
| | agentGo1.AddComponent<TestAgent>(); |
| | var agent1 = agentGo1.GetComponent<TestAgent>(); |
| | var agentGo2 = new GameObject("TestAgent"); |
| | var bp2 = agentGo2.AddComponent<BehaviorParameters>(); |
| | bp2.BrainParameters.ActionSpec = ActionSpec.MakeContinuous(1); |
| | agentGo2.AddComponent<TestAgent>(); |
| | var agent2 = agentGo2.GetComponent<TestAgent>(); |
| |
|
| | var aca = Academy.Instance; |
| |
|
| | var decisionRequester = agent1.gameObject.AddComponent<DecisionRequester>(); |
| | decisionRequester.DecisionPeriod = 2; |
| | decisionRequester.Awake(); |
| | |
| | |
| |
|
| | agent1.LazyInitialize(); |
| |
|
| | var numberAgent1Episodes = 0; |
| | var numberAgent2Episodes = 0; |
| | var numberAgent2Initialization = 0; |
| | var requestDecision = 0; |
| | var requestAction = 0; |
| | for (var i = 0; i < 50; i++) |
| | { |
| | Assert.AreEqual(numberAgent1Episodes, agent1.agentOnEpisodeBeginCalls); |
| | Assert.AreEqual(numberAgent2Episodes, agent2.agentOnEpisodeBeginCalls); |
| | Assert.AreEqual(1, agent1.initializeAgentCalls); |
| | Assert.AreEqual(numberAgent2Initialization, agent2.initializeAgentCalls); |
| | Assert.AreEqual(i, agent1.agentActionCalls); |
| | Assert.AreEqual(requestAction, agent2.agentActionCalls); |
| | Assert.AreEqual((i + 1) / 2, agent1.collectObservationsCalls); |
| | Assert.AreEqual(requestDecision, agent2.collectObservationsCalls); |
| | |
| | if (i == 0) |
| | { |
| | numberAgent1Episodes += 1; |
| | } |
| | |
| | if (i == 2) |
| | { |
| | |
| | Assert.AreEqual(0, agent2.agentOnEpisodeBeginCalls); |
| | agent2.LazyInitialize(); |
| | Assert.AreEqual(1, agent2.agentOnEpisodeBeginCalls); |
| | numberAgent2Initialization += 1; |
| | numberAgent2Episodes += 1; |
| | } |
| |
|
| | |
| | |
| | if ((i % 3 == 0) && (i > 2)) |
| | { |
| | |
| | requestDecision += 1; |
| | requestAction += 1; |
| | agent2.RequestDecision(); |
| | } |
| | else if ((i % 5 == 0) && (i > 2)) |
| | { |
| | |
| | requestAction += 1; |
| | agent2.RequestAction(); |
| | } |
| | aca.EnvironmentStep(); |
| | } |
| | } |
| | } |
| |
|
| | [TestFixture] |
| | public class EditModeTestReset |
| | { |
| | [SetUp] |
| | public void SetUp() |
| | { |
| | if (Academy.IsInitialized) |
| | { |
| | Academy.Instance.Dispose(); |
| | } |
| | } |
| |
|
| | [Test] |
| | public void TestAcademy() |
| | { |
| | var aca = Academy.Instance; |
| |
|
| | var numberReset = 0; |
| | var stepsSinceReset = 0; |
| | for (var i = 0; i < 50; i++) |
| | { |
| | Assert.AreEqual(stepsSinceReset, aca.StepCount); |
| | Assert.AreEqual(numberReset, aca.EpisodeCount); |
| | Assert.AreEqual(i, aca.TotalStepCount); |
| |
|
| | |
| | if (i == 0) |
| | { |
| | numberReset += 1; |
| | } |
| |
|
| | stepsSinceReset += 1; |
| | aca.EnvironmentStep(); |
| | } |
| | } |
| |
|
| | [Test] |
| | public void TestAgent() |
| | { |
| | var agentGo1 = new GameObject("TestAgent"); |
| | var bp1 = agentGo1.AddComponent<BehaviorParameters>(); |
| | bp1.BrainParameters.ActionSpec = ActionSpec.MakeContinuous(1); |
| | agentGo1.AddComponent<TestAgent>(); |
| | var agent1 = agentGo1.GetComponent<TestAgent>(); |
| | var agentGo2 = new GameObject("TestAgent"); |
| | var bp2 = agentGo2.AddComponent<BehaviorParameters>(); |
| | bp2.BrainParameters.ActionSpec = ActionSpec.MakeContinuous(1); |
| | agentGo2.AddComponent<TestAgent>(); |
| | var agent2 = agentGo2.GetComponent<TestAgent>(); |
| |
|
| | var aca = Academy.Instance; |
| |
|
| | var decisionRequester = agent1.gameObject.AddComponent<DecisionRequester>(); |
| | decisionRequester.DecisionPeriod = 2; |
| |
|
| | agent2.LazyInitialize(); |
| |
|
| | var numberAgent1Episodes = 0; |
| | var numberAgent2Episodes = 0; |
| | var numberAcaReset = 0; |
| | var acaStepsSinceReset = 0; |
| | var agent2StepForEpisode = 0; |
| | for (var i = 0; i < 5000; i++) |
| | { |
| | Assert.AreEqual(acaStepsSinceReset, aca.StepCount); |
| | Assert.AreEqual(numberAcaReset, aca.EpisodeCount); |
| |
|
| | Assert.AreEqual(i, aca.TotalStepCount); |
| | Assert.AreEqual(numberAgent2Episodes, agent2.agentOnEpisodeBeginCalls); |
| | Assert.AreEqual(agent2StepForEpisode, agent2.StepCount); |
| |
|
| | |
| | if (i == 0) |
| | { |
| | Assert.AreEqual(numberAgent2Episodes, agent2.agentOnEpisodeBeginCalls); |
| | numberAcaReset += 1; |
| | numberAgent2Episodes += 1; |
| | } |
| |
|
| | |
| | if (i == 2) |
| | { |
| | Assert.AreEqual(numberAgent1Episodes, agent1.agentOnEpisodeBeginCalls); |
| | agent1.LazyInitialize(); |
| | numberAgent1Episodes += 1; |
| | Assert.AreEqual(numberAgent1Episodes, agent1.agentOnEpisodeBeginCalls); |
| | } |
| |
|
| | |
| | if (i % 11 == 5) |
| | { |
| | Assert.AreEqual(numberAgent1Episodes, agent1.agentOnEpisodeBeginCalls); |
| | agent1.EndEpisode(); |
| | numberAgent1Episodes += 1; |
| | Assert.AreEqual(numberAgent1Episodes, agent1.agentOnEpisodeBeginCalls); |
| | } |
| |
|
| | |
| | if (i % 13 == 3) |
| | { |
| | Assert.AreEqual(numberAgent2Episodes, agent2.agentOnEpisodeBeginCalls); |
| | agent2.EndEpisode(); |
| | numberAgent2Episodes += 1; |
| | agent2StepForEpisode = 0; |
| | Assert.AreEqual(numberAgent2Episodes, agent2.agentOnEpisodeBeginCalls); |
| | } |
| |
|
| | |
| | if (i % 3 == 2) |
| | { |
| | agent2.RequestDecision(); |
| | } |
| | else if (i % 5 == 1) |
| | { |
| | |
| | agent2.RequestAction(); |
| | } |
| |
|
| | acaStepsSinceReset += 1; |
| | agent2StepForEpisode += 1; |
| | aca.EnvironmentStep(); |
| | } |
| | } |
| | } |
| |
|
| | [TestFixture] |
| | public class EditModeTestMiscellaneous |
| | { |
| | [SetUp] |
| | public void SetUp() |
| | { |
| | if (Academy.IsInitialized) |
| | { |
| | Academy.Instance.Dispose(); |
| | } |
| | } |
| |
|
| | [Test] |
| | public void TestCumulativeReward() |
| | { |
| | var agentGo1 = new GameObject("TestAgent"); |
| | var bp1 = agentGo1.AddComponent<BehaviorParameters>(); |
| | bp1.BrainParameters.ActionSpec = ActionSpec.MakeContinuous(1); |
| | var agent1 = agentGo1.AddComponent<TestAgent>(); |
| | var agentGo2 = new GameObject("TestAgent"); |
| | var bp2 = agentGo2.AddComponent<BehaviorParameters>(); |
| | bp2.BrainParameters.ActionSpec = ActionSpec.MakeContinuous(1); |
| | var agent2 = agentGo2.AddComponent<TestAgent>(); |
| | var aca = Academy.Instance; |
| |
|
| | var decisionRequester = agent1.gameObject.AddComponent<DecisionRequester>(); |
| | decisionRequester.DecisionPeriod = 2; |
| | decisionRequester.Awake(); |
| |
|
| |
|
| | agent1.MaxStep = 20; |
| |
|
| | agent2.LazyInitialize(); |
| | agent1.LazyInitialize(); |
| | agent2.SetPolicy(new TestPolicy()); |
| |
|
| | var expectedAgent1ActionForEpisode = 0; |
| |
|
| | for (var i = 0; i < 50; i++) |
| | { |
| | expectedAgent1ActionForEpisode += 1; |
| | if (expectedAgent1ActionForEpisode == agent1.MaxStep || i == 0) |
| | { |
| | expectedAgent1ActionForEpisode = 0; |
| | } |
| | agent2.RequestAction(); |
| | Assert.LessOrEqual(Mathf.Abs(expectedAgent1ActionForEpisode * 10.1f - agent1.GetCumulativeReward()), 0.05f); |
| | Assert.LessOrEqual(Mathf.Abs(i * 0.1f - agent2.GetCumulativeReward()), 0.05f); |
| |
|
| | agent1.AddReward(10f); |
| | aca.EnvironmentStep(); |
| | } |
| | } |
| |
|
| | [Test] |
| | public void TestMaxStepsReset() |
| | { |
| | var agentGo1 = new GameObject("TestAgent"); |
| | var bp1 = agentGo1.AddComponent<BehaviorParameters>(); |
| | bp1.BrainParameters.ActionSpec = ActionSpec.MakeContinuous(1); |
| | agentGo1.AddComponent<TestAgent>(); |
| | var agent1 = agentGo1.GetComponent<TestAgent>(); |
| | var aca = Academy.Instance; |
| |
|
| | var decisionRequester = agent1.gameObject.AddComponent<DecisionRequester>(); |
| | decisionRequester.DecisionPeriod = 1; |
| | decisionRequester.Awake(); |
| |
|
| | const int maxStep = 6; |
| | agent1.MaxStep = maxStep; |
| | agent1.LazyInitialize(); |
| |
|
| | var expectedAgentStepCount = 0; |
| | var expectedEpisodes = 0; |
| | var expectedAgentAction = 0; |
| | var expectedAgentActionForEpisode = 0; |
| | var expectedCollectObsCalls = 0; |
| | var expectedCollectObsCallsForEpisode = 0; |
| | var expectedCompletedEpisodes = 0; |
| | var expectedSensorResetCalls = 0; |
| |
|
| | for (var i = 0; i < 15; i++) |
| | { |
| | |
| | expectedAgentAction += 1; |
| | expectedAgentActionForEpisode += 1; |
| | expectedCollectObsCalls += 1; |
| | expectedCollectObsCallsForEpisode += 1; |
| | expectedAgentStepCount += 1; |
| |
|
| | |
| | if (agent1.StepCount == maxStep - 1 || (i == 0)) |
| | { |
| | expectedEpisodes += 1; |
| | } |
| |
|
| | if (agent1.StepCount == maxStep - 1) |
| | { |
| | expectedAgentActionForEpisode = 0; |
| | expectedCollectObsCallsForEpisode = 0; |
| | expectedAgentStepCount = 0; |
| | expectedCompletedEpisodes++; |
| | expectedSensorResetCalls++; |
| | expectedCollectObsCalls += 1; |
| | } |
| | aca.EnvironmentStep(); |
| |
|
| | Assert.AreEqual(expectedAgentStepCount, agent1.StepCount); |
| | Assert.AreEqual(expectedEpisodes, agent1.agentOnEpisodeBeginCalls); |
| | Assert.AreEqual(expectedAgentAction, agent1.agentActionCalls); |
| | Assert.AreEqual(expectedAgentActionForEpisode, agent1.agentActionCallsForEpisode); |
| | Assert.AreEqual(expectedCollectObsCalls, agent1.collectObservationsCalls); |
| | Assert.AreEqual(expectedCollectObsCallsForEpisode, agent1.collectObservationsCallsForEpisode); |
| | Assert.AreEqual(expectedCompletedEpisodes, agent1.CompletedEpisodes); |
| | Assert.AreEqual(expectedSensorResetCalls, agent1.sensor1.numResetCalls); |
| | } |
| | } |
| |
|
| | [Test] |
| | public void TestHeuristicPolicyStepsSensors() |
| | { |
| | |
| | var agentGo1 = new GameObject("TestAgent"); |
| | var bp1 = agentGo1.AddComponent<BehaviorParameters>(); |
| | bp1.BrainParameters.ActionSpec = ActionSpec.MakeContinuous(1); |
| | agentGo1.AddComponent<TestAgent>(); |
| | var agent1 = agentGo1.GetComponent<TestAgent>(); |
| | var aca = Academy.Instance; |
| |
|
| | var decisionRequester = agent1.gameObject.AddComponent<DecisionRequester>(); |
| | decisionRequester.DecisionPeriod = 1; |
| | decisionRequester.Awake(); |
| |
|
| | agent1.LazyInitialize(); |
| | Assert.AreEqual(agent1.GetPolicy().GetType(), typeof(HeuristicPolicy)); |
| |
|
| | var numSteps = 10; |
| | for (var i = 0; i < numSteps; i++) |
| | { |
| | aca.EnvironmentStep(); |
| | } |
| | Assert.AreEqual(numSteps, agent1.heuristicCalls); |
| | Assert.AreEqual(numSteps, agent1.sensor1.numWriteCalls); |
| | Assert.AreEqual(numSteps, agent1.sensor2.numCompressedCalls); |
| |
|
| | Assert.AreEqual( |
| | agent1.collectObservationsCallsForEpisode, |
| | agent1.GetStoredActionBuffers().ContinuousActions[0] |
| | ); |
| | } |
| |
|
| | [Test] |
| | public void TestNullList() |
| | { |
| | var nullList = new HeuristicPolicy.NullList(); |
| | Assert.Throws<NotImplementedException>(() => |
| | { |
| | _ = ((IEnumerable<float>)nullList).GetEnumerator(); |
| | }); |
| |
|
| | Assert.Throws<NotImplementedException>(() => |
| | { |
| | _ = ((IEnumerable)nullList).GetEnumerator(); |
| | }); |
| |
|
| | Assert.Throws<NotImplementedException>(() => |
| | { |
| | 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] |
| | public class TestOnEnableOverride |
| | { |
| | public class OnEnableAgent : Agent |
| | { |
| | public bool callBase; |
| |
|
| | protected override void OnEnable() |
| | { |
| | if (callBase) |
| | base.OnEnable(); |
| | } |
| | } |
| |
|
| | static void _InnerAgentTestOnEnableOverride(bool callBase = false) |
| | { |
| | var go = new GameObject(); |
| | var agent = go.AddComponent<OnEnableAgent>(); |
| | agent.callBase = callBase; |
| | var onEnable = typeof(OnEnableAgent).GetMethod("OnEnable", BindingFlags.NonPublic | BindingFlags.Instance); |
| | var sendInfo = typeof(Agent).GetMethod("SendInfoToBrain", BindingFlags.NonPublic | BindingFlags.Instance); |
| | Assert.NotNull(onEnable); |
| | onEnable.Invoke(agent, null); |
| | Assert.NotNull(sendInfo); |
| | if (agent.callBase) |
| | { |
| | Assert.DoesNotThrow(() => sendInfo.Invoke(agent, null)); |
| | } |
| | else |
| | { |
| | Assert.Throws<UnityAgentsException>(() => |
| | { |
| | try |
| | { |
| | sendInfo.Invoke(agent, null); |
| | } |
| | catch (TargetInvocationException e) |
| | { |
| | throw e.GetBaseException(); |
| | } |
| | }); |
| | } |
| | } |
| |
|
| | [Test] |
| | public void TestAgentCallBaseOnEnable() |
| | { |
| | _InnerAgentTestOnEnableOverride(true); |
| | } |
| |
|
| | [Test] |
| | public void TestAgentDontCallBaseOnEnable() |
| | { |
| | _InnerAgentTestOnEnableOverride(); |
| | } |
| | } |
| |
|
| | [TestFixture] |
| | public class ObservableAttributeBehaviorTests |
| | { |
| | public class BaseObservableAgent : Agent |
| | { |
| | [Observable] |
| | public float BaseField; |
| | } |
| |
|
| | public class DerivedObservableAgent : BaseObservableAgent |
| | { |
| | [Observable] |
| | public float DerivedField; |
| | } |
| |
|
| |
|
| | [Test] |
| | public void TestObservableAttributeBehaviorIgnore() |
| | { |
| | var variants = new[] |
| | { |
| | |
| | (ObservableAttributeOptions.Ignore, 0), |
| | |
| | (ObservableAttributeOptions.ExcludeInherited, 1), |
| | |
| | (ObservableAttributeOptions.ExamineAll, 2) |
| | }; |
| |
|
| | foreach (var (behavior, expectedNumSensors) in variants) |
| | { |
| | var go = new GameObject(); |
| | var agent = go.AddComponent<DerivedObservableAgent>(); |
| | var bp = go.GetComponent<BehaviorParameters>(); |
| | bp.ObservableAttributeHandling = behavior; |
| | agent.LazyInitialize(); |
| | int numAttributeSensors = 0; |
| | foreach (var sensor in agent.sensors) |
| | { |
| | if (sensor.GetType() != typeof(VectorSensor)) |
| | { |
| | numAttributeSensors++; |
| | } |
| | } |
| | Assert.AreEqual(expectedNumSensors, numAttributeSensors); |
| | } |
| | } |
| | } |
| |
|
| | [TestFixture] |
| | public class AgentRecursionTests |
| | { |
| | [SetUp] |
| | public void SetUp() |
| | { |
| | if (Academy.IsInitialized) |
| | { |
| | Academy.Instance.Dispose(); |
| | } |
| | } |
| |
|
| | class CollectObsEndEpisodeAgent : Agent |
| | { |
| | public override void CollectObservations(VectorSensor sensor) |
| | { |
| | |
| | EndEpisode(); |
| | } |
| | } |
| |
|
| | class OnEpisodeBeginEndEpisodeAgent : Agent |
| | { |
| | public override void OnEpisodeBegin() |
| | { |
| | |
| | EndEpisode(); |
| | } |
| | } |
| |
|
| | void TestRecursiveThrows<T>() where T : Agent |
| | { |
| | var gameObj = new GameObject(); |
| | var agent = gameObj.AddComponent<T>(); |
| | agent.LazyInitialize(); |
| | agent.RequestDecision(); |
| |
|
| | Assert.Throws<UnityAgentsException>(() => |
| | { |
| | Academy.Instance.EnvironmentStep(); |
| | }); |
| | } |
| |
|
| | [Test] |
| | public void TestRecursiveCollectObsEndEpisodeThrows() |
| | { |
| | TestRecursiveThrows<CollectObsEndEpisodeAgent>(); |
| | } |
| |
|
| | [Test] |
| | public void TestRecursiveOnEpisodeBeginEndEpisodeThrows() |
| | { |
| | TestRecursiveThrows<OnEpisodeBeginEndEpisodeAgent>(); |
| | } |
| | } |
| | } |
| |
|