ppo-Pyramids-Training / DevProject /Assets /ML-Agents /Scripts /Tests /Editor /MLAgentsSettings /MLAgentsSettingsTests.cs
| using System; | |
| using System.IO; | |
| using System.Linq; | |
| using System.Reflection; | |
| using NUnit.Framework; | |
| using UnityEditor; | |
| using UnityEngine; | |
| using Unity.MLAgents; | |
| using Unity.MLAgents.Editor; | |
| namespace MLAgentsExamples.Tests.Settings | |
| { | |
| [] | |
| public class MLAgentsSettingsTests | |
| { | |
| string EditorBuildSettingsConfigKey = MLAgentsSettingsManager.EditorBuildSettingsConfigKey; | |
| string tempSettingsRootPath = "Assets/ML-Agents/Scripts/Tests/Editor/MLAgentsSettings"; | |
| MLAgentsSettings storedConfigObject; | |
| [] | |
| public void SetUp() | |
| { | |
| if (EditorBuildSettings.TryGetConfigObject(EditorBuildSettingsConfigKey, | |
| out MLAgentsSettings settingsAsset)) | |
| { | |
| if (settingsAsset != null) | |
| { | |
| storedConfigObject = settingsAsset; | |
| EditorBuildSettings.RemoveConfigObject(EditorBuildSettingsConfigKey); | |
| } | |
| } | |
| MLAgentsSettingsManager.Destroy(); | |
| ClearSettingsAssets(); | |
| } | |
| [] | |
| public void TearDown() | |
| { | |
| if (storedConfigObject != null) | |
| { | |
| EditorBuildSettings.AddConfigObject(EditorBuildSettingsConfigKey, storedConfigObject, true); | |
| storedConfigObject = null; | |
| } | |
| MLAgentsSettingsManager.Destroy(); | |
| ClearSettingsAssets(); | |
| } | |
| internal void ClearSettingsAssets() | |
| { | |
| var assetsGuids = AssetDatabase.FindAssets("t:MLAgentsSettings", new string[] { tempSettingsRootPath }); | |
| foreach (var guid in assetsGuids) | |
| { | |
| var path = AssetDatabase.GUIDToAssetPath(guid); | |
| AssetDatabase.DeleteAsset(path); | |
| } | |
| } | |
| [] | |
| public void TestMLAgentsSettingsManager() | |
| { | |
| Assert.AreNotEqual(null, MLAgentsSettingsManager.Settings); | |
| Assert.AreEqual(5004, MLAgentsSettingsManager.Settings.EditorPort); // default port | |
| MLAgentsSettingsManager.Settings.EditorPort = 6000; | |
| Assert.AreEqual(6000, MLAgentsSettingsManager.Settings.EditorPort); | |
| var settingsObject = ScriptableObject.CreateInstance<MLAgentsSettings>(); | |
| settingsObject.EditorPort = 7000; | |
| var tempSettingsAssetPath = tempSettingsRootPath + "/test.mlagents.settings.asset"; | |
| AssetDatabase.CreateAsset(settingsObject, tempSettingsAssetPath); | |
| EditorBuildSettings.AddConfigObject(EditorBuildSettingsConfigKey, settingsObject, true); | |
| // destroy manager instantiated as a side effect by accessing MLAgentsSettings directly without manager | |
| MLAgentsSettingsManager.Destroy(); | |
| Assert.AreEqual(7000, MLAgentsSettingsManager.Settings.EditorPort); | |
| } | |
| // A mock class that can invoke private methods/fields in MLAgentsSettingsProvider | |
| internal class MockSettingsProvider | |
| { | |
| public MLAgentsSettingsProvider Instance | |
| { | |
| get | |
| { | |
| return (MLAgentsSettingsProvider)typeof(MLAgentsSettingsProvider).GetField("s_Instance", | |
| BindingFlags.Static | BindingFlags.NonPublic).GetValue(null); | |
| } | |
| } | |
| public MLAgentsSettings Settings | |
| { | |
| get | |
| { | |
| return (MLAgentsSettings)typeof(MLAgentsSettingsProvider).GetField("m_Settings", | |
| BindingFlags.Instance | BindingFlags.NonPublic).GetValue(Instance); | |
| } | |
| } | |
| public void CreateMLAgentsSettingsProvider() | |
| { | |
| MLAgentsSettingsProvider.CreateMLAgentsSettingsProvider(); | |
| } | |
| public void Reinitialize() | |
| { | |
| var method = typeof(MLAgentsSettingsProvider).GetMethod("Reinitialize", | |
| BindingFlags.Instance | BindingFlags.NonPublic); | |
| method.Invoke(Instance, null); | |
| } | |
| public string[] FindSettingsInProject() | |
| { | |
| var method = typeof(MLAgentsSettingsProvider).GetMethod("FindSettingsInProject", | |
| BindingFlags.Static | BindingFlags.NonPublic); | |
| return (string[])method.Invoke(null, null); | |
| } | |
| public void CreateNewSettingsAsset(string relativePath) | |
| { | |
| var method = typeof(MLAgentsSettingsProvider).GetMethod("CreateNewSettingsAsset", | |
| BindingFlags.Static | BindingFlags.NonPublic); | |
| method.Invoke(null, new object[] { relativePath }); | |
| } | |
| } | |
| [] | |
| public void TestMLAgentsSettingsProviderCreateAsset() | |
| { | |
| var mockProvider = new MockSettingsProvider(); | |
| mockProvider.CreateMLAgentsSettingsProvider(); | |
| Assert.AreNotEqual(null, mockProvider.Instance); | |
| // mimic MLAgentsSettingsProvider.OnActivate() | |
| MLAgentsSettingsManager.OnSettingsChange += mockProvider.Reinitialize; | |
| mockProvider.Instance.InitializeWithCurrentSettings(); | |
| Assert.AreEqual(0, mockProvider.FindSettingsInProject().Length); | |
| var tempSettingsAssetPath1 = tempSettingsRootPath + "/test.mlagents.settings.asset"; | |
| mockProvider.CreateNewSettingsAsset(tempSettingsAssetPath1); | |
| Assert.AreEqual(1, mockProvider.FindSettingsInProject().Length); | |
| Assert.AreEqual(5004, mockProvider.Settings.EditorPort); | |
| MLAgentsSettingsManager.Settings.EditorPort = 6000; // change to something not default | |
| // callback should update the field in provider | |
| Assert.AreEqual(6000, mockProvider.Settings.EditorPort); | |
| var tempSettingsAssetPath2 = tempSettingsRootPath + "/test2.mlagents.settings.asset"; | |
| mockProvider.CreateNewSettingsAsset(tempSettingsAssetPath2); | |
| Assert.AreEqual(2, mockProvider.FindSettingsInProject().Length); | |
| // manager should set to the new (default) one, not the previous modified one | |
| Assert.AreEqual(5004, MLAgentsSettingsManager.Settings.EditorPort); | |
| // mimic MLAgentsSettingsProvider.OnDeactivate() | |
| MLAgentsSettingsManager.OnSettingsChange -= mockProvider.Reinitialize; | |
| mockProvider.Instance.Dispose(); | |
| } | |
| [] | |
| public void TestMLAgentsSettingsProviderLoadAsset() | |
| { | |
| var mockProvider = new MockSettingsProvider(); | |
| var tempSettingsAssetPath1 = tempSettingsRootPath + "/test.mlagents.settings.asset"; | |
| mockProvider.CreateNewSettingsAsset(tempSettingsAssetPath1); | |
| MLAgentsSettingsManager.Settings.EditorPort = 8000; // change to something not default | |
| mockProvider.Instance?.Dispose(); | |
| MLAgentsSettingsManager.Destroy(); | |
| mockProvider.CreateMLAgentsSettingsProvider(); | |
| Assert.AreEqual(8000, MLAgentsSettingsManager.Settings.EditorPort); | |
| } | |
| } | |
| } | |