95 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			95 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| 
 | |
| namespace UnityEngine.TestTools.Utils
 | |
| {
 | |
|     /// <summary>
 | |
|     /// This contains test utility functions for float value comparison and creating primitives.
 | |
|     /// </summary>
 | |
|     public static class Utils
 | |
|     {
 | |
|         /// <summary>
 | |
|         /// Relative epsilon comparison of two float values for equality.
 | |
|         /// The relative error is the absolute error divided by the magnitude of the exact value.
 | |
|         /// </summary>
 | |
|         /// <param name="expected">The expected float value used to compare.</param>
 | |
|         /// <param name="actual">The actual float value to test.</param>
 | |
|         /// <param name="epsilon"> Epsilon is the relative error to be used in relative epsilon comparison.</param>
 | |
|         /// <returns>Returns true if the actual value is equivalent to the expected value.</returns>
 | |
|         /// <example>
 | |
|         /// <code>
 | |
|         /// [TestFixture]
 | |
|         /// class UtilsTests
 | |
|         /// {
 | |
|         ///     [Test]
 | |
|         ///     public void CheckThat_FloatsAreEqual()
 | |
|         ///     {
 | |
|         ///         float expected = 10e-8f;
 | |
|         ///         float actual = 0f;
 | |
|         ///         float allowedRelativeError = 10e-6f;
 | |
|         ///
 | |
|         ///         Assert.That(Utils.AreFloatsEqual(expected, actual, allowedRelativeError), Is.True);
 | |
|         ///     }
 | |
|         /// }
 | |
|         /// </code>
 | |
|         /// </example>
 | |
|         public static bool AreFloatsEqual(float expected, float actual, float epsilon)
 | |
|         {
 | |
|             // special case for infinity
 | |
|             if (expected == Mathf.Infinity || actual == Mathf.Infinity || expected == Mathf.NegativeInfinity || actual == Mathf.NegativeInfinity)
 | |
|                 return expected == actual;
 | |
| 
 | |
|             // we cover both relative and absolute tolerance with this check
 | |
|             // which is better than just relative in case of small (in abs value) args
 | |
|             // please note that "usually" approximation is used [i.e. abs(x)+abs(y)+1]
 | |
|             // but we speak about test code so we dont care that much about performance
 | |
|             // but we do care about checks being more precise
 | |
|             return Math.Abs(actual - expected) <= epsilon * Mathf.Max(Mathf.Max(Mathf.Abs(actual), Mathf.Abs(expected)), 1.0f);
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Compares two floating point numbers for equality under the given absolute tolerance.
 | |
|         /// </summary>
 | |
|         /// <param name="expected">The expected float value used to compare.</param>
 | |
|         /// <param name="actual">The actual float value to test.</param>
 | |
|         /// <param name="allowedAbsoluteError">AllowedAbsoluteError is the permitted error tolerance.</param>
 | |
|         /// <returns> Returns true if the actual value is equivalent to the expected value under the given tolerance.
 | |
|         /// </returns>
 | |
|         /// <example>
 | |
|         /// <code>
 | |
|         /// [TestFixture]
 | |
|         /// class UtilsTests
 | |
|         /// {
 | |
|         ///     [Test]
 | |
|         ///     public void CheckThat_FloatsAreAbsoluteEqual()
 | |
|         ///     {
 | |
|         ///         float expected = 0f;
 | |
|         ///         float actual = 10e-6f;
 | |
|         ///         float error = 10e-5f;
 | |
|         ///
 | |
|         ///         Assert.That(Utils.AreFloatsEqualAbsoluteError(expected, actual, error), Is.True);
 | |
|         ///     }
 | |
|         /// }
 | |
|         /// </code>
 | |
|         /// </example>
 | |
|         public static bool AreFloatsEqualAbsoluteError(float expected, float actual, float allowedAbsoluteError)
 | |
|         {
 | |
|             return Math.Abs(actual - expected) <= allowedAbsoluteError;
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Analogous to GameObject.CreatePrimitive, but creates a primitive mesh renderer with fast shader instead of a default builtin shader.
 | |
|         /// Optimized for testing performance.
 | |
|         /// </summary>
 | |
|         /// <returns>A GameObject with primitive mesh renderer and collider.</returns>
 | |
|         /// <param name="type">The type of primitive object to create.</param>
 | |
|         public static GameObject CreatePrimitive(PrimitiveType type)
 | |
|         {
 | |
|             var prim = GameObject.CreatePrimitive(type);
 | |
|             var renderer = prim.GetComponent<Renderer>();
 | |
|             if (renderer)
 | |
|                 renderer.sharedMaterial = new Material(Shader.Find("VertexLit"));
 | |
|             return prim;
 | |
|         }
 | |
|     }
 | |
| }
 |