{"id":16209931,"url":"https://github.com/annulusgames/chainingassertion-unity","last_synced_at":"2025-03-02T08:35:04.950Z","repository":{"id":215739224,"uuid":"739448613","full_name":"annulusgames/ChainingAssertion-Unity","owner":"annulusgames","description":"Chaining Assertion for Unity Test Framework","archived":false,"fork":false,"pushed_at":"2024-01-08T00:52:37.000Z","size":52,"stargazers_count":14,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-03-02T03:24:15.663Z","etag":null,"topics":["assertions","testing","unity"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/annulusgames.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-01-05T15:37:52.000Z","updated_at":"2025-02-18T12:45:42.000Z","dependencies_parsed_at":null,"dependency_job_id":"a3205dbb-6e18-49be-8d97-f228922507d4","html_url":"https://github.com/annulusgames/ChainingAssertion-Unity","commit_stats":null,"previous_names":["annulusgames/chainingassertion-unity","yn01dev/chainingassertion-unity","yn01-dev/chainingassertion-unity"],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/annulusgames%2FChainingAssertion-Unity","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/annulusgames%2FChainingAssertion-Unity/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/annulusgames%2FChainingAssertion-Unity/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/annulusgames%2FChainingAssertion-Unity/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/annulusgames","download_url":"https://codeload.github.com/annulusgames/ChainingAssertion-Unity/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":241481967,"owners_count":19969833,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["assertions","testing","unity"],"created_at":"2024-10-10T10:34:13.168Z","updated_at":"2025-03-02T08:35:04.940Z","avatar_url":"https://github.com/annulusgames.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ChainingAssertion for Unity\n Chaining Assertion for Unity Test Framework\n\n[![license](https://img.shields.io/badge/LICENSE-MIT-green.svg)](LICENSE)\n\n[日本語版READMEはこちら](README_JA.md)\n\nChainingAssertion for Unity is a method chaining based assertion library for Unity Test Framework.\n\nChainingAssertion for Unity adds extension methods such as `Is()` and `AsDynamic()` from the original [ChainingAssertion](https://github.com/neuecc/ChainingAssertion) to Unity Test Framework.\n\nAdditionally, there are additional functions such as `IsApproximately()`, which performs comparisons that take floating-point errors into account for float, Vector3, and Quaternion, and `AsPrivateObject()`, which supports access to private members using reflection for testing in IL2CPP (AOT environment).\n\n## Setup\n\n### Requirements\n\n* Unity 2019.2 or later\n* Test Framework 1.0.0 or later\n\n### Installation\n\n1. Open the Package Manager from Window \u003e Package Manager.\n2. Click on the \"+\" button \u003e Add package from git URL.\n3. Enter the following URL:\n\n```\nhttps://github.com/AnnulusGames/ChainingAssertion-Unity.git?path=Assets/ChainingAssertion\n```\n\nAlternatively, open Packages/manifest.json and add the following to the dependencies block:\n\n```json\n{\n    \"dependencies\": {\n        \"com.annulusgames.chaining-assertion\": \"https://github.com/AnnulusGames/ChainingAssertion-Unity.git?path=Assets/ChainingAssertion\"\n    }\n}\n```\n\n## Is / IsNot\n\nYou can intuitively perform assertions using the `Is()`/`IsNot()` extension methods.\n\n```csharp\nusing System;\nusing System.Linq;\nusing NUnit.Framework;\nusing ChainingAssertion;\n\npublic class Example\n{\n    [Test]\n    public void Test_Is()\n    {\n        Math.Pow(5, 2).Is(25); // Assert.Equals\n        Math.Abs(-1).IsNot(-1); // Assert.NotEquals\n    }\n    \n    [Test]\n    public void Test_Is_Lambda()\n    {\n        // Assert.IsTrue(x =\u003e ...);\n        \"ChainingAssertion\".Is(s =\u003e s.StartsWith(\"Chaining\") \u0026\u0026 s.EndsWith(\"Assertion\"));\n    }\n\n    [Test]\n    public void Test_Is_Collection()\n    {\n        Enumerable.Range(0, 5).Is(0, 1, 2, 3, 4); // CollectionAssert.AreEqual\n        Enumerable.Range(0, 5).IsNot(0, 1, 2, 3, 4, 5); // CollectionAssert.AreNotEqual\n    }\n}\n```\n\n## Collection Assertions\n\nCombining LINQ to Objects with Chaining Assertion allows expressing assertions similar to CollectionAssert.\n\n```csharp\nvar array = new[] { 1, 3, 7, 8 };\n\narray.Contains(8).IsTrue(); // CollectionAssert.Contains\narray.Any().IsTrue(); // CollectionAssert.IsNotEmpty\nnew int[] { }.Any().IsFalse(); // CollectionAssert.IsEmpty\narray.OrderBy(x =\u003e x).Is(array); // CollectionAssert.IsOrdered\n```\n\n## IsApproximately\n\nFor floating-point types like `float`, `Vector3`, `Quaternion`, etc., you can perform comparisons considering errors using `IsApproximately()`.\n\n```csharp\ntransform.position.IsApproximately(Vector3.one);\ntransform.localEulerAngles.IsApproximately(new Vector3(0f, 0f, 90f), 0.001f);\n```\n\n## Other Assertions\n\n```csharp\nusing System;\nusing NUnit.Framework;\nusing ChainingAssertion;\n\npublic class Example\n{\n    [Test]\n    public void Test_IsNull()\n    {\n        object target = null;\n        target.IsNull(); // Assert.IsNull\n        new object().IsNotNull();  // Assert.IsNull\n    }\n\n    [Test]\n    public void Test_IsSameReferenceAs()\n    {\n        var tuple = Tuple.Create(\"foo\");\n        tuple.IsSameReferenceAs(tuple); // Assert.AreSame\n        tuple.IsNotSameReferenceAs(Tuple.Create(\"foo\")); // Assert.AreNotSame\n    }\n\n    [Test]\n    public void Test_IsInstanceOf()\n    {\n        \"foo\".IsInstanceOf\u003cstring\u003e(); // Assert.IsInstanceOfType\n        999.IsNotInstanceOf\u003cdouble\u003e(); // Assert.IsNotInstanceOfType\n    }\n}\n```\n\n## AsDynamic\n\nUsing `AsDynamic()` converts the target to a dynamic type, enabling dynamic access to private members.\n\n\u003e [!WARNING]\n\u003e `AsDynamic()` does not work in an IL2CPP environment. Therefore, it's recommended to use `AsPrivateObject()` instead for PlayMode tests.\n\n```csharp\npublic class TestClass\n{\n    public TestClass(string str)\n    {\n        _privateField = str;\n    }\n\n    private string _privateField;\n    private string PrivateProperty\n    {\n        get =\u003e _privateField;\n        set =\u003e _privateField = value;\n    }\n    private string PrivateMethod()\n    {\n        return _privateField;\n    }\n}\n\nvar actual = new TestClass(\"foo\");\nAssert.AreEqual(actual.AsDynamic()._privateField, \"foo\");\nAssert.AreEqual(actual.AsDynamic().PrivateProperty, \"foo\");\nAssert.AreEqual(actual.AsDynamic().PrivateMethod(), \"foo\");\n\nactual.AsDynamic().PrivateProperty = \"bar\";\nAssert.AreEqual(actual.AsDynamic()._privateField, \"bar\");\n```\n\n## AsPrivateObject\n\nUsing `AsPrivateObject()` converts the target to a `PrivateObject`, enabling access to private members using reflection. Use this instead of `AsDynamic()` when executing tests in an IL2CPP environment.\n\n```csharp\nvar actual = new TestClass(\"foo\");\nAssert.AreEqual(actual.AsPrivateObject().GetField(\"_privateField\"), \"foo\");\nAssert.AreEqual(actual.AsPrivateObject().GetProperty(\"PrivateProperty\"), \"foo\");\nAssert.AreEqual(actual.AsPrivateObject().Invoke(\"PrivateMethod\"), \"foo\");\n\nactual.AsPrivateObject().SetFieldOrProperty(\"PrivateProperty\", \"bar\");\nAssert.AreEqual(actual.AsPrivateObject().GetFieldOrProperty(\"_privateField\"), \"bar\");\n```\n\n## License\n\n[MIT License](LICENSE)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fannulusgames%2Fchainingassertion-unity","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fannulusgames%2Fchainingassertion-unity","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fannulusgames%2Fchainingassertion-unity/lists"}