{"id":26751115,"url":"https://github.com/bwatts/green","last_synced_at":"2025-04-15T00:18:10.613Z","repository":{"id":40373882,"uuid":"292734409","full_name":"bwatts/Green","owner":"bwatts","description":"Green is a standalone .NET library focused on applying Boolean expressions to target data. Ask better questions of your objects using checks and expectations!","archived":false,"fork":false,"pushed_at":"2023-02-22T04:13:58.000Z","size":142,"stargazers_count":11,"open_issues_count":4,"forks_count":1,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-04-15T00:18:01.459Z","etag":null,"topics":["asssertions","checks","csharp","dotnet","dotnet-core","expectations","green","standalone","testing","unit-testing","utilities","validation"],"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/bwatts.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":"license.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-09-04T02:59:00.000Z","updated_at":"2020-10-14T04:09:00.000Z","dependencies_parsed_at":"2023-01-29T20:31:32.063Z","dependency_job_id":null,"html_url":"https://github.com/bwatts/Green","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bwatts%2FGreen","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bwatts%2FGreen/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bwatts%2FGreen/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bwatts%2FGreen/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bwatts","download_url":"https://codeload.github.com/bwatts/Green/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248981254,"owners_count":21193148,"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":["asssertions","checks","csharp","dotnet","dotnet-core","expectations","green","standalone","testing","unit-testing","utilities","validation"],"created_at":"2025-03-28T12:16:49.576Z","updated_at":"2025-04-15T00:18:10.595Z","avatar_url":"https://github.com/bwatts.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"![Green](logo.png)\r\n\r\n\u003cbr/\u003e\r\n\r\nGreen is a standalone [.NET Standard 2.1 library](https://www.nuget.org/packages/Green) focused on **applying Boolean functions to target data**.\r\n\r\nAsk better questions with [checks](#21-checks) and [expectations](#22-expectations)!\r\n\r\n## Purpose\r\n\r\nGreen is inspired by assertions in automated tests. Testing is fundamentally about asking questions, yet asking questions is not *only* for testing. We deserve to wield these concepts in shipped code.\r\n\r\nThat said, expectations are really useful in tests.\r\n\r\n## Contents\r\n\r\n* [1. Quick Start](#1-quick-start)\r\n  * [1.1. Install](#11-install)\r\n  * [1.2. Add to the local scope](#12-add-to-the-local-scope)\r\n* [2. Core Features](#2-core-features)\r\n  * [2.1. Checks](#21-checks)\r\n  * [2.2. Expectations](#22-expectations)\r\n  * [2.3. Collections](#23-collections)\r\n  * [2.4. Not](#24-not)\r\n  * [2.5. Extensibility](#25-extensibility)\r\n* [3. Check Types](#3-check-tyeps)\r\n  * [3.1. `Check`](#31-check)\r\n  * [3.2. `Check\u003cT\u003e`](#32-check-t)\r\n  * [3.3. `CheckMany\u003cT\u003e`](#33-checkmany-t)\r\n  * [3.4. `CheckMany\u003cTKey, TValue\u003e`](#34-checkmany-tkey-tvalue)\r\n* [4. Expect Types](#4-expect-types) \r\n  * [4.1. `Expect`](#41-expect)\r\n  * [4.2. `Expect\u003cT\u003e`](#42-expect-t)\r\n  * [4.3. `ExpectMany\u003cT\u003e`](#43-expectmany-t)\r\n  * [4.4. `ExpectMany\u003cTKey, TValue\u003e`](#44-expectmany-tkey-tvalue)\r\n* [5. Issue Types](#5-issue-tyeps) \r\n  * [5.1. `Issue\u003cT\u003e`](#51-issue-t)\r\n  * [5.2. `IssueMany\u003cT\u003e`](#52-issuemany-t)\r\n  * [5.3. `IssueMany\u003cTKey, TValue\u003e`](#53-issuemany-tkey-tvalue)\r\n  * [5.4. `IssueResult`](#54-issueresult)\r\n* [6. Operators](#6-operators)\r\n  \r\n\r\n## 1. Quick Start\r\n\r\n### 1.1. Install\r\n\r\nGreen is a [.NET Standard 2.1 package](https://www.nuget.org/packages/Green) available on NuGet:\r\n\r\n```bash\r\ndotnet add package Green\r\n```\r\n\r\nIt is under the [MIT license](license.txt) and, like knowledge, wants to be free.\r\n\r\n### 1.2. Add to the local scope\r\n\r\n```C#\r\nusing static Green.Local;\r\n```\r\n\r\n## 2. Core Features\r\n\r\n### 2.1. Checks\r\n\r\nA check applies a **Boolean function** to a target value:\r\n\r\n```C#\r\nif(Check(ch).IsDigit())\r\n{\r\n  // ...\r\n}\r\n```\r\n\r\nChecks **compose and defer application** until evaluated:\r\n\r\n```C#\r\nCheck\u003cstring\u003e check = Check(str).StartsWith(\"A\").HasLength(6);\r\n\r\nif(-condition-)\r\n{\r\n  check = check.EndsWith(\"Z\");\r\n}\r\n\r\nif(check)\r\n{\r\n  // ...\r\n}\r\n```\r\n\r\nThe `if` statement takes advantage of an **implicit conversion to Boolean:**\r\n\r\n```C#\r\nif(Check(n).IsPositive().IsEven() || Check(ch).IsLetter().IsLower())\r\n```\r\n\r\n### 2.2. Expectations\r\n\r\nAn expectation applies a **Boolean function** to a target value and **throws an exception** if not met:\r\n\r\n```C#\r\ntry\r\n{\r\n  Expect(\"ABC\").StartsWith(\"B\");\r\n}\r\ncatch(ExpectException x)\r\n{\r\n  Console.WriteLine(x);\r\n}\r\n```\r\n\r\nMessages format **parameter names and runtime values** in both **debug and release** builds:\r\n\r\n\u003e ```\r\n\u003e Unexpected value: Expect(\"ABC\").StartsWith(value: \"B\")\r\n\u003e\r\n\u003e at Green.Expectable.StartsWith(Expect`1 expect, String value, Issue`1 issue)\r\n\u003e at YourProject.BadCode() in C:\\YourProject\\BadCode.cs:line 91\r\n\u003e at YourProject.UsesBadCode() in C:\\YourProject\\UsesBadCode.cs:line 127\r\n\u003e at YourProject.Tests.FailingTest() in C:\\YourProject\\Tests.cs:line 42\r\n\u003e ```\r\n\r\nExpectations **compose but run immediately:**\r\n\r\n```C#\r\nExpect(\"ABC\").StartsWith(\"A\").EndsWith(\"Z\");\r\n```\r\n\r\n\u003e `Unexpected value: Expect(\"ABC\").EndsWith(value: \"Z\")`\r\n\r\nThey also support **custom messages**:\r\n\r\n```C#\r\nExpect(wakeupCall.Hours).IsAtLeast(acceptableTime, hours =\u003e $\"{hours}am is too early\")\r\n```\r\n\r\n\u003e `6am is too early: Expect(6).IsAtLeast(minimum: 8)`\r\n\r\nIt is also possible to **expect exceptions:**\r\n\r\n```C#\r\nExpectThrows\u003cCustomException\u003e(() =\u003e {});\r\n```\r\n\r\n\u003e `Unexpected success: ExpectThrows\u003cCustomException\u003e(\u003cBadCode\u003eb__1_0)`\r\n\r\n## 2.3. Collections\r\n\r\nAssertion libraries struggle to ask questions of plural data. Sequences and dictionaries get some attention, but the operators and abstractions often feel superficial and of limited use. Workarounds generally involve breaking down the data structure and testing individual pieces.\r\n\r\nGreen provides **comprehensive checks and expectations for collections**. The *Many* suffix denotes API surfaces for sequences and dictionaries:\r\n\r\n```C#\r\nCheckMany(sequence).HasSameInOrder(other)\r\nCheckMany(dictionary).HasKeys(keys).HasValues(values)\r\n```\r\n\r\nParticularly useful are `Has1` through `Has8`, which **pass corresponding items** for further inspection:\r\n\r\n```C#\r\nCheckMany(sequence).Has2((item0, item1) =\u003e\r\n  Check(item0).IsCloseTo(item1, precision: 0.01))\r\n```\r\n\r\n**Nested expectations** become inner exceptions:\r\n\r\n```C#\r\nExpectMany(sequence).Has2((item0, item1) =\u003e\r\n{\r\n  Expect(item0).IsGreaterThan(20);\r\n  Expect(item1).IsNegative().IsNotMinValue();\r\n});\r\n```\r\n\r\n\u003e ```\r\n\u003e Unexpected value: ExpectMany([1, 5]).Has2(expectItems: \u003cBadCode\u003eb__2_0)\r\n\u003e ---- Unexpected value: Expect(1).IsGreaterThan(value: 20)\r\n\u003e    at Green.Expectable.IsGreaterThan[T](Expect`1 expect, T value, Issue`1 issue)\r\n\u003e    at YourProject.BadCode() in C:\\YourProject\\BadCode.cs:line 93\r\n\u003e    at YourProject.UsesBadCode() in C:\\YourProject\\UsesBadCode.cs:line 127\r\n\u003e    at YourProject.Tests.FailingTest() in C:\\YourProject\\Tests.cs:line 42\r\n\u003e\r\n\u003e --- End of inner exception stack trace ---\r\n\u003e    at Green.Expectable.Has2[T](ExpectMany`1 expect, Action`2 expectItems, IssueMany`1 issue)\r\n\u003e    at YourProject.BadCode() in C:\\YourProject\\BadCode.cs:line 91\r\n\u003e    at YourProject.UsesBadCode() in C:\\YourProject\\UsesBadCode.cs:line 127\r\n\u003e    at YourProject.Tests.FailingTest() in C:\\YourProject\\Tests.cs:line 42\r\n\u003e ```\r\n\r\n## 2.4. Not\r\n\r\nThus far `true` has meant *success*. The *Not* suffix **expects false** from every operator:\r\n\r\n```C#\r\nCheckNot('A').IsDigit().IsUpper()\r\n```\r\n\r\nThis is equivalent to `!(IsDigit || IsUpper)`. `'A'` is not a digit, but *is* uppercase, so the result is `false`.\r\n\r\nChecks also support a unary `Not` which **flips the expected result:**\r\n\r\n```C#\r\nCheck\u003cchar\u003e lowercaseLetter = Check('A').IsLetter().IsLower();\r\nCheck\u003cchar\u003e notLowercaseLetter = check.Not();\r\n\r\nif(lowercaseLetter)    // false\r\nif(notLowercaseLetter) // true\r\n```\r\n\r\nExpectations also work with *Not* suffix:\r\n\r\n```C#\r\nExpectNot('A').IsDigit().IsUpper()\r\n```\r\n\r\n\u003e `Unexpected value: ExpectNot('A').IsUpper()`\r\n\r\nHowever, because expectations run immediately, there is no unary `Not`.\r\n\r\n## 2.5. Extensibility\r\n\r\nGreen has extensibility **in its DNA**. All checks and expectations use the same mechanisms available to consumers.\r\n\r\nFor example, this is the definition of the [`IsNull`](src/Green/Checkable.cs) check:\r\n\r\n```C#\r\npublic static Check\u003cT\u003e IsNull\u003cT\u003e(this Check\u003cT\u003e check) where T : class =\u003e\r\n  check.That(t =\u003e t == null);\r\n```\r\n\r\nThe corresponding [`IsNull`](src/Green/Expectable.cs) expectation includes an optional [`Issue\u003cT\u003e`](#51-issue-t) delegate that provides a message:\r\n\r\n```C#\r\npublic static Expect\u003cT\u003e IsNull\u003cT\u003e(this Expect\u003cT\u003e expect, Issue\u003cT\u003e? issue = null) where T : class =\u003e\r\n  expect.That(t =\u003e t == null, issue.Operator());\r\n```\r\n\r\nThe [`Operator`](src/Green/Issuable.cs) extension method tells Green this stack frame is an operator, enabling the formatted messages.\r\n\r\nExpectations with parameters provide the runtime arguments for formatting:\r\n\r\n```C#\r\npublic static Expect\u003cdouble\u003e IsCloseTo(this Expect\u003cdouble\u003e expect, double value, double precision, Issue\u003cdouble\u003e? issue = null) =\u003e\r\n  expect.That(t =\u003e Math.Abs(t - value) \u003c= precision, issue.Operator(value, precision));\r\n```\r\n\r\n*NOTE: Green opts into nullable reference types. This does not affect consumers but is valuable in other opted-in codebases.*\r\n\r\n## 3. Check Types\r\n\r\n### 3.1. [`Check`](src/Green/Check.cs)\r\n\r\nThis static class is the factory for all check types:\r\n\r\n```C#\r\npublic static Check\u003cT\u003e That\u003cT\u003e(T target);\r\npublic static Check\u003cT\u003e Not\u003cT\u003e(T target);\r\n\r\npublic static CheckMany\u003cT\u003e Many\u003cT\u003e(IEnumerable\u003cT\u003e target)\r\npublic static CheckMany\u003cT\u003e ManyNot\u003cT\u003e(IEnumerable\u003cT\u003e target)\r\n\r\npublic static CheckMany\u003cTKey, TValue\u003e Many\u003cTKey, TValue\u003e(IEnumerable\u003cKeyValuePair\u003cTKey, TValue\u003e\u003e target)\r\npublic static CheckMany\u003cTKey, TValue\u003e ManyNot\u003cTKey, TValue\u003e(IEnumerable\u003cKeyValuePair\u003cTKey, TValue\u003e\u003e target)\r\n```\r\n\r\nIts methods are available in the [local scope](#12-add-to-the-local-scope):\r\n\r\n| Static method | Local method   |\r\n|---------------|:---------------|\r\n| That          | Check          |\r\n| Not           | CheckNot       |\r\n| Many          | CheckMany      |\r\n| ManyNot       | CheckManyNot   |\r\n\r\n### 3.2. [`Check\u003cT\u003e`](src/Green/Check.cs)\r\n\r\nApplies one or more checks to a target value:\r\n\r\n```C#\r\npublic T Target { get; }\r\npublic Check\u003cT\u003e That(Func\u003cT, bool\u003e next)\r\npublic Check\u003cT\u003e Not(Func\u003cT, bool\u003e next)\r\npublic Check\u003cT\u003e Not()\r\npublic bool Apply()\r\n\r\npublic static implicit operator bool(Check\u003cT\u003e check)\r\npublic static implicit operator bool?(Check\u003cT\u003e check)\r\n```\r\n\r\n### 3.3. [`CheckMany\u003cT\u003e`](src/Green/CheckMany.cs)\r\n\r\nApplies one or more checks to a target sequence:\r\n\r\n```C#\r\npublic IEnumerable\u003cT\u003e Target { get; }\r\npublic CheckMany\u003cT\u003e That(Func\u003cIEnumerable\u003cT\u003e, bool\u003e next)\r\npublic CheckMany\u003cT\u003e Not(Func\u003cIEnumerable\u003cT\u003e, bool\u003e next)\r\npublic CheckMany\u003cT\u003e Not()\r\npublic bool Apply()\r\n\r\npublic static implicit operator bool(CheckMany\u003cT\u003e check)\r\npublic static implicit operator bool?(CheckMany\u003cT\u003e check)\r\n```\r\n\r\n### 3.4. [`CheckMany\u003cTKey, TValue\u003e`](src/Green/CheckMany.cs)\r\n\r\nApplies one or more checks to a target dictionary:\r\n\r\n```C#\r\npublic IEnumerable\u003cKeyValuePair\u003cTKey, TValue\u003e Target { get; }\r\npublic CheckMany\u003cTKey, TValue\u003e That(Func\u003cIEnumerable\u003cKeyValuePair\u003cTKey, TValue\u003e\u003e, bool\u003e next)\r\npublic CheckMany\u003cTKey, TValue\u003e Not(Func\u003cIEnumerable\u003cKeyValuePair\u003cTKey, TValue\u003e\u003e, bool\u003e next)\r\npublic CheckMany\u003cTKey, TValue\u003e Not()\r\npublic bool Apply()\r\n\r\npublic static implicit operator bool(CheckMany\u003cTKey, TValue\u003e check)\r\npublic static implicit operator bool?(CheckMany\u003cTKey, TValue\u003e check)\r\n```\r\n\r\n## 4. Expectation Types\r\n\r\n### 4.1. [`Expect`](src/Green/Expect.cs)\r\n\r\nThis static class is the factory for all expectation types:\r\n\r\n```C#\r\npublic static Expect\u003cT\u003e That\u003cT\u003e(T target)\r\npublic static Expect\u003cT\u003e Not\u003cT\u003e(T target)\r\n\r\npublic static ExpectMany\u003cT\u003e Many\u003cT\u003e(IEnumerable\u003cT\u003e target)\r\npublic static ExpectMany\u003cT\u003e ManyNot\u003cT\u003e(IEnumerable\u003cT\u003e target)\r\n\r\npublic static ExpectMany\u003cTKey, TValue\u003e Many\u003cTKey, TValue\u003e(IEnumerable\u003cKeyValuePair\u003cTKey, TValue\u003e\u003e target)\r\npublic static ExpectMany\u003cTKey, TValue\u003e ManyNot\u003cTKey, TValue\u003e(IEnumerable\u003cKeyValuePair\u003cTKey, TValue\u003e\u003e target)\r\n\r\npublic static void Throws(Action target, Issue\u003cAction\u003e? issue = null)\r\npublic static void Throws(Func\u003cobject\u003e target, Issue\u003cFunc\u003cobject\u003e\u003e? issue = null)\r\n\r\npublic static void Throws\u003cTException\u003e(Action target, Issue\u003cAction\u003e? issue = null) where TException : Exception\r\npublic static void Throws\u003cTException\u003e(Func\u003cobject\u003e target, Issue\u003cFunc\u003cobject\u003e\u003e? issue = null) where TException : Exception\r\n\r\npublic static Task ThrowsAsync\u003cTException\u003e(Func\u003cTask\u003e target, Issue\u003cFunc\u003cTask\u003e\u003e? issue = null) where TException : Exception\r\npublic static Task ThrowsAsync(Func\u003cTask\u003e target, Issue\u003cFunc\u003cTask\u003e\u003e? issue = null)\r\n```\r\n\r\nIts methods are available in the [local scope](#12-add-to-the-local-scope):\r\n\r\n| Static method | Local method      |\r\n|---------------|:------------------|\r\n| That          | Expect            |\r\n| Not           | ExpectNot         |\r\n| Many          | ExpectMany        |\r\n| ManyNot       | ExpectManyNot     |\r\n| Throws        | ExpectThrows      |\r\n| ThrowsAsync   | ExpectThrowsAsync |\r\n\r\n### 4.2. [`Expect\u003cT\u003e`](src/Green/Expect.cs)\r\n\r\nApplies a check to a target value and throws [`ExpectException`](src/Green/ExpectException.cs) if not met:\r\n\r\n```C#\r\npublic T Target { get; }\r\npublic Expect\u003cT\u003e That(Func\u003cT, bool\u003e check)\r\n\r\npublic static implicit operator bool(Expect\u003cT\u003e _) =\u003e true;\r\npublic static implicit operator bool?(Expect\u003cT\u003e _) =\u003e true;\r\n```\r\n\r\n*NOTES*\r\n* The implicit operators return `true` for use in expressions as well as statements.\r\n* Expectations lack a composable `Not` method. See the [Not](#24-not) section for more information.\r\n\r\n### 4.4. [`ExpectMany\u003cT\u003e`](src/Green/ExpectMany.cs)\r\n\r\nApplies a check to a target sequence and throws [`ExpectException`](src/Green/ExpectException.cs) if not met:\r\n\r\n```C#\r\npublic IEnumerable\u003cT\u003e Target { get; }\r\npublic ExpectMany\u003cT\u003e That(Func\u003cIEnumerable\u003cT\u003e, bool\u003e check)\r\n\r\npublic static implicit operator bool(ExpectMany\u003cT\u003e _) =\u003e true;\r\npublic static implicit operator bool?(ExpectMany\u003cT\u003e _) =\u003e true;\r\n```\r\n\r\n*NOTES*\r\n* The implicit operators return `true` for use in expressions as well as statements.\r\n* Expectations lack a composable `Not` method. See the [Not](#24-not) section for more information.\r\n\r\n### 4.5. [`ExpectMany\u003cTKey, TValue\u003e`](src/Green/ExpectMany.cs)\r\n\r\nApplies a check to a target dictionary and throws [`ExpectException`](src/Green/ExpectException.cs) if not met:\r\n\r\n```C#\r\npublic IEnumerable\u003cKeyValuePair\u003cTKey, TValue\u003e Target { get; }\r\npublic ExpectMany\u003cTKey, TValue\u003e That(Func\u003cIEnumerable\u003cKeyValuePair\u003cTKey, TValue\u003e\u003e, bool\u003e next)\r\n\r\npublic static implicit operator bool(ExpectMany\u003cTKey, TValue\u003e _) =\u003e true;\r\npublic static implicit operator bool?(ExpectMany\u003cTKey, TValue\u003e _) =\u003e true;\r\n```\r\n\r\n*NOTES*\r\n* The implicit operators return `true` for use in expressions as well as statements.\r\n* Expectations lack a composable `Not` method. See the [Not](#24-not) section for more information.\r\n\r\n## 5. Issue Types\r\n\r\n### 5.1. [`Issue\u003cT\u003e`](src/Green/Issue.cs)\r\n\r\nFormats a message for a target value that did not meet expectations:\r\n\r\n```C#\r\npublic delegate IssueResult Issue\u003cT\u003e(T target);\r\n```\r\n\r\n### 5.2. [`IssueMany\u003cT\u003e`](src/Green/IssueMany.cs)\r\n\r\nFormats a message for a target sequence that did not meet expectations:\r\n\r\n```C#\r\npublic delegate IssueResult IssueMany\u003cT\u003e(IEnumerable\u003cT\u003e target);\r\n```\r\n\r\n### 5.3. [`IssueMany\u003cTKey, TValue\u003e`](src/Green/IssueMany.cs)\r\n\r\nFormats a message for a target dictionary that did not meet expectations:\r\n\r\n```C#\r\npublic delegate IssueResult IssueMany\u003cTKey, TValue\u003e(IEnumerable\u003cKeyValuePair\u003cTKey, TValue\u003e\u003e target);\r\n```\r\n\r\n### 5.4. [`IssueResult`](src/Green/IssueResult.cs)\r\n\r\nThe result of formatting a message for a target value that did not meet expectations:\r\n\r\n```C#\r\npublic string Message { get; }\r\npublic string StackTrace { get; }\r\npublic IssueMethod? Method { get; }\r\npublic IssueResult? Outer { get; }\r\n\r\npublic string ToMessage(string target, bool expectedResult)\r\npublic ExpectException ToException(string target, bool expectedResult = true, Exception? inner = null)\r\npublic ExpectException ToThrowsException(string target, Type exceptionType, Exception? inner = null)\r\npublic ExpectException ToThrowsAsyncException(string target, Type exceptionType, Exception? inner = null)\r\n\r\npublic static implicit operator IssueResult(string userMessage)\r\n\r\npublic static IssueResult Default(IssueResult? outer = null)\r\npublic static IssueResult Default(string stackTrace, IssueResult? outer = null)\r\npublic static IssueResult Operator(string stackTrace, string method, string args, IssueResult? outer = null)\r\npublic static IssueResult OperatorMany(string stackTrace, string method, string args, IssueResult? outer = null)\r\n\r\npublic class IssueMethod\r\n{\r\n  public string Name { get; }\r\n  public string Args { get; }\r\n  public bool IsMany { get; }\r\n\r\n  public string FormatCall(string target, bool expectedResult)\r\n}\r\n```\r\n\r\n## 6. Operators\r\n\r\nSee [operators.md](docs/operators.md) for a full list of check, expectation, and issue operators.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbwatts%2Fgreen","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbwatts%2Fgreen","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbwatts%2Fgreen/lists"}