From cdf109906ac6f3d20e2f012d72887efc8e38ddbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lasse=20Sj=C3=B8rup?= Date: Fri, 11 Oct 2024 14:08:41 +0200 Subject: [PATCH 01/26] Created doc folder --- .../AnalyzerRules/MM0001.md | 0 .../AnalyzerRules/MM0002.md | 0 .../AnalyzerRules/MM0003.md | 0 .../AnalyzerRules/MM0004.md | 0 .../AnalyzerRules/MM0005.md | 0 .../AnalyzerRules/MM0006.md | 0 .../OtherLanguageWorkaround.md | 0 Docs/README.md | 248 +++++++++++++ README.md | 325 +++++++++--------- 9 files changed, 410 insertions(+), 163 deletions(-) rename {Documentation => Docs}/AnalyzerRules/MM0001.md (100%) rename {Documentation => Docs}/AnalyzerRules/MM0002.md (100%) rename {Documentation => Docs}/AnalyzerRules/MM0003.md (100%) rename {Documentation => Docs}/AnalyzerRules/MM0004.md (100%) rename {Documentation => Docs}/AnalyzerRules/MM0005.md (100%) rename {Documentation => Docs}/AnalyzerRules/MM0006.md (100%) rename {Documentation => Docs}/OtherLanguageWorkaround.md (100%) create mode 100644 Docs/README.md diff --git a/Documentation/AnalyzerRules/MM0001.md b/Docs/AnalyzerRules/MM0001.md similarity index 100% rename from Documentation/AnalyzerRules/MM0001.md rename to Docs/AnalyzerRules/MM0001.md diff --git a/Documentation/AnalyzerRules/MM0002.md b/Docs/AnalyzerRules/MM0002.md similarity index 100% rename from Documentation/AnalyzerRules/MM0002.md rename to Docs/AnalyzerRules/MM0002.md diff --git a/Documentation/AnalyzerRules/MM0003.md b/Docs/AnalyzerRules/MM0003.md similarity index 100% rename from Documentation/AnalyzerRules/MM0003.md rename to Docs/AnalyzerRules/MM0003.md diff --git a/Documentation/AnalyzerRules/MM0004.md b/Docs/AnalyzerRules/MM0004.md similarity index 100% rename from Documentation/AnalyzerRules/MM0004.md rename to Docs/AnalyzerRules/MM0004.md diff --git a/Documentation/AnalyzerRules/MM0005.md b/Docs/AnalyzerRules/MM0005.md similarity index 100% rename from Documentation/AnalyzerRules/MM0005.md rename to Docs/AnalyzerRules/MM0005.md diff --git a/Documentation/AnalyzerRules/MM0006.md b/Docs/AnalyzerRules/MM0006.md similarity index 100% rename from Documentation/AnalyzerRules/MM0006.md rename to Docs/AnalyzerRules/MM0006.md diff --git a/Documentation/OtherLanguageWorkaround.md b/Docs/OtherLanguageWorkaround.md similarity index 100% rename from Documentation/OtherLanguageWorkaround.md rename to Docs/OtherLanguageWorkaround.md diff --git a/Docs/README.md b/Docs/README.md new file mode 100644 index 0000000..b38ea02 --- /dev/null +++ b/Docs/README.md @@ -0,0 +1,248 @@ +# MiniMock + +MiniMock offers a _minimalistic_ approach to mocking in .NET. It is designed to be simple to use and easy to understand. It is not as feature-rich as other mocking frameworks but aims to solve __95%__ of the use cases. For the remaining __5%__, you should consider creating a custom mock. + +MiniMock is __extremely strict__, requiring you to specify all features you want to mock. This is by design to make sure you are aware of what you are mocking. Unmocked features will throw an exception if used. + +## Table of Contents +- [Simple Example](#simple-example) +- [Key Feature Summary](#key-feature-summary) +- [Limitations](#limitations) +- [Installation & Initialization](#installation--initialization) +- [Quality of Life Features](#quality-of-life-features) + - [Fluent Interface](#fluent-interface) + - [Simple Return Values](#simple-return-values) + - [Multiple Return Values](#multiple-return-values) + - [Intercept Method Calls](#intercept-method-calls) + - [Async Methods](#async-methods) + - [Strict Mocking](#strict-mocking) + - [Adding Indexers](#adding-indexers) + - [Raising Events](#raising-events) + - [Argument Matching](#argument-matching) + +## Simple Example + +```csharp +public interface IVersionLibrary +{ + bool DownloadExists(string version); +} + +[Fact] +[Mock] +public void SimpleExample() +{ + var library = Mock.IVersionLibrary(config => + config.DownloadExists(returns: true)); + + var actual = library.DownloadExists("2.0.0.0"); + + Assert.True(actual); +} +``` + +## Key Feature Summary + +- Minimalistic API with fluent method chaining, documentation, and full IntelliSense +- Mocking of interfaces, abstract classes, and virtual methods (with limitations) +- Mocking of methods, properties, indexers, and events +- Simple factory methods to initialize mocks +- Mocking of async methods, overloads, and generic methods +- Ref and out parameters in methods supported +- Generic interfaces supported + +## Limitations + +- No validation of calls +- Only supports C# (workarounds exist for VB.NET and F#) +- Ref return values and ref properties are not supported ([issue #5](https://github.com/oswaldsql/MiniMock/issues/5)) +- Partial mocking of classes + - Base classes with constructors with parameters are not currently supported ([Issue #4](https://github.com/oswaldsql/MiniMock/issues/4)) +- No support for static classes or methods + +## Installation & Initialization + +Reference the NuGet package in your test project: + +```sh +dotnet add package MiniMock +``` + +Specify which interface to mock by using the `[Mock]` attribute before your test or test class: + +```csharp +[Fact] +[Mock] // Specify which interface to mock +public void MyTest() { + var mockRepo = Mock.IMyRepository(config => config // Create a mock using the mock factory + .CreateCustomerAsync(return: Guid.NewGuid()) // Configure your mock to your needs + ); + var sut = new CustomerMaintenance(mockRepo); // Inject the mock into your system under test + + sut.Create(customerDTO, cancellationToken); +} +``` + +## Quality of Life Features + +### Fluent Interface + +All mockable members are available through a _fluent interface_ with _IntelliSense_, _type safety_, and _documentation_. + +Since the mock code is generated at development time, you can _inspect_, _step into_, and _debug_ the code. This also allows for _security_ and _vulnerability scanning_ of the code. + +All code required to run MiniMock is generated and has _no runtime dependencies_. + +### Simple Return Values + +Simply specify what you expect returned from methods or properties. All parameters are ignored. + +```csharp +var mockLibrary = Mock.IVersionLibrary(config => config + .DownloadExists(returns: true) // Returns true for any parameter + .DownloadLinkAsync(returns: new Uri("http://downloads/2.0.0")) // Returns a task with a download link + .CurrentVersion(value: new Version(2, 0, 0, 0)) // Sets the initial version to 2.0.0.0 + .Indexer(values: versions) // Provides a dictionary to retrieve and store versions +); +``` + +### Multiple Return Values + +Specify multiple return values for a method or property. The first value is returned for the first call, the second for the second call, and so on. + +```csharp +var mockLibrary = Mock.IVersionLibrary(config => config + .DownloadExists(returnValues: true, false, true) // Returns true, false, true for the first, second, and third call + .DownloadLinkAsync(returnValues: [Task.FromResult(new Uri("http://downloads/2.0.0")), Task.FromResult(new Uri("http://downloads/2.0.1"))]) // Returns a task with a download link for the first and second call + .DownloadLinkAsync(returnValues: new Uri("http://downloads/2.0.0"), new Uri("http://downloads/2.0.1")) // Returns a task with a download link for the first and second call +); +``` + +### Intercept Method Calls + +```csharp +[Fact] +[Mock] +public async Task InterceptMethodCalls() +{ + var currentVersionMock = new Version(2, 0, 0); + + var versionLibrary = Mock.IVersionLibrary(config => config + .DownloadExists(call: (string s) => s.StartsWith("2.0.0") ? true : false) // Returns true for version 2.0.0.x based on a string parameter + .DownloadExists(call: (Version v) => v is { Major: 2, Minor: 0, Revision: 0 }) // Returns true for version 2.0.0.x based on a version parameter + // or + .DownloadExists(call: LocalIntercept) // Calls a local function + .DownloadExists(call: version => this.ExternalIntercept(version, true)) // Calls function in class + + .DownloadLinkAsync(call: s => Task.FromResult(new Uri($"http://downloads/{s}"))) // Returns a task containing a download link for version 2.0.0.x otherwise an error link + .DownloadLinkAsync(call: s => new Uri($"http://downloads/{s}")) // Returns a task containing a download link for version 2.0.0.x otherwise an error link + + .CurrentVersion(get: () => currentVersionMock, set: version => currentVersionMock = version) // Overwrites the property getter and setter + .Indexer(get: s => new Version(2, 0, 0, 0), set: (s, version) => {}) // Overwrites the indexer getter and setter + ); + + return; + + bool LocalIntercept(Version version) + { + return version is { Major: 2, Minor: 0, Revision: 0 }; + } +} + +private bool ExternalIntercept(string version, bool startsWith) => startsWith ? version.StartsWith("2.0.0") : version == "2.0.0"; +``` + +### Async Methods + +Simply return what you expect from async methods either as a `Task` object or a simple value. + +```csharp +var versionLibrary = Mock.IVersionLibrary(config => config + .DownloadLinkAsync(returns: Task.FromResult(new Uri("http://downloads/2.0.0"))) // Returns a task containing a download link for all versions + .DownloadLinkAsync(call: s => Task.FromResult(new Uri($"http://downloads/{s}"))) // Returns a task containing a download link for version 2.0.0.x otherwise an error link + // or + .DownloadLinkAsync(returns: new Uri("http://downloads/2.0.0")) // Returns a task containing a download link for all versions + .DownloadLinkAsync(call: s => new Uri($"http://downloads/{s}")) // Returns a task containing a download link for version 2.0.0.x otherwise an error link +); +``` + +### Strict Mocking + +Unmocked features will always throw `InvalidOperationException`. + +```csharp +[Fact] +[Mock] +public void UnmockedFeaturesAlwaysThrowInvalidOperationException() +{ + var versionLibrary = Mock.IVersionLibrary(); + + var propertyException = Assert.Throws(() => versionLibrary.CurrentVersion); + var methodException = Assert.Throws(() => versionLibrary.DownloadExists("2.0.0")); + var asyncException = Assert.ThrowsAsync(() => versionLibrary.DownloadLinkAsync("2.0.0")); + var indexerException = Assert.Throws(() => versionLibrary["2.0.0"]); +} +``` + +### Adding Indexers + +Mocking indexers is supported either by overloading the get and set methods or by providing a dictionary with expected values. + +```csharp +[Fact] +[Mock] +public void Indexers() +{ + var versions = new Dictionary() {{"current", new Version(2,0,0,0)}}; + + var versionLibrary = Mock.IVersionLibrary(config => config + .Indexer(get: s => new Version(2,0,0,0), set: (s, version) => {}) // Overwrites the indexer getter and setter + .Indexer(values: versions) // Provides a dictionary to retrieve and store versions + ); + + var preCurrent = versionLibrary["current"]; + versionLibrary["current"] = new Version(3, 0, 0, 0); + var postCurrent = versionLibrary["current"]; + Assert.NotEqual(preCurrent, postCurrent); +} +``` + +### Raising Events + +Raise events using an event trigger. + +```csharp +Action? triggerNewVersionAdded = null; + +var versionLibrary = Mock.IVersionLibrary(config => config + .NewVersionAdded(trigger: out triggerNewVersionAdded) // Provides a trigger for when a new version is added +); + +triggerNewVersionAdded?.Invoke(new Version(2, 0, 0, 0)); +``` + +### Argument Matching + +MiniMock does not support argument matching using matchers like other mocking frameworks. Instead, you can use the call parameter to match arguments using predicates or internal functions. + +```csharp +var versionLibrary = Mock.IVersionLibrary(config => config + .DownloadExists(call: version => version is { Major: 2, Minor: 0 }) // Returns true for version 2.0.x based on a version parameter +); +``` + +__Using Internal Functions__ + +```csharp +var versionLibrary = Mock.IVersionLibrary(config => +{ + bool downloadExists(Version version) => version switch { + { Major: 1, Minor: 0 } => true, // Returns true for version 1.0.x based on a version parameter + { Major: 2, Minor: 0, Revision: 0 } => true, // Returns true for version 2.0.0.0 based on a version parameter + { Major: 3, } => false, // Returns false for version 3.x based on a version parameter + _ => throw new ArgumentException() // Throws an exception for all other versions + }; + + config.DownloadExists(downloadExists); +}); +``` diff --git a/README.md b/README.md index f2f5164..b38ea02 100644 --- a/README.md +++ b/README.md @@ -1,249 +1,248 @@ # MiniMock -Mini mock offers a _minimalistic_ approach to mocking in .Net. It is designed to be simple to use and easy to understand. -It is not as feature rich as other mocking frameworks, but aims to solve __95%__ of the use cases. For the remaining __5%__ you should consider creating a custom mock. - -Mini mock is __extremely strict__ requiring you to specify all features you want to mock. This is by design to make sure you are aware of what you are mocking. -Unmocked features will throw an exception if used. - -## Simple example +MiniMock offers a _minimalistic_ approach to mocking in .NET. It is designed to be simple to use and easy to understand. It is not as feature-rich as other mocking frameworks but aims to solve __95%__ of the use cases. For the remaining __5%__, you should consider creating a custom mock. + +MiniMock is __extremely strict__, requiring you to specify all features you want to mock. This is by design to make sure you are aware of what you are mocking. Unmocked features will throw an exception if used. + +## Table of Contents +- [Simple Example](#simple-example) +- [Key Feature Summary](#key-feature-summary) +- [Limitations](#limitations) +- [Installation & Initialization](#installation--initialization) +- [Quality of Life Features](#quality-of-life-features) + - [Fluent Interface](#fluent-interface) + - [Simple Return Values](#simple-return-values) + - [Multiple Return Values](#multiple-return-values) + - [Intercept Method Calls](#intercept-method-calls) + - [Async Methods](#async-methods) + - [Strict Mocking](#strict-mocking) + - [Adding Indexers](#adding-indexers) + - [Raising Events](#raising-events) + - [Argument Matching](#argument-matching) + +## Simple Example ```csharp - public interface IVersionLibrary - { - bool DownloadExists(string version); - } +public interface IVersionLibrary +{ + bool DownloadExists(string version); +} - [Fact] - [Mock] - public void SimpleExample() - { - var library = Mock.IVersionLibrary(config => - config.DownloadExists(returns: true)); +[Fact] +[Mock] +public void SimpleExample() +{ + var library = Mock.IVersionLibrary(config => + config.DownloadExists(returns: true)); - var actual = library.DownloadExists("2.0.0.0"); + var actual = library.DownloadExists("2.0.0.0"); - Assert.True(actual); - } + Assert.True(actual); +} ``` -## Key feature summery +## Key Feature Summary -- Minimalistic api with fluent method chaining, documentation and full intellisence -- Mocking of interfaces, abstract classes and virtual methods (with limitations) -- Mocking of methods, properties, indexers and events +- Minimalistic API with fluent method chaining, documentation, and full IntelliSense +- Mocking of interfaces, abstract classes, and virtual methods (with limitations) +- Mocking of methods, properties, indexers, and events - Simple factory methods to initialize mocks -- Mocking of Async methods, overloads and generic methods +- Mocking of async methods, overloads, and generic methods - Ref and out parameters in methods supported - Generic interfaces supported ## Limitations - No validation of calls -- Only support C# (workarounds exist for VB.Net and F#) -- No support for Generic methods ([issue #8](https://github.com/oswaldsql/MiniMock/issues/8)) -- Ref return values as ref properties are not supported ([issue #5](https://github.com/oswaldsql/MiniMock/issues/5)) -- Partially mocking of classes +- Only supports C# (workarounds exist for VB.NET and F#) +- Ref return values and ref properties are not supported ([issue #5](https://github.com/oswaldsql/MiniMock/issues/5)) +- Partial mocking of classes - Base classes with constructors with parameters are not currently supported ([Issue #4](https://github.com/oswaldsql/MiniMock/issues/4)) - No support for static classes or methods ## Installation & Initialization -Reference nuget package in your test project +Reference the NuGet package in your test project: -```csharp +```sh dotnet add package MiniMock ``` -Specify which interface to mock by using the [Mock] attribute before your test or test class. +Specify which interface to mock by using the `[Mock]` attribute before your test or test class: ```csharp [Fact] -[Mock] -public void MyTest { +[Mock] // Specify which interface to mock +public void MyTest() { + var mockRepo = Mock.IMyRepository(config => config // Create a mock using the mock factory + .CreateCustomerAsync(return: Guid.NewGuid()) // Configure your mock to your needs + ); + var sut = new CustomerMaintenance(mockRepo); // Inject the mock into your system under test + + sut.Create(customerDTO, cancellationToken); } ``` -Create a mock by using the mock factory - -```csharp -var mockRepository = Mock.IMyRepository(); -``` +## Quality of Life Features -Configure your mock to your needs +### Fluent Interface -```csharp -var mockRepo = Mock.IMyRepository(config => config.CreateCustormerAsync(return: Guid.NewGuid()); -``` +All mockable members are available through a _fluent interface_ with _IntelliSense_, _type safety_, and _documentation_. -Use the mocked object - -```csharp -var sut = new CustomerMaitinance(mockRepo); -sut.Create(customerDTO, cancelationToken); -``` - -## Quality of life features - -### Fluent interface with full intellisence and documentation. - -All mockable members are available through a _fluent interface_ with _intellisence_, _type safety_ and _documentation_. - -Since the mock code is generated at development time you can _inspect_, _stepped into_ and _debug_ the code. This also allows for _security_ and _vulnerability scanning_ of the code. +Since the mock code is generated at development time, you can _inspect_, _step into_, and _debug_ the code. This also allows for _security_ and _vulnerability scanning_ of the code. All code required to run MiniMock is generated and has _no runtime dependencies_. -### Simple return values +### Simple Return Values Simply specify what you expect returned from methods or properties. All parameters are ignored. ```csharp - var mockLibrary = Mock.IVersionLibrary(config => config - .DownloadExists(returns: true) // Returns true for any parameter - .DownloadLinkAsync(returns: new Uri("http://downloads/2.0.0")) // Returns a task with a download link - .CurrentVersion(value: new Version(2, 0, 0, 0)) // Sets the initial version to 2.0.0.0 - .Indexer(values: versions) // Provides a dictionary to retrieve and store versions - ); +var mockLibrary = Mock.IVersionLibrary(config => config + .DownloadExists(returns: true) // Returns true for any parameter + .DownloadLinkAsync(returns: new Uri("http://downloads/2.0.0")) // Returns a task with a download link + .CurrentVersion(value: new Version(2, 0, 0, 0)) // Sets the initial version to 2.0.0.0 + .Indexer(values: versions) // Provides a dictionary to retrieve and store versions +); ``` -### Multiple return values +### Multiple Return Values -Specify multiple return values for a method or property. The first value is returned for the first call, the second for the second call and so on. +Specify multiple return values for a method or property. The first value is returned for the first call, the second for the second call, and so on. ```csharp - var mockLibrary = Mock.IVersionLibrary(config => config - .DownloadExists(returnValues: true, false, true) // Returns true, false, true for the first, second and third call - .DownloadLinkAsync(returnValues: [Task.FromResult(new Uri("http://downloads/2.0.0")), Task.FromResult(new Uri("http://downloads/2.0.1"))]) // Returns a task with a download link for the first and second call - .DownloadLinkAsync(returnValues: new Uri("http://downloads/2.0.0"), new Uri("http://downloads/2.0.1")) // Returns a task with a download link for the first and second call - ); +var mockLibrary = Mock.IVersionLibrary(config => config + .DownloadExists(returnValues: true, false, true) // Returns true, false, true for the first, second, and third call + .DownloadLinkAsync(returnValues: [Task.FromResult(new Uri("http://downloads/2.0.0")), Task.FromResult(new Uri("http://downloads/2.0.1"))]) // Returns a task with a download link for the first and second call + .DownloadLinkAsync(returnValues: new Uri("http://downloads/2.0.0"), new Uri("http://downloads/2.0.1")) // Returns a task with a download link for the first and second call +); ``` -### Intercept method calls +### Intercept Method Calls ```csharp - [Fact] - [Mock] - public async Task InterceptMethodCalls() - { - var currentVersionMock = new Version(2, 0, 0); - - var versionLibrary = Mock.IVersionLibrary(config => config - .DownloadExists(call: (string s) => s.StartsWith("2.0.0") ? true : false ) // Returns true for version 2.0.0.x base on a string parameter - .DownloadExists(call: (Version v) => v is { Major: 2, Minor: 0, Revision: 0 })// Returns true for version 2.0.0.x based on a version parameter - //or - .DownloadExists(call: LocalIntercept) // calls a local function - .DownloadExists(call: version => this.ExternalIntercept(version, true)) // calls function in class - - .DownloadLinkAsync(call: s => Task.FromResult(new Uri($"http://downloads/{s}"))) // Returns a task containing a download link for version 2.0.0.x otherwise a error link - .DownloadLinkAsync(call: s => new Uri($"http://downloads/{s}")) // Returns a task containing a download link for version 2.0.0.x otherwise a error link - - .CurrentVersion(get: () => currentVersionMock, set: version => currentVersionMock = version) // Overwrites the property getter and setter - .Indexer(get: s => new Version(2,0,0,0), set: (s, version) => {}) // Overwrites the indexer getter and setter - ); +[Fact] +[Mock] +public async Task InterceptMethodCalls() +{ + var currentVersionMock = new Version(2, 0, 0); - return; + var versionLibrary = Mock.IVersionLibrary(config => config + .DownloadExists(call: (string s) => s.StartsWith("2.0.0") ? true : false) // Returns true for version 2.0.0.x based on a string parameter + .DownloadExists(call: (Version v) => v is { Major: 2, Minor: 0, Revision: 0 }) // Returns true for version 2.0.0.x based on a version parameter + // or + .DownloadExists(call: LocalIntercept) // Calls a local function + .DownloadExists(call: version => this.ExternalIntercept(version, true)) // Calls function in class + + .DownloadLinkAsync(call: s => Task.FromResult(new Uri($"http://downloads/{s}"))) // Returns a task containing a download link for version 2.0.0.x otherwise an error link + .DownloadLinkAsync(call: s => new Uri($"http://downloads/{s}")) // Returns a task containing a download link for version 2.0.0.x otherwise an error link + + .CurrentVersion(get: () => currentVersionMock, set: version => currentVersionMock = version) // Overwrites the property getter and setter + .Indexer(get: s => new Version(2, 0, 0, 0), set: (s, version) => {}) // Overwrites the indexer getter and setter + ); - bool LocalIntercept(Version version) - { - return version is { Major: 2, Minor: 0, Revision: 0 }; - } + return; + + bool LocalIntercept(Version version) + { + return version is { Major: 2, Minor: 0, Revision: 0 }; } +} - private bool ExternalIntercept(string version, bool startsWith) => startsWith ? version.StartsWith("2.0.0") : version == "2.0.0"; +private bool ExternalIntercept(string version, bool startsWith) => startsWith ? version.StartsWith("2.0.0") : version == "2.0.0"; ``` -### Async methods +### Async Methods -Simply return what you expect from async methods either as a Task object or a simple value. +Simply return what you expect from async methods either as a `Task` object or a simple value. ```csharp - var versionLibrary = Mock.IVersionLibrary(config => config - .DownloadLinkAsync(returns: Task.FromResult(new Uri("http://downloads/2.0.0"))) // Returns a task containing a download link for all versions - .DownloadLinkAsync(call: s => Task.FromResult(new Uri($"http://downloads/{s}"))) // Returns a task containing a download link for version 2.0.0.x otherwise a error link - // or - .DownloadLinkAsync(returns: new Uri("http://downloads/2.0.0")) // Returns a task containing a download link for all versions - .DownloadLinkAsync(call: s => new Uri($"http://downloads/{s}")) // Returns a task containing a download link for version 2.0.0.x otherwise a error link - ); +var versionLibrary = Mock.IVersionLibrary(config => config + .DownloadLinkAsync(returns: Task.FromResult(new Uri("http://downloads/2.0.0"))) // Returns a task containing a download link for all versions + .DownloadLinkAsync(call: s => Task.FromResult(new Uri($"http://downloads/{s}"))) // Returns a task containing a download link for version 2.0.0.x otherwise an error link + // or + .DownloadLinkAsync(returns: new Uri("http://downloads/2.0.0")) // Returns a task containing a download link for all versions + .DownloadLinkAsync(call: s => new Uri($"http://downloads/{s}")) // Returns a task containing a download link for version 2.0.0.x otherwise an error link +); ``` -### Strict mocking +### Strict Mocking -Unmocked features will always throw InvalidOperationException. +Unmocked features will always throw `InvalidOperationException`. ```csharp - [Fact] - [Mock] - public void UnmockedFeaturesAlwaysThrowInvalidOperationException() - { - var versionLibrary = Mock.IVersionLibrary(); - - var propertyException = Assert.Throws(() => versionLibrary.CurrentVersion); - var methodException = Assert.Throws(() => versionLibrary.DownloadExists("2.0.0")); - var asyncException = Assert.ThrowsAsync(() => versionLibrary.DownloadLinkAsync("2.0.0")); - var indexerException = Assert.Throws(() => versionLibrary["2.0.0"]); - } +[Fact] +[Mock] +public void UnmockedFeaturesAlwaysThrowInvalidOperationException() +{ + var versionLibrary = Mock.IVersionLibrary(); + + var propertyException = Assert.Throws(() => versionLibrary.CurrentVersion); + var methodException = Assert.Throws(() => versionLibrary.DownloadExists("2.0.0")); + var asyncException = Assert.ThrowsAsync(() => versionLibrary.DownloadLinkAsync("2.0.0")); + var indexerException = Assert.Throws(() => versionLibrary["2.0.0"]); +} ``` -### Adding indexers +### Adding Indexers Mocking indexers is supported either by overloading the get and set methods or by providing a dictionary with expected values. ```csharp - [Fact] - [Mock] - public void Indexers() - { - var versions = new Dictionary() {{"current", new Version(2,0,0,0)}}; - - var versionLibrary = Mock.IVersionLibrary(config => config - .Indexer(get: s => new Version(2,0,0,0), set: (s, version) => {}) // Overwrites the indexer getter and setter - .Indexer(values: versions) // Provides a dictionary to retrieve and store versions - ); - - var preCurrent = versionLibrary["current"]; - versionLibrary["current"] = new Version(3, 0, 0, 0); - var postCurrent = versionLibrary["current"]; - Assert.NotEqual(preCurrent, postCurrent); - } +[Fact] +[Mock] +public void Indexers() +{ + var versions = new Dictionary() {{"current", new Version(2,0,0,0)}}; + + var versionLibrary = Mock.IVersionLibrary(config => config + .Indexer(get: s => new Version(2,0,0,0), set: (s, version) => {}) // Overwrites the indexer getter and setter + .Indexer(values: versions) // Provides a dictionary to retrieve and store versions + ); + + var preCurrent = versionLibrary["current"]; + versionLibrary["current"] = new Version(3, 0, 0, 0); + var postCurrent = versionLibrary["current"]; + Assert.NotEqual(preCurrent, postCurrent); +} ``` -### Raising events +### Raising Events Raise events using an event trigger. ```csharp - Action? triggerNewVersionAdded = null; - - var versionLibrary = Mock.IVersionLibrary(config => config - .NewVersionAdded(trigger: out triggerNewVersionAdded) // Provides a trigger for when a new version is added - ); - - triggerNewVersionAdded?.Invoke(new Version(2, 0, 0, 0)); +Action? triggerNewVersionAdded = null; + +var versionLibrary = Mock.IVersionLibrary(config => config + .NewVersionAdded(trigger: out triggerNewVersionAdded) // Provides a trigger for when a new version is added +); + +triggerNewVersionAdded?.Invoke(new Version(2, 0, 0, 0)); ``` -### Argument matching +### Argument Matching -MiniMock does not support argument matching using matchers like other mocking frameworks. -Instead, you can use the call parameter to match arguments using predicates or internal functions. +MiniMock does not support argument matching using matchers like other mocking frameworks. Instead, you can use the call parameter to match arguments using predicates or internal functions. ```csharp - var versionLibrary = Mock.IVersionLibrary(config => config - .DownloadExists(call: version => version is { Major: 2, Minor: 0 }) // Returns true for version 2.0.x based on a version parameter - ); +var versionLibrary = Mock.IVersionLibrary(config => config + .DownloadExists(call: version => version is { Major: 2, Minor: 0 }) // Returns true for version 2.0.x based on a version parameter +); ``` - -__using internal functions__ + +__Using Internal Functions__ ```csharp - var versionLibrary = Mock.IVersionLibrary(config => - { - bool downloadExists(Version version) => version switch { - { Major: 1, Minor: 0 } => true, // Returns true for version 1.0.x based on a version parameter - { Major: 2, Minor: 0, Revision: 0 } => true, // Returns true for version 2.0.0.0 based on a version parameter - { Major: 3, } => false, // Returns false for version 3.x based on a version parameter - _ => throw new ArgumentException() // Throws an exception for all other versions - }; - - config.DownloadExists(downloadExists); - }); +var versionLibrary = Mock.IVersionLibrary(config => +{ + bool downloadExists(Version version) => version switch { + { Major: 1, Minor: 0 } => true, // Returns true for version 1.0.x based on a version parameter + { Major: 2, Minor: 0, Revision: 0 } => true, // Returns true for version 2.0.0.0 based on a version parameter + { Major: 3, } => false, // Returns false for version 3.x based on a version parameter + _ => throw new ArgumentException() // Throws an exception for all other versions + }; + + config.DownloadExists(downloadExists); +}); ``` From 144cfd1b09c0d59fc2872b98fef210fffe7a348f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lasse=20Sj=C3=B8rup?= Date: Fri, 11 Oct 2024 14:11:16 +0200 Subject: [PATCH 02/26] For rename to lower case step 1 --- {Docs => Docs2}/AnalyzerRules/MM0001.md | 0 {Docs => Docs2}/AnalyzerRules/MM0002.md | 0 {Docs => Docs2}/AnalyzerRules/MM0003.md | 0 {Docs => Docs2}/AnalyzerRules/MM0004.md | 0 {Docs => Docs2}/AnalyzerRules/MM0005.md | 0 {Docs => Docs2}/AnalyzerRules/MM0006.md | 0 {Docs => Docs2}/OtherLanguageWorkaround.md | 0 {Docs => Docs2}/README.md | 0 8 files changed, 0 insertions(+), 0 deletions(-) rename {Docs => Docs2}/AnalyzerRules/MM0001.md (100%) rename {Docs => Docs2}/AnalyzerRules/MM0002.md (100%) rename {Docs => Docs2}/AnalyzerRules/MM0003.md (100%) rename {Docs => Docs2}/AnalyzerRules/MM0004.md (100%) rename {Docs => Docs2}/AnalyzerRules/MM0005.md (100%) rename {Docs => Docs2}/AnalyzerRules/MM0006.md (100%) rename {Docs => Docs2}/OtherLanguageWorkaround.md (100%) rename {Docs => Docs2}/README.md (100%) diff --git a/Docs/AnalyzerRules/MM0001.md b/Docs2/AnalyzerRules/MM0001.md similarity index 100% rename from Docs/AnalyzerRules/MM0001.md rename to Docs2/AnalyzerRules/MM0001.md diff --git a/Docs/AnalyzerRules/MM0002.md b/Docs2/AnalyzerRules/MM0002.md similarity index 100% rename from Docs/AnalyzerRules/MM0002.md rename to Docs2/AnalyzerRules/MM0002.md diff --git a/Docs/AnalyzerRules/MM0003.md b/Docs2/AnalyzerRules/MM0003.md similarity index 100% rename from Docs/AnalyzerRules/MM0003.md rename to Docs2/AnalyzerRules/MM0003.md diff --git a/Docs/AnalyzerRules/MM0004.md b/Docs2/AnalyzerRules/MM0004.md similarity index 100% rename from Docs/AnalyzerRules/MM0004.md rename to Docs2/AnalyzerRules/MM0004.md diff --git a/Docs/AnalyzerRules/MM0005.md b/Docs2/AnalyzerRules/MM0005.md similarity index 100% rename from Docs/AnalyzerRules/MM0005.md rename to Docs2/AnalyzerRules/MM0005.md diff --git a/Docs/AnalyzerRules/MM0006.md b/Docs2/AnalyzerRules/MM0006.md similarity index 100% rename from Docs/AnalyzerRules/MM0006.md rename to Docs2/AnalyzerRules/MM0006.md diff --git a/Docs/OtherLanguageWorkaround.md b/Docs2/OtherLanguageWorkaround.md similarity index 100% rename from Docs/OtherLanguageWorkaround.md rename to Docs2/OtherLanguageWorkaround.md diff --git a/Docs/README.md b/Docs2/README.md similarity index 100% rename from Docs/README.md rename to Docs2/README.md From c1d4f8d5e01d6c5b84d85fab284d9bf5e099f3d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lasse=20Sj=C3=B8rup?= Date: Fri, 11 Oct 2024 14:11:47 +0200 Subject: [PATCH 03/26] Step 2 --- {Docs2 => docs}/AnalyzerRules/MM0001.md | 0 {Docs2 => docs}/AnalyzerRules/MM0002.md | 0 {Docs2 => docs}/AnalyzerRules/MM0003.md | 0 {Docs2 => docs}/AnalyzerRules/MM0004.md | 0 {Docs2 => docs}/AnalyzerRules/MM0005.md | 0 {Docs2 => docs}/AnalyzerRules/MM0006.md | 0 {Docs2 => docs}/OtherLanguageWorkaround.md | 0 {Docs2 => docs}/README.md | 0 8 files changed, 0 insertions(+), 0 deletions(-) rename {Docs2 => docs}/AnalyzerRules/MM0001.md (100%) rename {Docs2 => docs}/AnalyzerRules/MM0002.md (100%) rename {Docs2 => docs}/AnalyzerRules/MM0003.md (100%) rename {Docs2 => docs}/AnalyzerRules/MM0004.md (100%) rename {Docs2 => docs}/AnalyzerRules/MM0005.md (100%) rename {Docs2 => docs}/AnalyzerRules/MM0006.md (100%) rename {Docs2 => docs}/OtherLanguageWorkaround.md (100%) rename {Docs2 => docs}/README.md (100%) diff --git a/Docs2/AnalyzerRules/MM0001.md b/docs/AnalyzerRules/MM0001.md similarity index 100% rename from Docs2/AnalyzerRules/MM0001.md rename to docs/AnalyzerRules/MM0001.md diff --git a/Docs2/AnalyzerRules/MM0002.md b/docs/AnalyzerRules/MM0002.md similarity index 100% rename from Docs2/AnalyzerRules/MM0002.md rename to docs/AnalyzerRules/MM0002.md diff --git a/Docs2/AnalyzerRules/MM0003.md b/docs/AnalyzerRules/MM0003.md similarity index 100% rename from Docs2/AnalyzerRules/MM0003.md rename to docs/AnalyzerRules/MM0003.md diff --git a/Docs2/AnalyzerRules/MM0004.md b/docs/AnalyzerRules/MM0004.md similarity index 100% rename from Docs2/AnalyzerRules/MM0004.md rename to docs/AnalyzerRules/MM0004.md diff --git a/Docs2/AnalyzerRules/MM0005.md b/docs/AnalyzerRules/MM0005.md similarity index 100% rename from Docs2/AnalyzerRules/MM0005.md rename to docs/AnalyzerRules/MM0005.md diff --git a/Docs2/AnalyzerRules/MM0006.md b/docs/AnalyzerRules/MM0006.md similarity index 100% rename from Docs2/AnalyzerRules/MM0006.md rename to docs/AnalyzerRules/MM0006.md diff --git a/Docs2/OtherLanguageWorkaround.md b/docs/OtherLanguageWorkaround.md similarity index 100% rename from Docs2/OtherLanguageWorkaround.md rename to docs/OtherLanguageWorkaround.md diff --git a/Docs2/README.md b/docs/README.md similarity index 100% rename from Docs2/README.md rename to docs/README.md From d8086c7b45ae01df2925eb959f87fec187a1a05d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lasse=20Sj=C3=B8rup?= Date: Fri, 11 Oct 2024 14:28:48 +0200 Subject: [PATCH 04/26] Configure the layout --- docs/Troll.jpg | Bin 0 -> 255111 bytes docs/_config.yml | 6 ++++++ 2 files changed, 6 insertions(+) create mode 100644 docs/Troll.jpg create mode 100644 docs/_config.yml diff --git a/docs/Troll.jpg b/docs/Troll.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6d29ce1cdc6ebc68b3d1a4ffedb18f805eb54efa GIT binary patch literal 255111 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

Y+yBRRAw+TV7KG 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�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 Date: Sun, 13 Oct 2024 01:37:57 +0200 Subject: [PATCH 05/26] Update written documentation --- src/MiniMock/Builders/Documentation.cs | 6 +++--- src/MiniMock/Builders/Helpers.cs | 9 +++------ 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/MiniMock/Builders/Documentation.cs b/src/MiniMock/Builders/Documentation.cs index bf3a4b8..a6fec83 100644 --- a/src/MiniMock/Builders/Documentation.cs +++ b/src/MiniMock/Builders/Documentation.cs @@ -3,10 +3,10 @@ namespace MiniMock.Builders; internal static class Documentation { internal const string CallBack = "Configures the mock to execute the specified action when the method matching the signature is called."; - internal const string AcceptAny = "Configures the mock to accept any call to the method."; + internal const string AcceptAny = "Configures the mock to accept any call to the method ignoring all parameters."; internal const string ThrowsException = "Configures the mock to throw the specified exception when the method is called."; - internal const string SpecificValue = "Configures the mock to return the specific value."; + internal const string SpecificValue = "Configures the mock to return the specific value ignoring all parameters."; internal const string SpecificValueList = "Configures the mock to return the consecutive values from an enumeration of values."; - internal const string GenericTaskObject = "Configures the mock to return the specific value in a task object."; + internal const string GenericTaskObject = "Configures the mock to return the specific value wrapped in a task object ignoring all parameters."; internal const string GenericTaskFunction = "Configures the mock to call the specified function and return the value wrapped in a task object when the method matching the signature is called."; } diff --git a/src/MiniMock/Builders/Helpers.cs b/src/MiniMock/Builders/Helpers.cs index d27edc3..f4d66e5 100644 --- a/src/MiniMock/Builders/Helpers.cs +++ b/src/MiniMock/Builders/Helpers.cs @@ -2,10 +2,7 @@ namespace MiniMock.Builders; using System; using System.Collections.Generic; -using System.Collections.Immutable; -using System.Globalization; using System.Linq; -using System.Threading; using Microsoft.CodeAnalysis; public static class Helpers @@ -54,13 +51,13 @@ internal static void BuildHelpers(this List helpers, CodeBuilde grouping.Select(t => t.Documentation).Where(t => !string.IsNullOrWhiteSpace(t)).Distinct().ToList().ForEach(t => builder.Add("/// " + t)); if (grouping.Any(t => t.SeeCref != "")) { - var crefs = grouping.Select(t => t.SeeCref).Where(t => !string.IsNullOrWhiteSpace(t)).Select(t => $""); - builder.Add("/// Configures " + string.Join(", ", crefs)); + var crefs = grouping.Select(t => t.SeeCref).Where(t => !string.IsNullOrWhiteSpace(t)).Select(t => $" - "); + builder.Add("///
Applies to
" + string.Join("
", crefs)); } builder.Add($""" /// - /// The updated configuration. + /// The configured for further chaining. """); builder.Add($"public Config {name}({grouping.Key}) {{").Indent(); From 232029830fca3264754ee936e2a9702d6517c0b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lasse=20Sj=C3=B8rup?= Date: Sun, 3 Nov 2024 02:52:53 +0100 Subject: [PATCH 06/26] Documenting the ADR work that has been done --- README.md | 2 + docs/ADR/CreatingMocks.md | 22 ++++++++ docs/ADR/DoWeNeedANewMockingFramework.md | 24 +++++++++ docs/ADR/DocumentationAndExamples.md | 41 ++++++++++++++ docs/ADR/HowStrictShouldMiniMockBe.md | 22 ++++++++ docs/ADR/LoggingAndDebugging.md | 54 +++++++++++++++++++ docs/ADR/MatchingTargetApi.md | 22 ++++++++ docs/ADR/NoBuiltInAssertionFeature.md | 22 ++++++++ docs/ADR/NoDependencies.md | 24 +++++++++ docs/ADR/README.md | 42 +++++++++++++++ docs/ADR/SupportSkippingArguments.md | 21 ++++++++ .../feature/SupportForClassesAndInterfaces.md | 23 ++++++++ docs/ADR/feature/SupportForConstructors.md | 24 +++++++++ docs/ADR/feature/SupportForEvents.md | 27 ++++++++++ docs/ADR/feature/SupportForIndexers.md | 28 ++++++++++ docs/ADR/feature/SupportForMethods.md | 33 ++++++++++++ docs/ADR/feature/SupportForProperties.md | 33 ++++++++++++ .../ADR/feature/SupportingProtectedMethods.md | 23 ++++++++ 18 files changed, 487 insertions(+) create mode 100644 docs/ADR/CreatingMocks.md create mode 100644 docs/ADR/DoWeNeedANewMockingFramework.md create mode 100644 docs/ADR/DocumentationAndExamples.md create mode 100644 docs/ADR/HowStrictShouldMiniMockBe.md create mode 100644 docs/ADR/LoggingAndDebugging.md create mode 100644 docs/ADR/MatchingTargetApi.md create mode 100644 docs/ADR/NoBuiltInAssertionFeature.md create mode 100644 docs/ADR/NoDependencies.md create mode 100644 docs/ADR/README.md create mode 100644 docs/ADR/SupportSkippingArguments.md create mode 100644 docs/ADR/feature/SupportForClassesAndInterfaces.md create mode 100644 docs/ADR/feature/SupportForConstructors.md create mode 100644 docs/ADR/feature/SupportForEvents.md create mode 100644 docs/ADR/feature/SupportForIndexers.md create mode 100644 docs/ADR/feature/SupportForMethods.md create mode 100644 docs/ADR/feature/SupportForProperties.md create mode 100644 docs/ADR/feature/SupportingProtectedMethods.md diff --git a/README.md b/README.md index b38ea02..1e1883b 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,8 @@ MiniMock offers a _minimalistic_ approach to mocking in .NET. It is designed to MiniMock is __extremely strict__, requiring you to specify all features you want to mock. This is by design to make sure you are aware of what you are mocking. Unmocked features will throw an exception if used. +[View the documentation here](https://oswaldsql.github.io/MiniMock/) + ## Table of Contents - [Simple Example](#simple-example) - [Key Feature Summary](#key-feature-summary) diff --git a/docs/ADR/CreatingMocks.md b/docs/ADR/CreatingMocks.md new file mode 100644 index 0000000..d6470bd --- /dev/null +++ b/docs/ADR/CreatingMocks.md @@ -0,0 +1,22 @@ +# Decision on How to Create Mocks + +## Context + +In the MiniMock framework, there is a need to establish a standardized approach for creating mocks. A consistent and efficient method for creating mocks will enhance the usability and maintainability of the framework. + +## Decision + +Mocks will be created using a mock factory. The mock factory will provide a centralized and consistent way to create and configure mocks, ensuring that all mocks are created following the same process and standards. + +## Consequences + +### Positive: + +- **Consistency**: Ensures that all mocks are created in a consistent manner. +- **Centralization**: Provides a single point of control for mock creation, making it easier to manage and update. +- **Ease of Use**: Simplifies the process of creating mocks for developers. + +### Negative: + +- **Complexity**: Introduces an additional layer of abstraction, which may add some complexity to the framework. +- **Maintenance**: Requires ongoing maintenance to ensure the mock factory remains up-to-date with any changes to the framework. diff --git a/docs/ADR/DoWeNeedANewMockingFramework.md b/docs/ADR/DoWeNeedANewMockingFramework.md new file mode 100644 index 0000000..cea63b1 --- /dev/null +++ b/docs/ADR/DoWeNeedANewMockingFramework.md @@ -0,0 +1,24 @@ +# Need for a New Mocking Framework + +## Context + +Existing mocking frameworks in the .NET ecosystem often come with clunky APIs and external dependencies that can complicate the development process. These frameworks may offer extensive features, but they can also introduce unnecessary complexity and bloat, making them less suitable for projects that prioritize simplicity and minimalism. + +## Decision + +We will develop a new mocking framework, MiniMock, that focuses on providing a minimalistic and straightforward API. This framework will avoid external dependencies to ensure ease of use and integration. + +## Consequences + +### Positive: + +- **Simplicity**: A minimalistic API will make the framework easier to learn and use, reducing the learning curve for new developers. +- **No External Dependencies**: By avoiding external dependencies, the framework will be easier to integrate and maintain, reducing potential conflicts and bloat. +- **Performance**: A lightweight framework can offer better performance due to reduced overhead. +- **Control**: Greater control over the framework's features and behavior, ensuring it meets the specific needs of the project. + +### Negative: + +- **Feature Limitations**: The framework may lack some advanced features found in more comprehensive mocking frameworks. +- **Development Effort**: Additional effort will be required to develop and maintain the new framework. +- **Adoption**: Convincing developers to switch to a new framework may be challenging, especially if they are accustomed to existing solutions. diff --git a/docs/ADR/DocumentationAndExamples.md b/docs/ADR/DocumentationAndExamples.md new file mode 100644 index 0000000..d5656b3 --- /dev/null +++ b/docs/ADR/DocumentationAndExamples.md @@ -0,0 +1,41 @@ +# Approach to Documentation and Examples + +## Context + +Effective documentation and examples are crucial for the adoption and proper use of any framework. Clear and concise documentation helps developers understand the framework's features and usage. Providing relevant examples can further illustrate how to implement and utilize the framework in real-world scenarios. + +## Decision + +We will create concise documentation and examples for the MiniMock framework. The documentation will cover essential aspects of the framework, including installation, configuration, and usage. Examples will be provided to demonstrate common use cases. + +## Status + +Accepted + +## Consequences + +### Positive: + +- **Clarity**: Clear and concise documentation will help developers understand how to use the framework effectively. +- **Adoption**: Good documentation and examples can increase the adoption rate of the framework. +- **Support**: Reduces the need for support by providing answers to common questions and issues. +- **Consistency**: Ensures consistent usage of the framework across different projects. + +### Negative: + +- **Effort**: Requires effort to create and maintain concise documentation and examples. +- **Maintenance**: Documentation must be kept up-to-date with any changes or updates to the framework. + +## Documentation Structure + +1. **Introduction**: Overview of the framework, its purpose, and key features. +2. **Getting Started**: Instructions on how to install and configure the framework. +3. **Usage Guide**: Detailed guide on how to use the framework, including API references. +4. **Examples**: Practical examples demonstrating common use cases. +5. **FAQ**: Frequently asked questions and troubleshooting tips. + +## Examples + +- **Basic Mocking**: Simple example showing how to create and use a mock. +- **Advanced Mocking**: Examples of more complex scenarios, such as mocking protected methods and handling asynchronous methods. +- **Integration**: Examples showing how to integrate the framework with other tools and libraries. diff --git a/docs/ADR/HowStrictShouldMiniMockBe.md b/docs/ADR/HowStrictShouldMiniMockBe.md new file mode 100644 index 0000000..fa25475 --- /dev/null +++ b/docs/ADR/HowStrictShouldMiniMockBe.md @@ -0,0 +1,22 @@ +# Decision on How Strict the Framework Should Be + +## Context + +In the MiniMock framework, there is a need to determine the level of strictness when handling calls to members that are not explicitly mocked. A strict framework can help catch unintended calls and ensure that tests are precise and reliable. However, events are a special case and should not require listeners when they are called. + +## Decision + +The framework will be strict, throwing exceptions when a member that is not mocked is called. This approach ensures that all interactions are explicitly defined and helps catch unintended calls. However, events will be treated as a special case and will not require listeners when they are called. + +## Consequences + +### Positive: + +- **Precision**: Ensures that all interactions with mocks are explicitly defined, leading to more precise and reliable tests. +- **Error Detection**: Helps catch unintended calls to members that are not mocked, reducing the risk of false positives in tests. +- **Consistency**: Provides a consistent approach to handling calls to non-mocked members. + +### Negative: + +- **Strictness**: The strict approach may require more effort to set up mocks, as all interactions must be explicitly defined. +- **Event Handling**: Special handling for events may introduce some complexity in the framework. diff --git a/docs/ADR/LoggingAndDebugging.md b/docs/ADR/LoggingAndDebugging.md new file mode 100644 index 0000000..bda6f1f --- /dev/null +++ b/docs/ADR/LoggingAndDebugging.md @@ -0,0 +1,54 @@ +# Approach to Logging and Debugging + +## Context + +Effective logging and debugging are essential for the development and maintenance of the MiniMock framework. Logging helps track the setup and usage of mocks, while debugging aids in identifying and resolving issues. To make debugging tests smoother, the `DebuggerStepThrough` attribute will be used to skip over the internal framework code during debugging sessions. + +## Decision + +We will implement logging to capture events related to the setup of mocks and calls to the mocks. Additionally, the `DebuggerStepThrough` attribute will be applied to relevant parts of the framework to streamline the debugging process. Logging functionality will be planned but not yet implemented. + +## Status + +Accepted + +## Consequences + +### Positive: + +- **Traceability**: Logging provides a trace of mock setup and usage, aiding in troubleshooting and analysis. +- **Smooth Debugging**: The `DebuggerStepThrough` attribute helps developers focus on their test code rather than the internal workings of the framework. +- **Insight**: Logs offer insights into the behavior and interactions within the framework. + +### Negative: + +- **Implementation Effort**: Requires effort to implement and maintain logging functionality. +- **Performance Overhead**: Logging may introduce a slight performance overhead. + +## Implementation Plan + +1. **Logging**: Plan and design the logging mechanism to capture mock setup events and calls to mocks. +2. **DebuggerStepThrough**: Apply the `DebuggerStepThrough` attribute to relevant methods and classes to improve the debugging experience. + +## Example + +```csharp +[System.Diagnostics.DebuggerStepThrough] +public void SetupMock() +{ + // Setup mock logic + Log("Mock setup completed."); +} + +[System.Diagnostics.DebuggerStepThrough] +public void CallMock() +{ + // Call mock logic + Log("Mock method called."); +} + +private void Log(string message) +{ + // Placeholder for logging implementation + Console.WriteLine(message); +} diff --git a/docs/ADR/MatchingTargetApi.md b/docs/ADR/MatchingTargetApi.md new file mode 100644 index 0000000..d42fec7 --- /dev/null +++ b/docs/ADR/MatchingTargetApi.md @@ -0,0 +1,22 @@ +# Matching Target API in Mock API + +When creating a mocking class, the mock API must closely mirror the API of the target being mocked. This ensures that the mock can be used as a drop-in replacement for the target, facilitating seamless testing and reducing the learning curve for developers. + +## Decision + +The mock API should reflect the target API with minimal additional methods. The mock should only include methods that already exist in the target API, ensuring consistency and ease of use. + +## Status + +Accepted + +## Consequences + +### Positive: +- Developers can use the mock without learning a new API. +- Tests are more readable and maintainable as they closely resemble the actual code. +- Reduces the risk of errors due to API mismatches. + +### Negative: +- Limited flexibility in extending the mock API for advanced testing scenarios. +- May require more effort to implement certain mocking features without additional methods. diff --git a/docs/ADR/NoBuiltInAssertionFeature.md b/docs/ADR/NoBuiltInAssertionFeature.md new file mode 100644 index 0000000..ffd48ae --- /dev/null +++ b/docs/ADR/NoBuiltInAssertionFeature.md @@ -0,0 +1,22 @@ +# No Built-in Assertion Feature + +## Context + +In our mocking framework, there is a consideration to include a built-in assertion feature. However, there are numerous assertion frameworks available, each with its own strengths and user base. Including a built-in assertion feature may lead to redundancy and limit the flexibility for users to choose their preferred assertion framework. + +## Decision + +We will not include a built-in assertion feature in our mocking framework. Instead, we will rely on users to choose and use their preferred assertion framework. + +## Consequences + +### Positive: + +- **Flexibility**: Users can choose the assertion framework that best fits their needs and preferences. +- **Simplicity**: Reduces the complexity of the mocking framework by not including redundant features. +- **Interoperability**: Ensures compatibility with a wide range of existing assertion frameworks. + +### Negative: + +- **Learning Curve**: Users may need to learn and integrate a separate assertion framework if they are not already familiar with one. +- **Dependency Management**: Users will need to manage additional dependencies for their chosen assertion framework. diff --git a/docs/ADR/NoDependencies.md b/docs/ADR/NoDependencies.md new file mode 100644 index 0000000..0b5f12d --- /dev/null +++ b/docs/ADR/NoDependencies.md @@ -0,0 +1,24 @@ +# No Dependencies to Shared Libraries + +## Context + +In our project, there is a consideration to include dependencies on shared libraries. However, relying on shared libraries can introduce several challenges, including version conflicts, increased complexity, and reduced control over the project's dependencies. + +## Decision + +We will not include any dependencies on shared libraries in our project. Instead, we will aim to implement necessary functionality within the project itself or use static linking where appropriate. + +## Consequences + +### Positive: + +- **Control**: Greater control over the project's dependencies and versions. +- **Simplicity**: Reduces the complexity of managing external dependencies. +- **Stability**: Minimizes the risk of version conflicts and compatibility issues. +- **Security**: Reduces the attack surface by limiting external dependencies. + +### Negative: + +- **Development Effort**: May require additional effort to implement functionality that would otherwise be provided by shared libraries. +- **Code Duplication**: Potential for code duplication if similar functionality is needed across multiple projects. +- **Maintenance**: Increased maintenance burden as all functionality must be maintained within the project. diff --git a/docs/ADR/README.md b/docs/ADR/README.md new file mode 100644 index 0000000..4e422d5 --- /dev/null +++ b/docs/ADR/README.md @@ -0,0 +1,42 @@ +# Architecture Decision Records (ADR) + +Architecture Decision Records (ADRs) are documents that capture important architectural decisions made during the development of a MiniMock. + +All the ADRs have been approved and are considered final decisions for the project. + +## General ADRs + +- [Do We __Really__ Need a New Mocking Framework?](DoWeNeedANewMockingFramework.md) - Deciding whether to build a new mocking framework. +- [Matching Target API in Mock API](MatchingTargetApi.md) - Ensures the mock API closely mirrors the target API. +- [How Strict Should MiniMock Be?](HowStrictShouldMiniMockBe.md) - Deciding how strict the framework should be. +- [No Built-in Assertion Feature](NoBuiltInAssertionFeature.md) - Users choose their preferred assertion framework. +- [No Dependencies to Shared Libraries](NoDependencies.md) - Avoid dependencies on shared libraries. +- [Documentation and Examples](DocumentationAndExamples.md) - Approach to documentation and examples for the framework. +- [Logging and Debugging](LoggingAndDebugging.md) - Approach to logging and debugging within the framework. +- [Allowing Skipping Arguments in Mock Setup](SupportSkippingArguments.md) - Allows skipping arguments in mock setups for flexibility. +- [Creating Mocks](CreatingMocks.md) - Decision on how to create mocks in the framework. + +## Feature Specific ADRs + +- [Support for Classes and Interfaces](feature/SupportForClassesAndInterfaces.md) - Decision on supporting classes and interfaces in the mocking framework. +- [Support for Constructors](feature/SupportForConstructors.md) - Decision on supporting constructors in the mocking framework. +- [Support for Methods](feature/SupportForMethods.md) - Decision on supporting methods in the mocking framework. +- [Support for Properties](feature/SupportForProperties.md) - Decision on supporting properties in the mocking framework. +- [Support for Events](feature/SupportForEvents.md) - Decision on supporting events in the mocking framework. +- [Support for Indexers](feature/SupportForIndexers.md) - Decision on supporting indexers in the mocking framework. +- Special cases + - [Support for Protected Methods](feature/SupportingProtectedMethods.md) - Decision on whether to support mocking protected methods. + - [Support for Generic Methods (WIP)](feature/SupportForGenericMethods.md) - Decision on supporting generic methods in the mocking framework. + - [Support for Asynchronous Methods (WIP)](feature/SupportForAsynchronousMethods.md) - Handling asynchronous methods in the mocking framework. + - [Support for Virtual Methods (WIP)](feature/SupportForVirtualMethods.md) - Decision on supporting virtual methods in the mocking framework. + - [Support for Overloads (WIP)](feature/SupportForOverloads.md) - Decision on supporting method overloads in the mocking framework. + - [Support for Out and Ref Parameters (WIP)](feature/SupportForOutAndRefParameters.md) - Decision on supporting out and ref parameters in the mocking framework. + - [Support for Internal Methods (WIP)](feature/SupportForInternalMethods.md) - Decision on supporting internal methods in the mocking framework. + - [Support for Abstract Classes (WIP)](feature/SupportForAbstractClasses.md) - Decision on supporting abstract classes in the mocking framework. + - [Support for Delegates (WIP)](feature/SupportForDelegates.md) - Decision on supporting delegates in the mocking framework. + +## Unsupported Features + +- [Support for Extension Methods (WIP)](Unsupported/SupportForExtensionMethods.md) - Decision on supporting extension methods in the mocking framework. +- [Support for Sealed Classes (WIP)](Unsupported/SupportForSealedClasses.md) - Decision on supporting sealed classes in the mocking framework. +- [Support for Static Members (WIP)](Unsupported/SupportForStaticMembers.md) - Decision on supporting static members in the mocking framework. diff --git a/docs/ADR/SupportSkippingArguments.md b/docs/ADR/SupportSkippingArguments.md new file mode 100644 index 0000000..064e520 --- /dev/null +++ b/docs/ADR/SupportSkippingArguments.md @@ -0,0 +1,21 @@ +# Allowing Skipping Arguments in Mock Setup + +## Context + +In our mocking framework, we have the option to skip arguments when setting up mocks for methods. Although this feature has been found to be rarely used, it can provide significant flexibility and convenience in certain testing scenarios. + +## Decision + +We will allow the skipping of arguments when setting up mocks for methods. This will enable developers to focus on the relevant arguments and simplify the mock setup process when certain arguments are not needed for specific tests. + +## Consequences + +### Positive: +- **Flexibility**: Provides greater flexibility in setting up mocks, allowing developers to skip irrelevant arguments. +- **Convenience**: Simplifies the mock setup process, especially for methods with many parameters. +- **Focus**: Allows tests to focus on the relevant arguments, improving readability and maintainability. + +### Negative: +- **Clarity**: May reduce the clarity of tests if arguments are skipped without proper documentation. +- **Consistency**: Could lead to inconsistent mock setups across the codebase if not used judiciously. +- **Error Potential**: Increases the risk of errors if skipped arguments are assumed incorrectly.~~~~ diff --git a/docs/ADR/feature/SupportForClassesAndInterfaces.md b/docs/ADR/feature/SupportForClassesAndInterfaces.md new file mode 100644 index 0000000..d2f94d7 --- /dev/null +++ b/docs/ADR/feature/SupportForClassesAndInterfaces.md @@ -0,0 +1,23 @@ +# Decision on Supporting Classes and Interfaces + +## Context + +In the MiniMock framework, there is a need to determine the scope of support for mocking different types of members. While interfaces are the primary focus due to their flexibility and common usage in dependency injection, there is also a need to support classes to cover a broader range of use cases. + +## Decision + +The MiniMock framework will primarily focus on supporting interfaces but will also include support for classes. This approach ensures that the framework can be used in a wide variety of scenarios, providing flexibility and comprehensive mocking capabilities. + +## Consequences + +### Positive: + +- **Flexibility**: Supports a wide range of use cases by allowing both interfaces and classes to be mocked. +- **Comprehensive**: Provides a robust mocking solution that can handle various types of dependencies. +- **Usability**: Makes the framework more versatile and useful for developers. + +### Negative: + +- **Complexity**: Adding support for classes may introduce additional complexity in the framework. +- **Maintenance**: Requires ongoing maintenance to ensure both interfaces and classes are supported effectively. +f mocking scenarios. diff --git a/docs/ADR/feature/SupportForConstructors.md b/docs/ADR/feature/SupportForConstructors.md new file mode 100644 index 0000000..7d87759 --- /dev/null +++ b/docs/ADR/feature/SupportForConstructors.md @@ -0,0 +1,24 @@ +# Decision on Supporting Constructors + +## Context + +In the MiniMock framework, there is a need to determine the scope of support for mocking constructors. Initially, the framework will support only classes with parameterless constructors. This decision simplifies the initial implementation and allows for a gradual introduction of more complex constructor support. + +## Decision + +The MiniMock framework will initially support mocking only classes with parameterless constructors. A plan for adding support for classes with parameterized constructors is being developed and will be implemented in future iterations. + +Since the main focus of the framework is to provide a simple and easy-to-use mocking solution for interfaces and classes, the decision to start with parameterless constructors aligns with this goal. See ADR [Support For Classes and Interfaces](SupportForClassesAndInterfaces.md) for more information. + +## Consequences + +### Positive: + +- **Simplicity**: Simplifies the initial implementation by focusing on parameterless constructors. +- **Incremental Development**: Allows for a phased approach to adding more complex constructor support. +- **Usability**: Provides immediate value by supporting a common use case. + +### Negative: + +- **Limited Scope**: Initial support is limited to classes with parameterless constructors, which may not cover all use cases. +- **Future Work**: Additional effort will be required to implement support for parameterized constructors. diff --git a/docs/ADR/feature/SupportForEvents.md b/docs/ADR/feature/SupportForEvents.md new file mode 100644 index 0000000..a8a6f7e --- /dev/null +++ b/docs/ADR/feature/SupportForEvents.md @@ -0,0 +1,27 @@ +# Decision on Supporting Events + +## Context + +In the MiniMock framework, there is a need to determine the scope of support for mocking events. Events are a crucial part of the C# language, enabling the publisher-subscriber pattern. Supporting all types of events is essential to ensure the framework's flexibility and usability. + +## Decision + +The MiniMock framework will support mocking all types of events. This includes standard events, custom events, and events with different delegate types. This decision ensures that the framework can handle a wide range of scenarios involving event handling. + +Events must be mockable using the following parameters: + +- Raise : A method to raise the event, triggering all subscribed handlers. +- Trigger : A delegate as a out parameter to be used to trigger the event. +- Add/Remove : Delegates matching the event's add and remove signatures with functionality to be executed. + +## Consequences + +### Positive: + +- **Comprehensive**: Ensures that the framework can handle all types of events, providing flexibility and comprehensive mocking capabilities. +- **Usability**: Enhances the framework's usability by allowing developers to mock events in various scenarios. + +### Negative: + +- **Complexity**: Supporting all types of events adds complexity to the framework. +- **Maintenance**: Requires ongoing maintenance to ensure that event mocking remains robust and up-to-date. diff --git a/docs/ADR/feature/SupportForIndexers.md b/docs/ADR/feature/SupportForIndexers.md new file mode 100644 index 0000000..ab098b3 --- /dev/null +++ b/docs/ADR/feature/SupportForIndexers.md @@ -0,0 +1,28 @@ +# Decision on Supporting Indexers + +## Context + +In the MiniMock framework, there is a need to determine the scope of support for mocking indexers. Indexers allow objects to be indexed in a similar way to arrays, and supporting them is essential for a comprehensive mocking framework. + +## Decision + +The MiniMock framework will support mocking indexers. This includes both read-only and read-write indexers, ensuring that the framework can handle a wide range of scenarios. + +Indexers must be mockable using the following parameters: + +- Get/Set : Delegates matching the indexer's getter and setter signature with functionality to be executed. +- Values : A dictionary optionally containing values to be used as the indexers source. + +if none of the above parameters are provided, accessing the indexer must throw a InvalidOperationException with a message in the form "The indexer for '__[indexer type]__' in '__[mocked class]__' is not explicitly mocked.". + +## Consequences + +### Positive: + +- **Comprehensive**: Ensures that the framework can handle indexers in both classes and interfaces. +- **Flexibility**: Provides developers with the ability to mock different kinds of indexers, enhancing the framework's usability. + +### Negative: + +- **Complexity**: Supporting both read-only and read-write indexers adds complexity to the framework. +- **Maintenance**: Requires ongoing maintenance to ensure that indexer mocking remains robust and up-to-date. diff --git a/docs/ADR/feature/SupportForMethods.md b/docs/ADR/feature/SupportForMethods.md new file mode 100644 index 0000000..09939bc --- /dev/null +++ b/docs/ADR/feature/SupportForMethods.md @@ -0,0 +1,33 @@ +# Decision on Supporting Methods + +## Context + +In the MiniMock framework, there is a need to determine the scope of support for mocking methods. Supporting all standard ways of creating methods is essential to ensure the framework's flexibility and usability. However, there are currently issues with supporting methods that return `ref` values, which need to be addressed. + +## Decision + +The MiniMock framework will support all standard ways of creating methods. This includes instance methods, static methods, virtual methods, and abstract methods. However, support for methods returning `ref` values will require additional work and will be addressed in future updates. See [issue #5](https://github.com/oswaldsql/MiniMock/issues/5) + +Methods must be mockable using the following parameters + +- Call : A Delegate matching the method signature with functionality to be executed. +- Throw : An exception to be thrown when the method is called. +- Return : A value to be returned when the method is called. +- ReturnValues : A sequence of values to be returned when the method is called multiple times. +- () : Methods returning `void` can be mocked using an empty delegate. + +if none of the above parameters are provided, calling the method must throw a InvalidOperationException with a message in the form "The method '__[method name]__' in '__[mocked class]__' is not explicitly mocked.". + +Special cases like [Overloads], [Generic Methods] and [Async Methods] have dedicated ADRs. + +## Consequences + +### Positive: + +- **Comprehensive**: Ensures that the framework can handle a wide variety of method types. +- **Flexibility**: Provides developers with the ability to mock different kinds of methods, enhancing the framework's usability. + +### Negative: + +- **Complexity**: Supporting all standard methods adds complexity to the framework. +- **Ref Values**: Current issues with methods returning `ref` values need to be resolved, which may require significant effort. diff --git a/docs/ADR/feature/SupportForProperties.md b/docs/ADR/feature/SupportForProperties.md new file mode 100644 index 0000000..a897df8 --- /dev/null +++ b/docs/ADR/feature/SupportForProperties.md @@ -0,0 +1,33 @@ +# Decision on Supporting Properties + +## Context + +In the MiniMock framework, there is a need to determine the scope of support for mocking properties. Properties are a fundamental part of C# classes and interfaces, and supporting them is essential for a comprehensive mocking framework. + +## Decision + +The MiniMock framework will support mocking both read-only and read-write properties. This includes properties in classes and interfaces, ensuring that the framework can handle a wide range of scenarios. + +Properties must be mockable using the following parameters: + +- Get/set : Delegates matching the property's getter and setter signature with functionality to be executed. +- Value : A value to be returned when the property is accessed. + +Get-only and set-only properties must only allow mocking of the corresponding getter or setter. + +if none of the above parameters are provided, Getting of setting the property must throw a InvalidOperationException with a message in the form "The property '__[property name]__' in '__[mocked class]__' is not explicitly mocked.". + + +## Consequences + +### Positive: + +- **Comprehensive**: Ensures that the framework can handle properties in both classes and interfaces. +- **Flexibility**: Provides developers with the ability to mock different kinds of properties, enhancing the framework's usability. + +### Negative: + +- **Complexity**: Supporting both read-only and read-write properties adds complexity to the framework. +- **Maintenance**: Requires ongoing maintenance to ensure that property mocking remains robust and up-to-date. + +This decision ensures that the MiniMock framework supports a wide range of property types, providing flexibility and comprehensive mocking capabilities. diff --git a/docs/ADR/feature/SupportingProtectedMethods.md b/docs/ADR/feature/SupportingProtectedMethods.md new file mode 100644 index 0000000..7ff004a --- /dev/null +++ b/docs/ADR/feature/SupportingProtectedMethods.md @@ -0,0 +1,23 @@ +# Mocking Protected Methods + +## Context + +In our mocking framework, there is a consideration to support mocking protected methods. Protected methods are often used in base classes to provide functionality that is intended to be used by derived classes. Supporting the mocking of protected methods can enhance the flexibility and comprehensiveness of our testing framework. + +## Decision + +We will support the mocking of protected methods in our mocking framework. This will allow developers to create more thorough and flexible tests by enabling them to mock and verify the behavior of protected methods. + +## Consequences + +### Positive: + +- **Flexibility**: Allows developers to mock and test protected methods, providing more comprehensive test coverage. +- **Thorough Testing**: Enables testing of internal logic that is encapsulated within protected methods. +- **Consistency**: Aligns with the ability to mock public methods, providing a consistent approach to mocking. + +### Negative: + +- **Complexity**: May introduce additional complexity in the mocking framework to handle protected methods. +- **Maintenance**: Requires ongoing maintenance to ensure that mocking protected methods continues to work correctly with future updates. +- **Potential Misuse**: Developers may misuse the feature by over-mocking, leading to tests that are too tightly coupled to implementation details. From 66bb34c889e3a4d23f942774589043ffe8003628 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lasse=20Sj=C3=B8rup?= Date: Sun, 3 Nov 2024 03:02:45 +0100 Subject: [PATCH 07/26] Adding backlinks --- docs/ADR/CreatingMocks.md | 4 +++ docs/ADR/DoWeNeedANewMockingFramework.md | 4 +++ docs/ADR/DocumentationAndExamples.md | 4 +++ docs/ADR/HowStrictShouldMiniMockBe.md | 4 +++ docs/ADR/LoggingAndDebugging.md | 25 +++---------------- docs/ADR/MatchingTargetApi.md | 4 +++ docs/ADR/NoBuiltInAssertionFeature.md | 4 +++ docs/ADR/NoDependencies.md | 4 +++ docs/ADR/SupportSkippingArguments.md | 4 +++ .../feature/SupportForClassesAndInterfaces.md | 4 +++ docs/ADR/feature/SupportForConstructors.md | 4 +++ docs/ADR/feature/SupportForEvents.md | 4 +++ docs/ADR/feature/SupportForIndexers.md | 4 +++ docs/ADR/feature/SupportForMethods.md | 4 +++ docs/ADR/feature/SupportForProperties.md | 4 +++ .../ADR/feature/SupportingProtectedMethods.md | 4 +++ 16 files changed, 63 insertions(+), 22 deletions(-) diff --git a/docs/ADR/CreatingMocks.md b/docs/ADR/CreatingMocks.md index d6470bd..7442709 100644 --- a/docs/ADR/CreatingMocks.md +++ b/docs/ADR/CreatingMocks.md @@ -20,3 +20,7 @@ Mocks will be created using a mock factory. The mock factory will provide a cent - **Complexity**: Introduces an additional layer of abstraction, which may add some complexity to the framework. - **Maintenance**: Requires ongoing maintenance to ensure the mock factory remains up-to-date with any changes to the framework. + +--- + +More ADRs can be found in the [docs/ADR](../ADR/README.md) directory. diff --git a/docs/ADR/DoWeNeedANewMockingFramework.md b/docs/ADR/DoWeNeedANewMockingFramework.md index cea63b1..21d0584 100644 --- a/docs/ADR/DoWeNeedANewMockingFramework.md +++ b/docs/ADR/DoWeNeedANewMockingFramework.md @@ -22,3 +22,7 @@ We will develop a new mocking framework, MiniMock, that focuses on providing a m - **Feature Limitations**: The framework may lack some advanced features found in more comprehensive mocking frameworks. - **Development Effort**: Additional effort will be required to develop and maintain the new framework. - **Adoption**: Convincing developers to switch to a new framework may be challenging, especially if they are accustomed to existing solutions. + +--- + +More ADRs can be found in the [docs/ADR](../ADR/README.md) directory. diff --git a/docs/ADR/DocumentationAndExamples.md b/docs/ADR/DocumentationAndExamples.md index d5656b3..e3a710c 100644 --- a/docs/ADR/DocumentationAndExamples.md +++ b/docs/ADR/DocumentationAndExamples.md @@ -39,3 +39,7 @@ Accepted - **Basic Mocking**: Simple example showing how to create and use a mock. - **Advanced Mocking**: Examples of more complex scenarios, such as mocking protected methods and handling asynchronous methods. - **Integration**: Examples showing how to integrate the framework with other tools and libraries. + +--- + +More ADRs can be found in the [docs/ADR](../ADR/README.md) directory. diff --git a/docs/ADR/HowStrictShouldMiniMockBe.md b/docs/ADR/HowStrictShouldMiniMockBe.md index fa25475..4b62144 100644 --- a/docs/ADR/HowStrictShouldMiniMockBe.md +++ b/docs/ADR/HowStrictShouldMiniMockBe.md @@ -20,3 +20,7 @@ The framework will be strict, throwing exceptions when a member that is not mock - **Strictness**: The strict approach may require more effort to set up mocks, as all interactions must be explicitly defined. - **Event Handling**: Special handling for events may introduce some complexity in the framework. + +--- + +More ADRs can be found in the [docs/ADR](../ADR/README.md) directory. diff --git a/docs/ADR/LoggingAndDebugging.md b/docs/ADR/LoggingAndDebugging.md index bda6f1f..44b4958 100644 --- a/docs/ADR/LoggingAndDebugging.md +++ b/docs/ADR/LoggingAndDebugging.md @@ -30,25 +30,6 @@ Accepted 1. **Logging**: Plan and design the logging mechanism to capture mock setup events and calls to mocks. 2. **DebuggerStepThrough**: Apply the `DebuggerStepThrough` attribute to relevant methods and classes to improve the debugging experience. -## Example - -```csharp -[System.Diagnostics.DebuggerStepThrough] -public void SetupMock() -{ - // Setup mock logic - Log("Mock setup completed."); -} - -[System.Diagnostics.DebuggerStepThrough] -public void CallMock() -{ - // Call mock logic - Log("Mock method called."); -} - -private void Log(string message) -{ - // Placeholder for logging implementation - Console.WriteLine(message); -} +--- + +More ADRs can be found in the [docs/ADR](../ADR/README.md) directory. diff --git a/docs/ADR/MatchingTargetApi.md b/docs/ADR/MatchingTargetApi.md index d42fec7..9973078 100644 --- a/docs/ADR/MatchingTargetApi.md +++ b/docs/ADR/MatchingTargetApi.md @@ -20,3 +20,7 @@ Accepted ### Negative: - Limited flexibility in extending the mock API for advanced testing scenarios. - May require more effort to implement certain mocking features without additional methods. + +--- + +More ADRs can be found in the [docs/ADR](../ADR/README.md) directory. diff --git a/docs/ADR/NoBuiltInAssertionFeature.md b/docs/ADR/NoBuiltInAssertionFeature.md index ffd48ae..5254ca8 100644 --- a/docs/ADR/NoBuiltInAssertionFeature.md +++ b/docs/ADR/NoBuiltInAssertionFeature.md @@ -20,3 +20,7 @@ We will not include a built-in assertion feature in our mocking framework. Inste - **Learning Curve**: Users may need to learn and integrate a separate assertion framework if they are not already familiar with one. - **Dependency Management**: Users will need to manage additional dependencies for their chosen assertion framework. + +--- + +More ADRs can be found in the [docs/ADR](../ADR/README.md) directory. diff --git a/docs/ADR/NoDependencies.md b/docs/ADR/NoDependencies.md index 0b5f12d..78dd181 100644 --- a/docs/ADR/NoDependencies.md +++ b/docs/ADR/NoDependencies.md @@ -22,3 +22,7 @@ We will not include any dependencies on shared libraries in our project. Instead - **Development Effort**: May require additional effort to implement functionality that would otherwise be provided by shared libraries. - **Code Duplication**: Potential for code duplication if similar functionality is needed across multiple projects. - **Maintenance**: Increased maintenance burden as all functionality must be maintained within the project. + +--- + +More ADRs can be found in the [docs/ADR](../ADR/README.md) directory. diff --git a/docs/ADR/SupportSkippingArguments.md b/docs/ADR/SupportSkippingArguments.md index 064e520..a514133 100644 --- a/docs/ADR/SupportSkippingArguments.md +++ b/docs/ADR/SupportSkippingArguments.md @@ -19,3 +19,7 @@ We will allow the skipping of arguments when setting up mocks for methods. This - **Clarity**: May reduce the clarity of tests if arguments are skipped without proper documentation. - **Consistency**: Could lead to inconsistent mock setups across the codebase if not used judiciously. - **Error Potential**: Increases the risk of errors if skipped arguments are assumed incorrectly.~~~~ + +--- + +More ADRs can be found in the [docs/ADR](../ADR/README.md) directory. diff --git a/docs/ADR/feature/SupportForClassesAndInterfaces.md b/docs/ADR/feature/SupportForClassesAndInterfaces.md index d2f94d7..62a07b8 100644 --- a/docs/ADR/feature/SupportForClassesAndInterfaces.md +++ b/docs/ADR/feature/SupportForClassesAndInterfaces.md @@ -21,3 +21,7 @@ The MiniMock framework will primarily focus on supporting interfaces but will al - **Complexity**: Adding support for classes may introduce additional complexity in the framework. - **Maintenance**: Requires ongoing maintenance to ensure both interfaces and classes are supported effectively. f mocking scenarios. + +--- + +More ADRs can be found in the [docs/ADR](../README.md) directory. diff --git a/docs/ADR/feature/SupportForConstructors.md b/docs/ADR/feature/SupportForConstructors.md index 7d87759..554c47c 100644 --- a/docs/ADR/feature/SupportForConstructors.md +++ b/docs/ADR/feature/SupportForConstructors.md @@ -22,3 +22,7 @@ Since the main focus of the framework is to provide a simple and easy-to-use moc - **Limited Scope**: Initial support is limited to classes with parameterless constructors, which may not cover all use cases. - **Future Work**: Additional effort will be required to implement support for parameterized constructors. + +--- + +More ADRs can be found in the [docs/ADR](../README.md) directory. diff --git a/docs/ADR/feature/SupportForEvents.md b/docs/ADR/feature/SupportForEvents.md index a8a6f7e..b91f4ea 100644 --- a/docs/ADR/feature/SupportForEvents.md +++ b/docs/ADR/feature/SupportForEvents.md @@ -25,3 +25,7 @@ Events must be mockable using the following parameters: - **Complexity**: Supporting all types of events adds complexity to the framework. - **Maintenance**: Requires ongoing maintenance to ensure that event mocking remains robust and up-to-date. + +--- + +More ADRs can be found in the [docs/ADR](../README.md) directory. diff --git a/docs/ADR/feature/SupportForIndexers.md b/docs/ADR/feature/SupportForIndexers.md index ab098b3..6a1ca50 100644 --- a/docs/ADR/feature/SupportForIndexers.md +++ b/docs/ADR/feature/SupportForIndexers.md @@ -26,3 +26,7 @@ if none of the above parameters are provided, accessing the indexer must throw a - **Complexity**: Supporting both read-only and read-write indexers adds complexity to the framework. - **Maintenance**: Requires ongoing maintenance to ensure that indexer mocking remains robust and up-to-date. + +--- + +More ADRs can be found in the [docs/ADR](../README.md) directory. diff --git a/docs/ADR/feature/SupportForMethods.md b/docs/ADR/feature/SupportForMethods.md index 09939bc..3d38120 100644 --- a/docs/ADR/feature/SupportForMethods.md +++ b/docs/ADR/feature/SupportForMethods.md @@ -31,3 +31,7 @@ Special cases like [Overloads], [Generic Methods] and [Async Methods] have dedic - **Complexity**: Supporting all standard methods adds complexity to the framework. - **Ref Values**: Current issues with methods returning `ref` values need to be resolved, which may require significant effort. + +--- + +More ADRs can be found in the [docs/ADR](../README.md) directory. diff --git a/docs/ADR/feature/SupportForProperties.md b/docs/ADR/feature/SupportForProperties.md index a897df8..4ea5c43 100644 --- a/docs/ADR/feature/SupportForProperties.md +++ b/docs/ADR/feature/SupportForProperties.md @@ -31,3 +31,7 @@ if none of the above parameters are provided, Getting of setting the property mu - **Maintenance**: Requires ongoing maintenance to ensure that property mocking remains robust and up-to-date. This decision ensures that the MiniMock framework supports a wide range of property types, providing flexibility and comprehensive mocking capabilities. + +--- + +More ADRs can be found in the [docs/ADR](../README.md) directory. diff --git a/docs/ADR/feature/SupportingProtectedMethods.md b/docs/ADR/feature/SupportingProtectedMethods.md index 7ff004a..07c1726 100644 --- a/docs/ADR/feature/SupportingProtectedMethods.md +++ b/docs/ADR/feature/SupportingProtectedMethods.md @@ -21,3 +21,7 @@ We will support the mocking of protected methods in our mocking framework. This - **Complexity**: May introduce additional complexity in the mocking framework to handle protected methods. - **Maintenance**: Requires ongoing maintenance to ensure that mocking protected methods continues to work correctly with future updates. - **Potential Misuse**: Developers may misuse the feature by over-mocking, leading to tests that are too tightly coupled to implementation details. + +--- + +More ADRs can be found in the [docs/ADR](../README.md) directory. From 8867397e1210062b22b7dce1e99981b2e0e46f27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lasse=20Sj=C3=B8rup?= Date: Sun, 3 Nov 2024 12:24:31 +0100 Subject: [PATCH 08/26] Moving documentation around to limit folder clutter --- docs/ADR/README.md | 18 +++++++++--------- .../feature/SupportForClassesAndInterfaces.md | 7 ++++--- docs/ADR/feature/SupportForConstructors.md | 9 ++++++--- .../{ => feature}/SupportSkippingArguments.md | 2 +- docs/ADR/{ => general}/CreatingMocks.md | 2 +- .../DoWeNeedANewMockingFramework.md | 2 +- .../{ => general}/DocumentationAndExamples.md | 2 +- .../{ => general}/HowStrictShouldMiniMockBe.md | 2 +- docs/ADR/{ => general}/LoggingAndDebugging.md | 2 +- docs/ADR/{ => general}/MatchingTargetApi.md | 8 +++++--- .../{ => general}/NoBuiltInAssertionFeature.md | 2 +- docs/ADR/{ => general}/NoDependencies.md | 2 +- docs/_config.yml | 2 +- 13 files changed, 33 insertions(+), 27 deletions(-) rename docs/ADR/{ => feature}/SupportSkippingArguments.md (94%) rename docs/ADR/{ => general}/CreatingMocks.md (93%) rename docs/ADR/{ => general}/DoWeNeedANewMockingFramework.md (95%) rename docs/ADR/{ => general}/DocumentationAndExamples.md (96%) rename docs/ADR/{ => general}/HowStrictShouldMiniMockBe.md (95%) rename docs/ADR/{ => general}/LoggingAndDebugging.md (95%) rename docs/ADR/{ => general}/MatchingTargetApi.md (61%) rename docs/ADR/{ => general}/NoBuiltInAssertionFeature.md (94%) rename docs/ADR/{ => general}/NoDependencies.md (94%) diff --git a/docs/ADR/README.md b/docs/ADR/README.md index 4e422d5..5dd3b59 100644 --- a/docs/ADR/README.md +++ b/docs/ADR/README.md @@ -6,15 +6,14 @@ All the ADRs have been approved and are considered final decisions for the proje ## General ADRs -- [Do We __Really__ Need a New Mocking Framework?](DoWeNeedANewMockingFramework.md) - Deciding whether to build a new mocking framework. -- [Matching Target API in Mock API](MatchingTargetApi.md) - Ensures the mock API closely mirrors the target API. -- [How Strict Should MiniMock Be?](HowStrictShouldMiniMockBe.md) - Deciding how strict the framework should be. -- [No Built-in Assertion Feature](NoBuiltInAssertionFeature.md) - Users choose their preferred assertion framework. -- [No Dependencies to Shared Libraries](NoDependencies.md) - Avoid dependencies on shared libraries. -- [Documentation and Examples](DocumentationAndExamples.md) - Approach to documentation and examples for the framework. -- [Logging and Debugging](LoggingAndDebugging.md) - Approach to logging and debugging within the framework. -- [Allowing Skipping Arguments in Mock Setup](SupportSkippingArguments.md) - Allows skipping arguments in mock setups for flexibility. -- [Creating Mocks](CreatingMocks.md) - Decision on how to create mocks in the framework. +- [Do We __Really__ Need a New Mocking Framework?](general/DoWeNeedANewMockingFramework.md) - Deciding whether to build a new mocking framework. +- [Matching Target API in Mock API](general/MatchingTargetApi.md) - Ensures the mock API closely mirrors the target API. +- [How Strict Should MiniMock Be?](general/HowStrictShouldMiniMockBe.md) - Deciding how strict the framework should be. +- [No Built-in Assertion Feature](general/NoBuiltInAssertionFeature.md) - Users choose their preferred assertion framework. +- [No Dependencies to Shared Libraries](general/NoDependencies.md) - Avoid dependencies on shared libraries. +- [Documentation and Examples](general/DocumentationAndExamples.md) - Approach to documentation and examples for the framework. +- [Logging and Debugging](general/LoggingAndDebugging.md) - Approach to logging and debugging within the framework. +- [Creating Mocks](general/CreatingMocks.md) - Decision on how to create mocks in the framework. ## Feature Specific ADRs @@ -25,6 +24,7 @@ All the ADRs have been approved and are considered final decisions for the proje - [Support for Events](feature/SupportForEvents.md) - Decision on supporting events in the mocking framework. - [Support for Indexers](feature/SupportForIndexers.md) - Decision on supporting indexers in the mocking framework. - Special cases + - [Allowing Skipping Arguments in Mock Setup](general/SupportSkippingArguments.md) - Allows skipping arguments in mock setups for flexibility. - [Support for Protected Methods](feature/SupportingProtectedMethods.md) - Decision on whether to support mocking protected methods. - [Support for Generic Methods (WIP)](feature/SupportForGenericMethods.md) - Decision on supporting generic methods in the mocking framework. - [Support for Asynchronous Methods (WIP)](feature/SupportForAsynchronousMethods.md) - Handling asynchronous methods in the mocking framework. diff --git a/docs/ADR/feature/SupportForClassesAndInterfaces.md b/docs/ADR/feature/SupportForClassesAndInterfaces.md index 62a07b8..1febb03 100644 --- a/docs/ADR/feature/SupportForClassesAndInterfaces.md +++ b/docs/ADR/feature/SupportForClassesAndInterfaces.md @@ -2,11 +2,13 @@ ## Context -In the MiniMock framework, there is a need to determine the scope of support for mocking different types of members. While interfaces are the primary focus due to their flexibility and common usage in dependency injection, there is also a need to support classes to cover a broader range of use cases. +In the MiniMock framework, there is a need to determine the scope of support for mocking different types of members. +While interfaces are the primary focus due to their flexibility and common usage in dependency injection, there is also a need to support classes to cover a broader range of use cases. ## Decision -The MiniMock framework will primarily focus on supporting interfaces but will also include support for classes. This approach ensures that the framework can be used in a wide variety of scenarios, providing flexibility and comprehensive mocking capabilities. +The MiniMock framework will primarily focus on supporting interfaces but will also include support for classes. +This approach ensures that the framework can be used in a wide variety of scenarios, providing flexibility and comprehensive mocking capabilities. ## Consequences @@ -20,7 +22,6 @@ The MiniMock framework will primarily focus on supporting interfaces but will al - **Complexity**: Adding support for classes may introduce additional complexity in the framework. - **Maintenance**: Requires ongoing maintenance to ensure both interfaces and classes are supported effectively. -f mocking scenarios. --- diff --git a/docs/ADR/feature/SupportForConstructors.md b/docs/ADR/feature/SupportForConstructors.md index 554c47c..c3a282f 100644 --- a/docs/ADR/feature/SupportForConstructors.md +++ b/docs/ADR/feature/SupportForConstructors.md @@ -2,13 +2,16 @@ ## Context -In the MiniMock framework, there is a need to determine the scope of support for mocking constructors. Initially, the framework will support only classes with parameterless constructors. This decision simplifies the initial implementation and allows for a gradual introduction of more complex constructor support. +In the MiniMock framework, there is a need to determine the scope of support for mocking constructors. Initially, the framework will support only classes with parameterless constructors. +This decision simplifies the initial implementation and allows for a gradual introduction of more complex constructor support. ## Decision -The MiniMock framework will initially support mocking only classes with parameterless constructors. A plan for adding support for classes with parameterized constructors is being developed and will be implemented in future iterations. +The MiniMock framework will initially support mocking only classes with parameterless constructors. +A plan for adding support for classes with parameterized constructors is being developed and will be implemented in future iterations. -Since the main focus of the framework is to provide a simple and easy-to-use mocking solution for interfaces and classes, the decision to start with parameterless constructors aligns with this goal. See ADR [Support For Classes and Interfaces](SupportForClassesAndInterfaces.md) for more information. +Since the main focus of the framework is to provide a simple and easy-to-use mocking solution for interfaces and classes, +the decision to start with parameterless constructors aligns with this goal. See ADR [Support For Classes and Interfaces](SupportForClassesAndInterfaces.md) for more information. ## Consequences diff --git a/docs/ADR/SupportSkippingArguments.md b/docs/ADR/feature/SupportSkippingArguments.md similarity index 94% rename from docs/ADR/SupportSkippingArguments.md rename to docs/ADR/feature/SupportSkippingArguments.md index a514133..e0770ed 100644 --- a/docs/ADR/SupportSkippingArguments.md +++ b/docs/ADR/feature/SupportSkippingArguments.md @@ -22,4 +22,4 @@ We will allow the skipping of arguments when setting up mocks for methods. This --- -More ADRs can be found in the [docs/ADR](../ADR/README.md) directory. +More ADRs can be found in the [docs/ADR](../README.md) directory. diff --git a/docs/ADR/CreatingMocks.md b/docs/ADR/general/CreatingMocks.md similarity index 93% rename from docs/ADR/CreatingMocks.md rename to docs/ADR/general/CreatingMocks.md index 7442709..12e7955 100644 --- a/docs/ADR/CreatingMocks.md +++ b/docs/ADR/general/CreatingMocks.md @@ -23,4 +23,4 @@ Mocks will be created using a mock factory. The mock factory will provide a cent --- -More ADRs can be found in the [docs/ADR](../ADR/README.md) directory. +More ADRs can be found in the [docs/ADR](../README.md) directory. diff --git a/docs/ADR/DoWeNeedANewMockingFramework.md b/docs/ADR/general/DoWeNeedANewMockingFramework.md similarity index 95% rename from docs/ADR/DoWeNeedANewMockingFramework.md rename to docs/ADR/general/DoWeNeedANewMockingFramework.md index 21d0584..bfbb059 100644 --- a/docs/ADR/DoWeNeedANewMockingFramework.md +++ b/docs/ADR/general/DoWeNeedANewMockingFramework.md @@ -25,4 +25,4 @@ We will develop a new mocking framework, MiniMock, that focuses on providing a m --- -More ADRs can be found in the [docs/ADR](../ADR/README.md) directory. +More ADRs can be found in the [docs/ADR](../README.md) directory. diff --git a/docs/ADR/DocumentationAndExamples.md b/docs/ADR/general/DocumentationAndExamples.md similarity index 96% rename from docs/ADR/DocumentationAndExamples.md rename to docs/ADR/general/DocumentationAndExamples.md index e3a710c..979a6e9 100644 --- a/docs/ADR/DocumentationAndExamples.md +++ b/docs/ADR/general/DocumentationAndExamples.md @@ -42,4 +42,4 @@ Accepted --- -More ADRs can be found in the [docs/ADR](../ADR/README.md) directory. +More ADRs can be found in the [docs/ADR](../README.md) directory. diff --git a/docs/ADR/HowStrictShouldMiniMockBe.md b/docs/ADR/general/HowStrictShouldMiniMockBe.md similarity index 95% rename from docs/ADR/HowStrictShouldMiniMockBe.md rename to docs/ADR/general/HowStrictShouldMiniMockBe.md index 4b62144..7b1bd64 100644 --- a/docs/ADR/HowStrictShouldMiniMockBe.md +++ b/docs/ADR/general/HowStrictShouldMiniMockBe.md @@ -23,4 +23,4 @@ The framework will be strict, throwing exceptions when a member that is not mock --- -More ADRs can be found in the [docs/ADR](../ADR/README.md) directory. +More ADRs can be found in the [docs/ADR](../README.md) directory. diff --git a/docs/ADR/LoggingAndDebugging.md b/docs/ADR/general/LoggingAndDebugging.md similarity index 95% rename from docs/ADR/LoggingAndDebugging.md rename to docs/ADR/general/LoggingAndDebugging.md index 44b4958..74f2047 100644 --- a/docs/ADR/LoggingAndDebugging.md +++ b/docs/ADR/general/LoggingAndDebugging.md @@ -32,4 +32,4 @@ Accepted --- -More ADRs can be found in the [docs/ADR](../ADR/README.md) directory. +More ADRs can be found in the [docs/ADR](../README.md) directory. diff --git a/docs/ADR/MatchingTargetApi.md b/docs/ADR/general/MatchingTargetApi.md similarity index 61% rename from docs/ADR/MatchingTargetApi.md rename to docs/ADR/general/MatchingTargetApi.md index 9973078..13a8d13 100644 --- a/docs/ADR/MatchingTargetApi.md +++ b/docs/ADR/general/MatchingTargetApi.md @@ -1,10 +1,12 @@ # Matching Target API in Mock API -When creating a mocking class, the mock API must closely mirror the API of the target being mocked. This ensures that the mock can be used as a drop-in replacement for the target, facilitating seamless testing and reducing the learning curve for developers. +When creating a mocking class, the mock API must closely mirror the API of the target being mocked. +This ensures that the mock can be used as a drop-in replacement for the target, facilitating seamless testing and reducing the learning curve for developers. ## Decision -The mock API should reflect the target API with minimal additional methods. The mock should only include methods that already exist in the target API, ensuring consistency and ease of use. +The mock API should reflect the target API with minimal additional methods. +The mock should only include methods that already exist in the target API, ensuring consistency and ease of use. ## Status @@ -23,4 +25,4 @@ Accepted --- -More ADRs can be found in the [docs/ADR](../ADR/README.md) directory. +More ADRs can be found in the [docs/ADR](../README.md) directory. diff --git a/docs/ADR/NoBuiltInAssertionFeature.md b/docs/ADR/general/NoBuiltInAssertionFeature.md similarity index 94% rename from docs/ADR/NoBuiltInAssertionFeature.md rename to docs/ADR/general/NoBuiltInAssertionFeature.md index 5254ca8..505c1f7 100644 --- a/docs/ADR/NoBuiltInAssertionFeature.md +++ b/docs/ADR/general/NoBuiltInAssertionFeature.md @@ -23,4 +23,4 @@ We will not include a built-in assertion feature in our mocking framework. Inste --- -More ADRs can be found in the [docs/ADR](../ADR/README.md) directory. +More ADRs can be found in the [docs/ADR](../README.md) directory. diff --git a/docs/ADR/NoDependencies.md b/docs/ADR/general/NoDependencies.md similarity index 94% rename from docs/ADR/NoDependencies.md rename to docs/ADR/general/NoDependencies.md index 78dd181..cf413b1 100644 --- a/docs/ADR/NoDependencies.md +++ b/docs/ADR/general/NoDependencies.md @@ -25,4 +25,4 @@ We will not include any dependencies on shared libraries in our project. Instead --- -More ADRs can be found in the [docs/ADR](../ADR/README.md) directory. +More ADRs can be found in the [docs/ADR](../README.md) directory. diff --git a/docs/_config.yml b/docs/_config.yml index daf5089..e2fb5af 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -1,6 +1,6 @@ title: MiniMock logo: Troll.jpg description: Minimalistic approach to mocking in .NET -remote_theme: pages-themes/modernist@v0.2.0 +remote_theme: pages-themes/hacker@v0.2.0 plugins: - jekyll-remote-theme # add this line to the plugins list if you already have one From c195433ca15dc860a22fdfcef1741544b32442e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lasse=20Sj=C3=B8rup?= Date: Sat, 9 Nov 2024 01:25:53 +0100 Subject: [PATCH 09/26] Adding more guides --- docs/README.md | 265 ++++--------------------------- docs/guide/getting-started.md | 46 ++++++ docs/guide/img.png | Bin 0 -> 3640 bytes docs/guide/img_1.png | Bin 0 -> 18130 bytes docs/guide/img_2.png | Bin 0 -> 18130 bytes docs/guide/img_3.png | Bin 0 -> 18130 bytes docs/guide/methods.md | 87 ++++++++++ docs/guide/mocking-guidelines.md | 154 ++++++++++++++++++ docs/guide/properties.md | 3 + 9 files changed, 318 insertions(+), 237 deletions(-) create mode 100644 docs/guide/getting-started.md create mode 100644 docs/guide/img.png create mode 100644 docs/guide/img_1.png create mode 100644 docs/guide/img_2.png create mode 100644 docs/guide/img_3.png create mode 100644 docs/guide/methods.md create mode 100644 docs/guide/mocking-guidelines.md create mode 100644 docs/guide/properties.md diff --git a/docs/README.md b/docs/README.md index b38ea02..79dc6b3 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,248 +1,39 @@ # MiniMock -MiniMock offers a _minimalistic_ approach to mocking in .NET. It is designed to be simple to use and easy to understand. It is not as feature-rich as other mocking frameworks but aims to solve __95%__ of the use cases. For the remaining __5%__, you should consider creating a custom mock. - -MiniMock is __extremely strict__, requiring you to specify all features you want to mock. This is by design to make sure you are aware of what you are mocking. Unmocked features will throw an exception if used. - -## Table of Contents -- [Simple Example](#simple-example) -- [Key Feature Summary](#key-feature-summary) -- [Limitations](#limitations) -- [Installation & Initialization](#installation--initialization) -- [Quality of Life Features](#quality-of-life-features) - - [Fluent Interface](#fluent-interface) - - [Simple Return Values](#simple-return-values) - - [Multiple Return Values](#multiple-return-values) - - [Intercept Method Calls](#intercept-method-calls) - - [Async Methods](#async-methods) - - [Strict Mocking](#strict-mocking) - - [Adding Indexers](#adding-indexers) - - [Raising Events](#raising-events) - - [Argument Matching](#argument-matching) - -## Simple Example - -```csharp -public interface IVersionLibrary -{ - bool DownloadExists(string version); -} - -[Fact] -[Mock] -public void SimpleExample() -{ - var library = Mock.IVersionLibrary(config => - config.DownloadExists(returns: true)); - - var actual = library.DownloadExists("2.0.0.0"); - - Assert.True(actual); -} -``` - -## Key Feature Summary - -- Minimalistic API with fluent method chaining, documentation, and full IntelliSense -- Mocking of interfaces, abstract classes, and virtual methods (with limitations) -- Mocking of methods, properties, indexers, and events -- Simple factory methods to initialize mocks -- Mocking of async methods, overloads, and generic methods -- Ref and out parameters in methods supported -- Generic interfaces supported - -## Limitations - -- No validation of calls -- Only supports C# (workarounds exist for VB.NET and F#) -- Ref return values and ref properties are not supported ([issue #5](https://github.com/oswaldsql/MiniMock/issues/5)) -- Partial mocking of classes - - Base classes with constructors with parameters are not currently supported ([Issue #4](https://github.com/oswaldsql/MiniMock/issues/4)) -- No support for static classes or methods - -## Installation & Initialization - -Reference the NuGet package in your test project: - -```sh -dotnet add package MiniMock -``` - -Specify which interface to mock by using the `[Mock]` attribute before your test or test class: - -```csharp -[Fact] -[Mock] // Specify which interface to mock -public void MyTest() { - var mockRepo = Mock.IMyRepository(config => config // Create a mock using the mock factory - .CreateCustomerAsync(return: Guid.NewGuid()) // Configure your mock to your needs - ); - var sut = new CustomerMaintenance(mockRepo); // Inject the mock into your system under test - - sut.Create(customerDTO, cancellationToken); -} -``` - -## Quality of Life Features - -### Fluent Interface - -All mockable members are available through a _fluent interface_ with _IntelliSense_, _type safety_, and _documentation_. - -Since the mock code is generated at development time, you can _inspect_, _step into_, and _debug_ the code. This also allows for _security_ and _vulnerability scanning_ of the code. - -All code required to run MiniMock is generated and has _no runtime dependencies_. - -### Simple Return Values - -Simply specify what you expect returned from methods or properties. All parameters are ignored. +MiniMock offers a _minimalistic_ approach to mocking in .NET with a focus on simplicity and ease of use. ```csharp -var mockLibrary = Mock.IVersionLibrary(config => config - .DownloadExists(returns: true) // Returns true for any parameter - .DownloadLinkAsync(returns: new Uri("http://downloads/2.0.0")) // Returns a task with a download link - .CurrentVersion(value: new Version(2, 0, 0, 0)) // Sets the initial version to 2.0.0.0 - .Indexer(values: versions) // Provides a dictionary to retrieve and store versions -); -``` - -### Multiple Return Values - -Specify multiple return values for a method or property. The first value is returned for the first call, the second for the second call, and so on. - -```csharp -var mockLibrary = Mock.IVersionLibrary(config => config - .DownloadExists(returnValues: true, false, true) // Returns true, false, true for the first, second, and third call - .DownloadLinkAsync(returnValues: [Task.FromResult(new Uri("http://downloads/2.0.0")), Task.FromResult(new Uri("http://downloads/2.0.1"))]) // Returns a task with a download link for the first and second call - .DownloadLinkAsync(returnValues: new Uri("http://downloads/2.0.0"), new Uri("http://downloads/2.0.1")) // Returns a task with a download link for the first and second call -); -``` - -### Intercept Method Calls - -```csharp -[Fact] -[Mock] -public async Task InterceptMethodCalls() -{ - var currentVersionMock = new Version(2, 0, 0); - - var versionLibrary = Mock.IVersionLibrary(config => config - .DownloadExists(call: (string s) => s.StartsWith("2.0.0") ? true : false) // Returns true for version 2.0.0.x based on a string parameter - .DownloadExists(call: (Version v) => v is { Major: 2, Minor: 0, Revision: 0 }) // Returns true for version 2.0.0.x based on a version parameter - // or - .DownloadExists(call: LocalIntercept) // Calls a local function - .DownloadExists(call: version => this.ExternalIntercept(version, true)) // Calls function in class - - .DownloadLinkAsync(call: s => Task.FromResult(new Uri($"http://downloads/{s}"))) // Returns a task containing a download link for version 2.0.0.x otherwise an error link - .DownloadLinkAsync(call: s => new Uri($"http://downloads/{s}")) // Returns a task containing a download link for version 2.0.0.x otherwise an error link - - .CurrentVersion(get: () => currentVersionMock, set: version => currentVersionMock = version) // Overwrites the property getter and setter - .Indexer(get: s => new Version(2, 0, 0, 0), set: (s, version) => {}) // Overwrites the indexer getter and setter - ); - - return; - - bool LocalIntercept(Version version) + public interface IBookRepository { - return version is { Major: 2, Minor: 0, Revision: 0 }; + Task AddBook(Book book, CancellationToken token); + int BookCount { get; set; } + Book this[Guid index] { get; set; } + event EventHandler NewBookAdded; } -} - -private bool ExternalIntercept(string version, bool startsWith) => startsWith ? version.StartsWith("2.0.0") : version == "2.0.0"; -``` - -### Async Methods - -Simply return what you expect from async methods either as a `Task` object or a simple value. - -```csharp -var versionLibrary = Mock.IVersionLibrary(config => config - .DownloadLinkAsync(returns: Task.FromResult(new Uri("http://downloads/2.0.0"))) // Returns a task containing a download link for all versions - .DownloadLinkAsync(call: s => Task.FromResult(new Uri($"http://downloads/{s}"))) // Returns a task containing a download link for version 2.0.0.x otherwise an error link - // or - .DownloadLinkAsync(returns: new Uri("http://downloads/2.0.0")) // Returns a task containing a download link for all versions - .DownloadLinkAsync(call: s => new Uri($"http://downloads/{s}")) // Returns a task containing a download link for version 2.0.0.x otherwise an error link -); -``` - -### Strict Mocking - -Unmocked features will always throw `InvalidOperationException`. - -```csharp -[Fact] -[Mock] -public void UnmockedFeaturesAlwaysThrowInvalidOperationException() -{ - var versionLibrary = Mock.IVersionLibrary(); - - var propertyException = Assert.Throws(() => versionLibrary.CurrentVersion); - var methodException = Assert.Throws(() => versionLibrary.DownloadExists("2.0.0")); - var asyncException = Assert.ThrowsAsync(() => versionLibrary.DownloadLinkAsync("2.0.0")); - var indexerException = Assert.Throws(() => versionLibrary["2.0.0"]); -} -``` - -### Adding Indexers - -Mocking indexers is supported either by overloading the get and set methods or by providing a dictionary with expected values. -```csharp -[Fact] -[Mock] -public void Indexers() -{ - var versions = new Dictionary() {{"current", new Version(2,0,0,0)}}; - - var versionLibrary = Mock.IVersionLibrary(config => config - .Indexer(get: s => new Version(2,0,0,0), set: (s, version) => {}) // Overwrites the indexer getter and setter - .Indexer(values: versions) // Provides a dictionary to retrieve and store versions - ); - - var preCurrent = versionLibrary["current"]; - versionLibrary["current"] = new Version(3, 0, 0, 0); - var postCurrent = versionLibrary["current"]; - Assert.NotEqual(preCurrent, postCurrent); -} -``` - -### Raising Events - -Raise events using an event trigger. - -```csharp -Action? triggerNewVersionAdded = null; - -var versionLibrary = Mock.IVersionLibrary(config => config - .NewVersionAdded(trigger: out triggerNewVersionAdded) // Provides a trigger for when a new version is added -); - -triggerNewVersionAdded?.Invoke(new Version(2, 0, 0, 0)); -``` - -### Argument Matching - -MiniMock does not support argument matching using matchers like other mocking frameworks. Instead, you can use the call parameter to match arguments using predicates or internal functions. - -```csharp -var versionLibrary = Mock.IVersionLibrary(config => config - .DownloadExists(call: version => version is { Major: 2, Minor: 0 }) // Returns true for version 2.0.x based on a version parameter -); + [Fact] + [Mock] + public async Task BookCanBeCreated() + { + Action trigger = _ => { }; + + var mockRepo = Mock.IBookRepository(config => config + .AddBook(returns: Guid.NewGuid()) + .BookCount(value: 10) + .Indexer(values: new Dictionary()) + .NewBookAdded(trigger: out trigger)); + + var sut = new BookModel(mockRepo); + var actual = await sut.AddBook(new Book()); + + Assert.Equal("We now have 10 books", actual); + } ``` -__Using Internal Functions__ +Try it out or continue with [Getting started](guide/getting-started.md) to learn more or read the [Mocking guidelines](guide/mocking-guidelines.md) to get a better understanding of when, why and how to mock and when not to. -```csharp -var versionLibrary = Mock.IVersionLibrary(config => -{ - bool downloadExists(Version version) => version switch { - { Major: 1, Minor: 0 } => true, // Returns true for version 1.0.x based on a version parameter - { Major: 2, Minor: 0, Revision: 0 } => true, // Returns true for version 2.0.0.0 based on a version parameter - { Major: 3, } => false, // Returns false for version 3.x based on a version parameter - _ => throw new ArgumentException() // Throws an exception for all other versions - }; +For more details on specific aspects you can read about [Methods](guide/methods.md), [Properties](guide/properties.md), [Events](guide/events.md) or +[Indexers](guide/indexers.md). +Or you shift into high gear with [Advanced Features](advanced-features.md), [FaQ](faq.md) or [Troubleshooting](troubleshooting.md). - config.DownloadExists(downloadExists); -}); -``` +If you are more into the ins and outs of MiniMock you can read the [Motivation](motivation.md) behind MiniMock or the [ADRs](../ADR/README.md). diff --git a/docs/guide/getting-started.md b/docs/guide/getting-started.md new file mode 100644 index 0000000..f0472e7 --- /dev/null +++ b/docs/guide/getting-started.md @@ -0,0 +1,46 @@ +# Getting started + +## Installation and First Use + +Reference the NuGet package in your test project: + +```sh +dotnet add package MiniMock +``` + +- Specify which interface to mock by using the `[Mock]` attribute before your test or test class: +- Create a new instance of the mock using the `Mock.IMyRepository()` factory method. +- Configure the mock using the `config` parameter of the factory method. +- Specify how the relevant members should behave using the members name and specify the behavior using the parameters. +- Use the mock in your test as you see fit. + +As code: + +```csharp +[Fact] +[Mock] // Specify which interface to mock +public void MyTest() { + var mockRepo = Mock.IMyRepository(// Create a new instance of the mock using the mock factory + config => config // Configure the mock using the config parameter + .CreateCustomerAsync(return: Guid.NewGuid()) // Specify how the relevant members should behave + ); + var sut = new CustomerMaintenance(mockRepo); // Use the mock in your test as you see fit + + sut.Create(customerDTO, cancellationToken); +} +``` + +## Quality of Life + +MiniMock is __extremely strict__ but __fair__, requiring you to specify all features you want to mock but giving you fair warnings if you don't. +This is by design to make sure you are aware of what you are mocking and not introduce unexpected behaviour. + +![img.png](img.png) + +All mockable members are available through a _fluent interface_ with _IntelliSense_, _type safety_, and _documentation_. + +![img_2.png](img_2.png) + +All code required to run MiniMock is _source generated_ within your test project and has _no runtime dependencies_. You can _inspect_, _step into_, and _debug_ the generated code which also allows for _security_ and _vulnerability +scanning_ of the code. + diff --git a/docs/guide/img.png b/docs/guide/img.png new file mode 100644 index 0000000000000000000000000000000000000000..6eacfcdc09a279aa6d11d29784c8c0aa963a35d9 GIT binary patch literal 3640 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 G5&s6ELLVLg literal 0 HcmV?d00001 diff --git a/docs/guide/img_1.png b/docs/guide/img_1.png new file mode 100644 index 0000000000000000000000000000000000000000..76bbe64e8d3aa6f53e46ab9b1ba563615523a63d GIT binary patch literal 18130 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 eUVP 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 literal 0 HcmV?d00001 diff --git a/docs/guide/img_2.png b/docs/guide/img_2.png new file mode 100644 index 0000000000000000000000000000000000000000..76bbe64e8d3aa6f53e46ab9b1ba563615523a63d GIT binary patch literal 18130 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 eUVP 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 literal 0 HcmV?d00001 diff --git a/docs/guide/img_3.png b/docs/guide/img_3.png new file mode 100644 index 0000000000000000000000000000000000000000..76bbe64e8d3aa6f53e46ab9b1ba563615523a63d GIT binary patch literal 18130 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 eUVP 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 literal 0 HcmV?d00001 diff --git a/docs/guide/methods.md b/docs/guide/methods.md new file mode 100644 index 0000000..f7e7cb4 --- /dev/null +++ b/docs/guide/methods.md @@ -0,0 +1,87 @@ +# Methods + +## Introduction + +```csharp +var mockVersionLibrary = Mock.IVersionLibrary(config => config. + [Your mock setup here] +); +``` + +- MiniMock allows you to intercept method calls and specify the return value, throw an exception, or return multiple values for a method. +- Multiple specifications for a method will overwrite each other with the last one taking precedence. +- Specifying the Call which calls a lambda expression or local function offers the most flexibility and control. +- A set of quality of life methods are available for common scenarios like returning a fixed values, throwing exceptions, or returning multiple values. +- Async methods are supported by the common scenarios but also supports specifying the return value or values without the Task. +- Overloaded methods can be specified by using the call parameter to specify the return value for a specific overload. +- The "call", "returns", "returnValues" and "throws" parameter-names can be omitted but makes the code more readable. +- Any method that is not explicitly specified will throw a `InvalidOperationException` when called. + +## Common scenarios + +__Call lambda expression or method__ to specify what should happen based on the input parameter. +This can be done by using a lambda expression or a method and offers flexibility and control over what happens when the method is called, but also requires more code. + +```csharp +.DownloadExists(call: s => s.StartsWith("2.0.0")) // Returns true for version 2.0.0.x based on a string parameter +``` + +```csharp +.DownloadExists(call: MockDownloadExists); + +private bool MockDownloadExists(Version version) +{ + return version is { Major: 2, Minor: 0, Revision: 0 }; +} +``` + +__Return a fixed value__ for any call to the method gives a quick and easy way to specify the return value when you don't care about the input parameters. + +```csharp +.DownloadExists(returns: true) // Returns true for all parameters +``` + +__Return multiple values__ for a method when you need to wary the result for each call. The first value is returned for the first call, the second for the second call, and so on. +When the last value is reached an exception is thrown. + + ```csharp + .DownloadExists(returnValues: [true, true, false]) // Returns true two times, then false + ``` + +__Methods that return void__ can be mocked by not specifying any parameters. + +```csharp +.LogDownloadRequest() +``` + +__Throwing exceptions__ can be done by specifying the exception to throw for any call to the method. + +```csharp +.DownloadExists(throws: new IndexOutOfRangeException()) // Throws IndexOutOfRangeException for all versions +``` + +## Overloaded methods + +When a method is overloaded, you can specify the return value for one specific overload based on the input parameter. + +```csharp +.DownloadExists(call: v => v is { Major: 2, Minor: 0, Revision: 0 }) // Returns true for version 2.0.0.x based on a version parameter +.DownloadExists(call: s => s.StartsWith("2.0.0")) // Returns true for version 2.0.0.x base on a string parameter +``` + +For overloaded methods returning identical values all overloaded methods return values will be set using the return and return values parameters. + +Specifying the throw parameter will throw the exception for all overloaded methods. + +Returning multiple values for overloaded methods will handle each overload as a separate instance. + +## Async methods + +Methods returning a `Task` or `Task` are supported by the common scenarios but also supports specifying the return value or values without the Task. + +```csharp +.DownloadExistsAsync(call: s => s.StartsWith("2.0.0")) // Returns true for version 2.0.0.x that will be wrapped in a task +.DownloadExistsAsync(returns: true) // Returns true for any parameter that will be wrapped in a task +.DownloadExistsAsync(returnValues: [true, false, true]) // Returns true, false, true for the first, second, and third call that will be wrapped in a task +.LogDownloadRequestAsync() // Returns a completed task for all parameters +``` diff --git a/docs/guide/mocking-guidelines.md b/docs/guide/mocking-guidelines.md new file mode 100644 index 0000000..e0d146d --- /dev/null +++ b/docs/guide/mocking-guidelines.md @@ -0,0 +1,154 @@ +# Mocking Guidelines + +Mocking is a crucial aspect of unit testing, allowing developers to isolate and test individual components of their applications. +This document provides __opinionated guidelines__ on how to effectively use mocks to mock various targets, ensuring comprehensive and +reliable tests. + +Just as important as knowing what to mock is knowing what not to mock. This document also outlines objects that should not be mocked. + +## Good Candidates for Mocking + +When writing unit tests, it's important to mock certain components to isolate the unit of work being tested. Here are some good targets for mocking: + +Sure, here are the expanded sections for each line: + +### External Dependencies + +External dependencies include databases, file systems, web services, and any other external systems that your code interacts with. +Mocking these dependencies allows you to test your code without relying on the actual external systems. +This ensures that your tests are not affected by the availability or state of these external systems, leading to more reliable and faster tests. + +Remember to test the actual interactions with external dependencies in integration or end-to-end tests to ensure that your code works correctly with the real systems. + +### Planned Components + +Components that are planned but not yet implemented, such as interfaces or classes that are part of the design but not yet developed, can be mocked to test how your code interacts with them. +By mocking these components, you can simulate their behavior and test how your code integrates with them before they are fully implemented. +This helps in identifying potential issues early in the development process. + +Remember to update the mocks when the actual components are implemented to ensure that the tests remain relevant and accurate. + +### Time-consuming Operations + +Operations that are time-consuming, such as network requests, complex calculations or database queries, can be mocked to speed up test execution. +By mocking these operations, you can simulate their behavior without actually performing the time-consuming tasks, which helps in running tests quickly and efficiently. + +Remember to test the actual time-consuming operations in integration or end-to-end tests to ensure that they work correctly. +You can use the mock to test timeout scenarios or error handling without relying on the actual time-consuming operations. + +### Volatile Components + +Components that return volatile or unpredictable results, such as random number generators and guid generators should be mocked to ensure that your tests are deterministic and reproducible. +By mocking these components, you can control the output and simulate different scenarios to test how your code behaves under various conditions. + +Remember to test the actual volatile components in integration or end-to-end tests to ensure that your code works correctly with the real components. +If the components are volatile in production scenarios, remember to test the edge cases in your code. + +### Error-prone Components + +Components that are error-prone, such as third-party libraries, legacy code, or complex algorithms, should be mocked to test how your code behaves under different error conditions. +By mocking these components, you can simulate error scenarios and ensure that your code handles errors correctly without relying on the actual error-prone components. + +Remember to test the actual error-prone components in integration or end-to-end tests to ensure that your code works correctly with the real components. +If the components are error-prone in production scenarios remember to test the error handling logic in your code. + +## Specific Examples + +### Services + +Any service classes that your code depends on, such as authentication services, payment gateways, or email services, should be mocked to isolate the unit of work. +This allows you to test the logic of your code without relying on the actual implementation of these services, ensuring that your tests are focused and reliable. + +Consider isolating the service dependencies behind a facade or adapter to isolate our code from the actual service implementation. + +### Repositories + +Data access layers or repositories that interact with the database should be mocked to test the business logic without hitting the database. +This helps in isolating the business logic from the data access logic, making your tests more focused and faster. + +Using an in-memory database can be an alternative to mocking repositories, but makes is harder to run tests in parallel and can be slower than using mocks. + +### Caching Layers + +Mocking caching mechanisms like `IMemoryCache` or `IDistributedCache` allows you to test how your application behaves with different cache states. +This helps in ensuring that your application handles caching correctly without relying on the actual cache implementation. + +For scenarios where the cache is not the focus of the test cases, consider using a simple in-memory cache instead of mocking the cache. + +### Message Queues + +Mocking message queue clients like `IQueueClient` or `IMessagePublisher` allows you to simulate message sending and receiving without relying on the actual message broker. +This helps in testing the messaging logic of your application in isolation. + +### User Context + +Mocking user context providers like `IHttpContextAccessor` allows you to simulate different user scenarios and authentication states. +This helps in testing how your application behaves under different user contexts without relying on the actual user context implementation. + + +By mocking these targets, you can create isolated and reliable unit tests that focus on the specific behavior of the code under test. + +## Do Not Mock + +When writing unit tests, certain components should generally not be mocked: + +### Objects with Existing Test Classes + +Objects like `ILogger`, `TimeProvider`, and `HttpClient` already have well-defined test classes provided by the framework or libraries. +These test classes are designed to facilitate testing without the need for mocking. +Using these existing test classes ensures that your tests are more reliable and maintainable. + +### Mapper Classes + +Mapper classes are responsible for converting data between different layers of your application. +Instead of mocking these classes, use the real mapper classes and test the mapping logic. +This ensures that the mappings are correct and that any changes to the mapping logic are properly tested. + +### Validation Logic + +Validation logic, such as Fluent Validation, data annotations or custom validation attributes is part of the behavior of your application and should not be mocked. +Instead of mocking the validation logic, test the validation rules directly by passing valid and invalid data to the validation logic and asserting the results. + +### Value Objects + +Value objects are simple data structures like `DateTime`, `TimeSpan`, or custom value objects. +These objects should not be mocked because they are simple and have no behavior that needs to be isolated. +Use real instances of these objects in your tests to ensure that they are used correctly. + +### Third-Party Libraries + +Avoid mocking third-party libraries directly. Instead, create an abstraction layer around the third-party library and mock that layer. +This approach ensures that your tests are not tightly coupled to the third-party library and that you can easily replace the library if needed. + +### Configuration Settings + +Use real configuration settings in your tests to ensure that they are correctly applied. +Mocking configuration settings can lead to tests that do not accurately reflect the real behavior of your application. +By using real configuration settings, you can ensure that your tests are more reliable and maintainable. + +Mocking these objects can lead to brittle tests that are tightly coupled to the implementation details of the code under test. + +## Unsupported Mocking Scenarios + +The following scenarios are generally not recommended for mocking and not supported by the MiniMock framework: + +### Static Methods and classes + +MiniMock uses inheritance-based mocking, which does not support mocking static methods or classes. +Mocking static methods can lead to brittle tests and should be avoided. +Static methods are tightly coupled to their class and cannot be easily replaced or overridden. +Instead, refactor the code to use dependency injection, allowing you to inject dependencies that can be mocked. + +### Private Methods + +Private methods should be tested indirectly through the public methods that call them. +Testing private methods directly can lead to tests that are tightly coupled to the implementation details, making them brittle and harder to maintain. + +### Extension Methods + +Extension methods should be tested through the classes they extend rather than mocked directly. This ensures that the extension methods are tested in the context of their usage. + +### Sealed Classes + +MiniMock uses inheritance-based mocking, which does not support mocking sealed classes. +Consider using interfaces or abstractions to enable mocking. This allows you to create mock implementations for testing purposes. diff --git a/docs/guide/properties.md b/docs/guide/properties.md new file mode 100644 index 0000000..ac526e0 --- /dev/null +++ b/docs/guide/properties.md @@ -0,0 +1,3 @@ +# Properties + +__WIP__ From 2ed772ea21ddff7be8aca527fb543f54c3c3d184 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lasse=20Sj=C3=B8rup?= Date: Sat, 9 Nov 2024 22:24:27 +0100 Subject: [PATCH 10/26] Try to add stylesheet --- docs/assets/css/style.scss | 3 +++ docs/guide/methods.md | 10 +++------- 2 files changed, 6 insertions(+), 7 deletions(-) create mode 100644 docs/assets/css/style.scss diff --git a/docs/assets/css/style.scss b/docs/assets/css/style.scss new file mode 100644 index 0000000..8987b8b --- /dev/null +++ b/docs/assets/css/style.scss @@ -0,0 +1,3 @@ +strong { + color:#b5e853 +} diff --git a/docs/guide/methods.md b/docs/guide/methods.md index f7e7cb4..76fc119 100644 --- a/docs/guide/methods.md +++ b/docs/guide/methods.md @@ -1,20 +1,16 @@ # Methods -## Introduction +Start by creating a mock of the interface or class you want to mock. ```csharp var mockVersionLibrary = Mock.IVersionLibrary(config => config. [Your mock setup here] ); ``` +Please note -- MiniMock allows you to intercept method calls and specify the return value, throw an exception, or return multiple values for a method. - Multiple specifications for a method will overwrite each other with the last one taking precedence. -- Specifying the Call which calls a lambda expression or local function offers the most flexibility and control. -- A set of quality of life methods are available for common scenarios like returning a fixed values, throwing exceptions, or returning multiple values. -- Async methods are supported by the common scenarios but also supports specifying the return value or values without the Task. -- Overloaded methods can be specified by using the call parameter to specify the return value for a specific overload. -- The "call", "returns", "returnValues" and "throws" parameter-names can be omitted but makes the code more readable. +- Parameter-names can be omitted but makes the code more readable. - Any method that is not explicitly specified will throw a `InvalidOperationException` when called. ## Common scenarios From aa36f0c95c45fbec74bfae4e7c4160c7bc00a0c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lasse=20Sj=C3=B8rup?= Date: Sat, 9 Nov 2024 22:42:19 +0100 Subject: [PATCH 11/26] Try again --- docs/_config.yml | 3 ++- docs/_layouts/default.html | 14 ++++++++++++++ docs/assets/css/{style.scss => custom.scss} | 0 3 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 docs/_layouts/default.html rename docs/assets/css/{style.scss => custom.scss} (100%) diff --git a/docs/_config.yml b/docs/_config.yml index e2fb5af..de021df 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -1,4 +1,5 @@ -title: MiniMock +# _config.yml +title: MiniMock logo: Troll.jpg description: Minimalistic approach to mocking in .NET remote_theme: pages-themes/hacker@v0.2.0 diff --git a/docs/_layouts/default.html b/docs/_layouts/default.html new file mode 100644 index 0000000..61bb0fb --- /dev/null +++ b/docs/_layouts/default.html @@ -0,0 +1,14 @@ + + + + + + + {{ page.title }} + + + + +{{ content }} + + diff --git a/docs/assets/css/style.scss b/docs/assets/css/custom.scss similarity index 100% rename from docs/assets/css/style.scss rename to docs/assets/css/custom.scss From 573cc6e0b11318062b5f133c81fa9c7ad3d40850 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lasse=20Sj=C3=B8rup?= Date: Sat, 9 Nov 2024 22:45:43 +0100 Subject: [PATCH 12/26] One more for the road --- docs/_layouts/default.html | 54 ++++++++++++++++++++++++++++++++++---- 1 file changed, 49 insertions(+), 5 deletions(-) diff --git a/docs/_layouts/default.html b/docs/_layouts/default.html index 61bb0fb..c68f87e 100644 --- a/docs/_layouts/default.html +++ b/docs/_layouts/default.html @@ -1,14 +1,58 @@  - + - - {{ page.title }} - + + + + {% seo %} + + + {% include head-custom.html %} -{{ content }} +

+
+

{{ site.title | default: site.github.repository_name }}

+ + {% if site.logo %} + Logo + {% endif %} + +

{{ site.description | default: site.github.project_tagline }}

+ + {% if site.github.is_project_page %} +

View the Project on GitHub {{ site.github.repository_nwo }}

+ {% endif %} + + {% if site.github.is_user_page %} +

View My GitHub Profile

+ {% endif %} + + {% if site.show_downloads %} + + {% endif %} +
+
+ + {{ content }} + +
+ +
+ From 9dd1e6ecc41caf891248d58552d841f9c133070e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lasse=20Sj=C3=B8rup?= Date: Sat, 9 Nov 2024 22:48:47 +0100 Subject: [PATCH 13/26] Remove troll logo --- docs/_config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_config.yml b/docs/_config.yml index de021df..c42d108 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -1,6 +1,6 @@ # _config.yml title: MiniMock -logo: Troll.jpg +# logo: Troll.jpg description: Minimalistic approach to mocking in .NET remote_theme: pages-themes/hacker@v0.2.0 plugins: From 762d5569e115e0cfe5de711b74ac90eda248a5b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lasse=20Sj=C3=B8rup?= Date: Sat, 9 Nov 2024 22:53:39 +0100 Subject: [PATCH 14/26] Rename css --- docs/assets/css/{custom.scss => custom.css} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/assets/css/{custom.scss => custom.css} (100%) diff --git a/docs/assets/css/custom.scss b/docs/assets/css/custom.css similarity index 100% rename from docs/assets/css/custom.scss rename to docs/assets/css/custom.css From 8f1aab3ac0c01e84bd29aaa0d6983fb04a84b939 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lasse=20Sj=C3=B8rup?= Date: Sat, 9 Nov 2024 23:00:03 +0100 Subject: [PATCH 15/26] Try again --- docs/_config.yml | 1 - docs/_layouts/default.html | 58 -------------------------------------- docs/assets/css/custom.css | 3 -- docs/assets/css/style.scss | 8 ++++++ 4 files changed, 8 insertions(+), 62 deletions(-) delete mode 100644 docs/_layouts/default.html delete mode 100644 docs/assets/css/custom.css create mode 100644 docs/assets/css/style.scss diff --git a/docs/_config.yml b/docs/_config.yml index c42d108..363f7fd 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -1,6 +1,5 @@ # _config.yml title: MiniMock -# logo: Troll.jpg description: Minimalistic approach to mocking in .NET remote_theme: pages-themes/hacker@v0.2.0 plugins: diff --git a/docs/_layouts/default.html b/docs/_layouts/default.html deleted file mode 100644 index c68f87e..0000000 --- a/docs/_layouts/default.html +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - - - {% seo %} - - - - {% include head-custom.html %} - - -
-
-

{{ site.title | default: site.github.repository_name }}

- - {% if site.logo %} - Logo - {% endif %} - -

{{ site.description | default: site.github.project_tagline }}

- - {% if site.github.is_project_page %} -

View the Project on GitHub {{ site.github.repository_nwo }}

- {% endif %} - - {% if site.github.is_user_page %} -

View My GitHub Profile

- {% endif %} - - {% if site.show_downloads %} - - {% endif %} -
-
- - {{ content }} - -
- -
- - - diff --git a/docs/assets/css/custom.css b/docs/assets/css/custom.css deleted file mode 100644 index 8987b8b..0000000 --- a/docs/assets/css/custom.css +++ /dev/null @@ -1,3 +0,0 @@ -strong { - color:#b5e853 -} diff --git a/docs/assets/css/style.scss b/docs/assets/css/style.scss new file mode 100644 index 0000000..e0a70fd --- /dev/null +++ b/docs/assets/css/style.scss @@ -0,0 +1,8 @@ +--- +--- + +@import "{{ site.theme }}"; + +strong { + color:#b5e853 +} From 91b5760307e094b9862a06e8afbb4c0f0e1b710e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lasse=20Sj=C3=B8rup?= Date: Sat, 9 Nov 2024 23:13:47 +0100 Subject: [PATCH 16/26] Retry the default.html way --- docs/_layouts/default.html | 39 ++++++++++++++++++++++++++++++++++++++ docs/assets/css/custom.css | 3 +++ docs/assets/css/style.scss | 8 -------- 3 files changed, 42 insertions(+), 8 deletions(-) create mode 100644 docs/_layouts/default.html create mode 100644 docs/assets/css/custom.css delete mode 100644 docs/assets/css/style.scss diff --git a/docs/_layouts/default.html b/docs/_layouts/default.html new file mode 100644 index 0000000..b84442e --- /dev/null +++ b/docs/_layouts/default.html @@ -0,0 +1,39 @@ + + + + + + + + + {% include head-custom.html %} + + {% seo %} + + + + +
+
+ +

{{ site.title | default: site.github.repository_name }}

+
+

{{ site.description | default: site.github.project_tagline }}

+ +
+ {% if site.show_downloads %} + Download as .zip + Download as .tar.gz + {% endif %} + View on GitHub +
+
+
+ +
+
+ {{ content }} +
+
+ + diff --git a/docs/assets/css/custom.css b/docs/assets/css/custom.css new file mode 100644 index 0000000..8987b8b --- /dev/null +++ b/docs/assets/css/custom.css @@ -0,0 +1,3 @@ +strong { + color:#b5e853 +} diff --git a/docs/assets/css/style.scss b/docs/assets/css/style.scss deleted file mode 100644 index e0a70fd..0000000 --- a/docs/assets/css/style.scss +++ /dev/null @@ -1,8 +0,0 @@ ---- ---- - -@import "{{ site.theme }}"; - -strong { - color:#b5e853 -} From 265e0441273eb7d9ba4fe339760a65f4311d85c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lasse=20Sj=C3=B8rup?= Date: Sat, 9 Nov 2024 23:45:19 +0100 Subject: [PATCH 17/26] Adding links and making the header smaller --- docs/_layouts/default.html | 5 ++++- docs/assets/css/custom.css | 11 +++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/docs/_layouts/default.html b/docs/_layouts/default.html index b84442e..b675933 100644 --- a/docs/_layouts/default.html +++ b/docs/_layouts/default.html @@ -27,9 +27,12 @@

{{ site.description | default: site.github.project_tagline }}

{% endif %} View on GitHub + - +
{{ content }} diff --git a/docs/assets/css/custom.css b/docs/assets/css/custom.css index 8987b8b..3354c4b 100644 --- a/docs/assets/css/custom.css +++ b/docs/assets/css/custom.css @@ -1,3 +1,14 @@ strong { color:#b5e853 } + +header #links { + position: relative; + height: 0px; +} + +header { + border-bottom: 0px dashed #b5e853; + padding: 10px 0; + margin: 0 0 10px 0 +} From c59354623c5fd468708323b49c22908a53a376d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lasse=20Sj=C3=B8rup?= Date: Sun, 10 Nov 2024 00:16:50 +0100 Subject: [PATCH 18/26] Adding a few more ADR containers --- docs/ADR/Unsupported/SupportForExtensionMethods.md | 5 +++++ docs/ADR/Unsupported/SupportForSealedClasses.md | 5 +++++ docs/ADR/Unsupported/SupportForStaticMembers.md | 5 +++++ docs/ADR/feature/SupportForAbstractClasses.md | 6 ++++++ docs/ADR/feature/SupportForAsynchronousMethods.md | 5 +++++ docs/ADR/feature/SupportForDelegates.md | 3 +++ docs/ADR/feature/SupportForGenericMethods.md | 6 ++++++ docs/ADR/feature/SupportForInternalMethods.md | 5 +++++ docs/ADR/feature/SupportForOutAndRefParameters.md | 5 +++++ docs/ADR/feature/SupportForOverloads.md | 5 +++++ docs/ADR/feature/SupportForVirtualMethods.md | 5 +++++ docs/ADR/general/DocumentationAndExamples.md | 4 ---- docs/guide/mocking-guidelines.md | 4 +--- 13 files changed, 56 insertions(+), 7 deletions(-) create mode 100644 docs/ADR/Unsupported/SupportForExtensionMethods.md create mode 100644 docs/ADR/Unsupported/SupportForSealedClasses.md create mode 100644 docs/ADR/Unsupported/SupportForStaticMembers.md create mode 100644 docs/ADR/feature/SupportForAbstractClasses.md create mode 100644 docs/ADR/feature/SupportForAsynchronousMethods.md create mode 100644 docs/ADR/feature/SupportForDelegates.md create mode 100644 docs/ADR/feature/SupportForGenericMethods.md create mode 100644 docs/ADR/feature/SupportForInternalMethods.md create mode 100644 docs/ADR/feature/SupportForOutAndRefParameters.md create mode 100644 docs/ADR/feature/SupportForOverloads.md create mode 100644 docs/ADR/feature/SupportForVirtualMethods.md diff --git a/docs/ADR/Unsupported/SupportForExtensionMethods.md b/docs/ADR/Unsupported/SupportForExtensionMethods.md new file mode 100644 index 0000000..43f7696 --- /dev/null +++ b/docs/ADR/Unsupported/SupportForExtensionMethods.md @@ -0,0 +1,5 @@ +# Support for Extension Methods (WIP) + +Extension methods are not supported due to their nature. Extension methods are static methods that are called as if they were instance methods of the extended type. + +Work in progress. diff --git a/docs/ADR/Unsupported/SupportForSealedClasses.md b/docs/ADR/Unsupported/SupportForSealedClasses.md new file mode 100644 index 0000000..7d5f64b --- /dev/null +++ b/docs/ADR/Unsupported/SupportForSealedClasses.md @@ -0,0 +1,5 @@ +# Support for Sealed Classes (WIP) + +Sealed classes are not supported due to the way the framework works. + +Work in progress. diff --git a/docs/ADR/Unsupported/SupportForStaticMembers.md b/docs/ADR/Unsupported/SupportForStaticMembers.md new file mode 100644 index 0000000..a233a71 --- /dev/null +++ b/docs/ADR/Unsupported/SupportForStaticMembers.md @@ -0,0 +1,5 @@ +# Support for Static Members (WIP) + +Static members are not supported due to the way the framework works. + +Work in progress. diff --git a/docs/ADR/feature/SupportForAbstractClasses.md b/docs/ADR/feature/SupportForAbstractClasses.md new file mode 100644 index 0000000..e6912bd --- /dev/null +++ b/docs/ADR/feature/SupportForAbstractClasses.md @@ -0,0 +1,6 @@ +# Support for Abstract Classes (WIP) + +Abstract classes are supported to a limited extent. The framework will allow mocking of abstract classes, but only if the abstract class has a public or protected constructor with no parameters. +Support for abstract classes with constructors that have parameters will be supported in the future. + +Work in progress. diff --git a/docs/ADR/feature/SupportForAsynchronousMethods.md b/docs/ADR/feature/SupportForAsynchronousMethods.md new file mode 100644 index 0000000..e6c0893 --- /dev/null +++ b/docs/ADR/feature/SupportForAsynchronousMethods.md @@ -0,0 +1,5 @@ +# Support for Asynchronous Methods (WIP) + +Asynchronous methods are supported. Helper methods are provided to simplify the testing of asynchronous methods. + +Work in progress. diff --git a/docs/ADR/feature/SupportForDelegates.md b/docs/ADR/feature/SupportForDelegates.md new file mode 100644 index 0000000..d909a24 --- /dev/null +++ b/docs/ADR/feature/SupportForDelegates.md @@ -0,0 +1,3 @@ +# Support for Delegates (WIP) + +Work in progress. diff --git a/docs/ADR/feature/SupportForGenericMethods.md b/docs/ADR/feature/SupportForGenericMethods.md new file mode 100644 index 0000000..0346db3 --- /dev/null +++ b/docs/ADR/feature/SupportForGenericMethods.md @@ -0,0 +1,6 @@ +# Support for Generic Methods (WIP) + +Generic methods are supported. +The generic type is passed as a type parameter to the 'call' labmda method. + +Work in progress. diff --git a/docs/ADR/feature/SupportForInternalMethods.md b/docs/ADR/feature/SupportForInternalMethods.md new file mode 100644 index 0000000..dc96cc9 --- /dev/null +++ b/docs/ADR/feature/SupportForInternalMethods.md @@ -0,0 +1,5 @@ +# Support for Internal Methods (WIP) + +Internal members are supported for mock targets where InternalsVisibleToAttribute is used. + +Work in progress. diff --git a/docs/ADR/feature/SupportForOutAndRefParameters.md b/docs/ADR/feature/SupportForOutAndRefParameters.md new file mode 100644 index 0000000..7adeb16 --- /dev/null +++ b/docs/ADR/feature/SupportForOutAndRefParameters.md @@ -0,0 +1,5 @@ +# Support for Out and Ref Parameters (WIP) + +Out and ref parameters are supported. + +Work in progress. diff --git a/docs/ADR/feature/SupportForOverloads.md b/docs/ADR/feature/SupportForOverloads.md new file mode 100644 index 0000000..5501ccf --- /dev/null +++ b/docs/ADR/feature/SupportForOverloads.md @@ -0,0 +1,5 @@ +# Support for Overloads (WIP) + +Overloads are supported. + +Work in progress. diff --git a/docs/ADR/feature/SupportForVirtualMethods.md b/docs/ADR/feature/SupportForVirtualMethods.md new file mode 100644 index 0000000..b1ada4b --- /dev/null +++ b/docs/ADR/feature/SupportForVirtualMethods.md @@ -0,0 +1,5 @@ +# Support for Virtual Methods (WIP) + +Virtual methods are supported. + +Work in progress. diff --git a/docs/ADR/general/DocumentationAndExamples.md b/docs/ADR/general/DocumentationAndExamples.md index 979a6e9..6eb4b50 100644 --- a/docs/ADR/general/DocumentationAndExamples.md +++ b/docs/ADR/general/DocumentationAndExamples.md @@ -8,10 +8,6 @@ Effective documentation and examples are crucial for the adoption and proper use We will create concise documentation and examples for the MiniMock framework. The documentation will cover essential aspects of the framework, including installation, configuration, and usage. Examples will be provided to demonstrate common use cases. -## Status - -Accepted - ## Consequences ### Positive: diff --git a/docs/guide/mocking-guidelines.md b/docs/guide/mocking-guidelines.md index e0d146d..6a91a48 100644 --- a/docs/guide/mocking-guidelines.md +++ b/docs/guide/mocking-guidelines.md @@ -8,9 +8,7 @@ Just as important as knowing what to mock is knowing what not to mock. This docu ## Good Candidates for Mocking -When writing unit tests, it's important to mock certain components to isolate the unit of work being tested. Here are some good targets for mocking: - -Sure, here are the expanded sections for each line: +When writing unit tests, it's important to mock certain components to isolate the unit of work being tested. Here are some good candidates for mocking: ### External Dependencies From 800653d140d26c125df799f57d7635577013236e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lasse=20Sj=C3=B8rup?= Date: Mon, 6 Jan 2025 16:32:48 +0100 Subject: [PATCH 19/26] Fixed broken link Added documentation about construction, indexers and events --- docs/ADR/README.md | 2 +- docs/README.md | 6 +++--- docs/guide/construction.md | 29 +++++++++++++++++++++++++++++ docs/guide/events.md | 35 +++++++++++++++++++++++++++++++++++ docs/guide/indexers.md | 25 +++++++++++++++++++++++++ docs/guide/methods.md | 30 ++++++++++++++++++++++++++---- docs/guide/properties.md | 23 ++++++++++++++++++++++- tests/MiniMock.Tests/Demo.cs | 22 ++++++++++++++++++++++ 8 files changed, 163 insertions(+), 9 deletions(-) create mode 100644 docs/guide/construction.md create mode 100644 docs/guide/events.md create mode 100644 docs/guide/indexers.md diff --git a/docs/ADR/README.md b/docs/ADR/README.md index 5dd3b59..3762ee4 100644 --- a/docs/ADR/README.md +++ b/docs/ADR/README.md @@ -24,7 +24,7 @@ All the ADRs have been approved and are considered final decisions for the proje - [Support for Events](feature/SupportForEvents.md) - Decision on supporting events in the mocking framework. - [Support for Indexers](feature/SupportForIndexers.md) - Decision on supporting indexers in the mocking framework. - Special cases - - [Allowing Skipping Arguments in Mock Setup](general/SupportSkippingArguments.md) - Allows skipping arguments in mock setups for flexibility. + - [Allowing Skipping Arguments in Mock Setup](feature/SupportSkippingArguments.md) - Allows skipping arguments in mock setups for flexibility. - [Support for Protected Methods](feature/SupportingProtectedMethods.md) - Decision on whether to support mocking protected methods. - [Support for Generic Methods (WIP)](feature/SupportForGenericMethods.md) - Decision on supporting generic methods in the mocking framework. - [Support for Asynchronous Methods (WIP)](feature/SupportForAsynchronousMethods.md) - Handling asynchronous methods in the mocking framework. diff --git a/docs/README.md b/docs/README.md index 79dc6b3..bce0625 100644 --- a/docs/README.md +++ b/docs/README.md @@ -32,8 +32,8 @@ MiniMock offers a _minimalistic_ approach to mocking in .NET with a focus on sim Try it out or continue with [Getting started](guide/getting-started.md) to learn more or read the [Mocking guidelines](guide/mocking-guidelines.md) to get a better understanding of when, why and how to mock and when not to. -For more details on specific aspects you can read about [Methods](guide/methods.md), [Properties](guide/properties.md), [Events](guide/events.md) or -[Indexers](guide/indexers.md). +For more details on specific aspects you can read about [Construction](guide/construction.md) [Methods](guide/methods.md), [Properties](guide/properties.md), [Events](guide/events.md) or +[Indexers](guide/indexers.md). Or you shift into high gear with [Advanced Features](advanced-features.md), [FaQ](faq.md) or [Troubleshooting](troubleshooting.md). -If you are more into the ins and outs of MiniMock you can read the [Motivation](motivation.md) behind MiniMock or the [ADRs](../ADR/README.md). +If you are more into the ins and outs of MiniMock you can read the [Motivation](motivation.md) behind MiniMock or the [ADRs](ADR/README.md). diff --git a/docs/guide/construction.md b/docs/guide/construction.md new file mode 100644 index 0000000..8e127ab --- /dev/null +++ b/docs/guide/construction.md @@ -0,0 +1,29 @@ +# Construction + +__TL;DR__ + +```csharp +[Fact] +[Mock] // Signals minimock to build a mock object for IVersionLibrary. +public void MockInitialization() +{ + // Mock without anything mocked used to satisfy dependencies not used in the tests execution path + var emptyMock = Mock.IVersionLibrary(); + + // Mock with inline configuration useful for most setup scenarios + var inlineMock = Mock.IVersionLibrary(config => config + .DownloadExists(true) + ); + + // Mock with external configuration useful for more complex scenarios like testing events and modifying mock behaviour. + var externalMock = Mock.IVersionLibrary(out var config); + config.DownloadExists(true); + + // Direct access to the mock implementation. + var implementationMock = new MockOf_IVersionLibrary(config => config + .DownloadExists(true) + ); +} +``` + +~~~~ diff --git a/docs/guide/events.md b/docs/guide/events.md new file mode 100644 index 0000000..5430fc6 --- /dev/null +++ b/docs/guide/events.md @@ -0,0 +1,35 @@ +# Events + +__TL;DR__ + +```csharp +public interface IVersionLibrary +{ + event EventHandler NewVersionAdded; +} + +Action triggerNewVersionAdded = _ => { }; + +var versionLibrary = Mock.IVersionLibrary(config => config + .NewVersionAdded(raise: new Version(2, 0, 0, 0)) // Raises the event right away + .NewVersionAdded(trigger: out triggerNewVersionAdded) // Provides a trigger for when a new version is added +); + +// Inject into system under test + +triggerNewVersionAdded(new Version(2, 0, 0, 0)); +``` + +Alternative to creating a action for triggering the is to use the out parameter for configuration instead. +```csharp +var versionLibrary = Mock.IVersionLibrary(out var config); + +// Inject into system under test + +config.NewVersionAdded(raise: new Version(2, 0, 0, 0)); +``` + +__Please note__ + +- Parameter-names can be omitted but makes the code more readable. +- Unlike other members, events does not need to be specified in order to be subscribed to by the system under test. diff --git a/docs/guide/indexers.md b/docs/guide/indexers.md new file mode 100644 index 0000000..0e24293 --- /dev/null +++ b/docs/guide/indexers.md @@ -0,0 +1,25 @@ +# Indexers + +__TL;DR__ + +```csharp +public interface IVersionLibrary +{ + Version this[string key] { get; set; } +} + +var versions = new Dictionary { { "current", new Version(2, 0, 0, 0) } }; + +var versionLibrary = Mock.IVersionLibrary(config => config + .Indexer(get: key => new Version(2, 0, 0, 0), set: (key, value) => { }) // Overwrites the indexer getter and setter + .Indexer(values: versions) // Provides a dictionary to retrieve and store versions +); + +// Inject into system under test +``` + +__Please note__ + +- Multiple specifications for an indexer will overwrite each other with the last one taking precedence. +- Parameter-names can be omitted but make the code more readable. +- Any indexer that is not explicitly specified will throw an `InvalidOperationException` when called. diff --git a/docs/guide/methods.md b/docs/guide/methods.md index 76fc119..5cb0bff 100644 --- a/docs/guide/methods.md +++ b/docs/guide/methods.md @@ -1,13 +1,35 @@ # Methods -Start by creating a mock of the interface or class you want to mock. +__TL;DR__ ```csharp -var mockVersionLibrary = Mock.IVersionLibrary(config => config. - [Your mock setup here] +public interface IVersionLibrary +{ + bool DownloadExists(string version); + bool DownloadExists(Version version); + Task DownloadLinkAsync(string version); + } + +var versionLibrary = Mock.IVersionLibrary(config => config + .DownloadExists(returns: true) // Returns true for all versions + .DownloadExists(throws: new IndexOutOfRangeException()) // Throws IndexOutOfRangeException for all versions + .DownloadExists(call: s => s.StartsWith(value: "2.0.0")) // Returns true for version 2.0.0.x base on a string parameter + .DownloadExists(call: v => v is { Major: 2, Minor: 0, Revision: 0 }) // Returns true for version 2.0.0.x based on a version parameter + .DownloadExists(returnValues: [true, true, false]) // Returns true two times, then false + + .DownloadLinkAsync(returns: Task.FromResult(result: new Uri(uriString: "http://downloads/2.0.0"))) // Returns a task containing a download link for all versions + .DownloadLinkAsync(call: s => Task.FromResult(result: s.StartsWith(value: "2.0.0") ? new Uri(uriString: "http://downloads/2.0.0") : new Uri(uriString: "http://downloads/UnknownVersion"))) // Returns a task containing a download link for version 2.0.0.x otherwise a error link + .DownloadLinkAsync(throws: new TaskCanceledException()) // Throws IndexOutOfRangeException for all parameters + .DownloadLinkAsync(returns: new Uri(uriString: "http://downloads/2.0.0")) // Returns a task containing a download link for all versions + .DownloadLinkAsync(call: s => s.StartsWith(value: "2.0.0") ? new Uri(uriString: "http://downloads/2.0.0") : new Uri(uriString: "http://downloads/UnknownVersion")) // Returns a task containing a download link for version 2.0.0.x otherwise a error link + .DownloadLinkAsync(returnValues: [Task.FromResult(result: new Uri(uriString: "http://downloads/1.0.0")), Task.FromResult(result: new Uri(uriString: "http://downloads/1.1.0")), Task.FromResult(result: new Uri(uriString: "http://downloads/2.0.0"))]) // Returns a task with a download link + .DownloadLinkAsync(returnValues: [new Uri(uriString: "http://downloads/2.0.0"), new Uri(uriString: "http://downloads/2.0.0"), new Uri(uriString: "http://downloads/2.0.0")]) // Returns a task with a download link ); + +// Inject into system under test ``` -Please note + +__Please note__ - Multiple specifications for a method will overwrite each other with the last one taking precedence. - Parameter-names can be omitted but makes the code more readable. diff --git a/docs/guide/properties.md b/docs/guide/properties.md index ac526e0..3c759aa 100644 --- a/docs/guide/properties.md +++ b/docs/guide/properties.md @@ -1,3 +1,24 @@ # Properties -__WIP__ +__TL;DR__ + +```csharp +public interface IVersionLibrary +{ + Version CurrentVersion { get; set; } +} + +var versionLibrary = Mock.IVersionLibrary(config => config + .CurrentVersion(get: () => new Version(major: 2, minor: 0, build: 0, revision: 0), set: version => throw new IndexOutOfRangeException()) // Overwrites the property getter and setter + .CurrentVersion(value: new Version(major: 2, minor: 0, build: 0, revision: 0)) // Sets the initial version to 2.0.0.0 +); + +// Inject into system under test + +``` + +__Please note__ + +- Multiple specifications for a property will overwrite each other with the last one taking precedence. +- Parameter-names can be omitted but make the code more readable. +- Any property that is not explicitly specified will throw an `InvalidOperationException` when called. diff --git a/tests/MiniMock.Tests/Demo.cs b/tests/MiniMock.Tests/Demo.cs index ce4a19f..300555a 100644 --- a/tests/MiniMock.Tests/Demo.cs +++ b/tests/MiniMock.Tests/Demo.cs @@ -70,6 +70,28 @@ public async Task TestingAllTheOptions() triggerNewVersionAdded(new Version(2, 0, 0, 0)); } + [Fact] + [Mock] + public void MockInitialization() + { + // Mock without anything mocked used to satisfy dependencies not used in the tests execution path + var emptyMock = Mock.IVersionLibrary(); + + // Mock with inline configuration useful for most setup scenarios + var inlineMock = Mock.IVersionLibrary(config => config + .DownloadExists(true) + ); + + // Mock with external configuration useful for more complex scenarios like testing events and modifying mock behaviour. + var externalMock = Mock.IVersionLibrary(out var config); + config.DownloadExists(true); + + // Direct access to the mock implementation. + var implementationMock = new MockOf_IVersionLibrary(config => config + .DownloadExists(true) + ); + } + [Fact] [Mock] public void SimpleReturnValue() From b4e10aca56eb2f6e228cfca9dea1d64c5fb25a3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lasse=20Sj=C3=B8rup?= Date: Mon, 6 Jan 2025 16:43:51 +0100 Subject: [PATCH 20/26] Fix minor issues with documentation --- docs/README.md | 2 +- docs/guide/construction.md | 2 -- docs/guide/methods.md | 4 ++-- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/docs/README.md b/docs/README.md index bce0625..195b3fb 100644 --- a/docs/README.md +++ b/docs/README.md @@ -32,7 +32,7 @@ MiniMock offers a _minimalistic_ approach to mocking in .NET with a focus on sim Try it out or continue with [Getting started](guide/getting-started.md) to learn more or read the [Mocking guidelines](guide/mocking-guidelines.md) to get a better understanding of when, why and how to mock and when not to. -For more details on specific aspects you can read about [Construction](guide/construction.md) [Methods](guide/methods.md), [Properties](guide/properties.md), [Events](guide/events.md) or +For more details on specific aspects you can read about [Construction](guide/construction.md), [Methods](guide/methods.md), [Properties](guide/properties.md), [Events](guide/events.md) or [Indexers](guide/indexers.md). Or you shift into high gear with [Advanced Features](advanced-features.md), [FaQ](faq.md) or [Troubleshooting](troubleshooting.md). diff --git a/docs/guide/construction.md b/docs/guide/construction.md index 8e127ab..e63f182 100644 --- a/docs/guide/construction.md +++ b/docs/guide/construction.md @@ -25,5 +25,3 @@ public void MockInitialization() ); } ``` - -~~~~ diff --git a/docs/guide/methods.md b/docs/guide/methods.md index 5cb0bff..0b7af0b 100644 --- a/docs/guide/methods.md +++ b/docs/guide/methods.md @@ -11,8 +11,8 @@ public interface IVersionLibrary } var versionLibrary = Mock.IVersionLibrary(config => config - .DownloadExists(returns: true) // Returns true for all versions - .DownloadExists(throws: new IndexOutOfRangeException()) // Throws IndexOutOfRangeException for all versions + .DownloadExists(returns: true) // Returns true for all overloads + .DownloadExists(throws: new IndexOutOfRangeException()) // Throws IndexOutOfRangeException for all overloads .DownloadExists(call: s => s.StartsWith(value: "2.0.0")) // Returns true for version 2.0.0.x base on a string parameter .DownloadExists(call: v => v is { Major: 2, Minor: 0, Revision: 0 }) // Returns true for version 2.0.0.x based on a version parameter .DownloadExists(returnValues: [true, true, false]) // Returns true two times, then false From eaac4673f48f3c1029295c469007203826840e03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lasse=20Sj=C3=B8rup?= Date: Wed, 5 Feb 2025 02:08:14 +0100 Subject: [PATCH 21/26] Cleaning up documentation --- docs/ADR/README.md | 19 ++------ .../ADR/{general => feature}/CreatingMocks.md | 1 + docs/ADR/feature/SupportForAbstractClasses.md | 6 --- .../feature/SupportForAsynchronousMethods.md | 5 -- docs/ADR/feature/SupportForConstructors.md | 24 ++++++---- docs/ADR/feature/SupportForGenericMethods.md | 6 --- docs/ADR/feature/SupportForInternalMethods.md | 5 -- docs/ADR/feature/SupportForMethods.md | 24 +++++++++- .../feature/SupportForOutAndRefParameters.md | 5 -- docs/ADR/feature/SupportForOverloads.md | 5 -- docs/ADR/feature/SupportForVirtualMethods.md | 5 -- docs/ADR/feature/SupportSkippingArguments.md | 25 ---------- .../ADR/feature/SupportedMemberAccessLevel.md | 31 +++++++++++++ .../ADR/feature/SupportingProtectedMethods.md | 27 ----------- docs/ADR/feature/TLDR.md | 43 +++++++++++++++++ docs/ADR/general/TLDR.md | 46 +++++++++++++++++++ docs/guide/properties.md | 1 + 17 files changed, 162 insertions(+), 116 deletions(-) rename docs/ADR/{general => feature}/CreatingMocks.md (91%) delete mode 100644 docs/ADR/feature/SupportForAbstractClasses.md delete mode 100644 docs/ADR/feature/SupportForAsynchronousMethods.md delete mode 100644 docs/ADR/feature/SupportForGenericMethods.md delete mode 100644 docs/ADR/feature/SupportForInternalMethods.md delete mode 100644 docs/ADR/feature/SupportForOutAndRefParameters.md delete mode 100644 docs/ADR/feature/SupportForOverloads.md delete mode 100644 docs/ADR/feature/SupportForVirtualMethods.md delete mode 100644 docs/ADR/feature/SupportSkippingArguments.md create mode 100644 docs/ADR/feature/SupportedMemberAccessLevel.md delete mode 100644 docs/ADR/feature/SupportingProtectedMethods.md create mode 100644 docs/ADR/feature/TLDR.md create mode 100644 docs/ADR/general/TLDR.md diff --git a/docs/ADR/README.md b/docs/ADR/README.md index 3762ee4..a94757a 100644 --- a/docs/ADR/README.md +++ b/docs/ADR/README.md @@ -4,7 +4,7 @@ Architecture Decision Records (ADRs) are documents that capture important archit All the ADRs have been approved and are considered final decisions for the project. -## General ADRs +## General ADRs [TL;DR](general/TLDR.md) - [Do We __Really__ Need a New Mocking Framework?](general/DoWeNeedANewMockingFramework.md) - Deciding whether to build a new mocking framework. - [Matching Target API in Mock API](general/MatchingTargetApi.md) - Ensures the mock API closely mirrors the target API. @@ -13,27 +13,16 @@ All the ADRs have been approved and are considered final decisions for the proje - [No Dependencies to Shared Libraries](general/NoDependencies.md) - Avoid dependencies on shared libraries. - [Documentation and Examples](general/DocumentationAndExamples.md) - Approach to documentation and examples for the framework. - [Logging and Debugging](general/LoggingAndDebugging.md) - Approach to logging and debugging within the framework. -- [Creating Mocks](general/CreatingMocks.md) - Decision on how to create mocks in the framework. -## Feature Specific ADRs +## Feature Specific ADRs [TL;DR](feature/TLDR.md) -- [Support for Classes and Interfaces](feature/SupportForClassesAndInterfaces.md) - Decision on supporting classes and interfaces in the mocking framework. +- [Support for Classes and Interfaces](feature/SupportForClassesAndInterfaces.md) - How should classes and interfaces be supported. - [Support for Constructors](feature/SupportForConstructors.md) - Decision on supporting constructors in the mocking framework. +- [Creating Mocks](feature/CreatingMocks.md) - Decision on how to create mocks in the framework. - [Support for Methods](feature/SupportForMethods.md) - Decision on supporting methods in the mocking framework. - [Support for Properties](feature/SupportForProperties.md) - Decision on supporting properties in the mocking framework. - [Support for Events](feature/SupportForEvents.md) - Decision on supporting events in the mocking framework. - [Support for Indexers](feature/SupportForIndexers.md) - Decision on supporting indexers in the mocking framework. -- Special cases - - [Allowing Skipping Arguments in Mock Setup](feature/SupportSkippingArguments.md) - Allows skipping arguments in mock setups for flexibility. - - [Support for Protected Methods](feature/SupportingProtectedMethods.md) - Decision on whether to support mocking protected methods. - - [Support for Generic Methods (WIP)](feature/SupportForGenericMethods.md) - Decision on supporting generic methods in the mocking framework. - - [Support for Asynchronous Methods (WIP)](feature/SupportForAsynchronousMethods.md) - Handling asynchronous methods in the mocking framework. - - [Support for Virtual Methods (WIP)](feature/SupportForVirtualMethods.md) - Decision on supporting virtual methods in the mocking framework. - - [Support for Overloads (WIP)](feature/SupportForOverloads.md) - Decision on supporting method overloads in the mocking framework. - - [Support for Out and Ref Parameters (WIP)](feature/SupportForOutAndRefParameters.md) - Decision on supporting out and ref parameters in the mocking framework. - - [Support for Internal Methods (WIP)](feature/SupportForInternalMethods.md) - Decision on supporting internal methods in the mocking framework. - - [Support for Abstract Classes (WIP)](feature/SupportForAbstractClasses.md) - Decision on supporting abstract classes in the mocking framework. - - [Support for Delegates (WIP)](feature/SupportForDelegates.md) - Decision on supporting delegates in the mocking framework. ## Unsupported Features diff --git a/docs/ADR/general/CreatingMocks.md b/docs/ADR/feature/CreatingMocks.md similarity index 91% rename from docs/ADR/general/CreatingMocks.md rename to docs/ADR/feature/CreatingMocks.md index 12e7955..2b0e3d5 100644 --- a/docs/ADR/general/CreatingMocks.md +++ b/docs/ADR/feature/CreatingMocks.md @@ -7,6 +7,7 @@ In the MiniMock framework, there is a need to establish a standardized approach ## Decision Mocks will be created using a mock factory. The mock factory will provide a centralized and consistent way to create and configure mocks, ensuring that all mocks are created following the same process and standards. +The constructors of the mock object will remain accessible but should only be used for limited purposes. ## Consequences diff --git a/docs/ADR/feature/SupportForAbstractClasses.md b/docs/ADR/feature/SupportForAbstractClasses.md deleted file mode 100644 index e6912bd..0000000 --- a/docs/ADR/feature/SupportForAbstractClasses.md +++ /dev/null @@ -1,6 +0,0 @@ -# Support for Abstract Classes (WIP) - -Abstract classes are supported to a limited extent. The framework will allow mocking of abstract classes, but only if the abstract class has a public or protected constructor with no parameters. -Support for abstract classes with constructors that have parameters will be supported in the future. - -Work in progress. diff --git a/docs/ADR/feature/SupportForAsynchronousMethods.md b/docs/ADR/feature/SupportForAsynchronousMethods.md deleted file mode 100644 index e6c0893..0000000 --- a/docs/ADR/feature/SupportForAsynchronousMethods.md +++ /dev/null @@ -1,5 +0,0 @@ -# Support for Asynchronous Methods (WIP) - -Asynchronous methods are supported. Helper methods are provided to simplify the testing of asynchronous methods. - -Work in progress. diff --git a/docs/ADR/feature/SupportForConstructors.md b/docs/ADR/feature/SupportForConstructors.md index c3a282f..4edb25f 100644 --- a/docs/ADR/feature/SupportForConstructors.md +++ b/docs/ADR/feature/SupportForConstructors.md @@ -2,29 +2,33 @@ ## Context -In the MiniMock framework, there is a need to determine the scope of support for mocking constructors. Initially, the framework will support only classes with parameterless constructors. -This decision simplifies the initial implementation and allows for a gradual introduction of more complex constructor support. +In the MiniMock framework, there is a need to determine the scope of support for mocking constructors. ## Decision -The MiniMock framework will initially support mocking only classes with parameterless constructors. -A plan for adding support for classes with parameterized constructors is being developed and will be implemented in future iterations. +All constructors with the supported access level should be accessible. If no constructor exists, a parameterless constructor is created. +A factory for each option should be created. -Since the main focus of the framework is to provide a simple and easy-to-use mocking solution for interfaces and classes, -the decision to start with parameterless constructors aligns with this goal. See ADR [Support For Classes and Interfaces](SupportForClassesAndInterfaces.md) for more information. +If only internal or private constructors exist, the class is not generated and a warning is registered. + +Additionally, the framework should support the following: + +- **Parameterized Constructors**: Allow mocking of constructors with parameters, providing flexibility for more complex scenarios. +- **Constructor Overloads**: Support multiple constructors with different parameter lists. +- **Dependency Injection**: Enable mocking of constructors that use dependency injection, ensuring compatibility with modern design patterns. ## Consequences ### Positive: - **Simplicity**: Simplifies the initial implementation by focusing on parameterless constructors. -- **Incremental Development**: Allows for a phased approach to adding more complex constructor support. -- **Usability**: Provides immediate value by supporting a common use case. +- **Flexibility**: Supporting parameterized constructors and overloads provides more flexibility for developers. +- **Compatibility**: Ensures compatibility with dependency injection, making the framework more versatile. ### Negative: -- **Limited Scope**: Initial support is limited to classes with parameterless constructors, which may not cover all use cases. -- **Future Work**: Additional effort will be required to implement support for parameterized constructors. +- **Complexity**: Adding support for parameterized constructors and overloads increases the complexity of the framework. +- **Maintenance**: Requires ongoing maintenance to ensure that constructor mocking remains robust and up-to-date. --- diff --git a/docs/ADR/feature/SupportForGenericMethods.md b/docs/ADR/feature/SupportForGenericMethods.md deleted file mode 100644 index 0346db3..0000000 --- a/docs/ADR/feature/SupportForGenericMethods.md +++ /dev/null @@ -1,6 +0,0 @@ -# Support for Generic Methods (WIP) - -Generic methods are supported. -The generic type is passed as a type parameter to the 'call' labmda method. - -Work in progress. diff --git a/docs/ADR/feature/SupportForInternalMethods.md b/docs/ADR/feature/SupportForInternalMethods.md deleted file mode 100644 index dc96cc9..0000000 --- a/docs/ADR/feature/SupportForInternalMethods.md +++ /dev/null @@ -1,5 +0,0 @@ -# Support for Internal Methods (WIP) - -Internal members are supported for mock targets where InternalsVisibleToAttribute is used. - -Work in progress. diff --git a/docs/ADR/feature/SupportForMethods.md b/docs/ADR/feature/SupportForMethods.md index 3d38120..e9639e6 100644 --- a/docs/ADR/feature/SupportForMethods.md +++ b/docs/ADR/feature/SupportForMethods.md @@ -2,7 +2,14 @@ ## Context -In the MiniMock framework, there is a need to determine the scope of support for mocking methods. Supporting all standard ways of creating methods is essential to ensure the framework's flexibility and usability. However, there are currently issues with supporting methods that return `ref` values, which need to be addressed. +In the MiniMock framework, there is a need to determine the scope of support for mocking methods. Supporting all standard ways of creating methods is essential to ensure the framework's +flexibility and usability. + +The following type of methods must be supported +- __Asynchronous__ with Task<>, Task, CancellationToken +- __Overloaded__ methods in a way that keeps the required effort to setup the mock to a minimum. +- __Generic__ Including the 'where' __constraints__. +- __Out__ and __ref__ attributes on the method parameters. ## Decision @@ -18,7 +25,20 @@ Methods must be mockable using the following parameters if none of the above parameters are provided, calling the method must throw a InvalidOperationException with a message in the form "The method '__[method name]__' in '__[mocked class]__' is not explicitly mocked.". -Special cases like [Overloads], [Generic Methods] and [Async Methods] have dedicated ADRs. +__Asynchronous__ methods are supported. Helper methods are provided to simplify the testing of asynchronous methods. Overloads of the following helper methods are added + +- Return : Allows for returning either a Task object or the object to be wrapped in the task object. +- ReturnValues : Allows for returning either a sequence of Task objects or a sequence of objects to be wrapped in task objects. +- () : Methods returning Task can also use the empty delegate. + +__Overloaded__ methods can either be mocked explicitly by using `Call` or collectively using the following + +- Throw : An exception to be thrown when calling any of the overwritten methods. +- Return : A value to be returned when a method with that return type is called. +- ReturnValues : A sequence of values to be returned when a method with those return types is called multiple times. +- () : Methods returning `void` or `Task` can be mocked using an empty delegate. + +Generic methods are supported. The generic type is passed as a type parameter to the 'call' labmda method. ## Consequences diff --git a/docs/ADR/feature/SupportForOutAndRefParameters.md b/docs/ADR/feature/SupportForOutAndRefParameters.md deleted file mode 100644 index 7adeb16..0000000 --- a/docs/ADR/feature/SupportForOutAndRefParameters.md +++ /dev/null @@ -1,5 +0,0 @@ -# Support for Out and Ref Parameters (WIP) - -Out and ref parameters are supported. - -Work in progress. diff --git a/docs/ADR/feature/SupportForOverloads.md b/docs/ADR/feature/SupportForOverloads.md deleted file mode 100644 index 5501ccf..0000000 --- a/docs/ADR/feature/SupportForOverloads.md +++ /dev/null @@ -1,5 +0,0 @@ -# Support for Overloads (WIP) - -Overloads are supported. - -Work in progress. diff --git a/docs/ADR/feature/SupportForVirtualMethods.md b/docs/ADR/feature/SupportForVirtualMethods.md deleted file mode 100644 index b1ada4b..0000000 --- a/docs/ADR/feature/SupportForVirtualMethods.md +++ /dev/null @@ -1,5 +0,0 @@ -# Support for Virtual Methods (WIP) - -Virtual methods are supported. - -Work in progress. diff --git a/docs/ADR/feature/SupportSkippingArguments.md b/docs/ADR/feature/SupportSkippingArguments.md deleted file mode 100644 index e0770ed..0000000 --- a/docs/ADR/feature/SupportSkippingArguments.md +++ /dev/null @@ -1,25 +0,0 @@ -# Allowing Skipping Arguments in Mock Setup - -## Context - -In our mocking framework, we have the option to skip arguments when setting up mocks for methods. Although this feature has been found to be rarely used, it can provide significant flexibility and convenience in certain testing scenarios. - -## Decision - -We will allow the skipping of arguments when setting up mocks for methods. This will enable developers to focus on the relevant arguments and simplify the mock setup process when certain arguments are not needed for specific tests. - -## Consequences - -### Positive: -- **Flexibility**: Provides greater flexibility in setting up mocks, allowing developers to skip irrelevant arguments. -- **Convenience**: Simplifies the mock setup process, especially for methods with many parameters. -- **Focus**: Allows tests to focus on the relevant arguments, improving readability and maintainability. - -### Negative: -- **Clarity**: May reduce the clarity of tests if arguments are skipped without proper documentation. -- **Consistency**: Could lead to inconsistent mock setups across the codebase if not used judiciously. -- **Error Potential**: Increases the risk of errors if skipped arguments are assumed incorrectly.~~~~ - ---- - -More ADRs can be found in the [docs/ADR](../README.md) directory. diff --git a/docs/ADR/feature/SupportedMemberAccessLevel.md b/docs/ADR/feature/SupportedMemberAccessLevel.md new file mode 100644 index 0000000..61d9d5b --- /dev/null +++ b/docs/ADR/feature/SupportedMemberAccessLevel.md @@ -0,0 +1,31 @@ +# Decision on Accessibility + +## Context + +The accessibility rules that applies to a manual created mock should also apply. No magic reflection logic will be done to access otherwise inaccessible members. + +## Decision + +As such the following will be accessible. + +- **Virtual** and **Abstract** members must be supported. +- **Protected** and **Public** must be supported. + +And the following will not. + +- **Partial**, **Sealed** and None overridable members will not be supported. +- **Internal** and **Private** members will not be exposed. + +## Consequences + +### Positive: + +- **Predictable**: Only exposes the parts of a mock that would normally be exposed. + +### Negative: + +- **Limitation**: Will not support advanced use cases. + +--- + +More ADRs can be found in the [docs/ADR](../README.md) directory. diff --git a/docs/ADR/feature/SupportingProtectedMethods.md b/docs/ADR/feature/SupportingProtectedMethods.md deleted file mode 100644 index 07c1726..0000000 --- a/docs/ADR/feature/SupportingProtectedMethods.md +++ /dev/null @@ -1,27 +0,0 @@ -# Mocking Protected Methods - -## Context - -In our mocking framework, there is a consideration to support mocking protected methods. Protected methods are often used in base classes to provide functionality that is intended to be used by derived classes. Supporting the mocking of protected methods can enhance the flexibility and comprehensiveness of our testing framework. - -## Decision - -We will support the mocking of protected methods in our mocking framework. This will allow developers to create more thorough and flexible tests by enabling them to mock and verify the behavior of protected methods. - -## Consequences - -### Positive: - -- **Flexibility**: Allows developers to mock and test protected methods, providing more comprehensive test coverage. -- **Thorough Testing**: Enables testing of internal logic that is encapsulated within protected methods. -- **Consistency**: Aligns with the ability to mock public methods, providing a consistent approach to mocking. - -### Negative: - -- **Complexity**: May introduce additional complexity in the mocking framework to handle protected methods. -- **Maintenance**: Requires ongoing maintenance to ensure that mocking protected methods continues to work correctly with future updates. -- **Potential Misuse**: Developers may misuse the feature by over-mocking, leading to tests that are too tightly coupled to implementation details. - ---- - -More ADRs can be found in the [docs/ADR](../README.md) directory. diff --git a/docs/ADR/feature/TLDR.md b/docs/ADR/feature/TLDR.md new file mode 100644 index 0000000..875164c --- /dev/null +++ b/docs/ADR/feature/TLDR.md @@ -0,0 +1,43 @@ +# TL;DR + +## Summary of Decisions + +### Decision on Supporting Classes and Interfaces +- **Context**: Determine the scope of support for mocking different types of members. +- **Decision**: Primarily support interfaces but also include support for classes. +- **Consequences**: Flexible and comprehensive but adds complexity and requires ongoing maintenance. + +### Decision on Accessibility +- **Context**: Determine the accessibility rules for mocking. +- **Decision**: Support virtual, abstract, protected, and public members. Do not support partial, sealed, non-overridable, internal, and private members. +- **Consequences**: Predictable behaviour but limited to standard use cases. + +### How to Create Mocks +- **Context**: Establish a standardized approach for creating mocks. +- **Decision**: Use a mock factory for centralized and consistent mock creation but keep constructors accessible. +- **Consequences**: Ensures consistency and ease of use but adds complexity and maintenance requirements. + +### Decision on Supporting Constructors +- **Context**: Determine the scope of support for mocking constructors. +- **Decision**: Support all constructors with the supported access level. If no constructor exists, create a parameterless constructor. Do not generate classes with only internal or private constructors. +- **Consequences**: Simplifies initial implementation but limits advanced usage scenarios. + +### Decision on Supporting Methods +- **Context**: Determine the scope of support for mocking methods. +- **Decision**: Support all standard ways of creating methods, including instance, static, virtual, and abstract methods. Address support for methods returning `ref` values in future updates. +- **Consequences**: Comprehensive and flexible but adds complexity and requires future work for `ref` values. + +### Decision on Supporting Properties +- **Context**: Determine the scope of support for mocking properties. +- **Decision**: Support mocking both read-only and read-write properties in classes and interfaces. +- **Consequences**: Comprehensive and flexible but adds complexity and requires ongoing maintenance. + +### Decision on Supporting Indexers +- **Context**: Determine the scope of support for mocking indexers. +- **Decision**: Support mocking both read-only and read-write indexers. +- **Consequences**: Comprehensive and flexible but adds complexity and requires ongoing maintenance. + +### Decision on Supporting Events +- **Context**: Determine the scope of support for mocking events. +- **Decision**: Support mocking all types of events, including standard, custom, and events with different delegate types. +- **Consequences**: Comprehensive and flexible but adds complexity and requires ongoing maintenance. diff --git a/docs/ADR/general/TLDR.md b/docs/ADR/general/TLDR.md new file mode 100644 index 0000000..de9ee5b --- /dev/null +++ b/docs/ADR/general/TLDR.md @@ -0,0 +1,46 @@ +# TL;DR + +## General concerns + +### Need for a New Mocking Framework +- **Context**: Existing frameworks are complex and have external dependencies. +- **Decision**: Develop MiniMock with a minimalistic API and no external dependencies. +- **Consequences**: Simplifies usage and improves performance but may lack advanced features and require development effort. + +### Supported Features +- **Context**: Which features should be supported, which should not and where do we set the bar. +- **Decision**: Common features that can be used in interfaces and classes should be supported but no 'magic' must be used. +- **Consequences**: Ensures predictability and consistency but limits the usage to what standard scenarios. + +### How Strict the Framework Should Be +- **Context**: Determine strictness for handling calls to non-mocked members. +- **Decision**: Be strict, throwing exceptions for non-mocked members, with special handling for events. +- **Consequences**: Ensures precision and error detection but requires more setup effort and special event handling. + +### Matching Target API in Mock API +- **Context**: Mock API should closely mirror the target API. +- **Decision**: Reflect the target API with minimal additional methods. +- **Consequences**: Ensures consistency and ease of use but limits flexibility and may require more effort for certain features. + +### No Dependencies on Shared Libraries +- **Context**: Consideration of including dependencies on shared libraries. +- **Decision**: Do not include dependencies on shared libraries; implement functionality within the project or use static linking. +- **Consequences**: Provides control and stability but requires additional development effort and maintenance. + + +### Documentation and Examples +- **Context**: Effective documentation and examples are crucial for adoption and proper use. +- **Decision**: Create concise documentation and examples covering installation, configuration, usage, and common use cases. +- **Consequences**: Enhances clarity and adoption but requires effort and maintenance. + + +### Logging and Debugging +- **Context**: Effective logging and debugging are essential. +- **Decision**: Implement logging and use `DebuggerStepThrough` for smoother debugging. +- **Consequences**: Improves traceability and debugging but requires implementation effort and may introduce performance overhead. + +### No Built-in Assertion Feature +- **Context**: Consideration of including a built-in assertion feature. +- **Decision**: Do not include a built-in assertion feature; rely on external assertion frameworks. +- **Consequences**: Provides flexibility and simplicity but requires users to manage additional dependencies. + diff --git a/docs/guide/properties.md b/docs/guide/properties.md index 3c759aa..928b50f 100644 --- a/docs/guide/properties.md +++ b/docs/guide/properties.md @@ -22,3 +22,4 @@ __Please note__ - Multiple specifications for a property will overwrite each other with the last one taking precedence. - Parameter-names can be omitted but make the code more readable. - Any property that is not explicitly specified will throw an `InvalidOperationException` when called. +- If the mocked interface or class only exposes get or set only the exposes parameter will be shown. From 50a1acc2a4f16e5d77f649e611ac8048cdd90c9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lasse=20Sj=C3=B8rup?= Date: Wed, 5 Feb 2025 02:28:08 +0100 Subject: [PATCH 22/26] Fix broken images --- docs/guide/getting-started.md | 12 ++++++------ docs/guide/img.png | Bin 3640 -> 0 bytes docs/guide/img_1.png | Bin 18130 -> 0 bytes docs/guide/img_2.png | Bin 18130 -> 0 bytes docs/guide/img_3.png | Bin 18130 -> 0 bytes 5 files changed, 6 insertions(+), 6 deletions(-) delete mode 100644 docs/guide/img.png delete mode 100644 docs/guide/img_1.png delete mode 100644 docs/guide/img_2.png delete mode 100644 docs/guide/img_3.png diff --git a/docs/guide/getting-started.md b/docs/guide/getting-started.md index f0472e7..aebb1d1 100644 --- a/docs/guide/getting-started.md +++ b/docs/guide/getting-started.md @@ -32,15 +32,15 @@ public void MyTest() { ## Quality of Life -MiniMock is __extremely strict__ but __fair__, requiring you to specify all features you want to mock but giving you fair warnings if you don't. +MiniMock is **extremely strict** but **fair**, requiring you to specify all features you want to mock but giving you fair warnings if you don't. This is by design to make sure you are aware of what you are mocking and not introduce unexpected behaviour. -![img.png](img.png) +![exception](exception.png) -All mockable members are available through a _fluent interface_ with _IntelliSense_, _type safety_, and _documentation_. +All mockable members are available through a **fluent interface** with **IntelliSense**, **type safety**, and **documentation**. -![img_2.png](img_2.png) +![documentation](documentation.png) -All code required to run MiniMock is _source generated_ within your test project and has _no runtime dependencies_. You can _inspect_, _step into_, and _debug_ the generated code which also allows for _security_ and _vulnerability -scanning_ of the code. +All code required to run MiniMock is **source generated** within your test project and has **no runtime dependencies**. You can **inspect**, **step into**, and **debug** the generated code which also allows for **security** and **vulnerability +scanning** of the generated code. diff --git a/docs/guide/img.png b/docs/guide/img.png deleted file mode 100644 index 6eacfcdc09a279aa6d11d29784c8c0aa963a35d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3640 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 G5&s6ELLVLg diff --git a/docs/guide/img_1.png b/docs/guide/img_1.png deleted file mode 100644 index 76bbe64e8d3aa6f53e46ab9b1ba563615523a63d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18130 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 eUVP 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 diff --git a/docs/guide/img_2.png b/docs/guide/img_2.png deleted file mode 100644 index 76bbe64e8d3aa6f53e46ab9b1ba563615523a63d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18130 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 eUVP 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 diff --git a/docs/guide/img_3.png b/docs/guide/img_3.png deleted file mode 100644 index 76bbe64e8d3aa6f53e46ab9b1ba563615523a63d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18130 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 eUVP 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 From 3fd6f29c0850482870f3bf92c10baa43b70b211b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lasse=20Sj=C3=B8rup?= Date: Wed, 5 Feb 2025 02:28:08 +0100 Subject: [PATCH 23/26] Fix broken images --- docs/guide/Documentation.png | Bin 0 -> 47018 bytes docs/guide/Exception.png | Bin 0 -> 5690 bytes docs/guide/getting-started.md | 12 ++++++------ docs/guide/img.png | Bin 3640 -> 0 bytes docs/guide/img_1.png | Bin 18130 -> 0 bytes docs/guide/img_2.png | Bin 18130 -> 0 bytes docs/guide/img_3.png | Bin 18130 -> 0 bytes 7 files changed, 6 insertions(+), 6 deletions(-) create mode 100644 docs/guide/Documentation.png create mode 100644 docs/guide/Exception.png delete mode 100644 docs/guide/img.png delete mode 100644 docs/guide/img_1.png delete mode 100644 docs/guide/img_2.png delete mode 100644 docs/guide/img_3.png diff --git a/docs/guide/Documentation.png b/docs/guide/Documentation.png new file mode 100644 index 0000000000000000000000000000000000000000..ae0339ecaa9d639200600a2303480ac6ba6b7887 GIT binary patch literal 47018 zcmce;WlUvF)HT>N?rx34#oZkmcX#*3-5oCOu8q69YvYYOT)c62_u)<6=bQOG$xK#q zWS`VNyDF(ur)sTT5sLB>h;TpPzJ2?KC?zSX{OubU=jdVkEFt`@ zW(xoK+c)BGQldht9{Ok9_wM*wIp?oZ;zH65fWq{Q72-}1qS}Vu`l7G-WM)R^=Bx9j zm-U5?^QG*r?DQQQM$k&44KsQ8tZ~WSga<9DN{eab*gnmunjYqJ5(XvGc>sX{mpN^Y z?}r%JGbI`E|A9jp43#O6UzKlv*c9SF03b|(DfSS!VE>CivY$UGKxE(4?3BfS{s#)p zXTo^Y|G@SAs|^2l#eE91|KsM%$>o18z;ORRbMg-lpb1tj{WIvh!q33Z1nc@zJ{akJ z?Ce+ij(BNA?QEoK?GO|MVq%oL*DKF%h#u=s0a{EPSLtYNNI!)Dg1CUovV$^Z<0V?A zioSEWhFwe;{9!ZyOy~IFN>OX3f@PYkcHOpazgW12fq+BFRYi-L6LzZa`aS}JePLi8 zy3gpy(m!jl6yfsSC-c`iy+`s;n93k9gdlVNp*DRE-oB@*E1ocAHc|O7tP_5s_8_Mm z$^Jq(A+8~y)c3!_^B(SD24bq}SDxL~jjuWOSOl37j+ z9Ibr|rc$!Lw{W#e4t_y5m*58 zXbBB>=S41_{rz4S`KJ1&YzXMRE9AOe>u3&VKvM)_R^^(V<$0$atK- zPn)JIC++yk+^Va~Y6h%3X;~if%=gyVg^ouVv>vXo)|~pQBtAruN!quU3y#>4386y7 z`$|lpO?yxq;XBXUIxY=cglgB5$doz!o!=8`t8Em-9S<8#u`1<1=k0q)CCht@g&n;P ze<$Vkr}~F``=we3Or+9C!>N)tAJ~#-d7F2UDvyU&+Efi)sy?pez-s@egd0kNkUYoR zerih8HStXKy9ojoH{kG)OsOu;!1*+h)2jiOK`~aLR9OGv@cA_Xu4VZ>D$XL9t{tbq z=Lf8x(#mE%yyIfmeH0Iy-sSaZHpxNmlkd}hO&9T?;>TDe-*5Dy-D#p37OwFrG6P40 zn(A8br7eiQ76v})KMH(~#ZWO15as0LrU%)>I6V>=6$A&~Yjtj`nje`IC3%v>-5oha zf3?K5b<(v3|4n{EfMY`-V&j>3bZ$;u{|r~u^Gk4nEIGq_d!C}mK2>-C`U5YByiYi# z>U!<(9U25uTdm1P7ob)iARJ%Z!tnpB){o_OWFd6+c>DlrO~;)UdN8X@YL5K)+}JnW zV@CEzZ$PM|$bVxIq>D2?m{PO5+ccqM$c>D&a#G$^gzBQx z7RM5KNCF*_45ln-SM;>PfnljSfZX?d{bt4N1q;v zbJ*2}54xQaVam(F@2(Z9Gs3RSMfUe=;kh_Ghv|D(mP6s<+5AOIC29;9AW^Ty#>*QF9Q%*!HsvO2j51Z4a=)3& z;nVAX$TUh~#YqO)G7AqFWZeT*&te#Z_0Izg#v!H|7R^7(eapj%g=#H?1W$xFW$F$_ zT|dqbeh|r4l-buw7U6OBj@l2In1GEA)hzOx&O$3_ zHps|Y6DGG%Bp!yg3{GphAcKwvQ8hE3{QMDe#Sz-^H&TlsGJY7SR3YmeY!`v7e(N5u zVN;F=l60=0nN_ehX0N>{9+!;bTziO6NJ!oi-(F2T{&HhSWAe8y?xU1Pn@=8VuH~FJz~V1m6L+qRe9(T8MCja(VoPNv;QSC41Sxr#HX;+cu+r@lt?% zVZw#~wcSbMBRW$EJ*e1EJd^@-SNYJ4 z%l8NPzWyQjm|ZGv&r+})u^Fv4HDYhP$~@DYZ$|!BbNwX3u%YKITL@R60arFi0uOg= zvP8@0k?W)Hd1VBzUOr;8P&hQ+GEd)5MfAGXEIK5iRxDf$x3lRcO#)H88Lh-(56OiYLExeS+7V4pr-1=^PAMid{+@AYB>ST?6XA(8@*2Rtht=H;@;Uj)B|$sGo^i zyxiWUCgZM2yd$YOAAn+%IPHV*LItO9ecRWG|fj0cJ0x>nGg-Eqc{af3+-#WSJ@t0S2EHqBzXeYVqedFpxSV?goNV z%Uk!)>w3S8m9cU5-dQ=LKvxp2cqSHtEUk|!fD5)gd~tB7T~Z>*Vloz*grZ-{wkitW z_o%oUuHx8$#mQQ0{8xIHo4u6~YF~K)R731*#<8uj!vir<-uL3+{^NctryG`VWoV_B zw2ZUUye*!wk_UwLMa-|6;)jJ?YWfn6W=L3~!W)KeE?|9m zBK!D5vr9uj#?<)`_PxDQne!+{{uquwk>?y6=Nl7(clVwseSTcHqT#I9QSi)NIf(A| zRX1w~1Q+Ftsv09#jZWwzm_mG1%+UPnU5&#;JbG>N;@4B{7CF4=MaQdfy`8&cjm)8( z)(CX1)mNt_^y|mY}zAL?O;2-MM#getoes5>CY?jU5eJBKn*YEZv{-F!Kry>a2Z2y{Q zoS5(3+Hu@t5H$2t*T3)F?wQV|iuZJ>QEB->UQn730ftjWXEsOat^i48SKNqSWZEH6 zdchI@gpoyPtqRbUC8OEVb&v8YtF!B$2{5$5M{XGt(^5jke5MwE%Wm2B*%6t^hwi+?6EC;83LRVE{BAXHpIfW?6drU;w)&_h7aFB#flkcC@#>n!rvpd!6vXr z@B{U>Lhgq|vNW+WUa|nxStG?o)v;z`kDxCGrJV}aKBaPg{3hkOGle!MyA3QHoAf2w zzO6IGDhInw#m1}dpmXW;%|X;X#_7n@>7qIm1s0)9lduhBZMSc#MQv_+xFl)evc<zjmZkbqxJV6B;d0c6vQ1oBhcftCeQ+_ zT|ZKLb&pLws1xUM-+|7*c!~U1gH4tq0ul#1T0I(d^KJ(eED7`nHE&G(RyC!ivlwLm z2n^T0VH2@yWz4BviG#%6t{o7t4c0Chuy(9GPSct#csBQwItS>`g+3ZD9qPFvxPk(d zJ7q^MKl@`gl~RMO5Fi<^-KQ~~DZ~|iDi+)$UTxNHmAaY+ZfIDJHGX2>uOF!E2qtZP z8}O3@ZX5u$ghqrRmN^!1Vi=}~oD1E5v~^Svv-aKNd_C;a5_<(^oZ?ySkhXFY9g?(J z?wn)-t00!iAZWE4Yr<`(w0vx;GTPfq%%H=g?oh)1+?3?(hY4Uqs=&3Ync*Wx8`+VcJsqv6C}lE2f8C&X8PPyBcA~DH zBKKO6SLlpU6M^$w+y_7nJ2bhnRD$09F}%Hr0{5ITC^9s0EQV>8I7{L+RKyDu=={F} zG1+uGaL`EwU*USKHv4n22G*KUHGeHVFYBB((N4a-b%kK>`1&}Rq--Gz4|u}YVxOj? z!8T7TxQVd|QZv;t*Nxd{wp^8tT&deaMD}6&xvoi>T9(Cm)c&5Xsk&LINIjg^^59q+ zF!;J7B7?KU?_>rUY`LQ9;g7Ge{~|42e%fkXI$jdJiE^Ih^PU(9TULJ-iThnleAdih zl33_bO_R7P$?5;%k|L-Hd6E;eeJ@Qmw$1*rf55X0Jn&@(`C^?tVD(zA?9E5iLDIr- z>5)Wn^N>g8a*8@rFO8Q@>P$#vwrQG*vbGO@+O6h!O7sdsStBc|V-L`JdZ|~9znz{V zUNA&#Z6o_Zw}*#NkzMkcY^Uh*kH3$<<(4376IG<*|z-Ou(#)YKv z+@k9CnA!Fqz2MN~#s$^v!NqyuPkw%_!_(0jxw)meVbD57y(gn$0$!i+GW}W9EJhac zkYV)_tcxe3l8;SPpZ@haJ;JDYId!ygdv8qNH6*|T06!COp$Qg)ZA~RP%k(mu+cwAX zr^+C@&rYRa;bt=nwo+v%0)(hv2Z3wA=IE{>v=l*q;$l_9m|l0DD)IBNAtJ{%upn$q zVYud2I2g!KzrMTs3~pSP+CSd4t|{a-GyJ-|hMTTG+`c=w3-8_Xu&zP^^o?*bW9)sM zclDxN7Ahxu4C&o1-o5p?Sz&*n;H<;w?*DyAhVyd9nt9%MhX0SW=aS3QC%u#QATZtUKzzn1!nn$<&>z4C=i|FpR|9F2~vL zq^|(P&px|ydL9M0r?hDVpNU+{RzLbFtH~xhjj8c1M7?dP`PpsS z4RADnEF@+3Q1pe;Ei8GG4fsJ8gwSYb&()K&r-DXMtE>$Y=RXE1*z4<|QEWh&aw6j! zp5P{dBO}})>G;wWH{n{&GxJtvYFq(^F{69xDTz4vBeSdI33Yi2q@^8MyRu9(y|OM! zA)<4no>T1@FvbM+Z>Ylj0fyDqgBU3Z|L}%L63am!Bq&vmJ~0M}FWebelhZ61E?av0 zt#UedypKs&y&J3I*_3F%AS%B4C@&iEZc_qK6!AxESY;4lGUdb@okm|aZRK0fqQXTn zN}tzj+HJ4X^7PaE z*4r^ZSU)~cj9hIi|1w5wH!IIZBJN;dB+@RIA!(KRr>oy87lsfO(;V68Z*#i0)JvQz zIC*hFbuzA4jEq9Jay}W((DGXpkiWY5vMpXqFTjC4E$8BxI(JmIb!(@ z0-@1uvN3{&@Z7>e42F#nTHGf_A`+EJAGOO8)$n*Iw93@t8VzM4G*9}Lc>g3)L^U{* zi_*E8oD!@*_PVMPmv>|xAwmy;n^Z+CF~OQHl;)?qFtHSq-TF`;gveLLWq5Iqm_JLPyADYmTH8Err6m>55s|;wDsbghGvIrM)NsZf$<_ zm!-@GQnxI4$x=#tezfzzDeJm?Y=dWdjlfC-a#4+1Ue>Su{!UK0j?;?3R(+xc1I%-~ zeY3dxkI7OK(ABvxQ5}etH8?l2Dt@Vhu9P-p#sdzfx*?A9aMn zw15@9n+RApu##zIr;t>-6-1OgkYMo{gJ?1u?GJXl=La`xl+=w0WBUBKfz`-bjr8CX zA@u8%9g{Pjm3YQ2hm5kez_6C1g?x=}4S2Ci?_9vI;HG7=0u}(4a6)GK| zYUL4v0u8CRB?P66j)N51-ytAguO;cy^aZ149aD5R&`B7hRD; z2$aL#=$9dBy&7QHiSGnWMg&OKc^wdrHSk%K06!48)iASE6r#vF)#L(Pg zcP$#F0CW`e#cC~}?G5jE6~pc4 zc`&<(i!Ch5-9Bgt+Qh5gO8wBALY0s``uKjk3GWw|35V(xa_Wpr6?OV@AM9tAGfKo_NS>0@VKT+az<4Luu zl;Y$$P4YHo#=AAUo?lAZU{dUj4YnnAB1wtL2MoAvuOb98YB_~kvP86OMn^z=!v19jwzy`CPJGv&qTsIQx^I$(c(r(L z2T;y#-!PJDQmb3c70T6YOPKF!_4vi;EKze1)*B*|f)1&938;N7_%-?J1J4IOcce#P zZc9of>PS&34PGSlr*#h--Flpy4L%TUC8JfEgiwZky;mT+nA`;?LRC zJD}|x~%nZ6lBx>KqlAwK5=)n8ZFjsR3`(sS0 ztl2^p4wwlsH#Wvy+%aP44gJ^xq#~Oet)?QK;skEA2-#eNTi-{}gFY||;Ay$~0O04@ z6BjU46UT{BTz#y;=Q5q)kS?VYZyTQQX$p{SUal#hI2v;vQ~jshR-rs%?w1tZ3u#G+FVGs1+I1XE%6`Mlm$jbOj#A}rcv{(Ka*xOyL@GqjH zpVfvz(9qDovB^vte*H4qZ5C`*?+%&Mb!q=HEHn@C$3s%qHr`G_Xd_2cuS_}~gc*H# zb+qCNwA3BCjlt3%4W>va)5(q=@ehQ2<(874du$SyGP0zz*T|GwgoPM%t@Yz1+SJ?? z^xmNR(d&^RZ>5iL$tJ3VTWjj;k@D&4oc%lq8u^7z&3bC%X*DB+V;F(D?% z`X|pf+SSrG-Xc5lR1^H^-cp&*wHA_=N{Se5~+I_Xol~p25eq@g)aWf`*ICsM%Pm-C-!ZAG@xSM01gv0?G}%$u@@+~{>Xo8( z^2S->cC}}zyq?#=(2FGrCFjH`(3*A9)l$;^O1U+A(1+urEOIxq{{GUhSN&wE3xQZR zE~t#XTA>w{Avy#ibW)?r#=u0vkZC+=oW|ta6W&86UV$Bz*&EkLb(5#`cM zA@T)F*O5?$=JaoS^Tv;B^H+LMpanyhBbM)_x6d34mDcPD`k}||IZd*y|3M)ME21DR z*^En&4!=oN@Fj1y6fz;BKnPS2Pr%4&5}kU2t4y%I)DAQqEm0#*C?Z*8VU{Nbllg!v91nA4| zNm&a&ywVV4pTM&s+@$WqG$z(JVWm$^k)@rqIe9F@@BhRGaxgnuXfxMNfqo8+HupCK@N($RpL^>Paf8vss()Bgj^vr6`LZIFdyL z(Q9IpJ+=qsrW>w7p(lvMraXWHm#4mIA&wk*EJF5@0cQ5Ydu;@_v}1y zZU`re?F(J*i^R=~(8BUlLKi9@9wMr-VZt;!*zb^(ud%s$JwO!DTD-Y=K7y8#Kj&SC zuV7j?@Tl7Ef40#7J6pfdJYm1uvLb*eXdbwP^ zR<++fRcy)`+qrCkw}vnjq^j+bY7=PGv%mHiw zk{-aYT8McH1A#z{H}Krqdk6^Hj_9CrY-;X8Gq;JcyDly}*3!s%#dSP$uUW~5kT95~ zba5kJ*wkvH;ZRCIYt4rXW-+;=jVnhOJ&2`X=^Ozuy77S7xuY$#=`W^Dc6PLVE~phL zwaJ`{yU_U8;Mg7TsEX6M13+M8mF$iFScD(FvE^GZ8EM+{Y?A2(m7!^n&=6jz=f$(+ zN(c4blxVF)vT}Q=0QD7V4`AaoRaE4?_$OXwNNOBQjR(^`b;v0&E115#%X;xoohD(U zRI|F=cp_@&R;NEf6^m&-1qR;$D?4P?iskN>V4GYoj>db|mJkGOPUgZDmf!^3+{)5e z9*#A30kvNbioFKsJ2-k3{3zSUM&+J|wne*%xz%KtGjC2st3JiDcNnibfvi0Zm)1KC zBYT$7eWStk#WIN|Nl29c=Z}?<1pp-U^VKwG@g7COG{F7p6md|V&AHS)i#!fk_Lkg|8(mI{}3CO#py3THD#Nr6PCULRB5(%X#aqSB6_F2+#ncMyp{3GIw*RU$1A+m zfdPgzjEiyUXdff)T?cj9LWK@zXkQa+NkCb&X@d9)sNg=2hg&))K=7K_WOr%W`;+t=U;%3w02m~EXkuK7sN9M zq!gfc$^^x{q{yFFC}B0gmk|awszFe{t_%SJor!OW-(zuMQe2yj@v{2JmgwmL0$f9q z3Lf*}VR6**NhC{%;o~kK%d*H7^v?uA-Pt3hktp!buG z&xW5OzP1>G44jE=kA*^4POYBVy)GT;u(@=0>ptsUQ{F}_c4cup5@zCWLDp~ewoypU5u8>9 z9@JWS`wu++1aQjA*pvG<>`8j3Z|%-uV5NyW4KrMBjlnC9H%9YNLB3?8ndfZ365vVbA&PGKY5_Qf1)>`wjf>>(C4V&CV%y zt+6{_)KCF1-?e^2K9qE#O9gMVQR;{0>W)UYzHF&n7m7agYpFM!l}w?BINjFm?}qBD zT!OW`nkX(Sl+jzK{6G&!8(#TM0+@J|($bTBuO#E{2iq5ppImAqr)i1TTo(@2w$XCe z84=^9U0u<4=n2a9)C9!&Mzr`RE zT2x5Y)U?EowTp?>y^;U40C!wqLBMlrUXi5llrlF=)vLG-aSavn#d$o)^N}$mBbra2 zKC-mx$Dizsg9o}rb;M~N&M+88?YR#R48t5dR8^xRZEyc{%ilCf)G&*S0OFE|ovGN@ zCoSp6CuT143fgky$L2d1(+Zjwh1J!+VH5rod)N{V5BWhs4{Kq+PWy%yyxGK_KlCn0 zSbJk9u_zAr2n!7wX zKOOITIVpr*^_riDL4ZfuF1NE|2`xtLAK@>zFS66v29Rk+K5r|~%&gR&b5jf}jL)vt zI#pVqeTZ{24+-v2V#`EiyeEHl%=LkC_9#f6zxTH3$~;6U_Ts6ic+lzGy&wNLkGf|2 zXu@y4himN^*5Y#vH0Zkfw|?9skW48z(HcB9^h<@|EpeQE1s~bKy~OUO()~AXdc^Jy zBcn>TEAUmU^#l2m1DUyVyil6pS?~=S?u+>DobT%{ov!uyT7k{oYr2d9eBQ!*FW}YI zZ6JRdx(~^V{!3g-gFb(P@=&wwkQjil?v4p2#3goKnI;L3FzZ(xlYf7?%@MJ+7)3jM zsuLFQvgf(!Lm%;sEVw)MCum})lv^>wFqd>Slr^Pjr1F|^HC;dKC>f3gy?Fw8y-%S1 z_w5q~G{F6S0X2NgGnFV;#&~3DB4&w1y(i8aRnT=|AF0;>rmUzt{5Hooj3qy5+RmNj z`pPd$0XDu?wyw+vW4K*XE!d>az|;R z{J$rCBq5Z7znxELF(KMewfgz(pPTQ9ls#zyf0I&CxlAFxUSi;v0zZ1n_WsP;L8;MG z|9GlF2@-)4vy=Z%aU%Y&GdMuDZmYPGdRpv%jsJ9l{>PLlLxL>&pQ$tW&o)|>a?n(s zMCH}4TgR0zENTShca?G>` ztR-4{1frV`G7^?3XGZqKQvAJPZw*Hq0Y9Q0kv=_AfTMw$*pc|d8K${L{!#>*yA?z& zUM)+`!j5n(q}y_jUmpxY=jks>+zUKYJ(x!l>A-XJ0PI(kkR7#r0YZuOxQr%4+2XvG zXpG)s_CXGbQ=Gt50QXIN7zGE zHstbIj5uH#GxhOx z^}T!+uso-jBPX1U^?Ad`5CjbA=|n(MX!JBdf3|i9a5})i;4}0Q_6PKoMc79gio9ZQ zDk`J&8NbqdtrCVe(yCHQ*4pK@ok8$+a~>nXgYi*g zs7>k^W@x>-B&piD6B2^n(Xt!)D=F>{)L?d1!m>r${ zzeD(>puMMj>H0$5Eoi710negriMkDQ)2l!6kSbH!=^1w}?14LgcI+RL2s}7PXJ!}7 zM8$K%7+;Z;4CcdlX`OurOKnNX6U{qL`=#|o?DK!Ef}uqk$7Vj_UH-hys<>iqCv)f?!N{?;&(J)6?4)~PX$oyu)?1loFJR@Yh@!$q=U zbbI80nmg|vk?OnL@hU~ye>jnaMSOKH8&C*sN4TDyAkFNFGOd`F#WAh^OX@9`V@H<9 zgSE-!?2g2(#S@`sMfBR{U`f-s{(i1G>2Qc4F z6l^Sf*=TcMo0aNfN>i&PGqR?7xdcI5P*B{6M@7 z`78W+e$^5wy-?uM3CJQqbA7ysGz=T5RXm+JzMIn@pJViim2eJy>&B|mX(GJ0zyRwa ze0=xKMDCacIMvYZrdz{!OI(t5Dp0dSjc(x1{Y3h=W-TSXq;Zr3;w7wQ3}E5;U9hTb zyg`Pb1FhxwEPM-FF>_IgF5nlxm-bboy%NfP8|V$&YJ_PU5;&FL^C#4dwB*N{0qqy3 zcajjDl}`;(+l98Y3or4n4+5e2&U~w?k&oJSgtKOJ#zzBWo9iRvWi?c!PWwoD8}H$G zNU)Bcs;Y~Q{aZ5j5|s0_-z(DbBTrdpr;u1V*hXK-ur3NUNQ$6e4J!x9)qV__kJsC1 z)<1%@TtYU_;O=p627Q4;^suj?n)i{stUqS0+=n`cPRXQ<7VRObsztYhOtDmc^r5kCkUPaKBFlpRTz9U$ zuJIZNbjaLpVEQhWFkfdQUkTGBdHG@x6zcb}*I@s-wqHeD%u2kV7O@EC$Mx%7yDRz3 zTslgVsH zbPF5pp9G$9RZd2ms~qip(x2IT7h~fCz{}MwwAcEXtvm#eJ*}LE7RXs9ik@D4ds6D-WDVhN zg*nZcQ_R8sJy#PetN3>8%Q`UiG5|bB>q~X!la5l~?qlVY^zV!zCrM-#bIp1ljf19Kn6*woSVxyHJc80r` ze0}JQCsHK+q)4c*hoN1yFAed!9*;tgzZwCpP|bMZ8ARA9ZSY(v%tnoA&W&46&Y~S? zJsjITJ}k`?yVt0*Tm+5W|dm5boK9N<`VN0}`B zlo!$ZE4I!$7|I+5j3h-1F?#7pWx`ZVu<8oyZqAP2|1c3zCP-PNhQN0}I$Z%-|1gMzs#^(0Ex&Hhk2&aB|@ zN_)ACeO(~>(FI!+1uHRr+;U3h2+bEP9J}5q6Vp%v5sH1IK-VB~M%b#T6UrLLYmw48 z?;e-2qRDq6a*(h3X^jhkP_#C`xKx?%?_=Ic&=5U=SpLJXGHD30cs5v}XVms@Iazq> zJ&Z%=^_!n>zG4{umqf{fTSGjk!ruy)!kLYuBB;q7QSE+JliJ<34bju9IhrmRkZN&9 zR+q+UDYe>9D<}@eJ3eqLtC4ATdS~#@m^1jz3?=D1$40Zl;;0I#_Hg67UovqC#LcJ6 z-47{8`w9LELJeA>+TO!|kFH_Bb3VN`)$jT#G-Vm>hpd0elhoo#nrPyP*gRuTWUi8Y zQ^~I&uFMBzhJvB(0>${4xmCI*Kw`^F{h34fT|%}l&6C+TYK^FCBy8grCZf3ON|}9> zR?p{ZnO9b@YP@2>q2xv^r&j7$^}Vlv9d61UA37YI)Hf^&KGSm&P?$;G!5x%-hpyD# zUwVPIcBx_HAESMJF^{#Zb+|&>t|YMiSY${VP8-z>16<7| zT9ti{S}Uv!KAolx?gNEN^6zh_YY_C5;SVu}r#NE2onwLX-;?+!K@>~j^7eTE*4X9* ztQQIO@KJsRrO*&|9rUGqZp(aE7j3Kr0Y>X_xI_TFTkrq#|Z9yL$#K~6Q~$O6wx5@s@H_8->G5LaapaXoIwDX_C_--%AyEULeQd)g*O zF2G4}-NAyjwz8UNP~Dn`P?bu0h^2W*Nd4$*!Pw(Si%gwPQWdP@pqO|1g|&(9-y*tY zp!aA5#WkRWp10+~GCCv%1JHqU(J}Dv4l1=OD!CXpgQzRY#3#EAXig=)*f_HmY+{3Y zyFi(G%&^)=lw=Rp;_-M(m(|y99jB_*Rrjpt0`G+37BLWQB#u*ZbIzy}Z0Ud-%uY8!)G!)hDINC9#d%7C}fvzMy(V?NLz=xLC8&`u^ z!&9l{*!iz6{Pc$PrCm@?ur}^Fy@dl%+E&Scj9J%k(+^nO0PaJ!&NWL{br@u7v@ z9)nm^F44X=Hx=Ae?nAng#^6L_F*Lh4y$)3-zdWPp8BKp3}idiZ6>(|jP7Hx^vBtBSw#A%hIn^0IGb?x6Py-{8uYU+=)M%IW=? zZoh4{s5(V2lxJ>DYfqd!Xd16C~Ml1O>$7FrKB)m zQ4mJ=7L(C0@%oImh--?XO)j=y_g{NjiUFlgvG5FUKfs@caW0PjZJPXL7e#^o;+vF& zifgih{{RY?z*2{pQ6;3sesnZDibJjA*V0guc*MbupwJq(C*xx}NfBWLVIoK+0+oy% zGOr!7^9)>SiLw;Q*C{o5TcjizCi|E;hf*m}3yl-&uWfhWW$MErc#jT5#b9SoInIm| z6Wfe>NMZ^ai#0jUL1BFPH|%&Vgs%dL$qw;}S!3a@wy4qJ!M42MdfgKd4SFMy<>hh` ztebKMpHz6>EH)y{%g*>CQ$Hn;Spx@1G?_yUR1JhCQo+4zW60$=%v`BqcHa?rNEoF8SP=|Mh=gignh_qzc-rEYGtK0pUDD&5AfJQS)g3RI&Y16Jdxs&c=#G?{N zN}BYHLi3zpF=b^w#JMTF`dS;Hfq1FBN3$VUQ83Q16wx%BUYMW8D}+M$d>q32sOTAh z=m!tm5(!u)=G^Rl4G-zeHMD0riK6VyPk34Vj>ZN&A``aZQtLCRZ+q>QMp3F`&jY#XGG0t#}V&)*5oSzmo$~uc$LeLjo zd(H|e!Emi~20M$KoeV6>J4;H3$XCUS#p(gghENHQjEe_a6J1X;Qk2DNTuO1%M3fZ7 zN4hM51Cu5wU5AKaiZ61WX;f57@Y^=48hj@+u8p!c-q3nfE=H_g;_OG?D6kn)=kwdz zh%_|~)^45`wH8gA@xbcF*wr0{Uql{}oYPz`O<`FZKvzP<$Ni;)CSQOU>q)&RMtVMNgS4)SuHnNS$E z!tzDy5WnV|c}{YypxIaxheTVYWZeek@$i)flgpNde?EWeBLCt`|A-9NJQ-R#HI(w@ zf}oA1r+DP1QC^h2Z)GiI%)4_5u#~_aU@c&$L9?O9EiF(w!>q#!neVhW&Q?#-Zp<|t z;y{#IOvb{NG(u8hI+!LY!qIAZ?lG^dBRLF{&D8p7uLZ zLHrKv?G5Ui%}{)0=@Wn@B7AAzq5%$NNl)HlQ*&(YPDyAS>A;cWmk)}PKt8#SE}Tl_HkoBlp7uzDQUMNFdUa_6t7`55LE9)gzdB+6X^4nDgmt1Xe(6)7c zV`;dFG2~4T*j$66qB;sofn#xL{EIi7g(c~2Oqgy8%qA9br|5<{l&3R&1&-W`id{Py z`17ZCX4k5hJndzDLt($u3yuzW^_|v8F{luyRmp0S$^re38}-4|*S7}JnoGn^PGI&o zI>J3d9U4}cx-~mhFmYhs_hu?^tSf%w`c>Z742>dXMT043jlUsuA%SYzO*Al2{RLy* zbgG@{MSHU(k=nElsCVr!Kl+(96F?nRHp6O4N@_xTR;(M@8xs(7)HPr743n_I8@SkZ zG4euz19u=*p%Ycj=t$FQob8t+hNa#oI50=xpmhMpYREPHJD47e7~(y^OG5Kn0>zy) zQSDT(3S7nJbw{#NP(pp3XIIbmOS~v~B4x}cw_rw38*Nm2iL?}G*&-VzQ75d++Sp3OQy1%^Bm1aEeN+B^m@Um7Z1gCCLmwec;u7=7+I90!~w-^}*$M$w6rZN*p^oKqs zgxVu=0v5MP`tbpl-tlg;f;RHST|M#WQ+{@LUfe18agNsUvGum$l3z4&z+kq3o!?TV zhehwu;~z0Pw6iSQ*!hAI8;6YJe6982JrPQfrv{z5lS08Yy`#McQft{`yG)&JP`tK? zQAb8fy+CN`GQcb+8iKtswi7|N8Z}#8#Ap+@Yu-0HdTLwgYg)(iGKq+F@RqeA=Va9z zCeRz(&qmI=ByTg|?2#NIde|K*wbK9c$6#dzee9(GP2W1*d>rR<`NyM2DcROMNH-%Ey9gCK7$jGe{aCHP5PyP5xTpAQCuI=Sn zyD=(~w30)O79$Jo!_CCFnIUV95H<~MufW}c-yu5x@rYY(!-6u*f7u9GT?+KM#pF-f z#7^x-Oq4VgM52R1gCm6jyyR^d#Gbj+H7@7ot>IC(lF+K8!x$)j zC$0)lSQ`aCY>*2I^Wh#c#JjLWYHmS*>+vf)&DZo{Ciw>L0KnmQIZCiZ1GQNx;Z=;> zfX9$uI$RmKG z*(I%p!dBcfYjdAh!2Y2O;VvlyrPJipm7(M(`yKp0H3}t7g8-u%@Kd|Q`OKJYA*H|k zK$W4zqRg~9H#e4g=g7$69bc>}3@;SHiX~`VqOZtP2e+b3RxCQ-+p((lP`TBGMMUV2 zDGdvbMZ82??L2IN`GIY78nd?V(3Jy|ZF=A6OmnGzecy$Lo`0|`qBm`34=59UyjsDN?Z6LbN$-bPu_W&{>30wO z6$*@G8s*UU2?ajYo!XlNAFMUnR~h5iG(|$4=v22<|AY+7=#B|eWVbao4aU|Diux0| z*D|1Nc_c((-*RJdNTyY3w0oV?yu(Legqy{9dXLpO+^@2~5KTFt;iU$z!gFC|8LOhn z`ycU~Q4`^=6Vp(-T=et~wWVub<~tWU!-wB0FtarEz4yNMA6}e`uO^e`a(x2Ge0PSS z#L=88M`W^3%O%&bgxnFQ=_^r<&25=jsZzE7QYTjSbJqGQ>5+@ny{ALbUiM#a( z5ai3H%F9S81vBC?SgYbVjLuKZ+!Y|-%j@8|<-Y`Szw&Gm>~&czJ*6JSQkEs`=C_uy zBVAA6!pAzINj$

+!fk08TVF5u1d+Ko3V=(#$2Dtv)NZJEBSio}Rejgo=IaA%$P0 z*LBEi5g^eo-75kYH+>4R%}^zWRexNyrR#Lg%?cEov>~5NpysKm7NOW%H^8BazBm^QW(SA>1)2 z8K_c>Ndor3kB+TrTI5W)QEvg1c}I|=<19j!@~jUPM)BD04@r`^5QWz9n^;)IivIEzL1hwI&g~s}zKIk%eE58#)8`|@Ft!C^ zG6lZlbsF9{^mf98W0`2%vU6*dUg|`9o72`!XgWJn2_1C8544*8l3sXBJ7_W{%6|Pl zbIxwgFHz$eI<(?l#YMt!iMCP#X<6Eg>$z51>SsR+@wz~g#+&?=*Z$N(Mhx?7N;Qj8 zOmHB6a`lLAZM*keHSfB1t+ zOpJbp8bHHI{eSZ9iP5WkkpIH`2Yj&aEPaGvWll*f-~SK(A5Li4XlVY^0t7_=zjUY| zTL&a2=BpS4kp16*TxE;>EMKo}crc@Q8H6~!eZKbECn)SiXuIM5FOV%nh&wL=n#I1( zVE;{oFIiYGp5kcZe;NPrs9f6rlk>0bv%mCT&VNrS%wLFC{_d-rrvFT_SYR23aaacJ zuK#T&a7q1DXFmnTEP%TfjeAeQBG_Jv4TxrxjBruH4iTp=4VUSQ9 z%fI3M8`84oGEA^8JLHdE?rV2)tLh)*LT~zlVIgxQf$xx$!6Wn#*RLO`!@hTa@z;aG z)1Zp~ja`0o48B$?Q@Z9AFRHlEnFF-azPV%xUOiEZ1q zo$Tko*WTxxFXvl#uj*ReYZdOg>vvrR!|oM?Aoh>8OXBDD%YBt_fl2|?%k6v4ovUi; z%xM%BoHqD02QLGt_AJaHP9IWV-uCZw@CwnY2%;|+6l!XzZ$a%4f%!jnyPmhab*QdsuM;2?!K0|6 z3$L=XgzjLKu(6LbpEDyl_e4#=XT8V+eM6IqJTaD^>O4O_Hl9WDqsa?$6KTmY<7^RT z7dd5ad=QS&y=4(2>v!Ltb6CDx{_2%07AQ$VzihPn3W3WO9u%Pvd6r?;|Hi4ha}E3H4|6IQVNi5tF(+ePMlUCBx@us% z9Yk}+2W?1@{FZKUmDPXYy~vtGg5IVGg~B)3jxx$D1oKmJ@Mqv}#Sf8AG87lga*NV2 zu^!Hm`zh!rJea)(7NAr6P zIfXmFEQLgGjqMf@VUk{#y1?)VFN9<7(=mR2X969CtNpkka zPt~cYa6if{(q9-&KqRfJPn5<@;YCJMH@!|QnaZOU`E50~SN3Ba&6^sDr_2_uz6{iK zWf6^9?~^Ryr%W>E$DMJ#zU3Y9c4rF$@b68fwQ7mvYU-7_!|EHV@eUV<9}~m&{&CpF z`2rbirR*bXr;!Lz@LElI*cxs@hv(m_e>!!a1cI=A@4mOytr~S-cCW^|qTfB?0U9;R zR42%P38R6CgX0<3pp5%bBmS@eUr~gpFqO90Cm9L}<7V+yXTs?%F~yQC)E$=7ILj;^ z14~aUaMAsPpvR77%g0|(yhg)T>SXh!uDy_@FwAzQE-H{Li}zbI*sMIFI@{7sOz4z< zVR9u?udtm71=e0U1wX*IEF-zsbOM7joQc#5h?%h(u2C*p#BKn?nx6#exRwcSg7m;u zhxe)|5oXH2GQq(Y2%bg(mmn_x&$jm>(Flq&S4o<rWf)JC`@5y?S| ztA53yHAbaiuT<5X3E57O6xyR!hkgZ*q0|1b0d0*5CE~0t&UT=4M(%uvMPdmmoKQVJ zf5ouU6s1Bvg70MSMss+wo10lN6>3crf?N&a8AL`?A>CB$%`UwdTNelSd4xWGN^$^tFfcyeeL9gV=$K~~!IrpSkXZr|%;GJN<*Iv<=sGA5@{%Y83x z_n%xMa_}~Aa&Lh4k1noItM)(AG52xk2$ozF9aj%4Q1|PE*g*~SJYlLXgd0J z2P$-ZcsgOO|msZZV@egO|1)edc$Vr}mZ3!4LB8cGT0U*oDFza)5%roj7`bLG z6vdD!qYe-c*((Co8)q#Wc&>d&W`N3$0`(S z$y^%LdVx`?M@=J#wfhTOpd-z<;gYQXiDDn*XR!>D&% zdF8#98rC(CRQX!qxLPB=cq{jr5pW@XfC521ByQTdZ)8I8UwOP1S+x~#I8jUS~*HE@U5 zB(Ef?`Af@zu&M-WRzEBhwMJQ&U&c6)C3DI2O`mO^ zb&vA-p2lb*!KDY!WD_zj7|~)Rv7Tu`csLWdroSAIj2XN|8&E);-E@Vd2ABwj0)wej z;>C$OXmqm-M-J`b_b4GCmoQ7xkh-|F)z)DF2BG?2vE1b z$fz!<$GLC)5ndSYn6z*v#ouR?jlDCSxNirncBxN1gHV5vfnAH)w>>KfK2jO)wKd}${ZS;(9 zR^1BuuT=R#B2c&+;wM2y)ppY$VQGi_O_|GXA<}CqGT?| z|A^HL!lHh+vyQD~hnJ>WtWi$sp+CRcU11v)k z_UTw!QM*e$OGt;wd2uu|!=k7Z>qXb+g7Z9I3}4^qqwH*BH9hk;3B^(nlMpo5iE(I} zg@@DpHu#i&Tdm+);BD-jR5CCu^B;*@=z`3i%dJW%qq8eA+3=Fo7OgUB#Rwo z=5#hXlApGaU{P$- z7E~SnL3sTfU=q`d=`OL)BBrMy{X3^UqyW)sf%f4=G*(}K zPvPhA-`a~{)%s|uS0B+wTGX$cSBfac=ABJ(dGL}{RV567F=cMy#eFEuIa@@ zk+*I?;b}WQc0@u4cCV}@`|O!El%Ye&$3hvi6PwK60Jn^MN!Wr(IXHW8AZ@ppZ$Ns} zmzg$2kZ!wcMqk1^sgANT<906FRPVz-p7uKul+KEYsb5mmJ}T%@Jk+4{MsQ%SvY@SZ(?n#*)clAm+o`NCeRhvSC*)@%IZFHqi`c5)9aef zq9a7buX>mWQTpr%MYA}zcx_Lc1;C5J>pQI0N_so9_Ukw<_^K(y`$kS32_#DuQLX>6 z^#umYL5Lv|#+PUomoz1u`f`^o#-X_TcNJxGGHU{lYP7UXrp_=Z zK!EkwKIMa`7lBR-$ncJiIDY~6=*HA)A{MK=vqTsT-Q2L=H>iLs*$g+gDlk&dn}plb zEwmtyc*)O8wkSvve&!d5Irc8E*NuoI=E}@R$NmhW|7_%RCUy zo0OryN#xX!(LCh}Cq|xmU(LeWG|=t9?80bN6nrF)nbQ5n6^OsJp!B+GT>q)!()h$; zuI^NKrD7*)KeMzpx}r|^=-(+)N!8$+>gvg3x~lzzd91ZoPeSpZfy&GG~MI( z8+BWNQ1^R#7PdV@&c~C0R<_;Oa*j?KkM!Qu^)(9fH+~d;f(@5~Aq9}Aq&-seolk|e z0#BNy^&OFO7I@#=^^@HHqj&21C$B>GH>BZ1j(lwh zoRuBA^A_vyxc%FzCt+{8Q>!0oj^;brbWXGb(G=3jTv;1Hw$nTNh;p55tBSb4R%$yZ zBh6V#_^-A;QmAWt+;xb%plmI^gl_2+>7GO8G2;+Z#69mU#KJNrN)zYAd<@Bo6$91s z$!mL*SPVGv2TIFTVgii~(+sbKg#kg_R8l4s-hCI}`; zOsm49DX4`ctB#UvD)4AJh^zQqBdoT&hUl>|dzO;FzZr*>P~;IoPA)+)>J)RK z0A+I~t005_UPjKd&=p;{ahydNrfZkPT$2h>M7u~8?ls`B6v$x>B2S46GU`9o-+@&K zY!R=F2w!ba3D=?sHo4fqy(V_QL-Up+TFX9wFE{h(^oLz3T5?QZZ$HyCvU=!;IzN)y zL+ra2iy5TONhbG)WMCEf6rc3*xX=<`?sV5UrkFOyuXT%6xr5t&l0F0sECN&s)!z@~ z)%wZ}d^1w(BX77_?8N1X3fF)E&P569>z_-p_Jv{CF2v=36>u2#($0!57x|3^5CuB^ znv~}}5eNqNRFQj`hfO6LF7YD)?x+!2KO-NT=U5qwcCPrP_rX9L!c0x=(@IpuT`wdu zuOE)YYgJm}l*`eNk)!)Z!2E`>|&QX!=z(^;^>eWpLRFdfTUO9)tBX$A_%9 zo$)qf`aYIUmWiV!SY&~^Ikv-7SzLSlB<(ig`2=|o*-c$MG)+rzXcgqs=1(g|_iN=H zy7|{+YwC|oLygRw=&Bv}n1t0UivnvO{LnCeO=|rQ3RoQp+$>`nn(srN_ECzpcJq}d zGKWjVoY>k$S?gmiYYwoYo;OtPC$qJ7an0sT1Y2mBCWZ%yP<8VG3+em|GyI{V?@`Vw zg1hea5U&Gr+b(Bfz#h$az;r^3=jz(vK|2<-`7&s=VaZ4SsAhuWcKY2O+@{h7kp|*- zGd194O3L}b=6jL0*%bDXpw+Vn4m&g?ld5JPQ`C&?G@O(=q^@(;H6NszOcoUNJrIs{ zSrtOu1Y~RZ5$dbW^0x8!)|2<&m`$BOLFCSn6pjMaQ=n7Umi?LtI8L^Af=&tv*N1?Z zu2lJlD~whc?a@}&xhfgW3g^21Gfh{A?32qpZ+##yU0h|L69c9$k@V%EfnRKOHnADU zpx#La>FYD<#krU~t$<>&+HENv!MiS{0*A5Zj6>EPI5wo&F!d|1tc&|RXM6Z3JP8VP zbG+y`3IFzE?L}06YhJeOx9(a&i?HB-y=WZ5*nFK`!8lQd7!l(0YRx~qCiVNB@R>2&12Rj(&c)@Y? zr%IZrUohW2W*b~c-hVC&bjT)phF1>}b12B!5yTi&gf+;`-y8j5uVV)G^c_E2Q-viv zSU6_)nMK4kGyE#yQ0$SbEmXWer`e+$rZ$TEEmn`FGH@R>NlCp&V}w9?Vuu4$6dMBq zgi?c+dx8(yZ>Tgz`y6ob=OIDkVo;UKbQexB)tUY%VUt0 z6Ujdte%tY1BJ=>bNt>)4e>!O{{ZS29XuK%*d6q_;zH9GovashVN3JEg@f#ewx=xZH zou0NxKg-xD1kARcG7=x-u&X6zj!y#`kC77YpQxXg4-;uhqJ>I|%JNcnFuN>}>#SXk z&yjV7G)LnSYK5T?%sPOY;~f5TI5t=23;E*)T*nJI*IABsg7{A!Gtt1Rp~g7{^LH*C zfiUWCbi_G4xaY=uW73uCDJeJEA|E$F{NWd*j@`q9Gj$OEXQb>Jye(Kxq(-F?E`zC3QBYrAiNT>i5msDhwfw8A)ShZ#5fT+ZXc_Sg5EQALC zBg>4mh!Uvg8$|XKGoI6nbhBZ^It~B+f&(xw9$xI^#JiGV4avC|?)nY|!zS_RdxW8s zXDHEP6;*Y4M|l*(m6go1{3i3jrhb(}1yw)6UiCa2+mZtNWPU-Y(dF0UjNOSw_Zi*> z{If*pa6Ez!74CV*ZZE;Ot zsCDt0tsA%@>Sl_c;yfRw>gA|OH)7lXCI5lgZTswST0wL0Iq3pNS4;RO?5^fzau6(i ztvyW>wc`({CsSz7#HxA)o$;Z*2TfaMZ46%`lEhg{Qk5350H&w0WT|24`@jU@i9V3s%;{2`n0ZP|TR*yXA2qh3(P98Xn*fuc2Q5lH zO7~{h>DLTJlCnQ9;-NGnV>V(Pu1|u2Tw6ZB#2rw6jTC58GI%zJHE?3IxKBA5LxZvFYqL zy35vHQ~r%o|Do4H+bBtzza#MMlvoMZG{fQhJN91H$1ei5kIy#>K*x1J2KY?WDbpKj z*Zar^VP+1;3gWH3is3I{;2p>!A|ecTi^x3fCEQS}`69FoZaj5|@PZk4ZQn$Mhhs?i z0F{e3vQl`8NEkvlPa4-2#ynku{4Vcs{v2>IU2epy;vJmxqJo^6&Lc#Wi$Jg{`QU}? z-osz}gH{CWg@&iL&~iZ4&2gbr+`=jAaU3xgAy9qP0pzIrm)s{gMi}pRf|(3Pm6QcJnS+ z<>Li8%>#KRWJ+eK5u#m4Tm4cu`Xf!b4#HSoH#IEfiMBt z0VTQ6$T>IT>I>VAl=j6w=eXa4ma)BfRTT_3APs+AG;eDS;W@?A8@Ncxl`Y-VK-^okvo7%#mYMAN5)F*1If~KO z?W3-jc>u9M^D(pi+zA!QNdjF-$E+E~CI*Zz}Z3|&E>-}mBdYL7JA6J)^4;|S;+Ok#u3 zDe#T7haNZt6j2RLsVdO&!wNB|FFQX5W=6&7QM8y8CTk=VtefTfLSG*4&5)E_nHPZH z**R9Q;oNKDR((d`bv;&92<+oL(<K`7JTSMxAH&d4h1WC9 z(ob<~Z?8n|c9CjEngA+F=!i$wM*d^v^~-k}ABAmUUEH1=Nrwjy+6?vR9X zb0oMxUUp)$iFsskHzE3TLQheJ?euy2z$Df5U6Lcv=Z`VY%Xtdmo~ZVq>G}AtSH5+m z+c9)blTn6LWa9D_*yfVtvrk;$YqYVt{lIE?u+=Hy*_knzCv-Hxy%KJ1GKz6xlS7mW z7(Vn+IN6%WP8^8Gfr-+A3nQ&q#H#lFW6;q;QdY%CJXb$3Z~zk>=5uD1-~iV=yVfFd z@%T%+;9>$Xrq%(8jH4&e=aWIC%U9NBY_!V%w`XNmTORQdqN<7dV%#X4ZB>FK?6vbH zNhRE4-2oKkxfOd`ykqxkHMMAM$VSJ6GEaaCRzR1QRH)k~pJx@lw4_(u zGVOd^f?{)F+WkQm^Kaq5p!xIG{`*$P?_Y-Z-$VM^Q&3Me^0oQ@iD|NUnyRUy6(N_Y zAURysvCT1-c_R~lx`R{TE@c5l9^&EYiG(;jt#EeA-7|( z2V6>}XGa+TWlIXnqsu#;N2*{a>|W#As%$3QX1OaUda6_J@94!dV&;SP$QK9W0NP@v zyAUMoJFXYZ>&x=fH*_6#9Iv85wB6W#hy&Xsi@1D8qy$J-K@B$om!W;n?!f* z<873k;{~^bb06!Q7s^#KW?rPzD66f@x<1#Ls3d6nCEz8bz4js;>E7zL>x!5f!t7d6 zU-gTHtZAQQZ1piP*esC8x)-H~2cnTQvhan%K5#b8aFP<=t1~lSp^Nhjt)P*NRCUWc zRz?A*5X6@*?61@dqbaYY(bY`r@SfP`m$-+TSpqu8*;UcV2*(9d&2y`w0@93E?ITwt zb06%OXQRbJcw;njLwpJ_A1ijxipcuJY;5wgsve>l9f^*H*`N>ftBT9n(m$_K8r|d^ z491G{pKwwd@?%rY)7Fv;?rm84w}yA>1M0m=+9p`%d^d7o$rSx+{)QEBhj&Uu*a`|N{8$W=EKIS0qgCf9ulmdD%Po8M66^g$^aQpH$Fq+uHsXl zt+AUqf`C*$t1~O=E-d*QgK!`|J@OX%uTaQT%@)#G3T0iu_@Xds#-xHJx<-W{l~4=E z(9Dhx)gzS!YuoD%4sgm(do5IpXZ29jOg6vu4Chemn2AQLiv!Ery4YV_m;e3iNMXjz z@qCtjYTe7?3Td6{_8yy_`mm){DNd|W`JZp?KsHjSeO+3%A+1!4v?3z{D_dt6efuA4 zPAh6D_Py;K6Q5zpNc-&UUgBa-{E^7f#H9tLWaNmK;LP>Ej(PC^6*YRGVG0wCP)nPTl35JiZbK$ z6xYm8Clg+v!*2=diOpy4&Y?(`#4a!Bm_Gq@<^zq3;E6M-AJ5~sE=uAX6WpFp&3rT~ zkq|+O0$>nAH6w`6K5Yo&4NE(au5nx})_)oyTDc9S=tZt-I^sDCUe$z34aNlg#%t@7 z!B)#`yoWw{=%3d9DTR$1hKJ2< z9k)=wcjQ$<<22Pgo>~2mkQ;g@jNcR~B*>if+`T%wmE@R$Z6uO6HI3NOt<1gaPJ&Yy z?9x(y{%k+%>37cFBAJ%5m6{6q=w0K&o(tcp;i$&{=eOO_`jN`8*K%nUg(79qG4I~f zhA{Y-?9VhK!H7@u=xAE?y_1x8sj^Sq32#zAclZ?RTyI(1$l> zQ2G+nHMWAy!o-g+uS(Bf6Lyv$_(d<|!M6vzOgRchP@v}iPK-6!2;M_gFdh{}cmVKt0j@`aduI&*K+bA_wtWe+b3ta=!nm=>HT2Rc7@6-oXX@ z|5j#f{F_9gNS$~%X85xAoAY}}Jw&)ls6>tQme-L7;Ngc%UO198%&Yvm)!;on+;=~o zlt7e3t4NbXWr70kXkOdmM)#&wPsWnCS7(C5j*4(m8xMM_FQ zAyGYKyLobM@8>w~`wIVFcb(vMyamb#Eo})KBlNcsEfq|8qXS}*K=hlBl z2Fay#3Lu0_5Q7%CumQgD{$g9oPwH-5#e4!c-*@bx_?i4hG|lE!k9?h^t8LC^H$p}n4gZyK0NqiH5R4GaVpM@QcJss}HET?s>a>xlpRhe3__t z-(!qd+wV6kJKNeA< zSsZXKtB)?1nFUAWSYdmg9im9cZDCsdijR&%ucXAkecnU68`fcV$8iUOi@5RUsFUsL zos~5Cr~9TPFMP=MZQ#;PbZ?pH4^X4kZS(FS=2#(D;2n^s?WST&8bjJohU0 z!Tc4H;v^NWLiL213+2NJdira!(MS4Jolw)-P}lEv&V3Wf>l2&=e=DP;d9XaZOKjF; zs{trj7*lr4XqO&I7hb>r&Ytw!YxRCxhwM{H#Ab_l3t*Nx<2>)K zjp`i?U#eLw?_WE{k_bLyQxrfPyCKSt-^M)+FTamPxT}?__(kY(1Q<6Ewwy0g-G-ih z<0Z^S8dpH3u)DBzy$BPW6E)|RJS449I%IG{LGAe>OPo^obd_K}@*f!ihQH9kAmYm&J4IiU)6Z&Bgsi#i9Lx`xMs04Pm|#-# z|H{TBTZMuL%=ZnxsmK^#k{SGtktHOWuU(l#aA(U+p@i7IiV)Xl2_WsTwLvod*+25s zy~ctE|7`jx=i@Y0ryp%llZzO%f2A;G_?D7HmXZ_LgsN|#fY{P(CKW6m2oQ-jfx#>P zTxUB3Wqbm+nyU~!RVsAm?nJhB^%lTpBKf`i_^PWOO~-*}N9Y9L8XasY8((m2osoH; zL6N}Vy;8YMQN7__R- zQ@DWy7YmLOv|XhcFM%VNqb=7i4z*qhM8wJ;pPCZrEELhqNi$r8>D!|lmLiOHHl0?1!bBS8A@{;YgSgb=+smU;{xLkUIEc>ha=!D9Llo;9p>48?P}zrny( zSdT1{t9*QcpMfwciO5AO6cA`9QR#}2cm%0+9X=!QafONO4*P+TQL6&&63NUu9~SwM zR6g=H7?65pFi~5-TdCoi215Ifev*4!a?q*&@SSkfs?by)kO1LP+W!t~4IIar#c-9R z2BV`8x;6&$Jab4>(3<2Qs-Uw-!j=tt@%p~d&3NDpDP%$HtHQtqRE7#4+Wut7L#n~| zk17+W_c@sj`8uF_L0FfFi4{zDREZ`>u`riplK8=yL*X2eP)^#PbsQeq-}zy})rlw% z1jsi)NH&SQ8LQrgnC*Qss@Z}W?0@FH*9aubp`=0=7iDo}>^m(x?gU5=-q780wcF!S zziA#(AMkw{ITtSDL4ugk1qu`8?c0-eTXHO<7)NDNwe(nPSxE>)KL&#_N%GoRC*fLu z;eGqz?v3d8m&VuS6gIeE^%$bHQ)Gp#S)yfe5@^jE?~f6e;#mGY{sE;z8kDxwC3r4q z4+JQW&D==wtPkEkIk(Jp{FN3=C=Wo*c*Ou)ZP1@%CRM!)1L*LdBrvqd&FQuFvcbhs zWHo306?|h@Y@CiOcTX9L|0RM`wrZpW1;&gx-@eg8RZuRjj_=P*av z0+b)C-?8CH%J4>wP&o^+Mnr3yu(`SnI!YkJy`wnk9W!&8m#$3IioeZYU-8%;uAhQI z21OS649coXVwPTL(sdG8we>7B;yTx8>sQW+TUEtOlsLC0_QpPBznVf9yD9V<;p&gV zOD?J!4CMX~B=H$oQeZW9rKXaIAL=3~sVNNZH2jM;!_220Jbqu+V#T=g5jzSH;Xyi2 zjp5pc6(D?({VQ7Y%(|q@Ki$@y?+~=NFeVT>h649!rnBCm6bU+~gFdYx|)VHCsqa4W8U`m)J9KyYJ4xT5>Cy zG%TLk@84x`4i2m z5=#-^+_t!AX6)dcOr(o@{3$^X{&c{jkmwiS%A`Vz(6ZQdEu4cR;;tM9MrA-; zIeftVpRPMCzR3NB=fS|Cx{`*9Y(B=%UZUtlzcrq>)HOF>CSM9k)Yi8b3d>$@uYsUh z+nP}^^tg#&EcB-?IRrFn-RkOmrqwXni^q3_v~$}$V~=QnIm%*BH8KC%p9vgMLJ)9e zYTW!t&Dc?b#GtAIaF3YtfR-P}5t)>Gi1r%w(iNN71>ck_(40b7R@3P%;&LRI7@p0B z6=}?Pt!7x`;XjB7ExnGJ-{b>r&yf6Yn&Rk}&S@s%@tQ_cp@c;4z3>d*Kt%Ho^&o29 zsy68@PcY>&JfMBb=@SNzL<-jpO&DYAP*l0kRGF~(r-9B{aglNCD&RT8ystadKm<%R zf9CLmpvnbpSecc;5_zcc{G>0EC@H`na(N83Qil~Bt_3I^G2F5m=4uUL`Jo|dih->A z&N(6T`NGyDYG#VEfdPbnAa_@!9*7PHZzIM?dq6t=_#UWd26D!FT7mNl|JIk*T!U{E z{{(K>W{z(gt!ED(C*+4!4JT>`Xw&}ydfdE_Ev?$uU0)M3t0B4F;^1WAfHV4aK(@^W zIA3)vgX3Nd*3AXHFFr&P6-R(U-OxLApu#)z&~xZ2+VIMY$}#MkRju3SnPyz*uoyi_?rJZnkXXgU<&^( zssoO_g{7I?q56TN<^F)~sc}Z2?C`9HP!Xj~et4M?YeO|oEtDHQlAjjMq`}=*kYehu$6mkiktB6q+CI8Q_B%uHDvGkqy+Ar(^u=- zp2Nn{Xf;S0l~=h-@VX}Vrn8o|kr1!zm~#$v6K~f(1#l?6oAQrdQMYHbYoWxCPQ&%L zH4S`}r_D=sJx3XctU%{VznaSqf#IDSBW?eYZw~XVLoNXXvYf*98Gp1U=NPd|pd|Z) zwH4u>-_eCX)G$#b5^uf}rlx4$V*87UHWDtcIopKJ{!Q`;mgfjDJ>$hg0Bf%lG*Xo_ z2Ka<;#y_MRXt*hw`Uj}9MA+6rr-+2JyvmT|1Gtj24SAvR$9ge99#xrH|3gi-80bD z7H%86|4UBmwFI@2I-~uq!i2g7`y_i;@nR=fKbMUcW?PzYyP12WO-Cl#F=9)QlleH_ zV61#!eV5y2p3#G)@&yV++|1Wvd-*LPi+xpj-Q^=?-yGHA=@o=Na=z}M3|T?r;Qd(UXg~kCMf{& zILr2I|4HQ+NT}v=N^-ew+3S`|x>mBk z$6I^yeq0^~AjWgVZoXh-*Jw;V@_FV)H0_Cq%&8@>3tNz_PpBtY^MPqC?V8`?Q zY&GKi9Ls3$I}}HK7^FK(96jRP26F`HIJnsHEC~n;^-xPxdJGz4OoA+T24)LwyK3Kx5R3WQ~0;ol@V_0Fp{YM{1QDp8Rd*7NG(%VLw^? zNe)x6mIEG-;&2vaE9n$q>aRFmV0mO%r_svgzxMhtlKq$y^m{H2cO~*;5@HNf1L)x= ztlm;yi?n~;bCKgo(Pak+PS%vogWWUSQ+I#2QLztu>lotACaeQD7mX*z$Z8h@ZH=Eq z?YQG!#h})!G?$B^#~vloc}&KbOwLSPEL)UTz9T&$A4aiXIMZuwrw9eDJH=$>e+4uh zgQCdy>AzxUy~eU`cAvbe}WspJP{K8a`=W8J$9a8jzb z;RA2|O4=e^9I8X+qKM50Rv{W%UGksioy0;jrKZNO8=umYcg~{hZ=60qp57rehxaEr zE9In%%k>vOp9aR zodqzwa8EZuRHs84ZBYtW3G`007BL<2svF}aXp8S@72%jr-EoUoVR~Lqy%R}m21y#Z z2A*@)Na{Gjy9sSrnwyDNez$W_(;N{D_1r^F>Hsag!bJtB>a~(XSXkkn+E%6F=Xrg? zmR7D%&UKwx@LnVt4T_zsIdV~1!*@N|R5OQJmnDq1QT9|biF$r-)>I?aaSCZ9q($Ut zAX}&9cR0qn68;6WkN3;aBulJWWbnK&^-h(Rmdf{W&ySCHA1Z!|V%**cam=m$&;~`x zzG`w4yIh-$p~8<6n1aQ`A_i``hh$>9VhdX<&(tQwd4c+ZAQ?X%0{zr7HP1DLh%Er* zRk{nSKwi@t8NY$ncgXN`^mclJZR+@pHk224*5O=BoF8{GYxY6v^$O?K@P~nc;9H$F zxvEGpTr2hnMNc*8p%!=j4k@5i0mxG_us@rdnBho>2Rhd-#^Amnj0t7sn#b;DP|0kR z-sFhEW*m(8XKcr!+yz{6PgnT{JN^TSt?VnpwW|iyXlunGudb$xVJ^1HqICu9g zOqt_C#P=vJ8F430J2&6GKBWT=3MT!{*^4;bD!?}2fHS2VIboEj+gBdvBxz#&6C?7+|dhEfyQBU1So11P4iB^p3 zo2m%6Qz$=xrKJTkR4WXsNGSwS)~^sxU5`k;`5p2ue!m2mt&wngDU9e|ArqGb!E9bZG6{O^B(_G)zEfbq!4-2rcaA~c$&>4y(bqS~ zTZlW_c>VrEwMoL;!`|{gq+Ci#EH8yI{et(c&M?e|jt2jguSVVmd$*c67jiG8WFo#F zNL$|XTN&x4za*6sMdR`lUg}A(gj~!^UQJy6&olWv=O+Jga$?_EjA(#Gl;hJq`aD|w zTo(*4IzwvPl}fjNtj~WMOchVpqaZ*)i9B+=@C=wNJ-k~)P5c|udMgLXicGs`E^s8- z9I@;DZ7}B;Fb-Mo0Ka`C{*5zg4j6dmq~iAdyDE%JEzNTHY73)u9e$--yutI{F`DYgo%Q4zAiUgGz>FuVGYe9h3BN zmK}x-WUF6SG@phbryZY(fK|a!pE+J5BlFBh)({*z~TIX99SkbN#o_w^GrIGR4a)E+C6_Qm#GCh6va#52{?5=Ree3v z?q0AE?cABrXO!k%AQ_VXp4fLh&i_0wJzQ(@eTvZ^{l6^0$?-3XODscD1fB#_-WfVH zvdkHyW~{h<o%o2{XS z^4|7is`v`j>y7_z3;&vMOL-kKpwLdfU<`pAh7&AVCtjhoev3vM0dl3p-UHT=Fj(ooYmFW&NB$f%dVK!f-;P(e3sQ%%H5DNzId~Pl?wa5vnJpOzuGch06Ik2vsepv zKTytaT#ndTDrmxFKk={ksHC5AMj2R;Qo92DjUf(S@3fXjE9od%9yvkgl#*iKQI&9* z-Dx^6n`cWTi`u^M0q~c^&i?pgWBficF~ExR#?_p-Cd$y86a5x?&DZ}F+ZR?L2FLicrv zl^b&h%_iwZqLLcOxR}fWKLwogn0AlGR5EXUd`RcMNcYVm+YRYWTBypg`uttK#}2tl zc(+>%YAN|iM+6f{Y;T8{XlTSIeHUc=ZN=nG^H!fPIM-$=J3se?4&QOntVP{cm&m{o zI7C9eAzOz1m9+ar@s8H_%Z8u4k-GyDnfyB@)+av-GQ`KCIh3rk_rId-E&cG!pGRTw zXlHBrRwnn8u+r2dR*&IWmgeQBy?7|62nv|m`bKuZ33SlmqYkO|@i%OX1}w)it_nr5uQ0 zuj4&{TFSs6FEk!=Sm@_ez&#`EnwC3vqVQa5^q(Vwt2BP56~JM zLuGZgERWX^LDkk7OhlA?%u~bH?1E;JfjU-*)1@jtvVc21V%v;KtmqK zr!0coKRS)5Q%ROh7R;)zXcdei&TZsPSmpGs{sXmPeutb8vDjijc^EMs>Bw-w_dlQN z_6g(9YV~we`FHQAoI|$g_Z2`CU15E*lIfHW+zOW=0lewFZ=GQpLXmdQOudhSvlX%A zUS2ofViVct4Yyve8^m7#V9NZwz zJOqBSRu&1?3+TxRvI4dbNf?~?H%bjkTv64_Jv}0FthHZzF3_&@0Txq!y_b?-b?_+w zEJnjN{TYM#daZKQ6j;2DN3R?d0W zCHHnVjBzo^dS$8FwLGTzMlHEBeM(W3thJA3vTYBI^qF|1eyCvWtiaK_WiM*z!W^tEr0rM>T>_T@C5)H1dreEXH@H%H?WYIWn zxZxt~*McRpp@2VM@sl(>HGJ?`boZtrQ;o{R{ARcORqJg52&=0>g zpY{;!8%oC&zsu>l`bY=nRKg?UVyG!)?2AGn6vc!I4`pJjf}QQe=aLhvuBpCwN^gYP zE8C*{zvGAQ)TmSo3q!eWQ6>aJei?Lg7}*n5QI%zSwB#Nf$XS9O!2tT;7OdqcEqF%c zyWegRjX|L!F_SFQyu%?rs4mn~KlQSs&xww1B7#}!d*_Fth~zxtC!WqLtO|VnXis2W zI;QAii5sUmxCg{V>@ynseJW(`*Gr3!Sfn?(>x=zY(W%R77<&zp;O%5)ojwFNjOZT| zVFU5K?RRUGT3>j6`X%fwh;bu*G1&UjcQL_FkYmDTNK$jijXZ>^m|!c%qUEP_5XEZVhzxJ!odpy9*i>AyZ3!~K7_C)VB7b>CU_dGEM9HW;}^pOV$GM`k%eSlyr@i6i1^=xB8Xc!5Y~e&UF! z#T1{jHuLkvhku~jmA{Hr4us~?eh^-+TwdJX+MdHP<*iuv{^6EnxBVOE2BCF>b}xSC z`Zl(;tE$sr(DeR=;UKl{U^Oi211=|-;xGfY=m7=NQn|LBF;!<7yhL8rvZn{(bOHK+ zqDL5my16$#(0Oi(r|lLf6ZPqF_)77WCuDFfTs)XE;RbDl%T`?0Ab*t`HAg&s{7s8}^^KCJeGu~NlS2a3(FLQo^wZ}A}erxAQ-=v)uK4+_;cb(sFAB|R+xWIfwZ1Bt5 zKS7XwfV$h%sy>#sI#}yz;gA&)>iz+`ROG(_G%!&D=eVwGyqHzq5kvIh0uF==SX@L; zvL0_yF{&G9H#x>VheXa_HKV0v>hl?aVjl&ueFdQ(h0>1$#@#BABKli&x(ZKMG5&%<^`~zH zzg2a%fsj_{NFYH&$CboUYf2{J?H1ARGy4XkLIFG#&{YKFmxL6x%hD9rbErWP)|6b* z5+qGNmmH|*kBkA2(I7GSb3124(H3Y3;qPC+Li=t(2lu>pAIabAeja_E+~$({{{K=F z-5>gt6wwARxfwYU6W#^Can%iJM%3hv?qO*x6@itMwCSTX52h^)mhp{iaCr3L&FC)pG-$Yn%3f6NpDITsZIh17ivv`N@qIDAllNluiYBd$65>*?JDGO3IO2*d6b^l zVgnq@TFhi&`>?#JPkDFh6MVA$6+tQKE(`{odep+D_HbJyKy)|HFBNu}B1}TD)HJF_ z{_p1;x1R`!z_L_Dd=PnA|5-TK(u7_C%_jE$mMr?KJ92=FA>9WQsKC%(K#H<`vFIS5 z3sZj#yYOcL?6xVjP@40z zQ%5cz!)n1JDnrAYoGXmNwf~HI%_k(gXr)?_<0D2nT}ImF(XwWx+or2`uscQB-BVjZ_Ze^C&hrW zdnL-w>F$Kvuf20sTHyILwoY>%dXEc%MnZDS2V-R|#H*Y-nTFrx1ibf~H=1)j$gSYv zWqn3|@Y$IuCz~tzPcVhe(UuP@b^?XaU5n?XIcLebCHsgN+1XxyF3DRP&rdzS+u+;6 zr+Gt~XM%=I1P$ch-FH8zwv`4%VyU{&B%Vk= z--oXrf$PUyu(9}IBqdQ8|8v)Nm(-1pM^KYm^PzL#5vxuTrxB%*3eNGb7{f6YZTd{c z`7m@iT;DJib-ij(!gL->Mm&blO%HFldD{LRWF|Yw*@b!3Bym&bES@YLUKdn!Z;W`w z;oGLAe3E)z!G{lF)QG{T#k95w5?nI0O)|8HLi1S`4Br^?F>&iV-BX$>_hE3u zff5{=Iat4fKb(m*%B~>$cS4ZI6?PFW7J{6w7;|2Eb`;eMc^1qHh3cQaF80uZ_GG23 zStSCD1;qH>y!Mr7^SP{HyoVkrw))B#gJgG+KXZ0_a(}phqEHkGAs4q&{_ew(1&;G; z(;2hzCNPwTR79?cVP!6v(;0-r<>vIf>>=z$MXB!k`xy6sq+CvM+j+C)lo&!o39$}(Qe(TY56D; z8jN^)^jdR2BsEfjHJ$#8Z;V>ynB{y?K1&MDJGSe4_&D_6;!~2Ly5TjoIPq+PhySXz zmhy%7N95M&+o7{9>eF_GQIZ>ZRk81E+PdY(nnSanATN(j#hcDlfXFDY;AJX~L?#Q= zQ4JV7{09tzjMLm{Vg_+2+E)YlOnTpO8wSM8pY4L@_f&G!dq%i{vIvVhYLat|+qs=$ z>g5C7XWSXnQ2a_(I3V4gyr?~|bvf2M0#H3{l;=X6bi%b@50_KwZ_q!B5kiL2Tm`{H zN)oONb+NDyP0hg)A;{bp`T!?Y+DWp@MQtWWhc#wj!XbrPk2+K03cA{ z@;p{u#tQngX2`KTnU-Z;QqIt>b6mY-VrKA>?Y0&k8Q!-(Rj+h*2^2^6aE!}dfjQu~ zdT7@+WHYy7ZL6W?5!G)y^+`cWh#`=wyR6 zKZL}A0F0Qzy2HGgM}(l0qO7AO=q%(<0@QbHkt^03RWpC%v-)1ehM#8dfUeGO~ z`8wCN+(&ZUB|%K5cY>APjwXwK*(-T766$;WN5E3?fI5i!{DkE%+Xo?7d=L!z;{H$D zJvu`(N&d*6J#hcbfo`8doUr#3{(2;lbK7ZpT)8<2EgIXXtTP0d)5EtJq43YSN6$KtOR{V-4N-tea)=w8ODD^ss# zaZ2tQtzIxK8@`BAaEmJG9Ubm3nEs{iz9#k-#^(?yZo0D>Sg#v7R{$HqKpU8*{sUrj zgs5O&fAfwfrI8U*>4RdM@*t(ji~`}CceL9^Kocldy~^s5_yaT7ivEDM_TmLP(e%sK zvRiQCKpJZU2{&-qWZ+g*pPFh~^*7TdM_}R>;F@v<(>sK1Nz!-+pTELF9sGf7wMwuV z|7Qn`2V8rzTdu5tE_n}`I*`bR)VfeXs)O)GpAgkGl2!BGfcZB*a9@Jn4D69Qb`6TUejp2RA4-g|=)|Z>@@kFusF}YZO;}wv-*{|-4Ve=b*N)#;D z@ltzLC4ub~?ADmr>d90*86j>b#)*-j>I@4Nd(9+MFvb(b`S^876cwRq>Tr+NVD^dE zp%@yZXOD3qf-)hXW2XH2;}M$=p*)ntXyE57Li6839Na-6H^iyG7zm@?*vmsc!<58E zV~zklE9zrSnYJYKIua>G;g_tQKq#XX>g9TZ{-ss;_7q=rK`<(}leK8-M?7HvVl1X? zH#Tjeyy*=Y?T&+B1POCGN`Sp1kbv>wq~PGAh$=+3)jaR z{zIKDUKzsW;!UX%SJlw!B6yweEha>g?qE3w{#*p#5`~{FsH|NH%i@8>*p6$H z7PaI}jkzE8CfY8tloKppbd(1F%`ZsJ=l9S0I%U6bAQ3t91Ec&Ty5Eu>U?zuz1Rfsp zPe>0wwz`;9pZY6|DqJvE$uw`p3@qPD1|CUSM6z-~(=EHW2j11S&2CHs_m@$n>g9Qe z@c^;iL2u{Nz`UX#QZak@9r6?!5ly#{;um0HnT+u56}Qt_F_aQw%3G(b3Q~T`WenbJ9&9e zbIIwVv7el0^{?SkH}@q~h2a6kH)@$%qgQmUZZOts2A__%_`l(FfSb%VGQ71t-|$F{ za02qM#Yj0s|MDXq0=E9H&HI=b83cb3;sM_*dt9u zfsrj?Jm2&utNJjAsTy6emtK*8Qo6eO)YvRZTm|w`yM%UY7GN5X4%{>}(XMVnooY_+ z*Rufu&s53vfU;Lq;?x?b^5u`Ja6)WLN11N z%{Wd29OIMPjn;sT<9@ceY)3I62ecQ7wJ?i??^W>O>IBhm6q8+{am^VH^86&}Z@4FI zxc#bs{&v;Z6S^16dzHM>W_h9hT@+YH*P$T59-&c%3bftR%<{wws)7|-S%5?2h(o}x zt8(RM>s!MrHV}#ta4}cuRa)Xs{E}d~U`3I@A`~uq5+n8;)l&l5Gw)x-9Ig%-y@zz- z1um@I>J>N`RBmX1^70j4 zE9KYYs1KwrjL#+R`G7~i=?BOed2u%iO{Z0irZq?>JORE#vLC~_ZOLK37+tGdLQ>FQ z#ifnOC&+EVzs=JO+0_xH>-joggSzoGthF1~YGhM6F2SunGWZU1a@MEpL2>H*pE_fv z!+LR~3=Wa8AN>za%Tl1cR?TZUK?=)qavv~+u^sj0Nq~);-6^X+%{zKbgcD96mwmL~ zFFR=$ql#2QqY(-9S(koQUiha%^M+F(8w@<-X7ANx4=4+!;@H)I(e5t^Bbqi5sR6%# zl`;0HI9raz6d00^(_i_Owpn@O0{V?E^;0lS3;Hu0aWm2Xd=YNI9m#CLz<6PTepRj$6L`8UUli|}5EO~WON357R zo7W+nDG6AnTN(oVG{Vo=8iWk~dqFl^v)Lf_-1m07M|zEYhAI z$fiXB!t>fwEXhv%WXx~00_zmV2U2SflM9nYM0Fx5C{bC!%Z{$|GEX)YzmyT03UD^+$Q{>B*$6K{EX^(VJGR=&!&m8xM3%fU>mJ2f z{}F4k6te!$`lf6b!H_5FIgB;5o7H?ZklAunxC8@2PKiCwkO;-_cRA?hh3L==zYP|| zvV4g?i)${6^SxIw?njMr-?4?&Yz%a?KZZ0ob=A~lnX7$1;ockm-Fo_niPocO$Zn*< zcg-QmcmCE{Njgnzhf~>*e(sZoj7H!{7Ac>q;a*SuR$b!GPJ%|A{#cgeZ%Gzav>KUB z=U3gCk+u7!*%`U+fv=2XORZg5&XRA+wA9l829Kf&0vH}I!(Xv1bd!%^mb^Ds8mdfz zSTcKtQ;hjHaw3@A&JI>LJduXs(+39jNCVv6AYT#)0Ry^0{v}C`e;xOS*?W^uw%iP1 zH*6VT#ApIo0?!cbZXk|0+#_TEjaW&pAwSbB0~e(KcHsZ%OFLoyO}juUD-{3FvHp7w zT6G=jf4}{E4Xw{(5aV}DmH%1)>w7=V1^)g1|ED=9^%5c)C8*b5nEs>Hm{pDfKu&8l z9Y=x{9{*VUygBrefYl`&nG}T{ISA~&5R}wJf@P%G?Kiy2>oOZ6w_r{iPn)3HSN}(k zB+#1qUqm{TtUtL$;8E|l-mC%ZN67PCjzicXOaN-S|JP-`G@TXQ;mt0um24vjjY!?n z0MRIOeuMxMaS65XVzb?(<}}<4LpIX4!%OUeIO&CMZ=`M$s=-u*&b&~(AlwFBG9m=D zsQ30En1MJ67g-|SDF8Y;J@ghS8f{e^)KH9ryB_IG8K>r_BHZPMgr|APPVXn&aaGIa zKWN@t5M)jvNs}QubL3EKASCxe@goSmQexA_Pt@vjX|FHgJ5zc_@sRPNVKo*oU@$0w zWbq{F%JV`(VbaY94OUA`boCSFS(M6He86^7+-#?Kq-s_cG^#yw#(`M^)b0~~CMMGS zR|+U#Lc9qAWje_dfg?E(-_ETqm*tIj)gih=V ze5rzF2fmhjcv&5fb{(Ok{4zhAU@{mTBtP`laK6yy9g@w9Uv|UaCy^joBRF*e_?5mB zdOzg}v}9d&vd3QRAyY!X6FQwj9ID_o|Q~D$lgg&cs*oql!9M+=C##JOQQ?J6QF894xI}aAVEWIUs=7~ zMilqkS5#%*9(L4M7IEk73dWqyU>jz)3WIH4Ml!cIUSTe&4eg`(ALs&e(;5nXJK4QtWO7Q7Z0GGIAm&=Oyw1pmUNv337-Zk2||Gx^R- z##+X8c9v}-Wldgr(WrjeftN7t;Va_rH@7{+0mVzx&t$o^OI(ia5XI2VPy>%=J(5Mq z2Q>`mfKjPnvP5~eY*RN4u<1$_A0-qjQjQewzV_gD8&xcvUObD(HL5HWLqIhXf%eeI z$p=cFIbtzG%wvONQe~JS)@5!+XrhEKgmx^36s!N@7Ht8CW$nDE!n%mt*Y4~67qnc| z7QS$fr5Hi1o{L*_h3{q~WNfme$4+}F7QiVN{Uj3#9^?wD;pai#oK~WWg_sT7zDn7z z_htND{SPRkv3~u(9K+jY;G97f{E2B!gvSNG{7lJJyqkp0tI+ZOyt>~4u0ie#Af&R; zuL7za2nD*FOPn_$1+OUGth=RZU)`yp8#M_%yJFPY#TmNqFy7=eeI3YaNNYV=Bc*94 zo8s=RcOxyP@g|nX@kH<=$H!~X-FFSv>xPx@&NOg2xNm9f@xnb))a}I-7d1wil>C0? zG-)u!d!KYYrl5(={G_023AgSzzOwIp!`huezD z$s_mILNDJsQQh?Q3J`=@O5S0FLtu)uN}+|0YHo31YDgZ^R-5vyggn2W{&QEMGY7i) z9^OfSaJ`M~OUD_v$1Qh9Hfu!D4|J`fnkSULcWsocZmAz-IdNtYp>CIVwSE~tRWV(n zsedyzl1bwg6=j~lfh{fw%>)>X7+2-{$~-{_c)87HQ(??=3zHkf8nt-i9t#9^<)tOl z5vq%MD*Q6en}x+*3Ew?2sqxOr7#oWilxZ&w+K&Wnx{NBJBeV)Eo-5YNgUJ8hk&75O2|td&&;bEdlK=3BU$5)kdsycf36P_*;2Wm=_cQSqBph! zwPq4&=jMfN93mHb8N-`+1$%Pe5Lt$~?-7NNiziVu~x*g#cz+48_Sus$O zSw!0rBNy;z}GjpkndNU0?aptK2>5+u9Ola+nLKC< zHbnM|^0n}8oVUBjzk!fFZMTf{RZ3bfzYu@QE-!!>x7M@!9P?5P6Jwv^6;cev*uA}D z5+30%xHOj;x<(J^(50c=TDf*bW=tI(XE9NDn~&|fhqfa`d+VgLs(#}5*@rIDl1tR+ z<_*>l_N`6uYbMh2I7G)zVb*zkJ8=61EY{f0b{OX!?jErl*W6ui%C?&Z z8WX&RRd{j8fHwhj4PJ^p*i?VO~UTEiSncv(KnnY=-|8PrmcZ4qTpMR4C(P9k;KIUgKfR>+FpR{+ju$nMka~^JJG>D`XSsrMF>VKhghA z?^m?RBJr}(aXca04wO|{9wlEF>PRBo}Su^M-$oMx_f&( zE|jNXpxY((`@ly;ysKev=VGX3P00d8Wbr~)urWxC@9!Ta?lI>nRQ;q3akGhkI$$)k zNXNiPRoI`7k80P@RX6mY45?xuE?u0u?I*ho4kj%OtCvBKpWrFsY}{AFNJz90N0<6O zKJd2ym4`m^+?o6l{g{#Jew898*~9c`>3UE_&6P<^tc~0G3xXIa(XzgULpn!Iut1AH zffXcp6kzp^4fpWx1G7Mzt1qZVGYv_)=t6K}NaF4~dgJJfmO8aMJCD6hQV&dFyD%!Z zC96}64BnHob(TT%rD8fgfCdqCI43&$I_0tu(W)Ox38730&@jq!G@6j?F|f4yB<_$F5s0 zRLRA-k)v}t^0GhBH7>C(H!V$@j$t7Aii$5kaiT&Ub~m|_=R$R>ws$ec)f*zsRdRyI zZ)U@qSA`e0-w@G;`CoB!&sA`Imt}@p&yu^(3u;NONzr}|G?kbNad0&8pPw3Adq-_} zfgF#w4cduaSy*`F_=)^3NOSo;GP2eQF1fahTwETKPrYmcCY&T6Qx4Tpfx~z%(G2(% z82T;-gtQfD{8|ZBZ5k;)Uk=a7q*zsMvW-m1qXa2)EJRyO(=|~G^+{`XQ=yxaAkDIx zMl7&4PMZ-CpD;}@xXCJIWE%F9?Xi-TjOFXwm?yHdrEEHKdu=;E4AGRM<*9}IwrsOAOtQUnX+jqc^=|2vz68^im#4V zAMm0Ye1sg)=sjFscdT*iMwn~`Xs4Px^n9)&*(gP++gl&>@gAO(W>oACQHMsBaZ27| zB6a+%$%gLICbc%khkA6Ke#KhJjDxtG{EY7gAYarae3WQ+>fqKdGd3@+21x~hp@Ma{8D}Qt%HR27Dn`4ccty!m6>vbxx^_@@S2I|kZZ?Z+-z;nKK{>9wf zAir_51wf$yV`J=__Tw`B8*JF$z@AU$ar1#@-_0Jix~67PS6B4JMD#p2lTN1yJ63T= z2mQgKPwtY{7i(M-v6EvmUlAaqcp@6lxuJn)%0OQD-&uavMq$;IjWT`0DA(KB=zalu znaPf6W2}!a0gTIa_Sp86^CaXd`iQ`#XY~y29?Vo`Qw*h)CZmUHYWqX%gj^G{=BB|A zYDsPYB_J~1eE>QCkCgtb zDyK!?Mn${R6X$4=nQ`K+Qj{{P8HpeS8iF=;&kSXInV{t0{hu+k=_8_@(Sa{X;kFrT zh36l)9MH}5-xm&yjIE<*H+g%cl&Nf%fP!5=rE34BP`@g_p8!5}XU|mm5+MkSqxJ0b zDP;7{CUUWs&kMb8P7JK?bkwDlJ7(1lynT#~RW+Byav6QQqcSk~>FJ+u8Hqhhb341M?w zd`!FE1XHbXEijzKp@UPm`^{P!R}4k`5=~LqX_|;+XN=rzPQzpMi6zp28{68>&cTpR z8VKh12gjuvwB?!(ouq7T=?x~fO!BU%YEg$v!SBUve~s<%H`q3h3aTcOxU>(>^BG=^ zHll2gX$9Q_@x}lbE$?mQwM*P8g(j!I^aAKiQ3r55ss{RXrN0h+zYWM@mu=bTUnrpV z(Z~I{f|hl`W#IH1Yw`Ict(F%ubIR+1X)YT9F-68cmEZ$kgq$q*px&d*lWANuT$j%J(j_(P-5cJnmfZWT*Wge_(BzQ@ma&S zWbPgha?Rn4WtAM;qTKas7O{z^G*yS8P-w+N)YfZ?7GtDw_FHhn3xhQhnE3=)crFRG z@Qh&V2WErJ)E!%>kQly}o7oZypVAiIXk*)NyL7l46gZrny0h>>+i4SAC5oxvnJT`~ zb6wQGk~Oes9S_aW;6S?4fb#-DQ#$NjjPw~(sh|Rc&ND`p%x&D zeer?iv8Xe~R!Fg;>g4RZFG*S7wXSqe&(-M5{TbI}>7RgijzNj1#$5E-#D=PwBNgzM z!eT!OGcg;>z{WBqIxLE#G${dzusiugkGl2@&DoO?kE4|~Mbv7fq>>-8$}KrPokOJF z)$5xn*?Z&~kuwY&cau==zK9TGkTl=rCV{0KF^Qh$j>1?ozPy@!+}uk&{1oamZ+%2k z%8!G1*qEi1cmw4y=tbNs+oPRr3Vfk>^Y5wMk>tpw+`7rX2Kfe-BLW3?4Q(qUt1aM= zb2;kh=YlJ%NwG@`qpg`|HblI(xX(yoqMO22_hbobnEFeQ8~B?SJfk*45!1@g zcvhUl3=uzhtSeEO2;X9v*Oz+LNm5S>k>`m=2IstT7eS<|4<2Ppr;?bEH4Y7@-MZPeGIZyanluN$A$L~G8dH%zJ7&chu)T_cx4r|gBA(l*0M8m z>mpN+bUTgSpal-c&JvtZVX{sRF+D5#uDuHAgeQV_XMdy*q##sr_2{7Df&irsq{^s= zS+h*L9^gq=*opV6JkbF^!2aX}mh#^zAtpjt($2qTc8H#jDhb*gzm|F>^oABz4yb@T;{)GhvuuA;enbA7 zd1p;UD0=9Hb9`k$mnDC3BQ8fEW7c)YWP|F1p~D?)WR=x>$-)^0b1pO^s-r^6St#mm z6nL4U`b@oqK!M2ZdO-q;W`Xq_)QAmo0n<*VNRRVh7W=76Ts%3=Yo?r>xDOwn@=X@p zJpa)tfEC^@MtDtX9o%Cv)+lLq6+%Xqm64O1o|yp+_N!d1+ffYzXV++HXepG=j0`+~ zrIE+JB9X^WsBpdlqhe%OXEFFIA{jgi%x&6|Fij1^teHDnfy|ZqBlP(cOH%7if5pEK zW@JmpkoMoM*Pt(tFs82u5@bEoRC8b(R0VZ<^VQoWuV`RLuq8Sd2Kre+ft|EWbv+OD z>hnIs<<)My*zRCHd6C4??fBOKdad{fi^t0Ng4Xtn!cfflamDg6zNaiohWv#Jv=ymQ zpGWVA?;2+Pzf~mr3q*a%{PH~K1ap~xEaFX%0RcD5^7nc+Q(ikrc@ax^IRNYIcL(pTAy8eO~VV*mjl$omGqGhR-tZFUo=Q8WHbD5=JcnI}93croS^TWy z2>jBK)+IzaCbO)!G{Zlags?U2gUG340}0?PG$jW`tgDzBIuEISGYMGAa5vo1j&h-I zshj%xM*B|+%lSgUXqfK*hD+5Gj*viTRa1Ai8fF-mvbo+$(;G^CzL9>JvEtQ2fjJR3 z+*HA8DZshV*vHT;uEGl=Sv= zJ~?fGiq4;Mt;g`z!;=07jLgh4es9Fx=k|WT2fXtN_R5m3x$~l~m$q{@z7?!o)fWo< z?aZ++rQ$plCtwUf_)%4t8t%jk(^+0oGlqm?WZRHatFKP`Hdr7Gywok2Jv*vtSrGx` zqJdtd#yurAv|Py?U8i9B#MT}!&>q2lA6tqqT5xbLN?LZxV-Ml2w){=nTXy}|@(Nzm zkS}YQOf%&FD?TDT~W4%S(03ytKFWRkN@i z%y~WNFeQs&d8)c9WaR#&hNHb<{L9DtmyNm!2T=$6BKSL!^MCY{uh4?-pWuqnBP|xx ze{I}}Kl!TNsHX+8{|y;6=MyzR^^F+#=RcFrK1ge?g4)gh?~sG2Kk=HNTtk-c|CxY= zKN+qsc}%PS_4&As03YzSU8;`s^S@d8eEkaf|A}G5ZAujW->H7GR)0`m|M{nR_}Fb* T!&~v6&ks;cPPAG?Kk)wmw?%?l literal 0 HcmV?d00001 diff --git a/docs/guide/Exception.png b/docs/guide/Exception.png new file mode 100644 index 0000000000000000000000000000000000000000..9d014b6dd9e5d7de5e8886c9158fbdf165dbcf4b GIT binary patch literal 5690 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 literal 0 HcmV?d00001 diff --git a/docs/guide/getting-started.md b/docs/guide/getting-started.md index f0472e7..aebb1d1 100644 --- a/docs/guide/getting-started.md +++ b/docs/guide/getting-started.md @@ -32,15 +32,15 @@ public void MyTest() { ## Quality of Life -MiniMock is __extremely strict__ but __fair__, requiring you to specify all features you want to mock but giving you fair warnings if you don't. +MiniMock is **extremely strict** but **fair**, requiring you to specify all features you want to mock but giving you fair warnings if you don't. This is by design to make sure you are aware of what you are mocking and not introduce unexpected behaviour. -![img.png](img.png) +![exception](exception.png) -All mockable members are available through a _fluent interface_ with _IntelliSense_, _type safety_, and _documentation_. +All mockable members are available through a **fluent interface** with **IntelliSense**, **type safety**, and **documentation**. -![img_2.png](img_2.png) +![documentation](documentation.png) -All code required to run MiniMock is _source generated_ within your test project and has _no runtime dependencies_. You can _inspect_, _step into_, and _debug_ the generated code which also allows for _security_ and _vulnerability -scanning_ of the code. +All code required to run MiniMock is **source generated** within your test project and has **no runtime dependencies**. You can **inspect**, **step into**, and **debug** the generated code which also allows for **security** and **vulnerability +scanning** of the generated code. diff --git a/docs/guide/img.png b/docs/guide/img.png deleted file mode 100644 index 6eacfcdc09a279aa6d11d29784c8c0aa963a35d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3640 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 G5&s6ELLVLg diff --git a/docs/guide/img_1.png b/docs/guide/img_1.png deleted file mode 100644 index 76bbe64e8d3aa6f53e46ab9b1ba563615523a63d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18130 zcmbTdbyQr<(=M8XBv=UU4k5S&_dt-~?hXNhyAMNfhY(yRK!W?=G6Z)B?mDdr)zin#Z4oL;G8kwiXiuIz!I1qZsrKZ_)2+wf z4Ja=kue>J8h$l~^lVv5vHN1=tTj9ody4lBu{(}lBA`@3USKh;|OCt5nR!4_>y9YyW z2)_lt3D}6wdM=LZ^wYq(Q$teqX?Hc6Gh=ZLfz)8Np`LRN%c6?7T>SijRepW(vZayw zRmvzXJxxmZosU%x~J{V4Uzt%Q5VI%tVZ&NPx3FG`u64U!Nu{#~3vn^WO$M>Ie zf;sN)9`7(P4*6es`iFrKXUejvf91S3xfygz-F22oHHK>oiTEl0`Jn5Qi4_n8hAx#l zCl>8ryGx7nSBek^`CHSsf4clCAUN$$-`}C&SpFGAAJxad;%I`X{%sKWf7>8Dn$S}J zvTZeJQ%q97?pi%@ y#E!ci+-)n!!J&o^*;@2{!Qm#NE+(Y?=zAQGRK?~CWJ+JMP z<^E@VgO>)z3`v@yte3mYw!HhlD(6bZ?#9#=fRjOy)}_5?!K`>Zt!$+o6BhZsacLtD zQteuELHnR3Nzcup8^(l+Dnhwbcx90pm|grl$QE_&)4BhNpiO?!={j77P*EG`-OwW$ zg!(OA7YCc!Qhn0Pv~I3-M~wPJG5tPGj=YX6Jjs_znb1;7>Pm6=OAaL7yb_X!l28XK z?t}}2_)3Fkn1l^2%~({qCg2&I`eyYoKiQpS;{qW^{CvwgyO_>{re(u2A+eON9Ijo+ z?|~-hb(vku$!dm(qVKO5CK%6UP48*;c!c@16{IHfBa1kc#i>9cMQGq*$m?U&mv4>2 zuc3q(B{#Yu1%qyJbi!O&ZNy+Y59v*!3u|m??;$)n?}AE~^d9K0Nl%Et7_q#6a0c^z z*w6`#(o`1kmTIT8V{;d8JPO9dcxOtJmB|ZZXW;z&B%>8?IIKb!%}LnEjMtAp(qu9F z+GH#jw8mgv3qA!h9!2^%{Mv-Y^>UGXiIz+yWTY!MdFh>tQd@O0|2Y-6PG^}(RTDk7 z>A*Ismg~wk%G?4icy8deDZe%$<94D99tDN#mE znen1tkMm}^&82F+F+d#e93@259L$^W744b3r|~pT`3ZTS^)KLHs&98+xr)Y^W;5N! z4Dd-{zp{Qyk1)1}_R;-a)XS<2*8W{2Xk zprgGhc2HB7hRL=8=JRKT1X8NH6+IJOBi-JPwRJ4Omje|~s?1|Vn1q6PiDrq!tTa3Y zfJ38uO=mL%@{|=H-hRj4ItE@fbG;dQ2wzLr#@SBQ=@DXC(M_{nCvI}pS zJpE=}OPJoH)gCf}OE`SLB#*N_Yl0=F1^XQe)@_*k(m`2rh8uE5ga(%8uBE|`OTk)i z`0VuT2LXd9=B5taJ5J7;A+8rf*MgDj;d{d?(LZR0ZdxubclUn5Lq_AM(>V*ijeNF_ zIYvfs#%UVk{hUE}g-P>3(tn6*UD-lb-i^hq)I{20Qx}ZQ(l<mp$iYKhaI|!c<=Rb?y zW*!J*U--N=yz21G%_8D?QbiCIr6F(+p!U(q?P}yIsKKeoD%1I!@9!Qz#w91Pxv0YH z6z#BR$7hlZr_mEcNsQ4YOk&P#)O~^Nx*V1|F^r=m<&0vYK?FlPIL>NVOz_MWobTy8 zQR_OHU^G5KdeP}y{TM+dL0*(jO?SeOsISnpYrncQQq#J&K+%K|o2j&zjthU%(O9W) zHV2A}U-A6(m`~m!1^0jHp+r9;+$gGId|_&7*2}Jb=Dcn_6-e{IddFU1A%R1foH~1A z(YNj8ydlYoFT~At>ZNM{=>S|;t7mdD^A@hdjA-kt;t}p zGNXpcC!}>hz4E3jB_CcB0SjK>RmZo4!ZvFbhhph#t3r+Ew|d`|IGLL&{ot%pf5SZ> zaHv*02di{9dYhZFE^xu3mEG6-PUc^S#w@F=BD;FXvR-@#~!sNE3yC-6!8GODSL&u#Ao{10P5R-9g7$jQUYWgSN z?)B~w=OEnq_OtW4vPD5%FAIr67ZQm-i_a6qIZrO)FE2WV(6d~W+B^r27hu-VU7l@) z=bECuQMBwsjI-?pV_mZ04rmqy3`37{&UU5h9#>ti+eCA(-6Els*h0cB3@=z9UaJ+v zdS%fX9%&Z=nmFbx8Gx3Hh%S~Qt{WwFB)%sEaf<9VsRM48)C zNC-c~zb_u`hkuqF)xlF7?LGqpS>-W?SFUC@39l)>)jo2U{Uya^scKLgbBc)Gqi{4< z^hxR~nTQ%0#a9UPohDfOxnh5}t((S)yPNmw{ko93ION%sojreGEq_v@?{t9 z$dqMtzm#Bs4<>`&O`B3te_91T^rMPnaRrS{j~URgTX2~kU2EfPDTrTZ$ORB1Jx~tOqx$8;pGH-L5R9t>Q((h~4v?8@{&DLG_ynU4O30%^|I{ zwAiM$md2|m@C|{$-AaVq$Q<5Qnq_&gz`extu`rHxb_`D6AZ?~0Y2paPIMM2LN^bb- zNx=V)*&v#^FPzO2N8kY?Ie3FDaLKgC1eEIk9`HztHa* zl3qFX>p`0LKD{RySFnv3&OhZOx}1o3v%}83H@px~ z!OmI#DV!t2-%CFjvF@VuMjOHooMDO^L!a2Jo??H`hYCGQ?8FTUx?E3aI~!tS8C#9N z&hUNOwzu&6rhzfJz4aW_&aPW5CJYj`(s0<5H@6I8a17ETx^_c^psUl6$}rHvcuZUbD&jiK)FNa;a_+@ z*lptrM{GDH2);S<;}we-Sc`-6Zgoa9(tQX{%Ve1Y^8U)norgc&LGV%0X)$Y~^6;gnh|)n?o|2%;%K zBWZo@I#6}`g$)G$OgSc?n#!;Y4lN)VWikk!=aaVP=3@=aAfo{D&Ln4K-ysAZch_jl z?L%ry(6&yhqGfqUTKRR}B1@+6o>m**6ic+s1RRRAe>BSy4H6+junrCG948L^e*J9k zPExf2B0AtgC`MZ&p+PUIoM*uelvNe^O}uHF97?Ya_^d&wO5~r3CT%?lrqk7NtdLJl<6bwilz!jnCRLj;llG3#fh^Ze>p2~$-Z{^HqPi>GAht~P60 zl$*Tr8A_>SBko7nCUof+M0czMkG*gks2oVCkblRPQQMt7J&t9S*CG`ZNDL4~RH2mc z1Fj9=98)5e5Cze4Y-#InVBU6?-8>2x9d$) z>|7TwNsFIaZ5#hxD{864MMs=bu<--VjK5RAUgq^S`%4e(Vq~+Rs37GOC4-4~ESJSN zy+sFcJumTw511Ypn0z7afB-Qsp{Wzz&zEoL#(rbQ8u)p0R>^hF6`_OVDSIf=*Z1>; ztk#ujqsPOwP$$;_chQ&8xNC3km3vb?xRhf(0w)ybMCqM!8`H*N}qP z(I_tF#}N0>;s=zz#C+^qvzm76UDx8tA{y6+D`&f)f@(N@3D2X};9u)>Q&H~CRyj$8 zC3mAcq?}_0zQ#3f3giXofC2P6`T(VeaVm9SIag*^*(OL@q! zFot76l0D#B;f6yu`;t*_nOBsOc|EADk21Oe)7v>buOu#wA+?5>a%Ct5U~o@%T=1jK zNT#7rID1R_gGwwQ`)tl=w}&o?*j3`=i@U&MUp>+;Kk2Lj4h0i*{}EWKE!WTT^&4#P zXeJ7mI96Abgn=YH1GJ4Q)euw95k434=yS8VuIFCIO{uqaoqrohm`;1C&#Aid@nnIp zYw;V_)|&cUA&4*Tk8h@tlDw@QMM9{b=URA~9hnFUJ1+b8%C|+_2V4H*$a^`+?>TRq zCWWNV{(-Y*v8IBEGfKIR7O2&~&VJ@i@SMnBd4W`0>A@Tm>T~~W0$=~`5|S^)I~4vv zXky8A&!PWp5FF&?Hj4`XJV^T$J)G))o&frTsk`dYjL-`@qER15_xN}B!@n;-|L4Xh ztbZiLi~sM^|BnsY-T2SJ-d?-V0K3W244HrAxuQ(0h?__0$Pcnkxfj*qt{`Y!EUfwipt;r+7D(eK=q9!?}7#H_WS2E+6o0t z2-)ED@^1TNA`WosHbf~edu3-FAj@E>{KSm%Hb~hHBH482%Ak%`?DBN2>#R2#9Xxy_ zA$7&k!+t0;n{vR->yP^y!#{K)7n z6>7)!K{cE3bvxRZ&V)D>=YSrgY!+jcs)ymJZ+DU8d+1ABYA}>y*c`+XEhp$bbKcT>Q1@ls)A$G~nSb_rPK&F|>9L6+ zS)Fu3*V;)$aYv@yBkkn3^GYwO7KtM2v9BTOo^LrlwqHA}G>7ncl654F)nl17LSgNgPK`o0hSFR#Euw#fvSw7Yhkzz&SpYP2K`a>?|eu)p>Z6- zZiKY7ANU(+3eTSAmD{RVJP7F=#w~D%BQ?MLAt=8~Dbju2>u4?o9G3>eyw^nmWoOSE zVuZV9H{P%v8pigN4>oYYo?L+d0Sol{szlA#L-Vw{m*&ySN%PQnJYX@BY20#3z^3C` zUOalZ)?0Qhuup+n9mHt2Hm1;E*&$SuvT`p)xMx$zSco3FzaagZ>$FVMuk@xSDNEWz z7rs2}D3^ZVUU1qkbE}$NK-+NT^-TLF zJ$^8TTI-?;mXrjVdbCTEElo(BvO7S<9Nf%`Fk37@;pAc;l4^F^?SG<$V)-q%D!%J}t3uLB{#)>?=6qU!0$R;l#W1!|^siHej55!5A@WU*K`yLUe#k=d58q`G?XybBo8B z@9hh3NkT~Z@g&tL+XGey>o236K{Q>DlRpgeqo-Ts6PRf~e}(z=a)wSJj-x(Y^p%Kk zXpdw8aYwAmyOzr@ZdM+jWY={T1*tp^p z-0Ef1@TI+>5SBd7y*>rF8Ni?Qrki_b)P|7(@z6Ep)p!e#%UQHbGY5AJd{Jg(*i7}^ z>qZE8ntb#VhYLV*3ynJ{iRB3`p{LRaG39q-Y5wpuUV* zO|P`Oo$Nt|AS8jIK+Yre;M6oiOGjqW>vLh=;>#3oyWwNgb(q8RsjQV&)B@4wFEMlL zu}1T7PU+he`q=I)E{~i_1oGAQ_gVg$m<~VahUT3FMrAOa%|8>(Ol9s%Sd@~j1oDyz zo>jHjd2X+B)<~g+_{svjr7dpq2ss2QWr-`*8H_PNpyA~&5Z|lc>ZD??O?xeNJA8SP z>verm5Jjxp^1@B7l(f*GS)-hl4wbx;dZ{^p55y=!m<5o>to=34f)XnedP}Fwv?;3o zALX1}aPB?&(DZpahLkH@|DghB7QyIv{no-d-^%q_bAx5g@-A>?RDCx$yNqah(@Q5) zopfs;0K*D-xfd>^e5%yckr}8c4cxNdJWDO-&-hSzk zV2yZ>T6)}P-aEw}rwBK>yzmzOFD(&Gg&qIZlEs>DXwr(^DoYp{A3(dU!8`{kM!lWx|yYhE- z!UCZg;~}Yw4;+pL;E{fZ*Yj+m?J|xss>WJ@-}cKG)6RZ zxkw9-L^z_T;*SS=oOS~OwktaWS!$HOL64IzuG~PJVsv`M(%$??Kc02(CiTLaSxE7) z`oymo$b3xEv$Q5eB-D(5pXyk8uzqKiuDyXG-ShJIfz_RqO+lZyLDnSt*T;>rrvE_1CtdTBl!NnxOU=(o)RL~0|s z!%0vUZI4lJt}Ge_5UW>ti^RT)H9xrbi;foU`rX*6L+sMMXYggS!uVH=FSNn$3Y$WN ztY?9g83P%~R~0?hfVlH|!$LA>{dE~dW!b>?+8Ma%WN7{a>Pq;%EogNu2)RLwGlKM( zSvhHMpx;6A_~Z?n=L~8{QiUgzMaC4fHK@^1ax;GcS#tXt*x#ALJOI_5*NtFzAf+3c zt*6oF?ywvCl9}0qg)87v zT=-<7ZGZwIvAQb19~rHMY9Lpy)zcrw9?5Mg)w=%KrmojtwHfa1nJ}9JoV~l-thqZ& z5mxQRB8ewv8{6RvT$+*>bxcBKb|t&2Q=Y*-jM<|Kpt1FZ9W{ zn$<$)R+A6dE3f@p$!2mzUvXuWB82g?YY$^S_Ob`_D1?cu_4@Y$AmH(Z~VnFxB%whG*e7&vxS@qe&1aZwtE;7*`7{lE(?yuWAcjz z{1N5sH!Ay{5fC1N|F{0>O{spM{}%&2M>Vy~{TDpBqEDE@lQQ27 zO#}_M;Vm6gv=8JqdV5C<>xWH$u-fnpqy+NF5Q=Kr#WIyH);^u8!mJqO;cce0kmt)O zyQO-4uoM)dNY~-%tc<@L=ektBYXT;uX)Y&h50?NMk^*w{_zO;_Vs}kkCp#$TUXH$M z`Q5vv8`*Nh(^n0Slli=#^}U=}DGFkGRx0T<{KUm&2&#y$fB8DmZZBkT)tqhjUDoBi z%T4^kaUskAq4?k>dF@m--6zyWm7`m zkan69Iw1zM%f^)43(66)PG<21w#v*mf5Q36BW{=)t^rf-HDb2AG}tJAAd{l5V0#>c zrDE#lh^|U#uJFD23!{yV?S9X19?DN8a=veszoR(P%5wDz>KoKDN-kGAJ_%7N^oeNd z)DK=)$v#rzz}L@g++<)rDe4eD31d>pOgU)Lg-{V(Ep_%~lwgO?F;r_aR^Ul3qA!>2 zIRvW$+57{{lpmP-vjJ;^$60gY&s~JmT|Ja3o&k+J2y>f?Lv%G{+%w*c6I~0$_x!<2 z;&Sd<+qz>S(Wmma*jgBJ{{_|(j9Iu~2}vtbK)k6mzaLcf4X@hmF3D{u5l`D#p5!)2 z`)RF=W-nPqzP}^RQL8N*w{zJgvZ*JZx=;+Oc&1BHuH1mO=2o&G_N0K1@KTbpKl%2X z;nCT_F<|q!l&0T51h&#&ebHg3;qYz|y+G_$inc$kscU7W9KWGM0Eg{nn=+z;sr-`QpnI@xYe_q?Tdwmx>@_Au

vw81phnYVBXZ8;R#w7bK9bjj21;7UBLNjpSfPqSdXWhHyfoL9gpe2>!k!ISgdyWk*ZwG72s zvccbCKuqMlbK|Q1C_9<$bQ|5@Lx@kCp7E4$!P`BLwaF~mXxWQqzhi>sMdyz&{e#E)QT6!19d>uM91kr`+~nB0KsVk`QOxq3z_s4bGIIzl7$X?MYWxrz%(U{P0pl zz&t*2Z=j#7bJdF#3C(TY>r|q?4qxOK@g;?J{*fokjw-k!p$83znH(8OgXMgl*TPJf z2x1HJ;MYPDW#t*Lv@*KiJqbo99R|pluUwj&9k1t zn!ME+&pekjHQfC|ih28c45186?1>Xzq{lfnqy8r1+v*y1SwSl_5Q8HGCYFOg`cW5; z6`66W|4?0SH*MkW4fy~mjh-(nqT>3HCuv1g>hsv`w>bQ^e%=?a^Qv!i7qeSd!so0W z<0HTC&9^ttM`|<~C^tO*3!JqLP+h!WJ1$8P8{GM7DeBj$>}={=#k6Si)i-j#HReQ? zi&T4<^!lS9g=md}s0Ushba4aaGGy*cS|lq7I&LekibX1EH=?Rlj9>0y8klXREhJp*7ZKW zqUt^EkiV4m58}CQ*_Qhj$veZSBkGnSb(|Y`U&5Y-k?{-Opy}CEy1UjZF1+XX#tT8W zSbAgWI^Jh2@m+54>L13e>q7fSCheiI8#X~w0K@xg`-gx?I_7x%g@PG$aKuAalxi2E zj%v65*Vd1fM1FgQIljFa z`Ty_Gc={5&d!820!Bwq|AkdU2`9XZVP&n_7W_0n5D}%=!NQB!6?~A+FB{0jdC6)7( z2iG^5%D&fTl32PS9I8;GVABXTC4(0u#|z8iZDzJhG?QgBOl+0P^3y-Q0Wv$gl>Et$cUe#465nd{g(lMq=hm zZkBPL-Rawg)*C3dE`NmEK- z>5CirgS6tSNm5LzpQTZ1#!6>bURVPscl5r^hclVeBGD4U6SU4yXu zl6NT#caFBBYKKGG;Uahbs6Em=&e>bL@mq?l;RKE)x)_)r^1`0qZOc4bIK3+?s`obm zBi>OFY__HBdUfJ#_OpwX<0gIlUCWBM*xtOm6DHauT>D~GTCZd10&M-qFkt#QS3Y3S z`1}{QJeQ}nV@T;DQW>s7a=s4z;7=YymfdUG+MPx~iZyrDS-)Eq2$Wy=h@9at*>d7^ z(<

*O?2Su(a1EiD83gBh1JPYLQqk58gR6XRvJyhh?pp0Dp?lBk~y8Eqa}U!&DZ| zw0CCGe#4Zr*MS#!nJFzQ_O=! zTWh)ZwDch#TqpfEo(CW#clLQ$s{W%1Y?prx3;7jdzoK$!F!?%;0yf83&LZo{o*m~j zmwgCcqq1TeQm^c;t5haI8Ku?B6%IB76Pova*GfIUlAufqy;Q;+)zUSFNbOYUSVr-#?K8r;?*CcEnG8^dn+#juj z=ZqrCa|#}LLxDK{6a&eWzvjk9F^~n+O|t`8>-w;xqcOgxiBOr128y|0Y11ck7>s)( zDYLnKrve6)AUj#{G?j~WG{)-v6xJr@%_i$qlY&r=?`a&$-2@qVM7ArCn9~U7#TJ3UeWZ%Dlg%F-3sHJb z8v{f=^z5`GlbAQ<)foIf7r55HfnVZJQD3z_#^`UAGtb<&IS1p~(Ic_zemlGZ-ViI* zY`h&!n@p;oDpkZ2QbgFX|ANi1ulBS$FG6ln;wWB24`Y%B-XDJc)!qy;bJ9*4*$U1Y zH%TVk?U9x3qfi9K_9hsw-q$94j(dZQ%_Vl~ZhG>#C-oInZA<^2_BR4P?VkeQ>40;Q zXEc3REbrIO+b??Ub^2tuoIjEg62nz^IQfs@idq)AG)A(XLZyy7ntMG zXDe7oHzY~6&1-9xt9Ha5?R6g_NX7I|8G{?|6y!};JB9~p1?1L@FNkff?kO~dvU96{ zQs&G?>nf2RNJqSZ@HGFdX{J}v@Dx6Et7=-d!Ra91k&>E0dXC_1cJ)j zJs0&Ae9p_{2}WLqd_(X>tf!Oc{@QdCQ0>oO`R)P21KG#ubbHq4{Me_x##Nrx?|NLf z*L>ur$xz>9s!A9E)4Z5WcfR^bifu|Yxu&)`W_P!}o9V@^@v5Aa6b0{0wU`r?ez$+KCGzcJ zH2Le`q7J~PtC6sYBuLh1pl)L+=6vhVK9?v;7jrIS84uJ=oROmk7i_n9Ki7V7Z9cHfF7>alaM?-GtF%HJU?ne_Desfnv6!^(9F~kCmu7mL zIo^qE;_gzTyIzV7#d6?wMLk*YjmxI&{Rz>M?5NdgutAPB@Qz;NBT<9oP(ci50nMu8 z^Hw)zscC@`cFS8UIe>1ZPsoJr`iE8;KRWVQ057@XH7CK^4g$qWGNImO*SC zXMBq>&P2zi(A++oPidu1vx`5&S(tM80*0{_!X7AP2!vy-W-Ci<|leAg}F-)~#&RC9y)z=Z;1MaTOKuNo$AXZPx0bV!TWj#r(=cmG4P%g{OZrDS_ zKr$|ap6Hj~d(?@w{vql1lr((G@Rn6O8lSaWH){VJsWXW?uU1X&(s}|*Pp-g{oL*V*0^DIa zDs^--s*0C>Px^=8-e{5>ta}@y0XN@~?^S6&e56GlS63^4hckWM9D}rE`%RDTYPFgy z5r3J;D7g_f*)@*~z>lL}$X9fzCpQa{mQz?$R47u{~qy{hpWA>6r)g#$cpz(Vv zMK^D`szHu3n?jXsgcMe1GfnYA#}Qz!~(Ni!sFyzlU5j zE>gr_dRU3E;;2Hk%FM9iwagkY(e0xtx$$?OnKu&g>Wt`MR+;p8kN=K@>%a1VzMpj% zdg5yu8s`)%Ry)t|M-HHGaxeGz7S5kh>imY|CE0JU)`zpF2t6PLPpyO|J?CtO*Q3}% zI`tzFJI1Ow8Jf(OwRsJPnBOQxQvi27Of&AC!+xJ2pHES2nt)-j(C{L1>)HS*-vQ@m zVVjQq)t7M~+QXH>k-*2j*v-`NfcD6u&+v*=gO887ciAEF zur5*y>_B>dc0v~*Z!#dtzQ40jE zDXz{+*8lkK)eG^>iO|bc(O|8bx0f0s@^3ixAuPMvQP(3)LOPW>AB3Q+0KzF>(Jy>& z?dlf!-sCi=BY>smPto42v6NNBPSrm1-uI6i=yr^K`V7@v%2q&UVoq z;Y~as{a`|p-1F!uw$cS~Eu}9bS8{D+gSer7q?*l2biv|Ey_Vuxls%FT5bmH`FiRKj z3~%C5vSpZi=lE)?8us3Fn+Y(f8c_UdV;-~7H~Ax1*_O8E8mDR{1D`H3A=#X!6XEfP z-Ry@B1RA6LnzJ>5ms&>MIg1T<2f`Soe(3`|`3>DgWGZ9bBn{CWhMe~69Kjpu^#muq zHJkTiBNeK3Ubu@!ccR5gsjTZ@%#|>0mYGcRI)bBXIU8C!NVDm)wb__hvJu3jH!AP} z!0(5qJJlv}m`ve)@xICvFTgH|UE$zk!JqX|)rKlH9-~*Nv(o#x!n66d6jJAU8~*_> zPwX}cRY*m?FO9l6$XJiEdM6LX&Xw{b_H1ScM`>Hw(3%}72RzBbdRvixE{)sifzOMU zK6w1UkqcMD{~zQM{2A6^hi^=b6NKmZG;qN`?l)q?sKQ|8XeGDWUTtv8 zX!FDVGf>7{yb64GK|T*^j= zB5B@1CLCJ4RPeP-Zt#DC1gu^SBKk%CntF2^v?%yz3Nw!qD6d*epxgx%~oXR0Y!|?e*Pp(-dV*lI00!+psPQb{KRnBkm zgj=bP4uueo=NCpEOI!8|TO@ z5JWQ7Y25FDM*aJSUZeIws5qJTb0?YmxZ+ngBvr~4WHw2qGok^~l$`^`M_N8@886mG z8Ls6eH{eQY<9Da=OA!?GA|_*Y&~ra?QTaq}+Q|bFeLc z{u4YVSr%eqo%9}z9Ey9-@CU*bS~NQ>*d<2B7YY}LDZFmwU@LDTAE{X4i4&WWbQ!>) zc|SG80p5D^g39=X>UujH&&a&#r9W!~>h|Yja*p=QdW}@c+bhkNj1Q%H|JFmb;^*rk{}G zbV*a&vo%lZ0Rbvi_u_niJ`^9!VeB^(lrBJEY35N0_sIKE%YKS?eHK03Mro08ImRr2 z8t7&ESi7-Tyo>NKjR__(Kiv zswe+X{FM4S%myg=FVpYI@V|%ROau)eP9p!-vz~FA|8s`!|N4mB|K}mQ@L eUVP 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 diff --git a/docs/guide/img_2.png b/docs/guide/img_2.png deleted file mode 100644 index 76bbe64e8d3aa6f53e46ab9b1ba563615523a63d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18130 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 eUVP zp%rS=Y?_f`_np}(I!i?ivP-$YWiW~YHv4>&GnvXFdjYgVusPH&rJ!f4?8ANzSHn91 za+vXOyq)g9q`ZR#8k&g%>OUt81>Wj60uRjGUYsAjU%lMST>EPxc zCoKM)TVXD1cpLw+@xCW2y-DP4M!r{h5lQE}zFiFvXE|yPi|5m({WWJ|(WdDwe2S2G z3StwZE5(xn{v7E)>u*{Rd4UoV2wORIN@;sv)#jh{$se-#n#SM8&i!T;^V)(ka-9Ue zoTeXJ{R}ivH;G_mGB3WMLs^H@P!ElPMiM!;&BwM5XMZn-hrW#H9;|YKYDvya(NbZ( z#lAl&(a}w)5CRnup`SfgC`o?(J~50I_K7@=Tj_~Jd?NFNTek3=qe>qywx4vOF7j8A zzm(LO?Q}3)ZhzNZU{P-cSG$qIv_u5!Z9*f=+uQZ+d>f9{F<- zw9P9DC_jgfq<2F-oh{sO^6F)rj!&PLpYzaaqm}HFbe-&Md%fcg-2ZTFQfpk*J^%#6 zu5akhe51#jX}`6- z{VEG*MqwlNOqgBA3+;nrFJWITUST$E7IwNt>JTB}#uG4c++L>0ATo$u|30HWWfMAh zirT5xt&`gJE9oxkD{EH0)y#L_6ZyrRqL>ivynl)&zq()gYcuL8$3gW{yc$y}8;E_J zy&~grGgRJ;qPSumwM2$#H*tVALA6-O4#2>PF|kc{WmM}iOud!g2I4)CmlC#*qbhTOev3@)1yj%N| zA$;lMk7MN|kqH&!!0WoRy@A^6sZHwhOY&}Hs}WiudTqjOU9YPyYvOx^#zz#cTdTU@ zG;FPW7Z+W4(gB@>{aT`HK?!p+wQZxo>a_%H6hGZ-n z_pwe8(^QZ~K%b?ZHG|qfbO;}dUR0TWo{m0Ybe4XMRPFF=gEd#~!a`LoU0~pBbS$c; zgF6?m{ZgbN>5rDWn(w9%7pMssS*6vCl^|tnXOF%^CpD~+Hc^;xuOXJ6etHn8mK7lw z+N)%y$PjE2AR#`88f|>={yl?1QFteckBtUzgBJ8UZ~t?OT_x*I_hEczp*njnn@B9@ zl3E>lHo`@N=b)@Rtk6a-hhfQPwa!aAmr)#>xFQ zSZ;rR9%-EAqVHQ*)d;W_Yx-h+dZ|kA5J zOtOjWhBAc>lA_C1CFsW>VWbox0Rezkwy$Yj^M}uiEf|V9rLza#q*|e8iFZN;lt~rR zbYn_vh9y$kBV2T*%dzh9W?tY#{s>p}AQypZjEwoJI%(bUN{ggC@7uR5uNdG0NIW{@ zIxpG5{n=py7R+NR-xisohIQA^{!(ci3g|>fl_>NmHa%Ol7hQCbpOM~bH6MJQBkSu;R{4uKxRS<4waX)txDO& z0s7wVQ-X_4T#-Kqji)lj0O$PE2H` zRq?0?Qqx?3YC2;@{PSyAQk<$0aq{T)CgCa~gt;*8O+}-ES#q$qkQOUTHv%VO-cqt2 z68WzFUHI%4d*@{x1FyquIEIbZOh0B%CBHhZrG3LrW}5?29a|cR-(xdutic7T&d#yKT;Xz-z&|Tk^6MAbhSJE|U z0G%Q+>&=)thGGpZ_MJaDk(pl|n}0f|4jm!y8Tfj7AYye&dOfw1k_v#KI%Lj=DEc8> z_NaX3mwPJ{XY4PzPcEQ3>fZoN3%JX%S7G#=z=x;ON0@nh^BDlxtZHKz z%5qUFK;m?AR6w+-nS??gPDpH&2(2VOKWsMVq8S*yqX5&+ei>ev$(`?gPW2^(G}nuV zOyx3_d@glmGO+d{Bx24+Y00Oiq9}y#k_v0#tZbzciIgyfw)ZfkjXzLx>~QqWBawka z%Rwi$+Ag_`8;gJ^r`8XDU~?{?uzk-banssgOi=w396f$}3PjirwB5&MX)Qsvy(C=- zM34og)ssR@I1vuw6dr_&-rWqVK)#aKDIm9P7!P=*R2bVu|0D0l_Kv+uhlHAL(Pq-? z*C4T~q>f6~M>_4_Brw-WE4KQD)jPo6<3J5V;W%AU!SM{>&Hc1YMzO1oq2TgTZ_?bs zfela|KVnm-g)OpdOiMCP)y`lk9LM+_W^)CZBCBdmZH2hI-O4O}q={h-`QgIP>tXc& zX8|`q?uUxmmQhLK@7yel< zRE2{N$z>eb=DfV{+a=SOKTp{$u59FS-KhSDv+0CSTmD^l#~1&v>&{)OI$y^rP|A z9!Sq)hE~r1h}u6kT}I8|eW(?R0o=t-Q_Rnv`}DPV>v8bF@McEgXBOu9_A^Wa)6R4l z0C!Kr_AyDox-YO(JQmoJdaTES`QC!St`K7XQ;XjW;E5u;|8zRrDZ!2=0Us)|*5LmS z_5bewz8T7c&k*UD+4}N*f8C$`TMzyDEB{9y>LKPC|3C+#Oc6;t_I=;?`yV#Xw=SIs z-g`SEa>hR+*|e%T0%^-G{eN8lPr&|vEA0Fe=F73m_WQJ#0!v2I|DXRW7J~a)kqs~3 z`u}^noRjw&$L6RxGmAE7nnr(~CYa&|+IHnqWnkNzt$q3C4rYql7dum-Z3-F*C22WQ%mvv4FO#t8ZG&=wQ diff --git a/docs/guide/img_3.png b/docs/guide/img_3.png deleted file mode 100644 index 76bbe64e8d3aa6f53e46ab9b1ba563615523a63d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18130 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 eUVP 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 From ce54ec86fd4e9f2213b4a2f1ace4125801dd74de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lasse=20Sj=C3=B8rup?= Date: Wed, 5 Feb 2025 02:38:47 +0100 Subject: [PATCH 24/26] Fix casing on images --- docs/guide/getting-started.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/guide/getting-started.md b/docs/guide/getting-started.md index aebb1d1..266db97 100644 --- a/docs/guide/getting-started.md +++ b/docs/guide/getting-started.md @@ -35,11 +35,11 @@ public void MyTest() { MiniMock is **extremely strict** but **fair**, requiring you to specify all features you want to mock but giving you fair warnings if you don't. This is by design to make sure you are aware of what you are mocking and not introduce unexpected behaviour. -![exception](exception.png) +![exception](Exception.png) All mockable members are available through a **fluent interface** with **IntelliSense**, **type safety**, and **documentation**. -![documentation](documentation.png) +![documentation](Documentation.png) All code required to run MiniMock is **source generated** within your test project and has **no runtime dependencies**. You can **inspect**, **step into**, and **debug** the generated code which also allows for **security** and **vulnerability scanning** of the generated code. From a9b30613271990144cdfe87a4e0af5f668366e3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lasse=20Sj=C3=B8rup?= Date: Wed, 5 Feb 2025 15:42:42 +0100 Subject: [PATCH 25/26] Minor updates --- docs/ADR/general/NoBuiltInAssertionFeature.md | 3 ++- docs/ADR/general/NoDependencies.md | 2 +- docs/README.md | 5 ++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/ADR/general/NoBuiltInAssertionFeature.md b/docs/ADR/general/NoBuiltInAssertionFeature.md index 505c1f7..4655e64 100644 --- a/docs/ADR/general/NoBuiltInAssertionFeature.md +++ b/docs/ADR/general/NoBuiltInAssertionFeature.md @@ -2,7 +2,8 @@ ## Context -In our mocking framework, there is a consideration to include a built-in assertion feature. However, there are numerous assertion frameworks available, each with its own strengths and user base. Including a built-in assertion feature may lead to redundancy and limit the flexibility for users to choose their preferred assertion framework. +In our mocking framework, there is a consideration to include a built-in assertion feature. However, there are numerous assertion frameworks available, each with its own strengths and user base. +Including a built-in assertion feature may lead to redundancy and limit the flexibility for users to choose their preferred assertion framework. ## Decision diff --git a/docs/ADR/general/NoDependencies.md b/docs/ADR/general/NoDependencies.md index cf413b1..24db71e 100644 --- a/docs/ADR/general/NoDependencies.md +++ b/docs/ADR/general/NoDependencies.md @@ -6,7 +6,7 @@ In our project, there is a consideration to include dependencies on shared libra ## Decision -We will not include any dependencies on shared libraries in our project. Instead, we will aim to implement necessary functionality within the project itself or use static linking where appropriate. +We will not include any dependencies on shared libraries in our project. Instead, we will aim to implement necessary functionality within the project itself using source generation. ## Consequences diff --git a/docs/README.md b/docs/README.md index 195b3fb..5c79c22 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,6 +1,6 @@ # MiniMock -MiniMock offers a _minimalistic_ approach to mocking in .NET with a focus on simplicity and ease of use. +MiniMock offers a **minimalistic** approach to mocking in .NET with a focus on simplicity and ease of use. ```csharp public interface IBookRepository @@ -34,6 +34,5 @@ Try it out or continue with [Getting started](guide/getting-started.md) to learn For more details on specific aspects you can read about [Construction](guide/construction.md), [Methods](guide/methods.md), [Properties](guide/properties.md), [Events](guide/events.md) or [Indexers](guide/indexers.md). -Or you shift into high gear with [Advanced Features](advanced-features.md), [FaQ](faq.md) or [Troubleshooting](troubleshooting.md). -If you are more into the ins and outs of MiniMock you can read the [Motivation](motivation.md) behind MiniMock or the [ADRs](ADR/README.md). +If you are more into the ins and outs of MiniMock you can read the [ADRs](ADR/README.md). From 1a842ff50fda81eeb4760ef937b6f62533d1bf4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lasse=20Sj=C3=B8rup?= Date: Wed, 5 Feb 2025 16:14:29 +0100 Subject: [PATCH 26/26] Trim down of files --- docs/ADR/README.md | 4 +--- .../Unsupported/SupportForExtensionMethods.md | 5 ---- .../Unsupported/SupportForSealedClasses.md | 5 ---- .../Unsupported/SupportForStaticMembers.md | 5 ---- docs/ADR/Unsupported/UnsupportedFeatures.md | 23 +++++++++++++++++++ 5 files changed, 24 insertions(+), 18 deletions(-) delete mode 100644 docs/ADR/Unsupported/SupportForExtensionMethods.md delete mode 100644 docs/ADR/Unsupported/SupportForSealedClasses.md delete mode 100644 docs/ADR/Unsupported/SupportForStaticMembers.md create mode 100644 docs/ADR/Unsupported/UnsupportedFeatures.md diff --git a/docs/ADR/README.md b/docs/ADR/README.md index a94757a..446b285 100644 --- a/docs/ADR/README.md +++ b/docs/ADR/README.md @@ -26,6 +26,4 @@ All the ADRs have been approved and are considered final decisions for the proje ## Unsupported Features -- [Support for Extension Methods (WIP)](Unsupported/SupportForExtensionMethods.md) - Decision on supporting extension methods in the mocking framework. -- [Support for Sealed Classes (WIP)](Unsupported/SupportForSealedClasses.md) - Decision on supporting sealed classes in the mocking framework. -- [Support for Static Members (WIP)](Unsupported/SupportForStaticMembers.md) - Decision on supporting static members in the mocking framework. +- [Unsupported Features](Unsupported/UnsupportedFeatures.md) - Decision on which features not to support. diff --git a/docs/ADR/Unsupported/SupportForExtensionMethods.md b/docs/ADR/Unsupported/SupportForExtensionMethods.md deleted file mode 100644 index 43f7696..0000000 --- a/docs/ADR/Unsupported/SupportForExtensionMethods.md +++ /dev/null @@ -1,5 +0,0 @@ -# Support for Extension Methods (WIP) - -Extension methods are not supported due to their nature. Extension methods are static methods that are called as if they were instance methods of the extended type. - -Work in progress. diff --git a/docs/ADR/Unsupported/SupportForSealedClasses.md b/docs/ADR/Unsupported/SupportForSealedClasses.md deleted file mode 100644 index 7d5f64b..0000000 --- a/docs/ADR/Unsupported/SupportForSealedClasses.md +++ /dev/null @@ -1,5 +0,0 @@ -# Support for Sealed Classes (WIP) - -Sealed classes are not supported due to the way the framework works. - -Work in progress. diff --git a/docs/ADR/Unsupported/SupportForStaticMembers.md b/docs/ADR/Unsupported/SupportForStaticMembers.md deleted file mode 100644 index a233a71..0000000 --- a/docs/ADR/Unsupported/SupportForStaticMembers.md +++ /dev/null @@ -1,5 +0,0 @@ -# Support for Static Members (WIP) - -Static members are not supported due to the way the framework works. - -Work in progress. diff --git a/docs/ADR/Unsupported/UnsupportedFeatures.md b/docs/ADR/Unsupported/UnsupportedFeatures.md new file mode 100644 index 0000000..507d0cc --- /dev/null +++ b/docs/ADR/Unsupported/UnsupportedFeatures.md @@ -0,0 +1,23 @@ +# Unsupported features + +## Context + +In order to keep true to how mocking works some features will not be supported. + +## Decision + +**Extension methods** are not supported due to their nature. Extension methods are static methods that are called as if they were instance methods of the extended type. + +**Sealed classes** are not supported since they can not be inherited from and such do not fit how the framework works. + +**Static members** and **Static classes** are not supported due to the way the framework works. + +## Consequences + +### Positive: + +- **No need for magic**: Mocking these features would require breaking the standard supported functionality. + +### Negative: + +- **No magic**: Some functionality can be harder to test but if you need to test this maby you have some other issues.