|
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>(); |
|
} |
|
} |
|
} |
|
|