From ef0eaa75cd090d4600dfab631f3166df9faff685 Mon Sep 17 00:00:00 2001 From: Koji Hasegawa Date: Tue, 30 Apr 2024 14:20:25 +0900 Subject: [PATCH 1/2] Add UnityVersionAttribute --- Runtime/Attributes/UnityVersionAttribute.cs | 67 +++++++++++++++++ .../Attributes/UnityVersionAttribute.cs.meta | 2 + .../Attributes/UnityVersionAttributeTest.cs | 71 +++++++++++++++++++ .../UnityVersionAttributeTest.cs.meta | 2 + 4 files changed, 142 insertions(+) create mode 100644 Runtime/Attributes/UnityVersionAttribute.cs create mode 100644 Runtime/Attributes/UnityVersionAttribute.cs.meta create mode 100644 Tests/Runtime/Attributes/UnityVersionAttributeTest.cs create mode 100644 Tests/Runtime/Attributes/UnityVersionAttributeTest.cs.meta diff --git a/Runtime/Attributes/UnityVersionAttribute.cs b/Runtime/Attributes/UnityVersionAttribute.cs new file mode 100644 index 0000000..9e7f9e4 --- /dev/null +++ b/Runtime/Attributes/UnityVersionAttribute.cs @@ -0,0 +1,67 @@ +// Copyright (c) 2023-2024 Koji Hasegawa. +// This software is released under the MIT License. + +using System; +using NUnit.Framework; +using NUnit.Framework.Interfaces; +using NUnit.Framework.Internal; +using UnityEngine; + +namespace TestHelper.Attributes +{ + /// + /// Skip this test run if Unity version is older and/or newer than specified. + /// + [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method)] + public class UnityVersionAttribute : NUnitAttribute, IApplyToTest + { + private readonly string _newerThanOrEqual; + private readonly string _olderThan; + + /// + /// Skip this test run if Unity version is older and/or newer than specified. + /// + /// This test will run if the Unity editor version is newer than or equal the specified version. + /// This test will run if the Unity editor version is older than the specified version. + public UnityVersionAttribute(string newerThanOrEqual = null, string olderThan = null) + { + _newerThanOrEqual = newerThanOrEqual; + _olderThan = olderThan; + } + + public void ApplyToTest(Test test) + { + if (IsSkip(Application.unityVersion)) + { + test.RunState = RunState.Ignored; + test.Properties.Set("_SKIPREASON", "Unity editor version is out of range."); + } + } + + internal bool IsSkip(string unityVersion) + { + if (!string.IsNullOrEmpty(_newerThanOrEqual) && !IsNewerThanEqual(unityVersion, _newerThanOrEqual)) + { + return true; + } + + if (!string.IsNullOrEmpty(_olderThan) && !IsOlderThan(unityVersion, _olderThan)) + { + return true; + } + + return false; + } + + private static bool IsNewerThanEqual(string unityVersion, string newerThanEqual) + { + return string.Compare(unityVersion, newerThanEqual, StringComparison.Ordinal) >= 0; + } + + private static bool IsOlderThan(string unityVersion, string olderThan) + { + var digits = olderThan.Length; // Evaluate only up to olderThan`s digits + return string.Compare(unityVersion.Substring(0, digits), olderThan, StringComparison.Ordinal) <= 0; + } + } +} diff --git a/Runtime/Attributes/UnityVersionAttribute.cs.meta b/Runtime/Attributes/UnityVersionAttribute.cs.meta new file mode 100644 index 0000000..0bb5b66 --- /dev/null +++ b/Runtime/Attributes/UnityVersionAttribute.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 9325ece4a20de4833a33cd5a23388739 \ No newline at end of file diff --git a/Tests/Runtime/Attributes/UnityVersionAttributeTest.cs b/Tests/Runtime/Attributes/UnityVersionAttributeTest.cs new file mode 100644 index 0000000..248d1d2 --- /dev/null +++ b/Tests/Runtime/Attributes/UnityVersionAttributeTest.cs @@ -0,0 +1,71 @@ +// Copyright (c) 2023-2024 Koji Hasegawa. +// This software is released under the MIT License. + +using NUnit.Framework; + +namespace TestHelper.Attributes +{ + [TestFixture] + public class UnityVersionAttributeTest + { + private const string UnityVersion = "2023.2.16f1"; + + [TestCase("2023.2.16f1")] // equal version is not skip + [TestCase("2023.2.15f1")] + [TestCase("2023.2")] + [TestCase("2023")] + [TestCase("2022")] + public void IsSkip_newerThanOrEqual_NotSkip(string newerThanOrEqual) + { + var sut = new UnityVersionAttribute(newerThanOrEqual); + var actual = sut.IsSkip(UnityVersion); + Assert.That(actual, Is.False); + } + + [TestCase("2023.2.17f1")] + [TestCase("2023.3")] + [TestCase("6000")] + public void IsSkip_newerThanOrEqual_Skip(string newerThanOrEqual) + { + var sut = new UnityVersionAttribute(newerThanOrEqual); + var actual = sut.IsSkip(UnityVersion); + Assert.That(actual, Is.True); + } + + [TestCase("2023.2.17f1")] + [TestCase("2023.2.16f1")] // equal version is not skip + [TestCase("2023.2")] + [TestCase("2023")] + [TestCase("6000")] + public void IsSkip_olderThan_NotSkip(string olderThan) + { + var sut = new UnityVersionAttribute(olderThan: olderThan); + var actual = sut.IsSkip(UnityVersion); + Assert.That(actual, Is.False); + } + + [TestCase("2023.2.15f1")] + [TestCase("2023.1")] + [TestCase("2022")] + [TestCase("2021")] + public void IsSkip_olderThan_Skip(string olderThan) + { + var sut = new UnityVersionAttribute(olderThan: olderThan); + var actual = sut.IsSkip(UnityVersion); + Assert.That(actual, Is.True); + } + + [Test] + [UnityVersion("2019")] + public void Attach_newerThanOrEqual2019_NotSkip() + { + } + + [Test] + [UnityVersion(olderThan: "2019.4.0f1")] + public void Attach_olderThan2019_4_0f1_Skip() + { + Assert.Fail("This test should be skipped."); + } + } +} diff --git a/Tests/Runtime/Attributes/UnityVersionAttributeTest.cs.meta b/Tests/Runtime/Attributes/UnityVersionAttributeTest.cs.meta new file mode 100644 index 0000000..d589aa8 --- /dev/null +++ b/Tests/Runtime/Attributes/UnityVersionAttributeTest.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 5449d92c641e94db6b53f921865b9975 \ No newline at end of file From ad0a7e2ee9541812f0f142188ed7bfef38744ec5 Mon Sep 17 00:00:00 2001 From: Koji Hasegawa Date: Tue, 30 Apr 2024 15:36:28 +0900 Subject: [PATCH 2/2] Mod README.md --- README.md | 34 +++++++++++++++++++++ Runtime/Attributes/UnityVersionAttribute.cs | 1 + 2 files changed, 35 insertions(+) diff --git a/README.md b/README.md index 985f16c..5a18aef 100644 --- a/README.md +++ b/README.md @@ -170,6 +170,40 @@ public class MyTestClass ``` +#### UnityVersion + +`UnityVersionAttribute` is an NUnit test attribute class to skip test run if Unity version is older and/or newer than specified. + +This attribute can attached to test method, test class (`TestFixture`) and test assembly. +Can be used with sync Test, async Test, and UnityTest. + +Usage: + +```csharp +using System; +using NUnit.Framework; +using TestHelper.Attributes; + +[TestFixture] +public class MyTestClass +{ + [Test] + [UnityVersion(newerThanOrEqual: "2022")] + public void MyTestMethod() + { + // Test run only for Unity 2022.1.0f1 or later. + } + + [Test] + [UnityVersion(olderThan: "2019.4.0f1")] + public void MyTestMethod() + { + // Test run only for Unity older than 2019.4.0f1. + } +} +``` + + #### CreateScene `CreateSceneAttribute` is an NUnit test attribute class to create new scene before running test. diff --git a/Runtime/Attributes/UnityVersionAttribute.cs b/Runtime/Attributes/UnityVersionAttribute.cs index 9e7f9e4..5b9a50b 100644 --- a/Runtime/Attributes/UnityVersionAttribute.cs +++ b/Runtime/Attributes/UnityVersionAttribute.cs @@ -20,6 +20,7 @@ public class UnityVersionAttribute : NUnitAttribute, IApplyToTest /// /// Skip this test run if Unity version is older and/or newer than specified. + /// Valid format, e.g., "2023.2.16f1", "2023.2", and "2023". /// /// This test will run if the Unity editor version is newer than or equal the specified version. /// This test will run if the Unity editor version is older than the specified version.