/// <summary>
        /// This method constructs new dictionary from all tests in old fixture, then iterates new fixture to find matching scripts
        /// Iterating both fixtures would result in O(n^2). With dictionary, it is only O(2n) with some temp memory allocations.
        /// </summary>
        private void ResetTestStatusForModifiedTests(TestFixture oldFixture, LightTestFixture newFixture)
        {
            // dictionary with count is faster on adding elements. Operation complexity is o(1)
            var newScriptsDict = new Dictionary <string, Script>(oldFixture.Tests.Count);

            foreach (var s in oldFixture.Tests)
            {
                newScriptsDict.Add(s.Name, s);
            }

            var oldScripts = newFixture.Tests;

            for (int i = 0; i < oldScripts.Count; ++i)
            {
                var    oldScript = oldScripts[i];
                Script newScript;
                newScriptsDict.TryGetValue(oldScript.Name, out newScript);

                // if new script is different, mark it's status as None
                if (!oldScript.Similar(newScript) && newScript != null)
                {
                    lock (m_TestStatusDictionaryLock)
                    {
                        var tuple = CreateTuple(oldFixture, newScript);
                        SetStatus(tuple, TestStatus.None);

                        TestStatusUpdated?.Invoke();
                    }
                }
            }
        }
 private void OnTestPassed(LightTestFixture fixture, Script script)
 {
     lock (m_TestStatusDictionaryLock)
     {
         var tuple = CreateTuple(fixture, script);
         SetStatus(tuple, TestStatus.Passed);
         TestStatusUpdated?.Invoke();
     }
 }
 private void UpdateTestStatus()
 {
     lock (m_TestStatusDictionaryLock)
     {
         foreach (var fixture in m_TestFixtures)
         {
             foreach (var script in fixture.LoadedScripts)
             {
                 var tuple = CreateTuple(fixture, script);
                 if (!TestStatusDictionary.ContainsKey(tuple))
                 {
                     TestStatusDictionary.Add(tuple, TestStatus.None);
                 }
             }
         }
     }
     TestStatusUpdated?.Invoke();
 }