12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- using System.Collections.Generic;
- using NUnit.Framework;
- using NUnit.Framework.Interfaces;
- using NUnit.Framework.Internal;
- namespace UnityEngine.TestTools
- {
- /// <summary>
- /// This attribute is an alternative to the standard `Ignore` attribute in [NUnit](https://nunit.org/). It allows for ignoring tests only under a specified condition. The condition evaluates during `OnLoad`, referenced by ID.
- /// </summary>
- public class ConditionalIgnoreAttribute : NUnitAttribute, IApplyToTest
- {
- string m_ConditionKey;
- string m_IgnoreReason;
- /// <summary>
- /// Initializes a new instance of the <see cref="ConditionalIgnoreAttribute"/> class with a condition key.
- /// </summary>
- /// <param name="conditionKey">The key to check for enabling the conditional ignore. The condition is set with the static <see cref="AddConditionalIgnoreMapping"/> method.</param>
- /// <param name="ignoreReason">The reason for the ignore.</param>
- public ConditionalIgnoreAttribute(string conditionKey, string ignoreReason)
- {
- m_ConditionKey = conditionKey;
- m_IgnoreReason = ignoreReason;
- }
- /// <summary>
- /// Modifies a test as defined for the specific attribute.
- /// </summary>
- /// <param name="test">The test to modify</param>
- public void ApplyToTest(Test test)
- {
- var key = m_ConditionKey.ToLowerInvariant();
- if (m_ConditionMap.ContainsKey(key) && m_ConditionMap[key])
- {
- test.RunState = RunState.Ignored;
- string skipReason = string.Format(m_IgnoreReason);
- test.Properties.Add(PropertyNames.SkipReason, skipReason);
- }
- }
- static Dictionary<string, bool> m_ConditionMap = new Dictionary<string, bool>();
- /// <summary>
- /// Adds a flag indicating whether tests with the same key should be ignored.
- /// </summary>
- /// <param name="key">The key to ignore tests for.</param>
- /// <param name="value">A boolean value indicating whether the tests should be ignored.</param>
- /// <example>
- /// An example in which tests are ignored in the Mac editor only.
- /// <code>
- /// using UnityEditor;
- /// using NUnit.Framework;
- /// using UnityEngine.TestTools;
- ///
- /// [InitializeOnLoad]
- /// public class OnLoad
- /// {
- /// static OnLoad()
- /// {
- /// var editorIsOSX = false;
- /// #if UNITY_EDITOR_OSX
- /// editorIsOSX = true;
- /// #endif
- ///
- /// ConditionalIgnoreAttribute.AddConditionalIgnoreMapping("IgnoreInMacEditor", editorIsOSX);
- /// }
- /// }
- ///
- /// public class MyTestClass
- /// {
- /// [Test, ConditionalIgnore("IgnoreInMacEditor", "Ignored on Mac editor.")]
- /// public void TestNeverRunningInMacEditor()
- /// {
- /// Assert.Pass();
- /// }
- /// }
- /// </code>
- /// </example>
- public static void AddConditionalIgnoreMapping(string key, bool value)
- {
- m_ConditionMap.Add(key.ToLowerInvariant(), value);
- }
- }
- }
|