Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions cpp/Platform.Exceptions.Tests/ContractTests.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
namespace Platform::Exceptions::Tests
{
TEST(ContractTests, ArgumentNotNullContractTest)
{
EXPECT_THROW(Contract::Always::ArgumentNotNull(nullptr, "object"), std::invalid_argument);
};
}
7 changes: 0 additions & 7 deletions cpp/Platform.Exceptions.Tests/EnsuranceTests.cpp

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace Platform::Exceptions::Tests::Ignore
{
TEST(IgnoredEnsuranceTests, EnsuranceIgnoredTest)
TEST(IgnoredContractTests, ContractIgnoredTest)
{
EXPECT_NO_THROW(Always::ArgumentNotNull(nullptr, "object"));
};
Expand Down
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
namespace Platform::Exceptions::Ensure::Always
namespace Platform::Exceptions::Contract::Always
{
void ArgumentNotNull(auto argument, const std::string& argumentName, const std::string& message)
requires std::is_pointer_v<decltype(argument)> || std::is_null_pointer_v<decltype(argument)>
Expand Down Expand Up @@ -47,7 +47,7 @@
}
}

namespace Platform::Exceptions::Ensure::OnDebug
namespace Platform::Exceptions::Contract::OnDebug
{
#ifdef NDEBUG
#define NDEBUG_CONSTEVAL consteval
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,13 @@

namespace Platform.Exceptions.Tests
{
public static class EnsuranceTests
public static class ContractTests
{
[Fact]
public static void ArgumentNotNullEnsuranceTest()
public static void ArgumentNotNullContractTest()
{
// Should throw an exception (even if in neighbour "Ignore" namespace it was overridden, but here this namespace is not used)
Assert.Throws<ArgumentNullException>(() => Ensure.Always.ArgumentNotNull<object>(null, "object"));
Assert.Throws<ArgumentNullException>(() => Contract.Always.ArgumentNotNull<object>(null, "object"));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,13 @@

namespace Platform.Exceptions.Tests.Ignore
{
public static class EnsureExtensions
public static class ContractExtensions
{
[Conditional("DEBUG")]
public static void ArgumentNotNull<TArgument>(this EnsureAlwaysExtensionRoot root, TArgument argument, string argumentName)
public static void ArgumentNotNull<TArgument>(this ContractAlwaysExtensionRoot root, TArgument argument, string argumentName)
where TArgument : class
{
// Override logic to do nothing (this should be used to reduce the overhead of the Ensure checks, when it is critical to performance)
// Override logic to do nothing (this should be used to reduce the overhead of the Contract checks, when it is critical to performance)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,15 @@

namespace Platform.Exceptions.Tests.Ignore
{
public static class IgnoredEnsuranceTests
public static class IgnoredContractTests
{
[Fact]
public static void EnsuranceIgnoredTest()
public static void ContractIgnoredTest()
{
// Should not throw an exception (because logic is overriden in EnsureAlwaysExtensions that is located within the same namespace)
// Should not throw an exception (because logic is overriden in ContractAlwaysExtensions that is located within the same namespace)
// And even should be optimized out at RELEASE (because method is now marked conditional DEBUG)
// This can be useful in performance critical situations there even an check for exception is hurting performance enough
Ensure.Always.ArgumentNotNull<object>(null, "object");
Contract.Always.ArgumentNotNull<object>(null, "object");
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,18 @@ namespace Platform.Exceptions
/// <para>Contains two extensible classes instances that can be supplemented with static helper methods by using the extension mechanism. These methods ensure the contract compliance.</para>
/// <para>Содержит два экземпляра расширяемых класса, которые можно дополнять статическими вспомогательными методами путём использования механизма расширений. Эти методы занимаются гарантированием соответствия контракту.</para>
/// </summary>
public static class Ensure
public static class Contract
{
/// <summary>
/// <para>Gets an instance of the extension root class that contains helper methods to guarantee compliance with the contract.</para>
/// <para>Возвращает экземпляр класса корня-расширения, который содержит вспомогательные методы для гарантирования соответствия контракту.</para>
/// </summary>
public static readonly EnsureAlwaysExtensionRoot Always = new EnsureAlwaysExtensionRoot();
public static readonly ContractAlwaysExtensionRoot Always = new ContractAlwaysExtensionRoot();

/// <summary>
/// <para>Gets an instance of the extension root class that contains helper methods to guarantee compliance with the contract, but are executed only during debugging.</para>
/// <para>Возвращает экземпляр класса корня-расширения, который содержит вспомогательные методы для гарантирования соответствия контракту, но выполняются только во время отладки.</para>
/// </summary>
public static readonly EnsureOnDebugExtensionRoot OnDebug = new EnsureOnDebugExtensionRoot();
public static readonly ContractOnDebugExtensionRoot OnDebug = new ContractOnDebugExtensionRoot();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@
namespace Platform.Exceptions
{
/// <summary>
/// <para>Provides a set of extension methods for <see cref="EnsureAlwaysExtensionRoot"/> and <see cref="EnsureOnDebugExtensionRoot"/> objects.</para>
/// <para>Предоставляет набор методов расширения для объектов <see cref="EnsureAlwaysExtensionRoot"/> и <see cref="EnsureOnDebugExtensionRoot"/>.</para>
/// <para>Provides a set of extension methods for <see cref="ContractAlwaysExtensionRoot"/> and <see cref="ContractOnDebugExtensionRoot"/> objects.</para>
/// <para>Предоставляет набор методов расширения для объектов <see cref="ContractAlwaysExtensionRoot"/> и <see cref="ContractOnDebugExtensionRoot"/>.</para>
/// </summary>
public static class EnsureExtensions
public static class ContractExtensions
{
#region Always

Expand All @@ -25,7 +25,7 @@ public static class EnsureExtensions
/// <param name="argumentName"><para>The argument's name.</para><para>Имя аргумента.</para></param>
/// <param name="message"><para>The message of the thrown exception.</para><para>Сообщение выбрасываемого исключения.</para></param>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void ArgumentNotNull<TArgument>(this EnsureAlwaysExtensionRoot root, TArgument argument, string argumentName, string message)
public static void ArgumentNotNull<TArgument>(this ContractAlwaysExtensionRoot root, TArgument argument, string argumentName, string message)
where TArgument : class
{
if (argument == null)
Expand All @@ -43,7 +43,7 @@ public static void ArgumentNotNull<TArgument>(this EnsureAlwaysExtensionRoot roo
/// <param name="argument"><para>The argument.</para><para>Аргумент.</para></param>
/// <param name="argumentName"><para>The argument's name.</para><para>Имя аргумента.</para></param>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void ArgumentNotNull<TArgument>(this EnsureAlwaysExtensionRoot root, TArgument argument, string argumentName) where TArgument : class => ArgumentNotNull(root, argument, argumentName, $"Argument {argumentName} is null.");
public static void ArgumentNotNull<TArgument>(this ContractAlwaysExtensionRoot root, TArgument argument, string argumentName) where TArgument : class => ArgumentNotNull(root, argument, argumentName, $"Argument {argumentName} is null.");

/// <summary>
/// <para>Ensures that argument is not null. This check is performed regardless of the build configuration.</para>
Expand All @@ -53,7 +53,7 @@ public static void ArgumentNotNull<TArgument>(this EnsureAlwaysExtensionRoot roo
/// <param name="root"><para>The extension root to which this method is bound.</para><para>Корень-расширения, к которому привязан этот метод.</para></param>
/// <param name="argument"><para>The argument.</para><para>Аргумент.</para></param>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void ArgumentNotNull<TArgument>(this EnsureAlwaysExtensionRoot root, TArgument argument) where TArgument : class => ArgumentNotNull(root, argument, null);
public static void ArgumentNotNull<TArgument>(this ContractAlwaysExtensionRoot root, TArgument argument) where TArgument : class => ArgumentNotNull(root, argument, null);

/// <summary>
/// <para>Ensures that the argument meets the criteria. This check is performed regardless of the build configuration.</para>
Expand All @@ -66,7 +66,7 @@ public static void ArgumentNotNull<TArgument>(this EnsureAlwaysExtensionRoot roo
/// <param name="argumentName"><para>The argument's name.</para><para>Имя аргумента.</para></param>
/// <param name="message"><para>The message of the thrown exception.</para><para>Сообщение выбрасываемого исключения.</para></param>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void ArgumentMeetsCriteria<TArgument>(this EnsureAlwaysExtensionRoot root, TArgument argument, Predicate<TArgument> predicate, string argumentName, string message)
public static void ArgumentMeetsCriteria<TArgument>(this ContractAlwaysExtensionRoot root, TArgument argument, Predicate<TArgument> predicate, string argumentName, string message)
{
if (!predicate(argument))
{
Expand All @@ -84,7 +84,7 @@ public static void ArgumentMeetsCriteria<TArgument>(this EnsureAlwaysExtensionRo
/// <param name="predicate"><para>A predicate that determines whether the argument meets a criterion.</para><para>Предикат определяющий, соответствует ли аргумент критерию.</para></param>
/// <param name="argumentName"><para>The argument's name.</para><para>Имя аргумента.</para></param>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void ArgumentMeetsCriteria<TArgument>(this EnsureAlwaysExtensionRoot root, TArgument argument, Predicate<TArgument> predicate, string argumentName) => ArgumentMeetsCriteria(root, argument, predicate, argumentName, $"Argument {argumentName} does not meet the criteria.");
public static void ArgumentMeetsCriteria<TArgument>(this ContractAlwaysExtensionRoot root, TArgument argument, Predicate<TArgument> predicate, string argumentName) => ArgumentMeetsCriteria(root, argument, predicate, argumentName, $"Argument {argumentName} does not meet the criteria.");

/// <summary>
/// <para>Ensures that the argument meets the criteria. This check is performed regardless of the build configuration.</para>
Expand All @@ -95,7 +95,7 @@ public static void ArgumentMeetsCriteria<TArgument>(this EnsureAlwaysExtensionRo
/// <param name="argument"><para>The argument.</para><para>Аргумент.</para></param>
/// <param name="predicate"><para>A predicate that determines whether the argument meets a criterion.</para><para>Предикат определяющий, соответствует ли аргумент критерию.</para></param>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void ArgumentMeetsCriteria<TArgument>(this EnsureAlwaysExtensionRoot root, TArgument argument, Predicate<TArgument> predicate) => ArgumentMeetsCriteria(root, argument, predicate, null);
public static void ArgumentMeetsCriteria<TArgument>(this ContractAlwaysExtensionRoot root, TArgument argument, Predicate<TArgument> predicate) => ArgumentMeetsCriteria(root, argument, predicate, null);

#endregion

Expand All @@ -111,7 +111,7 @@ public static void ArgumentMeetsCriteria<TArgument>(this EnsureAlwaysExtensionRo
/// <param name="argumentName"><para>The argument's name.</para><para>Имя аргумента.</para></param>
/// <param name="message"><para>The message of the thrown exception.</para><para>Сообщение выбрасываемого исключения.</para></param>
[Conditional("DEBUG")]
public static void ArgumentNotNull<TArgument>(this EnsureOnDebugExtensionRoot root, TArgument argument, string argumentName, string message) where TArgument : class => Ensure.Always.ArgumentNotNull(argument, argumentName, message);
public static void ArgumentNotNull<TArgument>(this ContractOnDebugExtensionRoot root, TArgument argument, string argumentName, string message) where TArgument : class => Contract.Always.ArgumentNotNull(argument, argumentName, message);

/// <summary>
/// <para>Ensures that argument is not null. This check is performed only for DEBUG build configuration.</para>
Expand All @@ -122,7 +122,7 @@ public static void ArgumentMeetsCriteria<TArgument>(this EnsureAlwaysExtensionRo
/// <param name="argument"><para>The argument.</para><para>Аргумент.</para></param>
/// <param name="argumentName"><para>The argument's name.</para><para>Имя аргумента.</para></param>
[Conditional("DEBUG")]
public static void ArgumentNotNull<TArgument>(this EnsureOnDebugExtensionRoot root, TArgument argument, string argumentName) where TArgument : class => Ensure.Always.ArgumentNotNull(argument, argumentName);
public static void ArgumentNotNull<TArgument>(this ContractOnDebugExtensionRoot root, TArgument argument, string argumentName) where TArgument : class => Contract.Always.ArgumentNotNull(argument, argumentName);

/// <summary>
/// <para>Ensures that argument is not null. This check is performed only for DEBUG build configuration.</para>
Expand All @@ -132,7 +132,7 @@ public static void ArgumentMeetsCriteria<TArgument>(this EnsureAlwaysExtensionRo
/// <param name="root"><para>The extension root to which this method is bound.</para><para>Корень-расширения, к которому привязан этот метод.</para></param>
/// <param name="argument"><para>The argument.</para><para>Аргумент.</para></param>
[Conditional("DEBUG")]
public static void ArgumentNotNull<TArgument>(this EnsureOnDebugExtensionRoot root, TArgument argument) where TArgument : class => Ensure.Always.ArgumentNotNull(argument);
public static void ArgumentNotNull<TArgument>(this ContractOnDebugExtensionRoot root, TArgument argument) where TArgument : class => Contract.Always.ArgumentNotNull(argument);

/// <summary>
/// <para>Ensures that the argument meets the criteria. This check is performed only for DEBUG build configuration.</para>
Expand All @@ -145,7 +145,7 @@ public static void ArgumentMeetsCriteria<TArgument>(this EnsureAlwaysExtensionRo
/// <param name="argumentName"><para>The argument's name.</para><para>Имя аргумента.</para></param>
/// <param name="message"><para>The message of the thrown exception.</para><para>Сообщение выбрасываемого исключения.</para></param>
[Conditional("DEBUG")]
public static void ArgumentMeetsCriteria<TArgument>(this EnsureOnDebugExtensionRoot root, TArgument argument, Predicate<TArgument> predicate, string argumentName, string message) => Ensure.Always.ArgumentMeetsCriteria(argument, predicate, argumentName, message);
public static void ArgumentMeetsCriteria<TArgument>(this ContractOnDebugExtensionRoot root, TArgument argument, Predicate<TArgument> predicate, string argumentName, string message) => Contract.Always.ArgumentMeetsCriteria(argument, predicate, argumentName, message);

/// <summary>
/// <para>Ensures that the argument meets the criteria. This check is performed only for DEBUG build configuration.</para>
Expand All @@ -157,7 +157,7 @@ public static void ArgumentMeetsCriteria<TArgument>(this EnsureAlwaysExtensionRo
/// <param name="predicate"><para>A predicate that determines whether the argument meets a criterion.</para><para>Предикат определяющий, соответствует ли аргумент критерию.</para></param>
/// <param name="argumentName"><para>The argument's name.</para><para>Имя аргумента.</para></param>
[Conditional("DEBUG")]
public static void ArgumentMeetsCriteria<TArgument>(this EnsureOnDebugExtensionRoot root, TArgument argument, Predicate<TArgument> predicate, string argumentName) => Ensure.Always.ArgumentMeetsCriteria(argument, predicate, argumentName);
public static void ArgumentMeetsCriteria<TArgument>(this ContractOnDebugExtensionRoot root, TArgument argument, Predicate<TArgument> predicate, string argumentName) => Contract.Always.ArgumentMeetsCriteria(argument, predicate, argumentName);

/// <summary>
/// <para>Ensures that the argument meets the criteria. This check is performed only for DEBUG build configuration.</para>
Expand All @@ -168,7 +168,7 @@ public static void ArgumentMeetsCriteria<TArgument>(this EnsureAlwaysExtensionRo
/// <param name="argument"><para>The argument.</para><para>Аргумент.</para></param>
/// <param name="predicate"><para>A predicate that determines whether the argument meets a criterion.</para><para>Предикат определяющий, соответствует ли аргумент критерию.</para></param>
[Conditional("DEBUG")]
public static void ArgumentMeetsCriteria<TArgument>(this EnsureOnDebugExtensionRoot root, TArgument argument, Predicate<TArgument> predicate) => Ensure.Always.ArgumentMeetsCriteria(argument, predicate);
public static void ArgumentMeetsCriteria<TArgument>(this ContractOnDebugExtensionRoot root, TArgument argument, Predicate<TArgument> predicate) => Contract.Always.ArgumentMeetsCriteria(argument, predicate);

#endregion
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
namespace Platform.Exceptions.ExtensionRoots
{
/// <summary>
/// <para>Represents the extension root class for Contract.Always.</para>
/// <para>Представляет класс корень-расширения для Contract.Always.</para>
/// </summary>
public class ContractAlwaysExtensionRoot
{
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
namespace Platform.Exceptions.ExtensionRoots
{
/// <summary>
/// <para>Represents the extension root class for Contract.OnDebug.</para>
/// <para>Представляет класс корень-расширения для Contract.OnDebug.</para>
/// </summary>
public class ContractOnDebugExtensionRoot
{
}
}

This file was deleted.

This file was deleted.

Loading