using System; using System.Collections; using System.IO; using NUnit.Framework; using UnityEngine; using UnityEngine.Experimental.Perception.Randomization.Randomizers.SampleRandomizers; using UnityEngine.Perception.GroundTruth; using UnityEngine.Experimental.Perception.Randomization.Scenarios; using UnityEngine.TestTools; using Object = UnityEngine.Object; namespace RandomizationTests { [TestFixture] public class ScenarioTests { GameObject m_TestObject; FixedLengthScenario m_Scenario; [SetUp] public void Setup() { m_TestObject = new GameObject(); } [TearDown] public void TearDown() { Object.DestroyImmediate(m_TestObject); } // TODO: update this function once the perception camera doesn't skip the first frame IEnumerator CreateNewScenario(int totalIterations, int framesPerIteration) { m_Scenario = m_TestObject.AddComponent(); m_Scenario.quitOnComplete = false; m_Scenario.constants.totalIterations = totalIterations; m_Scenario.constants.framesPerIteration = framesPerIteration; yield return null; // Skip Start() frame yield return null; // Skip first Update() frame } [UnityTest] public IEnumerator ScenarioConfigurationSerializesProperly() { yield return CreateNewScenario(10, 10); var scenario = m_Scenario.GetComponent(); scenario.CreateRandomizer(); const string expectedConfig = @"{ ""constants"": { ""framesPerIteration"": 10, ""totalIterations"": 10, ""instanceCount"": 1, ""instanceIndex"": 0, ""randomSeed"": 539662031 }, ""randomizers"": { ""HueOffsetRandomizer"": { ""hueOffset"": { ""value"": { ""range"": { ""minimum"": -180.0, ""maximum"": 180.0 } } } } } }"; Assert.AreEqual(expectedConfig, scenario.SerializeToJson()); } [UnityTest] public IEnumerator ScenarioConfigurationOverwrittenDuringDeserialization() { yield return CreateNewScenario(10, 10); var constants = new FixedLengthScenario.Constants { framesPerIteration = 2, totalIterations = 2 }; var changedConstants = new FixedLengthScenario.Constants { framesPerIteration = 0, totalIterations = 0 }; // Serialize some values m_Scenario.constants = constants; var serializedConfig = m_Scenario.SerializeToJson(); // Change the values m_Scenario.constants = changedConstants; m_Scenario.DeserializeFromJson(serializedConfig); // Check if the values reverted correctly Assert.AreEqual(m_Scenario.constants.framesPerIteration, constants.framesPerIteration); Assert.AreEqual(m_Scenario.constants.totalIterations, constants.totalIterations); yield return null; } [UnityTest] public IEnumerator IterationsCanLastMultipleFrames() { const int frameCount = 5; yield return CreateNewScenario(1, frameCount); for (var i = 0; i < frameCount; i++) { Assert.AreEqual(0, m_Scenario.currentIteration); yield return null; } Assert.AreEqual(1, m_Scenario.currentIteration); } [UnityTest] public IEnumerator FinishesWhenIsScenarioCompleteIsTrue() { const int iterationCount = 5; yield return CreateNewScenario(iterationCount, 1); for (var i = 0; i < iterationCount; i++) { Assert.False(m_Scenario.isScenarioComplete); yield return null; } Assert.True(m_Scenario.isScenarioComplete); } [UnityTest] public IEnumerator StartNewDatasetSequenceEveryIteration() { var perceptionCamera = SetupPerceptionCamera(); yield return CreateNewScenario(2, 2); Assert.AreEqual(DatasetCapture.SimulationState.SequenceTime, 0); // Second frame, first iteration yield return null; Assert.AreEqual(DatasetCapture.SimulationState.SequenceTime, perceptionCamera.period); // Third frame, second iteration, SequenceTime has been reset yield return null; Assert.AreEqual(DatasetCapture.SimulationState.SequenceTime, 0); } [UnityTest] public IEnumerator GeneratedRandomSeedsChangeWithScenarioIteration() { yield return CreateNewScenario(3, 1); var seeds = new uint[3]; for (var i = 0; i < 3; i++) seeds[i] = m_Scenario.NextRandomState(); yield return null; for (var i = 0; i < 3; i++) Assert.AreNotEqual(seeds[i], m_Scenario.NextRandomState()); } PerceptionCamera SetupPerceptionCamera() { m_TestObject.SetActive(false); var camera = m_TestObject.AddComponent(); camera.orthographic = true; camera.orthographicSize = 1; var perceptionCamera = m_TestObject.AddComponent(); perceptionCamera.captureRgbImages = false; m_TestObject.SetActive(true); return perceptionCamera; } } }